From 43e0cc73928d7cef970d450e1c0b6671807d4ec7 Mon Sep 17 00:00:00 2001 From: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Date: Sun, 31 May 2026 08:54:33 +0530 Subject: [PATCH] dart generator --- mise.toml | 7 +- .../domain/services/sync_stream.service.dart | 6 +- mobile/lib/extensions/asset_extensions.dart | 8 +- .../repositories/search_api.repository.dart | 83 +- .../repositories/sync_api.repository.dart | 2 +- .../repositories/sync_stream.repository.dart | 8 +- .../repositories/tags_api.repository.dart | 2 +- .../repositories/user_api.repository.dart | 3 - mobile/lib/main.dart | 3 + .../server_info/server_version.model.dart | 2 +- .../models/shared_link/shared_link.model.dart | 6 +- .../pages/edit/drift_edit.page.dart | 6 +- .../repositories/activity_api.repository.dart | 8 +- .../repositories/asset_api.repository.dart | 18 +- .../lib/repositories/auth_api.repository.dart | 4 +- .../drift_album_api_repository.dart | 18 +- .../repositories/folder_api.repository.dart | 6 +- .../repositories/partner_api.repository.dart | 4 +- .../repositories/person_api.repository.dart | 2 +- .../repositories/sessions_api.repository.dart | 8 +- mobile/lib/routing/auth_guard.dart | 2 +- mobile/lib/routing/locked_guard.dart | 7 +- mobile/lib/services/map.service.dart | 2 +- mobile/lib/services/oauth.service.dart | 6 +- mobile/lib/services/server_info.service.dart | 16 +- mobile/lib/services/shared_link.service.dart | 62 +- mobile/lib/utils/openapi_compat.dart | 42 + mobile/lib/utils/openapi_patching.dart | 82 - mobile/openapi/.gitignore | 19 - mobile/openapi/.openapi-generator-ignore | 23 - mobile/openapi/.openapi-generator/VERSION | 1 - mobile/openapi/.travis.yml | 14 - mobile/openapi/README.md | 704 ----- mobile/openapi/git_push.sh | 57 - mobile/openapi/lib/api.dart | 123 +- mobile/openapi/lib/api/activities_api.dart | 335 ++- mobile/openapi/lib/api/albums_api.dart | 1175 ++++---- mobile/openapi/lib/api/api_keys_api.dart | 438 ++- mobile/openapi/lib/api/assets_api.dart | 2434 ++++++++--------- .../lib/api/authentication_admin_api.dart | 29 +- .../openapi/lib/api/authentication_api.dart | 1385 +++++----- .../lib/api/database_backups_admin_api.dart | 225 +- mobile/openapi/lib/api/deprecated_api.dart | 184 -- mobile/openapi/lib/api/download_api.dart | 133 +- mobile/openapi/lib/api/duplicates_api.dart | 196 +- mobile/openapi/lib/api/faces_api.dart | 276 +- mobile/openapi/lib/api/jobs_api.dart | 178 +- mobile/openapi/lib/api/libraries_api.dart | 524 ++-- .../lib/api/maintenance_admin_api.dart | 335 ++- mobile/openapi/lib/api/map_api.dart | 161 +- mobile/openapi/lib/api/memories_api.dart | 714 +++-- .../lib/api/notifications_admin_api.dart | 146 +- mobile/openapi/lib/api/notifications_api.dart | 456 ++- mobile/openapi/lib/api/partners_api.dart | 358 ++- mobile/openapi/lib/api/people_api.dart | 911 +++--- mobile/openapi/lib/api/plugins_api.dart | 338 +-- mobile/openapi/lib/api/queues_api.dart | 433 ++- mobile/openapi/lib/api/search_api.dart | 998 +++---- mobile/openapi/lib/api/server_api.dart | 964 +++---- mobile/openapi/lib/api/sessions_api.dart | 415 ++- mobile/openapi/lib/api/shared_links_api.dart | 774 +++--- mobile/openapi/lib/api/stacks_api.dart | 507 ++-- mobile/openapi/lib/api/sync_api.dart | 189 +- mobile/openapi/lib/api/system_config_api.dart | 270 +- .../openapi/lib/api/system_metadata_api.dart | 270 +- mobile/openapi/lib/api/tags_api.dart | 788 +++--- mobile/openapi/lib/api/timeline_api.dart | 359 +-- mobile/openapi/lib/api/trash_api.dart | 174 +- mobile/openapi/lib/api/users_admin_api.dart | 785 +++--- mobile/openapi/lib/api/users_api.dart | 1280 +++++---- mobile/openapi/lib/api/views_api.dart | 81 +- mobile/openapi/lib/api/workflows_api.dart | 640 ++--- mobile/openapi/lib/api_client.dart | 1696 ++++++------ mobile/openapi/lib/api_compat.dart | 90 + mobile/openapi/lib/api_exception.dart | 32 +- mobile/openapi/lib/api_helper.dart | 264 +- mobile/openapi/lib/api_state.dart | 8 + mobile/openapi/lib/api_version.dart | 81 + mobile/openapi/lib/auth/api_key_auth.dart | 22 +- mobile/openapi/lib/auth/authentication.dart | 9 +- mobile/openapi/lib/auth/http_basic_auth.dart | 26 - mobile/openapi/lib/auth/http_bearer_auth.dart | 42 +- mobile/openapi/lib/auth/oauth.dart | 12 +- .../lib/model/activity_create_dto.dart | 165 +- .../lib/model/activity_response_dto.dart | 176 +- .../activity_statistics_response_dto.dart | 116 +- mobile/openapi/lib/model/add_users_dto.dart | 105 +- .../model/admin_onboarding_update_dto.dart | 100 +- .../openapi/lib/model/album_response_dto.dart | 364 ++- .../model/album_statistics_response_dto.dart | 131 +- .../openapi/lib/model/album_user_add_dto.dart | 119 +- .../lib/model/album_user_create_dto.dart | 109 +- .../lib/model/album_user_response_dto.dart | 109 +- mobile/openapi/lib/model/album_user_role.dart | 95 +- .../lib/model/albums_add_assets_dto.dart | 122 +- .../model/albums_add_assets_response_dto.dart | 122 +- mobile/openapi/lib/model/albums_response.dart | 100 +- mobile/openapi/lib/model/albums_update.dart | 114 +- .../openapi/lib/model/api_key_create_dto.dart | 124 +- .../model/api_key_create_response_dto.dart | 110 +- .../lib/model/api_key_response_dto.dart | 161 +- .../openapi/lib/model/api_key_update_dto.dart | 127 +- .../lib/model/asset_bulk_delete_dto.dart | 124 +- .../lib/model/asset_bulk_update_dto.dart | 370 +-- .../model/asset_bulk_upload_check_dto.dart | 105 +- .../model/asset_bulk_upload_check_item.dart | 110 +- .../asset_bulk_upload_check_response_dto.dart | 105 +- .../model/asset_bulk_upload_check_result.dart | 188 +- mobile/openapi/lib/model/asset_copy_dto.dart | 196 +- .../openapi/lib/model/asset_edit_action.dart | 95 +- .../lib/model/asset_edit_action_item_dto.dart | 119 +- ...asset_edit_action_item_dto_parameters.dart | 156 -- .../asset_edit_action_item_response_dto.dart | 133 +- .../lib/model/asset_edits_create_dto.dart | 103 +- .../lib/model/asset_edits_response_dto.dart | 117 +- .../lib/model/asset_face_create_dto.dart | 209 +- .../lib/model/asset_face_delete_dto.dart | 100 +- .../lib/model/asset_face_response_dto.dart | 245 +- .../lib/model/asset_face_update_dto.dart | 103 +- .../lib/model/asset_face_update_item.dart | 110 +- .../lib/model/asset_id_error_reason.dart | 95 +- mobile/openapi/lib/model/asset_ids_dto.dart | 103 +- .../lib/model/asset_ids_response_dto.dart | 136 +- mobile/openapi/lib/model/asset_job_name.dart | 99 +- mobile/openapi/lib/model/asset_jobs_dto.dart | 117 +- .../lib/model/asset_media_create_dto.dart | 160 ++ .../lib/model/asset_media_response_dto.dart | 109 +- .../openapi/lib/model/asset_media_size.dart | 99 +- .../openapi/lib/model/asset_media_status.dart | 91 +- .../model/asset_metadata_bulk_delete_dto.dart | 105 +- .../asset_metadata_bulk_delete_item_dto.dart | 110 +- .../asset_metadata_bulk_response_dto.dart | 146 +- .../model/asset_metadata_bulk_upsert_dto.dart | 105 +- .../asset_metadata_bulk_upsert_item_dto.dart | 126 +- .../model/asset_metadata_response_dto.dart | 128 +- .../lib/model/asset_metadata_upsert_dto.dart | 105 +- .../model/asset_metadata_upsert_item_dto.dart | 112 +- .../lib/model/asset_ocr_response_dto.dart | 251 +- mobile/openapi/lib/model/asset_order.dart | 91 +- mobile/openapi/lib/model/asset_order_by.dart | 91 +- .../lib/model/asset_reject_reason.dart | 91 +- .../openapi/lib/model/asset_response_dto.dart | 612 ++--- .../lib/model/asset_stack_response_dto.dart | 133 +- .../lib/model/asset_stats_response_dto.dart | 128 +- mobile/openapi/lib/model/asset_type_enum.dart | 99 +- .../lib/model/asset_upload_action.dart | 91 +- .../openapi/lib/model/asset_visibility.dart | 99 +- mobile/openapi/lib/model/audio_codec.dart | 99 +- .../lib/model/auth_status_response_dto.dart | 173 +- mobile/openapi/lib/model/avatar_update.dart | 109 +- .../lib/model/bulk_id_error_reason.dart | 103 +- .../lib/model/bulk_id_response_dto.dart | 165 +- mobile/openapi/lib/model/bulk_ids_dto.dart | 102 +- mobile/openapi/lib/model/cast_response.dart | 100 +- mobile/openapi/lib/model/cast_update.dart | 109 +- .../lib/model/change_password_dto.dart | 132 +- mobile/openapi/lib/model/clip_config.dart | 109 +- mobile/openapi/lib/model/colorspace.dart | 91 +- .../model/contributor_count_response_dto.dart | 113 +- mobile/openapi/lib/model/cq_mode.dart | 97 +- .../openapi/lib/model/create_album_dto.dart | 172 +- .../openapi/lib/model/create_library_dto.dart | 170 +- .../lib/model/create_profile_image_dto.dart | 40 + .../create_profile_image_response_dto.dart | 129 +- mobile/openapi/lib/model/crop_parameters.dart | 145 +- .../lib/model/database_backup_config.dart | 134 +- .../lib/model/database_backup_delete_dto.dart | 103 +- .../lib/model/database_backup_dto.dart | 133 +- .../database_backup_list_response_dto.dart | 103 +- .../lib/model/database_backup_upload_dto.dart | 44 + .../lib/model/download_archive_dto.dart | 126 +- .../lib/model/download_archive_info.dart | 120 +- .../openapi/lib/model/download_info_dto.dart | 188 +- .../openapi/lib/model/download_response.dart | 121 +- .../lib/model/download_response_dto.dart | 120 +- mobile/openapi/lib/model/download_update.dart | 141 +- .../lib/model/duplicate_detection_config.dart | 113 +- .../lib/model/duplicate_resolve_dto.dart | 105 +- .../model/duplicate_resolve_group_dto.dart | 139 +- .../lib/model/duplicate_response_dto.dart | 143 +- .../model/email_notifications_response.dart | 131 +- .../lib/model/email_notifications_update.dart | 161 +- .../openapi/lib/model/exif_response_dto.dart | 518 ++-- mobile/openapi/lib/model/face_dto.dart | 100 +- .../lib/model/facial_recognition_config.dart | 164 +- .../openapi/lib/model/folders_response.dart | 110 +- mobile/openapi/lib/model/folders_update.dart | 131 +- mobile/openapi/lib/model/image_format.dart | 91 +- mobile/openapi/lib/model/job_create_dto.dart | 100 +- mobile/openapi/lib/model/job_name.dart | 303 +- .../openapi/lib/model/job_settings_dto.dart | 103 +- .../lib/model/library_response_dto.dart | 234 +- .../lib/model/library_stats_response_dto.dart | 154 +- mobile/openapi/lib/model/license_key_dto.dart | 112 +- .../lib/model/license_response_dto.dart | 5 + mobile/openapi/lib/model/log_level.dart | 107 +- .../lib/model/login_credential_dto.dart | 110 +- .../openapi/lib/model/login_response_dto.dart | 200 +- .../lib/model/logout_response_dto.dart | 110 +- ...hine_learning_availability_checks_dto.dart | 134 +- .../openapi/lib/model/maintenance_action.dart | 99 +- .../lib/model/maintenance_auth_dto.dart | 100 +- ...intenance_detect_install_response_dto.dart | 105 +- ...nce_detect_install_storage_folder_dto.dart | 146 +- .../lib/model/maintenance_login_dto.dart | 111 +- .../maintenance_status_response_dto.dart | 184 +- mobile/openapi/lib/model/manual_job_name.dart | 107 +- .../lib/model/map_marker_response_dto.dart | 178 +- .../map_reverse_geocode_response_dto.dart | 146 +- .../openapi/lib/model/memories_response.dart | 113 +- mobile/openapi/lib/model/memories_update.dart | 134 +- .../openapi/lib/model/memory_create_dto.dart | 262 +- .../lib/model/memory_response_dto.dart | 317 +-- .../lib/model/memory_search_order.dart | 95 +- .../model/memory_statistics_response_dto.dart | 103 +- mobile/openapi/lib/model/memory_type.dart | 87 +- .../openapi/lib/model/memory_update_dto.dart | 160 +- .../openapi/lib/model/merge_person_dto.dart | 102 +- .../lib/model/metadata_search_dto.dart | 1125 ++++---- mobile/openapi/lib/model/mirror_axis.dart | 91 +- .../openapi/lib/model/mirror_parameters.dart | 100 +- .../lib/model/notification_create_dto.dart | 226 +- .../model/notification_delete_all_dto.dart | 103 +- .../openapi/lib/model/notification_dto.dart | 225 +- .../openapi/lib/model/notification_level.dart | 99 +- .../openapi/lib/model/notification_type.dart | 107 +- .../model/notification_update_all_dto.dart | 124 +- .../lib/model/notification_update_dto.dart | 109 +- .../model/o_auth_authorize_response_dto.dart | 100 +- .../model/o_auth_backchannel_logout_dto.dart | 40 + .../lib/model/o_auth_callback_dto.dart | 143 +- .../openapi/lib/model/o_auth_config_dto.dart | 150 +- .../o_auth_token_endpoint_auth_method.dart | 91 +- mobile/openapi/lib/model/ocr_config.dart | 164 +- mobile/openapi/lib/model/on_this_day_dto.dart | 103 +- mobile/openapi/lib/model/onboarding_dto.dart | 100 +- .../lib/model/onboarding_response_dto.dart | 100 +- .../openapi/lib/model/partner_create_dto.dart | 100 +- .../openapi/lib/model/partner_direction.dart | 91 +- .../lib/model/partner_response_dto.dart | 189 +- .../openapi/lib/model/partner_update_dto.dart | 100 +- mobile/openapi/lib/model/people_response.dart | 110 +- .../lib/model/people_response_dto.dart | 166 +- mobile/openapi/lib/model/people_update.dart | 131 +- .../openapi/lib/model/people_update_dto.dart | 103 +- .../openapi/lib/model/people_update_item.dart | 223 +- mobile/openapi/lib/model/permission.dart | 703 ++--- .../openapi/lib/model/person_create_dto.dart | 202 +- .../lib/model/person_response_dto.dart | 235 +- .../model/person_statistics_response_dto.dart | 103 +- .../openapi/lib/model/person_update_dto.dart | 227 +- .../lib/model/pin_code_change_dto.dart | 148 +- .../openapi/lib/model/pin_code_reset_dto.dart | 131 +- .../openapi/lib/model/pin_code_setup_dto.dart | 100 +- .../lib/model/places_response_dto.dart | 173 +- .../lib/model/plugin_method_response_dto.dart | 215 +- .../lib/model/plugin_response_dto.dart | 217 +- .../model/plugin_template_response_dto.dart | 185 +- .../plugin_template_step_response_dto.dart | 143 +- .../openapi/lib/model/purchase_response.dart | 118 +- mobile/openapi/lib/model/purchase_update.dart | 138 +- mobile/openapi/lib/model/queue_command.dart | 103 +- .../openapi/lib/model/queue_command_dto.dart | 121 +- .../openapi/lib/model/queue_delete_dto.dart | 112 +- .../lib/model/queue_job_response_dto.dart | 154 +- .../openapi/lib/model/queue_job_status.dart | 107 +- mobile/openapi/lib/model/queue_name.dart | 155 +- .../openapi/lib/model/queue_response_dto.dart | 130 +- .../lib/model/queue_response_legacy_dto.dart | 113 +- .../lib/model/queue_statistics_dto.dart | 178 +- .../lib/model/queue_status_legacy_dto.dart | 110 +- .../openapi/lib/model/queue_update_dto.dart | 111 +- .../lib/model/queues_response_legacy_dto.dart | 332 +-- .../openapi/lib/model/random_search_dto.dart | 867 +++--- .../openapi/lib/model/ratings_response.dart | 100 +- mobile/openapi/lib/model/ratings_update.dart | 109 +- mobile/openapi/lib/model/reaction_level.dart | 91 +- mobile/openapi/lib/model/reaction_type.dart | 91 +- .../reverse_geocoding_state_response_dto.dart | 132 +- .../openapi/lib/model/rotate_parameters.dart | 100 +- .../lib/model/search_album_response_dto.dart | 160 +- .../lib/model/search_asset_response_dto.dart | 180 +- .../lib/model/search_explore_item.dart | 109 +- .../model/search_explore_response_dto.dart | 115 +- .../search_facet_count_response_dto.dart | 113 +- .../lib/model/search_facet_response_dto.dart | 117 +- .../lib/model/search_response_dto.dart | 112 +- .../model/search_statistics_response_dto.dart | 103 +- .../lib/model/search_suggestion_type.dart | 107 +- .../lib/model/server_about_response_dto.dart | 539 ++-- .../lib/model/server_apk_links_dto.dart | 138 +- .../openapi/lib/model/server_config_dto.dart | 245 +- .../lib/model/server_features_dto.dart | 291 +- .../server_media_types_response_dto.dart | 136 +- .../lib/model/server_ping_response.dart | 100 +- .../lib/model/server_stats_response_dto.dart | 193 +- .../model/server_storage_response_dto.dart | 196 +- .../server_version_history_response_dto.dart | 128 +- .../model/server_version_response_dto.dart | 128 +- .../openapi/lib/model/session_create_dto.dart | 164 +- .../model/session_create_response_dto.dart | 241 +- .../lib/model/session_response_dto.dart | 228 +- .../openapi/lib/model/session_unlock_dto.dart | 131 +- .../openapi/lib/model/session_update_dto.dart | 113 +- .../lib/model/set_maintenance_mode_dto.dart | 129 +- .../lib/model/shared_link_create_dto.dart | 295 +- .../lib/model/shared_link_edit_dto.dart | 280 +- .../lib/model/shared_link_login_dto.dart | 100 +- .../lib/model/shared_link_response_dto.dart | 310 +-- .../openapi/lib/model/shared_link_type.dart | 91 +- .../lib/model/shared_links_response.dart | 110 +- .../lib/model/shared_links_update.dart | 131 +- mobile/openapi/lib/model/sign_up_dto.dart | 119 +- .../openapi/lib/model/smart_search_dto.dart | 916 +++---- mobile/openapi/lib/model/source_type.dart | 95 +- .../openapi/lib/model/stack_create_dto.dart | 103 +- .../openapi/lib/model/stack_response_dto.dart | 131 +- .../openapi/lib/model/stack_update_dto.dart | 113 +- .../lib/model/statistics_search_dto.dart | 764 +++--- mobile/openapi/lib/model/storage_folder.dart | 107 +- .../lib/model/sync_ack_delete_dto.dart | 107 +- mobile/openapi/lib/model/sync_ack_dto.dart | 109 +- .../openapi/lib/model/sync_ack_set_dto.dart | 103 +- mobile/openapi/lib/model/sync_ack_v1.dart | 36 + .../lib/model/sync_album_delete_v1.dart | 100 +- .../model/sync_album_to_asset_delete_v1.dart | 110 +- .../lib/model/sync_album_to_asset_v1.dart | 110 +- .../lib/model/sync_album_user_delete_v1.dart | 110 +- .../openapi/lib/model/sync_album_user_v1.dart | 123 +- mobile/openapi/lib/model/sync_album_v1.dart | 221 +- mobile/openapi/lib/model/sync_album_v2.dart | 199 +- .../lib/model/sync_asset_delete_v1.dart | 100 +- .../lib/model/sync_asset_edit_delete_v1.dart | 100 +- .../openapi/lib/model/sync_asset_edit_v1.dart | 160 +- .../openapi/lib/model/sync_asset_exif_v1.dart | 540 ++-- .../lib/model/sync_asset_face_delete_v1.dart | 100 +- .../openapi/lib/model/sync_asset_face_v1.dart | 248 +- .../openapi/lib/model/sync_asset_face_v2.dart | 280 +- .../model/sync_asset_metadata_delete_v1.dart | 110 +- .../lib/model/sync_asset_metadata_v1.dart | 126 +- mobile/openapi/lib/model/sync_asset_v1.dart | 420 ++- mobile/openapi/lib/model/sync_asset_v2.dart | 423 ++- .../openapi/lib/model/sync_auth_user_v1.dart | 294 +- .../openapi/lib/model/sync_complete_v1.dart | 36 + .../openapi/lib/model/sync_entity_type.dart | 311 +-- .../model/sync_memory_asset_delete_v1.dart | 110 +- .../lib/model/sync_memory_asset_v1.dart | 110 +- .../lib/model/sync_memory_delete_v1.dart | 100 +- mobile/openapi/lib/model/sync_memory_v1.dart | 284 +- .../lib/model/sync_partner_delete_v1.dart | 110 +- mobile/openapi/lib/model/sync_partner_v1.dart | 130 +- .../lib/model/sync_person_delete_v1.dart | 100 +- mobile/openapi/lib/model/sync_person_v1.dart | 244 +- .../openapi/lib/model/sync_request_type.dart | 187 +- mobile/openapi/lib/model/sync_reset_v1.dart | 36 + .../lib/model/sync_stack_delete_v1.dart | 100 +- mobile/openapi/lib/model/sync_stack_v1.dart | 159 +- mobile/openapi/lib/model/sync_stream_dto.dart | 122 +- .../lib/model/sync_user_delete_v1.dart | 100 +- .../model/sync_user_metadata_delete_v1.dart | 109 +- .../lib/model/sync_user_metadata_v1.dart | 126 +- mobile/openapi/lib/model/sync_user_v1.dart | 190 +- .../lib/model/system_config_backups_dto.dart | 100 +- .../openapi/lib/model/system_config_dto.dart | 372 ++- .../lib/model/system_config_f_fmpeg_dto.dart | 398 ++- .../lib/model/system_config_faces_dto.dart | 100 +- ...m_config_generated_fullsize_image_dto.dart | 155 +- .../system_config_generated_image_dto.dart | 158 +- .../lib/model/system_config_image_dto.dart | 155 +- .../lib/model/system_config_job_dto.dart | 280 +- .../lib/model/system_config_library_dto.dart | 112 +- .../model/system_config_library_scan_dto.dart | 110 +- .../system_config_library_watch_dto.dart | 100 +- .../lib/model/system_config_logging_dto.dart | 110 +- .../system_config_machine_learning_dto.dart | 191 +- .../lib/model/system_config_map_dto.dart | 130 +- .../lib/model/system_config_metadata_dto.dart | 100 +- .../system_config_new_version_check_dto.dart | 100 +- .../system_config_nightly_tasks_dto.dart | 174 +- .../system_config_notifications_dto.dart | 100 +- .../lib/model/system_config_o_auth_dto.dart | 381 ++- .../system_config_password_login_dto.dart | 100 +- .../system_config_reverse_geocoding_dto.dart | 100 +- .../lib/model/system_config_server_dto.dart | 127 +- .../lib/model/system_config_smtp_dto.dart | 142 +- .../system_config_smtp_transport_dto.dart | 170 +- .../system_config_storage_template_dto.dart | 127 +- .../system_config_template_emails_dto.dart | 131 +- ...em_config_template_storage_option_dto.dart | 232 +- .../model/system_config_templates_dto.dart | 100 +- .../lib/model/system_config_theme_dto.dart | 100 +- .../lib/model/system_config_trash_dto.dart | 112 +- .../lib/model/system_config_user_dto.dart | 103 +- .../lib/model/tag_bulk_assets_dto.dart | 119 +- .../model/tag_bulk_assets_response_dto.dart | 103 +- mobile/openapi/lib/model/tag_create_dto.dart | 131 +- .../openapi/lib/model/tag_response_dto.dart | 197 +- mobile/openapi/lib/model/tag_update_dto.dart | 105 +- mobile/openapi/lib/model/tag_upsert_dto.dart | 102 +- mobile/openapi/lib/model/tags_response.dart | 110 +- mobile/openapi/lib/model/tags_update.dart | 131 +- mobile/openapi/lib/model/template_dto.dart | 100 +- .../lib/model/template_response_dto.dart | 109 +- .../lib/model/test_email_response_dto.dart | 100 +- .../model/time_bucket_asset_response_dto.dart | 432 ++- .../lib/model/time_buckets_response_dto.dart | 113 +- mobile/openapi/lib/model/tone_mapping.dart | 99 +- .../openapi/lib/model/transcode_hw_accel.dart | 105 +- .../openapi/lib/model/transcode_policy.dart | 103 +- .../openapi/lib/model/trash_response_dto.dart | 103 +- .../openapi/lib/model/update_album_dto.dart | 220 +- .../lib/model/update_album_user_dto.dart | 100 +- .../openapi/lib/model/update_asset_dto.dart | 300 +- .../openapi/lib/model/update_library_dto.dart | 157 +- .../openapi/lib/model/usage_by_user_dto.dart | 213 +- .../lib/model/user_admin_create_dto.dart | 290 +- .../lib/model/user_admin_delete_dto.dart | 109 +- .../lib/model/user_admin_response_dto.dart | 349 +-- .../lib/model/user_admin_update_dto.dart | 299 +- .../openapi/lib/model/user_avatar_color.dart | 123 +- mobile/openapi/lib/model/user_license.dart | 134 +- .../openapi/lib/model/user_metadata_key.dart | 95 +- .../model/user_preferences_response_dto.dart | 239 +- .../model/user_preferences_update_dto.dart | 408 ++- .../openapi/lib/model/user_response_dto.dart | 167 +- mobile/openapi/lib/model/user_status.dart | 95 +- .../openapi/lib/model/user_update_me_dto.dart | 183 +- .../validate_access_token_response_dto.dart | 100 +- .../lib/model/validate_library_dto.dart | 131 +- ...date_library_import_path_response_dto.dart | 140 +- .../model/validate_library_response_dto.dart | 110 +- .../version_check_state_response_dto.dart | 123 +- mobile/openapi/lib/model/video_codec.dart | 99 +- mobile/openapi/lib/model/video_container.dart | 99 +- .../lib/model/workflow_create_dto.dart | 186 +- .../lib/model/workflow_response_dto.dart | 211 +- .../model/workflow_share_response_dto.dart | 153 +- .../lib/model/workflow_share_step_dto.dart | 143 +- .../openapi/lib/model/workflow_step_dto.dart | 143 +- .../openapi/lib/model/workflow_trigger.dart | 95 +- .../model/workflow_trigger_response_dto.dart | 116 +- mobile/openapi/lib/model/workflow_type.dart | 91 +- .../lib/model/workflow_update_dto.dart | 199 +- mobile/openapi/lib/optional.dart | 95 + mobile/openapi/pubspec.yaml | 31 +- .../sync_stream_repository_test.dart | 2 +- .../services/sync_stream_service_test.dart | 8 +- mobile/test/fixtures/sync_stream.stub.dart | 2 +- .../modules/utils/openapi_compat_test.dart | 41 + .../modules/utils/openapi_patching_test.dart | 61 - open-api/bin/generate-dart-sdk.sh | 28 - .../.dart_tool/package_config.json | 340 +++ .../.dart_tool/package_graph.json | 510 ++++ .../pub/bin/test/test.dart-3.11.5.snapshot | Bin 0 -> 25555320 bytes .../test/incremental_kernel.Ly9AZGFydD0zLjY= | Bin 0 -> 4042656 bytes open-api/dart-generator/DESIGN.md | 497 ++++ open-api/dart-generator/analysis_options.yaml | 22 + .../app-migration/openapi_compat.dart | 47 + open-api/dart-generator/bin/generate.dart | 271 ++ .../lib/src/emit/dart_types.dart | 74 + .../lib/src/emit/emit_alias.dart | 34 + .../dart-generator/lib/src/emit/emit_api.dart | 578 ++++ .../lib/src/emit/emit_context.dart | 60 + .../lib/src/emit/emit_enum.dart | 172 ++ .../lib/src/emit/emit_library.dart | 130 + .../lib/src/emit/emit_meta.dart | 117 + .../lib/src/emit/emit_model.dart | 543 ++++ .../lib/src/emit/emit_roundtrip_test.dart | 156 ++ .../lib/src/emit/emit_union.dart | 217 ++ .../lib/src/emit/serialization.dart | 278 ++ open-api/dart-generator/lib/src/ir/types.dart | 628 +++++ .../dart-generator/lib/src/loader/spec.dart | 141 + .../lib/src/normalize/builder.dart | 183 ++ .../lib/src/normalize/names.dart | 179 ++ .../lib/src/normalize/operation_walker.dart | 264 ++ .../lib/src/normalize/overrides.dart | 28 + .../lib/src/normalize/schema_walker.dart | 427 +++ .../dart-generator/lib/src/util/naming.dart | 76 + .../dart-generator/lib/src/util/version.dart | 92 + open-api/dart-generator/pubspec.lock | 437 +++ open-api/dart-generator/pubspec.yaml | 22 + .../dart-generator/runtime/api_client.dart | 223 ++ .../dart-generator/runtime/api_compat.dart | 90 + .../dart-generator/runtime/api_exception.dart | 39 + .../dart-generator/runtime/api_helper.dart | 97 + .../dart-generator/runtime/api_state.dart | 8 + .../dart-generator/runtime/api_version.dart | 81 + .../runtime/auth/api_key_auth.dart | 34 + .../runtime/auth/authentication.dart | 10 + .../runtime/auth/http_bearer_auth.dart | 37 + .../dart-generator/runtime/auth/oauth.dart | 18 + open-api/dart-generator/runtime/optional.dart | 95 + .../runtime/pubspec.fragment.yaml | 26 + .../test/serialization_test.dart | 70 + open-api/dart-generator/test/tier0_test.dart | 101 + .../dart-generator/tool/_check/_body.dart | 328 +++ .../dart-generator/tool/_check/check.dart | 349 +++ open-api/dart-generator/tool/_check/shim.dart | 21 + open-api/dart-generator/tool/_smoke_emit.dart | 145 + open-api/patch/api.dart.patch | 9 - open-api/patch/api_client.dart.patch | 30 - .../asset_edit_action_item_dto.dart.patch | 18 - .../patch/pubspec_immich_mobile.yaml.patch | 9 - open-api/templates/mobile/api.mustache | 194 -- open-api/templates/mobile/api.mustache.patch | 29 - .../native/native_class.mustache | 296 -- .../native/native_class.mustache.patch | 60 - ...ative_class_nullable_items_in_arrays.patch | 13 - 508 files changed, 36570 insertions(+), 52955 deletions(-) create mode 100644 mobile/lib/utils/openapi_compat.dart delete mode 100644 mobile/lib/utils/openapi_patching.dart delete mode 100644 mobile/openapi/.gitignore delete mode 100644 mobile/openapi/.openapi-generator-ignore delete mode 100644 mobile/openapi/.openapi-generator/VERSION delete mode 100644 mobile/openapi/.travis.yml delete mode 100644 mobile/openapi/README.md delete mode 100644 mobile/openapi/git_push.sh delete mode 100644 mobile/openapi/lib/api/deprecated_api.dart create mode 100644 mobile/openapi/lib/api_compat.dart create mode 100644 mobile/openapi/lib/api_state.dart create mode 100644 mobile/openapi/lib/api_version.dart delete mode 100644 mobile/openapi/lib/auth/http_basic_auth.dart delete mode 100644 mobile/openapi/lib/model/asset_edit_action_item_dto_parameters.dart create mode 100644 mobile/openapi/lib/model/asset_media_create_dto.dart create mode 100644 mobile/openapi/lib/model/create_profile_image_dto.dart create mode 100644 mobile/openapi/lib/model/database_backup_upload_dto.dart create mode 100644 mobile/openapi/lib/model/license_response_dto.dart create mode 100644 mobile/openapi/lib/model/o_auth_backchannel_logout_dto.dart create mode 100644 mobile/openapi/lib/model/sync_ack_v1.dart create mode 100644 mobile/openapi/lib/model/sync_complete_v1.dart create mode 100644 mobile/openapi/lib/model/sync_reset_v1.dart create mode 100644 mobile/openapi/lib/optional.dart create mode 100644 mobile/test/modules/utils/openapi_compat_test.dart delete mode 100644 mobile/test/modules/utils/openapi_patching_test.dart delete mode 100755 open-api/bin/generate-dart-sdk.sh create mode 100644 open-api/dart-generator/.dart_tool/package_config.json create mode 100644 open-api/dart-generator/.dart_tool/package_graph.json create mode 100644 open-api/dart-generator/.dart_tool/pub/bin/test/test.dart-3.11.5.snapshot create mode 100644 open-api/dart-generator/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjY= create mode 100644 open-api/dart-generator/DESIGN.md create mode 100644 open-api/dart-generator/analysis_options.yaml create mode 100644 open-api/dart-generator/app-migration/openapi_compat.dart create mode 100644 open-api/dart-generator/bin/generate.dart create mode 100644 open-api/dart-generator/lib/src/emit/dart_types.dart create mode 100644 open-api/dart-generator/lib/src/emit/emit_alias.dart create mode 100644 open-api/dart-generator/lib/src/emit/emit_api.dart create mode 100644 open-api/dart-generator/lib/src/emit/emit_context.dart create mode 100644 open-api/dart-generator/lib/src/emit/emit_enum.dart create mode 100644 open-api/dart-generator/lib/src/emit/emit_library.dart create mode 100644 open-api/dart-generator/lib/src/emit/emit_meta.dart create mode 100644 open-api/dart-generator/lib/src/emit/emit_model.dart create mode 100644 open-api/dart-generator/lib/src/emit/emit_roundtrip_test.dart create mode 100644 open-api/dart-generator/lib/src/emit/emit_union.dart create mode 100644 open-api/dart-generator/lib/src/emit/serialization.dart create mode 100644 open-api/dart-generator/lib/src/ir/types.dart create mode 100644 open-api/dart-generator/lib/src/loader/spec.dart create mode 100644 open-api/dart-generator/lib/src/normalize/builder.dart create mode 100644 open-api/dart-generator/lib/src/normalize/names.dart create mode 100644 open-api/dart-generator/lib/src/normalize/operation_walker.dart create mode 100644 open-api/dart-generator/lib/src/normalize/overrides.dart create mode 100644 open-api/dart-generator/lib/src/normalize/schema_walker.dart create mode 100644 open-api/dart-generator/lib/src/util/naming.dart create mode 100644 open-api/dart-generator/lib/src/util/version.dart create mode 100644 open-api/dart-generator/pubspec.lock create mode 100644 open-api/dart-generator/pubspec.yaml create mode 100644 open-api/dart-generator/runtime/api_client.dart create mode 100644 open-api/dart-generator/runtime/api_compat.dart create mode 100644 open-api/dart-generator/runtime/api_exception.dart create mode 100644 open-api/dart-generator/runtime/api_helper.dart create mode 100644 open-api/dart-generator/runtime/api_state.dart create mode 100644 open-api/dart-generator/runtime/api_version.dart create mode 100644 open-api/dart-generator/runtime/auth/api_key_auth.dart create mode 100644 open-api/dart-generator/runtime/auth/authentication.dart create mode 100644 open-api/dart-generator/runtime/auth/http_bearer_auth.dart create mode 100644 open-api/dart-generator/runtime/auth/oauth.dart create mode 100644 open-api/dart-generator/runtime/optional.dart create mode 100644 open-api/dart-generator/runtime/pubspec.fragment.yaml create mode 100644 open-api/dart-generator/test/serialization_test.dart create mode 100644 open-api/dart-generator/test/tier0_test.dart create mode 100644 open-api/dart-generator/tool/_check/_body.dart create mode 100644 open-api/dart-generator/tool/_check/check.dart create mode 100644 open-api/dart-generator/tool/_check/shim.dart create mode 100644 open-api/dart-generator/tool/_smoke_emit.dart delete mode 100644 open-api/patch/api.dart.patch delete mode 100644 open-api/patch/api_client.dart.patch delete mode 100644 open-api/patch/asset_edit_action_item_dto.dart.patch delete mode 100644 open-api/patch/pubspec_immich_mobile.yaml.patch delete mode 100644 open-api/templates/mobile/api.mustache delete mode 100644 open-api/templates/mobile/api.mustache.patch delete mode 100644 open-api/templates/mobile/serialization/native/native_class.mustache delete mode 100644 open-api/templates/mobile/serialization/native/native_class.mustache.patch delete mode 100644 open-api/templates/mobile/serialization/native/native_class_nullable_items_in_arrays.patch diff --git a/mise.toml b/mise.toml index 8cff3993f7..e87825bb21 100644 --- a/mise.toml +++ b/mise.toml @@ -66,8 +66,11 @@ run = [ ] [tasks.open-api-dart] -dir = "open-api" -run = "bash ./bin/generate-dart-sdk.sh" +dir = "open-api/dart-generator" +run = [ + "dart pub get", + "dart run bin/generate.dart --spec ../immich-openapi-specs.json --out ../../mobile/openapi", +] [tasks.open-api] env = { SHARP_IGNORE_GLOBAL_LIBVIPS = true } diff --git a/mobile/lib/domain/services/sync_stream.service.dart b/mobile/lib/domain/services/sync_stream.service.dart index 200dca2418..c16e724059 100644 --- a/mobile/lib/domain/services/sync_stream.service.dart +++ b/mobile/lib/domain/services/sync_stream.service.dart @@ -57,12 +57,8 @@ class SyncStreamService { Future sync() async { _logger.info("Remote sync request for user"); final serverVersion = await _api.serverInfoApi.getServerVersion(); - if (serverVersion == null) { - _logger.severe("Cannot perform sync: unable to determine server version"); - return false; - } - final serverSemVer = SemVer(major: serverVersion.major, minor: serverVersion.minor, patch: serverVersion.patch_); + final serverSemVer = SemVer(major: serverVersion.major, minor: serverVersion.minor, patch: serverVersion.patch); final value = Store.get(StoreKey.syncMigrationStatus, "[]"); final migrations = (jsonDecode(value) as List).cast(); diff --git a/mobile/lib/extensions/asset_extensions.dart b/mobile/lib/extensions/asset_extensions.dart index 7e1bef1a1c..233a939bed 100644 --- a/mobile/lib/extensions/asset_extensions.dart +++ b/mobile/lib/extensions/asset_extensions.dart @@ -64,10 +64,10 @@ extension on api.AssetVisibility { extension on api.AssetTypeEnum { AssetType toAssetType() => switch (this) { - api.AssetTypeEnum.IMAGE => AssetType.image, - api.AssetTypeEnum.VIDEO => AssetType.video, - api.AssetTypeEnum.AUDIO => AssetType.audio, - api.AssetTypeEnum.OTHER => AssetType.other, + api.AssetTypeEnum.image => AssetType.image, + api.AssetTypeEnum.video => AssetType.video, + api.AssetTypeEnum.audio => AssetType.audio, + api.AssetTypeEnum.other => AssetType.other, _ => throw Exception('Unknown AssetType value: $this'), }; } diff --git a/mobile/lib/infrastructure/repositories/search_api.repository.dart b/mobile/lib/infrastructure/repositories/search_api.repository.dart index bcfddfce6e..1702b386ef 100644 --- a/mobile/lib/infrastructure/repositories/search_api.repository.dart +++ b/mobile/lib/infrastructure/repositories/search_api.repository.dart @@ -11,59 +11,60 @@ class SearchApiRepository extends ApiRepository { Future search(SearchFilter filter, int page) { AssetTypeEnum? type; if (filter.mediaType.index == AssetType.image.index) { - type = AssetTypeEnum.IMAGE; + type = AssetTypeEnum.image; } else if (filter.mediaType.index == AssetType.video.index) { - type = AssetTypeEnum.VIDEO; + type = AssetTypeEnum.video; } if ((filter.context != null && filter.context!.isNotEmpty) || (filter.assetId != null && filter.assetId!.isNotEmpty)) { return _api.searchSmart( SmartSearchDto( - query: filter.context, - queryAssetId: filter.assetId, - language: filter.language, - country: filter.location.country, - state: filter.location.state, - city: filter.location.city, - make: filter.camera.make, - model: filter.camera.model, - takenAfter: filter.date.takenAfter, - takenBefore: filter.date.takenBefore, - visibility: filter.display.isArchive ? AssetVisibility.archive : AssetVisibility.timeline, - rating: filter.rating.rating, - isFavorite: filter.display.isFavorite ? true : null, - isNotInAlbum: filter.display.isNotInAlbum ? true : null, - personIds: filter.people.map((e) => e.id).toList(), - tagIds: filter.tagIds, - type: type, - page: page, - size: 100, + query: filter.context.toOptional(), + queryAssetId: filter.assetId.toOptional(), + language: filter.language.toOptional(), + country: filter.location.country.toOptional(), + state: filter.location.state.toOptional(), + city: filter.location.city.toOptional(), + make: filter.camera.make.toOptional(), + model: filter.camera.model.toOptional(), + takenAfter: filter.date.takenAfter.toOptional(), + takenBefore: filter.date.takenBefore.toOptional(), + visibility: (filter.display.isArchive ? AssetVisibility.archive : AssetVisibility.timeline).toOptional(), + rating: filter.rating.rating.toOptional(), + isFavorite: (filter.display.isFavorite ? true : null).toOptional(), + isNotInAlbum: (filter.display.isNotInAlbum ? true : null).toOptional(), + personIds: filter.people.map((e) => e.id).toList().toOptional(), + tagIds: filter.tagIds.toOptional(), + type: type.toOptional(), + page: page.toOptional(), + size: 100.toOptional(), ), ); } return _api.searchAssets( MetadataSearchDto( - originalFileName: filter.filename != null && filter.filename!.isNotEmpty ? filter.filename : null, - country: filter.location.country, - description: filter.description != null && filter.description!.isNotEmpty ? filter.description : null, - ocr: filter.ocr != null && filter.ocr!.isNotEmpty ? filter.ocr : null, - state: filter.location.state, - city: filter.location.city, - make: filter.camera.make, - model: filter.camera.model, - takenAfter: filter.date.takenAfter, - takenBefore: filter.date.takenBefore, - visibility: filter.display.isArchive ? AssetVisibility.archive : AssetVisibility.timeline, - rating: filter.rating.rating, - isFavorite: filter.display.isFavorite ? true : null, - isNotInAlbum: filter.display.isNotInAlbum ? true : null, - personIds: filter.people.map((e) => e.id).toList(), - tagIds: filter.tagIds, - type: type, - page: page, - size: 1000, + originalFileName: (filter.filename != null && filter.filename!.isNotEmpty ? filter.filename : null).toOptional(), + country: filter.location.country.toOptional(), + description: (filter.description != null && filter.description!.isNotEmpty ? filter.description : null) + .toOptional(), + ocr: (filter.ocr != null && filter.ocr!.isNotEmpty ? filter.ocr : null).toOptional(), + state: filter.location.state.toOptional(), + city: filter.location.city.toOptional(), + make: filter.camera.make.toOptional(), + model: filter.camera.model.toOptional(), + takenAfter: filter.date.takenAfter.toOptional(), + takenBefore: filter.date.takenBefore.toOptional(), + visibility: (filter.display.isArchive ? AssetVisibility.archive : AssetVisibility.timeline).toOptional(), + rating: filter.rating.rating.toOptional(), + isFavorite: (filter.display.isFavorite ? true : null).toOptional(), + isNotInAlbum: (filter.display.isNotInAlbum ? true : null).toOptional(), + personIds: filter.people.map((e) => e.id).toList().toOptional(), + tagIds: filter.tagIds.toOptional(), + type: type.toOptional(), + page: page.toOptional(), + size: 1000.toOptional(), ), ); } @@ -74,5 +75,5 @@ class SearchApiRepository extends ApiRepository { String? state, String? make, String? model, - }) => _api.getSearchSuggestions(type, country: country, state: state, make: make, model: model); + }) => _api.getSearchSuggestions(type: type, country: country, state: state, make: make, model: model); } diff --git a/mobile/lib/infrastructure/repositories/sync_api.repository.dart b/mobile/lib/infrastructure/repositories/sync_api.repository.dart index d9d262e64f..b8c6f59956 100644 --- a/mobile/lib/infrastructure/repositories/sync_api.repository.dart +++ b/mobile/lib/infrastructure/repositories/sync_api.repository.dart @@ -20,7 +20,7 @@ class SyncApiRepository { } Future deleteSyncAck(List types) { - return _api.syncApi.deleteSyncAck(SyncAckDeleteDto(types: types)); + return _api.syncApi.deleteSyncAck(SyncAckDeleteDto(types: types.toOptional())); } Future streamChanges( diff --git a/mobile/lib/infrastructure/repositories/sync_stream.repository.dart b/mobile/lib/infrastructure/repositories/sync_stream.repository.dart index b7593c3202..80d1bde31e 100644 --- a/mobile/lib/infrastructure/repositories/sync_stream.repository.dart +++ b/mobile/lib/infrastructure/repositories/sync_stream.repository.dart @@ -885,10 +885,10 @@ class SyncStreamRepository extends DriftDatabaseRepository { extension on AssetTypeEnum { AssetType toAssetType() => switch (this) { - AssetTypeEnum.IMAGE => AssetType.image, - AssetTypeEnum.VIDEO => AssetType.video, - AssetTypeEnum.AUDIO => AssetType.audio, - AssetTypeEnum.OTHER => AssetType.other, + AssetTypeEnum.image => AssetType.image, + AssetTypeEnum.video => AssetType.video, + AssetTypeEnum.audio => AssetType.audio, + AssetTypeEnum.other => AssetType.other, _ => throw Exception('Unknown AssetType value: $this'), }; } diff --git a/mobile/lib/infrastructure/repositories/tags_api.repository.dart b/mobile/lib/infrastructure/repositories/tags_api.repository.dart index 5963fc2f23..4eb7734e98 100644 --- a/mobile/lib/infrastructure/repositories/tags_api.repository.dart +++ b/mobile/lib/infrastructure/repositories/tags_api.repository.dart @@ -17,7 +17,7 @@ class TagsApiRepository extends ApiRepository { Future bulkTagAssets(List assetIds, List tagIds) async { final response = await _api.bulkTagAssets(TagBulkAssetsDto(assetIds: assetIds, tagIds: tagIds)); - return response?.count ?? 0; + return response.count; } Future?> upsertTags(List tags) async { diff --git a/mobile/lib/infrastructure/repositories/user_api.repository.dart b/mobile/lib/infrastructure/repositories/user_api.repository.dart index aa645f2a4a..5bf4b72079 100644 --- a/mobile/lib/infrastructure/repositories/user_api.repository.dart +++ b/mobile/lib/infrastructure/repositories/user_api.repository.dart @@ -12,9 +12,6 @@ class UserApiRepository extends ApiRepository { Future getMyUser() async { final (adminDto, preferenceDto) = await (_api.getMyUser(), _api.getMyPreferences()).wait; - if (adminDto == null) { - return null; - } return UserConverter.fromAdminDto(adminDto, preferenceDto); } diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 19455be61c..e6a0203750 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -40,6 +40,7 @@ import 'package:immich_mobile/utils/cache/widgets_binding.dart'; import 'package:immich_mobile/utils/debug_print.dart'; import 'package:immich_mobile/utils/licenses.dart'; import 'package:immich_mobile/utils/migration.dart'; +import 'package:immich_mobile/utils/openapi_compat.dart'; import 'package:immich_mobile/wm_executor.dart'; import 'package:immich_ui/immich_ui.dart'; import 'package:intl/date_symbol_data_local.dart'; @@ -49,6 +50,8 @@ import 'package:timezone/data/latest.dart'; void main() async { try { ImmichWidgetsBinding(); + // Register backward-compat back-fills before any API response is parsed. + configureOpenApiCompat(); unawaited(BackgroundWorkerLockService(BackgroundWorkerLockApi()).lock()); await EasyLocalization.ensureInitialized(); final (drift, _) = await Bootstrap.initDomain(); diff --git a/mobile/lib/models/server_info/server_version.model.dart b/mobile/lib/models/server_info/server_version.model.dart index c8bf73db81..5b682a1e7a 100644 --- a/mobile/lib/models/server_info/server_version.model.dart +++ b/mobile/lib/models/server_info/server_version.model.dart @@ -9,7 +9,7 @@ class ServerVersion extends SemVer { return 'ServerVersion(major: $major, minor: $minor, patch: $patch)'; } - ServerVersion.fromDto(ServerVersionResponseDto dto) : super(major: dto.major, minor: dto.minor, patch: dto.patch_); + ServerVersion.fromDto(ServerVersionResponseDto dto) : super(major: dto.major, minor: dto.minor, patch: dto.patch); bool isAtLeast({int major = 0, int minor = 0, int patch = 0}) { return this >= SemVer(major: major, minor: minor, patch: patch); diff --git a/mobile/lib/models/shared_link/shared_link.model.dart b/mobile/lib/models/shared_link/shared_link.model.dart index 4315cf616a..e02f295290 100644 --- a/mobile/lib/models/shared_link/shared_link.model.dart +++ b/mobile/lib/models/shared_link/shared_link.model.dart @@ -71,11 +71,11 @@ class SharedLink { key = dto.key, showMetadata = dto.showMetadata, slug = dto.slug, - type = dto.type == SharedLinkType.ALBUM ? SharedLinkSource.album : SharedLinkSource.individual, - title = dto.type == SharedLinkType.ALBUM + type = dto.type == SharedLinkType.album ? SharedLinkSource.album : SharedLinkSource.individual, + title = dto.type == SharedLinkType.album ? dto.album?.albumName.toUpperCase() ?? "UNKNOWN SHARE" : "INDIVIDUAL SHARE", - thumbAssetId = dto.type == SharedLinkType.ALBUM + thumbAssetId = dto.type == SharedLinkType.album ? dto.album?.albumThumbnailAssetId : dto.assets.isNotEmpty ? dto.assets[0].id diff --git a/mobile/lib/presentation/pages/edit/drift_edit.page.dart b/mobile/lib/presentation/pages/edit/drift_edit.page.dart index dcb340cc0e..a931b92726 100644 --- a/mobile/lib/presentation/pages/edit/drift_edit.page.dart +++ b/mobile/lib/presentation/pages/edit/drift_edit.page.dart @@ -45,16 +45,16 @@ class _DriftEditImagePageState extends ConsumerState with Ti } if (editorState.flipHorizontal) { - edits.add(MirrorEdit(MirrorParameters(axis: MirrorAxis.horizontal))); + edits.add(const MirrorEdit(MirrorParameters(axis: MirrorAxis.horizontal))); } if (editorState.flipVertical) { - edits.add(MirrorEdit(MirrorParameters(axis: MirrorAxis.vertical))); + edits.add(const MirrorEdit(MirrorParameters(axis: MirrorAxis.vertical))); } final normalizedRotation = (editorState.rotationAngle % 360 + 360) % 360; if (normalizedRotation != 0) { - edits.add(RotateEdit(RotateParameters(angle: normalizedRotation))); + edits.add(RotateEdit(RotateParameters(angle: normalizedRotation.toDouble()))); } try { diff --git a/mobile/lib/repositories/activity_api.repository.dart b/mobile/lib/repositories/activity_api.repository.dart index e8f9abc8c8..7e6d4dd514 100644 --- a/mobile/lib/repositories/activity_api.repository.dart +++ b/mobile/lib/repositories/activity_api.repository.dart @@ -15,7 +15,7 @@ class ActivityApiRepository extends ApiRepository { ActivityApiRepository(this._api); Future> getAll(String albumId, {String? assetId}) async { - final response = await checkNull(_api.getActivities(albumId, assetId: assetId)); + final response = await checkNull(_api.getActivities(albumId: albumId, assetId: assetId)); return response.map(_toActivity).toList(); } @@ -23,8 +23,8 @@ class ActivityApiRepository extends ApiRepository { final dto = ActivityCreateDto( albumId: albumId, type: type == ActivityType.comment ? ReactionType.comment : ReactionType.like, - assetId: assetId, - comment: comment, + assetId: assetId.toOptional(), + comment: comment.toOptional(), ); final response = await checkNull(_api.createActivity(dto)); return _toActivity(response); @@ -35,7 +35,7 @@ class ActivityApiRepository extends ApiRepository { } Future getStats(String albumId, {String? assetId}) async { - final response = await checkNull(_api.getActivityStatistics(albumId, assetId: assetId)); + final response = await checkNull(_api.getActivityStatistics(albumId: albumId, assetId: assetId)); return ActivityStats(comments: response.comments); } diff --git a/mobile/lib/repositories/asset_api.repository.dart b/mobile/lib/repositories/asset_api.repository.dart index fdb4e3323b..c03d73ef7c 100644 --- a/mobile/lib/repositories/asset_api.repository.dart +++ b/mobile/lib/repositories/asset_api.repository.dart @@ -24,7 +24,7 @@ class AssetApiRepository extends ApiRepository { AssetApiRepository(this._api, this._stacksApi, this._trashApi); Future delete(List ids, bool force) async { - return _api.deleteAssets(AssetBulkDeleteDto(ids: ids, force: force)); + return _api.deleteAssets(AssetBulkDeleteDto(ids: ids, force: force.toOptional())); } Future restoreTrash(List ids) async { @@ -33,12 +33,12 @@ class AssetApiRepository extends ApiRepository { Future emptyTrash() async { final response = await _trashApi.emptyTrash(); - return response?.count ?? 0; + return response.count; } Future restoreAllTrash() async { final response = await _trashApi.restoreTrash(); - return response?.count ?? 0; + return response.count; } Future updateVisibility(List ids, AssetVisibilityEnum visibility) async { @@ -46,15 +46,17 @@ class AssetApiRepository extends ApiRepository { } Future updateFavorite(List ids, bool isFavorite) async { - return _api.updateAssets(AssetBulkUpdateDto(ids: ids, isFavorite: isFavorite)); + return _api.updateAssets(AssetBulkUpdateDto(ids: ids, isFavorite: isFavorite.toOptional())); } Future updateLocation(List ids, LatLng location) async { - return _api.updateAssets(AssetBulkUpdateDto(ids: ids, latitude: location.latitude, longitude: location.longitude)); + return _api.updateAssets( + AssetBulkUpdateDto(ids: ids, latitude: location.latitude.toOptional(), longitude: location.longitude.toOptional()), + ); } Future updateDateTime(List ids, DateTime dateTime) async { - return _api.updateAssets(AssetBulkUpdateDto(ids: ids, dateTimeOriginal: dateTime.toIso8601String())); + return _api.updateAssets(AssetBulkUpdateDto(ids: ids, dateTimeOriginal: dateTime.toIso8601String().toOptional())); } Future stack(List ids) async { @@ -86,11 +88,11 @@ class AssetApiRepository extends ApiRepository { } Future updateDescription(String assetId, String description) { - return _api.updateAsset(assetId, UpdateAssetDto(description: description)); + return _api.updateAsset(assetId, UpdateAssetDto(description: description.toOptional())); } Future updateRating(String assetId, int rating) { - return _api.updateAsset(assetId, UpdateAssetDto(rating: rating)); + return _api.updateAsset(assetId, UpdateAssetDto(rating: rating.toOptional())); } Future editAsset(String assetId, List edits) { diff --git a/mobile/lib/repositories/auth_api.repository.dart b/mobile/lib/repositories/auth_api.repository.dart index 446aba68b3..13b29c41ce 100644 --- a/mobile/lib/repositories/auth_api.repository.dart +++ b/mobile/lib/repositories/auth_api.repository.dart @@ -13,7 +13,7 @@ class AuthApiRepository extends ApiRepository { AuthApiRepository(this._apiService); Future changePassword(String newPassword) async { - await _apiService.usersApi.updateMyUser(UserUpdateMeDto(password: newPassword)); + await _apiService.usersApi.updateMyUser(UserUpdateMeDto(password: newPassword.toOptional())); } Future login(String email, String password) async { @@ -46,7 +46,7 @@ class AuthApiRepository extends ApiRepository { Future unlockPinCode(String pinCode) async { try { - await _apiService.authenticationApi.unlockAuthSession(SessionUnlockDto(pinCode: pinCode)); + await _apiService.authenticationApi.unlockAuthSession(SessionUnlockDto(pinCode: pinCode.toOptional())); return true; } catch (_) { return false; diff --git a/mobile/lib/repositories/drift_album_api_repository.dart b/mobile/lib/repositories/drift_album_api_repository.dart index a0c7a3732a..3105d4e0c4 100644 --- a/mobile/lib/repositories/drift_album_api_repository.dart +++ b/mobile/lib/repositories/drift_album_api_repository.dart @@ -22,7 +22,9 @@ class DriftAlbumApiRepository extends ApiRepository { String? description, }) async { final responseDto = await checkNull( - _api.createAlbum(CreateAlbumDto(albumName: name, description: description, assetIds: assetIds.toList())), + _api.createAlbum( + CreateAlbumDto(albumName: name, description: description.toOptional(), assetIds: assetIds.toList().toOptional()), + ), ); return responseDto.toRemoteAlbum(owner); @@ -73,11 +75,11 @@ class DriftAlbumApiRepository extends ApiRepository { _api.updateAlbumInfo( albumId, UpdateAlbumDto( - albumName: name, - description: description, - albumThumbnailAssetId: thumbnailAssetId, - isActivityEnabled: isActivityEnabled, - order: apiOrder, + albumName: name.toOptional(), + description: description.toOptional(), + albumThumbnailAssetId: thumbnailAssetId.toOptional(), + isActivityEnabled: isActivityEnabled.toOptional(), + order: apiOrder.toOptional(), ), ), ); @@ -99,7 +101,9 @@ class DriftAlbumApiRepository extends ApiRepository { } Future setActivityStatus(String albumId, bool isEnabled) async { - final response = await checkNull(_api.updateAlbumInfo(albumId, UpdateAlbumDto(isActivityEnabled: isEnabled))); + final response = await checkNull( + _api.updateAlbumInfo(albumId, UpdateAlbumDto(isActivityEnabled: isEnabled.toOptional())), + ); return response.isActivityEnabled; } } diff --git a/mobile/lib/repositories/folder_api.repository.dart b/mobile/lib/repositories/folder_api.repository.dart index 8c9959389c..25032718ff 100644 --- a/mobile/lib/repositories/folder_api.repository.dart +++ b/mobile/lib/repositories/folder_api.repository.dart @@ -17,7 +17,7 @@ class FolderApiRepository extends ApiRepository { Future> getAllUniquePaths() async { try { final list = await _api.getUniqueOriginalPaths(); - return list ?? []; + return list; } catch (e, stack) { _log.severe("Failed to fetch unique original links", e, stack); return []; @@ -26,8 +26,8 @@ class FolderApiRepository extends ApiRepository { Future> getAssetsForPath(String? path) async { try { - final list = await _api.getAssetsByOriginalPath(path ?? '/'); - return list != null ? list.map((e) => e.toDtoWithExif()).toList() : []; + final list = await _api.getAssetsByOriginalPath(path: path ?? '/'); + return list.map((e) => e.toDtoWithExif()).toList(); } catch (e, stack) { _log.severe("Failed to fetch Assets by original path", e, stack); return []; diff --git a/mobile/lib/repositories/partner_api.repository.dart b/mobile/lib/repositories/partner_api.repository.dart index 69b6740cbe..5817a7295f 100644 --- a/mobile/lib/repositories/partner_api.repository.dart +++ b/mobile/lib/repositories/partner_api.repository.dart @@ -16,7 +16,9 @@ class PartnerApiRepository extends ApiRepository { Future> getAll(Direction direction) async { final response = await checkNull( - _api.getPartners(direction == Direction.sharedByMe ? PartnerDirection.by : PartnerDirection.with_), + _api.getPartners( + direction: direction == Direction.sharedByMe ? PartnerDirection.sharedBy : PartnerDirection.sharedWith, + ), ); return response.map(UserConverter.fromPartnerDto).toList(); } diff --git a/mobile/lib/repositories/person_api.repository.dart b/mobile/lib/repositories/person_api.repository.dart index bbf55e674a..c4a54e4395 100644 --- a/mobile/lib/repositories/person_api.repository.dart +++ b/mobile/lib/repositories/person_api.repository.dart @@ -18,7 +18,7 @@ class PersonApiRepository extends ApiRepository { Future update(String id, {String? name, DateTime? birthday}) async { final birthdayUtc = birthday == null ? null : DateTime.utc(birthday.year, birthday.month, birthday.day); - final dto = PersonUpdateDto(name: name, birthDate: birthdayUtc); + final dto = PersonUpdateDto(name: name.toOptional(), birthDate: birthdayUtc.toOptional()); final response = await checkNull(_api.updatePerson(id, dto)); return _toPerson(response); } diff --git a/mobile/lib/repositories/sessions_api.repository.dart b/mobile/lib/repositories/sessions_api.repository.dart index f25e724f19..71cf546da5 100644 --- a/mobile/lib/repositories/sessions_api.repository.dart +++ b/mobile/lib/repositories/sessions_api.repository.dart @@ -15,7 +15,13 @@ class SessionsAPIRepository extends ApiRepository { Future createSession(String deviceType, String deviceOS, {int? duration}) async { final dto = await checkNull( - _api.createSession(SessionCreateDto(deviceType: deviceType, deviceOS: deviceOS, duration: duration)), + _api.createSession( + SessionCreateDto( + deviceType: deviceType.toOptional(), + deviceOs: deviceOS.toOptional(), + duration: duration.toOptional(), + ), + ), ); return SessionCreateResponse( diff --git a/mobile/lib/routing/auth_guard.dart b/mobile/lib/routing/auth_guard.dart index 2fc27be4f4..bda25c39e9 100644 --- a/mobile/lib/routing/auth_guard.dart +++ b/mobile/lib/routing/auth_guard.dart @@ -47,7 +47,7 @@ class AuthGuard extends AutoRouteGuard { _validateInFlight = true; try { final res = await _apiService.authenticationApi.validateAccessToken(); - if (res == null || res.authStatus != true) { + if (res.authStatus != true) { // Token may have changed during validation (user logged out + logged in // again); only act if it still applies to the current session. if (Store.tryGet(StoreKey.accessToken) != token) { diff --git a/mobile/lib/routing/locked_guard.dart b/mobile/lib/routing/locked_guard.dart index ddb6a7e694..ecc378c07c 100644 --- a/mobile/lib/routing/locked_guard.dart +++ b/mobile/lib/routing/locked_guard.dart @@ -24,11 +24,6 @@ class LockedGuard extends AutoRouteGuard { void onNavigation(NavigationResolver resolver, StackRouter router) async { final authStatus = await _apiService.authenticationApi.getAuthStatus(); - if (authStatus == null) { - resolver.next(false); - return; - } - /// Check if a pincode has been created but this user. Show the form to create if not exist if (!authStatus.pinCode) { unawaited(router.push(PinAuthRoute(createPinCode: true))); @@ -55,7 +50,7 @@ class LockedGuard extends AutoRouteGuard { return; } - await _apiService.authenticationApi.unlockAuthSession(SessionUnlockDto(pinCode: securePinCode)); + await _apiService.authenticationApi.unlockAuthSession(SessionUnlockDto(pinCode: securePinCode.toOptional())); resolver.next(true); } on PlatformException catch (error) { diff --git a/mobile/lib/services/map.service.dart b/mobile/lib/services/map.service.dart index 5b50e8a890..311af02408 100644 --- a/mobile/lib/services/map.service.dart +++ b/mobile/lib/services/map.service.dart @@ -36,7 +36,7 @@ class MapService with ErrorLoggerMixin { fileCreatedBefore: fileCreatedBefore, ); - return markers?.map(MapMarker.fromDto) ?? []; + return markers.map(MapMarker.fromDto); }, defaultValue: [], errorMessage: "Failed to get map markers", diff --git a/mobile/lib/services/oauth.service.dart b/mobile/lib/services/oauth.service.dart index 99ceca3229..5df094f9b9 100644 --- a/mobile/lib/services/oauth.service.dart +++ b/mobile/lib/services/oauth.service.dart @@ -18,10 +18,10 @@ class OAuthService { log.info("Starting OAuth flow with redirect URI: $redirectUri"); final dto = await _apiService.oAuthApi.startOAuth( - OAuthConfigDto(redirectUri: redirectUri, state: state, codeChallenge: codeChallenge), + OAuthConfigDto(redirectUri: redirectUri, state: state.toOptional(), codeChallenge: codeChallenge.toOptional()), ); - final authUrl = dto?.url; + final authUrl = dto.url; log.info('Received Authorization URL: $authUrl'); return authUrl; @@ -37,7 +37,7 @@ class OAuthService { } return await _apiService.oAuthApi.finishOAuth( - OAuthCallbackDto(url: result, state: state, codeVerifier: codeVerifier), + OAuthCallbackDto(url: result, state: state.toOptional(), codeVerifier: codeVerifier.toOptional()), ); } } diff --git a/mobile/lib/services/server_info.service.dart b/mobile/lib/services/server_info.service.dart index 460e135421..7f94dc439a 100644 --- a/mobile/lib/services/server_info.service.dart +++ b/mobile/lib/services/server_info.service.dart @@ -17,9 +17,7 @@ class ServerInfoService { Future getDiskInfo() async { try { final dto = await _apiService.serverInfoApi.getStorage(); - if (dto != null) { - return ServerDiskInfo.fromDto(dto); - } + return ServerDiskInfo.fromDto(dto); } catch (e) { dPrint(() => "Error [getDiskInfo] ${e.toString()}"); } @@ -29,9 +27,7 @@ class ServerInfoService { Future getServerVersion() async { try { final dto = await _apiService.serverInfoApi.getServerVersion(); - if (dto != null) { - return ServerVersion.fromDto(dto); - } + return ServerVersion.fromDto(dto); } catch (e) { dPrint(() => "Error [getServerVersion] ${e.toString()}"); } @@ -41,9 +37,7 @@ class ServerInfoService { Future getServerFeatures() async { try { final dto = await _apiService.serverInfoApi.getServerFeatures(); - if (dto != null) { - return ServerFeatures.fromDto(dto); - } + return ServerFeatures.fromDto(dto); } catch (e) { dPrint(() => "Error [getServerFeatures] ${e.toString()}"); } @@ -53,9 +47,7 @@ class ServerInfoService { Future getServerConfig() async { try { final dto = await _apiService.serverInfoApi.getServerConfig(); - if (dto != null) { - return ServerConfig.fromDto(dto); - } + return ServerConfig.fromDto(dto); } catch (e) { dPrint(() => "Error [getServerConfig] ${e.toString()}"); } diff --git a/mobile/lib/services/shared_link.service.dart b/mobile/lib/services/shared_link.service.dart index 46e83f0fc4..da0f0d9fc1 100644 --- a/mobile/lib/services/shared_link.service.dart +++ b/mobile/lib/services/shared_link.service.dart @@ -16,7 +16,7 @@ class SharedLinkService { Future>> getAllSharedLinks() async { try { final list = await _apiService.sharedLinksApi.getAllSharedLinks(); - return list != null ? AsyncData(list.map(SharedLink.fromDto).toList()) : const AsyncData([]); + return AsyncData(list.map(SharedLink.fromDto).toList()); } catch (e, stack) { _log.severe("Failed to fetch shared links", e, stack); return AsyncError(e, stack); @@ -43,39 +43,37 @@ class SharedLinkService { DateTime? expiresAt, }) async { try { - final type = albumId != null ? SharedLinkType.ALBUM : SharedLinkType.INDIVIDUAL; + final type = albumId != null ? SharedLinkType.album : SharedLinkType.individual; SharedLinkCreateDto? dto; - if (type == SharedLinkType.ALBUM) { + if (type == SharedLinkType.album) { dto = SharedLinkCreateDto( type: type, - albumId: albumId, - showMetadata: showMeta, - allowDownload: allowDownload, - allowUpload: allowUpload, - expiresAt: expiresAt, - description: description, - password: password, - slug: slug, + albumId: albumId.toOptional(), + showMetadata: showMeta.toOptional(), + allowDownload: allowDownload.toOptional(), + allowUpload: allowUpload.toOptional(), + expiresAt: expiresAt.toOptional(), + description: description.toOptional(), + password: password.toOptional(), + slug: slug.toOptional(), ); } else if (assetIds != null) { dto = SharedLinkCreateDto( type: type, - showMetadata: showMeta, - allowDownload: allowDownload, - allowUpload: allowUpload, - expiresAt: expiresAt, - description: description, - password: password, - slug: slug, - assetIds: assetIds, + showMetadata: showMeta.toOptional(), + allowDownload: allowDownload.toOptional(), + allowUpload: allowUpload.toOptional(), + expiresAt: expiresAt.toOptional(), + description: description.toOptional(), + password: password.toOptional(), + slug: slug.toOptional(), + assetIds: assetIds.toOptional(), ); } if (dto != null) { final responseDto = await _apiService.sharedLinksApi.createSharedLink(dto); - if (responseDto != null) { - return SharedLink.fromDto(responseDto); - } + return SharedLink.fromDto(responseDto); } } catch (e) { _log.severe("Failed to create shared link", e); @@ -98,19 +96,17 @@ class SharedLinkService { final responseDto = await _apiService.sharedLinksApi.updateSharedLink( id, SharedLinkEditDto( - showMetadata: showMeta, - allowDownload: allowDownload, - allowUpload: allowUpload, - expiresAt: expiresAt, - description: description, - password: password, - slug: slug, - changeExpiryTime: changeExpiry, + showMetadata: showMeta.toOptional(), + allowDownload: allowDownload.toOptional(), + allowUpload: allowUpload.toOptional(), + expiresAt: expiresAt.toOptional(), + description: description.toOptional(), + password: password.toOptional(), + slug: slug.toOptional(), + changeExpiryTime: changeExpiry.toOptional(), ), ); - if (responseDto != null) { - return SharedLink.fromDto(responseDto); - } + return SharedLink.fromDto(responseDto); } catch (e) { _log.severe("Failed to update shared link id - $id", e); } diff --git a/mobile/lib/utils/openapi_compat.dart b/mobile/lib/utils/openapi_compat.dart new file mode 100644 index 0000000000..8525d3fd66 --- /dev/null +++ b/mobile/lib/utils/openapi_compat.dart @@ -0,0 +1,42 @@ +import 'package:openapi/api.dart'; + +/// Registers backward-compatibility back-fills so the generated client tolerates +/// responses from older Immich servers (fields newer DTOs expect but older +/// servers omit). Call once at startup, before any API request. +/// +/// The mechanism ([ApiCompat]) lives in the generated client; the rules live +/// here because the defaults are app/server-version knowledge. Keyed by DTO +/// type, so a renamed or removed DTO is a compile error. Static-only rule lists +/// are `const`; lists using a DTO's `toJson()` or `DateTime.now()` are built at +/// startup. +void configureOpenApiCompat() { + ApiCompat.configure({ + UserPreferencesResponseDto: [ + const .new('download.includeEmbeddedVideos', false), + .new('folders', const FoldersResponse(enabled: false, sidebarWeb: false).toJson()), + .new('memories', const MemoriesResponse(enabled: true, duration: 5).toJson()), + .new('ratings', const RatingsResponse(enabled: false).toJson()), + .new('people', const PeopleResponse(enabled: true, sidebarWeb: false).toJson()), + .new('tags', const TagsResponse(enabled: false, sidebarWeb: false).toJson()), + .new('sharedLinks', const SharedLinksResponse(enabled: true, sidebarWeb: false).toJson()), + .new('cast', const CastResponse(gCastEnabled: false).toJson()), + const .new('albums', {'defaultAssetOrder': 'desc'}), + ], + ServerConfigDto: const [ + .new('mapLightStyleUrl', 'https://tiles.immich.cloud/v1/style/light.json'), + .new('mapDarkStyleUrl', 'https://tiles.immich.cloud/v1/style/dark.json'), + ], + UserResponseDto: [.new('profileChangedAt', DateTime.now().toIso8601String())], + AssetResponseDto: [ + const .new('visibility', 'timeline'), + .new('createdAt', DateTime.now().toIso8601String()), + const .new('isEdited', false), + ], + UserAdminResponseDto: [.new('profileChangedAt', DateTime.now().toIso8601String())], + LoginResponseDto: const [.new('isOnboarded', false)], + SyncUserV1: [.new('profileChangedAt', DateTime.now().toIso8601String()), const .new('hasProfileImage', false)], + SyncAssetV1: const [.new('isEdited', false)], + ServerFeaturesDto: const [.new('ocr', false)], + MemoriesResponse: const [.new('duration', 5)], + }); +} diff --git a/mobile/lib/utils/openapi_patching.dart b/mobile/lib/utils/openapi_patching.dart deleted file mode 100644 index 38c805a42e..0000000000 --- a/mobile/lib/utils/openapi_patching.dart +++ /dev/null @@ -1,82 +0,0 @@ -import 'package:openapi/api.dart'; - -dynamic upgradeDto(dynamic value, String targetType) { - switch (targetType) { - case 'UserPreferencesResponseDto': - if (value is Map) { - addDefault(value, 'download.includeEmbeddedVideos', false); - addDefault(value, 'folders', FoldersResponse(enabled: false, sidebarWeb: false).toJson()); - addDefault(value, 'memories', MemoriesResponse(enabled: true, duration: 5).toJson()); - addDefault(value, 'ratings', RatingsResponse(enabled: false).toJson()); - addDefault(value, 'people', PeopleResponse(enabled: true, sidebarWeb: false).toJson()); - addDefault(value, 'tags', TagsResponse(enabled: false, sidebarWeb: false).toJson()); - addDefault(value, 'sharedLinks', SharedLinksResponse(enabled: true, sidebarWeb: false).toJson()); - addDefault(value, 'cast', CastResponse(gCastEnabled: false).toJson()); - addDefault(value, 'albums', {'defaultAssetOrder': 'desc'}); - } - break; - case 'ServerConfigDto': - if (value is Map) { - addDefault(value, 'mapLightStyleUrl', 'https://tiles.immich.cloud/v1/style/light.json'); - addDefault(value, 'mapDarkStyleUrl', 'https://tiles.immich.cloud/v1/style/dark.json'); - } - case 'UserResponseDto': - if (value is Map) { - addDefault(value, 'profileChangedAt', DateTime.now().toIso8601String()); - } - break; - case 'AssetResponseDto': - if (value is Map) { - addDefault(value, 'visibility', 'timeline'); - addDefault(value, 'createdAt', DateTime.now().toIso8601String()); - addDefault(value, 'isEdited', false); - } - break; - case 'UserAdminResponseDto': - if (value is Map) { - addDefault(value, 'profileChangedAt', DateTime.now().toIso8601String()); - } - break; - case 'LoginResponseDto': - if (value is Map) { - addDefault(value, 'isOnboarded', false); - } - break; - case 'SyncUserV1': - if (value is Map) { - addDefault(value, 'profileChangedAt', DateTime.now().toIso8601String()); - addDefault(value, 'hasProfileImage', false); - } - case 'SyncAssetV1': - if (value is Map) { - addDefault(value, 'isEdited', false); - } - case 'ServerFeaturesDto': - if (value is Map) { - addDefault(value, 'ocr', false); - } - break; - case 'MemoriesResponse': - if (value is Map) { - addDefault(value, 'duration', 5); - } - break; - } -} - -addDefault(dynamic value, String keys, dynamic defaultValue) { - // Loop through the keys and assign the default value if the key is not present - List keyList = keys.split('.'); - dynamic current = value; - - for (int i = 0; i < keyList.length - 1; i++) { - if (current[keyList[i]] == null) { - current[keyList[i]] = {}; - } - current = current[keyList[i]]; - } - - if (current[keyList.last] == null) { - current[keyList.last] = defaultValue; - } -} diff --git a/mobile/openapi/.gitignore b/mobile/openapi/.gitignore deleted file mode 100644 index 0f74d293b9..0000000000 --- a/mobile/openapi/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -# See https://dart.dev/guides/libraries/private-files - -.dart_tool/ -.packages -build/ - -# Except for application packages -pubspec.lock - -doc/api/ - -# IntelliJ -*.iml -*.ipr -*.iws -.idea/ - -# Mac -.DS_Store diff --git a/mobile/openapi/.openapi-generator-ignore b/mobile/openapi/.openapi-generator-ignore deleted file mode 100644 index 7484ee590a..0000000000 --- a/mobile/openapi/.openapi-generator-ignore +++ /dev/null @@ -1,23 +0,0 @@ -# OpenAPI Generator Ignore -# Generated by openapi-generator https://github.com/openapitools/openapi-generator - -# Use this file to prevent files from being overwritten by the generator. -# The patterns follow closely to .gitignore or .dockerignore. - -# As an example, the C# client generator defines ApiClient.cs. -# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: -#ApiClient.cs - -# You can match any string of characters against a directory, file or extension with a single asterisk (*): -#foo/*/qux -# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux - -# You can recursively match patterns against a directory, file or extension with a double asterisk (**): -#foo/**/qux -# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux - -# You can also negate patterns with an exclamation (!). -# For example, you can ignore all files in a docs folder with the file extension .md: -#docs/*.md -# Then explicitly reverse the ignore rule for a single file: -#!docs/README.md diff --git a/mobile/openapi/.openapi-generator/VERSION b/mobile/openapi/.openapi-generator/VERSION deleted file mode 100644 index 09a6d30847..0000000000 --- a/mobile/openapi/.openapi-generator/VERSION +++ /dev/null @@ -1 +0,0 @@ -7.8.0 diff --git a/mobile/openapi/.travis.yml b/mobile/openapi/.travis.yml deleted file mode 100644 index 2774ccbba0..0000000000 --- a/mobile/openapi/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -# -# AUTO-GENERATED FILE, DO NOT MODIFY! -# -# https://docs.travis-ci.com/user/languages/dart/ -# -language: dart -dart: -# Install a specific stable release -- "2.12" -install: -- pub get - -script: -- pub run test diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md deleted file mode 100644 index 23987073dd..0000000000 --- a/mobile/openapi/README.md +++ /dev/null @@ -1,704 +0,0 @@ -# openapi -Immich API - -This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - -- API version: 3.0.0 -- Generator version: 7.8.0 -- Build package: org.openapitools.codegen.languages.DartClientCodegen - -## Requirements - -Dart 2.12 or later - -## Installation & Usage - -### Github -If this Dart package is published to Github, add the following dependency to your pubspec.yaml -``` -dependencies: - openapi: - git: https://github.com/GIT_USER_ID/GIT_REPO_ID.git -``` - -### Local -To use the package in your local drive, add the following dependency to your pubspec.yaml -``` -dependencies: - openapi: - path: /path/to/openapi -``` - -## Tests - -TODO - -## Getting Started - -Please follow the [installation procedure](#installation--usage) and then run the following: - -```dart -import 'package:openapi/api.dart'; - -// TODO Configure API key authorization: cookie -//defaultApiClient.getAuthentication('cookie').apiKey = 'YOUR_API_KEY'; -// uncomment below to setup prefix (e.g. Bearer) for API key, if needed -//defaultApiClient.getAuthentication('cookie').apiKeyPrefix = 'Bearer'; -// TODO Configure API key authorization: api_key -//defaultApiClient.getAuthentication('api_key').apiKey = 'YOUR_API_KEY'; -// uncomment below to setup prefix (e.g. Bearer) for API key, if needed -//defaultApiClient.getAuthentication('api_key').apiKeyPrefix = 'Bearer'; -// TODO Configure HTTP Bearer authorization: bearer -// Case 1. Use String Token -//defaultApiClient.getAuthentication('bearer').setAccessToken('YOUR_ACCESS_TOKEN'); -// Case 2. Use Function which generate token. -// String yourTokenGeneratorFunction() { ... } -//defaultApiClient.getAuthentication('bearer').setAccessToken(yourTokenGeneratorFunction); - -final api_instance = APIKeysApi(); -final apiKeyCreateDto = ApiKeyCreateDto(); // ApiKeyCreateDto | - -try { - final result = api_instance.createApiKey(apiKeyCreateDto); - print(result); -} catch (e) { - print('Exception when calling APIKeysApi->createApiKey: $e\n'); -} - -``` - -## Documentation for API Endpoints - -All URIs are relative to */api* - -Class | Method | HTTP request | Description ------------- | ------------- | ------------- | ------------- -*APIKeysApi* | [**createApiKey**](doc//APIKeysApi.md#createapikey) | **POST** /api-keys | Create an API key -*APIKeysApi* | [**deleteApiKey**](doc//APIKeysApi.md#deleteapikey) | **DELETE** /api-keys/{id} | Delete an API key -*APIKeysApi* | [**getApiKey**](doc//APIKeysApi.md#getapikey) | **GET** /api-keys/{id} | Retrieve an API key -*APIKeysApi* | [**getApiKeys**](doc//APIKeysApi.md#getapikeys) | **GET** /api-keys | List all API keys -*APIKeysApi* | [**getMyApiKey**](doc//APIKeysApi.md#getmyapikey) | **GET** /api-keys/me | Retrieve the current API key -*APIKeysApi* | [**updateApiKey**](doc//APIKeysApi.md#updateapikey) | **PUT** /api-keys/{id} | Update an API key -*ActivitiesApi* | [**createActivity**](doc//ActivitiesApi.md#createactivity) | **POST** /activities | Create an activity -*ActivitiesApi* | [**deleteActivity**](doc//ActivitiesApi.md#deleteactivity) | **DELETE** /activities/{id} | Delete an activity -*ActivitiesApi* | [**getActivities**](doc//ActivitiesApi.md#getactivities) | **GET** /activities | List all activities -*ActivitiesApi* | [**getActivityStatistics**](doc//ActivitiesApi.md#getactivitystatistics) | **GET** /activities/statistics | Retrieve activity statistics -*AlbumsApi* | [**addAssetsToAlbum**](doc//AlbumsApi.md#addassetstoalbum) | **PUT** /albums/{id}/assets | Add assets to an album -*AlbumsApi* | [**addAssetsToAlbums**](doc//AlbumsApi.md#addassetstoalbums) | **PUT** /albums/assets | Add assets to albums -*AlbumsApi* | [**addUsersToAlbum**](doc//AlbumsApi.md#adduserstoalbum) | **PUT** /albums/{id}/users | Share album with users -*AlbumsApi* | [**createAlbum**](doc//AlbumsApi.md#createalbum) | **POST** /albums | Create an album -*AlbumsApi* | [**deleteAlbum**](doc//AlbumsApi.md#deletealbum) | **DELETE** /albums/{id} | Delete an album -*AlbumsApi* | [**getAlbumInfo**](doc//AlbumsApi.md#getalbuminfo) | **GET** /albums/{id} | Retrieve an album -*AlbumsApi* | [**getAlbumMapMarkers**](doc//AlbumsApi.md#getalbummapmarkers) | **GET** /albums/{id}/map-markers | Retrieve album map markers -*AlbumsApi* | [**getAlbumStatistics**](doc//AlbumsApi.md#getalbumstatistics) | **GET** /albums/statistics | Retrieve album statistics -*AlbumsApi* | [**getAllAlbums**](doc//AlbumsApi.md#getallalbums) | **GET** /albums | List all albums -*AlbumsApi* | [**removeAssetFromAlbum**](doc//AlbumsApi.md#removeassetfromalbum) | **DELETE** /albums/{id}/assets | Remove assets from an album -*AlbumsApi* | [**removeUserFromAlbum**](doc//AlbumsApi.md#removeuserfromalbum) | **DELETE** /albums/{id}/user/{userId} | Remove user from album -*AlbumsApi* | [**updateAlbumInfo**](doc//AlbumsApi.md#updatealbuminfo) | **PATCH** /albums/{id} | Update an album -*AlbumsApi* | [**updateAlbumUser**](doc//AlbumsApi.md#updatealbumuser) | **PUT** /albums/{id}/user/{userId} | Update user role -*AssetsApi* | [**checkBulkUpload**](doc//AssetsApi.md#checkbulkupload) | **POST** /assets/bulk-upload-check | Check bulk upload -*AssetsApi* | [**copyAsset**](doc//AssetsApi.md#copyasset) | **PUT** /assets/copy | Copy asset -*AssetsApi* | [**deleteAssetMetadata**](doc//AssetsApi.md#deleteassetmetadata) | **DELETE** /assets/{id}/metadata/{key} | Delete asset metadata by key -*AssetsApi* | [**deleteAssets**](doc//AssetsApi.md#deleteassets) | **DELETE** /assets | Delete assets -*AssetsApi* | [**deleteBulkAssetMetadata**](doc//AssetsApi.md#deletebulkassetmetadata) | **DELETE** /assets/metadata | Delete asset metadata -*AssetsApi* | [**downloadAsset**](doc//AssetsApi.md#downloadasset) | **GET** /assets/{id}/original | Download original asset -*AssetsApi* | [**editAsset**](doc//AssetsApi.md#editasset) | **PUT** /assets/{id}/edits | Apply edits to an existing asset -*AssetsApi* | [**getAssetEdits**](doc//AssetsApi.md#getassetedits) | **GET** /assets/{id}/edits | Retrieve edits for an existing asset -*AssetsApi* | [**getAssetInfo**](doc//AssetsApi.md#getassetinfo) | **GET** /assets/{id} | Retrieve an asset -*AssetsApi* | [**getAssetMetadata**](doc//AssetsApi.md#getassetmetadata) | **GET** /assets/{id}/metadata | Get asset metadata -*AssetsApi* | [**getAssetMetadataByKey**](doc//AssetsApi.md#getassetmetadatabykey) | **GET** /assets/{id}/metadata/{key} | Retrieve asset metadata by key -*AssetsApi* | [**getAssetOcr**](doc//AssetsApi.md#getassetocr) | **GET** /assets/{id}/ocr | Retrieve asset OCR data -*AssetsApi* | [**getAssetStatistics**](doc//AssetsApi.md#getassetstatistics) | **GET** /assets/statistics | Get asset statistics -*AssetsApi* | [**playAssetVideo**](doc//AssetsApi.md#playassetvideo) | **GET** /assets/{id}/video/playback | Play asset video -*AssetsApi* | [**removeAssetEdits**](doc//AssetsApi.md#removeassetedits) | **DELETE** /assets/{id}/edits | Remove edits from an existing asset -*AssetsApi* | [**runAssetJobs**](doc//AssetsApi.md#runassetjobs) | **POST** /assets/jobs | Run an asset job -*AssetsApi* | [**updateAsset**](doc//AssetsApi.md#updateasset) | **PUT** /assets/{id} | Update an asset -*AssetsApi* | [**updateAssetMetadata**](doc//AssetsApi.md#updateassetmetadata) | **PUT** /assets/{id}/metadata | Update asset metadata -*AssetsApi* | [**updateAssets**](doc//AssetsApi.md#updateassets) | **PUT** /assets | Update assets -*AssetsApi* | [**updateBulkAssetMetadata**](doc//AssetsApi.md#updatebulkassetmetadata) | **PUT** /assets/metadata | Upsert asset metadata -*AssetsApi* | [**uploadAsset**](doc//AssetsApi.md#uploadasset) | **POST** /assets | Upload asset -*AssetsApi* | [**viewAsset**](doc//AssetsApi.md#viewasset) | **GET** /assets/{id}/thumbnail | View asset thumbnail -*AuthenticationApi* | [**changePassword**](doc//AuthenticationApi.md#changepassword) | **POST** /auth/change-password | Change password -*AuthenticationApi* | [**changePinCode**](doc//AuthenticationApi.md#changepincode) | **PUT** /auth/pin-code | Change pin code -*AuthenticationApi* | [**finishOAuth**](doc//AuthenticationApi.md#finishoauth) | **POST** /oauth/callback | Finish OAuth -*AuthenticationApi* | [**getAuthStatus**](doc//AuthenticationApi.md#getauthstatus) | **GET** /auth/status | Retrieve auth status -*AuthenticationApi* | [**linkOAuthAccount**](doc//AuthenticationApi.md#linkoauthaccount) | **POST** /oauth/link | Link OAuth account -*AuthenticationApi* | [**lockAuthSession**](doc//AuthenticationApi.md#lockauthsession) | **POST** /auth/session/lock | Lock auth session -*AuthenticationApi* | [**login**](doc//AuthenticationApi.md#login) | **POST** /auth/login | Login -*AuthenticationApi* | [**logout**](doc//AuthenticationApi.md#logout) | **POST** /auth/logout | Logout -*AuthenticationApi* | [**logoutOAuth**](doc//AuthenticationApi.md#logoutoauth) | **POST** /oauth/backchannel-logout | Backchannel OAuth logout -*AuthenticationApi* | [**redirectOAuthToMobile**](doc//AuthenticationApi.md#redirectoauthtomobile) | **GET** /oauth/mobile-redirect | Redirect OAuth to mobile -*AuthenticationApi* | [**resetPinCode**](doc//AuthenticationApi.md#resetpincode) | **DELETE** /auth/pin-code | Reset pin code -*AuthenticationApi* | [**setupPinCode**](doc//AuthenticationApi.md#setuppincode) | **POST** /auth/pin-code | Setup pin code -*AuthenticationApi* | [**signUpAdmin**](doc//AuthenticationApi.md#signupadmin) | **POST** /auth/admin-sign-up | Register admin -*AuthenticationApi* | [**startOAuth**](doc//AuthenticationApi.md#startoauth) | **POST** /oauth/authorize | Start OAuth -*AuthenticationApi* | [**unlinkOAuthAccount**](doc//AuthenticationApi.md#unlinkoauthaccount) | **POST** /oauth/unlink | Unlink OAuth account -*AuthenticationApi* | [**unlockAuthSession**](doc//AuthenticationApi.md#unlockauthsession) | **POST** /auth/session/unlock | Unlock auth session -*AuthenticationApi* | [**validateAccessToken**](doc//AuthenticationApi.md#validateaccesstoken) | **POST** /auth/validateToken | Validate access token -*AuthenticationAdminApi* | [**unlinkAllOAuthAccountsAdmin**](doc//AuthenticationAdminApi.md#unlinkalloauthaccountsadmin) | **POST** /admin/auth/unlink-all | Unlink all OAuth accounts -*DatabaseBackupsAdminApi* | [**deleteDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#deletedatabasebackup) | **DELETE** /admin/database-backups | Delete database backup -*DatabaseBackupsAdminApi* | [**downloadDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#downloaddatabasebackup) | **GET** /admin/database-backups/{filename} | Download database backup -*DatabaseBackupsAdminApi* | [**listDatabaseBackups**](doc//DatabaseBackupsAdminApi.md#listdatabasebackups) | **GET** /admin/database-backups | List database backups -*DatabaseBackupsAdminApi* | [**startDatabaseRestoreFlow**](doc//DatabaseBackupsAdminApi.md#startdatabaserestoreflow) | **POST** /admin/database-backups/start-restore | Start database backup restore flow -*DatabaseBackupsAdminApi* | [**uploadDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#uploaddatabasebackup) | **POST** /admin/database-backups/upload | Upload database backup -*DeprecatedApi* | [**createPartnerDeprecated**](doc//DeprecatedApi.md#createpartnerdeprecated) | **POST** /partners/{id} | Create a partner -*DeprecatedApi* | [**getQueuesLegacy**](doc//DeprecatedApi.md#getqueueslegacy) | **GET** /jobs | Retrieve queue counts and status -*DeprecatedApi* | [**runQueueCommandLegacy**](doc//DeprecatedApi.md#runqueuecommandlegacy) | **PUT** /jobs/{name} | Run jobs -*DownloadApi* | [**downloadArchive**](doc//DownloadApi.md#downloadarchive) | **POST** /download/archive | Download asset archive -*DownloadApi* | [**getDownloadInfo**](doc//DownloadApi.md#getdownloadinfo) | **POST** /download/info | Retrieve download information -*DuplicatesApi* | [**deleteDuplicate**](doc//DuplicatesApi.md#deleteduplicate) | **DELETE** /duplicates/{id} | Dismiss a duplicate group -*DuplicatesApi* | [**deleteDuplicates**](doc//DuplicatesApi.md#deleteduplicates) | **DELETE** /duplicates | Delete duplicates -*DuplicatesApi* | [**getAssetDuplicates**](doc//DuplicatesApi.md#getassetduplicates) | **GET** /duplicates | Retrieve duplicates -*DuplicatesApi* | [**resolveDuplicates**](doc//DuplicatesApi.md#resolveduplicates) | **POST** /duplicates/resolve | Resolve duplicate groups -*FacesApi* | [**createFace**](doc//FacesApi.md#createface) | **POST** /faces | Create a face -*FacesApi* | [**deleteFace**](doc//FacesApi.md#deleteface) | **DELETE** /faces/{id} | Delete a face -*FacesApi* | [**getFaces**](doc//FacesApi.md#getfaces) | **GET** /faces | Retrieve faces for asset -*FacesApi* | [**reassignFacesById**](doc//FacesApi.md#reassignfacesbyid) | **PUT** /faces/{id} | Re-assign a face to another person -*JobsApi* | [**createJob**](doc//JobsApi.md#createjob) | **POST** /jobs | Create a manual job -*JobsApi* | [**getQueuesLegacy**](doc//JobsApi.md#getqueueslegacy) | **GET** /jobs | Retrieve queue counts and status -*JobsApi* | [**runQueueCommandLegacy**](doc//JobsApi.md#runqueuecommandlegacy) | **PUT** /jobs/{name} | Run jobs -*LibrariesApi* | [**createLibrary**](doc//LibrariesApi.md#createlibrary) | **POST** /libraries | Create a library -*LibrariesApi* | [**deleteLibrary**](doc//LibrariesApi.md#deletelibrary) | **DELETE** /libraries/{id} | Delete a library -*LibrariesApi* | [**getAllLibraries**](doc//LibrariesApi.md#getalllibraries) | **GET** /libraries | Retrieve libraries -*LibrariesApi* | [**getLibrary**](doc//LibrariesApi.md#getlibrary) | **GET** /libraries/{id} | Retrieve a library -*LibrariesApi* | [**getLibraryStatistics**](doc//LibrariesApi.md#getlibrarystatistics) | **GET** /libraries/{id}/statistics | Retrieve library statistics -*LibrariesApi* | [**scanLibrary**](doc//LibrariesApi.md#scanlibrary) | **POST** /libraries/{id}/scan | Scan a library -*LibrariesApi* | [**updateLibrary**](doc//LibrariesApi.md#updatelibrary) | **PUT** /libraries/{id} | Update a library -*LibrariesApi* | [**validate**](doc//LibrariesApi.md#validate) | **POST** /libraries/{id}/validate | Validate library settings -*MaintenanceAdminApi* | [**detectPriorInstall**](doc//MaintenanceAdminApi.md#detectpriorinstall) | **GET** /admin/maintenance/detect-install | Detect existing install -*MaintenanceAdminApi* | [**getMaintenanceStatus**](doc//MaintenanceAdminApi.md#getmaintenancestatus) | **GET** /admin/maintenance/status | Get maintenance mode status -*MaintenanceAdminApi* | [**maintenanceLogin**](doc//MaintenanceAdminApi.md#maintenancelogin) | **POST** /admin/maintenance/login | Log into maintenance mode -*MaintenanceAdminApi* | [**setMaintenanceMode**](doc//MaintenanceAdminApi.md#setmaintenancemode) | **POST** /admin/maintenance | Set maintenance mode -*MapApi* | [**getMapMarkers**](doc//MapApi.md#getmapmarkers) | **GET** /map/markers | Retrieve map markers -*MapApi* | [**reverseGeocode**](doc//MapApi.md#reversegeocode) | **GET** /map/reverse-geocode | Reverse geocode coordinates -*MemoriesApi* | [**addMemoryAssets**](doc//MemoriesApi.md#addmemoryassets) | **PUT** /memories/{id}/assets | Add assets to a memory -*MemoriesApi* | [**createMemory**](doc//MemoriesApi.md#creatememory) | **POST** /memories | Create a memory -*MemoriesApi* | [**deleteMemory**](doc//MemoriesApi.md#deletememory) | **DELETE** /memories/{id} | Delete a memory -*MemoriesApi* | [**getMemory**](doc//MemoriesApi.md#getmemory) | **GET** /memories/{id} | Retrieve a memory -*MemoriesApi* | [**memoriesStatistics**](doc//MemoriesApi.md#memoriesstatistics) | **GET** /memories/statistics | Retrieve memories statistics -*MemoriesApi* | [**removeMemoryAssets**](doc//MemoriesApi.md#removememoryassets) | **DELETE** /memories/{id}/assets | Remove assets from a memory -*MemoriesApi* | [**searchMemories**](doc//MemoriesApi.md#searchmemories) | **GET** /memories | Retrieve memories -*MemoriesApi* | [**updateMemory**](doc//MemoriesApi.md#updatememory) | **PUT** /memories/{id} | Update a memory -*NotificationsApi* | [**deleteNotification**](doc//NotificationsApi.md#deletenotification) | **DELETE** /notifications/{id} | Delete a notification -*NotificationsApi* | [**deleteNotifications**](doc//NotificationsApi.md#deletenotifications) | **DELETE** /notifications | Delete notifications -*NotificationsApi* | [**getNotification**](doc//NotificationsApi.md#getnotification) | **GET** /notifications/{id} | Get a notification -*NotificationsApi* | [**getNotifications**](doc//NotificationsApi.md#getnotifications) | **GET** /notifications | Retrieve notifications -*NotificationsApi* | [**updateNotification**](doc//NotificationsApi.md#updatenotification) | **PUT** /notifications/{id} | Update a notification -*NotificationsApi* | [**updateNotifications**](doc//NotificationsApi.md#updatenotifications) | **PUT** /notifications | Update notifications -*NotificationsAdminApi* | [**createNotification**](doc//NotificationsAdminApi.md#createnotification) | **POST** /admin/notifications | Create a notification -*NotificationsAdminApi* | [**getNotificationTemplateAdmin**](doc//NotificationsAdminApi.md#getnotificationtemplateadmin) | **POST** /admin/notifications/templates/{name} | Render email template -*NotificationsAdminApi* | [**sendTestEmailAdmin**](doc//NotificationsAdminApi.md#sendtestemailadmin) | **POST** /admin/notifications/test-email | Send test email -*PartnersApi* | [**createPartner**](doc//PartnersApi.md#createpartner) | **POST** /partners | Create a partner -*PartnersApi* | [**createPartnerDeprecated**](doc//PartnersApi.md#createpartnerdeprecated) | **POST** /partners/{id} | Create a partner -*PartnersApi* | [**getPartners**](doc//PartnersApi.md#getpartners) | **GET** /partners | Retrieve partners -*PartnersApi* | [**removePartner**](doc//PartnersApi.md#removepartner) | **DELETE** /partners/{id} | Remove a partner -*PartnersApi* | [**updatePartner**](doc//PartnersApi.md#updatepartner) | **PUT** /partners/{id} | Update a partner -*PeopleApi* | [**createPerson**](doc//PeopleApi.md#createperson) | **POST** /people | Create a person -*PeopleApi* | [**deletePeople**](doc//PeopleApi.md#deletepeople) | **DELETE** /people | Delete people -*PeopleApi* | [**deletePerson**](doc//PeopleApi.md#deleteperson) | **DELETE** /people/{id} | Delete person -*PeopleApi* | [**getAllPeople**](doc//PeopleApi.md#getallpeople) | **GET** /people | Get all people -*PeopleApi* | [**getPerson**](doc//PeopleApi.md#getperson) | **GET** /people/{id} | Get a person -*PeopleApi* | [**getPersonStatistics**](doc//PeopleApi.md#getpersonstatistics) | **GET** /people/{id}/statistics | Get person statistics -*PeopleApi* | [**getPersonThumbnail**](doc//PeopleApi.md#getpersonthumbnail) | **GET** /people/{id}/thumbnail | Get person thumbnail -*PeopleApi* | [**mergePerson**](doc//PeopleApi.md#mergeperson) | **POST** /people/{id}/merge | Merge people -*PeopleApi* | [**reassignFaces**](doc//PeopleApi.md#reassignfaces) | **PUT** /people/{id}/reassign | Reassign faces -*PeopleApi* | [**updatePeople**](doc//PeopleApi.md#updatepeople) | **PUT** /people | Update people -*PeopleApi* | [**updatePerson**](doc//PeopleApi.md#updateperson) | **PUT** /people/{id} | Update person -*PluginsApi* | [**getPlugin**](doc//PluginsApi.md#getplugin) | **GET** /plugins/{id} | Retrieve a plugin -*PluginsApi* | [**searchPluginMethods**](doc//PluginsApi.md#searchpluginmethods) | **GET** /plugins/methods | Retrieve plugin methods -*PluginsApi* | [**searchPluginTemplates**](doc//PluginsApi.md#searchplugintemplates) | **GET** /plugins/templates | Retrieve workflow templates -*PluginsApi* | [**searchPlugins**](doc//PluginsApi.md#searchplugins) | **GET** /plugins | List all plugins -*QueuesApi* | [**emptyQueue**](doc//QueuesApi.md#emptyqueue) | **DELETE** /queues/{name}/jobs | Empty a queue -*QueuesApi* | [**getQueue**](doc//QueuesApi.md#getqueue) | **GET** /queues/{name} | Retrieve a queue -*QueuesApi* | [**getQueueJobs**](doc//QueuesApi.md#getqueuejobs) | **GET** /queues/{name}/jobs | Retrieve queue jobs -*QueuesApi* | [**getQueues**](doc//QueuesApi.md#getqueues) | **GET** /queues | List all queues -*QueuesApi* | [**updateQueue**](doc//QueuesApi.md#updatequeue) | **PUT** /queues/{name} | Update a queue -*SearchApi* | [**getAssetsByCity**](doc//SearchApi.md#getassetsbycity) | **GET** /search/cities | Retrieve assets by city -*SearchApi* | [**getExploreData**](doc//SearchApi.md#getexploredata) | **GET** /search/explore | Retrieve explore data -*SearchApi* | [**getSearchSuggestions**](doc//SearchApi.md#getsearchsuggestions) | **GET** /search/suggestions | Retrieve search suggestions -*SearchApi* | [**searchAssetStatistics**](doc//SearchApi.md#searchassetstatistics) | **POST** /search/statistics | Search asset statistics -*SearchApi* | [**searchAssets**](doc//SearchApi.md#searchassets) | **POST** /search/metadata | Search assets by metadata -*SearchApi* | [**searchLargeAssets**](doc//SearchApi.md#searchlargeassets) | **POST** /search/large-assets | Search large assets -*SearchApi* | [**searchPerson**](doc//SearchApi.md#searchperson) | **GET** /search/person | Search people -*SearchApi* | [**searchPlaces**](doc//SearchApi.md#searchplaces) | **GET** /search/places | Search places -*SearchApi* | [**searchRandom**](doc//SearchApi.md#searchrandom) | **POST** /search/random | Search random assets -*SearchApi* | [**searchSmart**](doc//SearchApi.md#searchsmart) | **POST** /search/smart | Smart asset search -*ServerApi* | [**deleteServerLicense**](doc//ServerApi.md#deleteserverlicense) | **DELETE** /server/license | Delete server product key -*ServerApi* | [**getAboutInfo**](doc//ServerApi.md#getaboutinfo) | **GET** /server/about | Get server information -*ServerApi* | [**getApkLinks**](doc//ServerApi.md#getapklinks) | **GET** /server/apk-links | Get APK links -*ServerApi* | [**getServerConfig**](doc//ServerApi.md#getserverconfig) | **GET** /server/config | Get config -*ServerApi* | [**getServerFeatures**](doc//ServerApi.md#getserverfeatures) | **GET** /server/features | Get features -*ServerApi* | [**getServerLicense**](doc//ServerApi.md#getserverlicense) | **GET** /server/license | Get product key -*ServerApi* | [**getServerStatistics**](doc//ServerApi.md#getserverstatistics) | **GET** /server/statistics | Get statistics -*ServerApi* | [**getServerVersion**](doc//ServerApi.md#getserverversion) | **GET** /server/version | Get server version -*ServerApi* | [**getStorage**](doc//ServerApi.md#getstorage) | **GET** /server/storage | Get storage -*ServerApi* | [**getSupportedMediaTypes**](doc//ServerApi.md#getsupportedmediatypes) | **GET** /server/media-types | Get supported media types -*ServerApi* | [**getVersionCheck**](doc//ServerApi.md#getversioncheck) | **GET** /server/version-check | Get version check status -*ServerApi* | [**getVersionHistory**](doc//ServerApi.md#getversionhistory) | **GET** /server/version-history | Get version history -*ServerApi* | [**pingServer**](doc//ServerApi.md#pingserver) | **GET** /server/ping | Ping -*ServerApi* | [**setServerLicense**](doc//ServerApi.md#setserverlicense) | **PUT** /server/license | Set server product key -*SessionsApi* | [**createSession**](doc//SessionsApi.md#createsession) | **POST** /sessions | Create a session -*SessionsApi* | [**deleteAllSessions**](doc//SessionsApi.md#deleteallsessions) | **DELETE** /sessions | Delete all sessions -*SessionsApi* | [**deleteSession**](doc//SessionsApi.md#deletesession) | **DELETE** /sessions/{id} | Delete a session -*SessionsApi* | [**getSessions**](doc//SessionsApi.md#getsessions) | **GET** /sessions | Retrieve sessions -*SessionsApi* | [**lockSession**](doc//SessionsApi.md#locksession) | **POST** /sessions/{id}/lock | Lock a session -*SessionsApi* | [**updateSession**](doc//SessionsApi.md#updatesession) | **PUT** /sessions/{id} | Update a session -*SharedLinksApi* | [**addSharedLinkAssets**](doc//SharedLinksApi.md#addsharedlinkassets) | **PUT** /shared-links/{id}/assets | Add assets to a shared link -*SharedLinksApi* | [**createSharedLink**](doc//SharedLinksApi.md#createsharedlink) | **POST** /shared-links | Create a shared link -*SharedLinksApi* | [**getAllSharedLinks**](doc//SharedLinksApi.md#getallsharedlinks) | **GET** /shared-links | Retrieve all shared links -*SharedLinksApi* | [**getMySharedLink**](doc//SharedLinksApi.md#getmysharedlink) | **GET** /shared-links/me | Retrieve current shared link -*SharedLinksApi* | [**getSharedLinkById**](doc//SharedLinksApi.md#getsharedlinkbyid) | **GET** /shared-links/{id} | Retrieve a shared link -*SharedLinksApi* | [**removeSharedLink**](doc//SharedLinksApi.md#removesharedlink) | **DELETE** /shared-links/{id} | Delete a shared link -*SharedLinksApi* | [**removeSharedLinkAssets**](doc//SharedLinksApi.md#removesharedlinkassets) | **DELETE** /shared-links/{id}/assets | Remove assets from a shared link -*SharedLinksApi* | [**sharedLinkLogin**](doc//SharedLinksApi.md#sharedlinklogin) | **POST** /shared-links/login | Shared link login -*SharedLinksApi* | [**updateSharedLink**](doc//SharedLinksApi.md#updatesharedlink) | **PATCH** /shared-links/{id} | Update a shared link -*StacksApi* | [**createStack**](doc//StacksApi.md#createstack) | **POST** /stacks | Create a stack -*StacksApi* | [**deleteStack**](doc//StacksApi.md#deletestack) | **DELETE** /stacks/{id} | Delete a stack -*StacksApi* | [**deleteStacks**](doc//StacksApi.md#deletestacks) | **DELETE** /stacks | Delete stacks -*StacksApi* | [**getStack**](doc//StacksApi.md#getstack) | **GET** /stacks/{id} | Retrieve a stack -*StacksApi* | [**removeAssetFromStack**](doc//StacksApi.md#removeassetfromstack) | **DELETE** /stacks/{id}/assets/{assetId} | Remove an asset from a stack -*StacksApi* | [**searchStacks**](doc//StacksApi.md#searchstacks) | **GET** /stacks | Retrieve stacks -*StacksApi* | [**updateStack**](doc//StacksApi.md#updatestack) | **PUT** /stacks/{id} | Update a stack -*SyncApi* | [**deleteSyncAck**](doc//SyncApi.md#deletesyncack) | **DELETE** /sync/ack | Delete acknowledgements -*SyncApi* | [**getSyncAck**](doc//SyncApi.md#getsyncack) | **GET** /sync/ack | Retrieve acknowledgements -*SyncApi* | [**getSyncStream**](doc//SyncApi.md#getsyncstream) | **POST** /sync/stream | Stream sync changes -*SyncApi* | [**sendSyncAck**](doc//SyncApi.md#sendsyncack) | **POST** /sync/ack | Acknowledge changes -*SystemConfigApi* | [**getConfig**](doc//SystemConfigApi.md#getconfig) | **GET** /system-config | Get system configuration -*SystemConfigApi* | [**getConfigDefaults**](doc//SystemConfigApi.md#getconfigdefaults) | **GET** /system-config/defaults | Get system configuration defaults -*SystemConfigApi* | [**getStorageTemplateOptions**](doc//SystemConfigApi.md#getstoragetemplateoptions) | **GET** /system-config/storage-template-options | Get storage template options -*SystemConfigApi* | [**updateConfig**](doc//SystemConfigApi.md#updateconfig) | **PUT** /system-config | Update system configuration -*SystemMetadataApi* | [**getAdminOnboarding**](doc//SystemMetadataApi.md#getadminonboarding) | **GET** /system-metadata/admin-onboarding | Retrieve admin onboarding -*SystemMetadataApi* | [**getReverseGeocodingState**](doc//SystemMetadataApi.md#getreversegeocodingstate) | **GET** /system-metadata/reverse-geocoding-state | Retrieve reverse geocoding state -*SystemMetadataApi* | [**getVersionCheckState**](doc//SystemMetadataApi.md#getversioncheckstate) | **GET** /system-metadata/version-check-state | Retrieve version check state -*SystemMetadataApi* | [**updateAdminOnboarding**](doc//SystemMetadataApi.md#updateadminonboarding) | **POST** /system-metadata/admin-onboarding | Update admin onboarding -*TagsApi* | [**bulkTagAssets**](doc//TagsApi.md#bulktagassets) | **PUT** /tags/assets | Tag assets -*TagsApi* | [**createTag**](doc//TagsApi.md#createtag) | **POST** /tags | Create a tag -*TagsApi* | [**deleteTag**](doc//TagsApi.md#deletetag) | **DELETE** /tags/{id} | Delete a tag -*TagsApi* | [**getAllTags**](doc//TagsApi.md#getalltags) | **GET** /tags | Retrieve tags -*TagsApi* | [**getTagById**](doc//TagsApi.md#gettagbyid) | **GET** /tags/{id} | Retrieve a tag -*TagsApi* | [**tagAssets**](doc//TagsApi.md#tagassets) | **PUT** /tags/{id}/assets | Tag assets -*TagsApi* | [**untagAssets**](doc//TagsApi.md#untagassets) | **DELETE** /tags/{id}/assets | Untag assets -*TagsApi* | [**updateTag**](doc//TagsApi.md#updatetag) | **PUT** /tags/{id} | Update a tag -*TagsApi* | [**upsertTags**](doc//TagsApi.md#upserttags) | **PUT** /tags | Upsert tags -*TimelineApi* | [**getTimeBucket**](doc//TimelineApi.md#gettimebucket) | **GET** /timeline/bucket | Get time bucket -*TimelineApi* | [**getTimeBuckets**](doc//TimelineApi.md#gettimebuckets) | **GET** /timeline/buckets | Get time buckets -*TrashApi* | [**emptyTrash**](doc//TrashApi.md#emptytrash) | **POST** /trash/empty | Empty trash -*TrashApi* | [**restoreAssets**](doc//TrashApi.md#restoreassets) | **POST** /trash/restore/assets | Restore assets -*TrashApi* | [**restoreTrash**](doc//TrashApi.md#restoretrash) | **POST** /trash/restore | Restore trash -*UsersApi* | [**createProfileImage**](doc//UsersApi.md#createprofileimage) | **POST** /users/profile-image | Create user profile image -*UsersApi* | [**deleteProfileImage**](doc//UsersApi.md#deleteprofileimage) | **DELETE** /users/profile-image | Delete user profile image -*UsersApi* | [**deleteUserLicense**](doc//UsersApi.md#deleteuserlicense) | **DELETE** /users/me/license | Delete user product key -*UsersApi* | [**deleteUserOnboarding**](doc//UsersApi.md#deleteuseronboarding) | **DELETE** /users/me/onboarding | Delete user onboarding -*UsersApi* | [**getMyPreferences**](doc//UsersApi.md#getmypreferences) | **GET** /users/me/preferences | Get my preferences -*UsersApi* | [**getMyUser**](doc//UsersApi.md#getmyuser) | **GET** /users/me | Get current user -*UsersApi* | [**getProfileImage**](doc//UsersApi.md#getprofileimage) | **GET** /users/{id}/profile-image | Retrieve user profile image -*UsersApi* | [**getUser**](doc//UsersApi.md#getuser) | **GET** /users/{id} | Retrieve a user -*UsersApi* | [**getUserLicense**](doc//UsersApi.md#getuserlicense) | **GET** /users/me/license | Retrieve user product key -*UsersApi* | [**getUserOnboarding**](doc//UsersApi.md#getuseronboarding) | **GET** /users/me/onboarding | Retrieve user onboarding -*UsersApi* | [**searchUsers**](doc//UsersApi.md#searchusers) | **GET** /users | Get all users -*UsersApi* | [**setUserLicense**](doc//UsersApi.md#setuserlicense) | **PUT** /users/me/license | Set user product key -*UsersApi* | [**setUserOnboarding**](doc//UsersApi.md#setuseronboarding) | **PUT** /users/me/onboarding | Update user onboarding -*UsersApi* | [**updateMyPreferences**](doc//UsersApi.md#updatemypreferences) | **PUT** /users/me/preferences | Update my preferences -*UsersApi* | [**updateMyUser**](doc//UsersApi.md#updatemyuser) | **PUT** /users/me | Update current user -*UsersAdminApi* | [**createUserAdmin**](doc//UsersAdminApi.md#createuseradmin) | **POST** /admin/users | Create a user -*UsersAdminApi* | [**deleteUserAdmin**](doc//UsersAdminApi.md#deleteuseradmin) | **DELETE** /admin/users/{id} | Delete a user -*UsersAdminApi* | [**getUserAdmin**](doc//UsersAdminApi.md#getuseradmin) | **GET** /admin/users/{id} | Retrieve a user -*UsersAdminApi* | [**getUserPreferencesAdmin**](doc//UsersAdminApi.md#getuserpreferencesadmin) | **GET** /admin/users/{id}/preferences | Retrieve user preferences -*UsersAdminApi* | [**getUserSessionsAdmin**](doc//UsersAdminApi.md#getusersessionsadmin) | **GET** /admin/users/{id}/sessions | Retrieve user sessions -*UsersAdminApi* | [**getUserStatisticsAdmin**](doc//UsersAdminApi.md#getuserstatisticsadmin) | **GET** /admin/users/{id}/statistics | Retrieve user statistics -*UsersAdminApi* | [**restoreUserAdmin**](doc//UsersAdminApi.md#restoreuseradmin) | **POST** /admin/users/{id}/restore | Restore a deleted user -*UsersAdminApi* | [**searchUsersAdmin**](doc//UsersAdminApi.md#searchusersadmin) | **GET** /admin/users | Search users -*UsersAdminApi* | [**updateUserAdmin**](doc//UsersAdminApi.md#updateuseradmin) | **PUT** /admin/users/{id} | Update a user -*UsersAdminApi* | [**updateUserPreferencesAdmin**](doc//UsersAdminApi.md#updateuserpreferencesadmin) | **PUT** /admin/users/{id}/preferences | Update user preferences -*ViewsApi* | [**getAssetsByOriginalPath**](doc//ViewsApi.md#getassetsbyoriginalpath) | **GET** /view/folder | Retrieve assets by original path -*ViewsApi* | [**getUniqueOriginalPaths**](doc//ViewsApi.md#getuniqueoriginalpaths) | **GET** /view/folder/unique-paths | Retrieve unique paths -*WorkflowsApi* | [**createWorkflow**](doc//WorkflowsApi.md#createworkflow) | **POST** /workflows | Create a workflow -*WorkflowsApi* | [**deleteWorkflow**](doc//WorkflowsApi.md#deleteworkflow) | **DELETE** /workflows/{id} | Delete a workflow -*WorkflowsApi* | [**getWorkflow**](doc//WorkflowsApi.md#getworkflow) | **GET** /workflows/{id} | Retrieve a workflow -*WorkflowsApi* | [**getWorkflowForShare**](doc//WorkflowsApi.md#getworkflowforshare) | **GET** /workflows/{id}/share | Retrieve a workflow -*WorkflowsApi* | [**getWorkflowTriggers**](doc//WorkflowsApi.md#getworkflowtriggers) | **GET** /workflows/triggers | List all workflow triggers -*WorkflowsApi* | [**searchWorkflows**](doc//WorkflowsApi.md#searchworkflows) | **GET** /workflows | List all workflows -*WorkflowsApi* | [**updateWorkflow**](doc//WorkflowsApi.md#updateworkflow) | **PUT** /workflows/{id} | Update a workflow - - -## Documentation For Models - - - [ActivityCreateDto](doc//ActivityCreateDto.md) - - [ActivityResponseDto](doc//ActivityResponseDto.md) - - [ActivityStatisticsResponseDto](doc//ActivityStatisticsResponseDto.md) - - [AddUsersDto](doc//AddUsersDto.md) - - [AdminOnboardingUpdateDto](doc//AdminOnboardingUpdateDto.md) - - [AlbumResponseDto](doc//AlbumResponseDto.md) - - [AlbumStatisticsResponseDto](doc//AlbumStatisticsResponseDto.md) - - [AlbumUserAddDto](doc//AlbumUserAddDto.md) - - [AlbumUserCreateDto](doc//AlbumUserCreateDto.md) - - [AlbumUserResponseDto](doc//AlbumUserResponseDto.md) - - [AlbumUserRole](doc//AlbumUserRole.md) - - [AlbumsAddAssetsDto](doc//AlbumsAddAssetsDto.md) - - [AlbumsAddAssetsResponseDto](doc//AlbumsAddAssetsResponseDto.md) - - [AlbumsResponse](doc//AlbumsResponse.md) - - [AlbumsUpdate](doc//AlbumsUpdate.md) - - [ApiKeyCreateDto](doc//ApiKeyCreateDto.md) - - [ApiKeyCreateResponseDto](doc//ApiKeyCreateResponseDto.md) - - [ApiKeyResponseDto](doc//ApiKeyResponseDto.md) - - [ApiKeyUpdateDto](doc//ApiKeyUpdateDto.md) - - [AssetBulkDeleteDto](doc//AssetBulkDeleteDto.md) - - [AssetBulkUpdateDto](doc//AssetBulkUpdateDto.md) - - [AssetBulkUploadCheckDto](doc//AssetBulkUploadCheckDto.md) - - [AssetBulkUploadCheckItem](doc//AssetBulkUploadCheckItem.md) - - [AssetBulkUploadCheckResponseDto](doc//AssetBulkUploadCheckResponseDto.md) - - [AssetBulkUploadCheckResult](doc//AssetBulkUploadCheckResult.md) - - [AssetCopyDto](doc//AssetCopyDto.md) - - [AssetEditAction](doc//AssetEditAction.md) - - [AssetEditActionItemDto](doc//AssetEditActionItemDto.md) - - [AssetEditActionItemDtoParameters](doc//AssetEditActionItemDtoParameters.md) - - [AssetEditActionItemResponseDto](doc//AssetEditActionItemResponseDto.md) - - [AssetEditsCreateDto](doc//AssetEditsCreateDto.md) - - [AssetEditsResponseDto](doc//AssetEditsResponseDto.md) - - [AssetFaceCreateDto](doc//AssetFaceCreateDto.md) - - [AssetFaceDeleteDto](doc//AssetFaceDeleteDto.md) - - [AssetFaceResponseDto](doc//AssetFaceResponseDto.md) - - [AssetFaceUpdateDto](doc//AssetFaceUpdateDto.md) - - [AssetFaceUpdateItem](doc//AssetFaceUpdateItem.md) - - [AssetIdErrorReason](doc//AssetIdErrorReason.md) - - [AssetIdsDto](doc//AssetIdsDto.md) - - [AssetIdsResponseDto](doc//AssetIdsResponseDto.md) - - [AssetJobName](doc//AssetJobName.md) - - [AssetJobsDto](doc//AssetJobsDto.md) - - [AssetMediaResponseDto](doc//AssetMediaResponseDto.md) - - [AssetMediaSize](doc//AssetMediaSize.md) - - [AssetMediaStatus](doc//AssetMediaStatus.md) - - [AssetMetadataBulkDeleteDto](doc//AssetMetadataBulkDeleteDto.md) - - [AssetMetadataBulkDeleteItemDto](doc//AssetMetadataBulkDeleteItemDto.md) - - [AssetMetadataBulkResponseDto](doc//AssetMetadataBulkResponseDto.md) - - [AssetMetadataBulkUpsertDto](doc//AssetMetadataBulkUpsertDto.md) - - [AssetMetadataBulkUpsertItemDto](doc//AssetMetadataBulkUpsertItemDto.md) - - [AssetMetadataResponseDto](doc//AssetMetadataResponseDto.md) - - [AssetMetadataUpsertDto](doc//AssetMetadataUpsertDto.md) - - [AssetMetadataUpsertItemDto](doc//AssetMetadataUpsertItemDto.md) - - [AssetOcrResponseDto](doc//AssetOcrResponseDto.md) - - [AssetOrder](doc//AssetOrder.md) - - [AssetOrderBy](doc//AssetOrderBy.md) - - [AssetRejectReason](doc//AssetRejectReason.md) - - [AssetResponseDto](doc//AssetResponseDto.md) - - [AssetStackResponseDto](doc//AssetStackResponseDto.md) - - [AssetStatsResponseDto](doc//AssetStatsResponseDto.md) - - [AssetTypeEnum](doc//AssetTypeEnum.md) - - [AssetUploadAction](doc//AssetUploadAction.md) - - [AssetVisibility](doc//AssetVisibility.md) - - [AudioCodec](doc//AudioCodec.md) - - [AuthStatusResponseDto](doc//AuthStatusResponseDto.md) - - [AvatarUpdate](doc//AvatarUpdate.md) - - [BulkIdErrorReason](doc//BulkIdErrorReason.md) - - [BulkIdResponseDto](doc//BulkIdResponseDto.md) - - [BulkIdsDto](doc//BulkIdsDto.md) - - [CLIPConfig](doc//CLIPConfig.md) - - [CQMode](doc//CQMode.md) - - [CastResponse](doc//CastResponse.md) - - [CastUpdate](doc//CastUpdate.md) - - [ChangePasswordDto](doc//ChangePasswordDto.md) - - [Colorspace](doc//Colorspace.md) - - [ContributorCountResponseDto](doc//ContributorCountResponseDto.md) - - [CreateAlbumDto](doc//CreateAlbumDto.md) - - [CreateLibraryDto](doc//CreateLibraryDto.md) - - [CreateProfileImageResponseDto](doc//CreateProfileImageResponseDto.md) - - [CropParameters](doc//CropParameters.md) - - [DatabaseBackupConfig](doc//DatabaseBackupConfig.md) - - [DatabaseBackupDeleteDto](doc//DatabaseBackupDeleteDto.md) - - [DatabaseBackupDto](doc//DatabaseBackupDto.md) - - [DatabaseBackupListResponseDto](doc//DatabaseBackupListResponseDto.md) - - [DownloadArchiveDto](doc//DownloadArchiveDto.md) - - [DownloadArchiveInfo](doc//DownloadArchiveInfo.md) - - [DownloadInfoDto](doc//DownloadInfoDto.md) - - [DownloadResponse](doc//DownloadResponse.md) - - [DownloadResponseDto](doc//DownloadResponseDto.md) - - [DownloadUpdate](doc//DownloadUpdate.md) - - [DuplicateDetectionConfig](doc//DuplicateDetectionConfig.md) - - [DuplicateResolveDto](doc//DuplicateResolveDto.md) - - [DuplicateResolveGroupDto](doc//DuplicateResolveGroupDto.md) - - [DuplicateResponseDto](doc//DuplicateResponseDto.md) - - [EmailNotificationsResponse](doc//EmailNotificationsResponse.md) - - [EmailNotificationsUpdate](doc//EmailNotificationsUpdate.md) - - [ExifResponseDto](doc//ExifResponseDto.md) - - [FaceDto](doc//FaceDto.md) - - [FacialRecognitionConfig](doc//FacialRecognitionConfig.md) - - [FoldersResponse](doc//FoldersResponse.md) - - [FoldersUpdate](doc//FoldersUpdate.md) - - [ImageFormat](doc//ImageFormat.md) - - [JobCreateDto](doc//JobCreateDto.md) - - [JobName](doc//JobName.md) - - [JobSettingsDto](doc//JobSettingsDto.md) - - [LibraryResponseDto](doc//LibraryResponseDto.md) - - [LibraryStatsResponseDto](doc//LibraryStatsResponseDto.md) - - [LicenseKeyDto](doc//LicenseKeyDto.md) - - [LogLevel](doc//LogLevel.md) - - [LoginCredentialDto](doc//LoginCredentialDto.md) - - [LoginResponseDto](doc//LoginResponseDto.md) - - [LogoutResponseDto](doc//LogoutResponseDto.md) - - [MachineLearningAvailabilityChecksDto](doc//MachineLearningAvailabilityChecksDto.md) - - [MaintenanceAction](doc//MaintenanceAction.md) - - [MaintenanceAuthDto](doc//MaintenanceAuthDto.md) - - [MaintenanceDetectInstallResponseDto](doc//MaintenanceDetectInstallResponseDto.md) - - [MaintenanceDetectInstallStorageFolderDto](doc//MaintenanceDetectInstallStorageFolderDto.md) - - [MaintenanceLoginDto](doc//MaintenanceLoginDto.md) - - [MaintenanceStatusResponseDto](doc//MaintenanceStatusResponseDto.md) - - [ManualJobName](doc//ManualJobName.md) - - [MapMarkerResponseDto](doc//MapMarkerResponseDto.md) - - [MapReverseGeocodeResponseDto](doc//MapReverseGeocodeResponseDto.md) - - [MemoriesResponse](doc//MemoriesResponse.md) - - [MemoriesUpdate](doc//MemoriesUpdate.md) - - [MemoryCreateDto](doc//MemoryCreateDto.md) - - [MemoryResponseDto](doc//MemoryResponseDto.md) - - [MemorySearchOrder](doc//MemorySearchOrder.md) - - [MemoryStatisticsResponseDto](doc//MemoryStatisticsResponseDto.md) - - [MemoryType](doc//MemoryType.md) - - [MemoryUpdateDto](doc//MemoryUpdateDto.md) - - [MergePersonDto](doc//MergePersonDto.md) - - [MetadataSearchDto](doc//MetadataSearchDto.md) - - [MirrorAxis](doc//MirrorAxis.md) - - [MirrorParameters](doc//MirrorParameters.md) - - [NotificationCreateDto](doc//NotificationCreateDto.md) - - [NotificationDeleteAllDto](doc//NotificationDeleteAllDto.md) - - [NotificationDto](doc//NotificationDto.md) - - [NotificationLevel](doc//NotificationLevel.md) - - [NotificationType](doc//NotificationType.md) - - [NotificationUpdateAllDto](doc//NotificationUpdateAllDto.md) - - [NotificationUpdateDto](doc//NotificationUpdateDto.md) - - [OAuthAuthorizeResponseDto](doc//OAuthAuthorizeResponseDto.md) - - [OAuthCallbackDto](doc//OAuthCallbackDto.md) - - [OAuthConfigDto](doc//OAuthConfigDto.md) - - [OAuthTokenEndpointAuthMethod](doc//OAuthTokenEndpointAuthMethod.md) - - [OcrConfig](doc//OcrConfig.md) - - [OnThisDayDto](doc//OnThisDayDto.md) - - [OnboardingDto](doc//OnboardingDto.md) - - [OnboardingResponseDto](doc//OnboardingResponseDto.md) - - [PartnerCreateDto](doc//PartnerCreateDto.md) - - [PartnerDirection](doc//PartnerDirection.md) - - [PartnerResponseDto](doc//PartnerResponseDto.md) - - [PartnerUpdateDto](doc//PartnerUpdateDto.md) - - [PeopleResponse](doc//PeopleResponse.md) - - [PeopleResponseDto](doc//PeopleResponseDto.md) - - [PeopleUpdate](doc//PeopleUpdate.md) - - [PeopleUpdateDto](doc//PeopleUpdateDto.md) - - [PeopleUpdateItem](doc//PeopleUpdateItem.md) - - [Permission](doc//Permission.md) - - [PersonCreateDto](doc//PersonCreateDto.md) - - [PersonResponseDto](doc//PersonResponseDto.md) - - [PersonStatisticsResponseDto](doc//PersonStatisticsResponseDto.md) - - [PersonUpdateDto](doc//PersonUpdateDto.md) - - [PinCodeChangeDto](doc//PinCodeChangeDto.md) - - [PinCodeResetDto](doc//PinCodeResetDto.md) - - [PinCodeSetupDto](doc//PinCodeSetupDto.md) - - [PlacesResponseDto](doc//PlacesResponseDto.md) - - [PluginMethodResponseDto](doc//PluginMethodResponseDto.md) - - [PluginResponseDto](doc//PluginResponseDto.md) - - [PluginTemplateResponseDto](doc//PluginTemplateResponseDto.md) - - [PluginTemplateStepResponseDto](doc//PluginTemplateStepResponseDto.md) - - [PurchaseResponse](doc//PurchaseResponse.md) - - [PurchaseUpdate](doc//PurchaseUpdate.md) - - [QueueCommand](doc//QueueCommand.md) - - [QueueCommandDto](doc//QueueCommandDto.md) - - [QueueDeleteDto](doc//QueueDeleteDto.md) - - [QueueJobResponseDto](doc//QueueJobResponseDto.md) - - [QueueJobStatus](doc//QueueJobStatus.md) - - [QueueName](doc//QueueName.md) - - [QueueResponseDto](doc//QueueResponseDto.md) - - [QueueResponseLegacyDto](doc//QueueResponseLegacyDto.md) - - [QueueStatisticsDto](doc//QueueStatisticsDto.md) - - [QueueStatusLegacyDto](doc//QueueStatusLegacyDto.md) - - [QueueUpdateDto](doc//QueueUpdateDto.md) - - [QueuesResponseLegacyDto](doc//QueuesResponseLegacyDto.md) - - [RandomSearchDto](doc//RandomSearchDto.md) - - [RatingsResponse](doc//RatingsResponse.md) - - [RatingsUpdate](doc//RatingsUpdate.md) - - [ReactionLevel](doc//ReactionLevel.md) - - [ReactionType](doc//ReactionType.md) - - [ReverseGeocodingStateResponseDto](doc//ReverseGeocodingStateResponseDto.md) - - [RotateParameters](doc//RotateParameters.md) - - [SearchAlbumResponseDto](doc//SearchAlbumResponseDto.md) - - [SearchAssetResponseDto](doc//SearchAssetResponseDto.md) - - [SearchExploreItem](doc//SearchExploreItem.md) - - [SearchExploreResponseDto](doc//SearchExploreResponseDto.md) - - [SearchFacetCountResponseDto](doc//SearchFacetCountResponseDto.md) - - [SearchFacetResponseDto](doc//SearchFacetResponseDto.md) - - [SearchResponseDto](doc//SearchResponseDto.md) - - [SearchStatisticsResponseDto](doc//SearchStatisticsResponseDto.md) - - [SearchSuggestionType](doc//SearchSuggestionType.md) - - [ServerAboutResponseDto](doc//ServerAboutResponseDto.md) - - [ServerApkLinksDto](doc//ServerApkLinksDto.md) - - [ServerConfigDto](doc//ServerConfigDto.md) - - [ServerFeaturesDto](doc//ServerFeaturesDto.md) - - [ServerMediaTypesResponseDto](doc//ServerMediaTypesResponseDto.md) - - [ServerPingResponse](doc//ServerPingResponse.md) - - [ServerStatsResponseDto](doc//ServerStatsResponseDto.md) - - [ServerStorageResponseDto](doc//ServerStorageResponseDto.md) - - [ServerVersionHistoryResponseDto](doc//ServerVersionHistoryResponseDto.md) - - [ServerVersionResponseDto](doc//ServerVersionResponseDto.md) - - [SessionCreateDto](doc//SessionCreateDto.md) - - [SessionCreateResponseDto](doc//SessionCreateResponseDto.md) - - [SessionResponseDto](doc//SessionResponseDto.md) - - [SessionUnlockDto](doc//SessionUnlockDto.md) - - [SessionUpdateDto](doc//SessionUpdateDto.md) - - [SetMaintenanceModeDto](doc//SetMaintenanceModeDto.md) - - [SharedLinkCreateDto](doc//SharedLinkCreateDto.md) - - [SharedLinkEditDto](doc//SharedLinkEditDto.md) - - [SharedLinkLoginDto](doc//SharedLinkLoginDto.md) - - [SharedLinkResponseDto](doc//SharedLinkResponseDto.md) - - [SharedLinkType](doc//SharedLinkType.md) - - [SharedLinksResponse](doc//SharedLinksResponse.md) - - [SharedLinksUpdate](doc//SharedLinksUpdate.md) - - [SignUpDto](doc//SignUpDto.md) - - [SmartSearchDto](doc//SmartSearchDto.md) - - [SourceType](doc//SourceType.md) - - [StackCreateDto](doc//StackCreateDto.md) - - [StackResponseDto](doc//StackResponseDto.md) - - [StackUpdateDto](doc//StackUpdateDto.md) - - [StatisticsSearchDto](doc//StatisticsSearchDto.md) - - [StorageFolder](doc//StorageFolder.md) - - [SyncAckDeleteDto](doc//SyncAckDeleteDto.md) - - [SyncAckDto](doc//SyncAckDto.md) - - [SyncAckSetDto](doc//SyncAckSetDto.md) - - [SyncAlbumDeleteV1](doc//SyncAlbumDeleteV1.md) - - [SyncAlbumToAssetDeleteV1](doc//SyncAlbumToAssetDeleteV1.md) - - [SyncAlbumToAssetV1](doc//SyncAlbumToAssetV1.md) - - [SyncAlbumUserDeleteV1](doc//SyncAlbumUserDeleteV1.md) - - [SyncAlbumUserV1](doc//SyncAlbumUserV1.md) - - [SyncAlbumV1](doc//SyncAlbumV1.md) - - [SyncAlbumV2](doc//SyncAlbumV2.md) - - [SyncAssetDeleteV1](doc//SyncAssetDeleteV1.md) - - [SyncAssetEditDeleteV1](doc//SyncAssetEditDeleteV1.md) - - [SyncAssetEditV1](doc//SyncAssetEditV1.md) - - [SyncAssetExifV1](doc//SyncAssetExifV1.md) - - [SyncAssetFaceDeleteV1](doc//SyncAssetFaceDeleteV1.md) - - [SyncAssetFaceV1](doc//SyncAssetFaceV1.md) - - [SyncAssetFaceV2](doc//SyncAssetFaceV2.md) - - [SyncAssetMetadataDeleteV1](doc//SyncAssetMetadataDeleteV1.md) - - [SyncAssetMetadataV1](doc//SyncAssetMetadataV1.md) - - [SyncAssetV1](doc//SyncAssetV1.md) - - [SyncAssetV2](doc//SyncAssetV2.md) - - [SyncAuthUserV1](doc//SyncAuthUserV1.md) - - [SyncEntityType](doc//SyncEntityType.md) - - [SyncMemoryAssetDeleteV1](doc//SyncMemoryAssetDeleteV1.md) - - [SyncMemoryAssetV1](doc//SyncMemoryAssetV1.md) - - [SyncMemoryDeleteV1](doc//SyncMemoryDeleteV1.md) - - [SyncMemoryV1](doc//SyncMemoryV1.md) - - [SyncPartnerDeleteV1](doc//SyncPartnerDeleteV1.md) - - [SyncPartnerV1](doc//SyncPartnerV1.md) - - [SyncPersonDeleteV1](doc//SyncPersonDeleteV1.md) - - [SyncPersonV1](doc//SyncPersonV1.md) - - [SyncRequestType](doc//SyncRequestType.md) - - [SyncStackDeleteV1](doc//SyncStackDeleteV1.md) - - [SyncStackV1](doc//SyncStackV1.md) - - [SyncStreamDto](doc//SyncStreamDto.md) - - [SyncUserDeleteV1](doc//SyncUserDeleteV1.md) - - [SyncUserMetadataDeleteV1](doc//SyncUserMetadataDeleteV1.md) - - [SyncUserMetadataV1](doc//SyncUserMetadataV1.md) - - [SyncUserV1](doc//SyncUserV1.md) - - [SystemConfigBackupsDto](doc//SystemConfigBackupsDto.md) - - [SystemConfigDto](doc//SystemConfigDto.md) - - [SystemConfigFFmpegDto](doc//SystemConfigFFmpegDto.md) - - [SystemConfigFacesDto](doc//SystemConfigFacesDto.md) - - [SystemConfigGeneratedFullsizeImageDto](doc//SystemConfigGeneratedFullsizeImageDto.md) - - [SystemConfigGeneratedImageDto](doc//SystemConfigGeneratedImageDto.md) - - [SystemConfigImageDto](doc//SystemConfigImageDto.md) - - [SystemConfigJobDto](doc//SystemConfigJobDto.md) - - [SystemConfigLibraryDto](doc//SystemConfigLibraryDto.md) - - [SystemConfigLibraryScanDto](doc//SystemConfigLibraryScanDto.md) - - [SystemConfigLibraryWatchDto](doc//SystemConfigLibraryWatchDto.md) - - [SystemConfigLoggingDto](doc//SystemConfigLoggingDto.md) - - [SystemConfigMachineLearningDto](doc//SystemConfigMachineLearningDto.md) - - [SystemConfigMapDto](doc//SystemConfigMapDto.md) - - [SystemConfigMetadataDto](doc//SystemConfigMetadataDto.md) - - [SystemConfigNewVersionCheckDto](doc//SystemConfigNewVersionCheckDto.md) - - [SystemConfigNightlyTasksDto](doc//SystemConfigNightlyTasksDto.md) - - [SystemConfigNotificationsDto](doc//SystemConfigNotificationsDto.md) - - [SystemConfigOAuthDto](doc//SystemConfigOAuthDto.md) - - [SystemConfigPasswordLoginDto](doc//SystemConfigPasswordLoginDto.md) - - [SystemConfigReverseGeocodingDto](doc//SystemConfigReverseGeocodingDto.md) - - [SystemConfigServerDto](doc//SystemConfigServerDto.md) - - [SystemConfigSmtpDto](doc//SystemConfigSmtpDto.md) - - [SystemConfigSmtpTransportDto](doc//SystemConfigSmtpTransportDto.md) - - [SystemConfigStorageTemplateDto](doc//SystemConfigStorageTemplateDto.md) - - [SystemConfigTemplateEmailsDto](doc//SystemConfigTemplateEmailsDto.md) - - [SystemConfigTemplateStorageOptionDto](doc//SystemConfigTemplateStorageOptionDto.md) - - [SystemConfigTemplatesDto](doc//SystemConfigTemplatesDto.md) - - [SystemConfigThemeDto](doc//SystemConfigThemeDto.md) - - [SystemConfigTrashDto](doc//SystemConfigTrashDto.md) - - [SystemConfigUserDto](doc//SystemConfigUserDto.md) - - [TagBulkAssetsDto](doc//TagBulkAssetsDto.md) - - [TagBulkAssetsResponseDto](doc//TagBulkAssetsResponseDto.md) - - [TagCreateDto](doc//TagCreateDto.md) - - [TagResponseDto](doc//TagResponseDto.md) - - [TagUpdateDto](doc//TagUpdateDto.md) - - [TagUpsertDto](doc//TagUpsertDto.md) - - [TagsResponse](doc//TagsResponse.md) - - [TagsUpdate](doc//TagsUpdate.md) - - [TemplateDto](doc//TemplateDto.md) - - [TemplateResponseDto](doc//TemplateResponseDto.md) - - [TestEmailResponseDto](doc//TestEmailResponseDto.md) - - [TimeBucketAssetResponseDto](doc//TimeBucketAssetResponseDto.md) - - [TimeBucketsResponseDto](doc//TimeBucketsResponseDto.md) - - [ToneMapping](doc//ToneMapping.md) - - [TranscodeHWAccel](doc//TranscodeHWAccel.md) - - [TranscodePolicy](doc//TranscodePolicy.md) - - [TrashResponseDto](doc//TrashResponseDto.md) - - [UpdateAlbumDto](doc//UpdateAlbumDto.md) - - [UpdateAlbumUserDto](doc//UpdateAlbumUserDto.md) - - [UpdateAssetDto](doc//UpdateAssetDto.md) - - [UpdateLibraryDto](doc//UpdateLibraryDto.md) - - [UsageByUserDto](doc//UsageByUserDto.md) - - [UserAdminCreateDto](doc//UserAdminCreateDto.md) - - [UserAdminDeleteDto](doc//UserAdminDeleteDto.md) - - [UserAdminResponseDto](doc//UserAdminResponseDto.md) - - [UserAdminUpdateDto](doc//UserAdminUpdateDto.md) - - [UserAvatarColor](doc//UserAvatarColor.md) - - [UserLicense](doc//UserLicense.md) - - [UserMetadataKey](doc//UserMetadataKey.md) - - [UserPreferencesResponseDto](doc//UserPreferencesResponseDto.md) - - [UserPreferencesUpdateDto](doc//UserPreferencesUpdateDto.md) - - [UserResponseDto](doc//UserResponseDto.md) - - [UserStatus](doc//UserStatus.md) - - [UserUpdateMeDto](doc//UserUpdateMeDto.md) - - [ValidateAccessTokenResponseDto](doc//ValidateAccessTokenResponseDto.md) - - [ValidateLibraryDto](doc//ValidateLibraryDto.md) - - [ValidateLibraryImportPathResponseDto](doc//ValidateLibraryImportPathResponseDto.md) - - [ValidateLibraryResponseDto](doc//ValidateLibraryResponseDto.md) - - [VersionCheckStateResponseDto](doc//VersionCheckStateResponseDto.md) - - [VideoCodec](doc//VideoCodec.md) - - [VideoContainer](doc//VideoContainer.md) - - [WorkflowCreateDto](doc//WorkflowCreateDto.md) - - [WorkflowResponseDto](doc//WorkflowResponseDto.md) - - [WorkflowShareResponseDto](doc//WorkflowShareResponseDto.md) - - [WorkflowShareStepDto](doc//WorkflowShareStepDto.md) - - [WorkflowStepDto](doc//WorkflowStepDto.md) - - [WorkflowTrigger](doc//WorkflowTrigger.md) - - [WorkflowTriggerResponseDto](doc//WorkflowTriggerResponseDto.md) - - [WorkflowType](doc//WorkflowType.md) - - [WorkflowUpdateDto](doc//WorkflowUpdateDto.md) - - -## Documentation For Authorization - - -Authentication schemes defined for the API: -### bearer - -- **Type**: HTTP Bearer authentication - -### cookie - -- **Type**: API key -- **API key parameter name**: immich_access_token -- **Location**: - -### api_key - -- **Type**: API key -- **API key parameter name**: x-api-key -- **Location**: HTTP header - - -## Author - - - diff --git a/mobile/openapi/git_push.sh b/mobile/openapi/git_push.sh deleted file mode 100644 index f53a75d4fa..0000000000 --- a/mobile/openapi/git_push.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/sh -# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ -# -# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com" - -git_user_id=$1 -git_repo_id=$2 -release_note=$3 -git_host=$4 - -if [ "$git_host" = "" ]; then - git_host="github.com" - echo "[INFO] No command line input provided. Set \$git_host to $git_host" -fi - -if [ "$git_user_id" = "" ]; then - git_user_id="GIT_USER_ID" - echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" -fi - -if [ "$git_repo_id" = "" ]; then - git_repo_id="GIT_REPO_ID" - echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" -fi - -if [ "$release_note" = "" ]; then - release_note="Minor update" - echo "[INFO] No command line input provided. Set \$release_note to $release_note" -fi - -# Initialize the local directory as a Git repository -git init - -# Adds the files in the local repository and stages them for commit. -git add . - -# Commits the tracked changes and prepares them to be pushed to a remote repository. -git commit -m "$release_note" - -# Sets the new remote -git_remote=$(git remote) -if [ "$git_remote" = "" ]; then # git remote not defined - - if [ "$GIT_TOKEN" = "" ]; then - echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." - git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git - else - git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git - fi - -fi - -git pull origin master - -# Pushes (Forces) the changes in the local repository up to the remote repository -echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git" -git push origin master 2>&1 | grep -v 'To https' diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index d5a6f483dc..1fd392e5df 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -1,8 +1,5 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - // ignore_for_file: unused_element, unused_import // ignore_for_file: always_put_required_named_parameters_first // ignore_for_file: constant_identifier_names @@ -13,61 +10,23 @@ library openapi.api; import 'dart:async'; import 'dart:convert'; import 'dart:io'; - +import 'dart:typed_data'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; -import 'package:immich_mobile/utils/openapi_patching.dart'; import 'package:http/http.dart'; -import 'package:intl/intl.dart'; import 'package:meta/meta.dart'; part 'api_client.dart'; -part 'api_helper.dart'; +part 'api_compat.dart'; part 'api_exception.dart'; -part 'auth/authentication.dart'; +part 'api_helper.dart'; +part 'api_state.dart'; +part 'api_version.dart'; +part 'optional.dart'; part 'auth/api_key_auth.dart'; -part 'auth/oauth.dart'; -part 'auth/http_basic_auth.dart'; +part 'auth/authentication.dart'; part 'auth/http_bearer_auth.dart'; - -part 'api/api_keys_api.dart'; -part 'api/activities_api.dart'; -part 'api/albums_api.dart'; -part 'api/assets_api.dart'; -part 'api/authentication_api.dart'; -part 'api/authentication_admin_api.dart'; -part 'api/database_backups_admin_api.dart'; -part 'api/deprecated_api.dart'; -part 'api/download_api.dart'; -part 'api/duplicates_api.dart'; -part 'api/faces_api.dart'; -part 'api/jobs_api.dart'; -part 'api/libraries_api.dart'; -part 'api/maintenance_admin_api.dart'; -part 'api/map_api.dart'; -part 'api/memories_api.dart'; -part 'api/notifications_api.dart'; -part 'api/notifications_admin_api.dart'; -part 'api/partners_api.dart'; -part 'api/people_api.dart'; -part 'api/plugins_api.dart'; -part 'api/queues_api.dart'; -part 'api/search_api.dart'; -part 'api/server_api.dart'; -part 'api/sessions_api.dart'; -part 'api/shared_links_api.dart'; -part 'api/stacks_api.dart'; -part 'api/sync_api.dart'; -part 'api/system_config_api.dart'; -part 'api/system_metadata_api.dart'; -part 'api/tags_api.dart'; -part 'api/timeline_api.dart'; -part 'api/trash_api.dart'; -part 'api/users_api.dart'; -part 'api/users_admin_api.dart'; -part 'api/views_api.dart'; -part 'api/workflows_api.dart'; - +part 'auth/oauth.dart'; part 'model/activity_create_dto.dart'; part 'model/activity_response_dto.dart'; part 'model/activity_statistics_response_dto.dart'; @@ -96,7 +55,6 @@ part 'model/asset_bulk_upload_check_result.dart'; part 'model/asset_copy_dto.dart'; part 'model/asset_edit_action.dart'; part 'model/asset_edit_action_item_dto.dart'; -part 'model/asset_edit_action_item_dto_parameters.dart'; part 'model/asset_edit_action_item_response_dto.dart'; part 'model/asset_edits_create_dto.dart'; part 'model/asset_edits_response_dto.dart'; @@ -110,6 +68,7 @@ part 'model/asset_ids_dto.dart'; part 'model/asset_ids_response_dto.dart'; part 'model/asset_job_name.dart'; part 'model/asset_jobs_dto.dart'; +part 'model/asset_media_create_dto.dart'; part 'model/asset_media_response_dto.dart'; part 'model/asset_media_size.dart'; part 'model/asset_media_status.dart'; @@ -137,21 +96,23 @@ part 'model/avatar_update.dart'; part 'model/bulk_id_error_reason.dart'; part 'model/bulk_id_response_dto.dart'; part 'model/bulk_ids_dto.dart'; -part 'model/clip_config.dart'; -part 'model/cq_mode.dart'; part 'model/cast_response.dart'; part 'model/cast_update.dart'; part 'model/change_password_dto.dart'; +part 'model/clip_config.dart'; part 'model/colorspace.dart'; part 'model/contributor_count_response_dto.dart'; +part 'model/cq_mode.dart'; part 'model/create_album_dto.dart'; part 'model/create_library_dto.dart'; +part 'model/create_profile_image_dto.dart'; part 'model/create_profile_image_response_dto.dart'; part 'model/crop_parameters.dart'; part 'model/database_backup_config.dart'; part 'model/database_backup_delete_dto.dart'; part 'model/database_backup_dto.dart'; part 'model/database_backup_list_response_dto.dart'; +part 'model/database_backup_upload_dto.dart'; part 'model/download_archive_dto.dart'; part 'model/download_archive_info.dart'; part 'model/download_info_dto.dart'; @@ -176,6 +137,7 @@ part 'model/job_settings_dto.dart'; part 'model/library_response_dto.dart'; part 'model/library_stats_response_dto.dart'; part 'model/license_key_dto.dart'; +part 'model/license_response_dto.dart'; part 'model/log_level.dart'; part 'model/login_credential_dto.dart'; part 'model/login_response_dto.dart'; @@ -210,6 +172,7 @@ part 'model/notification_type.dart'; part 'model/notification_update_all_dto.dart'; part 'model/notification_update_dto.dart'; part 'model/o_auth_authorize_response_dto.dart'; +part 'model/o_auth_backchannel_logout_dto.dart'; part 'model/o_auth_callback_dto.dart'; part 'model/o_auth_config_dto.dart'; part 'model/o_auth_token_endpoint_auth_method.dart'; @@ -303,6 +266,7 @@ part 'model/storage_folder.dart'; part 'model/sync_ack_delete_dto.dart'; part 'model/sync_ack_dto.dart'; part 'model/sync_ack_set_dto.dart'; +part 'model/sync_ack_v1.dart'; part 'model/sync_album_delete_v1.dart'; part 'model/sync_album_to_asset_delete_v1.dart'; part 'model/sync_album_to_asset_v1.dart'; @@ -322,6 +286,7 @@ part 'model/sync_asset_metadata_v1.dart'; part 'model/sync_asset_v1.dart'; part 'model/sync_asset_v2.dart'; part 'model/sync_auth_user_v1.dart'; +part 'model/sync_complete_v1.dart'; part 'model/sync_entity_type.dart'; part 'model/sync_memory_asset_delete_v1.dart'; part 'model/sync_memory_asset_v1.dart'; @@ -332,6 +297,7 @@ part 'model/sync_partner_v1.dart'; part 'model/sync_person_delete_v1.dart'; part 'model/sync_person_v1.dart'; part 'model/sync_request_type.dart'; +part 'model/sync_reset_v1.dart'; part 'model/sync_stack_delete_v1.dart'; part 'model/sync_stack_v1.dart'; part 'model/sync_stream_dto.dart'; @@ -420,18 +386,43 @@ part 'model/workflow_trigger.dart'; part 'model/workflow_trigger_response_dto.dart'; part 'model/workflow_type.dart'; part 'model/workflow_update_dto.dart'; +part 'api/activities_api.dart'; +part 'api/albums_api.dart'; +part 'api/api_keys_api.dart'; +part 'api/assets_api.dart'; +part 'api/authentication_admin_api.dart'; +part 'api/authentication_api.dart'; +part 'api/database_backups_admin_api.dart'; +part 'api/download_api.dart'; +part 'api/duplicates_api.dart'; +part 'api/faces_api.dart'; +part 'api/jobs_api.dart'; +part 'api/libraries_api.dart'; +part 'api/maintenance_admin_api.dart'; +part 'api/map_api.dart'; +part 'api/memories_api.dart'; +part 'api/notifications_admin_api.dart'; +part 'api/notifications_api.dart'; +part 'api/partners_api.dart'; +part 'api/people_api.dart'; +part 'api/plugins_api.dart'; +part 'api/queues_api.dart'; +part 'api/search_api.dart'; +part 'api/server_api.dart'; +part 'api/sessions_api.dart'; +part 'api/shared_links_api.dart'; +part 'api/stacks_api.dart'; +part 'api/sync_api.dart'; +part 'api/system_config_api.dart'; +part 'api/system_metadata_api.dart'; +part 'api/tags_api.dart'; +part 'api/timeline_api.dart'; +part 'api/trash_api.dart'; +part 'api/users_admin_api.dart'; +part 'api/users_api.dart'; +part 'api/views_api.dart'; +part 'api/workflows_api.dart'; - -/// An [ApiClient] instance that uses the default values obtained from -/// the OpenAPI specification file. -var defaultApiClient = ApiClient(); - -const _delimiters = {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; -const _dateEpochMarker = 'epoch'; -const _deepEquality = DeepCollectionEquality(); -final _dateFormatter = DateFormat('yyyy-MM-dd'); -final _regList = RegExp(r'^List<(.*)>$'); -final _regSet = RegExp(r'^Set<(.*)>$'); -final _regMap = RegExp(r'^Map$'); - -bool _isEpochMarker(String? pattern) => pattern == _dateEpochMarker || pattern == '/$_dateEpochMarker/'; +/// The process-wide default [ApiClient]; every `XxxApi()` uses it when +/// constructed without an explicit client. +final defaultApiClient = ApiClient(); diff --git a/mobile/openapi/lib/api/activities_api.dart b/mobile/openapi/lib/api/activities_api.dart index e0a393948c..c3056ac7db 100644 --- a/mobile/openapi/lib/api/activities_api.dart +++ b/mobile/openapi/lib/api/activities_api.dart @@ -1,158 +1,52 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class ActivitiesApi { ActivitiesApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Create an activity - /// - /// Create a like or a comment for an album, or an asset in an album. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [ActivityCreateDto] activityCreateDto (required): - Future createActivityWithHttpInfo(ActivityCreateDto activityCreateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/activities'; + static const ApiVersion getActivitiesAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody = activityCreateDto; + static const ApiState getActivitiesState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion createActivityAddedIn = .new(1, 0, 0); - const contentTypes = ['application/json']; + static const ApiState createActivityState = .stable; + static const ApiVersion getActivityStatisticsAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState getActivityStatisticsState = .stable; - /// Create an activity - /// - /// Create a like or a comment for an album, or an asset in an album. - /// - /// Parameters: - /// - /// * [ActivityCreateDto] activityCreateDto (required): - Future createActivity(ActivityCreateDto activityCreateDto,) async { - final response = await createActivityWithHttpInfo(activityCreateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ActivityResponseDto',) as ActivityResponseDto; - - } - return null; - } + static const ApiVersion deleteActivityAddedIn = .new(1, 0, 0); - /// Delete an activity - /// - /// Removes a like or comment from a given album or asset in an album. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteActivityWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/activities/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Delete an activity - /// - /// Removes a like or comment from a given album or asset in an album. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteActivity(String id,) async { - final response = await deleteActivityWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiState deleteActivityState = .stable; /// List all activities /// /// Returns a list of activities for the selected asset or album. The activities are returned in sorted order, with the oldest activities appearing first. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] albumId (required): - /// Album ID - /// - /// * [String] assetId: - /// Asset ID (if activity is for an asset) - /// - /// * [ReactionLevel] level: - /// - /// * [ReactionType] type: - /// - /// * [String] userId: - /// Filter by user ID - Future getActivitiesWithHttpInfo(String albumId, { String? assetId, ReactionLevel? level, ReactionType? type, String? userId, }) async { - // ignore: prefer_const_declarations + Future getActivitiesWithHttpInfo({ + required String albumId, + String? assetId, + ReactionLevel? level, + ReactionType? type, + String? userId, + Future? abortTrigger, + }) async { final apiPath = r'/activities'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - queryParams.addAll(_queryParams('', 'albumId', albumId)); + queryParams.addAll(_queryParams('', 'albumId', albumId)); if (assetId != null) { queryParams.addAll(_queryParams('', 'assetId', assetId)); } @@ -168,15 +62,15 @@ class ActivitiesApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -184,78 +78,118 @@ class ActivitiesApi { /// /// Returns a list of activities for the selected asset or album. The activities are returned in sorted order, with the oldest activities appearing first. /// - /// Parameters: - /// - /// * [String] albumId (required): - /// Album ID - /// - /// * [String] assetId: - /// Asset ID (if activity is for an asset) - /// - /// * [ReactionLevel] level: - /// - /// * [ReactionType] type: - /// - /// * [String] userId: - /// Filter by user ID - Future?> getActivities(String albumId, { String? assetId, ReactionLevel? level, ReactionType? type, String? userId, }) async { - final response = await getActivitiesWithHttpInfo(albumId, assetId: assetId, level: level, type: type, userId: userId, ); + /// Available since server v1.0.0. + Future> getActivities({ + required String albumId, + String? assetId, + ReactionLevel? level, + ReactionType? type, + String? userId, + Future? abortTrigger, + }) async { + final response = await getActivitiesWithHttpInfo( + albumId: albumId, + assetId: assetId, + level: level, + type: type, + userId: userId, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Create an activity + /// + /// Create a like or a comment for an album, or an asset in an album. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future createActivityWithHttpInfo(ActivityCreateDto activityCreateDto, {Future? abortTrigger}) async { + final apiPath = r'/activities'; + + Object? postBody = activityCreateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Create an activity + /// + /// Create a like or a comment for an album, or an asset in an album. + /// + /// Available since server v1.0.0. + Future createActivity(ActivityCreateDto activityCreateDto, {Future? abortTrigger}) async { + final response = await createActivityWithHttpInfo(activityCreateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ActivityResponseDto') + as ActivityResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Retrieve activity statistics /// /// Returns the number of likes and comments for a given album or asset in an album. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] albumId (required): - /// Album ID - /// - /// * [String] assetId: - /// Asset ID (if activity is for an asset) - Future getActivityStatisticsWithHttpInfo(String albumId, { String? assetId, }) async { - // ignore: prefer_const_declarations + Future getActivityStatisticsWithHttpInfo({ + required String albumId, + String? assetId, + Future? abortTrigger, + }) async { final apiPath = r'/activities/statistics'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - queryParams.addAll(_queryParams('', 'albumId', albumId)); + queryParams.addAll(_queryParams('', 'albumId', albumId)); if (assetId != null) { queryParams.addAll(_queryParams('', 'assetId', assetId)); } const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -263,25 +197,66 @@ class ActivitiesApi { /// /// Returns the number of likes and comments for a given album or asset in an album. /// - /// Parameters: - /// - /// * [String] albumId (required): - /// Album ID - /// - /// * [String] assetId: - /// Asset ID (if activity is for an asset) - Future getActivityStatistics(String albumId, { String? assetId, }) async { - final response = await getActivityStatisticsWithHttpInfo(albumId, assetId: assetId, ); + /// Available since server v1.0.0. + Future getActivityStatistics({ + required String albumId, + String? assetId, + Future? abortTrigger, + }) async { + final response = await getActivityStatisticsWithHttpInfo( + albumId: albumId, + assetId: assetId, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ActivityStatisticsResponseDto',) as ActivityStatisticsResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ActivityStatisticsResponseDto') + as ActivityStatisticsResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete an activity + /// + /// Removes a like or comment from a given album or asset in an album. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteActivityWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/activities/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete an activity + /// + /// Removes a like or comment from a given album or asset in an album. + /// + /// Available since server v1.0.0. + Future deleteActivity(String id, {Future? abortTrigger}) async { + final response = await deleteActivityWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - return null; } } diff --git a/mobile/openapi/lib/api/albums_api.dart b/mobile/openapi/lib/api/albums_api.dart index c22a8ced07..9a943770b5 100644 --- a/mobile/openapi/lib/api/albums_api.dart +++ b/mobile/openapi/lib/api/albums_api.dart @@ -1,529 +1,81 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class AlbumsApi { AlbumsApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Add assets to an album - /// - /// Add multiple assets to a specific album by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future addAssetsToAlbumWithHttpInfo(String id, BulkIdsDto bulkIdsDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/albums/{id}/assets' - .replaceAll('{id}', id); + static const ApiVersion getAllAlbumsAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody = bulkIdsDto; + static const ApiState getAllAlbumsState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion createAlbumAddedIn = .new(1, 0, 0); - const contentTypes = ['application/json']; + static const ApiState createAlbumState = .stable; + static const ApiVersion addAssetsToAlbumsAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState addAssetsToAlbumsState = .stable; - /// Add assets to an album - /// - /// Add multiple assets to a specific album by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future?> addAssetsToAlbum(String id, BulkIdsDto bulkIdsDto,) async { - final response = await addAssetsToAlbumWithHttpInfo(id, bulkIdsDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); + static const ApiVersion getAlbumStatisticsAddedIn = .new(1, 0, 0); - } - return null; - } + static const ApiState getAlbumStatisticsState = .stable; - /// Add assets to albums - /// - /// Send a list of asset IDs and album IDs to add each asset to each album. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [AlbumsAddAssetsDto] albumsAddAssetsDto (required): - Future addAssetsToAlbumsWithHttpInfo(AlbumsAddAssetsDto albumsAddAssetsDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/albums/assets'; + static const ApiVersion deleteAlbumAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody = albumsAddAssetsDto; + static const ApiState deleteAlbumState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion getAlbumInfoAddedIn = .new(1, 0, 0); - const contentTypes = ['application/json']; + static const ApiState getAlbumInfoState = .stable; + static const ApiVersion updateAlbumInfoAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState updateAlbumInfoState = .stable; - /// Add assets to albums - /// - /// Send a list of asset IDs and album IDs to add each asset to each album. - /// - /// Parameters: - /// - /// * [AlbumsAddAssetsDto] albumsAddAssetsDto (required): - Future addAssetsToAlbums(AlbumsAddAssetsDto albumsAddAssetsDto,) async { - final response = await addAssetsToAlbumsWithHttpInfo(albumsAddAssetsDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AlbumsAddAssetsResponseDto',) as AlbumsAddAssetsResponseDto; - - } - return null; - } + static const ApiVersion removeAssetFromAlbumAddedIn = .new(1, 0, 0); - /// Share album with users - /// - /// Share an album with multiple users. Each user can be given a specific role in the album. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AddUsersDto] addUsersDto (required): - Future addUsersToAlbumWithHttpInfo(String id, AddUsersDto addUsersDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/albums/{id}/users' - .replaceAll('{id}', id); + static const ApiState removeAssetFromAlbumState = .stable; - // ignore: prefer_final_locals - Object? postBody = addUsersDto; + static const ApiVersion addAssetsToAlbumAddedIn = .new(1, 0, 0); - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiState addAssetsToAlbumState = .stable; - const contentTypes = ['application/json']; + static const ApiVersion getAlbumMapMarkersAddedIn = .new(3, 0, 0); + static const ApiState getAlbumMapMarkersState = .added; - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiVersion removeUserFromAlbumAddedIn = .new(1, 0, 0); - /// Share album with users - /// - /// Share an album with multiple users. Each user can be given a specific role in the album. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AddUsersDto] addUsersDto (required): - Future addUsersToAlbum(String id, AddUsersDto addUsersDto,) async { - final response = await addUsersToAlbumWithHttpInfo(id, addUsersDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AlbumResponseDto',) as AlbumResponseDto; - - } - return null; - } + static const ApiState removeUserFromAlbumState = .stable; - /// Create an album - /// - /// Create a new album. The album can also be created with initial users and assets. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [CreateAlbumDto] createAlbumDto (required): - Future createAlbumWithHttpInfo(CreateAlbumDto createAlbumDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/albums'; + static const ApiVersion updateAlbumUserAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody = createAlbumDto; + static const ApiState updateAlbumUserState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion addUsersToAlbumAddedIn = .new(1, 0, 0); - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Create an album - /// - /// Create a new album. The album can also be created with initial users and assets. - /// - /// Parameters: - /// - /// * [CreateAlbumDto] createAlbumDto (required): - Future createAlbum(CreateAlbumDto createAlbumDto,) async { - final response = await createAlbumWithHttpInfo(createAlbumDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AlbumResponseDto',) as AlbumResponseDto; - - } - return null; - } - - /// Delete an album - /// - /// Delete a specific album by its ID. Note the album is initially trashed and then immediately scheduled for deletion, but relies on a background job to complete the process. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteAlbumWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/albums/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Delete an album - /// - /// Delete a specific album by its ID. Note the album is initially trashed and then immediately scheduled for deletion, but relies on a background job to complete the process. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteAlbum(String id,) async { - final response = await deleteAlbumWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Retrieve an album - /// - /// Retrieve information about a specific album by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future getAlbumInfoWithHttpInfo(String id, { String? key, String? slug, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/albums/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - if (key != null) { - queryParams.addAll(_queryParams('', 'key', key)); - } - if (slug != null) { - queryParams.addAll(_queryParams('', 'slug', slug)); - } - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve an album - /// - /// Retrieve information about a specific album by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future getAlbumInfo(String id, { String? key, String? slug, }) async { - final response = await getAlbumInfoWithHttpInfo(id, key: key, slug: slug, ); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AlbumResponseDto',) as AlbumResponseDto; - - } - return null; - } - - /// Retrieve album map markers - /// - /// Retrieve map marker information for a specific album by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future getAlbumMapMarkersWithHttpInfo(String id, { String? key, String? slug, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/albums/{id}/map-markers' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - if (key != null) { - queryParams.addAll(_queryParams('', 'key', key)); - } - if (slug != null) { - queryParams.addAll(_queryParams('', 'slug', slug)); - } - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve album map markers - /// - /// Retrieve map marker information for a specific album by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future?> getAlbumMapMarkers(String id, { String? key, String? slug, }) async { - final response = await getAlbumMapMarkersWithHttpInfo(id, key: key, slug: slug, ); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Retrieve album statistics - /// - /// Returns statistics about the albums available to the authenticated user. - /// - /// Note: This method returns the HTTP [Response]. - Future getAlbumStatisticsWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/albums/statistics'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve album statistics - /// - /// Returns statistics about the albums available to the authenticated user. - Future getAlbumStatistics() async { - final response = await getAlbumStatisticsWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AlbumStatisticsResponseDto',) as AlbumStatisticsResponseDto; - - } - return null; - } + static const ApiState addUsersToAlbumState = .stable; /// List all albums /// /// Retrieve a list of albums available to the authenticated user. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] assetId: - /// Filter albums containing this asset ID (ignores other parameters) - /// - /// * [String] id: - /// Album ID - /// - /// * [bool] isOwned: - /// Filter by ownership: true = only owned, false = only shared-with-me, undefined = no filter - /// - /// * [bool] isShared: - /// Filter by shared status: true = only shared, false = not shared, undefined = no filter - /// - /// * [String] name: - /// Album name (exact match) - Future getAllAlbumsWithHttpInfo({ String? assetId, String? id, bool? isOwned, bool? isShared, String? name, }) async { - // ignore: prefer_const_declarations + Future getAllAlbumsWithHttpInfo({ + String? assetId, + String? id, + bool? isOwned, + bool? isShared, + String? name, + Future? abortTrigger, + }) async { final apiPath = r'/albums'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -548,15 +100,15 @@ class AlbumsApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -564,122 +116,145 @@ class AlbumsApi { /// /// Retrieve a list of albums available to the authenticated user. /// - /// Parameters: - /// - /// * [String] assetId: - /// Filter albums containing this asset ID (ignores other parameters) - /// - /// * [String] id: - /// Album ID - /// - /// * [bool] isOwned: - /// Filter by ownership: true = only owned, false = only shared-with-me, undefined = no filter - /// - /// * [bool] isShared: - /// Filter by shared status: true = only shared, false = not shared, undefined = no filter - /// - /// * [String] name: - /// Album name (exact match) - Future?> getAllAlbums({ String? assetId, String? id, bool? isOwned, bool? isShared, String? name, }) async { - final response = await getAllAlbumsWithHttpInfo( assetId: assetId, id: id, isOwned: isOwned, isShared: isShared, name: name, ); + /// Available since server v1.0.0. + Future> getAllAlbums({ + String? assetId, + String? id, + bool? isOwned, + bool? isShared, + String? name, + Future? abortTrigger, + }) async { + final response = await getAllAlbumsWithHttpInfo( + assetId: assetId, + id: id, + isOwned: isOwned, + isShared: isShared, + name: name, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } - /// Remove assets from an album + /// Create an album /// - /// Remove multiple assets from a specific album by its ID. + /// Create a new album. The album can also be created with initial users and assets. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future removeAssetFromAlbumWithHttpInfo(String id, BulkIdsDto bulkIdsDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/albums/{id}/assets' - .replaceAll('{id}', id); + Future createAlbumWithHttpInfo(CreateAlbumDto createAlbumDto, {Future? abortTrigger}) async { + final apiPath = r'/albums'; - // ignore: prefer_final_locals - Object? postBody = bulkIdsDto; + Object? postBody = createAlbumDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'DELETE', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// Remove assets from an album + /// Create an album /// - /// Remove multiple assets from a specific album by its ID. + /// Create a new album. The album can also be created with initial users and assets. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future?> removeAssetFromAlbum(String id, BulkIdsDto bulkIdsDto,) async { - final response = await removeAssetFromAlbumWithHttpInfo(id, bulkIdsDto,); + /// Available since server v1.0.0. + Future createAlbum(CreateAlbumDto createAlbumDto, {Future? abortTrigger}) async { + final response = await createAlbumWithHttpInfo(createAlbumDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AlbumResponseDto') + as AlbumResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } - /// Remove user from album + /// Add assets to albums /// - /// Remove a user from an album. Use an ID of \"me\" to leave a shared album. + /// Send a list of asset IDs and album IDs to add each asset to each album. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] userId (required): - Future removeUserFromAlbumWithHttpInfo(String id, String userId,) async { - // ignore: prefer_const_declarations - final apiPath = r'/albums/{id}/user/{userId}' - .replaceAll('{id}', id) - .replaceAll('{userId}', userId); + Future addAssetsToAlbumsWithHttpInfo( + AlbumsAddAssetsDto albumsAddAssetsDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/albums/assets'; + + Object? postBody = albumsAddAssetsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Add assets to albums + /// + /// Send a list of asset IDs and album IDs to add each asset to each album. + /// + /// Available since server v1.0.0. + Future addAssetsToAlbums( + AlbumsAddAssetsDto albumsAddAssetsDto, { + Future? abortTrigger, + }) async { + final response = await addAssetsToAlbumsWithHttpInfo(albumsAddAssetsDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AlbumsAddAssetsResponseDto') + as AlbumsAddAssetsResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve album statistics + /// + /// Returns statistics about the albums available to the authenticated user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getAlbumStatisticsWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/albums/statistics'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -688,68 +263,162 @@ class AlbumsApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'DELETE', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// Remove user from album + /// Retrieve album statistics /// - /// Remove a user from an album. Use an ID of \"me\" to leave a shared album. + /// Returns statistics about the albums available to the authenticated user. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] userId (required): - Future removeUserFromAlbum(String id, String userId,) async { - final response = await removeUserFromAlbumWithHttpInfo(id, userId,); + /// Available since server v1.0.0. + Future getAlbumStatistics({Future? abortTrigger}) async { + final response = await getAlbumStatisticsWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AlbumStatisticsResponseDto') + as AlbumStatisticsResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete an album + /// + /// Delete a specific album by its ID. Note the album is initially trashed and then immediately scheduled for deletion, but relies on a background job to complete the process. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteAlbumWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/albums/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete an album + /// + /// Delete a specific album by its ID. Note the album is initially trashed and then immediately scheduled for deletion, but relies on a background job to complete the process. + /// + /// Available since server v1.0.0. + Future deleteAlbum(String id, {Future? abortTrigger}) async { + final response = await deleteAlbumWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve an album + /// + /// Retrieve information about a specific album by its ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getAlbumInfoWithHttpInfo(String id, {String? key, String? slug, Future? abortTrigger}) async { + final apiPath = r'/albums/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + if (key != null) { + queryParams.addAll(_queryParams('', 'key', key)); + } + if (slug != null) { + queryParams.addAll(_queryParams('', 'slug', slug)); + } + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve an album + /// + /// Retrieve information about a specific album by its ID. + /// + /// Available since server v1.0.0. + Future getAlbumInfo(String id, {String? key, String? slug, Future? abortTrigger}) async { + final response = await getAlbumInfoWithHttpInfo(id, key: key, slug: slug, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AlbumResponseDto') + as AlbumResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update an album /// /// Update the information of a specific album by its ID. This endpoint can be used to update the album name, description, sort order, etc. However, it is not used to add or remove assets or users from the album. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UpdateAlbumDto] updateAlbumDto (required): - Future updateAlbumInfoWithHttpInfo(String id, UpdateAlbumDto updateAlbumDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/albums/{id}' - .replaceAll('{id}', id); + Future updateAlbumInfoWithHttpInfo( + String id, + UpdateAlbumDto updateAlbumDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/albums/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = updateAlbumDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PATCH', + r'PATCH', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -757,63 +426,273 @@ class AlbumsApi { /// /// Update the information of a specific album by its ID. This endpoint can be used to update the album name, description, sort order, etc. However, it is not used to add or remove assets or users from the album. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UpdateAlbumDto] updateAlbumDto (required): - Future updateAlbumInfo(String id, UpdateAlbumDto updateAlbumDto,) async { - final response = await updateAlbumInfoWithHttpInfo(id, updateAlbumDto,); + /// Available since server v1.0.0. + Future updateAlbumInfo( + String id, + UpdateAlbumDto updateAlbumDto, { + Future? abortTrigger, + }) async { + final response = await updateAlbumInfoWithHttpInfo(id, updateAlbumDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AlbumResponseDto',) as AlbumResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AlbumResponseDto') + as AlbumResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Remove assets from an album + /// + /// Remove multiple assets from a specific album by its ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future removeAssetFromAlbumWithHttpInfo( + String id, + BulkIdsDto bulkIdsDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/albums/{id}/assets'.replaceAll('{id}', id); + + Object? postBody = bulkIdsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Remove assets from an album + /// + /// Remove multiple assets from a specific album by its ID. + /// + /// Available since server v1.0.0. + Future> removeAssetFromAlbum( + String id, + BulkIdsDto bulkIdsDto, { + Future? abortTrigger, + }) async { + final response = await removeAssetFromAlbumWithHttpInfo(id, bulkIdsDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Add assets to an album + /// + /// Add multiple assets to a specific album by its ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future addAssetsToAlbumWithHttpInfo(String id, BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { + final apiPath = r'/albums/{id}/assets'.replaceAll('{id}', id); + + Object? postBody = bulkIdsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Add assets to an album + /// + /// Add multiple assets to a specific album by its ID. + /// + /// Available since server v1.0.0. + Future> addAssetsToAlbum( + String id, + BulkIdsDto bulkIdsDto, { + Future? abortTrigger, + }) async { + final response = await addAssetsToAlbumWithHttpInfo(id, bulkIdsDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve album map markers + /// + /// Retrieve map marker information for a specific album by its ID. + /// + /// Available since server v3.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getAlbumMapMarkersWithHttpInfo( + String id, { + String? key, + String? slug, + Future? abortTrigger, + }) async { + final apiPath = r'/albums/{id}/map-markers'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + if (key != null) { + queryParams.addAll(_queryParams('', 'key', key)); + } + if (slug != null) { + queryParams.addAll(_queryParams('', 'slug', slug)); + } + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve album map markers + /// + /// Retrieve map marker information for a specific album by its ID. + /// + /// Available since server v3.0.0. + Future> getAlbumMapMarkers( + String id, { + String? key, + String? slug, + Future? abortTrigger, + }) async { + final response = await getAlbumMapMarkersWithHttpInfo(id, key: key, slug: slug, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Remove user from album + /// + /// Remove a user from an album. Use an ID of "me" to leave a shared album. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future removeUserFromAlbumWithHttpInfo(String id, String userId, {Future? abortTrigger}) async { + final apiPath = r'/albums/{id}/user/{userId}'.replaceAll('{id}', id).replaceAll('{userId}', userId); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Remove user from album + /// + /// Remove a user from an album. Use an ID of "me" to leave a shared album. + /// + /// Available since server v1.0.0. + Future removeUserFromAlbum(String id, String userId, {Future? abortTrigger}) async { + final response = await removeUserFromAlbumWithHttpInfo(id, userId, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - return null; } /// Update user role /// /// Change the role for a specific user in a specific album. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] userId (required): - /// - /// * [UpdateAlbumUserDto] updateAlbumUserDto (required): - Future updateAlbumUserWithHttpInfo(String id, String userId, UpdateAlbumUserDto updateAlbumUserDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/albums/{id}/user/{userId}' - .replaceAll('{id}', id) - .replaceAll('{userId}', userId); + Future updateAlbumUserWithHttpInfo( + String id, + String userId, + UpdateAlbumUserDto updateAlbumUserDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/albums/{id}/user/{userId}'.replaceAll('{id}', id).replaceAll('{userId}', userId); - // ignore: prefer_final_locals Object? postBody = updateAlbumUserDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -821,17 +700,63 @@ class AlbumsApi { /// /// Change the role for a specific user in a specific album. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] userId (required): - /// - /// * [UpdateAlbumUserDto] updateAlbumUserDto (required): - Future updateAlbumUser(String id, String userId, UpdateAlbumUserDto updateAlbumUserDto,) async { - final response = await updateAlbumUserWithHttpInfo(id, userId, updateAlbumUserDto,); + /// Available since server v1.0.0. + Future updateAlbumUser( + String id, + String userId, + UpdateAlbumUserDto updateAlbumUserDto, { + Future? abortTrigger, + }) async { + final response = await updateAlbumUserWithHttpInfo(id, userId, updateAlbumUserDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } + + /// Share album with users + /// + /// Share an album with multiple users. Each user can be given a specific role in the album. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future addUsersToAlbumWithHttpInfo(String id, AddUsersDto addUsersDto, {Future? abortTrigger}) async { + final apiPath = r'/albums/{id}/users'.replaceAll('{id}', id); + + Object? postBody = addUsersDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Share album with users + /// + /// Share an album with multiple users. Each user can be given a specific role in the album. + /// + /// Available since server v1.0.0. + Future addUsersToAlbum(String id, AddUsersDto addUsersDto, {Future? abortTrigger}) async { + final response = await addUsersToAlbumWithHttpInfo(id, addUsersDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AlbumResponseDto') + as AlbumResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } } diff --git a/mobile/openapi/lib/api/api_keys_api.dart b/mobile/openapi/lib/api/api_keys_api.dart index 3ca85265c4..b18f2f6fbe 100644 --- a/mobile/openapi/lib/api/api_keys_api.dart +++ b/mobile/openapi/lib/api/api_keys_api.dart @@ -1,52 +1,112 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - -class APIKeysApi { - APIKeysApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; +class ApiKeysApi { + ApiKeysApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion getApiKeysAddedIn = .new(1, 0, 0); + + static const ApiState getApiKeysState = .stable; + + static const ApiVersion createApiKeyAddedIn = .new(1, 0, 0); + + static const ApiState createApiKeyState = .stable; + + static const ApiVersion getMyApiKeyAddedIn = .new(1, 0, 0); + + static const ApiState getMyApiKeyState = .stable; + + static const ApiVersion deleteApiKeyAddedIn = .new(1, 0, 0); + + static const ApiState deleteApiKeyState = .stable; + + static const ApiVersion getApiKeyAddedIn = .new(1, 0, 0); + + static const ApiState getApiKeyState = .stable; + + static const ApiVersion updateApiKeyAddedIn = .new(1, 0, 0); + + static const ApiState updateApiKeyState = .stable; + + /// List all API keys + /// + /// Retrieve all API keys of the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getApiKeysWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/api-keys'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// List all API keys + /// + /// Retrieve all API keys of the current user. + /// + /// Available since server v1.0.0. + Future> getApiKeys({Future? abortTrigger}) async { + final response = await getApiKeysWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + /// Create an API key /// /// Creates a new API key. It will be limited to the permissions specified. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [ApiKeyCreateDto] apiKeyCreateDto (required): - Future createApiKeyWithHttpInfo(ApiKeyCreateDto apiKeyCreateDto,) async { - // ignore: prefer_const_declarations + Future createApiKeyWithHttpInfo(ApiKeyCreateDto apiKeyCreateDto, {Future? abortTrigger}) async { final apiPath = r'/api-keys'; - // ignore: prefer_final_locals Object? postBody = apiKeyCreateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -54,191 +114,29 @@ class APIKeysApi { /// /// Creates a new API key. It will be limited to the permissions specified. /// - /// Parameters: - /// - /// * [ApiKeyCreateDto] apiKeyCreateDto (required): - Future createApiKey(ApiKeyCreateDto apiKeyCreateDto,) async { - final response = await createApiKeyWithHttpInfo(apiKeyCreateDto,); + /// Available since server v1.0.0. + Future createApiKey(ApiKeyCreateDto apiKeyCreateDto, {Future? abortTrigger}) async { + final response = await createApiKeyWithHttpInfo(apiKeyCreateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ApiKeyCreateResponseDto',) as ApiKeyCreateResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ApiKeyCreateResponseDto') + as ApiKeyCreateResponseDto; } - return null; - } - - /// Delete an API key - /// - /// Deletes an API key identified by its ID. The current user must own this API key. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteApiKeyWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/api-keys/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Delete an API key - /// - /// Deletes an API key identified by its ID. The current user must own this API key. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteApiKey(String id,) async { - final response = await deleteApiKeyWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Retrieve an API key - /// - /// Retrieve an API key by its ID. The current user must own this API key. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getApiKeyWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/api-keys/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve an API key - /// - /// Retrieve an API key by its ID. The current user must own this API key. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getApiKey(String id,) async { - final response = await getApiKeyWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ApiKeyResponseDto',) as ApiKeyResponseDto; - - } - return null; - } - - /// List all API keys - /// - /// Retrieve all API keys of the current user. - /// - /// Note: This method returns the HTTP [Response]. - Future getApiKeysWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/api-keys'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// List all API keys - /// - /// Retrieve all API keys of the current user. - Future?> getApiKeys() async { - final response = await getApiKeysWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Retrieve the current API key /// /// Retrieve the API key that is used to access this endpoint. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getMyApiKeyWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getMyApiKeyWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/api-keys/me'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -247,70 +145,155 @@ class APIKeysApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Retrieve the current API key /// /// Retrieve the API key that is used to access this endpoint. - Future getMyApiKey() async { - final response = await getMyApiKeyWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future getMyApiKey({Future? abortTrigger}) async { + final response = await getMyApiKeyWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ApiKeyResponseDto',) as ApiKeyResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ApiKeyResponseDto') + as ApiKeyResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete an API key + /// + /// Deletes an API key identified by its ID. The current user must own this API key. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteApiKeyWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/api-keys/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete an API key + /// + /// Deletes an API key identified by its ID. The current user must own this API key. + /// + /// Available since server v1.0.0. + Future deleteApiKey(String id, {Future? abortTrigger}) async { + final response = await deleteApiKeyWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve an API key + /// + /// Retrieve an API key by its ID. The current user must own this API key. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getApiKeyWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/api-keys/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve an API key + /// + /// Retrieve an API key by its ID. The current user must own this API key. + /// + /// Available since server v1.0.0. + Future getApiKey(String id, {Future? abortTrigger}) async { + final response = await getApiKeyWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ApiKeyResponseDto') + as ApiKeyResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update an API key /// /// Updates the name and permissions of an API key by its ID. The current user must own this API key. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [ApiKeyUpdateDto] apiKeyUpdateDto (required): - Future updateApiKeyWithHttpInfo(String id, ApiKeyUpdateDto apiKeyUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/api-keys/{id}' - .replaceAll('{id}', id); + Future updateApiKeyWithHttpInfo( + String id, + ApiKeyUpdateDto apiKeyUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/api-keys/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = apiKeyUpdateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -318,23 +301,20 @@ class APIKeysApi { /// /// Updates the name and permissions of an API key by its ID. The current user must own this API key. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [ApiKeyUpdateDto] apiKeyUpdateDto (required): - Future updateApiKey(String id, ApiKeyUpdateDto apiKeyUpdateDto,) async { - final response = await updateApiKeyWithHttpInfo(id, apiKeyUpdateDto,); + /// Available since server v1.0.0. + Future updateApiKey( + String id, + ApiKeyUpdateDto apiKeyUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updateApiKeyWithHttpInfo(id, apiKeyUpdateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ApiKeyResponseDto',) as ApiKeyResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ApiKeyResponseDto') + as ApiKeyResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/assets_api.dart b/mobile/openapi/lib/api/assets_api.dart index 691c57cd3e..3ea5753b9a 100644 --- a/mobile/openapi/lib/api/assets_api.dart +++ b/mobile/openapi/lib/api/assets_api.dart @@ -1,214 +1,127 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class AssetsApi { AssetsApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Check bulk upload - /// - /// Determine which assets have already been uploaded to the server based on their SHA1 checksums. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [AssetBulkUploadCheckDto] assetBulkUploadCheckDto (required): - Future checkBulkUploadWithHttpInfo(AssetBulkUploadCheckDto assetBulkUploadCheckDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/bulk-upload-check'; + static const ApiVersion deleteAssetsAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody = assetBulkUploadCheckDto; + static const ApiState deleteAssetsState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion uploadAssetAddedIn = .new(1, 0, 0); - const contentTypes = ['application/json']; + static const ApiState uploadAssetState = .stable; + static const ApiVersion updateAssetsAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState updateAssetsState = .stable; - /// Check bulk upload - /// - /// Determine which assets have already been uploaded to the server based on their SHA1 checksums. - /// - /// Parameters: - /// - /// * [AssetBulkUploadCheckDto] assetBulkUploadCheckDto (required): - Future checkBulkUpload(AssetBulkUploadCheckDto assetBulkUploadCheckDto,) async { - final response = await checkBulkUploadWithHttpInfo(assetBulkUploadCheckDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AssetBulkUploadCheckResponseDto',) as AssetBulkUploadCheckResponseDto; - - } - return null; - } + static const ApiVersion checkBulkUploadAddedIn = .new(1, 0, 0); - /// Copy asset - /// - /// Copy asset information like albums, tags, etc. from one asset to another. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [AssetCopyDto] assetCopyDto (required): - Future copyAssetWithHttpInfo(AssetCopyDto assetCopyDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/copy'; + static const ApiState checkBulkUploadState = .stable; - // ignore: prefer_final_locals - Object? postBody = assetCopyDto; + static const ApiVersion copyAssetAddedIn = .new(1, 0, 0); - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiState copyAssetState = .stable; - const contentTypes = ['application/json']; + static const ApiVersion runAssetJobsAddedIn = .new(1, 0, 0); + static const ApiState runAssetJobsState = .stable; - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiVersion deleteBulkAssetMetadataAddedIn = .new(1, 0, 0); - /// Copy asset - /// - /// Copy asset information like albums, tags, etc. from one asset to another. - /// - /// Parameters: - /// - /// * [AssetCopyDto] assetCopyDto (required): - Future copyAsset(AssetCopyDto assetCopyDto,) async { - final response = await copyAssetWithHttpInfo(assetCopyDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiState deleteBulkAssetMetadataState = .beta; - /// Delete asset metadata by key - /// - /// Delete a specific metadata key-value pair associated with the specified asset. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// Asset ID - /// - /// * [String] key (required): - /// Metadata key - Future deleteAssetMetadataWithHttpInfo(String id, String key,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}/metadata/{key}' - .replaceAll('{id}', id) - .replaceAll('{key}', key); + static const ApiVersion updateBulkAssetMetadataAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody; + static const ApiState updateBulkAssetMetadataState = .beta; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion getAssetStatisticsAddedIn = .new(1, 0, 0); - const contentTypes = []; + static const ApiState getAssetStatisticsState = .stable; + static const ApiVersion getAssetInfoAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState getAssetInfoState = .stable; - /// Delete asset metadata by key - /// - /// Delete a specific metadata key-value pair associated with the specified asset. - /// - /// Parameters: - /// - /// * [String] id (required): - /// Asset ID - /// - /// * [String] key (required): - /// Metadata key - Future deleteAssetMetadata(String id, String key,) async { - final response = await deleteAssetMetadataWithHttpInfo(id, key,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiVersion updateAssetAddedIn = .new(1, 0, 0); + + static const ApiState updateAssetState = .stable; + + static const ApiVersion removeAssetEditsAddedIn = .new(2, 5, 0); + + static const ApiState removeAssetEditsState = .beta; + + static const ApiVersion getAssetEditsAddedIn = .new(2, 5, 0); + + static const ApiState getAssetEditsState = .beta; + + static const ApiVersion editAssetAddedIn = .new(2, 5, 0); + + static const ApiState editAssetState = .beta; + + static const ApiVersion getAssetMetadataAddedIn = .new(1, 0, 0); + + static const ApiState getAssetMetadataState = .stable; + + static const ApiVersion updateAssetMetadataAddedIn = .new(1, 0, 0); + + static const ApiState updateAssetMetadataState = .stable; + + static const ApiVersion deleteAssetMetadataAddedIn = .new(1, 0, 0); + + static const ApiState deleteAssetMetadataState = .stable; + + static const ApiVersion getAssetMetadataByKeyAddedIn = .new(1, 0, 0); + + static const ApiState getAssetMetadataByKeyState = .stable; + + static const ApiVersion getAssetOcrAddedIn = .new(1, 0, 0); + + static const ApiState getAssetOcrState = .stable; + + static const ApiVersion downloadAssetAddedIn = .new(1, 0, 0); + + static const ApiState downloadAssetState = .stable; + + static const ApiVersion viewAssetAddedIn = .new(1, 0, 0); + + static const ApiState viewAssetState = .stable; + + static const ApiVersion playAssetVideoAddedIn = .new(1, 0, 0); + + static const ApiState playAssetVideoState = .stable; /// Delete assets /// /// Deletes multiple assets at the same time. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [AssetBulkDeleteDto] assetBulkDeleteDto (required): - Future deleteAssetsWithHttpInfo(AssetBulkDeleteDto assetBulkDeleteDto,) async { - // ignore: prefer_const_declarations + Future deleteAssetsWithHttpInfo(AssetBulkDeleteDto assetBulkDeleteDto, {Future? abortTrigger}) async { final apiPath = r'/assets'; - // ignore: prefer_final_locals Object? postBody = assetBulkDeleteDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'DELETE', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -216,1048 +129,39 @@ class AssetsApi { /// /// Deletes multiple assets at the same time. /// - /// Parameters: - /// - /// * [AssetBulkDeleteDto] assetBulkDeleteDto (required): - Future deleteAssets(AssetBulkDeleteDto assetBulkDeleteDto,) async { - final response = await deleteAssetsWithHttpInfo(assetBulkDeleteDto,); + /// Available since server v1.0.0. + Future deleteAssets(AssetBulkDeleteDto assetBulkDeleteDto, {Future? abortTrigger}) async { + final response = await deleteAssetsWithHttpInfo(assetBulkDeleteDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } - /// Delete asset metadata - /// - /// Delete metadata key-value pairs for multiple assets. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [AssetMetadataBulkDeleteDto] assetMetadataBulkDeleteDto (required): - Future deleteBulkAssetMetadataWithHttpInfo(AssetMetadataBulkDeleteDto assetMetadataBulkDeleteDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/metadata'; - - // ignore: prefer_final_locals - Object? postBody = assetMetadataBulkDeleteDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Delete asset metadata - /// - /// Delete metadata key-value pairs for multiple assets. - /// - /// Parameters: - /// - /// * [AssetMetadataBulkDeleteDto] assetMetadataBulkDeleteDto (required): - Future deleteBulkAssetMetadata(AssetMetadataBulkDeleteDto assetMetadataBulkDeleteDto,) async { - final response = await deleteBulkAssetMetadataWithHttpInfo(assetMetadataBulkDeleteDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Download original asset - /// - /// Downloads the original file of the specified asset. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [bool] edited: - /// Return edited asset if available - /// - /// * [String] key: - /// - /// * [String] slug: - Future downloadAssetWithHttpInfo(String id, { bool? edited, String? key, String? slug, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}/original' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - if (edited != null) { - queryParams.addAll(_queryParams('', 'edited', edited)); - } - if (key != null) { - queryParams.addAll(_queryParams('', 'key', key)); - } - if (slug != null) { - queryParams.addAll(_queryParams('', 'slug', slug)); - } - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Download original asset - /// - /// Downloads the original file of the specified asset. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [bool] edited: - /// Return edited asset if available - /// - /// * [String] key: - /// - /// * [String] slug: - Future downloadAsset(String id, { bool? edited, String? key, String? slug, }) async { - final response = await downloadAssetWithHttpInfo(id, edited: edited, key: key, slug: slug, ); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MultipartFile',) as MultipartFile; - - } - return null; - } - - /// Apply edits to an existing asset - /// - /// Apply a series of edit actions (crop, rotate, mirror) to the specified asset. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetEditsCreateDto] assetEditsCreateDto (required): - Future editAssetWithHttpInfo(String id, AssetEditsCreateDto assetEditsCreateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}/edits' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = assetEditsCreateDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Apply edits to an existing asset - /// - /// Apply a series of edit actions (crop, rotate, mirror) to the specified asset. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetEditsCreateDto] assetEditsCreateDto (required): - Future editAsset(String id, AssetEditsCreateDto assetEditsCreateDto,) async { - final response = await editAssetWithHttpInfo(id, assetEditsCreateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AssetEditsResponseDto',) as AssetEditsResponseDto; - - } - return null; - } - - /// Retrieve edits for an existing asset - /// - /// Retrieve a series of edit actions (crop, rotate, mirror) associated with the specified asset. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getAssetEditsWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}/edits' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve edits for an existing asset - /// - /// Retrieve a series of edit actions (crop, rotate, mirror) associated with the specified asset. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getAssetEdits(String id,) async { - final response = await getAssetEditsWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AssetEditsResponseDto',) as AssetEditsResponseDto; - - } - return null; - } - - /// Retrieve an asset - /// - /// Retrieve detailed information about a specific asset. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future getAssetInfoWithHttpInfo(String id, { String? key, String? slug, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - if (key != null) { - queryParams.addAll(_queryParams('', 'key', key)); - } - if (slug != null) { - queryParams.addAll(_queryParams('', 'slug', slug)); - } - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve an asset - /// - /// Retrieve detailed information about a specific asset. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future getAssetInfo(String id, { String? key, String? slug, }) async { - final response = await getAssetInfoWithHttpInfo(id, key: key, slug: slug, ); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AssetResponseDto',) as AssetResponseDto; - - } - return null; - } - - /// Get asset metadata - /// - /// Retrieve all metadata key-value pairs associated with the specified asset. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getAssetMetadataWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}/metadata' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get asset metadata - /// - /// Retrieve all metadata key-value pairs associated with the specified asset. - /// - /// Parameters: - /// - /// * [String] id (required): - Future?> getAssetMetadata(String id,) async { - final response = await getAssetMetadataWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Retrieve asset metadata by key - /// - /// Retrieve the value of a specific metadata key associated with the specified asset. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// Asset ID - /// - /// * [String] key (required): - /// Metadata key - Future getAssetMetadataByKeyWithHttpInfo(String id, String key,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}/metadata/{key}' - .replaceAll('{id}', id) - .replaceAll('{key}', key); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve asset metadata by key - /// - /// Retrieve the value of a specific metadata key associated with the specified asset. - /// - /// Parameters: - /// - /// * [String] id (required): - /// Asset ID - /// - /// * [String] key (required): - /// Metadata key - Future getAssetMetadataByKey(String id, String key,) async { - final response = await getAssetMetadataByKeyWithHttpInfo(id, key,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AssetMetadataResponseDto',) as AssetMetadataResponseDto; - - } - return null; - } - - /// Retrieve asset OCR data - /// - /// Retrieve all OCR (Optical Character Recognition) data associated with the specified asset. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getAssetOcrWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}/ocr' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve asset OCR data - /// - /// Retrieve all OCR (Optical Character Recognition) data associated with the specified asset. - /// - /// Parameters: - /// - /// * [String] id (required): - Future?> getAssetOcr(String id,) async { - final response = await getAssetOcrWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Get asset statistics - /// - /// Retrieve various statistics about the assets owned by the authenticated user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [bool] isFavorite: - /// Filter by favorite status - /// - /// * [bool] isTrashed: - /// Filter by trash status - /// - /// * [AssetVisibility] visibility: - Future getAssetStatisticsWithHttpInfo({ bool? isFavorite, bool? isTrashed, AssetVisibility? visibility, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/statistics'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - if (isFavorite != null) { - queryParams.addAll(_queryParams('', 'isFavorite', isFavorite)); - } - if (isTrashed != null) { - queryParams.addAll(_queryParams('', 'isTrashed', isTrashed)); - } - if (visibility != null) { - queryParams.addAll(_queryParams('', 'visibility', visibility)); - } - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get asset statistics - /// - /// Retrieve various statistics about the assets owned by the authenticated user. - /// - /// Parameters: - /// - /// * [bool] isFavorite: - /// Filter by favorite status - /// - /// * [bool] isTrashed: - /// Filter by trash status - /// - /// * [AssetVisibility] visibility: - Future getAssetStatistics({ bool? isFavorite, bool? isTrashed, AssetVisibility? visibility, }) async { - final response = await getAssetStatisticsWithHttpInfo( isFavorite: isFavorite, isTrashed: isTrashed, visibility: visibility, ); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AssetStatsResponseDto',) as AssetStatsResponseDto; - - } - return null; - } - - /// Play asset video - /// - /// Streams the video file for the specified asset. This endpoint also supports byte range requests. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future playAssetVideoWithHttpInfo(String id, { String? key, String? slug, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}/video/playback' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - if (key != null) { - queryParams.addAll(_queryParams('', 'key', key)); - } - if (slug != null) { - queryParams.addAll(_queryParams('', 'slug', slug)); - } - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Play asset video - /// - /// Streams the video file for the specified asset. This endpoint also supports byte range requests. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future playAssetVideo(String id, { String? key, String? slug, }) async { - final response = await playAssetVideoWithHttpInfo(id, key: key, slug: slug, ); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MultipartFile',) as MultipartFile; - - } - return null; - } - - /// Remove edits from an existing asset - /// - /// Removes all edit actions (crop, rotate, mirror) associated with the specified asset. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future removeAssetEditsWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}/edits' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Remove edits from an existing asset - /// - /// Removes all edit actions (crop, rotate, mirror) associated with the specified asset. - /// - /// Parameters: - /// - /// * [String] id (required): - Future removeAssetEdits(String id,) async { - final response = await removeAssetEditsWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Run an asset job - /// - /// Run a specific job on a set of assets. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [AssetJobsDto] assetJobsDto (required): - Future runAssetJobsWithHttpInfo(AssetJobsDto assetJobsDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/jobs'; - - // ignore: prefer_final_locals - Object? postBody = assetJobsDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Run an asset job - /// - /// Run a specific job on a set of assets. - /// - /// Parameters: - /// - /// * [AssetJobsDto] assetJobsDto (required): - Future runAssetJobs(AssetJobsDto assetJobsDto,) async { - final response = await runAssetJobsWithHttpInfo(assetJobsDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Update an asset - /// - /// Update information of a specific asset. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UpdateAssetDto] updateAssetDto (required): - Future updateAssetWithHttpInfo(String id, UpdateAssetDto updateAssetDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = updateAssetDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Update an asset - /// - /// Update information of a specific asset. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UpdateAssetDto] updateAssetDto (required): - Future updateAsset(String id, UpdateAssetDto updateAssetDto,) async { - final response = await updateAssetWithHttpInfo(id, updateAssetDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AssetResponseDto',) as AssetResponseDto; - - } - return null; - } - - /// Update asset metadata - /// - /// Update or add metadata key-value pairs for the specified asset. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetMetadataUpsertDto] assetMetadataUpsertDto (required): - Future updateAssetMetadataWithHttpInfo(String id, AssetMetadataUpsertDto assetMetadataUpsertDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}/metadata' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = assetMetadataUpsertDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Update asset metadata - /// - /// Update or add metadata key-value pairs for the specified asset. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetMetadataUpsertDto] assetMetadataUpsertDto (required): - Future?> updateAssetMetadata(String id, AssetMetadataUpsertDto assetMetadataUpsertDto,) async { - final response = await updateAssetMetadataWithHttpInfo(id, assetMetadataUpsertDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Update assets - /// - /// Updates multiple assets at the same time. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [AssetBulkUpdateDto] assetBulkUpdateDto (required): - Future updateAssetsWithHttpInfo(AssetBulkUpdateDto assetBulkUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets'; - - // ignore: prefer_final_locals - Object? postBody = assetBulkUpdateDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Update assets - /// - /// Updates multiple assets at the same time. - /// - /// Parameters: - /// - /// * [AssetBulkUpdateDto] assetBulkUpdateDto (required): - Future updateAssets(AssetBulkUpdateDto assetBulkUpdateDto,) async { - final response = await updateAssetsWithHttpInfo(assetBulkUpdateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Upsert asset metadata - /// - /// Upsert metadata key-value pairs for multiple assets. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [AssetMetadataBulkUpsertDto] assetMetadataBulkUpsertDto (required): - Future updateBulkAssetMetadataWithHttpInfo(AssetMetadataBulkUpsertDto assetMetadataBulkUpsertDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/metadata'; - - // ignore: prefer_final_locals - Object? postBody = assetMetadataBulkUpsertDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Upsert asset metadata - /// - /// Upsert metadata key-value pairs for multiple assets. - /// - /// Parameters: - /// - /// * [AssetMetadataBulkUpsertDto] assetMetadataBulkUpsertDto (required): - Future?> updateBulkAssetMetadata(AssetMetadataBulkUpsertDto assetMetadataBulkUpsertDto,) async { - final response = await updateBulkAssetMetadataWithHttpInfo(assetMetadataBulkUpsertDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - /// Upload asset /// /// Uploads a new asset to the server. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [MultipartFile] assetData (required): - /// Asset file data - /// - /// * [DateTime] fileCreatedAt (required): - /// File creation date - /// - /// * [DateTime] fileModifiedAt (required): - /// File modification date - /// - /// * [String] key: - /// - /// * [String] slug: - /// - /// * [String] xImmichChecksum: - /// sha1 checksum that can be used for duplicate detection before the file is uploaded - /// - /// * [int] duration: - /// Duration in milliseconds (for videos) - /// - /// * [String] filename: - /// Filename - /// - /// * [bool] isFavorite: - /// Mark as favorite - /// - /// * [String] livePhotoVideoId: - /// Live photo video ID - /// - /// * [List] metadata: - /// Asset metadata items - /// - /// * [MultipartFile] sidecarData: - /// Sidecar file data - /// - /// * [AssetVisibility] visibility: - Future uploadAssetWithHttpInfo(MultipartFile assetData, DateTime fileCreatedAt, DateTime fileModifiedAt, { String? key, String? slug, String? xImmichChecksum, int? duration, String? filename, bool? isFavorite, String? livePhotoVideoId, List? metadata, MultipartFile? sidecarData, AssetVisibility? visibility, }) async { - // ignore: prefer_const_declarations + Future uploadAssetWithHttpInfo( + MultipartFile assetData, + DateTime fileCreatedAt, + DateTime fileModifiedAt, { + int? duration, + String? filename, + bool? isFavorite, + String? livePhotoVideoId, + List? metadata, + MultipartFile? sidecarData, + AssetVisibility? visibility, + String? key, + String? slug, + String? xImmichChecksum, + Future? abortTrigger, + }) async { final apiPath = r'/assets'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -1275,27 +179,21 @@ class AssetsApi { headerParams[r'x-immich-checksum'] = parameterToString(xImmichChecksum); } - const contentTypes = ['multipart/form-data']; + const contentTypes = [r'multipart/form-data']; bool hasFields = false; final mp = MultipartRequest('POST', Uri.parse(apiPath)); - if (assetData != null) { - hasFields = true; - mp.fields[r'assetData'] = assetData.field; - mp.files.add(assetData); - } + hasFields = true; + mp.fields[r'assetData'] = assetData.field; + mp.files.add(assetData); if (duration != null) { hasFields = true; mp.fields[r'duration'] = parameterToString(duration); } - if (fileCreatedAt != null) { - hasFields = true; - mp.fields[r'fileCreatedAt'] = parameterToString(fileCreatedAt); - } - if (fileModifiedAt != null) { - hasFields = true; - mp.fields[r'fileModifiedAt'] = parameterToString(fileModifiedAt); - } + hasFields = true; + mp.fields[r'fileCreatedAt'] = parameterToString(fileCreatedAt); + hasFields = true; + mp.fields[r'fileModifiedAt'] = parameterToString(fileModifiedAt); if (filename != null) { hasFields = true; mp.fields[r'filename'] = parameterToString(filename); @@ -1327,12 +225,13 @@ class AssetsApi { return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -1340,82 +239,984 @@ class AssetsApi { /// /// Uploads a new asset to the server. /// - /// Parameters: - /// - /// * [MultipartFile] assetData (required): - /// Asset file data - /// - /// * [DateTime] fileCreatedAt (required): - /// File creation date - /// - /// * [DateTime] fileModifiedAt (required): - /// File modification date - /// - /// * [String] key: - /// - /// * [String] slug: - /// - /// * [String] xImmichChecksum: - /// sha1 checksum that can be used for duplicate detection before the file is uploaded - /// - /// * [int] duration: - /// Duration in milliseconds (for videos) - /// - /// * [String] filename: - /// Filename - /// - /// * [bool] isFavorite: - /// Mark as favorite - /// - /// * [String] livePhotoVideoId: - /// Live photo video ID - /// - /// * [List] metadata: - /// Asset metadata items - /// - /// * [MultipartFile] sidecarData: - /// Sidecar file data - /// - /// * [AssetVisibility] visibility: - Future uploadAsset(MultipartFile assetData, DateTime fileCreatedAt, DateTime fileModifiedAt, { String? key, String? slug, String? xImmichChecksum, int? duration, String? filename, bool? isFavorite, String? livePhotoVideoId, List? metadata, MultipartFile? sidecarData, AssetVisibility? visibility, }) async { - final response = await uploadAssetWithHttpInfo(assetData, fileCreatedAt, fileModifiedAt, key: key, slug: slug, xImmichChecksum: xImmichChecksum, duration: duration, filename: filename, isFavorite: isFavorite, livePhotoVideoId: livePhotoVideoId, metadata: metadata, sidecarData: sidecarData, visibility: visibility, ); + /// Available since server v1.0.0. + Future uploadAsset( + MultipartFile assetData, + DateTime fileCreatedAt, + DateTime fileModifiedAt, { + int? duration, + String? filename, + bool? isFavorite, + String? livePhotoVideoId, + List? metadata, + MultipartFile? sidecarData, + AssetVisibility? visibility, + String? key, + String? slug, + String? xImmichChecksum, + Future? abortTrigger, + }) async { + final response = await uploadAssetWithHttpInfo( + assetData, + fileCreatedAt, + fileModifiedAt, + key: key, + slug: slug, + xImmichChecksum: xImmichChecksum, + duration: duration, + filename: filename, + isFavorite: isFavorite, + livePhotoVideoId: livePhotoVideoId, + metadata: metadata, + sidecarData: sidecarData, + visibility: visibility, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AssetMediaResponseDto',) as AssetMediaResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AssetMediaResponseDto') + as AssetMediaResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Update assets + /// + /// Updates multiple assets at the same time. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future updateAssetsWithHttpInfo(AssetBulkUpdateDto assetBulkUpdateDto, {Future? abortTrigger}) async { + final apiPath = r'/assets'; + + Object? postBody = assetBulkUpdateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Update assets + /// + /// Updates multiple assets at the same time. + /// + /// Available since server v1.0.0. + Future updateAssets(AssetBulkUpdateDto assetBulkUpdateDto, {Future? abortTrigger}) async { + final response = await updateAssetsWithHttpInfo(assetBulkUpdateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Check bulk upload + /// + /// Determine which assets have already been uploaded to the server based on their SHA1 checksums. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future checkBulkUploadWithHttpInfo( + AssetBulkUploadCheckDto assetBulkUploadCheckDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/assets/bulk-upload-check'; + + Object? postBody = assetBulkUploadCheckDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Check bulk upload + /// + /// Determine which assets have already been uploaded to the server based on their SHA1 checksums. + /// + /// Available since server v1.0.0. + Future checkBulkUpload( + AssetBulkUploadCheckDto assetBulkUploadCheckDto, { + Future? abortTrigger, + }) async { + final response = await checkBulkUploadWithHttpInfo(assetBulkUploadCheckDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AssetBulkUploadCheckResponseDto') + as AssetBulkUploadCheckResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Copy asset + /// + /// Copy asset information like albums, tags, etc. from one asset to another. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future copyAssetWithHttpInfo(AssetCopyDto assetCopyDto, {Future? abortTrigger}) async { + final apiPath = r'/assets/copy'; + + Object? postBody = assetCopyDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Copy asset + /// + /// Copy asset information like albums, tags, etc. from one asset to another. + /// + /// Available since server v1.0.0. + Future copyAsset(AssetCopyDto assetCopyDto, {Future? abortTrigger}) async { + final response = await copyAssetWithHttpInfo(assetCopyDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Run an asset job + /// + /// Run a specific job on a set of assets. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future runAssetJobsWithHttpInfo(AssetJobsDto assetJobsDto, {Future? abortTrigger}) async { + final apiPath = r'/assets/jobs'; + + Object? postBody = assetJobsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Run an asset job + /// + /// Run a specific job on a set of assets. + /// + /// Available since server v1.0.0. + Future runAssetJobs(AssetJobsDto assetJobsDto, {Future? abortTrigger}) async { + final response = await runAssetJobsWithHttpInfo(assetJobsDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Delete asset metadata + /// + /// Delete metadata key-value pairs for multiple assets. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteBulkAssetMetadataWithHttpInfo( + AssetMetadataBulkDeleteDto assetMetadataBulkDeleteDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/assets/metadata'; + + Object? postBody = assetMetadataBulkDeleteDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete asset metadata + /// + /// Delete metadata key-value pairs for multiple assets. + /// + /// Available since server v1.0.0. + Future deleteBulkAssetMetadata( + AssetMetadataBulkDeleteDto assetMetadataBulkDeleteDto, { + Future? abortTrigger, + }) async { + final response = await deleteBulkAssetMetadataWithHttpInfo(assetMetadataBulkDeleteDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Upsert asset metadata + /// + /// Upsert metadata key-value pairs for multiple assets. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future updateBulkAssetMetadataWithHttpInfo( + AssetMetadataBulkUpsertDto assetMetadataBulkUpsertDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/assets/metadata'; + + Object? postBody = assetMetadataBulkUpsertDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Upsert asset metadata + /// + /// Upsert metadata key-value pairs for multiple assets. + /// + /// Available since server v1.0.0. + Future> updateBulkAssetMetadata( + AssetMetadataBulkUpsertDto assetMetadataBulkUpsertDto, { + Future? abortTrigger, + }) async { + final response = await updateBulkAssetMetadataWithHttpInfo(assetMetadataBulkUpsertDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get asset statistics + /// + /// Retrieve various statistics about the assets owned by the authenticated user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getAssetStatisticsWithHttpInfo({ + bool? isFavorite, + bool? isTrashed, + AssetVisibility? visibility, + Future? abortTrigger, + }) async { + final apiPath = r'/assets/statistics'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + if (isFavorite != null) { + queryParams.addAll(_queryParams('', 'isFavorite', isFavorite)); + } + if (isTrashed != null) { + queryParams.addAll(_queryParams('', 'isTrashed', isTrashed)); + } + if (visibility != null) { + queryParams.addAll(_queryParams('', 'visibility', visibility)); + } + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get asset statistics + /// + /// Retrieve various statistics about the assets owned by the authenticated user. + /// + /// Available since server v1.0.0. + Future getAssetStatistics({ + bool? isFavorite, + bool? isTrashed, + AssetVisibility? visibility, + Future? abortTrigger, + }) async { + final response = await getAssetStatisticsWithHttpInfo( + isFavorite: isFavorite, + isTrashed: isTrashed, + visibility: visibility, + abortTrigger: abortTrigger, + ); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AssetStatsResponseDto') + as AssetStatsResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve an asset + /// + /// Retrieve detailed information about a specific asset. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getAssetInfoWithHttpInfo(String id, {String? key, String? slug, Future? abortTrigger}) async { + final apiPath = r'/assets/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + if (key != null) { + queryParams.addAll(_queryParams('', 'key', key)); + } + if (slug != null) { + queryParams.addAll(_queryParams('', 'slug', slug)); + } + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve an asset + /// + /// Retrieve detailed information about a specific asset. + /// + /// Available since server v1.0.0. + Future getAssetInfo(String id, {String? key, String? slug, Future? abortTrigger}) async { + final response = await getAssetInfoWithHttpInfo(id, key: key, slug: slug, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AssetResponseDto') + as AssetResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Update an asset + /// + /// Update information of a specific asset. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future updateAssetWithHttpInfo( + String id, + UpdateAssetDto updateAssetDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/assets/{id}'.replaceAll('{id}', id); + + Object? postBody = updateAssetDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Update an asset + /// + /// Update information of a specific asset. + /// + /// Available since server v1.0.0. + Future updateAsset(String id, UpdateAssetDto updateAssetDto, {Future? abortTrigger}) async { + final response = await updateAssetWithHttpInfo(id, updateAssetDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AssetResponseDto') + as AssetResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Remove edits from an existing asset + /// + /// Removes all edit actions (crop, rotate, mirror) associated with the specified asset. + /// + /// Available since server v2.5.0. + /// + /// Note: This method returns the HTTP [Response]. + Future removeAssetEditsWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/assets/{id}/edits'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Remove edits from an existing asset + /// + /// Removes all edit actions (crop, rotate, mirror) associated with the specified asset. + /// + /// Available since server v2.5.0. + Future removeAssetEdits(String id, {Future? abortTrigger}) async { + final response = await removeAssetEditsWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve edits for an existing asset + /// + /// Retrieve a series of edit actions (crop, rotate, mirror) associated with the specified asset. + /// + /// Available since server v2.5.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getAssetEditsWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/assets/{id}/edits'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve edits for an existing asset + /// + /// Retrieve a series of edit actions (crop, rotate, mirror) associated with the specified asset. + /// + /// Available since server v2.5.0. + Future getAssetEdits(String id, {Future? abortTrigger}) async { + final response = await getAssetEditsWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AssetEditsResponseDto') + as AssetEditsResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Apply edits to an existing asset + /// + /// Apply a series of edit actions (crop, rotate, mirror) to the specified asset. + /// + /// Available since server v2.5.0. + /// + /// Note: This method returns the HTTP [Response]. + Future editAssetWithHttpInfo( + String id, + AssetEditsCreateDto assetEditsCreateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/assets/{id}/edits'.replaceAll('{id}', id); + + Object? postBody = assetEditsCreateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Apply edits to an existing asset + /// + /// Apply a series of edit actions (crop, rotate, mirror) to the specified asset. + /// + /// Available since server v2.5.0. + Future editAsset( + String id, + AssetEditsCreateDto assetEditsCreateDto, { + Future? abortTrigger, + }) async { + final response = await editAssetWithHttpInfo(id, assetEditsCreateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AssetEditsResponseDto') + as AssetEditsResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get asset metadata + /// + /// Retrieve all metadata key-value pairs associated with the specified asset. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getAssetMetadataWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/assets/{id}/metadata'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get asset metadata + /// + /// Retrieve all metadata key-value pairs associated with the specified asset. + /// + /// Available since server v1.0.0. + Future> getAssetMetadata(String id, {Future? abortTrigger}) async { + final response = await getAssetMetadataWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Update asset metadata + /// + /// Update or add metadata key-value pairs for the specified asset. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future updateAssetMetadataWithHttpInfo( + String id, + AssetMetadataUpsertDto assetMetadataUpsertDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/assets/{id}/metadata'.replaceAll('{id}', id); + + Object? postBody = assetMetadataUpsertDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Update asset metadata + /// + /// Update or add metadata key-value pairs for the specified asset. + /// + /// Available since server v1.0.0. + Future> updateAssetMetadata( + String id, + AssetMetadataUpsertDto assetMetadataUpsertDto, { + Future? abortTrigger, + }) async { + final response = await updateAssetMetadataWithHttpInfo(id, assetMetadataUpsertDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete asset metadata by key + /// + /// Delete a specific metadata key-value pair associated with the specified asset. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteAssetMetadataWithHttpInfo(String id, String key, {Future? abortTrigger}) async { + final apiPath = r'/assets/{id}/metadata/{key}'.replaceAll('{id}', id).replaceAll('{key}', key); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete asset metadata by key + /// + /// Delete a specific metadata key-value pair associated with the specified asset. + /// + /// Available since server v1.0.0. + Future deleteAssetMetadata(String id, String key, {Future? abortTrigger}) async { + final response = await deleteAssetMetadataWithHttpInfo(id, key, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve asset metadata by key + /// + /// Retrieve the value of a specific metadata key associated with the specified asset. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getAssetMetadataByKeyWithHttpInfo(String id, String key, {Future? abortTrigger}) async { + final apiPath = r'/assets/{id}/metadata/{key}'.replaceAll('{id}', id).replaceAll('{key}', key); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve asset metadata by key + /// + /// Retrieve the value of a specific metadata key associated with the specified asset. + /// + /// Available since server v1.0.0. + Future getAssetMetadataByKey(String id, String key, {Future? abortTrigger}) async { + final response = await getAssetMetadataByKeyWithHttpInfo(id, key, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AssetMetadataResponseDto') + as AssetMetadataResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve asset OCR data + /// + /// Retrieve all OCR (Optical Character Recognition) data associated with the specified asset. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getAssetOcrWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/assets/{id}/ocr'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve asset OCR data + /// + /// Retrieve all OCR (Optical Character Recognition) data associated with the specified asset. + /// + /// Available since server v1.0.0. + Future> getAssetOcr(String id, {Future? abortTrigger}) async { + final response = await getAssetOcrWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Download original asset + /// + /// Downloads the original file of the specified asset. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future downloadAssetWithHttpInfo( + String id, { + bool? edited, + String? key, + String? slug, + Future? abortTrigger, + }) async { + final apiPath = r'/assets/{id}/original'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + if (edited != null) { + queryParams.addAll(_queryParams('', 'edited', edited)); + } + if (key != null) { + queryParams.addAll(_queryParams('', 'key', key)); + } + if (slug != null) { + queryParams.addAll(_queryParams('', 'slug', slug)); + } + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Download original asset + /// + /// Downloads the original file of the specified asset. + /// + /// Available since server v1.0.0. + Future downloadAsset( + String id, { + bool? edited, + String? key, + String? slug, + Future? abortTrigger, + }) async { + final response = await downloadAssetWithHttpInfo( + id, + edited: edited, + key: key, + slug: slug, + abortTrigger: abortTrigger, + ); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + return response.bodyBytes; } /// View asset thumbnail /// /// Retrieve the thumbnail image for the specified asset. Viewing the fullsize thumbnail might redirect to downloadAsset, which requires a different permission. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [bool] edited: - /// Return edited asset if available - /// - /// * [String] key: - /// - /// * [AssetMediaSize] size: - /// - /// * [String] slug: - Future viewAssetWithHttpInfo(String id, { bool? edited, String? key, AssetMediaSize? size, String? slug, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/assets/{id}/thumbnail' - .replaceAll('{id}', id); + Future viewAssetWithHttpInfo( + String id, { + bool? edited, + String? key, + AssetMediaSize? size, + String? slug, + Future? abortTrigger, + }) async { + final apiPath = r'/assets/{id}/thumbnail'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -1437,15 +1238,15 @@ class AssetsApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -1453,30 +1254,81 @@ class AssetsApi { /// /// Retrieve the thumbnail image for the specified asset. Viewing the fullsize thumbnail might redirect to downloadAsset, which requires a different permission. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [bool] edited: - /// Return edited asset if available - /// - /// * [String] key: - /// - /// * [AssetMediaSize] size: - /// - /// * [String] slug: - Future viewAsset(String id, { bool? edited, String? key, AssetMediaSize? size, String? slug, }) async { - final response = await viewAssetWithHttpInfo(id, edited: edited, key: key, size: size, slug: slug, ); + /// Available since server v1.0.0. + Future viewAsset( + String id, { + bool? edited, + String? key, + AssetMediaSize? size, + String? slug, + Future? abortTrigger, + }) async { + final response = await viewAssetWithHttpInfo( + id, + edited: edited, + key: key, + size: size, + slug: slug, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MultipartFile',) as MultipartFile; - + return response.bodyBytes; + } + + /// Play asset video + /// + /// Streams the video file for the specified asset. This endpoint also supports byte range requests. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future playAssetVideoWithHttpInfo( + String id, { + String? key, + String? slug, + Future? abortTrigger, + }) async { + final apiPath = r'/assets/{id}/video/playback'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + if (key != null) { + queryParams.addAll(_queryParams('', 'key', key)); } - return null; + if (slug != null) { + queryParams.addAll(_queryParams('', 'slug', slug)); + } + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Play asset video + /// + /// Streams the video file for the specified asset. This endpoint also supports byte range requests. + /// + /// Available since server v1.0.0. + Future playAssetVideo(String id, {String? key, String? slug, Future? abortTrigger}) async { + final response = await playAssetVideoWithHttpInfo(id, key: key, slug: slug, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + return response.bodyBytes; } } diff --git a/mobile/openapi/lib/api/authentication_admin_api.dart b/mobile/openapi/lib/api/authentication_admin_api.dart index 0a4b91ebc3..b5cc7f4425 100644 --- a/mobile/openapi/lib/api/authentication_admin_api.dart +++ b/mobile/openapi/lib/api/authentication_admin_api.dart @@ -1,31 +1,26 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class AuthenticationAdminApi { AuthenticationAdminApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion unlinkAllOAuthAccountsAdminAddedIn = .new(1, 0, 0); + + static const ApiState unlinkAllOAuthAccountsAdminState = .stable; + /// Unlink all OAuth accounts /// /// Unlinks all OAuth accounts associated with user accounts in the system. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future unlinkAllOAuthAccountsAdminWithHttpInfo() async { - // ignore: prefer_const_declarations + Future unlinkAllOAuthAccountsAdminWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/admin/auth/unlink-all'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -34,23 +29,25 @@ class AuthenticationAdminApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Unlink all OAuth accounts /// /// Unlinks all OAuth accounts associated with user accounts in the system. - Future unlinkAllOAuthAccountsAdmin() async { - final response = await unlinkAllOAuthAccountsAdminWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future unlinkAllOAuthAccountsAdmin({Future? abortTrigger}) async { + final response = await unlinkAllOAuthAccountsAdminWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } diff --git a/mobile/openapi/lib/api/authentication_api.dart b/mobile/openapi/lib/api/authentication_api.dart index e1219f2c03..4709219190 100644 --- a/mobile/openapi/lib/api/authentication_api.dart +++ b/mobile/openapi/lib/api/authentication_api.dart @@ -1,649 +1,107 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class AuthenticationApi { AuthenticationApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Change password - /// - /// Change the password of the current user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [ChangePasswordDto] changePasswordDto (required): - Future changePasswordWithHttpInfo(ChangePasswordDto changePasswordDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/auth/change-password'; - - // ignore: prefer_final_locals - Object? postBody = changePasswordDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Change password - /// - /// Change the password of the current user. - /// - /// Parameters: - /// - /// * [ChangePasswordDto] changePasswordDto (required): - Future changePassword(ChangePasswordDto changePasswordDto,) async { - final response = await changePasswordWithHttpInfo(changePasswordDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserAdminResponseDto',) as UserAdminResponseDto; - - } - return null; - } - - /// Change pin code - /// - /// Change the pin code for the current user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [PinCodeChangeDto] pinCodeChangeDto (required): - Future changePinCodeWithHttpInfo(PinCodeChangeDto pinCodeChangeDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/auth/pin-code'; - - // ignore: prefer_final_locals - Object? postBody = pinCodeChangeDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Change pin code - /// - /// Change the pin code for the current user. - /// - /// Parameters: - /// - /// * [PinCodeChangeDto] pinCodeChangeDto (required): - Future changePinCode(PinCodeChangeDto pinCodeChangeDto,) async { - final response = await changePinCodeWithHttpInfo(pinCodeChangeDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Finish OAuth - /// - /// Complete the OAuth authorization process by exchanging the authorization code for a session token. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [OAuthCallbackDto] oAuthCallbackDto (required): - Future finishOAuthWithHttpInfo(OAuthCallbackDto oAuthCallbackDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/oauth/callback'; - - // ignore: prefer_final_locals - Object? postBody = oAuthCallbackDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Finish OAuth - /// - /// Complete the OAuth authorization process by exchanging the authorization code for a session token. - /// - /// Parameters: - /// - /// * [OAuthCallbackDto] oAuthCallbackDto (required): - Future finishOAuth(OAuthCallbackDto oAuthCallbackDto,) async { - final response = await finishOAuthWithHttpInfo(oAuthCallbackDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LoginResponseDto',) as LoginResponseDto; - - } - return null; - } - - /// Retrieve auth status - /// - /// Get information about the current session, including whether the user has a password, and if the session can access locked assets. - /// - /// Note: This method returns the HTTP [Response]. - Future getAuthStatusWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/auth/status'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve auth status - /// - /// Get information about the current session, including whether the user has a password, and if the session can access locked assets. - Future getAuthStatus() async { - final response = await getAuthStatusWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AuthStatusResponseDto',) as AuthStatusResponseDto; - - } - return null; - } - - /// Link OAuth account - /// - /// Link an OAuth account to the authenticated user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [OAuthCallbackDto] oAuthCallbackDto (required): - Future linkOAuthAccountWithHttpInfo(OAuthCallbackDto oAuthCallbackDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/oauth/link'; - - // ignore: prefer_final_locals - Object? postBody = oAuthCallbackDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Link OAuth account - /// - /// Link an OAuth account to the authenticated user. - /// - /// Parameters: - /// - /// * [OAuthCallbackDto] oAuthCallbackDto (required): - Future linkOAuthAccount(OAuthCallbackDto oAuthCallbackDto,) async { - final response = await linkOAuthAccountWithHttpInfo(oAuthCallbackDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserAdminResponseDto',) as UserAdminResponseDto; - - } - return null; - } - - /// Lock auth session - /// - /// Remove elevated access to locked assets from the current session. - /// - /// Note: This method returns the HTTP [Response]. - Future lockAuthSessionWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/auth/session/lock'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Lock auth session - /// - /// Remove elevated access to locked assets from the current session. - Future lockAuthSession() async { - final response = await lockAuthSessionWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Login - /// - /// Login with username and password and receive a session token. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [LoginCredentialDto] loginCredentialDto (required): - Future loginWithHttpInfo(LoginCredentialDto loginCredentialDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/auth/login'; - - // ignore: prefer_final_locals - Object? postBody = loginCredentialDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Login - /// - /// Login with username and password and receive a session token. - /// - /// Parameters: - /// - /// * [LoginCredentialDto] loginCredentialDto (required): - Future login(LoginCredentialDto loginCredentialDto,) async { - final response = await loginWithHttpInfo(loginCredentialDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LoginResponseDto',) as LoginResponseDto; - - } - return null; - } - - /// Logout - /// - /// Logout the current user and invalidate the session token. - /// - /// Note: This method returns the HTTP [Response]. - Future logoutWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/auth/logout'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Logout - /// - /// Logout the current user and invalidate the session token. - Future logout() async { - final response = await logoutWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LogoutResponseDto',) as LogoutResponseDto; - - } - return null; - } - - /// Backchannel OAuth logout - /// - /// Logout the OAuth account and invalidate the session specified by the sid claim or all sessions if the sid claim is not present. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] logoutToken (required): - /// OAuth logout token - Future logoutOAuthWithHttpInfo(String logoutToken,) async { - // ignore: prefer_const_declarations - final apiPath = r'/oauth/backchannel-logout'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/x-www-form-urlencoded']; - - if (logoutToken != null) { - formParams[r'logout_token'] = parameterToString(logoutToken); - } - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Backchannel OAuth logout - /// - /// Logout the OAuth account and invalidate the session specified by the sid claim or all sessions if the sid claim is not present. - /// - /// Parameters: - /// - /// * [String] logoutToken (required): - /// OAuth logout token - Future logoutOAuth(String logoutToken,) async { - final response = await logoutOAuthWithHttpInfo(logoutToken,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Redirect OAuth to mobile - /// - /// Requests to this URL are automatically forwarded to the mobile app, and is used in some cases for OAuth redirecting. - /// - /// Note: This method returns the HTTP [Response]. - Future redirectOAuthToMobileWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/oauth/mobile-redirect'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Redirect OAuth to mobile - /// - /// Requests to this URL are automatically forwarded to the mobile app, and is used in some cases for OAuth redirecting. - Future redirectOAuthToMobile() async { - final response = await redirectOAuthToMobileWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Reset pin code - /// - /// Reset the pin code for the current user by providing the account password - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [PinCodeResetDto] pinCodeResetDto (required): - Future resetPinCodeWithHttpInfo(PinCodeResetDto pinCodeResetDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/auth/pin-code'; - - // ignore: prefer_final_locals - Object? postBody = pinCodeResetDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Reset pin code - /// - /// Reset the pin code for the current user by providing the account password - /// - /// Parameters: - /// - /// * [PinCodeResetDto] pinCodeResetDto (required): - Future resetPinCode(PinCodeResetDto pinCodeResetDto,) async { - final response = await resetPinCodeWithHttpInfo(pinCodeResetDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Setup pin code - /// - /// Setup a new pin code for the current user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [PinCodeSetupDto] pinCodeSetupDto (required): - Future setupPinCodeWithHttpInfo(PinCodeSetupDto pinCodeSetupDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/auth/pin-code'; - - // ignore: prefer_final_locals - Object? postBody = pinCodeSetupDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Setup pin code - /// - /// Setup a new pin code for the current user. - /// - /// Parameters: - /// - /// * [PinCodeSetupDto] pinCodeSetupDto (required): - Future setupPinCode(PinCodeSetupDto pinCodeSetupDto,) async { - final response = await setupPinCodeWithHttpInfo(pinCodeSetupDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiVersion signUpAdminAddedIn = .new(1, 0, 0); + + static const ApiState signUpAdminState = .stable; + + static const ApiVersion changePasswordAddedIn = .new(1, 0, 0); + + static const ApiState changePasswordState = .stable; + + static const ApiVersion loginAddedIn = .new(1, 0, 0); + + static const ApiState loginState = .stable; + + static const ApiVersion logoutAddedIn = .new(1, 0, 0); + + static const ApiState logoutState = .stable; + + static const ApiVersion resetPinCodeAddedIn = .new(1, 0, 0); + + static const ApiState resetPinCodeState = .stable; + + static const ApiVersion setupPinCodeAddedIn = .new(1, 0, 0); + + static const ApiState setupPinCodeState = .stable; + + static const ApiVersion changePinCodeAddedIn = .new(1, 0, 0); + + static const ApiState changePinCodeState = .stable; + + static const ApiVersion lockAuthSessionAddedIn = .new(1, 0, 0); + + static const ApiState lockAuthSessionState = .stable; + + static const ApiVersion unlockAuthSessionAddedIn = .new(1, 0, 0); + + static const ApiState unlockAuthSessionState = .stable; + + static const ApiVersion getAuthStatusAddedIn = .new(1, 0, 0); + + static const ApiState getAuthStatusState = .stable; + + static const ApiVersion validateAccessTokenAddedIn = .new(1, 0, 0); + + static const ApiState validateAccessTokenState = .stable; + + static const ApiVersion startOAuthAddedIn = .new(1, 0, 0); + + static const ApiState startOAuthState = .stable; + + static const ApiVersion logoutOAuthAddedIn = .new(2, 0, 0); + + static const ApiState logoutOAuthState = .added; + + static const ApiVersion finishOAuthAddedIn = .new(1, 0, 0); + + static const ApiState finishOAuthState = .stable; + + static const ApiVersion linkOAuthAccountAddedIn = .new(1, 0, 0); + + static const ApiState linkOAuthAccountState = .stable; + + static const ApiVersion redirectOAuthToMobileAddedIn = .new(1, 0, 0); + + static const ApiState redirectOAuthToMobileState = .stable; + + static const ApiVersion unlinkOAuthAccountAddedIn = .new(1, 0, 0); + + static const ApiState unlinkOAuthAccountState = .stable; /// Register admin /// /// Create the first admin user in the system. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SignUpDto] signUpDto (required): - Future signUpAdminWithHttpInfo(SignUpDto signUpDto,) async { - // ignore: prefer_const_declarations + Future signUpAdminWithHttpInfo(SignUpDto signUpDto, {Future? abortTrigger}) async { final apiPath = r'/auth/admin-sign-up'; - // ignore: prefer_final_locals Object? postBody = signUpDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -651,90 +109,123 @@ class AuthenticationApi { /// /// Create the first admin user in the system. /// - /// Parameters: - /// - /// * [SignUpDto] signUpDto (required): - Future signUpAdmin(SignUpDto signUpDto,) async { - final response = await signUpAdminWithHttpInfo(signUpDto,); + /// Available since server v1.0.0. + Future signUpAdmin(SignUpDto signUpDto, {Future? abortTrigger}) async { + final response = await signUpAdminWithHttpInfo(signUpDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserAdminResponseDto',) as UserAdminResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserAdminResponseDto') + as UserAdminResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } - /// Start OAuth + /// Change password /// - /// Initiate the OAuth authorization process. + /// Change the password of the current user. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [OAuthConfigDto] oAuthConfigDto (required): - Future startOAuthWithHttpInfo(OAuthConfigDto oAuthConfigDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/oauth/authorize'; + Future changePasswordWithHttpInfo(ChangePasswordDto changePasswordDto, {Future? abortTrigger}) async { + final apiPath = r'/auth/change-password'; - // ignore: prefer_final_locals - Object? postBody = oAuthConfigDto; + Object? postBody = changePasswordDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// Start OAuth + /// Change password /// - /// Initiate the OAuth authorization process. + /// Change the password of the current user. /// - /// Parameters: - /// - /// * [OAuthConfigDto] oAuthConfigDto (required): - Future startOAuth(OAuthConfigDto oAuthConfigDto,) async { - final response = await startOAuthWithHttpInfo(oAuthConfigDto,); + /// Available since server v1.0.0. + Future changePassword(ChangePasswordDto changePasswordDto, {Future? abortTrigger}) async { + final response = await changePasswordWithHttpInfo(changePasswordDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'OAuthAuthorizeResponseDto',) as OAuthAuthorizeResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserAdminResponseDto') + as UserAdminResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } - /// Unlink OAuth account + /// Login /// - /// Unlink the OAuth account from the authenticated user. + /// Login with username and password and receive a session token. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - Future unlinkOAuthAccountWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/oauth/unlink'; + Future loginWithHttpInfo(LoginCredentialDto loginCredentialDto, {Future? abortTrigger}) async { + final apiPath = r'/auth/login'; + + Object? postBody = loginCredentialDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Login + /// + /// Login with username and password and receive a session token. + /// + /// Available since server v1.0.0. + Future login(LoginCredentialDto loginCredentialDto, {Future? abortTrigger}) async { + final response = await loginWithHttpInfo(loginCredentialDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'LoginResponseDto') + as LoginResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Logout + /// + /// Logout the current user and invalidate the session token. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future logoutWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/auth/logout'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -743,67 +234,233 @@ class AuthenticationApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// Unlink OAuth account + /// Logout /// - /// Unlink the OAuth account from the authenticated user. - Future unlinkOAuthAccount() async { - final response = await unlinkOAuthAccountWithHttpInfo(); + /// Logout the current user and invalidate the session token. + /// + /// Available since server v1.0.0. + Future logout({Future? abortTrigger}) async { + final response = await logoutWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserAdminResponseDto',) as UserAdminResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'LogoutResponseDto') + as LogoutResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Reset pin code + /// + /// Reset the pin code for the current user by providing the account password + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future resetPinCodeWithHttpInfo(PinCodeResetDto pinCodeResetDto, {Future? abortTrigger}) async { + final apiPath = r'/auth/pin-code'; + + Object? postBody = pinCodeResetDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Reset pin code + /// + /// Reset the pin code for the current user by providing the account password + /// + /// Available since server v1.0.0. + Future resetPinCode(PinCodeResetDto pinCodeResetDto, {Future? abortTrigger}) async { + final response = await resetPinCodeWithHttpInfo(pinCodeResetDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Setup pin code + /// + /// Setup a new pin code for the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future setupPinCodeWithHttpInfo(PinCodeSetupDto pinCodeSetupDto, {Future? abortTrigger}) async { + final apiPath = r'/auth/pin-code'; + + Object? postBody = pinCodeSetupDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Setup pin code + /// + /// Setup a new pin code for the current user. + /// + /// Available since server v1.0.0. + Future setupPinCode(PinCodeSetupDto pinCodeSetupDto, {Future? abortTrigger}) async { + final response = await setupPinCodeWithHttpInfo(pinCodeSetupDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Change pin code + /// + /// Change the pin code for the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future changePinCodeWithHttpInfo(PinCodeChangeDto pinCodeChangeDto, {Future? abortTrigger}) async { + final apiPath = r'/auth/pin-code'; + + Object? postBody = pinCodeChangeDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Change pin code + /// + /// Change the pin code for the current user. + /// + /// Available since server v1.0.0. + Future changePinCode(PinCodeChangeDto pinCodeChangeDto, {Future? abortTrigger}) async { + final response = await changePinCodeWithHttpInfo(pinCodeChangeDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Lock auth session + /// + /// Remove elevated access to locked assets from the current session. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future lockAuthSessionWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/auth/session/lock'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Lock auth session + /// + /// Remove elevated access to locked assets from the current session. + /// + /// Available since server v1.0.0. + Future lockAuthSession({Future? abortTrigger}) async { + final response = await lockAuthSessionWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - return null; } /// Unlock auth session /// /// Temporarily grant the session elevated access to locked assets by providing the correct PIN code. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SessionUnlockDto] sessionUnlockDto (required): - Future unlockAuthSessionWithHttpInfo(SessionUnlockDto sessionUnlockDto,) async { - // ignore: prefer_const_declarations + Future unlockAuthSessionWithHttpInfo( + SessionUnlockDto sessionUnlockDto, { + Future? abortTrigger, + }) async { final apiPath = r'/auth/session/unlock'; - // ignore: prefer_final_locals Object? postBody = sessionUnlockDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -811,26 +468,24 @@ class AuthenticationApi { /// /// Temporarily grant the session elevated access to locked assets by providing the correct PIN code. /// - /// Parameters: - /// - /// * [SessionUnlockDto] sessionUnlockDto (required): - Future unlockAuthSession(SessionUnlockDto sessionUnlockDto,) async { - final response = await unlockAuthSessionWithHttpInfo(sessionUnlockDto,); + /// Available since server v1.0.0. + Future unlockAuthSession(SessionUnlockDto sessionUnlockDto, {Future? abortTrigger}) async { + final response = await unlockAuthSessionWithHttpInfo(sessionUnlockDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } - /// Validate access token + /// Retrieve auth status /// - /// Validate the current authorization method is still valid. + /// Get information about the current session, including whether the user has a password, and if the session can access locked assets. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - Future validateAccessTokenWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/auth/validateToken'; + Future getAuthStatusWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/auth/status'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -839,33 +494,359 @@ class AuthenticationApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'POST', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve auth status + /// + /// Get information about the current session, including whether the user has a password, and if the session can access locked assets. + /// + /// Available since server v1.0.0. + Future getAuthStatus({Future? abortTrigger}) async { + final response = await getAuthStatusWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AuthStatusResponseDto') + as AuthStatusResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Validate access token + /// + /// Validate the current authorization method is still valid. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future validateAccessTokenWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/auth/validateToken'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Validate access token /// /// Validate the current authorization method is still valid. - Future validateAccessToken() async { - final response = await validateAccessTokenWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future validateAccessToken({Future? abortTrigger}) async { + final response = await validateAccessTokenWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ValidateAccessTokenResponseDto',) as ValidateAccessTokenResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ValidateAccessTokenResponseDto') + as ValidateAccessTokenResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Start OAuth + /// + /// Initiate the OAuth authorization process. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future startOAuthWithHttpInfo(OAuthConfigDto oAuthConfigDto, {Future? abortTrigger}) async { + final apiPath = r'/oauth/authorize'; + + Object? postBody = oAuthConfigDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Start OAuth + /// + /// Initiate the OAuth authorization process. + /// + /// Available since server v1.0.0. + Future startOAuth(OAuthConfigDto oAuthConfigDto, {Future? abortTrigger}) async { + final response = await startOAuthWithHttpInfo(oAuthConfigDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'OAuthAuthorizeResponseDto') + as OAuthAuthorizeResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Backchannel OAuth logout + /// + /// Logout the OAuth account and invalidate the session specified by the sid claim or all sessions if the sid claim is not present. + /// + /// Available since server v2.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future logoutOAuthWithHttpInfo( + OAuthBackchannelLogoutDto oAuthBackchannelLogoutDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/oauth/backchannel-logout'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/x-www-form-urlencoded']; + + oAuthBackchannelLogoutDto.toJson().forEach((k, v) { + if (v != null) { + formParams[k] = parameterToString(v); + } + }); + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Backchannel OAuth logout + /// + /// Logout the OAuth account and invalidate the session specified by the sid claim or all sessions if the sid claim is not present. + /// + /// Available since server v2.0.0. + Future logoutOAuth(OAuthBackchannelLogoutDto oAuthBackchannelLogoutDto, {Future? abortTrigger}) async { + final response = await logoutOAuthWithHttpInfo(oAuthBackchannelLogoutDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Finish OAuth + /// + /// Complete the OAuth authorization process by exchanging the authorization code for a session token. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future finishOAuthWithHttpInfo(OAuthCallbackDto oAuthCallbackDto, {Future? abortTrigger}) async { + final apiPath = r'/oauth/callback'; + + Object? postBody = oAuthCallbackDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Finish OAuth + /// + /// Complete the OAuth authorization process by exchanging the authorization code for a session token. + /// + /// Available since server v1.0.0. + Future finishOAuth(OAuthCallbackDto oAuthCallbackDto, {Future? abortTrigger}) async { + final response = await finishOAuthWithHttpInfo(oAuthCallbackDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'LoginResponseDto') + as LoginResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Link OAuth account + /// + /// Link an OAuth account to the authenticated user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future linkOAuthAccountWithHttpInfo(OAuthCallbackDto oAuthCallbackDto, {Future? abortTrigger}) async { + final apiPath = r'/oauth/link'; + + Object? postBody = oAuthCallbackDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Link OAuth account + /// + /// Link an OAuth account to the authenticated user. + /// + /// Available since server v1.0.0. + Future linkOAuthAccount(OAuthCallbackDto oAuthCallbackDto, {Future? abortTrigger}) async { + final response = await linkOAuthAccountWithHttpInfo(oAuthCallbackDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserAdminResponseDto') + as UserAdminResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Redirect OAuth to mobile + /// + /// Requests to this URL are automatically forwarded to the mobile app, and is used in some cases for OAuth redirecting. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future redirectOAuthToMobileWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/oauth/mobile-redirect'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Redirect OAuth to mobile + /// + /// Requests to this URL are automatically forwarded to the mobile app, and is used in some cases for OAuth redirecting. + /// + /// Available since server v1.0.0. + Future redirectOAuthToMobile({Future? abortTrigger}) async { + final response = await redirectOAuthToMobileWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Unlink OAuth account + /// + /// Unlink the OAuth account from the authenticated user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future unlinkOAuthAccountWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/oauth/unlink'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Unlink OAuth account + /// + /// Unlink the OAuth account from the authenticated user. + /// + /// Available since server v1.0.0. + Future unlinkOAuthAccount({Future? abortTrigger}) async { + final response = await unlinkOAuthAccountWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserAdminResponseDto') + as UserAdminResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/database_backups_admin_api.dart b/mobile/openapi/lib/api/database_backups_admin_api.dart index 768185db1e..b27eb95d89 100644 --- a/mobile/openapi/lib/api/database_backups_admin_api.dart +++ b/mobile/openapi/lib/api/database_backups_admin_api.dart @@ -1,52 +1,62 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class DatabaseBackupsAdminApi { DatabaseBackupsAdminApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion deleteDatabaseBackupAddedIn = .new(2, 5, 0); + + static const ApiState deleteDatabaseBackupState = .alpha; + + static const ApiVersion listDatabaseBackupsAddedIn = .new(2, 5, 0); + + static const ApiState listDatabaseBackupsState = .alpha; + + static const ApiVersion startDatabaseRestoreFlowAddedIn = .new(2, 5, 0); + + static const ApiState startDatabaseRestoreFlowState = .alpha; + + static const ApiVersion uploadDatabaseBackupAddedIn = .new(2, 5, 0); + + static const ApiState uploadDatabaseBackupState = .alpha; + + static const ApiVersion downloadDatabaseBackupAddedIn = .new(2, 5, 0); + + static const ApiState downloadDatabaseBackupState = .alpha; + /// Delete database backup /// /// Delete a backup by its filename /// + /// Available since server v2.5.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [DatabaseBackupDeleteDto] databaseBackupDeleteDto (required): - Future deleteDatabaseBackupWithHttpInfo(DatabaseBackupDeleteDto databaseBackupDeleteDto,) async { - // ignore: prefer_const_declarations + Future deleteDatabaseBackupWithHttpInfo( + DatabaseBackupDeleteDto databaseBackupDeleteDto, { + Future? abortTrigger, + }) async { final apiPath = r'/admin/database-backups'; - // ignore: prefer_final_locals Object? postBody = databaseBackupDeleteDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'DELETE', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -54,83 +64,27 @@ class DatabaseBackupsAdminApi { /// /// Delete a backup by its filename /// - /// Parameters: - /// - /// * [DatabaseBackupDeleteDto] databaseBackupDeleteDto (required): - Future deleteDatabaseBackup(DatabaseBackupDeleteDto databaseBackupDeleteDto,) async { - final response = await deleteDatabaseBackupWithHttpInfo(databaseBackupDeleteDto,); + /// Available since server v2.5.0. + Future deleteDatabaseBackup( + DatabaseBackupDeleteDto databaseBackupDeleteDto, { + Future? abortTrigger, + }) async { + final response = await deleteDatabaseBackupWithHttpInfo(databaseBackupDeleteDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } - /// Download database backup - /// - /// Downloads the database backup file - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] filename (required): - Future downloadDatabaseBackupWithHttpInfo(String filename,) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/database-backups/{filename}' - .replaceAll('{filename}', filename); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Download database backup - /// - /// Downloads the database backup file - /// - /// Parameters: - /// - /// * [String] filename (required): - Future downloadDatabaseBackup(String filename,) async { - final response = await downloadDatabaseBackupWithHttpInfo(filename,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MultipartFile',) as MultipartFile; - - } - return null; - } - /// List database backups /// /// Get the list of the successful and failed backups /// + /// Available since server v2.5.0. + /// /// Note: This method returns the HTTP [Response]. - Future listDatabaseBackupsWithHttpInfo() async { - // ignore: prefer_const_declarations + Future listDatabaseBackupsWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/admin/database-backups'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -139,46 +93,45 @@ class DatabaseBackupsAdminApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// List database backups /// /// Get the list of the successful and failed backups - Future listDatabaseBackups() async { - final response = await listDatabaseBackupsWithHttpInfo(); + /// + /// Available since server v2.5.0. + Future listDatabaseBackups({Future? abortTrigger}) async { + final response = await listDatabaseBackupsWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'DatabaseBackupListResponseDto',) as DatabaseBackupListResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'DatabaseBackupListResponseDto') + as DatabaseBackupListResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Start database backup restore flow /// /// Put Immich into maintenance mode to restore a backup (Immich must not be configured) /// + /// Available since server v2.5.0. + /// /// Note: This method returns the HTTP [Response]. - Future startDatabaseRestoreFlowWithHttpInfo() async { - // ignore: prefer_const_declarations + Future startDatabaseRestoreFlowWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/admin/database-backups/start-restore'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -187,23 +140,25 @@ class DatabaseBackupsAdminApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Start database backup restore flow /// /// Put Immich into maintenance mode to restore a backup (Immich must not be configured) - Future startDatabaseRestoreFlow() async { - final response = await startDatabaseRestoreFlowWithHttpInfo(); + /// + /// Available since server v2.5.0. + Future startDatabaseRestoreFlow({Future? abortTrigger}) async { + final response = await startDatabaseRestoreFlowWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } @@ -213,24 +168,19 @@ class DatabaseBackupsAdminApi { /// /// Uploads .sql/.sql.gz file to restore backup from /// + /// Available since server v2.5.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [MultipartFile] file: - /// Database backup file - Future uploadDatabaseBackupWithHttpInfo({ MultipartFile? file, }) async { - // ignore: prefer_const_declarations + Future uploadDatabaseBackupWithHttpInfo({MultipartFile? file, Future? abortTrigger}) async { final apiPath = r'/admin/database-backups/upload'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['multipart/form-data']; + const contentTypes = [r'multipart/form-data']; bool hasFields = false; final mp = MultipartRequest('POST', Uri.parse(apiPath)); @@ -245,12 +195,13 @@ class DatabaseBackupsAdminApi { return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -258,14 +209,54 @@ class DatabaseBackupsAdminApi { /// /// Uploads .sql/.sql.gz file to restore backup from /// - /// Parameters: - /// - /// * [MultipartFile] file: - /// Database backup file - Future uploadDatabaseBackup({ MultipartFile? file, }) async { - final response = await uploadDatabaseBackupWithHttpInfo( file: file, ); + /// Available since server v2.5.0. + Future uploadDatabaseBackup({MultipartFile? file, Future? abortTrigger}) async { + final response = await uploadDatabaseBackupWithHttpInfo(file: file, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } + + /// Download database backup + /// + /// Downloads the database backup file + /// + /// Available since server v2.5.0. + /// + /// Note: This method returns the HTTP [Response]. + Future downloadDatabaseBackupWithHttpInfo(String filename, {Future? abortTrigger}) async { + final apiPath = r'/admin/database-backups/{filename}'.replaceAll('{filename}', filename); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Download database backup + /// + /// Downloads the database backup file + /// + /// Available since server v2.5.0. + Future downloadDatabaseBackup(String filename, {Future? abortTrigger}) async { + final response = await downloadDatabaseBackupWithHttpInfo(filename, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + return response.bodyBytes; + } } diff --git a/mobile/openapi/lib/api/deprecated_api.dart b/mobile/openapi/lib/api/deprecated_api.dart deleted file mode 100644 index a437cd5837..0000000000 --- a/mobile/openapi/lib/api/deprecated_api.dart +++ /dev/null @@ -1,184 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -part of openapi.api; - - -class DeprecatedApi { - DeprecatedApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; - - final ApiClient apiClient; - - /// Create a partner - /// - /// Create a new partner to share assets with. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future createPartnerDeprecatedWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/partners/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Create a partner - /// - /// Create a new partner to share assets with. - /// - /// Parameters: - /// - /// * [String] id (required): - Future createPartnerDeprecated(String id,) async { - final response = await createPartnerDeprecatedWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'PartnerResponseDto',) as PartnerResponseDto; - - } - return null; - } - - /// Retrieve queue counts and status - /// - /// Retrieve the counts of the current queue, as well as the current status. - /// - /// Note: This method returns the HTTP [Response]. - Future getQueuesLegacyWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/jobs'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve queue counts and status - /// - /// Retrieve the counts of the current queue, as well as the current status. - Future getQueuesLegacy() async { - final response = await getQueuesLegacyWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'QueuesResponseLegacyDto',) as QueuesResponseLegacyDto; - - } - return null; - } - - /// Run jobs - /// - /// Queue all assets for a specific job type. Defaults to only queueing assets that have not yet been processed, but the force command can be used to re-process all assets. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [QueueName] name (required): - /// - /// * [QueueCommandDto] queueCommandDto (required): - Future runQueueCommandLegacyWithHttpInfo(QueueName name, QueueCommandDto queueCommandDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/jobs/{name}' - .replaceAll('{name}', name.toString()); - - // ignore: prefer_final_locals - Object? postBody = queueCommandDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Run jobs - /// - /// Queue all assets for a specific job type. Defaults to only queueing assets that have not yet been processed, but the force command can be used to re-process all assets. - /// - /// Parameters: - /// - /// * [QueueName] name (required): - /// - /// * [QueueCommandDto] queueCommandDto (required): - Future runQueueCommandLegacy(QueueName name, QueueCommandDto queueCommandDto,) async { - final response = await runQueueCommandLegacyWithHttpInfo(name, queueCommandDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'QueueResponseLegacyDto',) as QueueResponseLegacyDto; - - } - return null; - } -} diff --git a/mobile/openapi/lib/api/download_api.dart b/mobile/openapi/lib/api/download_api.dart index 4d0c5c8165..f05449400d 100644 --- a/mobile/openapi/lib/api/download_api.dart +++ b/mobile/openapi/lib/api/download_api.dart @@ -1,39 +1,35 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class DownloadApi { DownloadApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion downloadArchiveAddedIn = .new(1, 0, 0); + + static const ApiState downloadArchiveState = .stable; + + static const ApiVersion getDownloadInfoAddedIn = .new(1, 0, 0); + + static const ApiState getDownloadInfoState = .stable; + /// Download asset archive /// - /// Download a ZIP archive containing the specified assets. The assets must have been previously requested via the \"getDownloadInfo\" endpoint. + /// Download a ZIP archive containing the specified assets. The assets must have been previously requested via the "getDownloadInfo" endpoint. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [DownloadArchiveDto] downloadArchiveDto (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future downloadArchiveWithHttpInfo(DownloadArchiveDto downloadArchiveDto, { String? key, String? slug, }) async { - // ignore: prefer_const_declarations + Future downloadArchiveWithHttpInfo( + DownloadArchiveDto downloadArchiveDto, { + String? key, + String? slug, + Future? abortTrigger, + }) async { final apiPath = r'/download/archive'; - // ignore: prefer_final_locals Object? postBody = downloadArchiveDto; final queryParams = []; @@ -47,64 +43,58 @@ class DownloadApi { queryParams.addAll(_queryParams('', 'slug', slug)); } - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Download asset archive /// - /// Download a ZIP archive containing the specified assets. The assets must have been previously requested via the \"getDownloadInfo\" endpoint. + /// Download a ZIP archive containing the specified assets. The assets must have been previously requested via the "getDownloadInfo" endpoint. /// - /// Parameters: - /// - /// * [DownloadArchiveDto] downloadArchiveDto (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future downloadArchive(DownloadArchiveDto downloadArchiveDto, { String? key, String? slug, }) async { - final response = await downloadArchiveWithHttpInfo(downloadArchiveDto, key: key, slug: slug, ); + /// Available since server v1.0.0. + Future downloadArchive( + DownloadArchiveDto downloadArchiveDto, { + String? key, + String? slug, + Future? abortTrigger, + }) async { + final response = await downloadArchiveWithHttpInfo( + downloadArchiveDto, + key: key, + slug: slug, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MultipartFile',) as MultipartFile; - - } - return null; + return response.bodyBytes; } /// Retrieve download information /// /// Retrieve information about how to request a download for the specified assets or album. The response includes groups of assets that can be downloaded together. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [DownloadInfoDto] downloadInfoDto (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future getDownloadInfoWithHttpInfo(DownloadInfoDto downloadInfoDto, { String? key, String? slug, }) async { - // ignore: prefer_const_declarations + Future getDownloadInfoWithHttpInfo( + DownloadInfoDto downloadInfoDto, { + String? key, + String? slug, + Future? abortTrigger, + }) async { final apiPath = r'/download/info'; - // ignore: prefer_final_locals Object? postBody = downloadInfoDto; final queryParams = []; @@ -118,17 +108,17 @@ class DownloadApi { queryParams.addAll(_queryParams('', 'slug', slug)); } - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -136,25 +126,26 @@ class DownloadApi { /// /// Retrieve information about how to request a download for the specified assets or album. The response includes groups of assets that can be downloaded together. /// - /// Parameters: - /// - /// * [DownloadInfoDto] downloadInfoDto (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future getDownloadInfo(DownloadInfoDto downloadInfoDto, { String? key, String? slug, }) async { - final response = await getDownloadInfoWithHttpInfo(downloadInfoDto, key: key, slug: slug, ); + /// Available since server v1.0.0. + Future getDownloadInfo( + DownloadInfoDto downloadInfoDto, { + String? key, + String? slug, + Future? abortTrigger, + }) async { + final response = await getDownloadInfoWithHttpInfo( + downloadInfoDto, + key: key, + slug: slug, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'DownloadResponseDto',) as DownloadResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'DownloadResponseDto') + as DownloadResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/duplicates_api.dart b/mobile/openapi/lib/api/duplicates_api.dart index 9bd01281b3..59097008ce 100644 --- a/mobile/openapi/lib/api/duplicates_api.dart +++ b/mobile/openapi/lib/api/duplicates_api.dart @@ -1,101 +1,55 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class DuplicatesApi { DuplicatesApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Dismiss a duplicate group - /// - /// Dismiss a duplicate group by its ID, unlinking all assets in the group without deleting them. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteDuplicateWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/duplicates/{id}' - .replaceAll('{id}', id); + static const ApiVersion deleteDuplicatesAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody; + static const ApiState deleteDuplicatesState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion getAssetDuplicatesAddedIn = .new(1, 0, 0); - const contentTypes = []; + static const ApiState getAssetDuplicatesState = .stable; + static const ApiVersion resolveDuplicatesAddedIn = .new(3, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState resolveDuplicatesState = .alpha; - /// Dismiss a duplicate group - /// - /// Dismiss a duplicate group by its ID, unlinking all assets in the group without deleting them. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteDuplicate(String id,) async { - final response = await deleteDuplicateWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiVersion deleteDuplicateAddedIn = .new(1, 0, 0); + + static const ApiState deleteDuplicateState = .stable; /// Delete duplicates /// /// Delete multiple duplicate assets specified by their IDs. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future deleteDuplicatesWithHttpInfo(BulkIdsDto bulkIdsDto,) async { - // ignore: prefer_const_declarations + Future deleteDuplicatesWithHttpInfo(BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { final apiPath = r'/duplicates'; - // ignore: prefer_final_locals Object? postBody = bulkIdsDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'DELETE', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -103,11 +57,9 @@ class DuplicatesApi { /// /// Delete multiple duplicate assets specified by their IDs. /// - /// Parameters: - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future deleteDuplicates(BulkIdsDto bulkIdsDto,) async { - final response = await deleteDuplicatesWithHttpInfo(bulkIdsDto,); + /// Available since server v1.0.0. + Future deleteDuplicates(BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { + final response = await deleteDuplicatesWithHttpInfo(bulkIdsDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } @@ -117,12 +69,12 @@ class DuplicatesApi { /// /// Retrieve a list of duplicate assets available to the authenticated user. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getAssetDuplicatesWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getAssetDuplicatesWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/duplicates'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -131,70 +83,67 @@ class DuplicatesApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Retrieve duplicates /// /// Retrieve a list of duplicate assets available to the authenticated user. - Future?> getAssetDuplicates() async { - final response = await getAssetDuplicatesWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future> getAssetDuplicates({Future? abortTrigger}) async { + final response = await getAssetDuplicatesWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Resolve duplicate groups /// /// Resolve duplicate groups by synchronizing metadata across assets and deleting/trashing duplicates. /// + /// Available since server v3.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [DuplicateResolveDto] duplicateResolveDto (required): - Future resolveDuplicatesWithHttpInfo(DuplicateResolveDto duplicateResolveDto,) async { - // ignore: prefer_const_declarations + Future resolveDuplicatesWithHttpInfo( + DuplicateResolveDto duplicateResolveDto, { + Future? abortTrigger, + }) async { final apiPath = r'/duplicates/resolve'; - // ignore: prefer_final_locals Object? postBody = duplicateResolveDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -202,24 +151,63 @@ class DuplicatesApi { /// /// Resolve duplicate groups by synchronizing metadata across assets and deleting/trashing duplicates. /// - /// Parameters: - /// - /// * [DuplicateResolveDto] duplicateResolveDto (required): - Future?> resolveDuplicates(DuplicateResolveDto duplicateResolveDto,) async { - final response = await resolveDuplicatesWithHttpInfo(duplicateResolveDto,); + /// Available since server v3.0.0. + Future> resolveDuplicates( + DuplicateResolveDto duplicateResolveDto, { + Future? abortTrigger, + }) async { + final response = await resolveDuplicatesWithHttpInfo(duplicateResolveDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Dismiss a duplicate group + /// + /// Dismiss a duplicate group by its ID, unlinking all assets in the group without deleting them. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteDuplicateWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/duplicates/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Dismiss a duplicate group + /// + /// Dismiss a duplicate group by its ID, unlinking all assets in the group without deleting them. + /// + /// Available since server v1.0.0. + Future deleteDuplicate(String id, {Future? abortTrigger}) async { + final response = await deleteDuplicateWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - return null; } } diff --git a/mobile/openapi/lib/api/faces_api.dart b/mobile/openapi/lib/api/faces_api.dart index 43d63b47b9..4104c1d56b 100644 --- a/mobile/openapi/lib/api/faces_api.dart +++ b/mobile/openapi/lib/api/faces_api.dart @@ -1,156 +1,57 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class FacesApi { FacesApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Create a face - /// - /// Create a new face that has not been discovered by facial recognition. The content of the bounding box is considered a face. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [AssetFaceCreateDto] assetFaceCreateDto (required): - Future createFaceWithHttpInfo(AssetFaceCreateDto assetFaceCreateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/faces'; + static const ApiVersion getFacesAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody = assetFaceCreateDto; + static const ApiState getFacesState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion createFaceAddedIn = .new(1, 0, 0); - const contentTypes = ['application/json']; + static const ApiState createFaceState = .stable; + static const ApiVersion deleteFaceAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState deleteFaceState = .stable; - /// Create a face - /// - /// Create a new face that has not been discovered by facial recognition. The content of the bounding box is considered a face. - /// - /// Parameters: - /// - /// * [AssetFaceCreateDto] assetFaceCreateDto (required): - Future createFace(AssetFaceCreateDto assetFaceCreateDto,) async { - final response = await createFaceWithHttpInfo(assetFaceCreateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiVersion reassignFacesByIdAddedIn = .new(1, 0, 0); - /// Delete a face - /// - /// Delete a face identified by the id. Optionally can be force deleted. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetFaceDeleteDto] assetFaceDeleteDto (required): - Future deleteFaceWithHttpInfo(String id, AssetFaceDeleteDto assetFaceDeleteDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/faces/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = assetFaceDeleteDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Delete a face - /// - /// Delete a face identified by the id. Optionally can be force deleted. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetFaceDeleteDto] assetFaceDeleteDto (required): - Future deleteFace(String id, AssetFaceDeleteDto assetFaceDeleteDto,) async { - final response = await deleteFaceWithHttpInfo(id, assetFaceDeleteDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiState reassignFacesByIdState = .stable; /// Retrieve faces for asset /// /// Retrieve all faces belonging to an asset. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// Face ID - Future getFacesWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations + Future getFacesWithHttpInfo({required String id, Future? abortTrigger}) async { final apiPath = r'/faces'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - queryParams.addAll(_queryParams('', 'id', id)); + queryParams.addAll(_queryParams('', 'id', id)); const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -158,62 +59,136 @@ class FacesApi { /// /// Retrieve all faces belonging to an asset. /// - /// Parameters: - /// - /// * [String] id (required): - /// Face ID - Future?> getFaces(String id,) async { - final response = await getFacesWithHttpInfo(id,); + /// Available since server v1.0.0. + Future> getFaces({required String id, Future? abortTrigger}) async { + final response = await getFacesWithHttpInfo(id: id, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Create a face + /// + /// Create a new face that has not been discovered by facial recognition. The content of the bounding box is considered a face. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future createFaceWithHttpInfo(AssetFaceCreateDto assetFaceCreateDto, {Future? abortTrigger}) async { + final apiPath = r'/faces'; + + Object? postBody = assetFaceCreateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Create a face + /// + /// Create a new face that has not been discovered by facial recognition. The content of the bounding box is considered a face. + /// + /// Available since server v1.0.0. + Future createFace(AssetFaceCreateDto assetFaceCreateDto, {Future? abortTrigger}) async { + final response = await createFaceWithHttpInfo(assetFaceCreateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Delete a face + /// + /// Delete a face identified by the id. Optionally can be force deleted. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteFaceWithHttpInfo( + String id, + AssetFaceDeleteDto assetFaceDeleteDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/faces/{id}'.replaceAll('{id}', id); + + Object? postBody = assetFaceDeleteDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete a face + /// + /// Delete a face identified by the id. Optionally can be force deleted. + /// + /// Available since server v1.0.0. + Future deleteFace(String id, AssetFaceDeleteDto assetFaceDeleteDto, {Future? abortTrigger}) async { + final response = await deleteFaceWithHttpInfo(id, assetFaceDeleteDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - return null; } /// Re-assign a face to another person /// /// Re-assign the face provided in the body to the person identified by the id in the path parameter. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [FaceDto] faceDto (required): - Future reassignFacesByIdWithHttpInfo(String id, FaceDto faceDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/faces/{id}' - .replaceAll('{id}', id); + Future reassignFacesByIdWithHttpInfo(String id, FaceDto faceDto, {Future? abortTrigger}) async { + final apiPath = r'/faces/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = faceDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -221,23 +196,16 @@ class FacesApi { /// /// Re-assign the face provided in the body to the person identified by the id in the path parameter. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [FaceDto] faceDto (required): - Future reassignFacesById(String id, FaceDto faceDto,) async { - final response = await reassignFacesByIdWithHttpInfo(id, faceDto,); + /// Available since server v1.0.0. + Future reassignFacesById(String id, FaceDto faceDto, {Future? abortTrigger}) async { + final response = await reassignFacesByIdWithHttpInfo(id, faceDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'PersonResponseDto',) as PersonResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'PersonResponseDto') + as PersonResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/jobs_api.dart b/mobile/openapi/lib/api/jobs_api.dart index 9dda59a883..25dbb3ecf2 100644 --- a/mobile/openapi/lib/api/jobs_api.dart +++ b/mobile/openapi/lib/api/jobs_api.dart @@ -1,79 +1,39 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class JobsApi { JobsApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Create a manual job - /// - /// Run a specific job. Most jobs are queued automatically, but this endpoint allows for manual creation of a handful of jobs, including various cleanup tasks, as well as creating a new database backup. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [JobCreateDto] jobCreateDto (required): - Future createJobWithHttpInfo(JobCreateDto jobCreateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/jobs'; + static const ApiVersion getQueuesLegacyAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody = jobCreateDto; + static const ApiVersion getQueuesLegacyDeprecatedIn = .new(2, 4, 0); - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiState getQueuesLegacyState = .deprecated; - const contentTypes = ['application/json']; + static const ApiVersion createJobAddedIn = .new(1, 0, 0); + static const ApiState createJobState = .stable; - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiVersion runQueueCommandLegacyAddedIn = .new(1, 0, 0); - /// Create a manual job - /// - /// Run a specific job. Most jobs are queued automatically, but this endpoint allows for manual creation of a handful of jobs, including various cleanup tasks, as well as creating a new database backup. - /// - /// Parameters: - /// - /// * [JobCreateDto] jobCreateDto (required): - Future createJob(JobCreateDto jobCreateDto,) async { - final response = await createJobWithHttpInfo(jobCreateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiVersion runQueueCommandLegacyDeprecatedIn = .new(2, 4, 0); + + static const ApiState runQueueCommandLegacyState = .deprecated; /// Retrieve queue counts and status /// /// Retrieve the counts of the current queue, as well as the current status. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getQueuesLegacyWithHttpInfo() async { - // ignore: prefer_const_declarations + @Deprecated('Deprecated by the Immich server API since v2.4.0.') + Future getQueuesLegacyWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/jobs'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -82,70 +42,110 @@ class JobsApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Retrieve queue counts and status /// /// Retrieve the counts of the current queue, as well as the current status. - Future getQueuesLegacy() async { - final response = await getQueuesLegacyWithHttpInfo(); + /// + /// Available since server v1.0.0. + @Deprecated('Deprecated by the Immich server API since v2.4.0.') + Future getQueuesLegacy({Future? abortTrigger}) async { + final response = await getQueuesLegacyWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'QueuesResponseLegacyDto',) as QueuesResponseLegacyDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'QueuesResponseLegacyDto') + as QueuesResponseLegacyDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Create a manual job + /// + /// Run a specific job. Most jobs are queued automatically, but this endpoint allows for manual creation of a handful of jobs, including various cleanup tasks, as well as creating a new database backup. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future createJobWithHttpInfo(JobCreateDto jobCreateDto, {Future? abortTrigger}) async { + final apiPath = r'/jobs'; + + Object? postBody = jobCreateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Create a manual job + /// + /// Run a specific job. Most jobs are queued automatically, but this endpoint allows for manual creation of a handful of jobs, including various cleanup tasks, as well as creating a new database backup. + /// + /// Available since server v1.0.0. + Future createJob(JobCreateDto jobCreateDto, {Future? abortTrigger}) async { + final response = await createJobWithHttpInfo(jobCreateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - return null; } /// Run jobs /// /// Queue all assets for a specific job type. Defaults to only queueing assets that have not yet been processed, but the force command can be used to re-process all assets. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [QueueName] name (required): - /// - /// * [QueueCommandDto] queueCommandDto (required): - Future runQueueCommandLegacyWithHttpInfo(QueueName name, QueueCommandDto queueCommandDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/jobs/{name}' - .replaceAll('{name}', name.toString()); + @Deprecated('Deprecated by the Immich server API since v2.4.0.') + Future runQueueCommandLegacyWithHttpInfo( + QueueName name, + QueueCommandDto queueCommandDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/jobs/{name}'.replaceAll('{name}', parameterToString(name)); - // ignore: prefer_final_locals Object? postBody = queueCommandDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -153,23 +153,21 @@ class JobsApi { /// /// Queue all assets for a specific job type. Defaults to only queueing assets that have not yet been processed, but the force command can be used to re-process all assets. /// - /// Parameters: - /// - /// * [QueueName] name (required): - /// - /// * [QueueCommandDto] queueCommandDto (required): - Future runQueueCommandLegacy(QueueName name, QueueCommandDto queueCommandDto,) async { - final response = await runQueueCommandLegacyWithHttpInfo(name, queueCommandDto,); + /// Available since server v1.0.0. + @Deprecated('Deprecated by the Immich server API since v2.4.0.') + Future runQueueCommandLegacy( + QueueName name, + QueueCommandDto queueCommandDto, { + Future? abortTrigger, + }) async { + final response = await runQueueCommandLegacyWithHttpInfo(name, queueCommandDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'QueueResponseLegacyDto',) as QueueResponseLegacyDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'QueueResponseLegacyDto') + as QueueResponseLegacyDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/libraries_api.dart b/mobile/openapi/lib/api/libraries_api.dart index ca59f823fe..021b825d36 100644 --- a/mobile/openapi/lib/api/libraries_api.dart +++ b/mobile/openapi/lib/api/libraries_api.dart @@ -1,52 +1,120 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class LibrariesApi { LibrariesApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion getAllLibrariesAddedIn = .new(1, 0, 0); + + static const ApiState getAllLibrariesState = .stable; + + static const ApiVersion createLibraryAddedIn = .new(1, 0, 0); + + static const ApiState createLibraryState = .stable; + + static const ApiVersion deleteLibraryAddedIn = .new(1, 0, 0); + + static const ApiState deleteLibraryState = .stable; + + static const ApiVersion getLibraryAddedIn = .new(1, 0, 0); + + static const ApiState getLibraryState = .stable; + + static const ApiVersion updateLibraryAddedIn = .new(1, 0, 0); + + static const ApiState updateLibraryState = .stable; + + static const ApiVersion scanLibraryAddedIn = .new(1, 0, 0); + + static const ApiState scanLibraryState = .stable; + + static const ApiVersion getLibraryStatisticsAddedIn = .new(1, 0, 0); + + static const ApiState getLibraryStatisticsState = .stable; + + static const ApiVersion validateAddedIn = .new(1, 0, 0); + + static const ApiState validateState = .stable; + + /// Retrieve libraries + /// + /// Retrieve a list of external libraries. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getAllLibrariesWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/libraries'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve libraries + /// + /// Retrieve a list of external libraries. + /// + /// Available since server v1.0.0. + Future> getAllLibraries({Future? abortTrigger}) async { + final response = await getAllLibrariesWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + /// Create a library /// /// Create a new external library. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [CreateLibraryDto] createLibraryDto (required): - Future createLibraryWithHttpInfo(CreateLibraryDto createLibraryDto,) async { - // ignore: prefer_const_declarations + Future createLibraryWithHttpInfo(CreateLibraryDto createLibraryDto, {Future? abortTrigger}) async { final apiPath = r'/libraries'; - // ignore: prefer_final_locals Object? postBody = createLibraryDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -54,39 +122,29 @@ class LibrariesApi { /// /// Create a new external library. /// - /// Parameters: - /// - /// * [CreateLibraryDto] createLibraryDto (required): - Future createLibrary(CreateLibraryDto createLibraryDto,) async { - final response = await createLibraryWithHttpInfo(createLibraryDto,); + /// Available since server v1.0.0. + Future createLibrary(CreateLibraryDto createLibraryDto, {Future? abortTrigger}) async { + final response = await createLibraryWithHttpInfo(createLibraryDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LibraryResponseDto',) as LibraryResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'LibraryResponseDto') + as LibraryResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Delete a library /// /// Delete an external library by its ID. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteLibraryWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/libraries/{id}' - .replaceAll('{id}', id); + Future deleteLibraryWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/libraries/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -95,15 +153,15 @@ class LibrariesApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'DELETE', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -111,82 +169,24 @@ class LibrariesApi { /// /// Delete an external library by its ID. /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteLibrary(String id,) async { - final response = await deleteLibraryWithHttpInfo(id,); + /// Available since server v1.0.0. + Future deleteLibrary(String id, {Future? abortTrigger}) async { + final response = await deleteLibraryWithHttpInfo(id, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } - /// Retrieve libraries - /// - /// Retrieve a list of external libraries. - /// - /// Note: This method returns the HTTP [Response]. - Future getAllLibrariesWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/libraries'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve libraries - /// - /// Retrieve a list of external libraries. - Future?> getAllLibraries() async { - final response = await getAllLibrariesWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - /// Retrieve a library /// /// Retrieve an external library by its ID. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getLibraryWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/libraries/{id}' - .replaceAll('{id}', id); + Future getLibraryWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/libraries/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -195,15 +195,15 @@ class LibrariesApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -211,164 +211,50 @@ class LibrariesApi { /// /// Retrieve an external library by its ID. /// - /// Parameters: - /// - /// * [String] id (required): - Future getLibrary(String id,) async { - final response = await getLibraryWithHttpInfo(id,); + /// Available since server v1.0.0. + Future getLibrary(String id, {Future? abortTrigger}) async { + final response = await getLibraryWithHttpInfo(id, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LibraryResponseDto',) as LibraryResponseDto; - - } - return null; - } - - /// Retrieve library statistics - /// - /// Retrieve statistics for a specific external library, including number of videos, images, and storage usage. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getLibraryStatisticsWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/libraries/{id}/statistics' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve library statistics - /// - /// Retrieve statistics for a specific external library, including number of videos, images, and storage usage. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getLibraryStatistics(String id,) async { - final response = await getLibraryStatisticsWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LibraryStatsResponseDto',) as LibraryStatsResponseDto; - - } - return null; - } - - /// Scan a library - /// - /// Queue a scan for the external library to find and import new assets. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future scanLibraryWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/libraries/{id}/scan' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Scan a library - /// - /// Queue a scan for the external library to find and import new assets. - /// - /// Parameters: - /// - /// * [String] id (required): - Future scanLibrary(String id,) async { - final response = await scanLibraryWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'LibraryResponseDto') + as LibraryResponseDto; } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update a library /// /// Update an existing external library. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UpdateLibraryDto] updateLibraryDto (required): - Future updateLibraryWithHttpInfo(String id, UpdateLibraryDto updateLibraryDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/libraries/{id}' - .replaceAll('{id}', id); + Future updateLibraryWithHttpInfo( + String id, + UpdateLibraryDto updateLibraryDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/libraries/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = updateLibraryDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -376,60 +262,143 @@ class LibrariesApi { /// /// Update an existing external library. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UpdateLibraryDto] updateLibraryDto (required): - Future updateLibrary(String id, UpdateLibraryDto updateLibraryDto,) async { - final response = await updateLibraryWithHttpInfo(id, updateLibraryDto,); + /// Available since server v1.0.0. + Future updateLibrary( + String id, + UpdateLibraryDto updateLibraryDto, { + Future? abortTrigger, + }) async { + final response = await updateLibraryWithHttpInfo(id, updateLibraryDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LibraryResponseDto',) as LibraryResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'LibraryResponseDto') + as LibraryResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Scan a library + /// + /// Queue a scan for the external library to find and import new assets. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future scanLibraryWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/libraries/{id}/scan'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Scan a library + /// + /// Queue a scan for the external library to find and import new assets. + /// + /// Available since server v1.0.0. + Future scanLibrary(String id, {Future? abortTrigger}) async { + final response = await scanLibraryWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve library statistics + /// + /// Retrieve statistics for a specific external library, including number of videos, images, and storage usage. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getLibraryStatisticsWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/libraries/{id}/statistics'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve library statistics + /// + /// Retrieve statistics for a specific external library, including number of videos, images, and storage usage. + /// + /// Available since server v1.0.0. + Future getLibraryStatistics(String id, {Future? abortTrigger}) async { + final response = await getLibraryStatisticsWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'LibraryStatsResponseDto') + as LibraryStatsResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Validate library settings /// /// Validate the settings of an external library. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [ValidateLibraryDto] validateLibraryDto (required): - Future validateWithHttpInfo(String id, ValidateLibraryDto validateLibraryDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/libraries/{id}/validate' - .replaceAll('{id}', id); + Future validateWithHttpInfo( + String id, + ValidateLibraryDto validateLibraryDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/libraries/{id}/validate'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = validateLibraryDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -437,23 +406,20 @@ class LibrariesApi { /// /// Validate the settings of an external library. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [ValidateLibraryDto] validateLibraryDto (required): - Future validate(String id, ValidateLibraryDto validateLibraryDto,) async { - final response = await validateWithHttpInfo(id, validateLibraryDto,); + /// Available since server v1.0.0. + Future validate( + String id, + ValidateLibraryDto validateLibraryDto, { + Future? abortTrigger, + }) async { + final response = await validateWithHttpInfo(id, validateLibraryDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ValidateLibraryResponseDto',) as ValidateLibraryResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ValidateLibraryResponseDto') + as ValidateLibraryResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/maintenance_admin_api.dart b/mobile/openapi/lib/api/maintenance_admin_api.dart index 0f953f1634..27e7d359bb 100644 --- a/mobile/openapi/lib/api/maintenance_admin_api.dart +++ b/mobile/openapi/lib/api/maintenance_admin_api.dart @@ -1,204 +1,58 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class MaintenanceAdminApi { MaintenanceAdminApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Detect existing install - /// - /// Collect integrity checks and other heuristics about local data. - /// - /// Note: This method returns the HTTP [Response]. - Future detectPriorInstallWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/maintenance/detect-install'; + static const ApiVersion setMaintenanceModeAddedIn = .new(2, 3, 0); - // ignore: prefer_final_locals - Object? postBody; + static const ApiState setMaintenanceModeState = .alpha; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion detectPriorInstallAddedIn = .new(2, 5, 0); - const contentTypes = []; + static const ApiState detectPriorInstallState = .alpha; + static const ApiVersion maintenanceLoginAddedIn = .new(2, 3, 0); - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState maintenanceLoginState = .alpha; - /// Detect existing install - /// - /// Collect integrity checks and other heuristics about local data. - Future detectPriorInstall() async { - final response = await detectPriorInstallWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MaintenanceDetectInstallResponseDto',) as MaintenanceDetectInstallResponseDto; - - } - return null; - } + static const ApiVersion getMaintenanceStatusAddedIn = .new(2, 5, 0); - /// Get maintenance mode status - /// - /// Fetch information about the currently running maintenance action. - /// - /// Note: This method returns the HTTP [Response]. - Future getMaintenanceStatusWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/maintenance/status'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get maintenance mode status - /// - /// Fetch information about the currently running maintenance action. - Future getMaintenanceStatus() async { - final response = await getMaintenanceStatusWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MaintenanceStatusResponseDto',) as MaintenanceStatusResponseDto; - - } - return null; - } - - /// Log into maintenance mode - /// - /// Login with maintenance token or cookie to receive current information and perform further actions. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [MaintenanceLoginDto] maintenanceLoginDto (required): - Future maintenanceLoginWithHttpInfo(MaintenanceLoginDto maintenanceLoginDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/maintenance/login'; - - // ignore: prefer_final_locals - Object? postBody = maintenanceLoginDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Log into maintenance mode - /// - /// Login with maintenance token or cookie to receive current information and perform further actions. - /// - /// Parameters: - /// - /// * [MaintenanceLoginDto] maintenanceLoginDto (required): - Future maintenanceLogin(MaintenanceLoginDto maintenanceLoginDto,) async { - final response = await maintenanceLoginWithHttpInfo(maintenanceLoginDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MaintenanceAuthDto',) as MaintenanceAuthDto; - - } - return null; - } + static const ApiState getMaintenanceStatusState = .alpha; /// Set maintenance mode /// /// Put Immich into or take it out of maintenance mode /// + /// Available since server v2.3.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SetMaintenanceModeDto] setMaintenanceModeDto (required): - Future setMaintenanceModeWithHttpInfo(SetMaintenanceModeDto setMaintenanceModeDto,) async { - // ignore: prefer_const_declarations + Future setMaintenanceModeWithHttpInfo( + SetMaintenanceModeDto setMaintenanceModeDto, { + Future? abortTrigger, + }) async { final apiPath = r'/admin/maintenance'; - // ignore: prefer_final_locals Object? postBody = setMaintenanceModeDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -206,13 +60,158 @@ class MaintenanceAdminApi { /// /// Put Immich into or take it out of maintenance mode /// - /// Parameters: - /// - /// * [SetMaintenanceModeDto] setMaintenanceModeDto (required): - Future setMaintenanceMode(SetMaintenanceModeDto setMaintenanceModeDto,) async { - final response = await setMaintenanceModeWithHttpInfo(setMaintenanceModeDto,); + /// Available since server v2.3.0. + Future setMaintenanceMode(SetMaintenanceModeDto setMaintenanceModeDto, {Future? abortTrigger}) async { + final response = await setMaintenanceModeWithHttpInfo(setMaintenanceModeDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } + + /// Detect existing install + /// + /// Collect integrity checks and other heuristics about local data. + /// + /// Available since server v2.5.0. + /// + /// Note: This method returns the HTTP [Response]. + Future detectPriorInstallWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/admin/maintenance/detect-install'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Detect existing install + /// + /// Collect integrity checks and other heuristics about local data. + /// + /// Available since server v2.5.0. + Future detectPriorInstall({Future? abortTrigger}) async { + final response = await detectPriorInstallWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'MaintenanceDetectInstallResponseDto') + as MaintenanceDetectInstallResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Log into maintenance mode + /// + /// Login with maintenance token or cookie to receive current information and perform further actions. + /// + /// Available since server v2.3.0. + /// + /// Note: This method returns the HTTP [Response]. + Future maintenanceLoginWithHttpInfo( + MaintenanceLoginDto maintenanceLoginDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/admin/maintenance/login'; + + Object? postBody = maintenanceLoginDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Log into maintenance mode + /// + /// Login with maintenance token or cookie to receive current information and perform further actions. + /// + /// Available since server v2.3.0. + Future maintenanceLogin( + MaintenanceLoginDto maintenanceLoginDto, { + Future? abortTrigger, + }) async { + final response = await maintenanceLoginWithHttpInfo(maintenanceLoginDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'MaintenanceAuthDto') + as MaintenanceAuthDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get maintenance mode status + /// + /// Fetch information about the currently running maintenance action. + /// + /// Available since server v2.5.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getMaintenanceStatusWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/admin/maintenance/status'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get maintenance mode status + /// + /// Fetch information about the currently running maintenance action. + /// + /// Available since server v2.5.0. + Future getMaintenanceStatus({Future? abortTrigger}) async { + final response = await getMaintenanceStatusWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'MaintenanceStatusResponseDto') + as MaintenanceStatusResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } } diff --git a/mobile/openapi/lib/api/map_api.dart b/mobile/openapi/lib/api/map_api.dart index 4ce62bd96c..294cc4c3f5 100644 --- a/mobile/openapi/lib/api/map_api.dart +++ b/mobile/openapi/lib/api/map_api.dart @@ -1,51 +1,38 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class MapApi { MapApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion getMapMarkersAddedIn = .new(1, 0, 0); + + static const ApiState getMapMarkersState = .stable; + + static const ApiVersion reverseGeocodeAddedIn = .new(1, 0, 0); + + static const ApiState reverseGeocodeState = .stable; + /// Retrieve map markers /// /// Retrieve a list of latitude and longitude coordinates for every asset with location data. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [DateTime] fileCreatedAfter: - /// Filter assets created after this date - /// - /// * [DateTime] fileCreatedBefore: - /// Filter assets created before this date - /// - /// * [bool] isArchived: - /// Filter by archived status - /// - /// * [bool] isFavorite: - /// Filter by favorite status - /// - /// * [bool] withPartners: - /// Include partner assets - /// - /// * [bool] withSharedAlbums: - /// Include shared album assets - Future getMapMarkersWithHttpInfo({ DateTime? fileCreatedAfter, DateTime? fileCreatedBefore, bool? isArchived, bool? isFavorite, bool? withPartners, bool? withSharedAlbums, }) async { - // ignore: prefer_const_declarations + Future getMapMarkersWithHttpInfo({ + DateTime? fileCreatedAfter, + DateTime? fileCreatedBefore, + bool? isArchived, + bool? isFavorite, + bool? withPartners, + bool? withSharedAlbums, + Future? abortTrigger, + }) async { final apiPath = r'/map/markers'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -73,15 +60,15 @@ class MapApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -89,81 +76,71 @@ class MapApi { /// /// Retrieve a list of latitude and longitude coordinates for every asset with location data. /// - /// Parameters: - /// - /// * [DateTime] fileCreatedAfter: - /// Filter assets created after this date - /// - /// * [DateTime] fileCreatedBefore: - /// Filter assets created before this date - /// - /// * [bool] isArchived: - /// Filter by archived status - /// - /// * [bool] isFavorite: - /// Filter by favorite status - /// - /// * [bool] withPartners: - /// Include partner assets - /// - /// * [bool] withSharedAlbums: - /// Include shared album assets - Future?> getMapMarkers({ DateTime? fileCreatedAfter, DateTime? fileCreatedBefore, bool? isArchived, bool? isFavorite, bool? withPartners, bool? withSharedAlbums, }) async { - final response = await getMapMarkersWithHttpInfo( fileCreatedAfter: fileCreatedAfter, fileCreatedBefore: fileCreatedBefore, isArchived: isArchived, isFavorite: isFavorite, withPartners: withPartners, withSharedAlbums: withSharedAlbums, ); + /// Available since server v1.0.0. + Future> getMapMarkers({ + DateTime? fileCreatedAfter, + DateTime? fileCreatedBefore, + bool? isArchived, + bool? isFavorite, + bool? withPartners, + bool? withSharedAlbums, + Future? abortTrigger, + }) async { + final response = await getMapMarkersWithHttpInfo( + fileCreatedAfter: fileCreatedAfter, + fileCreatedBefore: fileCreatedBefore, + isArchived: isArchived, + isFavorite: isFavorite, + withPartners: withPartners, + withSharedAlbums: withSharedAlbums, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Reverse geocode coordinates /// /// Retrieve location information (e.g., city, country) for given latitude and longitude coordinates. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [double] lat (required): - /// Latitude (-90 to 90) - /// - /// * [double] lon (required): - /// Longitude (-180 to 180) - Future reverseGeocodeWithHttpInfo(double lat, double lon,) async { - // ignore: prefer_const_declarations + Future reverseGeocodeWithHttpInfo({ + required double lat, + required double lon, + Future? abortTrigger, + }) async { final apiPath = r'/map/reverse-geocode'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - queryParams.addAll(_queryParams('', 'lat', lat)); - queryParams.addAll(_queryParams('', 'lon', lon)); + queryParams.addAll(_queryParams('', 'lat', lat)); + queryParams.addAll(_queryParams('', 'lon', lon)); const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -171,28 +148,22 @@ class MapApi { /// /// Retrieve location information (e.g., city, country) for given latitude and longitude coordinates. /// - /// Parameters: - /// - /// * [double] lat (required): - /// Latitude (-90 to 90) - /// - /// * [double] lon (required): - /// Longitude (-180 to 180) - Future?> reverseGeocode(double lat, double lon,) async { - final response = await reverseGeocodeWithHttpInfo(lat, lon,); + /// Available since server v1.0.0. + Future> reverseGeocode({ + required double lat, + required double lon, + Future? abortTrigger, + }) async { + final response = await reverseGeocodeWithHttpInfo(lat: lat, lon: lon, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/memories_api.dart b/mobile/openapi/lib/api/memories_api.dart index 0cd96ac442..f4ae6625b5 100644 --- a/mobile/openapi/lib/api/memories_api.dart +++ b/mobile/openapi/lib/api/memories_api.dart @@ -1,116 +1,163 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class MemoriesApi { MemoriesApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Add assets to a memory + static const ApiVersion searchMemoriesAddedIn = .new(1, 0, 0); + + static const ApiState searchMemoriesState = .stable; + + static const ApiVersion createMemoryAddedIn = .new(1, 0, 0); + + static const ApiState createMemoryState = .stable; + + static const ApiVersion memoriesStatisticsAddedIn = .new(1, 0, 0); + + static const ApiState memoriesStatisticsState = .stable; + + static const ApiVersion deleteMemoryAddedIn = .new(1, 0, 0); + + static const ApiState deleteMemoryState = .stable; + + static const ApiVersion getMemoryAddedIn = .new(1, 0, 0); + + static const ApiState getMemoryState = .stable; + + static const ApiVersion updateMemoryAddedIn = .new(1, 0, 0); + + static const ApiState updateMemoryState = .stable; + + static const ApiVersion removeMemoryAssetsAddedIn = .new(1, 0, 0); + + static const ApiState removeMemoryAssetsState = .stable; + + static const ApiVersion addMemoryAssetsAddedIn = .new(1, 0, 0); + + static const ApiState addMemoryAssetsState = .stable; + + /// Retrieve memories /// - /// Add a list of asset IDs to a specific memory. + /// Retrieve a list of memories. Memories are sorted descending by creation date by default, although they can also be sorted in ascending order, or randomly. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future addMemoryAssetsWithHttpInfo(String id, BulkIdsDto bulkIdsDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/memories/{id}/assets' - .replaceAll('{id}', id); + Future searchMemoriesWithHttpInfo({ + DateTime? for$, + bool? isSaved, + bool? isTrashed, + MemorySearchOrder? order, + int? size, + MemoryType? type, + Future? abortTrigger, + }) async { + final apiPath = r'/memories'; - // ignore: prefer_final_locals - Object? postBody = bulkIdsDto; + Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; + if (for$ != null) { + queryParams.addAll(_queryParams('', 'for', for$)); + } + if (isSaved != null) { + queryParams.addAll(_queryParams('', 'isSaved', isSaved)); + } + if (isTrashed != null) { + queryParams.addAll(_queryParams('', 'isTrashed', isTrashed)); + } + if (order != null) { + queryParams.addAll(_queryParams('', 'order', order)); + } + if (size != null) { + queryParams.addAll(_queryParams('', 'size', size)); + } + if (type != null) { + queryParams.addAll(_queryParams('', 'type', type)); + } + const contentTypes = []; return apiClient.invokeAPI( apiPath, - 'PUT', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// Add assets to a memory + /// Retrieve memories /// - /// Add a list of asset IDs to a specific memory. + /// Retrieve a list of memories. Memories are sorted descending by creation date by default, although they can also be sorted in ascending order, or randomly. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future?> addMemoryAssets(String id, BulkIdsDto bulkIdsDto,) async { - final response = await addMemoryAssetsWithHttpInfo(id, bulkIdsDto,); + /// Available since server v1.0.0. + Future> searchMemories({ + DateTime? for$, + bool? isSaved, + bool? isTrashed, + MemorySearchOrder? order, + int? size, + MemoryType? type, + Future? abortTrigger, + }) async { + final response = await searchMemoriesWithHttpInfo( + for$: for$, + isSaved: isSaved, + isTrashed: isTrashed, + order: order, + size: size, + type: type, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Create a memory /// /// Create a new memory by providing a name, description, and a list of asset IDs to include in the memory. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [MemoryCreateDto] memoryCreateDto (required): - Future createMemoryWithHttpInfo(MemoryCreateDto memoryCreateDto,) async { - // ignore: prefer_const_declarations + Future createMemoryWithHttpInfo(MemoryCreateDto memoryCreateDto, {Future? abortTrigger}) async { final apiPath = r'/memories'; - // ignore: prefer_final_locals Object? postBody = memoryCreateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -118,166 +165,45 @@ class MemoriesApi { /// /// Create a new memory by providing a name, description, and a list of asset IDs to include in the memory. /// - /// Parameters: - /// - /// * [MemoryCreateDto] memoryCreateDto (required): - Future createMemory(MemoryCreateDto memoryCreateDto,) async { - final response = await createMemoryWithHttpInfo(memoryCreateDto,); + /// Available since server v1.0.0. + Future createMemory(MemoryCreateDto memoryCreateDto, {Future? abortTrigger}) async { + final response = await createMemoryWithHttpInfo(memoryCreateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MemoryResponseDto',) as MemoryResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'MemoryResponseDto') + as MemoryResponseDto; } - return null; - } - - /// Delete a memory - /// - /// Delete a specific memory by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteMemoryWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/memories/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Delete a memory - /// - /// Delete a specific memory by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteMemory(String id,) async { - final response = await deleteMemoryWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Retrieve a memory - /// - /// Retrieve a specific memory by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getMemoryWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/memories/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve a memory - /// - /// Retrieve a specific memory by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getMemory(String id,) async { - final response = await getMemoryWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MemoryResponseDto',) as MemoryResponseDto; - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Retrieve memories statistics /// /// Retrieve statistics about memories, such as total count and other relevant metrics. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [DateTime] for_: - /// Filter by date - /// - /// * [bool] isSaved: - /// Filter by saved status - /// - /// * [bool] isTrashed: - /// Include trashed memories - /// - /// * [MemorySearchOrder] order: - /// - /// * [int] size: - /// Number of memories to return - /// - /// * [MemoryType] type: - Future memoriesStatisticsWithHttpInfo({ DateTime? for_, bool? isSaved, bool? isTrashed, MemorySearchOrder? order, int? size, MemoryType? type, }) async { - // ignore: prefer_const_declarations + Future memoriesStatisticsWithHttpInfo({ + DateTime? for$, + bool? isSaved, + bool? isTrashed, + MemorySearchOrder? order, + int? size, + MemoryType? type, + Future? abortTrigger, + }) async { final apiPath = r'/memories/statistics'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - if (for_ != null) { - queryParams.addAll(_queryParams('', 'for', for_)); + if (for$ != null) { + queryParams.addAll(_queryParams('', 'for', for$)); } if (isSaved != null) { queryParams.addAll(_queryParams('', 'isSaved', isSaved)); @@ -297,15 +223,15 @@ class MemoriesApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -313,242 +239,155 @@ class MemoriesApi { /// /// Retrieve statistics about memories, such as total count and other relevant metrics. /// - /// Parameters: - /// - /// * [DateTime] for_: - /// Filter by date - /// - /// * [bool] isSaved: - /// Filter by saved status - /// - /// * [bool] isTrashed: - /// Include trashed memories - /// - /// * [MemorySearchOrder] order: - /// - /// * [int] size: - /// Number of memories to return - /// - /// * [MemoryType] type: - Future memoriesStatistics({ DateTime? for_, bool? isSaved, bool? isTrashed, MemorySearchOrder? order, int? size, MemoryType? type, }) async { - final response = await memoriesStatisticsWithHttpInfo( for_: for_, isSaved: isSaved, isTrashed: isTrashed, order: order, size: size, type: type, ); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MemoryStatisticsResponseDto',) as MemoryStatisticsResponseDto; - - } - return null; - } - - /// Remove assets from a memory - /// - /// Remove a list of asset IDs from a specific memory. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future removeMemoryAssetsWithHttpInfo(String id, BulkIdsDto bulkIdsDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/memories/{id}/assets' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = bulkIdsDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, + /// Available since server v1.0.0. + Future memoriesStatistics({ + DateTime? for$, + bool? isSaved, + bool? isTrashed, + MemorySearchOrder? order, + int? size, + MemoryType? type, + Future? abortTrigger, + }) async { + final response = await memoriesStatisticsWithHttpInfo( + for$: for$, + isSaved: isSaved, + isTrashed: isTrashed, + order: order, + size: size, + type: type, + abortTrigger: abortTrigger, ); - } - - /// Remove assets from a memory - /// - /// Remove a list of asset IDs from a specific memory. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future?> removeMemoryAssets(String id, BulkIdsDto bulkIdsDto,) async { - final response = await removeMemoryAssetsWithHttpInfo(id, bulkIdsDto,); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'MemoryStatisticsResponseDto') + as MemoryStatisticsResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } - /// Retrieve memories + /// Delete a memory /// - /// Retrieve a list of memories. Memories are sorted descending by creation date by default, although they can also be sorted in ascending order, or randomly. + /// Delete a specific memory by its ID. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [DateTime] for_: - /// Filter by date - /// - /// * [bool] isSaved: - /// Filter by saved status - /// - /// * [bool] isTrashed: - /// Include trashed memories - /// - /// * [MemorySearchOrder] order: - /// - /// * [int] size: - /// Number of memories to return - /// - /// * [MemoryType] type: - Future searchMemoriesWithHttpInfo({ DateTime? for_, bool? isSaved, bool? isTrashed, MemorySearchOrder? order, int? size, MemoryType? type, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/memories'; + Future deleteMemoryWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/memories/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - if (for_ != null) { - queryParams.addAll(_queryParams('', 'for', for_)); - } - if (isSaved != null) { - queryParams.addAll(_queryParams('', 'isSaved', isSaved)); - } - if (isTrashed != null) { - queryParams.addAll(_queryParams('', 'isTrashed', isTrashed)); - } - if (order != null) { - queryParams.addAll(_queryParams('', 'order', order)); - } - if (size != null) { - queryParams.addAll(_queryParams('', 'size', size)); - } - if (type != null) { - queryParams.addAll(_queryParams('', 'type', type)); - } - const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// Retrieve memories + /// Delete a memory /// - /// Retrieve a list of memories. Memories are sorted descending by creation date by default, although they can also be sorted in ascending order, or randomly. + /// Delete a specific memory by its ID. /// - /// Parameters: - /// - /// * [DateTime] for_: - /// Filter by date - /// - /// * [bool] isSaved: - /// Filter by saved status - /// - /// * [bool] isTrashed: - /// Include trashed memories - /// - /// * [MemorySearchOrder] order: - /// - /// * [int] size: - /// Number of memories to return - /// - /// * [MemoryType] type: - Future?> searchMemories({ DateTime? for_, bool? isSaved, bool? isTrashed, MemorySearchOrder? order, int? size, MemoryType? type, }) async { - final response = await searchMemoriesWithHttpInfo( for_: for_, isSaved: isSaved, isTrashed: isTrashed, order: order, size: size, type: type, ); + /// Available since server v1.0.0. + Future deleteMemory(String id, {Future? abortTrigger}) async { + final response = await deleteMemoryWithHttpInfo(id, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); + } + /// Retrieve a memory + /// + /// Retrieve a specific memory by its ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getMemoryWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/memories/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve a memory + /// + /// Retrieve a specific memory by its ID. + /// + /// Available since server v1.0.0. + Future getMemory(String id, {Future? abortTrigger}) async { + final response = await getMemoryWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - return null; + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'MemoryResponseDto') + as MemoryResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update a memory /// /// Update an existing memory by its ID. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [MemoryUpdateDto] memoryUpdateDto (required): - Future updateMemoryWithHttpInfo(String id, MemoryUpdateDto memoryUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/memories/{id}' - .replaceAll('{id}', id); + Future updateMemoryWithHttpInfo( + String id, + MemoryUpdateDto memoryUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/memories/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = memoryUpdateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -556,23 +395,130 @@ class MemoriesApi { /// /// Update an existing memory by its ID. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [MemoryUpdateDto] memoryUpdateDto (required): - Future updateMemory(String id, MemoryUpdateDto memoryUpdateDto,) async { - final response = await updateMemoryWithHttpInfo(id, memoryUpdateDto,); + /// Available since server v1.0.0. + Future updateMemory( + String id, + MemoryUpdateDto memoryUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updateMemoryWithHttpInfo(id, memoryUpdateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MemoryResponseDto',) as MemoryResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'MemoryResponseDto') + as MemoryResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Remove assets from a memory + /// + /// Remove a list of asset IDs from a specific memory. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future removeMemoryAssetsWithHttpInfo( + String id, + BulkIdsDto bulkIdsDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/memories/{id}/assets'.replaceAll('{id}', id); + + Object? postBody = bulkIdsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Remove assets from a memory + /// + /// Remove a list of asset IDs from a specific memory. + /// + /// Available since server v1.0.0. + Future> removeMemoryAssets( + String id, + BulkIdsDto bulkIdsDto, { + Future? abortTrigger, + }) async { + final response = await removeMemoryAssetsWithHttpInfo(id, bulkIdsDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Add assets to a memory + /// + /// Add a list of asset IDs to a specific memory. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future addMemoryAssetsWithHttpInfo(String id, BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { + final apiPath = r'/memories/{id}/assets'.replaceAll('{id}', id); + + Object? postBody = bulkIdsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Add assets to a memory + /// + /// Add a list of asset IDs to a specific memory. + /// + /// Available since server v1.0.0. + Future> addMemoryAssets( + String id, + BulkIdsDto bulkIdsDto, { + Future? abortTrigger, + }) async { + final response = await addMemoryAssetsWithHttpInfo(id, bulkIdsDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/notifications_admin_api.dart b/mobile/openapi/lib/api/notifications_admin_api.dart index 7821553d30..e3e96c9620 100644 --- a/mobile/openapi/lib/api/notifications_admin_api.dart +++ b/mobile/openapi/lib/api/notifications_admin_api.dart @@ -1,52 +1,54 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class NotificationsAdminApi { NotificationsAdminApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion createNotificationAddedIn = .new(1, 0, 0); + + static const ApiState createNotificationState = .stable; + + static const ApiVersion getNotificationTemplateAdminAddedIn = .new(1, 0, 0); + + static const ApiState getNotificationTemplateAdminState = .stable; + + static const ApiVersion sendTestEmailAdminAddedIn = .new(1, 0, 0); + + static const ApiState sendTestEmailAdminState = .stable; + /// Create a notification /// /// Create a new notification for a specific user. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [NotificationCreateDto] notificationCreateDto (required): - Future createNotificationWithHttpInfo(NotificationCreateDto notificationCreateDto,) async { - // ignore: prefer_const_declarations + Future createNotificationWithHttpInfo( + NotificationCreateDto notificationCreateDto, { + Future? abortTrigger, + }) async { final apiPath = r'/admin/notifications'; - // ignore: prefer_final_locals Object? postBody = notificationCreateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -54,58 +56,52 @@ class NotificationsAdminApi { /// /// Create a new notification for a specific user. /// - /// Parameters: - /// - /// * [NotificationCreateDto] notificationCreateDto (required): - Future createNotification(NotificationCreateDto notificationCreateDto,) async { - final response = await createNotificationWithHttpInfo(notificationCreateDto,); + /// Available since server v1.0.0. + Future createNotification( + NotificationCreateDto notificationCreateDto, { + Future? abortTrigger, + }) async { + final response = await createNotificationWithHttpInfo(notificationCreateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'NotificationDto',) as NotificationDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'NotificationDto') as NotificationDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Render email template /// /// Retrieve a preview of the provided email template. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] name (required): - /// - /// * [TemplateDto] templateDto (required): - Future getNotificationTemplateAdminWithHttpInfo(String name, TemplateDto templateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/notifications/templates/{name}' - .replaceAll('{name}', name); + Future getNotificationTemplateAdminWithHttpInfo( + String name, + TemplateDto templateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/admin/notifications/templates/{name}'.replaceAll('{name}', name); - // ignore: prefer_final_locals Object? postBody = templateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -113,57 +109,53 @@ class NotificationsAdminApi { /// /// Retrieve a preview of the provided email template. /// - /// Parameters: - /// - /// * [String] name (required): - /// - /// * [TemplateDto] templateDto (required): - Future getNotificationTemplateAdmin(String name, TemplateDto templateDto,) async { - final response = await getNotificationTemplateAdminWithHttpInfo(name, templateDto,); + /// Available since server v1.0.0. + Future getNotificationTemplateAdmin( + String name, + TemplateDto templateDto, { + Future? abortTrigger, + }) async { + final response = await getNotificationTemplateAdminWithHttpInfo(name, templateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TemplateResponseDto',) as TemplateResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'TemplateResponseDto') + as TemplateResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Send test email /// /// Send a test email using the provided SMTP configuration. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SystemConfigSmtpDto] systemConfigSmtpDto (required): - Future sendTestEmailAdminWithHttpInfo(SystemConfigSmtpDto systemConfigSmtpDto,) async { - // ignore: prefer_const_declarations + Future sendTestEmailAdminWithHttpInfo( + SystemConfigSmtpDto systemConfigSmtpDto, { + Future? abortTrigger, + }) async { final apiPath = r'/admin/notifications/test-email'; - // ignore: prefer_final_locals Object? postBody = systemConfigSmtpDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -171,21 +163,19 @@ class NotificationsAdminApi { /// /// Send a test email using the provided SMTP configuration. /// - /// Parameters: - /// - /// * [SystemConfigSmtpDto] systemConfigSmtpDto (required): - Future sendTestEmailAdmin(SystemConfigSmtpDto systemConfigSmtpDto,) async { - final response = await sendTestEmailAdminWithHttpInfo(systemConfigSmtpDto,); + /// Available since server v1.0.0. + Future sendTestEmailAdmin( + SystemConfigSmtpDto systemConfigSmtpDto, { + Future? abortTrigger, + }) async { + final response = await sendTestEmailAdminWithHttpInfo(systemConfigSmtpDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TestEmailResponseDto',) as TestEmailResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'TestEmailResponseDto') + as TestEmailResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/notifications_api.dart b/mobile/openapi/lib/api/notifications_api.dart index ab0be3e8f3..0c20004335 100644 --- a/mobile/openapi/lib/api/notifications_api.dart +++ b/mobile/openapi/lib/api/notifications_api.dart @@ -1,101 +1,66 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class NotificationsApi { NotificationsApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Delete a notification - /// - /// Delete a specific notification. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteNotificationWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/notifications/{id}' - .replaceAll('{id}', id); + static const ApiVersion deleteNotificationsAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody; + static const ApiState deleteNotificationsState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion getNotificationsAddedIn = .new(1, 0, 0); - const contentTypes = []; + static const ApiState getNotificationsState = .stable; + static const ApiVersion updateNotificationsAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState updateNotificationsState = .stable; - /// Delete a notification - /// - /// Delete a specific notification. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteNotification(String id,) async { - final response = await deleteNotificationWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiVersion deleteNotificationAddedIn = .new(1, 0, 0); + + static const ApiState deleteNotificationState = .stable; + + static const ApiVersion getNotificationAddedIn = .new(1, 0, 0); + + static const ApiState getNotificationState = .stable; + + static const ApiVersion updateNotificationAddedIn = .new(1, 0, 0); + + static const ApiState updateNotificationState = .stable; /// Delete notifications /// /// Delete a list of notifications at once. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [NotificationDeleteAllDto] notificationDeleteAllDto (required): - Future deleteNotificationsWithHttpInfo(NotificationDeleteAllDto notificationDeleteAllDto,) async { - // ignore: prefer_const_declarations + Future deleteNotificationsWithHttpInfo( + NotificationDeleteAllDto notificationDeleteAllDto, { + Future? abortTrigger, + }) async { final apiPath = r'/notifications'; - // ignore: prefer_final_locals Object? postBody = notificationDeleteAllDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'DELETE', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -103,95 +68,33 @@ class NotificationsApi { /// /// Delete a list of notifications at once. /// - /// Parameters: - /// - /// * [NotificationDeleteAllDto] notificationDeleteAllDto (required): - Future deleteNotifications(NotificationDeleteAllDto notificationDeleteAllDto,) async { - final response = await deleteNotificationsWithHttpInfo(notificationDeleteAllDto,); + /// Available since server v1.0.0. + Future deleteNotifications( + NotificationDeleteAllDto notificationDeleteAllDto, { + Future? abortTrigger, + }) async { + final response = await deleteNotificationsWithHttpInfo(notificationDeleteAllDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } - /// Get a notification - /// - /// Retrieve a specific notification identified by id. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getNotificationWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/notifications/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get a notification - /// - /// Retrieve a specific notification identified by id. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getNotification(String id,) async { - final response = await getNotificationWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'NotificationDto',) as NotificationDto; - - } - return null; - } - /// Retrieve notifications /// /// Retrieve a list of notifications. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id: - /// Filter by notification ID - /// - /// * [NotificationLevel] level: - /// - /// * [NotificationType] type: - /// - /// * [bool] unread: - /// Filter by unread status - Future getNotificationsWithHttpInfo({ String? id, NotificationLevel? level, NotificationType? type, bool? unread, }) async { - // ignore: prefer_const_declarations + Future getNotificationsWithHttpInfo({ + String? id, + NotificationLevel? level, + NotificationType? type, + bool? unread, + Future? abortTrigger, + }) async { final apiPath = r'/notifications'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -213,15 +116,15 @@ class NotificationsApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -229,127 +132,63 @@ class NotificationsApi { /// /// Retrieve a list of notifications. /// - /// Parameters: - /// - /// * [String] id: - /// Filter by notification ID - /// - /// * [NotificationLevel] level: - /// - /// * [NotificationType] type: - /// - /// * [bool] unread: - /// Filter by unread status - Future?> getNotifications({ String? id, NotificationLevel? level, NotificationType? type, bool? unread, }) async { - final response = await getNotificationsWithHttpInfo( id: id, level: level, type: type, unread: unread, ); + /// Available since server v1.0.0. + Future> getNotifications({ + String? id, + NotificationLevel? level, + NotificationType? type, + bool? unread, + Future? abortTrigger, + }) async { + final response = await getNotificationsWithHttpInfo( + id: id, + level: level, + type: type, + unread: unread, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; - } - - /// Update a notification - /// - /// Update a specific notification to set its read status. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [NotificationUpdateDto] notificationUpdateDto (required): - Future updateNotificationWithHttpInfo(String id, NotificationUpdateDto notificationUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/notifications/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = notificationUpdateDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Update a notification - /// - /// Update a specific notification to set its read status. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [NotificationUpdateDto] notificationUpdateDto (required): - Future updateNotification(String id, NotificationUpdateDto notificationUpdateDto,) async { - final response = await updateNotificationWithHttpInfo(id, notificationUpdateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'NotificationDto',) as NotificationDto; - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update notifications /// /// Update a list of notifications. Allows to bulk-set the read status of notifications. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [NotificationUpdateAllDto] notificationUpdateAllDto (required): - Future updateNotificationsWithHttpInfo(NotificationUpdateAllDto notificationUpdateAllDto,) async { - // ignore: prefer_const_declarations + Future updateNotificationsWithHttpInfo( + NotificationUpdateAllDto notificationUpdateAllDto, { + Future? abortTrigger, + }) async { final apiPath = r'/notifications'; - // ignore: prefer_final_locals Object? postBody = notificationUpdateAllDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -357,13 +196,156 @@ class NotificationsApi { /// /// Update a list of notifications. Allows to bulk-set the read status of notifications. /// - /// Parameters: - /// - /// * [NotificationUpdateAllDto] notificationUpdateAllDto (required): - Future updateNotifications(NotificationUpdateAllDto notificationUpdateAllDto,) async { - final response = await updateNotificationsWithHttpInfo(notificationUpdateAllDto,); + /// Available since server v1.0.0. + Future updateNotifications( + NotificationUpdateAllDto notificationUpdateAllDto, { + Future? abortTrigger, + }) async { + final response = await updateNotificationsWithHttpInfo(notificationUpdateAllDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } + + /// Delete a notification + /// + /// Delete a specific notification. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteNotificationWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/notifications/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete a notification + /// + /// Delete a specific notification. + /// + /// Available since server v1.0.0. + Future deleteNotification(String id, {Future? abortTrigger}) async { + final response = await deleteNotificationWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Get a notification + /// + /// Retrieve a specific notification identified by id. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getNotificationWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/notifications/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get a notification + /// + /// Retrieve a specific notification identified by id. + /// + /// Available since server v1.0.0. + Future getNotification(String id, {Future? abortTrigger}) async { + final response = await getNotificationWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'NotificationDto') as NotificationDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Update a notification + /// + /// Update a specific notification to set its read status. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future updateNotificationWithHttpInfo( + String id, + NotificationUpdateDto notificationUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/notifications/{id}'.replaceAll('{id}', id); + + Object? postBody = notificationUpdateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Update a notification + /// + /// Update a specific notification to set its read status. + /// + /// Available since server v1.0.0. + Future updateNotification( + String id, + NotificationUpdateDto notificationUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updateNotificationWithHttpInfo(id, notificationUpdateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'NotificationDto') as NotificationDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } } diff --git a/mobile/openapi/lib/api/partners_api.dart b/mobile/openapi/lib/api/partners_api.dart index 7d18f6d867..4434c56064 100644 --- a/mobile/openapi/lib/api/partners_api.dart +++ b/mobile/openapi/lib/api/partners_api.dart @@ -1,52 +1,115 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class PartnersApi { PartnersApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion getPartnersAddedIn = .new(1, 0, 0); + + static const ApiState getPartnersState = .stable; + + static const ApiVersion createPartnerAddedIn = .new(1, 0, 0); + + static const ApiState createPartnerState = .stable; + + static const ApiVersion removePartnerAddedIn = .new(1, 0, 0); + + static const ApiState removePartnerState = .stable; + + static const ApiVersion createPartnerDeprecatedAddedIn = .new(1, 0, 0); + + static const ApiVersion createPartnerDeprecatedDeprecatedIn = .new(1, 0, 0); + + static const ApiState createPartnerDeprecatedState = .deprecated; + + static const ApiVersion updatePartnerAddedIn = .new(1, 0, 0); + + static const ApiState updatePartnerState = .stable; + + /// Retrieve partners + /// + /// Retrieve a list of partners with whom assets are shared. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getPartnersWithHttpInfo({required PartnerDirection direction, Future? abortTrigger}) async { + final apiPath = r'/partners'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + queryParams.addAll(_queryParams('', 'direction', direction)); + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve partners + /// + /// Retrieve a list of partners with whom assets are shared. + /// + /// Available since server v1.0.0. + Future> getPartners({ + required PartnerDirection direction, + Future? abortTrigger, + }) async { + final response = await getPartnersWithHttpInfo(direction: direction, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + /// Create a partner /// /// Create a new partner to share assets with. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [PartnerCreateDto] partnerCreateDto (required): - Future createPartnerWithHttpInfo(PartnerCreateDto partnerCreateDto,) async { - // ignore: prefer_const_declarations + Future createPartnerWithHttpInfo(PartnerCreateDto partnerCreateDto, {Future? abortTrigger}) async { final apiPath = r'/partners'; - // ignore: prefer_final_locals Object? postBody = partnerCreateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -54,157 +117,29 @@ class PartnersApi { /// /// Create a new partner to share assets with. /// - /// Parameters: - /// - /// * [PartnerCreateDto] partnerCreateDto (required): - Future createPartner(PartnerCreateDto partnerCreateDto,) async { - final response = await createPartnerWithHttpInfo(partnerCreateDto,); + /// Available since server v1.0.0. + Future createPartner(PartnerCreateDto partnerCreateDto, {Future? abortTrigger}) async { + final response = await createPartnerWithHttpInfo(partnerCreateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'PartnerResponseDto',) as PartnerResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'PartnerResponseDto') + as PartnerResponseDto; } - return null; - } - - /// Create a partner - /// - /// Create a new partner to share assets with. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future createPartnerDeprecatedWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/partners/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Create a partner - /// - /// Create a new partner to share assets with. - /// - /// Parameters: - /// - /// * [String] id (required): - Future createPartnerDeprecated(String id,) async { - final response = await createPartnerDeprecatedWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'PartnerResponseDto',) as PartnerResponseDto; - - } - return null; - } - - /// Retrieve partners - /// - /// Retrieve a list of partners with whom assets are shared. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [PartnerDirection] direction (required): - Future getPartnersWithHttpInfo(PartnerDirection direction,) async { - // ignore: prefer_const_declarations - final apiPath = r'/partners'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - queryParams.addAll(_queryParams('', 'direction', direction)); - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve partners - /// - /// Retrieve a list of partners with whom assets are shared. - /// - /// Parameters: - /// - /// * [PartnerDirection] direction (required): - Future?> getPartners(PartnerDirection direction,) async { - final response = await getPartnersWithHttpInfo(direction,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Remove a partner /// /// Stop sharing assets with a partner. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future removePartnerWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/partners/{id}' - .replaceAll('{id}', id); + Future removePartnerWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/partners/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -213,15 +148,15 @@ class PartnersApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'DELETE', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -229,50 +164,94 @@ class PartnersApi { /// /// Stop sharing assets with a partner. /// - /// Parameters: - /// - /// * [String] id (required): - Future removePartner(String id,) async { - final response = await removePartnerWithHttpInfo(id,); + /// Available since server v1.0.0. + Future removePartner(String id, {Future? abortTrigger}) async { + final response = await removePartnerWithHttpInfo(id, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } + /// Create a partner + /// + /// Create a new partner to share assets with. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + @Deprecated('Deprecated by the Immich server API since v1.0.0.') + Future createPartnerDeprecatedWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/partners/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Create a partner + /// + /// Create a new partner to share assets with. + /// + /// Available since server v1.0.0. + @Deprecated('Deprecated by the Immich server API since v1.0.0.') + Future createPartnerDeprecated(String id, {Future? abortTrigger}) async { + final response = await createPartnerDeprecatedWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'PartnerResponseDto') + as PartnerResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + /// Update a partner /// /// Specify whether a partner's assets should appear in the user's timeline. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [PartnerUpdateDto] partnerUpdateDto (required): - Future updatePartnerWithHttpInfo(String id, PartnerUpdateDto partnerUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/partners/{id}' - .replaceAll('{id}', id); + Future updatePartnerWithHttpInfo( + String id, + PartnerUpdateDto partnerUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/partners/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = partnerUpdateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -280,23 +259,20 @@ class PartnersApi { /// /// Specify whether a partner's assets should appear in the user's timeline. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [PartnerUpdateDto] partnerUpdateDto (required): - Future updatePartner(String id, PartnerUpdateDto partnerUpdateDto,) async { - final response = await updatePartnerWithHttpInfo(id, partnerUpdateDto,); + /// Available since server v1.0.0. + Future updatePartner( + String id, + PartnerUpdateDto partnerUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updatePartnerWithHttpInfo(id, partnerUpdateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'PartnerResponseDto',) as PartnerResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'PartnerResponseDto') + as PartnerResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/people_api.dart b/mobile/openapi/lib/api/people_api.dart index 99821f31aa..1136df4e8a 100644 --- a/mobile/openapi/lib/api/people_api.dart +++ b/mobile/openapi/lib/api/people_api.dart @@ -1,108 +1,83 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class PeopleApi { PeopleApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Create a person - /// - /// Create a new person that can have multiple faces assigned to them. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [PersonCreateDto] personCreateDto (required): - Future createPersonWithHttpInfo(PersonCreateDto personCreateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/people'; + static const ApiVersion deletePeopleAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody = personCreateDto; + static const ApiState deletePeopleState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion getAllPeopleAddedIn = .new(1, 0, 0); - const contentTypes = ['application/json']; + static const ApiState getAllPeopleState = .stable; + static const ApiVersion createPersonAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState createPersonState = .stable; - /// Create a person - /// - /// Create a new person that can have multiple faces assigned to them. - /// - /// Parameters: - /// - /// * [PersonCreateDto] personCreateDto (required): - Future createPerson(PersonCreateDto personCreateDto,) async { - final response = await createPersonWithHttpInfo(personCreateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'PersonResponseDto',) as PersonResponseDto; - - } - return null; - } + static const ApiVersion updatePeopleAddedIn = .new(1, 0, 0); + + static const ApiState updatePeopleState = .stable; + + static const ApiVersion deletePersonAddedIn = .new(1, 0, 0); + + static const ApiState deletePersonState = .stable; + + static const ApiVersion getPersonAddedIn = .new(1, 0, 0); + + static const ApiState getPersonState = .stable; + + static const ApiVersion updatePersonAddedIn = .new(1, 0, 0); + + static const ApiState updatePersonState = .stable; + + static const ApiVersion mergePersonAddedIn = .new(1, 0, 0); + + static const ApiState mergePersonState = .stable; + + static const ApiVersion reassignFacesAddedIn = .new(1, 0, 0); + + static const ApiState reassignFacesState = .stable; + + static const ApiVersion getPersonStatisticsAddedIn = .new(1, 0, 0); + + static const ApiState getPersonStatisticsState = .stable; + + static const ApiVersion getPersonThumbnailAddedIn = .new(1, 0, 0); + + static const ApiState getPersonThumbnailState = .stable; /// Delete people /// /// Bulk delete a list of people at once. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future deletePeopleWithHttpInfo(BulkIdsDto bulkIdsDto,) async { - // ignore: prefer_const_declarations + Future deletePeopleWithHttpInfo(BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { final apiPath = r'/people'; - // ignore: prefer_final_locals Object? postBody = bulkIdsDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'DELETE', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -110,60 +85,9 @@ class PeopleApi { /// /// Bulk delete a list of people at once. /// - /// Parameters: - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future deletePeople(BulkIdsDto bulkIdsDto,) async { - final response = await deletePeopleWithHttpInfo(bulkIdsDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Delete person - /// - /// Delete an individual person. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deletePersonWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/people/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Delete person - /// - /// Delete an individual person. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deletePerson(String id,) async { - final response = await deletePersonWithHttpInfo(id,); + /// Available since server v1.0.0. + Future deletePeople(BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { + final response = await deletePeopleWithHttpInfo(bulkIdsDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } @@ -173,29 +97,19 @@ class PeopleApi { /// /// Retrieve a list of all people. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] closestAssetId: - /// Closest asset ID for similarity search - /// - /// * [String] closestPersonId: - /// Closest person ID for similarity search - /// - /// * [int] page: - /// Page number for pagination - /// - /// * [int] size: - /// Number of items per page - /// - /// * [bool] withHidden: - /// Include hidden people - Future getAllPeopleWithHttpInfo({ String? closestAssetId, String? closestPersonId, int? page, int? size, bool? withHidden, }) async { - // ignore: prefer_const_declarations + Future getAllPeopleWithHttpInfo({ + String? closestAssetId, + String? closestPersonId, + int? page, + int? size, + bool? withHidden, + Future? abortTrigger, + }) async { final apiPath = r'/people'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -220,15 +134,15 @@ class PeopleApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -236,367 +150,107 @@ class PeopleApi { /// /// Retrieve a list of all people. /// - /// Parameters: - /// - /// * [String] closestAssetId: - /// Closest asset ID for similarity search - /// - /// * [String] closestPersonId: - /// Closest person ID for similarity search - /// - /// * [int] page: - /// Page number for pagination - /// - /// * [int] size: - /// Number of items per page - /// - /// * [bool] withHidden: - /// Include hidden people - Future getAllPeople({ String? closestAssetId, String? closestPersonId, int? page, int? size, bool? withHidden, }) async { - final response = await getAllPeopleWithHttpInfo( closestAssetId: closestAssetId, closestPersonId: closestPersonId, page: page, size: size, withHidden: withHidden, ); + /// Available since server v1.0.0. + Future getAllPeople({ + String? closestAssetId, + String? closestPersonId, + int? page, + int? size, + bool? withHidden, + Future? abortTrigger, + }) async { + final response = await getAllPeopleWithHttpInfo( + closestAssetId: closestAssetId, + closestPersonId: closestPersonId, + page: page, + size: size, + withHidden: withHidden, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'PeopleResponseDto',) as PeopleResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'PeopleResponseDto') + as PeopleResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } - /// Get a person + /// Create a person /// - /// Retrieve a person by id. + /// Create a new person that can have multiple faces assigned to them. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getPersonWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/people/{id}' - .replaceAll('{id}', id); + Future createPersonWithHttpInfo(PersonCreateDto personCreateDto, {Future? abortTrigger}) async { + final apiPath = r'/people'; - // ignore: prefer_final_locals - Object? postBody; + Object? postBody = personCreateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = []; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'GET', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// Get a person + /// Create a person /// - /// Retrieve a person by id. + /// Create a new person that can have multiple faces assigned to them. /// - /// Parameters: - /// - /// * [String] id (required): - Future getPerson(String id,) async { - final response = await getPersonWithHttpInfo(id,); + /// Available since server v1.0.0. + Future createPerson(PersonCreateDto personCreateDto, {Future? abortTrigger}) async { + final response = await createPersonWithHttpInfo(personCreateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'PersonResponseDto',) as PersonResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'PersonResponseDto') + as PersonResponseDto; } - return null; - } - - /// Get person statistics - /// - /// Retrieve statistics about a specific person. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getPersonStatisticsWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/people/{id}/statistics' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get person statistics - /// - /// Retrieve statistics about a specific person. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getPersonStatistics(String id,) async { - final response = await getPersonStatisticsWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'PersonStatisticsResponseDto',) as PersonStatisticsResponseDto; - - } - return null; - } - - /// Get person thumbnail - /// - /// Retrieve the thumbnail file for a person. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getPersonThumbnailWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/people/{id}/thumbnail' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get person thumbnail - /// - /// Retrieve the thumbnail file for a person. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getPersonThumbnail(String id,) async { - final response = await getPersonThumbnailWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MultipartFile',) as MultipartFile; - - } - return null; - } - - /// Merge people - /// - /// Merge a list of people into the person specified in the path parameter. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [MergePersonDto] mergePersonDto (required): - Future mergePersonWithHttpInfo(String id, MergePersonDto mergePersonDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/people/{id}/merge' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = mergePersonDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Merge people - /// - /// Merge a list of people into the person specified in the path parameter. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [MergePersonDto] mergePersonDto (required): - Future?> mergePerson(String id, MergePersonDto mergePersonDto,) async { - final response = await mergePersonWithHttpInfo(id, mergePersonDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Reassign faces - /// - /// Bulk reassign a list of faces to a different person. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetFaceUpdateDto] assetFaceUpdateDto (required): - Future reassignFacesWithHttpInfo(String id, AssetFaceUpdateDto assetFaceUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/people/{id}/reassign' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = assetFaceUpdateDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Reassign faces - /// - /// Bulk reassign a list of faces to a different person. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetFaceUpdateDto] assetFaceUpdateDto (required): - Future?> reassignFaces(String id, AssetFaceUpdateDto assetFaceUpdateDto,) async { - final response = await reassignFacesWithHttpInfo(id, assetFaceUpdateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update people /// /// Bulk update multiple people at once. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [PeopleUpdateDto] peopleUpdateDto (required): - Future updatePeopleWithHttpInfo(PeopleUpdateDto peopleUpdateDto,) async { - // ignore: prefer_const_declarations + Future updatePeopleWithHttpInfo(PeopleUpdateDto peopleUpdateDto, {Future? abortTrigger}) async { final apiPath = r'/people'; - // ignore: prefer_final_locals Object? postBody = peopleUpdateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -604,61 +258,141 @@ class PeopleApi { /// /// Bulk update multiple people at once. /// - /// Parameters: - /// - /// * [PeopleUpdateDto] peopleUpdateDto (required): - Future?> updatePeople(PeopleUpdateDto peopleUpdateDto,) async { - final response = await updatePeopleWithHttpInfo(peopleUpdateDto,); + /// Available since server v1.0.0. + Future> updatePeople(PeopleUpdateDto peopleUpdateDto, {Future? abortTrigger}) async { + final response = await updatePeopleWithHttpInfo(peopleUpdateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete person + /// + /// Delete an individual person. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deletePersonWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/people/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete person + /// + /// Delete an individual person. + /// + /// Available since server v1.0.0. + Future deletePerson(String id, {Future? abortTrigger}) async { + final response = await deletePersonWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Get a person + /// + /// Retrieve a person by id. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getPersonWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/people/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get a person + /// + /// Retrieve a person by id. + /// + /// Available since server v1.0.0. + Future getPerson(String id, {Future? abortTrigger}) async { + final response = await getPersonWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'PersonResponseDto') + as PersonResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update person /// /// Update an individual person. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [PersonUpdateDto] personUpdateDto (required): - Future updatePersonWithHttpInfo(String id, PersonUpdateDto personUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/people/{id}' - .replaceAll('{id}', id); + Future updatePersonWithHttpInfo( + String id, + PersonUpdateDto personUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/people/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = personUpdateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -666,23 +400,224 @@ class PeopleApi { /// /// Update an individual person. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [PersonUpdateDto] personUpdateDto (required): - Future updatePerson(String id, PersonUpdateDto personUpdateDto,) async { - final response = await updatePersonWithHttpInfo(id, personUpdateDto,); + /// Available since server v1.0.0. + Future updatePerson( + String id, + PersonUpdateDto personUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updatePersonWithHttpInfo(id, personUpdateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'PersonResponseDto',) as PersonResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'PersonResponseDto') + as PersonResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Merge people + /// + /// Merge a list of people into the person specified in the path parameter. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future mergePersonWithHttpInfo( + String id, + MergePersonDto mergePersonDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/people/{id}/merge'.replaceAll('{id}', id); + + Object? postBody = mergePersonDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Merge people + /// + /// Merge a list of people into the person specified in the path parameter. + /// + /// Available since server v1.0.0. + Future> mergePerson( + String id, + MergePersonDto mergePersonDto, { + Future? abortTrigger, + }) async { + final response = await mergePersonWithHttpInfo(id, mergePersonDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Reassign faces + /// + /// Bulk reassign a list of faces to a different person. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future reassignFacesWithHttpInfo( + String id, + AssetFaceUpdateDto assetFaceUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/people/{id}/reassign'.replaceAll('{id}', id); + + Object? postBody = assetFaceUpdateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Reassign faces + /// + /// Bulk reassign a list of faces to a different person. + /// + /// Available since server v1.0.0. + Future> reassignFaces( + String id, + AssetFaceUpdateDto assetFaceUpdateDto, { + Future? abortTrigger, + }) async { + final response = await reassignFacesWithHttpInfo(id, assetFaceUpdateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get person statistics + /// + /// Retrieve statistics about a specific person. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getPersonStatisticsWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/people/{id}/statistics'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get person statistics + /// + /// Retrieve statistics about a specific person. + /// + /// Available since server v1.0.0. + Future getPersonStatistics(String id, {Future? abortTrigger}) async { + final response = await getPersonStatisticsWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'PersonStatisticsResponseDto') + as PersonStatisticsResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get person thumbnail + /// + /// Retrieve the thumbnail file for a person. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getPersonThumbnailWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/people/{id}/thumbnail'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get person thumbnail + /// + /// Retrieve the thumbnail file for a person. + /// + /// Available since server v1.0.0. + Future getPersonThumbnail(String id, {Future? abortTrigger}) async { + final response = await getPersonThumbnailWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + return response.bodyBytes; } } diff --git a/mobile/openapi/lib/api/plugins_api.dart b/mobile/openapi/lib/api/plugins_api.dart index a29f597dc4..1a73c64a88 100644 --- a/mobile/openapi/lib/api/plugins_api.dart +++ b/mobile/openapi/lib/api/plugins_api.dart @@ -1,114 +1,141 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class PluginsApi { PluginsApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Retrieve a plugin + static const ApiVersion searchPluginsAddedIn = .new(3, 0, 0); + + static const ApiState searchPluginsState = .added; + + static const ApiVersion searchPluginMethodsAddedIn = .new(3, 0, 0); + + static const ApiState searchPluginMethodsState = .added; + + static const ApiVersion searchPluginTemplatesAddedIn = .new(3, 0, 0); + + static const ApiState searchPluginTemplatesState = .added; + + static const ApiVersion getPluginAddedIn = .new(3, 0, 0); + + static const ApiState getPluginState = .added; + + /// List all plugins /// - /// Retrieve information about a specific plugin by its ID. + /// Retrieve a list of plugins available to the authenticated user. + /// + /// Available since server v3.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getPluginWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/plugins/{id}' - .replaceAll('{id}', id); + Future searchPluginsWithHttpInfo({ + String? description, + bool? enabled, + String? id, + String? name, + String? title, + String? version, + Future? abortTrigger, + }) async { + final apiPath = r'/plugins'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = []; + if (description != null) { + queryParams.addAll(_queryParams('', 'description', description)); + } + if (enabled != null) { + queryParams.addAll(_queryParams('', 'enabled', enabled)); + } + if (id != null) { + queryParams.addAll(_queryParams('', 'id', id)); + } + if (name != null) { + queryParams.addAll(_queryParams('', 'name', name)); + } + if (title != null) { + queryParams.addAll(_queryParams('', 'title', title)); + } + if (version != null) { + queryParams.addAll(_queryParams('', 'version', version)); + } + const contentTypes = []; return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// Retrieve a plugin + /// List all plugins /// - /// Retrieve information about a specific plugin by its ID. + /// Retrieve a list of plugins available to the authenticated user. /// - /// Parameters: - /// - /// * [String] id (required): - Future getPlugin(String id,) async { - final response = await getPluginWithHttpInfo(id,); + /// Available since server v3.0.0. + Future> searchPlugins({ + String? description, + bool? enabled, + String? id, + String? name, + String? title, + String? version, + Future? abortTrigger, + }) async { + final response = await searchPluginsWithHttpInfo( + description: description, + enabled: enabled, + id: id, + name: name, + title: title, + version: version, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'PluginResponseDto',) as PluginResponseDto; - + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Retrieve plugin methods /// /// Retrieve a list of plugin methods /// + /// Available since server v3.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] description: - /// - /// * [bool] enabled: - /// Whether the plugin method is enabled - /// - /// * [String] id: - /// Plugin method ID - /// - /// * [String] name: - /// - /// * [String] pluginName: - /// Plugin name - /// - /// * [String] pluginVersion: - /// Plugin version - /// - /// * [String] title: - /// - /// * [WorkflowTrigger] trigger: - /// Workflow trigger - /// - /// * [WorkflowType] type: - /// Workflow types - Future searchPluginMethodsWithHttpInfo({ String? description, bool? enabled, String? id, String? name, String? pluginName, String? pluginVersion, String? title, WorkflowTrigger? trigger, WorkflowType? type, }) async { - // ignore: prefer_const_declarations + Future searchPluginMethodsWithHttpInfo({ + String? description, + bool? enabled, + String? id, + String? name, + String? pluginName, + String? pluginVersion, + String? title, + WorkflowTrigger? trigger, + WorkflowType? type, + Future? abortTrigger, + }) async { final apiPath = r'/plugins/methods'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -145,15 +172,15 @@ class PluginsApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -161,59 +188,53 @@ class PluginsApi { /// /// Retrieve a list of plugin methods /// - /// Parameters: - /// - /// * [String] description: - /// - /// * [bool] enabled: - /// Whether the plugin method is enabled - /// - /// * [String] id: - /// Plugin method ID - /// - /// * [String] name: - /// - /// * [String] pluginName: - /// Plugin name - /// - /// * [String] pluginVersion: - /// Plugin version - /// - /// * [String] title: - /// - /// * [WorkflowTrigger] trigger: - /// Workflow trigger - /// - /// * [WorkflowType] type: - /// Workflow types - Future?> searchPluginMethods({ String? description, bool? enabled, String? id, String? name, String? pluginName, String? pluginVersion, String? title, WorkflowTrigger? trigger, WorkflowType? type, }) async { - final response = await searchPluginMethodsWithHttpInfo( description: description, enabled: enabled, id: id, name: name, pluginName: pluginName, pluginVersion: pluginVersion, title: title, trigger: trigger, type: type, ); + /// Available since server v3.0.0. + Future> searchPluginMethods({ + String? description, + bool? enabled, + String? id, + String? name, + String? pluginName, + String? pluginVersion, + String? title, + WorkflowTrigger? trigger, + WorkflowType? type, + Future? abortTrigger, + }) async { + final response = await searchPluginMethodsWithHttpInfo( + description: description, + enabled: enabled, + id: id, + name: name, + pluginName: pluginName, + pluginVersion: pluginVersion, + title: title, + trigger: trigger, + type: type, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Retrieve workflow templates /// /// Retrieve workflow templates provided by installed plugins /// + /// Available since server v3.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future searchPluginTemplatesWithHttpInfo() async { - // ignore: prefer_const_declarations + Future searchPluginTemplatesWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/plugins/templates'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -222,138 +243,81 @@ class PluginsApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Retrieve workflow templates /// /// Retrieve workflow templates provided by installed plugins - Future?> searchPluginTemplates() async { - final response = await searchPluginTemplatesWithHttpInfo(); + /// + /// Available since server v3.0.0. + Future> searchPluginTemplates({Future? abortTrigger}) async { + final response = await searchPluginTemplatesWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } - /// List all plugins + /// Retrieve a plugin /// - /// Retrieve a list of plugins available to the authenticated user. + /// Retrieve information about a specific plugin by its ID. + /// + /// Available since server v3.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] description: - /// - /// * [bool] enabled: - /// Whether the plugin is enabled - /// - /// * [String] id: - /// Plugin ID - /// - /// * [String] name: - /// - /// * [String] title: - /// - /// * [String] version: - Future searchPluginsWithHttpInfo({ String? description, bool? enabled, String? id, String? name, String? title, String? version, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/plugins'; + Future getPluginWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/plugins/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - if (description != null) { - queryParams.addAll(_queryParams('', 'description', description)); - } - if (enabled != null) { - queryParams.addAll(_queryParams('', 'enabled', enabled)); - } - if (id != null) { - queryParams.addAll(_queryParams('', 'id', id)); - } - if (name != null) { - queryParams.addAll(_queryParams('', 'name', name)); - } - if (title != null) { - queryParams.addAll(_queryParams('', 'title', title)); - } - if (version != null) { - queryParams.addAll(_queryParams('', 'version', version)); - } - const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// List all plugins + /// Retrieve a plugin /// - /// Retrieve a list of plugins available to the authenticated user. + /// Retrieve information about a specific plugin by its ID. /// - /// Parameters: - /// - /// * [String] description: - /// - /// * [bool] enabled: - /// Whether the plugin is enabled - /// - /// * [String] id: - /// Plugin ID - /// - /// * [String] name: - /// - /// * [String] title: - /// - /// * [String] version: - Future?> searchPlugins({ String? description, bool? enabled, String? id, String? name, String? title, String? version, }) async { - final response = await searchPluginsWithHttpInfo( description: description, enabled: enabled, id: id, name: name, title: title, version: version, ); + /// Available since server v3.0.0. + Future getPlugin(String id, {Future? abortTrigger}) async { + final response = await getPluginWithHttpInfo(id, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'PluginResponseDto') + as PluginResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/queues_api.dart b/mobile/openapi/lib/api/queues_api.dart index 1312cb5952..dd2eaee2d2 100644 --- a/mobile/openapi/lib/api/queues_api.dart +++ b/mobile/openapi/lib/api/queues_api.dart @@ -1,89 +1,42 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class QueuesApi { QueuesApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Empty a queue + static const ApiVersion getQueuesAddedIn = .new(2, 4, 0); + + static const ApiState getQueuesState = .alpha; + + static const ApiVersion getQueueAddedIn = .new(2, 4, 0); + + static const ApiState getQueueState = .alpha; + + static const ApiVersion updateQueueAddedIn = .new(2, 4, 0); + + static const ApiState updateQueueState = .alpha; + + static const ApiVersion emptyQueueAddedIn = .new(2, 4, 0); + + static const ApiState emptyQueueState = .alpha; + + static const ApiVersion getQueueJobsAddedIn = .new(2, 4, 0); + + static const ApiState getQueueJobsState = .alpha; + + /// List all queues /// - /// Removes all jobs from the specified queue. + /// Retrieves a list of queues. + /// + /// Available since server v2.4.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [QueueName] name (required): - /// - /// * [QueueDeleteDto] queueDeleteDto (required): - Future emptyQueueWithHttpInfo(QueueName name, QueueDeleteDto queueDeleteDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/queues/{name}/jobs' - .replaceAll('{name}', name.toString()); + Future getQueuesWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/queues'; - // ignore: prefer_final_locals - Object? postBody = queueDeleteDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Empty a queue - /// - /// Removes all jobs from the specified queue. - /// - /// Parameters: - /// - /// * [QueueName] name (required): - /// - /// * [QueueDeleteDto] queueDeleteDto (required): - Future emptyQueue(QueueName name, QueueDeleteDto queueDeleteDto,) async { - final response = await emptyQueueWithHttpInfo(name, queueDeleteDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Retrieve a queue - /// - /// Retrieves a specific queue by its name. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [QueueName] name (required): - Future getQueueWithHttpInfo(QueueName name,) async { - // ignore: prefer_const_declarations - final apiPath = r'/queues/{name}' - .replaceAll('{name}', name.toString()); - - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -92,15 +45,64 @@ class QueuesApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// List all queues + /// + /// Retrieves a list of queues. + /// + /// Available since server v2.4.0. + Future> getQueues({Future? abortTrigger}) async { + final response = await getQueuesWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve a queue + /// + /// Retrieves a specific queue by its name. + /// + /// Available since server v2.4.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getQueueWithHttpInfo(QueueName name, {Future? abortTrigger}) async { + final apiPath = r'/queues/{name}'.replaceAll('{name}', parameterToString(name)); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -108,42 +110,134 @@ class QueuesApi { /// /// Retrieves a specific queue by its name. /// - /// Parameters: - /// - /// * [QueueName] name (required): - Future getQueue(QueueName name,) async { - final response = await getQueueWithHttpInfo(name,); + /// Available since server v2.4.0. + Future getQueue(QueueName name, {Future? abortTrigger}) async { + final response = await getQueueWithHttpInfo(name, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'QueueResponseDto',) as QueueResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'QueueResponseDto') + as QueueResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Update a queue + /// + /// Change the paused status of a specific queue. + /// + /// Available since server v2.4.0. + /// + /// Note: This method returns the HTTP [Response]. + Future updateQueueWithHttpInfo( + QueueName name, + QueueUpdateDto queueUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/queues/{name}'.replaceAll('{name}', parameterToString(name)); + + Object? postBody = queueUpdateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Update a queue + /// + /// Change the paused status of a specific queue. + /// + /// Available since server v2.4.0. + Future updateQueue( + QueueName name, + QueueUpdateDto queueUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updateQueueWithHttpInfo(name, queueUpdateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'QueueResponseDto') + as QueueResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Empty a queue + /// + /// Removes all jobs from the specified queue. + /// + /// Available since server v2.4.0. + /// + /// Note: This method returns the HTTP [Response]. + Future emptyQueueWithHttpInfo( + QueueName name, + QueueDeleteDto queueDeleteDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/queues/{name}/jobs'.replaceAll('{name}', parameterToString(name)); + + Object? postBody = queueDeleteDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Empty a queue + /// + /// Removes all jobs from the specified queue. + /// + /// Available since server v2.4.0. + Future emptyQueue(QueueName name, QueueDeleteDto queueDeleteDto, {Future? abortTrigger}) async { + final response = await emptyQueueWithHttpInfo(name, queueDeleteDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - return null; } /// Retrieve queue jobs /// /// Retrieves a list of queue jobs from the specified queue. /// + /// Available since server v2.4.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [QueueName] name (required): - /// - /// * [List] status: - /// Filter jobs by status - Future getQueueJobsWithHttpInfo(QueueName name, { List? status, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/queues/{name}/jobs' - .replaceAll('{name}', name.toString()); + Future getQueueJobsWithHttpInfo( + QueueName name, { + List? status, + Future? abortTrigger, + }) async { + final apiPath = r'/queues/{name}/jobs'.replaceAll('{name}', parameterToString(name)); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -156,15 +250,15 @@ class QueuesApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -172,139 +266,22 @@ class QueuesApi { /// /// Retrieves a list of queue jobs from the specified queue. /// - /// Parameters: - /// - /// * [QueueName] name (required): - /// - /// * [List] status: - /// Filter jobs by status - Future?> getQueueJobs(QueueName name, { List? status, }) async { - final response = await getQueueJobsWithHttpInfo(name, status: status, ); + /// Available since server v2.4.0. + Future> getQueueJobs( + QueueName name, { + List? status, + Future? abortTrigger, + }) async { + final response = await getQueueJobsWithHttpInfo(name, status: status, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; - } - - /// List all queues - /// - /// Retrieves a list of queues. - /// - /// Note: This method returns the HTTP [Response]. - Future getQueuesWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/queues'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// List all queues - /// - /// Retrieves a list of queues. - Future?> getQueues() async { - final response = await getQueuesWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Update a queue - /// - /// Change the paused status of a specific queue. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [QueueName] name (required): - /// - /// * [QueueUpdateDto] queueUpdateDto (required): - Future updateQueueWithHttpInfo(QueueName name, QueueUpdateDto queueUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/queues/{name}' - .replaceAll('{name}', name.toString()); - - // ignore: prefer_final_locals - Object? postBody = queueUpdateDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Update a queue - /// - /// Change the paused status of a specific queue. - /// - /// Parameters: - /// - /// * [QueueName] name (required): - /// - /// * [QueueUpdateDto] queueUpdateDto (required): - Future updateQueue(QueueName name, QueueUpdateDto queueUpdateDto,) async { - final response = await updateQueueWithHttpInfo(name, queueUpdateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'QueueResponseDto',) as QueueResponseDto; - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/search_api.dart b/mobile/openapi/lib/api/search_api.dart index 6f8a4df902..210325f752 100644 --- a/mobile/openapi/lib/api/search_api.dart +++ b/mobile/openapi/lib/api/search_api.dart @@ -1,31 +1,62 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class SearchApi { SearchApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion getAssetsByCityAddedIn = .new(1, 0, 0); + + static const ApiState getAssetsByCityState = .stable; + + static const ApiVersion getExploreDataAddedIn = .new(1, 0, 0); + + static const ApiState getExploreDataState = .stable; + + static const ApiVersion searchLargeAssetsAddedIn = .new(1, 0, 0); + + static const ApiState searchLargeAssetsState = .stable; + + static const ApiVersion searchAssetsAddedIn = .new(1, 0, 0); + + static const ApiState searchAssetsState = .stable; + + static const ApiVersion searchPersonAddedIn = .new(1, 0, 0); + + static const ApiState searchPersonState = .stable; + + static const ApiVersion searchPlacesAddedIn = .new(1, 0, 0); + + static const ApiState searchPlacesState = .stable; + + static const ApiVersion searchRandomAddedIn = .new(1, 0, 0); + + static const ApiState searchRandomState = .stable; + + static const ApiVersion searchSmartAddedIn = .new(1, 0, 0); + + static const ApiState searchSmartState = .stable; + + static const ApiVersion searchAssetStatisticsAddedIn = .new(1, 0, 0); + + static const ApiState searchAssetStatisticsState = .stable; + + static const ApiVersion getSearchSuggestionsAddedIn = .new(1, 0, 0); + + static const ApiState getSearchSuggestionsState = .stable; + /// Retrieve assets by city /// /// Retrieve a list of assets with each asset belonging to a different city. This endpoint is used on the places pages to show a single thumbnail for each city the user has assets in. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getAssetsByCityWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getAssetsByCityWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/search/cities'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -34,49 +65,47 @@ class SearchApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Retrieve assets by city /// /// Retrieve a list of assets with each asset belonging to a different city. This endpoint is used on the places pages to show a single thumbnail for each city the user has assets in. - Future?> getAssetsByCity() async { - final response = await getAssetsByCityWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future> getAssetsByCity({Future? abortTrigger}) async { + final response = await getAssetsByCityWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Retrieve explore data /// /// Retrieve data for the explore section, such as popular people and places. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getExploreDataWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getExploreDataWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/search/explore'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -85,369 +114,80 @@ class SearchApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Retrieve explore data /// /// Retrieve data for the explore section, such as popular people and places. - Future?> getExploreData() async { - final response = await getExploreDataWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future> getExploreData({Future? abortTrigger}) async { + final response = await getExploreDataWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; - } - - /// Retrieve search suggestions - /// - /// Retrieve search suggestions based on partial input. This endpoint is used for typeahead search features. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SearchSuggestionType] type (required): - /// - /// * [String] country: - /// Filter by country - /// - /// * [bool] includeNull: - /// Include null values in suggestions - /// - /// * [String] lensModel: - /// Filter by lens model - /// - /// * [String] make: - /// Filter by camera make - /// - /// * [String] model: - /// Filter by camera model - /// - /// * [String] state: - /// Filter by state/province - Future getSearchSuggestionsWithHttpInfo(SearchSuggestionType type, { String? country, bool? includeNull, String? lensModel, String? make, String? model, String? state, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/search/suggestions'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - if (country != null) { - queryParams.addAll(_queryParams('', 'country', country)); - } - if (includeNull != null) { - queryParams.addAll(_queryParams('', 'includeNull', includeNull)); - } - if (lensModel != null) { - queryParams.addAll(_queryParams('', 'lensModel', lensModel)); - } - if (make != null) { - queryParams.addAll(_queryParams('', 'make', make)); - } - if (model != null) { - queryParams.addAll(_queryParams('', 'model', model)); - } - if (state != null) { - queryParams.addAll(_queryParams('', 'state', state)); - } - queryParams.addAll(_queryParams('', 'type', type)); - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve search suggestions - /// - /// Retrieve search suggestions based on partial input. This endpoint is used for typeahead search features. - /// - /// Parameters: - /// - /// * [SearchSuggestionType] type (required): - /// - /// * [String] country: - /// Filter by country - /// - /// * [bool] includeNull: - /// Include null values in suggestions - /// - /// * [String] lensModel: - /// Filter by lens model - /// - /// * [String] make: - /// Filter by camera make - /// - /// * [String] model: - /// Filter by camera model - /// - /// * [String] state: - /// Filter by state/province - Future?> getSearchSuggestions(SearchSuggestionType type, { String? country, bool? includeNull, String? lensModel, String? make, String? model, String? state, }) async { - final response = await getSearchSuggestionsWithHttpInfo(type, country: country, includeNull: includeNull, lensModel: lensModel, make: make, model: model, state: state, ); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Search asset statistics - /// - /// Retrieve statistical data about assets based on search criteria, such as the total matching count. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [StatisticsSearchDto] statisticsSearchDto (required): - Future searchAssetStatisticsWithHttpInfo(StatisticsSearchDto statisticsSearchDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/search/statistics'; - - // ignore: prefer_final_locals - Object? postBody = statisticsSearchDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Search asset statistics - /// - /// Retrieve statistical data about assets based on search criteria, such as the total matching count. - /// - /// Parameters: - /// - /// * [StatisticsSearchDto] statisticsSearchDto (required): - Future searchAssetStatistics(StatisticsSearchDto statisticsSearchDto,) async { - final response = await searchAssetStatisticsWithHttpInfo(statisticsSearchDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SearchStatisticsResponseDto',) as SearchStatisticsResponseDto; - - } - return null; - } - - /// Search assets by metadata - /// - /// Search for assets based on various metadata criteria. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [MetadataSearchDto] metadataSearchDto (required): - Future searchAssetsWithHttpInfo(MetadataSearchDto metadataSearchDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/search/metadata'; - - // ignore: prefer_final_locals - Object? postBody = metadataSearchDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Search assets by metadata - /// - /// Search for assets based on various metadata criteria. - /// - /// Parameters: - /// - /// * [MetadataSearchDto] metadataSearchDto (required): - Future searchAssets(MetadataSearchDto metadataSearchDto,) async { - final response = await searchAssetsWithHttpInfo(metadataSearchDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SearchResponseDto',) as SearchResponseDto; - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Search large assets /// /// Search for assets that are considered large based on specified criteria. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [List] albumIds: - /// Filter by album IDs - /// - /// * [String] city: - /// Filter by city name - /// - /// * [String] country: - /// Filter by country name - /// - /// * [DateTime] createdAfter: - /// Filter by creation date (after) - /// - /// * [DateTime] createdBefore: - /// Filter by creation date (before) - /// - /// * [bool] isEncoded: - /// Filter by encoded status - /// - /// * [bool] isFavorite: - /// Filter by favorite status - /// - /// * [bool] isMotion: - /// Filter by motion photo status - /// - /// * [bool] isNotInAlbum: - /// Filter assets not in any album - /// - /// * [bool] isOffline: - /// Filter by offline status - /// - /// * [String] lensModel: - /// Filter by lens model - /// - /// * [String] libraryId: - /// Library ID to filter by - /// - /// * [String] make: - /// Filter by camera make - /// - /// * [int] minFileSize: - /// Minimum file size in bytes - /// - /// * [String] model: - /// Filter by camera model - /// - /// * [String] ocr: - /// Filter by OCR text content - /// - /// * [List] personIds: - /// Filter by person IDs - /// - /// * [int] rating: - /// Filter by rating [1-5], or null for unrated - /// - /// * [int] size: - /// Number of results to return - /// - /// * [String] state: - /// Filter by state/province name - /// - /// * [List] tagIds: - /// Filter by tag IDs - /// - /// * [DateTime] takenAfter: - /// Filter by taken date (after) - /// - /// * [DateTime] takenBefore: - /// Filter by taken date (before) - /// - /// * [DateTime] trashedAfter: - /// Filter by trash date (after) - /// - /// * [DateTime] trashedBefore: - /// Filter by trash date (before) - /// - /// * [AssetTypeEnum] type: - /// - /// * [DateTime] updatedAfter: - /// Filter by update date (after) - /// - /// * [DateTime] updatedBefore: - /// Filter by update date (before) - /// - /// * [AssetVisibility] visibility: - /// - /// * [bool] withDeleted: - /// Include deleted assets - /// - /// * [bool] withExif: - /// Include EXIF data in response - Future searchLargeAssetsWithHttpInfo({ List? albumIds, String? city, String? country, DateTime? createdAfter, DateTime? createdBefore, bool? isEncoded, bool? isFavorite, bool? isMotion, bool? isNotInAlbum, bool? isOffline, String? lensModel, String? libraryId, String? make, int? minFileSize, String? model, String? ocr, List? personIds, int? rating, int? size, String? state, List? tagIds, DateTime? takenAfter, DateTime? takenBefore, DateTime? trashedAfter, DateTime? trashedBefore, AssetTypeEnum? type, DateTime? updatedAfter, DateTime? updatedBefore, AssetVisibility? visibility, bool? withDeleted, bool? withExif, }) async { - // ignore: prefer_const_declarations + Future searchLargeAssetsWithHttpInfo({ + List? albumIds, + String? city, + String? country, + DateTime? createdAfter, + DateTime? createdBefore, + bool? isEncoded, + bool? isFavorite, + bool? isMotion, + bool? isNotInAlbum, + bool? isOffline, + String? lensModel, + String? libraryId, + String? make, + int? minFileSize, + String? model, + String? ocr, + List? personIds, + int? rating, + int? size, + String? state, + List? tagIds, + DateTime? takenAfter, + DateTime? takenBefore, + DateTime? trashedAfter, + DateTime? trashedBefore, + AssetTypeEnum? type, + DateTime? updatedAfter, + DateTime? updatedBefore, + AssetVisibility? visibility, + bool? withDeleted, + bool? withExif, + Future? abortTrigger, + }) async { final apiPath = r'/search/large-assets'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -550,15 +290,15 @@ class SearchApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -566,156 +306,170 @@ class SearchApi { /// /// Search for assets that are considered large based on specified criteria. /// - /// Parameters: - /// - /// * [List] albumIds: - /// Filter by album IDs - /// - /// * [String] city: - /// Filter by city name - /// - /// * [String] country: - /// Filter by country name - /// - /// * [DateTime] createdAfter: - /// Filter by creation date (after) - /// - /// * [DateTime] createdBefore: - /// Filter by creation date (before) - /// - /// * [bool] isEncoded: - /// Filter by encoded status - /// - /// * [bool] isFavorite: - /// Filter by favorite status - /// - /// * [bool] isMotion: - /// Filter by motion photo status - /// - /// * [bool] isNotInAlbum: - /// Filter assets not in any album - /// - /// * [bool] isOffline: - /// Filter by offline status - /// - /// * [String] lensModel: - /// Filter by lens model - /// - /// * [String] libraryId: - /// Library ID to filter by - /// - /// * [String] make: - /// Filter by camera make - /// - /// * [int] minFileSize: - /// Minimum file size in bytes - /// - /// * [String] model: - /// Filter by camera model - /// - /// * [String] ocr: - /// Filter by OCR text content - /// - /// * [List] personIds: - /// Filter by person IDs - /// - /// * [int] rating: - /// Filter by rating [1-5], or null for unrated - /// - /// * [int] size: - /// Number of results to return - /// - /// * [String] state: - /// Filter by state/province name - /// - /// * [List] tagIds: - /// Filter by tag IDs - /// - /// * [DateTime] takenAfter: - /// Filter by taken date (after) - /// - /// * [DateTime] takenBefore: - /// Filter by taken date (before) - /// - /// * [DateTime] trashedAfter: - /// Filter by trash date (after) - /// - /// * [DateTime] trashedBefore: - /// Filter by trash date (before) - /// - /// * [AssetTypeEnum] type: - /// - /// * [DateTime] updatedAfter: - /// Filter by update date (after) - /// - /// * [DateTime] updatedBefore: - /// Filter by update date (before) - /// - /// * [AssetVisibility] visibility: - /// - /// * [bool] withDeleted: - /// Include deleted assets - /// - /// * [bool] withExif: - /// Include EXIF data in response - Future?> searchLargeAssets({ List? albumIds, String? city, String? country, DateTime? createdAfter, DateTime? createdBefore, bool? isEncoded, bool? isFavorite, bool? isMotion, bool? isNotInAlbum, bool? isOffline, String? lensModel, String? libraryId, String? make, int? minFileSize, String? model, String? ocr, List? personIds, int? rating, int? size, String? state, List? tagIds, DateTime? takenAfter, DateTime? takenBefore, DateTime? trashedAfter, DateTime? trashedBefore, AssetTypeEnum? type, DateTime? updatedAfter, DateTime? updatedBefore, AssetVisibility? visibility, bool? withDeleted, bool? withExif, }) async { - final response = await searchLargeAssetsWithHttpInfo( albumIds: albumIds, city: city, country: country, createdAfter: createdAfter, createdBefore: createdBefore, isEncoded: isEncoded, isFavorite: isFavorite, isMotion: isMotion, isNotInAlbum: isNotInAlbum, isOffline: isOffline, lensModel: lensModel, libraryId: libraryId, make: make, minFileSize: minFileSize, model: model, ocr: ocr, personIds: personIds, rating: rating, size: size, state: state, tagIds: tagIds, takenAfter: takenAfter, takenBefore: takenBefore, trashedAfter: trashedAfter, trashedBefore: trashedBefore, type: type, updatedAfter: updatedAfter, updatedBefore: updatedBefore, visibility: visibility, withDeleted: withDeleted, withExif: withExif, ); + /// Available since server v1.0.0. + Future> searchLargeAssets({ + List? albumIds, + String? city, + String? country, + DateTime? createdAfter, + DateTime? createdBefore, + bool? isEncoded, + bool? isFavorite, + bool? isMotion, + bool? isNotInAlbum, + bool? isOffline, + String? lensModel, + String? libraryId, + String? make, + int? minFileSize, + String? model, + String? ocr, + List? personIds, + int? rating, + int? size, + String? state, + List? tagIds, + DateTime? takenAfter, + DateTime? takenBefore, + DateTime? trashedAfter, + DateTime? trashedBefore, + AssetTypeEnum? type, + DateTime? updatedAfter, + DateTime? updatedBefore, + AssetVisibility? visibility, + bool? withDeleted, + bool? withExif, + Future? abortTrigger, + }) async { + final response = await searchLargeAssetsWithHttpInfo( + albumIds: albumIds, + city: city, + country: country, + createdAfter: createdAfter, + createdBefore: createdBefore, + isEncoded: isEncoded, + isFavorite: isFavorite, + isMotion: isMotion, + isNotInAlbum: isNotInAlbum, + isOffline: isOffline, + lensModel: lensModel, + libraryId: libraryId, + make: make, + minFileSize: minFileSize, + model: model, + ocr: ocr, + personIds: personIds, + rating: rating, + size: size, + state: state, + tagIds: tagIds, + takenAfter: takenAfter, + takenBefore: takenBefore, + trashedAfter: trashedAfter, + trashedBefore: trashedBefore, + type: type, + updatedAfter: updatedAfter, + updatedBefore: updatedBefore, + visibility: visibility, + withDeleted: withDeleted, + withExif: withExif, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Search assets by metadata + /// + /// Search for assets based on various metadata criteria. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future searchAssetsWithHttpInfo(MetadataSearchDto metadataSearchDto, {Future? abortTrigger}) async { + final apiPath = r'/search/metadata'; + + Object? postBody = metadataSearchDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Search assets by metadata + /// + /// Search for assets based on various metadata criteria. + /// + /// Available since server v1.0.0. + Future searchAssets(MetadataSearchDto metadataSearchDto, {Future? abortTrigger}) async { + final response = await searchAssetsWithHttpInfo(metadataSearchDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SearchResponseDto') + as SearchResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Search people /// /// Search for people by name. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] name (required): - /// Person name to search for - /// - /// * [bool] withHidden: - /// Include hidden people - Future searchPersonWithHttpInfo(String name, { bool? withHidden, }) async { - // ignore: prefer_const_declarations + Future searchPersonWithHttpInfo({ + required String name, + bool? withHidden, + Future? abortTrigger, + }) async { final apiPath = r'/search/person'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - queryParams.addAll(_queryParams('', 'name', name)); + queryParams.addAll(_queryParams('', 'name', name)); if (withHidden != null) { queryParams.addAll(_queryParams('', 'withHidden', withHidden)); } const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -723,65 +477,54 @@ class SearchApi { /// /// Search for people by name. /// - /// Parameters: - /// - /// * [String] name (required): - /// Person name to search for - /// - /// * [bool] withHidden: - /// Include hidden people - Future?> searchPerson(String name, { bool? withHidden, }) async { - final response = await searchPersonWithHttpInfo(name, withHidden: withHidden, ); + /// Available since server v1.0.0. + Future> searchPerson({ + required String name, + bool? withHidden, + Future? abortTrigger, + }) async { + final response = await searchPersonWithHttpInfo(name: name, withHidden: withHidden, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Search places /// /// Search for places by name. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] name (required): - /// Place name to search for - Future searchPlacesWithHttpInfo(String name,) async { - // ignore: prefer_const_declarations + Future searchPlacesWithHttpInfo({required String name, Future? abortTrigger}) async { final apiPath = r'/search/places'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - queryParams.addAll(_queryParams('', 'name', name)); + queryParams.addAll(_queryParams('', 'name', name)); const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -789,59 +532,48 @@ class SearchApi { /// /// Search for places by name. /// - /// Parameters: - /// - /// * [String] name (required): - /// Place name to search for - Future?> searchPlaces(String name,) async { - final response = await searchPlacesWithHttpInfo(name,); + /// Available since server v1.0.0. + Future> searchPlaces({required String name, Future? abortTrigger}) async { + final response = await searchPlacesWithHttpInfo(name: name, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Search random assets /// /// Retrieve a random selection of assets based on the provided criteria. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [RandomSearchDto] randomSearchDto (required): - Future searchRandomWithHttpInfo(RandomSearchDto randomSearchDto,) async { - // ignore: prefer_const_declarations + Future searchRandomWithHttpInfo(RandomSearchDto randomSearchDto, {Future? abortTrigger}) async { final apiPath = r'/search/random'; - // ignore: prefer_final_locals Object? postBody = randomSearchDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -849,58 +581,48 @@ class SearchApi { /// /// Retrieve a random selection of assets based on the provided criteria. /// - /// Parameters: - /// - /// * [RandomSearchDto] randomSearchDto (required): - Future?> searchRandom(RandomSearchDto randomSearchDto,) async { - final response = await searchRandomWithHttpInfo(randomSearchDto,); + /// Available since server v1.0.0. + Future> searchRandom(RandomSearchDto randomSearchDto, {Future? abortTrigger}) async { + final response = await searchRandomWithHttpInfo(randomSearchDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Smart asset search /// /// Perform a smart search for assets by using machine learning vectors to determine relevance. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SmartSearchDto] smartSearchDto (required): - Future searchSmartWithHttpInfo(SmartSearchDto smartSearchDto,) async { - // ignore: prefer_const_declarations + Future searchSmartWithHttpInfo(SmartSearchDto smartSearchDto, {Future? abortTrigger}) async { final apiPath = r'/search/smart'; - // ignore: prefer_final_locals Object? postBody = smartSearchDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -908,21 +630,165 @@ class SearchApi { /// /// Perform a smart search for assets by using machine learning vectors to determine relevance. /// - /// Parameters: - /// - /// * [SmartSearchDto] smartSearchDto (required): - Future searchSmart(SmartSearchDto smartSearchDto,) async { - final response = await searchSmartWithHttpInfo(smartSearchDto,); + /// Available since server v1.0.0. + Future searchSmart(SmartSearchDto smartSearchDto, {Future? abortTrigger}) async { + final response = await searchSmartWithHttpInfo(smartSearchDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SearchResponseDto',) as SearchResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SearchResponseDto') + as SearchResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Search asset statistics + /// + /// Retrieve statistical data about assets based on search criteria, such as the total matching count. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future searchAssetStatisticsWithHttpInfo( + StatisticsSearchDto statisticsSearchDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/search/statistics'; + + Object? postBody = statisticsSearchDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Search asset statistics + /// + /// Retrieve statistical data about assets based on search criteria, such as the total matching count. + /// + /// Available since server v1.0.0. + Future searchAssetStatistics( + StatisticsSearchDto statisticsSearchDto, { + Future? abortTrigger, + }) async { + final response = await searchAssetStatisticsWithHttpInfo(statisticsSearchDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SearchStatisticsResponseDto') + as SearchStatisticsResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve search suggestions + /// + /// Retrieve search suggestions based on partial input. This endpoint is used for typeahead search features. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getSearchSuggestionsWithHttpInfo({ + String? country, + bool? includeNull, + String? lensModel, + String? make, + String? model, + String? state, + required SearchSuggestionType type, + Future? abortTrigger, + }) async { + final apiPath = r'/search/suggestions'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + if (country != null) { + queryParams.addAll(_queryParams('', 'country', country)); + } + if (includeNull != null) { + queryParams.addAll(_queryParams('', 'includeNull', includeNull)); + } + if (lensModel != null) { + queryParams.addAll(_queryParams('', 'lensModel', lensModel)); + } + if (make != null) { + queryParams.addAll(_queryParams('', 'make', make)); + } + if (model != null) { + queryParams.addAll(_queryParams('', 'model', model)); + } + if (state != null) { + queryParams.addAll(_queryParams('', 'state', state)); + } + queryParams.addAll(_queryParams('', 'type', type)); + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve search suggestions + /// + /// Retrieve search suggestions based on partial input. This endpoint is used for typeahead search features. + /// + /// Available since server v1.0.0. + Future> getSearchSuggestions({ + String? country, + bool? includeNull, + String? lensModel, + String? make, + String? model, + String? state, + required SearchSuggestionType type, + Future? abortTrigger, + }) async { + final response = await getSearchSuggestionsWithHttpInfo( + country: country, + includeNull: includeNull, + lensModel: lensModel, + make: make, + model: model, + state: state, + type: type, + abortTrigger: abortTrigger, + ); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List).cast().toList( + growable: false, + ); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/server_api.dart b/mobile/openapi/lib/api/server_api.dart index dd38ade167..cd51794b3b 100644 --- a/mobile/openapi/lib/api/server_api.dart +++ b/mobile/openapi/lib/api/server_api.dart @@ -1,71 +1,78 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class ServerApi { ServerApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Delete server product key - /// - /// Delete the currently set server product key. - /// - /// Note: This method returns the HTTP [Response]. - Future deleteServerLicenseWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/server/license'; + static const ApiVersion getAboutInfoAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody; + static const ApiState getAboutInfoState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion getApkLinksAddedIn = .new(1, 0, 0); - const contentTypes = []; + static const ApiState getApkLinksState = .stable; + static const ApiVersion getServerConfigAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState getServerConfigState = .stable; - /// Delete server product key - /// - /// Delete the currently set server product key. - Future deleteServerLicense() async { - final response = await deleteServerLicenseWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiVersion getServerFeaturesAddedIn = .new(1, 0, 0); + + static const ApiState getServerFeaturesState = .stable; + + static const ApiVersion deleteServerLicenseAddedIn = .new(1, 0, 0); + + static const ApiState deleteServerLicenseState = .stable; + + static const ApiVersion getServerLicenseAddedIn = .new(1, 0, 0); + + static const ApiState getServerLicenseState = .stable; + + static const ApiVersion setServerLicenseAddedIn = .new(1, 0, 0); + + static const ApiState setServerLicenseState = .stable; + + static const ApiVersion getSupportedMediaTypesAddedIn = .new(1, 0, 0); + + static const ApiState getSupportedMediaTypesState = .stable; + + static const ApiVersion pingServerAddedIn = .new(1, 0, 0); + + static const ApiState pingServerState = .stable; + + static const ApiVersion getServerStatisticsAddedIn = .new(1, 0, 0); + + static const ApiState getServerStatisticsState = .stable; + + static const ApiVersion getStorageAddedIn = .new(1, 0, 0); + + static const ApiState getStorageState = .stable; + + static const ApiVersion getServerVersionAddedIn = .new(1, 0, 0); + + static const ApiState getServerVersionState = .stable; + + static const ApiVersion getVersionCheckAddedIn = .new(1, 0, 0); + + static const ApiState getVersionCheckState = .stable; + + static const ApiVersion getVersionHistoryAddedIn = .new(1, 0, 0); + + static const ApiState getVersionHistoryState = .stable; /// Get server information /// /// Retrieve a list of information about the server. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getAboutInfoWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getAboutInfoWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/server/about'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -74,46 +81,45 @@ class ServerApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Get server information /// /// Retrieve a list of information about the server. - Future getAboutInfo() async { - final response = await getAboutInfoWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future getAboutInfo({Future? abortTrigger}) async { + final response = await getAboutInfoWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ServerAboutResponseDto',) as ServerAboutResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ServerAboutResponseDto') + as ServerAboutResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Get APK links /// /// Retrieve links to the APKs for the current server version. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getApkLinksWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getApkLinksWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/server/apk-links'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -122,46 +128,45 @@ class ServerApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Get APK links /// /// Retrieve links to the APKs for the current server version. - Future getApkLinks() async { - final response = await getApkLinksWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future getApkLinks({Future? abortTrigger}) async { + final response = await getApkLinksWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ServerApkLinksDto',) as ServerApkLinksDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ServerApkLinksDto') + as ServerApkLinksDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Get config /// /// Retrieve the current server configuration. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getServerConfigWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getServerConfigWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/server/config'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -170,46 +175,44 @@ class ServerApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Get config /// /// Retrieve the current server configuration. - Future getServerConfig() async { - final response = await getServerConfigWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future getServerConfig({Future? abortTrigger}) async { + final response = await getServerConfigWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ServerConfigDto',) as ServerConfigDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ServerConfigDto') as ServerConfigDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Get features /// /// Retrieve available features supported by this server. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getServerFeaturesWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getServerFeaturesWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/server/features'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -218,46 +221,45 @@ class ServerApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Get features /// /// Retrieve available features supported by this server. - Future getServerFeatures() async { - final response = await getServerFeaturesWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future getServerFeatures({Future? abortTrigger}) async { + final response = await getServerFeaturesWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ServerFeaturesDto',) as ServerFeaturesDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ServerFeaturesDto') + as ServerFeaturesDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } - /// Get product key + /// Delete server product key /// - /// Retrieve information about whether the server currently has a product key registered. + /// Delete the currently set server product key. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - Future getServerLicenseWithHttpInfo() async { - // ignore: prefer_const_declarations + Future deleteServerLicenseWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/server/license'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -266,406 +268,104 @@ class ServerApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete server product key + /// + /// Delete the currently set server product key. + /// + /// Available since server v1.0.0. + Future deleteServerLicense({Future? abortTrigger}) async { + final response = await deleteServerLicenseWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Get product key + /// + /// Retrieve information about whether the server currently has a product key registered. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getServerLicenseWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/server/license'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Get product key /// /// Retrieve information about whether the server currently has a product key registered. - Future getServerLicense() async { - final response = await getServerLicenseWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future getServerLicense({Future? abortTrigger}) async { + final response = await getServerLicenseWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserLicense',) as UserLicense; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'LicenseResponseDto') + as LicenseResponseDto; } - return null; - } - - /// Get statistics - /// - /// Retrieve statistics about the entire Immich instance such as asset counts. - /// - /// Note: This method returns the HTTP [Response]. - Future getServerStatisticsWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/server/statistics'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get statistics - /// - /// Retrieve statistics about the entire Immich instance such as asset counts. - Future getServerStatistics() async { - final response = await getServerStatisticsWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ServerStatsResponseDto',) as ServerStatsResponseDto; - - } - return null; - } - - /// Get server version - /// - /// Retrieve the current server version in semantic versioning (semver) format. - /// - /// Note: This method returns the HTTP [Response]. - Future getServerVersionWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/server/version'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get server version - /// - /// Retrieve the current server version in semantic versioning (semver) format. - Future getServerVersion() async { - final response = await getServerVersionWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ServerVersionResponseDto',) as ServerVersionResponseDto; - - } - return null; - } - - /// Get storage - /// - /// Retrieve the current storage utilization information of the server. - /// - /// Note: This method returns the HTTP [Response]. - Future getStorageWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/server/storage'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get storage - /// - /// Retrieve the current storage utilization information of the server. - Future getStorage() async { - final response = await getStorageWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ServerStorageResponseDto',) as ServerStorageResponseDto; - - } - return null; - } - - /// Get supported media types - /// - /// Retrieve all media types supported by the server. - /// - /// Note: This method returns the HTTP [Response]. - Future getSupportedMediaTypesWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/server/media-types'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get supported media types - /// - /// Retrieve all media types supported by the server. - Future getSupportedMediaTypes() async { - final response = await getSupportedMediaTypesWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ServerMediaTypesResponseDto',) as ServerMediaTypesResponseDto; - - } - return null; - } - - /// Get version check status - /// - /// Retrieve information about the last time the version check ran. - /// - /// Note: This method returns the HTTP [Response]. - Future getVersionCheckWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/server/version-check'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get version check status - /// - /// Retrieve information about the last time the version check ran. - Future getVersionCheck() async { - final response = await getVersionCheckWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'VersionCheckStateResponseDto',) as VersionCheckStateResponseDto; - - } - return null; - } - - /// Get version history - /// - /// Retrieve a list of past versions the server has been on. - /// - /// Note: This method returns the HTTP [Response]. - Future getVersionHistoryWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/server/version-history'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get version history - /// - /// Retrieve a list of past versions the server has been on. - Future?> getVersionHistory() async { - final response = await getVersionHistoryWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Ping - /// - /// Pong - /// - /// Note: This method returns the HTTP [Response]. - Future pingServerWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/server/ping'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Ping - /// - /// Pong - Future pingServer() async { - final response = await pingServerWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ServerPingResponse',) as ServerPingResponse; - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Set server product key /// /// Validate and set the server product key if successful. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [LicenseKeyDto] licenseKeyDto (required): - Future setServerLicenseWithHttpInfo(LicenseKeyDto licenseKeyDto,) async { - // ignore: prefer_const_declarations + Future setServerLicenseWithHttpInfo(LicenseKeyDto licenseKeyDto, {Future? abortTrigger}) async { final apiPath = r'/server/license'; - // ignore: prefer_final_locals Object? postBody = licenseKeyDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -673,21 +373,347 @@ class ServerApi { /// /// Validate and set the server product key if successful. /// - /// Parameters: - /// - /// * [LicenseKeyDto] licenseKeyDto (required): - Future setServerLicense(LicenseKeyDto licenseKeyDto,) async { - final response = await setServerLicenseWithHttpInfo(licenseKeyDto,); + /// Available since server v1.0.0. + Future setServerLicense(LicenseKeyDto licenseKeyDto, {Future? abortTrigger}) async { + final response = await setServerLicenseWithHttpInfo(licenseKeyDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserLicense',) as UserLicense; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'LicenseResponseDto') + as LicenseResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get supported media types + /// + /// Retrieve all media types supported by the server. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getSupportedMediaTypesWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/server/media-types'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get supported media types + /// + /// Retrieve all media types supported by the server. + /// + /// Available since server v1.0.0. + Future getSupportedMediaTypes({Future? abortTrigger}) async { + final response = await getSupportedMediaTypesWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ServerMediaTypesResponseDto') + as ServerMediaTypesResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Ping + /// + /// Pong + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future pingServerWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/server/ping'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Ping + /// + /// Pong + /// + /// Available since server v1.0.0. + Future pingServer({Future? abortTrigger}) async { + final response = await pingServerWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ServerPingResponse') + as ServerPingResponse; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get statistics + /// + /// Retrieve statistics about the entire Immich instance such as asset counts. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getServerStatisticsWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/server/statistics'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get statistics + /// + /// Retrieve statistics about the entire Immich instance such as asset counts. + /// + /// Available since server v1.0.0. + Future getServerStatistics({Future? abortTrigger}) async { + final response = await getServerStatisticsWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ServerStatsResponseDto') + as ServerStatsResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get storage + /// + /// Retrieve the current storage utilization information of the server. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getStorageWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/server/storage'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get storage + /// + /// Retrieve the current storage utilization information of the server. + /// + /// Available since server v1.0.0. + Future getStorage({Future? abortTrigger}) async { + final response = await getStorageWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ServerStorageResponseDto') + as ServerStorageResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get server version + /// + /// Retrieve the current server version in semantic versioning (semver) format. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getServerVersionWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/server/version'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get server version + /// + /// Retrieve the current server version in semantic versioning (semver) format. + /// + /// Available since server v1.0.0. + Future getServerVersion({Future? abortTrigger}) async { + final response = await getServerVersionWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ServerVersionResponseDto') + as ServerVersionResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get version check status + /// + /// Retrieve information about the last time the version check ran. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getVersionCheckWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/server/version-check'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get version check status + /// + /// Retrieve information about the last time the version check ran. + /// + /// Available since server v1.0.0. + Future getVersionCheck({Future? abortTrigger}) async { + final response = await getVersionCheckWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'VersionCheckStateResponseDto') + as VersionCheckStateResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get version history + /// + /// Retrieve a list of past versions the server has been on. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getVersionHistoryWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/server/version-history'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get version history + /// + /// Retrieve a list of past versions the server has been on. + /// + /// Available since server v1.0.0. + Future> getVersionHistory({Future? abortTrigger}) async { + final response = await getVersionHistoryWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/sessions_api.dart b/mobile/openapi/lib/api/sessions_api.dart index da508059bc..205bcc2549 100644 --- a/mobile/openapi/lib/api/sessions_api.dart +++ b/mobile/openapi/lib/api/sessions_api.dart @@ -1,52 +1,154 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class SessionsApi { SessionsApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion deleteAllSessionsAddedIn = .new(1, 0, 0); + + static const ApiState deleteAllSessionsState = .stable; + + static const ApiVersion getSessionsAddedIn = .new(1, 0, 0); + + static const ApiState getSessionsState = .stable; + + static const ApiVersion createSessionAddedIn = .new(1, 0, 0); + + static const ApiState createSessionState = .stable; + + static const ApiVersion deleteSessionAddedIn = .new(1, 0, 0); + + static const ApiState deleteSessionState = .stable; + + static const ApiVersion updateSessionAddedIn = .new(1, 0, 0); + + static const ApiState updateSessionState = .stable; + + static const ApiVersion lockSessionAddedIn = .new(1, 0, 0); + + static const ApiState lockSessionState = .stable; + + /// Delete all sessions + /// + /// Delete all sessions for the user. This will not delete the current session. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteAllSessionsWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/sessions'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete all sessions + /// + /// Delete all sessions for the user. This will not delete the current session. + /// + /// Available since server v1.0.0. + Future deleteAllSessions({Future? abortTrigger}) async { + final response = await deleteAllSessionsWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve sessions + /// + /// Retrieve a list of sessions for the user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getSessionsWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/sessions'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve sessions + /// + /// Retrieve a list of sessions for the user. + /// + /// Available since server v1.0.0. + Future> getSessions({Future? abortTrigger}) async { + final response = await getSessionsWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + /// Create a session /// /// Create a session as a child to the current session. This endpoint is used for casting. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SessionCreateDto] sessionCreateDto (required): - Future createSessionWithHttpInfo(SessionCreateDto sessionCreateDto,) async { - // ignore: prefer_const_declarations + Future createSessionWithHttpInfo(SessionCreateDto sessionCreateDto, {Future? abortTrigger}) async { final apiPath = r'/sessions'; - // ignore: prefer_final_locals Object? postBody = sessionCreateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -54,79 +156,32 @@ class SessionsApi { /// /// Create a session as a child to the current session. This endpoint is used for casting. /// - /// Parameters: - /// - /// * [SessionCreateDto] sessionCreateDto (required): - Future createSession(SessionCreateDto sessionCreateDto,) async { - final response = await createSessionWithHttpInfo(sessionCreateDto,); + /// Available since server v1.0.0. + Future createSession( + SessionCreateDto sessionCreateDto, { + Future? abortTrigger, + }) async { + final response = await createSessionWithHttpInfo(sessionCreateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SessionCreateResponseDto',) as SessionCreateResponseDto; - - } - return null; - } - - /// Delete all sessions - /// - /// Delete all sessions for the user. This will not delete the current session. - /// - /// Note: This method returns the HTTP [Response]. - Future deleteAllSessionsWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/sessions'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Delete all sessions - /// - /// Delete all sessions for the user. This will not delete the current session. - Future deleteAllSessions() async { - final response = await deleteAllSessionsWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SessionCreateResponseDto') + as SessionCreateResponseDto; } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Delete a session /// /// Delete a specific session by id. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteSessionWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/sessions/{id}' - .replaceAll('{id}', id); + Future deleteSessionWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/sessions/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -135,15 +190,15 @@ class SessionsApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'DELETE', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -151,111 +206,9 @@ class SessionsApi { /// /// Delete a specific session by id. /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteSession(String id,) async { - final response = await deleteSessionWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Retrieve sessions - /// - /// Retrieve a list of sessions for the user. - /// - /// Note: This method returns the HTTP [Response]. - Future getSessionsWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/sessions'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve sessions - /// - /// Retrieve a list of sessions for the user. - Future?> getSessions() async { - final response = await getSessionsWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Lock a session - /// - /// Lock a specific session by id. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future lockSessionWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/sessions/{id}/lock' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Lock a session - /// - /// Lock a specific session by id. - /// - /// Parameters: - /// - /// * [String] id (required): - Future lockSession(String id,) async { - final response = await lockSessionWithHttpInfo(id,); + /// Available since server v1.0.0. + Future deleteSession(String id, {Future? abortTrigger}) async { + final response = await deleteSessionWithHttpInfo(id, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } @@ -265,36 +218,33 @@ class SessionsApi { /// /// Update a specific session identified by id. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [SessionUpdateDto] sessionUpdateDto (required): - Future updateSessionWithHttpInfo(String id, SessionUpdateDto sessionUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/sessions/{id}' - .replaceAll('{id}', id); + Future updateSessionWithHttpInfo( + String id, + SessionUpdateDto sessionUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/sessions/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = sessionUpdateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -302,23 +252,62 @@ class SessionsApi { /// /// Update a specific session identified by id. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [SessionUpdateDto] sessionUpdateDto (required): - Future updateSession(String id, SessionUpdateDto sessionUpdateDto,) async { - final response = await updateSessionWithHttpInfo(id, sessionUpdateDto,); + /// Available since server v1.0.0. + Future updateSession( + String id, + SessionUpdateDto sessionUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updateSessionWithHttpInfo(id, sessionUpdateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SessionResponseDto',) as SessionResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SessionResponseDto') + as SessionResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Lock a session + /// + /// Lock a specific session by id. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future lockSessionWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/sessions/{id}/lock'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Lock a session + /// + /// Lock a specific session by id. + /// + /// Available since server v1.0.0. + Future lockSession(String id, {Future? abortTrigger}) async { + final response = await lockSessionWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - return null; } } diff --git a/mobile/openapi/lib/api/shared_links_api.dart b/mobile/openapi/lib/api/shared_links_api.dart index 4750442287..246d761362 100644 --- a/mobile/openapi/lib/api/shared_links_api.dart +++ b/mobile/openapi/lib/api/shared_links_api.dart @@ -1,159 +1,58 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class SharedLinksApi { SharedLinksApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Add assets to a shared link - /// - /// Add assets to a specific shared link by its ID. This endpoint is only relevant for shared link of type individual. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetIdsDto] assetIdsDto (required): - Future addSharedLinkAssetsWithHttpInfo(String id, AssetIdsDto assetIdsDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/shared-links/{id}/assets' - .replaceAll('{id}', id); + static const ApiVersion getAllSharedLinksAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody = assetIdsDto; + static const ApiState getAllSharedLinksState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion createSharedLinkAddedIn = .new(1, 0, 0); - const contentTypes = ['application/json']; + static const ApiState createSharedLinkState = .stable; + static const ApiVersion sharedLinkLoginAddedIn = .new(2, 6, 0); - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState sharedLinkLoginState = .beta; - /// Add assets to a shared link - /// - /// Add assets to a specific shared link by its ID. This endpoint is only relevant for shared link of type individual. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetIdsDto] assetIdsDto (required): - Future?> addSharedLinkAssets(String id, AssetIdsDto assetIdsDto,) async { - final response = await addSharedLinkAssetsWithHttpInfo(id, assetIdsDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); + static const ApiVersion getMySharedLinkAddedIn = .new(1, 0, 0); - } - return null; - } + static const ApiState getMySharedLinkState = .stable; - /// Create a shared link - /// - /// Create a new shared link. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SharedLinkCreateDto] sharedLinkCreateDto (required): - Future createSharedLinkWithHttpInfo(SharedLinkCreateDto sharedLinkCreateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/shared-links'; + static const ApiVersion removeSharedLinkAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody = sharedLinkCreateDto; + static const ApiState removeSharedLinkState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion getSharedLinkByIdAddedIn = .new(1, 0, 0); - const contentTypes = ['application/json']; + static const ApiState getSharedLinkByIdState = .stable; + static const ApiVersion updateSharedLinkAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState updateSharedLinkState = .stable; - /// Create a shared link - /// - /// Create a new shared link. - /// - /// Parameters: - /// - /// * [SharedLinkCreateDto] sharedLinkCreateDto (required): - Future createSharedLink(SharedLinkCreateDto sharedLinkCreateDto,) async { - final response = await createSharedLinkWithHttpInfo(sharedLinkCreateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SharedLinkResponseDto',) as SharedLinkResponseDto; - - } - return null; - } + static const ApiVersion removeSharedLinkAssetsAddedIn = .new(1, 0, 0); + + static const ApiState removeSharedLinkAssetsState = .stable; + + static const ApiVersion addSharedLinkAssetsAddedIn = .new(1, 0, 0); + + static const ApiState addSharedLinkAssetsState = .stable; /// Retrieve all shared links /// /// Retrieve a list of all shared links. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] albumId: - /// Filter by album ID - /// - /// * [String] id: - /// Filter by shared link ID - Future getAllSharedLinksWithHttpInfo({ String? albumId, String? id, }) async { - // ignore: prefer_const_declarations + Future getAllSharedLinksWithHttpInfo({String? albumId, String? id, Future? abortTrigger}) async { final apiPath = r'/shared-links'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -169,15 +68,15 @@ class SharedLinksApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -185,286 +84,93 @@ class SharedLinksApi { /// /// Retrieve a list of all shared links. /// - /// Parameters: - /// - /// * [String] albumId: - /// Filter by album ID - /// - /// * [String] id: - /// Filter by shared link ID - Future?> getAllSharedLinks({ String? albumId, String? id, }) async { - final response = await getAllSharedLinksWithHttpInfo( albumId: albumId, id: id, ); + /// Available since server v1.0.0. + Future> getAllSharedLinks({ + String? albumId, + String? id, + Future? abortTrigger, + }) async { + final response = await getAllSharedLinksWithHttpInfo(albumId: albumId, id: id, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } - /// Retrieve current shared link + /// Create a shared link /// - /// Retrieve the current shared link associated with authentication method. + /// Create a new shared link. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] key: - /// - /// * [String] slug: - Future getMySharedLinkWithHttpInfo({ String? key, String? slug, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/shared-links/me'; + Future createSharedLinkWithHttpInfo( + SharedLinkCreateDto sharedLinkCreateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/shared-links'; - // ignore: prefer_final_locals - Object? postBody; + Object? postBody = sharedLinkCreateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - if (key != null) { - queryParams.addAll(_queryParams('', 'key', key)); - } - if (slug != null) { - queryParams.addAll(_queryParams('', 'slug', slug)); - } - - const contentTypes = []; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'GET', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// Retrieve current shared link + /// Create a shared link /// - /// Retrieve the current shared link associated with authentication method. + /// Create a new shared link. /// - /// Parameters: - /// - /// * [String] key: - /// - /// * [String] slug: - Future getMySharedLink({ String? key, String? slug, }) async { - final response = await getMySharedLinkWithHttpInfo( key: key, slug: slug, ); + /// Available since server v1.0.0. + Future createSharedLink( + SharedLinkCreateDto sharedLinkCreateDto, { + Future? abortTrigger, + }) async { + final response = await createSharedLinkWithHttpInfo(sharedLinkCreateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SharedLinkResponseDto',) as SharedLinkResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SharedLinkResponseDto') + as SharedLinkResponseDto; } - return null; - } - - /// Retrieve a shared link - /// - /// Retrieve a specific shared link by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getSharedLinkByIdWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/shared-links/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve a shared link - /// - /// Retrieve a specific shared link by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getSharedLinkById(String id,) async { - final response = await getSharedLinkByIdWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SharedLinkResponseDto',) as SharedLinkResponseDto; - - } - return null; - } - - /// Delete a shared link - /// - /// Delete a specific shared link by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future removeSharedLinkWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/shared-links/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Delete a shared link - /// - /// Delete a specific shared link by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - Future removeSharedLink(String id,) async { - final response = await removeSharedLinkWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Remove assets from a shared link - /// - /// Remove assets from a specific shared link by its ID. This endpoint is only relevant for shared link of type individual. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetIdsDto] assetIdsDto (required): - Future removeSharedLinkAssetsWithHttpInfo(String id, AssetIdsDto assetIdsDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/shared-links/{id}/assets' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = assetIdsDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Remove assets from a shared link - /// - /// Remove assets from a specific shared link by its ID. This endpoint is only relevant for shared link of type individual. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [AssetIdsDto] assetIdsDto (required): - Future?> removeSharedLinkAssets(String id, AssetIdsDto assetIdsDto,) async { - final response = await removeSharedLinkAssetsWithHttpInfo(id, assetIdsDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Shared link login /// /// Login to a password protected shared link /// + /// Available since server v2.6.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SharedLinkLoginDto] sharedLinkLoginDto (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future sharedLinkLoginWithHttpInfo(SharedLinkLoginDto sharedLinkLoginDto, { String? key, String? slug, }) async { - // ignore: prefer_const_declarations + Future sharedLinkLoginWithHttpInfo( + SharedLinkLoginDto sharedLinkLoginDto, { + String? key, + String? slug, + Future? abortTrigger, + }) async { final apiPath = r'/shared-links/login'; - // ignore: prefer_final_locals Object? postBody = sharedLinkLoginDto; final queryParams = []; @@ -478,17 +184,17 @@ class SharedLinksApi { queryParams.addAll(_queryParams('', 'slug', slug)); } - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -496,62 +202,203 @@ class SharedLinksApi { /// /// Login to a password protected shared link /// - /// Parameters: - /// - /// * [SharedLinkLoginDto] sharedLinkLoginDto (required): - /// - /// * [String] key: - /// - /// * [String] slug: - Future sharedLinkLogin(SharedLinkLoginDto sharedLinkLoginDto, { String? key, String? slug, }) async { - final response = await sharedLinkLoginWithHttpInfo(sharedLinkLoginDto, key: key, slug: slug, ); + /// Available since server v2.6.0. + Future sharedLinkLogin( + SharedLinkLoginDto sharedLinkLoginDto, { + String? key, + String? slug, + Future? abortTrigger, + }) async { + final response = await sharedLinkLoginWithHttpInfo( + sharedLinkLoginDto, + key: key, + slug: slug, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SharedLinkResponseDto',) as SharedLinkResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SharedLinkResponseDto') + as SharedLinkResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve current shared link + /// + /// Retrieve the current shared link associated with authentication method. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getMySharedLinkWithHttpInfo({String? key, String? slug, Future? abortTrigger}) async { + final apiPath = r'/shared-links/me'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + if (key != null) { + queryParams.addAll(_queryParams('', 'key', key)); + } + if (slug != null) { + queryParams.addAll(_queryParams('', 'slug', slug)); + } + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve current shared link + /// + /// Retrieve the current shared link associated with authentication method. + /// + /// Available since server v1.0.0. + Future getMySharedLink({String? key, String? slug, Future? abortTrigger}) async { + final response = await getMySharedLinkWithHttpInfo(key: key, slug: slug, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SharedLinkResponseDto') + as SharedLinkResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete a shared link + /// + /// Delete a specific shared link by its ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future removeSharedLinkWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/shared-links/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete a shared link + /// + /// Delete a specific shared link by its ID. + /// + /// Available since server v1.0.0. + Future removeSharedLink(String id, {Future? abortTrigger}) async { + final response = await removeSharedLinkWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve a shared link + /// + /// Retrieve a specific shared link by its ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getSharedLinkByIdWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/shared-links/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve a shared link + /// + /// Retrieve a specific shared link by its ID. + /// + /// Available since server v1.0.0. + Future getSharedLinkById(String id, {Future? abortTrigger}) async { + final response = await getSharedLinkByIdWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SharedLinkResponseDto') + as SharedLinkResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update a shared link /// /// Update an existing shared link by its ID. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [SharedLinkEditDto] sharedLinkEditDto (required): - Future updateSharedLinkWithHttpInfo(String id, SharedLinkEditDto sharedLinkEditDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/shared-links/{id}' - .replaceAll('{id}', id); + Future updateSharedLinkWithHttpInfo( + String id, + SharedLinkEditDto sharedLinkEditDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/shared-links/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = sharedLinkEditDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PATCH', + r'PATCH', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -559,23 +406,134 @@ class SharedLinksApi { /// /// Update an existing shared link by its ID. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [SharedLinkEditDto] sharedLinkEditDto (required): - Future updateSharedLink(String id, SharedLinkEditDto sharedLinkEditDto,) async { - final response = await updateSharedLinkWithHttpInfo(id, sharedLinkEditDto,); + /// Available since server v1.0.0. + Future updateSharedLink( + String id, + SharedLinkEditDto sharedLinkEditDto, { + Future? abortTrigger, + }) async { + final response = await updateSharedLinkWithHttpInfo(id, sharedLinkEditDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SharedLinkResponseDto',) as SharedLinkResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SharedLinkResponseDto') + as SharedLinkResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Remove assets from a shared link + /// + /// Remove assets from a specific shared link by its ID. This endpoint is only relevant for shared link of type individual. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future removeSharedLinkAssetsWithHttpInfo( + String id, + AssetIdsDto assetIdsDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/shared-links/{id}/assets'.replaceAll('{id}', id); + + Object? postBody = assetIdsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Remove assets from a shared link + /// + /// Remove assets from a specific shared link by its ID. This endpoint is only relevant for shared link of type individual. + /// + /// Available since server v1.0.0. + Future> removeSharedLinkAssets( + String id, + AssetIdsDto assetIdsDto, { + Future? abortTrigger, + }) async { + final response = await removeSharedLinkAssetsWithHttpInfo(id, assetIdsDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Add assets to a shared link + /// + /// Add assets to a specific shared link by its ID. This endpoint is only relevant for shared link of type individual. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future addSharedLinkAssetsWithHttpInfo( + String id, + AssetIdsDto assetIdsDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/shared-links/{id}/assets'.replaceAll('{id}', id); + + Object? postBody = assetIdsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Add assets to a shared link + /// + /// Add assets to a specific shared link by its ID. This endpoint is only relevant for shared link of type individual. + /// + /// Available since server v1.0.0. + Future> addSharedLinkAssets( + String id, + AssetIdsDto assetIdsDto, { + Future? abortTrigger, + }) async { + final response = await addSharedLinkAssetsWithHttpInfo(id, assetIdsDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/stacks_api.dart b/mobile/openapi/lib/api/stacks_api.dart index a691af2a7d..a15aa97a50 100644 --- a/mobile/openapi/lib/api/stacks_api.dart +++ b/mobile/openapi/lib/api/stacks_api.dart @@ -1,157 +1,67 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class StacksApi { StacksApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Create a stack - /// - /// Create a new stack by providing a name and a list of asset IDs to include in the stack. If any of the provided asset IDs are primary assets of an existing stack, the existing stack will be merged into the newly created stack. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [StackCreateDto] stackCreateDto (required): - Future createStackWithHttpInfo(StackCreateDto stackCreateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/stacks'; + static const ApiVersion deleteStacksAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody = stackCreateDto; + static const ApiState deleteStacksState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion searchStacksAddedIn = .new(1, 0, 0); - const contentTypes = ['application/json']; + static const ApiState searchStacksState = .stable; + static const ApiVersion createStackAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState createStackState = .stable; - /// Create a stack - /// - /// Create a new stack by providing a name and a list of asset IDs to include in the stack. If any of the provided asset IDs are primary assets of an existing stack, the existing stack will be merged into the newly created stack. - /// - /// Parameters: - /// - /// * [StackCreateDto] stackCreateDto (required): - Future createStack(StackCreateDto stackCreateDto,) async { - final response = await createStackWithHttpInfo(stackCreateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'StackResponseDto',) as StackResponseDto; - - } - return null; - } + static const ApiVersion deleteStackAddedIn = .new(1, 0, 0); - /// Delete a stack - /// - /// Delete a specific stack by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteStackWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/stacks/{id}' - .replaceAll('{id}', id); + static const ApiState deleteStackState = .stable; - // ignore: prefer_final_locals - Object? postBody; + static const ApiVersion getStackAddedIn = .new(1, 0, 0); - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiState getStackState = .stable; - const contentTypes = []; + static const ApiVersion updateStackAddedIn = .new(1, 0, 0); + static const ApiState updateStackState = .stable; - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiVersion removeAssetFromStackAddedIn = .new(1, 0, 0); - /// Delete a stack - /// - /// Delete a specific stack by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteStack(String id,) async { - final response = await deleteStackWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiState removeAssetFromStackState = .stable; /// Delete stacks /// /// Delete multiple stacks by providing a list of stack IDs. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future deleteStacksWithHttpInfo(BulkIdsDto bulkIdsDto,) async { - // ignore: prefer_const_declarations + Future deleteStacksWithHttpInfo(BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { final apiPath = r'/stacks'; - // ignore: prefer_final_locals Object? postBody = bulkIdsDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'DELETE', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -159,122 +69,9 @@ class StacksApi { /// /// Delete multiple stacks by providing a list of stack IDs. /// - /// Parameters: - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future deleteStacks(BulkIdsDto bulkIdsDto,) async { - final response = await deleteStacksWithHttpInfo(bulkIdsDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Retrieve a stack - /// - /// Retrieve a specific stack by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getStackWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/stacks/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve a stack - /// - /// Retrieve a specific stack by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getStack(String id,) async { - final response = await getStackWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'StackResponseDto',) as StackResponseDto; - - } - return null; - } - - /// Remove an asset from a stack - /// - /// Remove a specific asset from a stack by providing the stack ID and asset ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] assetId (required): - /// - /// * [String] id (required): - Future removeAssetFromStackWithHttpInfo(String assetId, String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/stacks/{id}/assets/{assetId}' - .replaceAll('{assetId}', assetId) - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Remove an asset from a stack - /// - /// Remove a specific asset from a stack by providing the stack ID and asset ID. - /// - /// Parameters: - /// - /// * [String] assetId (required): - /// - /// * [String] id (required): - Future removeAssetFromStack(String assetId, String id,) async { - final response = await removeAssetFromStackWithHttpInfo(assetId, id,); + /// Available since server v1.0.0. + Future deleteStacks(BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { + final response = await deleteStacksWithHttpInfo(bulkIdsDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } @@ -284,17 +81,12 @@ class StacksApi { /// /// Retrieve a list of stacks. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] primaryAssetId: - /// Filter by primary asset ID - Future searchStacksWithHttpInfo({ String? primaryAssetId, }) async { - // ignore: prefer_const_declarations + Future searchStacksWithHttpInfo({String? primaryAssetId, Future? abortTrigger}) async { final apiPath = r'/stacks'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -307,15 +99,15 @@ class StacksApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -323,62 +115,188 @@ class StacksApi { /// /// Retrieve a list of stacks. /// - /// Parameters: - /// - /// * [String] primaryAssetId: - /// Filter by primary asset ID - Future?> searchStacks({ String? primaryAssetId, }) async { - final response = await searchStacksWithHttpInfo( primaryAssetId: primaryAssetId, ); + /// Available since server v1.0.0. + Future> searchStacks({String? primaryAssetId, Future? abortTrigger}) async { + final response = await searchStacksWithHttpInfo(primaryAssetId: primaryAssetId, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Create a stack + /// + /// Create a new stack by providing a name and a list of asset IDs to include in the stack. If any of the provided asset IDs are primary assets of an existing stack, the existing stack will be merged into the newly created stack. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future createStackWithHttpInfo(StackCreateDto stackCreateDto, {Future? abortTrigger}) async { + final apiPath = r'/stacks'; + + Object? postBody = stackCreateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Create a stack + /// + /// Create a new stack by providing a name and a list of asset IDs to include in the stack. If any of the provided asset IDs are primary assets of an existing stack, the existing stack will be merged into the newly created stack. + /// + /// Available since server v1.0.0. + Future createStack(StackCreateDto stackCreateDto, {Future? abortTrigger}) async { + final response = await createStackWithHttpInfo(stackCreateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'StackResponseDto') + as StackResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete a stack + /// + /// Delete a specific stack by its ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteStackWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/stacks/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete a stack + /// + /// Delete a specific stack by its ID. + /// + /// Available since server v1.0.0. + Future deleteStack(String id, {Future? abortTrigger}) async { + final response = await deleteStackWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve a stack + /// + /// Retrieve a specific stack by its ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getStackWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/stacks/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve a stack + /// + /// Retrieve a specific stack by its ID. + /// + /// Available since server v1.0.0. + Future getStack(String id, {Future? abortTrigger}) async { + final response = await getStackWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'StackResponseDto') + as StackResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update a stack /// /// Update an existing stack by its ID. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [StackUpdateDto] stackUpdateDto (required): - Future updateStackWithHttpInfo(String id, StackUpdateDto stackUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/stacks/{id}' - .replaceAll('{id}', id); + Future updateStackWithHttpInfo( + String id, + StackUpdateDto stackUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/stacks/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = stackUpdateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -386,23 +304,58 @@ class StacksApi { /// /// Update an existing stack by its ID. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [StackUpdateDto] stackUpdateDto (required): - Future updateStack(String id, StackUpdateDto stackUpdateDto,) async { - final response = await updateStackWithHttpInfo(id, stackUpdateDto,); + /// Available since server v1.0.0. + Future updateStack(String id, StackUpdateDto stackUpdateDto, {Future? abortTrigger}) async { + final response = await updateStackWithHttpInfo(id, stackUpdateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'StackResponseDto',) as StackResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'StackResponseDto') + as StackResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Remove an asset from a stack + /// + /// Remove a specific asset from a stack by providing the stack ID and asset ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future removeAssetFromStackWithHttpInfo(String assetId, String id, {Future? abortTrigger}) async { + final apiPath = r'/stacks/{id}/assets/{assetId}'.replaceAll('{assetId}', assetId).replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Remove an asset from a stack + /// + /// Remove a specific asset from a stack by providing the stack ID and asset ID. + /// + /// Available since server v1.0.0. + Future removeAssetFromStack(String assetId, String id, {Future? abortTrigger}) async { + final response = await removeAssetFromStackWithHttpInfo(assetId, id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - return null; } } diff --git a/mobile/openapi/lib/api/sync_api.dart b/mobile/openapi/lib/api/sync_api.dart index e7bc822ace..1fddedb027 100644 --- a/mobile/openapi/lib/api/sync_api.dart +++ b/mobile/openapi/lib/api/sync_api.dart @@ -1,52 +1,55 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class SyncApi { SyncApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion deleteSyncAckAddedIn = .new(1, 0, 0); + + static const ApiState deleteSyncAckState = .stable; + + static const ApiVersion getSyncAckAddedIn = .new(1, 0, 0); + + static const ApiState getSyncAckState = .stable; + + static const ApiVersion sendSyncAckAddedIn = .new(1, 0, 0); + + static const ApiState sendSyncAckState = .stable; + + static const ApiVersion getSyncStreamAddedIn = .new(1, 0, 0); + + static const ApiState getSyncStreamState = .stable; + /// Delete acknowledgements /// /// Delete specific synchronization acknowledgments. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SyncAckDeleteDto] syncAckDeleteDto (required): - Future deleteSyncAckWithHttpInfo(SyncAckDeleteDto syncAckDeleteDto,) async { - // ignore: prefer_const_declarations + Future deleteSyncAckWithHttpInfo(SyncAckDeleteDto syncAckDeleteDto, {Future? abortTrigger}) async { final apiPath = r'/sync/ack'; - // ignore: prefer_final_locals Object? postBody = syncAckDeleteDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'DELETE', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -54,11 +57,9 @@ class SyncApi { /// /// Delete specific synchronization acknowledgments. /// - /// Parameters: - /// - /// * [SyncAckDeleteDto] syncAckDeleteDto (required): - Future deleteSyncAck(SyncAckDeleteDto syncAckDeleteDto,) async { - final response = await deleteSyncAckWithHttpInfo(syncAckDeleteDto,); + /// Available since server v1.0.0. + Future deleteSyncAck(SyncAckDeleteDto syncAckDeleteDto, {Future? abortTrigger}) async { + final response = await deleteSyncAckWithHttpInfo(syncAckDeleteDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } @@ -68,12 +69,12 @@ class SyncApi { /// /// Retrieve the synchronization acknowledgments for the current session. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getSyncAckWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getSyncAckWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/sync/ack'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -82,118 +83,64 @@ class SyncApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Retrieve acknowledgements /// /// Retrieve the synchronization acknowledgments for the current session. - Future?> getSyncAck() async { - final response = await getSyncAckWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future> getSyncAck({Future? abortTrigger}) async { + final response = await getSyncAckWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Stream sync changes - /// - /// Retrieve a JSON lines streamed response of changes for synchronization. This endpoint is used by the mobile app to efficiently stay up to date with changes. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SyncStreamDto] syncStreamDto (required): - Future getSyncStreamWithHttpInfo(SyncStreamDto syncStreamDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/sync/stream'; - - // ignore: prefer_final_locals - Object? postBody = syncStreamDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Stream sync changes - /// - /// Retrieve a JSON lines streamed response of changes for synchronization. This endpoint is used by the mobile app to efficiently stay up to date with changes. - /// - /// Parameters: - /// - /// * [SyncStreamDto] syncStreamDto (required): - Future getSyncStream(SyncStreamDto syncStreamDto,) async { - final response = await getSyncStreamWithHttpInfo(syncStreamDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + return (await apiClient.deserializeAsync(responseBody, r'List') as List).cast().toList( + growable: false, + ); } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Acknowledge changes /// /// Send a list of synchronization acknowledgements to confirm that the latest changes have been received. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SyncAckSetDto] syncAckSetDto (required): - Future sendSyncAckWithHttpInfo(SyncAckSetDto syncAckSetDto,) async { - // ignore: prefer_const_declarations + Future sendSyncAckWithHttpInfo(SyncAckSetDto syncAckSetDto, {Future? abortTrigger}) async { final apiPath = r'/sync/ack'; - // ignore: prefer_final_locals Object? postBody = syncAckSetDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -201,11 +148,51 @@ class SyncApi { /// /// Send a list of synchronization acknowledgements to confirm that the latest changes have been received. /// - /// Parameters: + /// Available since server v1.0.0. + Future sendSyncAck(SyncAckSetDto syncAckSetDto, {Future? abortTrigger}) async { + final response = await sendSyncAckWithHttpInfo(syncAckSetDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Stream sync changes /// - /// * [SyncAckSetDto] syncAckSetDto (required): - Future sendSyncAck(SyncAckSetDto syncAckSetDto,) async { - final response = await sendSyncAckWithHttpInfo(syncAckSetDto,); + /// Retrieve a JSON lines streamed response of changes for synchronization. This endpoint is used by the mobile app to efficiently stay up to date with changes. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getSyncStreamWithHttpInfo(SyncStreamDto syncStreamDto, {Future? abortTrigger}) async { + final apiPath = r'/sync/stream'; + + Object? postBody = syncStreamDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Stream sync changes + /// + /// Retrieve a JSON lines streamed response of changes for synchronization. This endpoint is used by the mobile app to efficiently stay up to date with changes. + /// + /// Available since server v1.0.0. + Future getSyncStream(SyncStreamDto syncStreamDto, {Future? abortTrigger}) async { + final response = await getSyncStreamWithHttpInfo(syncStreamDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } diff --git a/mobile/openapi/lib/api/system_config_api.dart b/mobile/openapi/lib/api/system_config_api.dart index b04da71273..1d40304b15 100644 --- a/mobile/openapi/lib/api/system_config_api.dart +++ b/mobile/openapi/lib/api/system_config_api.dart @@ -1,31 +1,38 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class SystemConfigApi { SystemConfigApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion getConfigAddedIn = .new(1, 0, 0); + + static const ApiState getConfigState = .stable; + + static const ApiVersion updateConfigAddedIn = .new(1, 0, 0); + + static const ApiState updateConfigState = .stable; + + static const ApiVersion getConfigDefaultsAddedIn = .new(1, 0, 0); + + static const ApiState getConfigDefaultsState = .stable; + + static const ApiVersion getStorageTemplateOptionsAddedIn = .new(1, 0, 0); + + static const ApiState getStorageTemplateOptionsState = .stable; + /// Get system configuration /// /// Retrieve the current system configuration. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getConfigWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getConfigWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/system-config'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -34,163 +41,61 @@ class SystemConfigApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Get system configuration /// /// Retrieve the current system configuration. - Future getConfig() async { - final response = await getConfigWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future getConfig({Future? abortTrigger}) async { + final response = await getConfigWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SystemConfigDto',) as SystemConfigDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SystemConfigDto') as SystemConfigDto; } - return null; - } - - /// Get system configuration defaults - /// - /// Retrieve the default values for the system configuration. - /// - /// Note: This method returns the HTTP [Response]. - Future getConfigDefaultsWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/system-config/defaults'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get system configuration defaults - /// - /// Retrieve the default values for the system configuration. - Future getConfigDefaults() async { - final response = await getConfigDefaultsWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SystemConfigDto',) as SystemConfigDto; - - } - return null; - } - - /// Get storage template options - /// - /// Retrieve exemplary storage template options. - /// - /// Note: This method returns the HTTP [Response]. - Future getStorageTemplateOptionsWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/system-config/storage-template-options'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get storage template options - /// - /// Retrieve exemplary storage template options. - Future getStorageTemplateOptions() async { - final response = await getStorageTemplateOptionsWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SystemConfigTemplateStorageOptionDto',) as SystemConfigTemplateStorageOptionDto; - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update system configuration /// /// Update the system configuration with a new system configuration. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [SystemConfigDto] systemConfigDto (required): - Future updateConfigWithHttpInfo(SystemConfigDto systemConfigDto,) async { - // ignore: prefer_const_declarations + Future updateConfigWithHttpInfo(SystemConfigDto systemConfigDto, {Future? abortTrigger}) async { final apiPath = r'/system-config'; - // ignore: prefer_final_locals Object? postBody = systemConfigDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -198,21 +103,108 @@ class SystemConfigApi { /// /// Update the system configuration with a new system configuration. /// - /// Parameters: - /// - /// * [SystemConfigDto] systemConfigDto (required): - Future updateConfig(SystemConfigDto systemConfigDto,) async { - final response = await updateConfigWithHttpInfo(systemConfigDto,); + /// Available since server v1.0.0. + Future updateConfig(SystemConfigDto systemConfigDto, {Future? abortTrigger}) async { + final response = await updateConfigWithHttpInfo(systemConfigDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'SystemConfigDto',) as SystemConfigDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SystemConfigDto') as SystemConfigDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get system configuration defaults + /// + /// Retrieve the default values for the system configuration. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getConfigDefaultsWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/system-config/defaults'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get system configuration defaults + /// + /// Retrieve the default values for the system configuration. + /// + /// Available since server v1.0.0. + Future getConfigDefaults({Future? abortTrigger}) async { + final response = await getConfigDefaultsWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SystemConfigDto') as SystemConfigDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get storage template options + /// + /// Retrieve exemplary storage template options. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getStorageTemplateOptionsWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/system-config/storage-template-options'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get storage template options + /// + /// Retrieve exemplary storage template options. + /// + /// Available since server v1.0.0. + Future getStorageTemplateOptions({Future? abortTrigger}) async { + final response = await getStorageTemplateOptionsWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'SystemConfigTemplateStorageOptionDto') + as SystemConfigTemplateStorageOptionDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/system_metadata_api.dart b/mobile/openapi/lib/api/system_metadata_api.dart index 63fd7628ec..62fff03996 100644 --- a/mobile/openapi/lib/api/system_metadata_api.dart +++ b/mobile/openapi/lib/api/system_metadata_api.dart @@ -1,31 +1,38 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class SystemMetadataApi { SystemMetadataApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion getAdminOnboardingAddedIn = .new(1, 0, 0); + + static const ApiState getAdminOnboardingState = .stable; + + static const ApiVersion updateAdminOnboardingAddedIn = .new(1, 0, 0); + + static const ApiState updateAdminOnboardingState = .stable; + + static const ApiVersion getReverseGeocodingStateAddedIn = .new(1, 0, 0); + + static const ApiState getReverseGeocodingStateState = .stable; + + static const ApiVersion getVersionCheckStateAddedIn = .new(1, 0, 0); + + static const ApiState getVersionCheckStateState = .stable; + /// Retrieve admin onboarding /// /// Retrieve the current admin onboarding status. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getAdminOnboardingWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getAdminOnboardingWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/system-metadata/admin-onboarding'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -34,163 +41,65 @@ class SystemMetadataApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Retrieve admin onboarding /// /// Retrieve the current admin onboarding status. - Future getAdminOnboarding() async { - final response = await getAdminOnboardingWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future getAdminOnboarding({Future? abortTrigger}) async { + final response = await getAdminOnboardingWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AdminOnboardingUpdateDto',) as AdminOnboardingUpdateDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AdminOnboardingUpdateDto') + as AdminOnboardingUpdateDto; } - return null; - } - - /// Retrieve reverse geocoding state - /// - /// Retrieve the current state of the reverse geocoding import. - /// - /// Note: This method returns the HTTP [Response]. - Future getReverseGeocodingStateWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/system-metadata/reverse-geocoding-state'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve reverse geocoding state - /// - /// Retrieve the current state of the reverse geocoding import. - Future getReverseGeocodingState() async { - final response = await getReverseGeocodingStateWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ReverseGeocodingStateResponseDto',) as ReverseGeocodingStateResponseDto; - - } - return null; - } - - /// Retrieve version check state - /// - /// Retrieve the current state of the version check process. - /// - /// Note: This method returns the HTTP [Response]. - Future getVersionCheckStateWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/system-metadata/version-check-state'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve version check state - /// - /// Retrieve the current state of the version check process. - Future getVersionCheckState() async { - final response = await getVersionCheckStateWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'VersionCheckStateResponseDto',) as VersionCheckStateResponseDto; - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update admin onboarding /// /// Update the admin onboarding status. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [AdminOnboardingUpdateDto] adminOnboardingUpdateDto (required): - Future updateAdminOnboardingWithHttpInfo(AdminOnboardingUpdateDto adminOnboardingUpdateDto,) async { - // ignore: prefer_const_declarations + Future updateAdminOnboardingWithHttpInfo( + AdminOnboardingUpdateDto adminOnboardingUpdateDto, { + Future? abortTrigger, + }) async { final apiPath = r'/system-metadata/admin-onboarding'; - // ignore: prefer_final_locals Object? postBody = adminOnboardingUpdateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -198,13 +107,108 @@ class SystemMetadataApi { /// /// Update the admin onboarding status. /// - /// Parameters: - /// - /// * [AdminOnboardingUpdateDto] adminOnboardingUpdateDto (required): - Future updateAdminOnboarding(AdminOnboardingUpdateDto adminOnboardingUpdateDto,) async { - final response = await updateAdminOnboardingWithHttpInfo(adminOnboardingUpdateDto,); + /// Available since server v1.0.0. + Future updateAdminOnboarding( + AdminOnboardingUpdateDto adminOnboardingUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updateAdminOnboardingWithHttpInfo(adminOnboardingUpdateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } + + /// Retrieve reverse geocoding state + /// + /// Retrieve the current state of the reverse geocoding import. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getReverseGeocodingStateWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/system-metadata/reverse-geocoding-state'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve reverse geocoding state + /// + /// Retrieve the current state of the reverse geocoding import. + /// + /// Available since server v1.0.0. + Future getReverseGeocodingState({Future? abortTrigger}) async { + final response = await getReverseGeocodingStateWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'ReverseGeocodingStateResponseDto') + as ReverseGeocodingStateResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve version check state + /// + /// Retrieve the current state of the version check process. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getVersionCheckStateWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/system-metadata/version-check-state'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve version check state + /// + /// Retrieve the current state of the version check process. + /// + /// Available since server v1.0.0. + Future getVersionCheckState({Future? abortTrigger}) async { + final response = await getVersionCheckStateWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'VersionCheckStateResponseDto') + as VersionCheckStateResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } } diff --git a/mobile/openapi/lib/api/tags_api.dart b/mobile/openapi/lib/api/tags_api.dart index a6840f9483..e396ceadfc 100644 --- a/mobile/openapi/lib/api/tags_api.dart +++ b/mobile/openapi/lib/api/tags_api.dart @@ -1,108 +1,124 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class TagsApi { TagsApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Tag assets + static const ApiVersion getAllTagsAddedIn = .new(1, 0, 0); + + static const ApiState getAllTagsState = .stable; + + static const ApiVersion createTagAddedIn = .new(1, 0, 0); + + static const ApiState createTagState = .stable; + + static const ApiVersion upsertTagsAddedIn = .new(1, 0, 0); + + static const ApiState upsertTagsState = .stable; + + static const ApiVersion bulkTagAssetsAddedIn = .new(1, 0, 0); + + static const ApiState bulkTagAssetsState = .stable; + + static const ApiVersion deleteTagAddedIn = .new(1, 0, 0); + + static const ApiState deleteTagState = .stable; + + static const ApiVersion getTagByIdAddedIn = .new(1, 0, 0); + + static const ApiState getTagByIdState = .stable; + + static const ApiVersion updateTagAddedIn = .new(1, 0, 0); + + static const ApiState updateTagState = .stable; + + static const ApiVersion untagAssetsAddedIn = .new(1, 0, 0); + + static const ApiState untagAssetsState = .stable; + + static const ApiVersion tagAssetsAddedIn = .new(1, 0, 0); + + static const ApiState tagAssetsState = .stable; + + /// Retrieve tags /// - /// Add multiple tags to multiple assets in a single request. + /// Retrieve a list of all tags. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [TagBulkAssetsDto] tagBulkAssetsDto (required): - Future bulkTagAssetsWithHttpInfo(TagBulkAssetsDto tagBulkAssetsDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/tags/assets'; + Future getAllTagsWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/tags'; - // ignore: prefer_final_locals - Object? postBody = tagBulkAssetsDto; + Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = []; return apiClient.invokeAPI( apiPath, - 'PUT', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// Tag assets + /// Retrieve tags /// - /// Add multiple tags to multiple assets in a single request. + /// Retrieve a list of all tags. /// - /// Parameters: - /// - /// * [TagBulkAssetsDto] tagBulkAssetsDto (required): - Future bulkTagAssets(TagBulkAssetsDto tagBulkAssetsDto,) async { - final response = await bulkTagAssetsWithHttpInfo(tagBulkAssetsDto,); + /// Available since server v1.0.0. + Future> getAllTags({Future? abortTrigger}) async { + final response = await getAllTagsWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TagBulkAssetsResponseDto',) as TagBulkAssetsResponseDto; - + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Create a tag /// /// Create a new tag by providing a name and optional color. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [TagCreateDto] tagCreateDto (required): - Future createTagWithHttpInfo(TagCreateDto tagCreateDto,) async { - // ignore: prefer_const_declarations + Future createTagWithHttpInfo(TagCreateDto tagCreateDto, {Future? abortTrigger}) async { final apiPath = r'/tags'; - // ignore: prefer_final_locals Object? postBody = tagCreateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -110,401 +126,45 @@ class TagsApi { /// /// Create a new tag by providing a name and optional color. /// - /// Parameters: - /// - /// * [TagCreateDto] tagCreateDto (required): - Future createTag(TagCreateDto tagCreateDto,) async { - final response = await createTagWithHttpInfo(tagCreateDto,); + /// Available since server v1.0.0. + Future createTag(TagCreateDto tagCreateDto, {Future? abortTrigger}) async { + final response = await createTagWithHttpInfo(tagCreateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TagResponseDto',) as TagResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'TagResponseDto') as TagResponseDto; } - return null; - } - - /// Delete a tag - /// - /// Delete a specific tag by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteTagWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/tags/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Delete a tag - /// - /// Delete a specific tag by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteTag(String id,) async { - final response = await deleteTagWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Retrieve tags - /// - /// Retrieve a list of all tags. - /// - /// Note: This method returns the HTTP [Response]. - Future getAllTagsWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/tags'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve tags - /// - /// Retrieve a list of all tags. - Future?> getAllTags() async { - final response = await getAllTagsWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Retrieve a tag - /// - /// Retrieve a specific tag by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getTagByIdWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/tags/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve a tag - /// - /// Retrieve a specific tag by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getTagById(String id,) async { - final response = await getTagByIdWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TagResponseDto',) as TagResponseDto; - - } - return null; - } - - /// Tag assets - /// - /// Add a tag to all the specified assets. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future tagAssetsWithHttpInfo(String id, BulkIdsDto bulkIdsDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/tags/{id}/assets' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = bulkIdsDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Tag assets - /// - /// Add a tag to all the specified assets. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future?> tagAssets(String id, BulkIdsDto bulkIdsDto,) async { - final response = await tagAssetsWithHttpInfo(id, bulkIdsDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Untag assets - /// - /// Remove a tag from all the specified assets. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future untagAssetsWithHttpInfo(String id, BulkIdsDto bulkIdsDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/tags/{id}/assets' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = bulkIdsDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Untag assets - /// - /// Remove a tag from all the specified assets. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future?> untagAssets(String id, BulkIdsDto bulkIdsDto,) async { - final response = await untagAssetsWithHttpInfo(id, bulkIdsDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Update a tag - /// - /// Update an existing tag identified by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [TagUpdateDto] tagUpdateDto (required): - Future updateTagWithHttpInfo(String id, TagUpdateDto tagUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/tags/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = tagUpdateDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Update a tag - /// - /// Update an existing tag identified by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [TagUpdateDto] tagUpdateDto (required): - Future updateTag(String id, TagUpdateDto tagUpdateDto,) async { - final response = await updateTagWithHttpInfo(id, tagUpdateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TagResponseDto',) as TagResponseDto; - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Upsert tags /// /// Create or update multiple tags in a single request. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [TagUpsertDto] tagUpsertDto (required): - Future upsertTagsWithHttpInfo(TagUpsertDto tagUpsertDto,) async { - // ignore: prefer_const_declarations + Future upsertTagsWithHttpInfo(TagUpsertDto tagUpsertDto, {Future? abortTrigger}) async { final apiPath = r'/tags'; - // ignore: prefer_final_locals Object? postBody = tagUpsertDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -512,24 +172,300 @@ class TagsApi { /// /// Create or update multiple tags in a single request. /// - /// Parameters: - /// - /// * [TagUpsertDto] tagUpsertDto (required): - Future?> upsertTags(TagUpsertDto tagUpsertDto,) async { - final response = await upsertTagsWithHttpInfo(tagUpsertDto,); + /// Available since server v1.0.0. + Future> upsertTags(TagUpsertDto tagUpsertDto, {Future? abortTrigger}) async { + final response = await upsertTagsWithHttpInfo(tagUpsertDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Tag assets + /// + /// Add multiple tags to multiple assets in a single request. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future bulkTagAssetsWithHttpInfo(TagBulkAssetsDto tagBulkAssetsDto, {Future? abortTrigger}) async { + final apiPath = r'/tags/assets'; + + Object? postBody = tagBulkAssetsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Tag assets + /// + /// Add multiple tags to multiple assets in a single request. + /// + /// Available since server v1.0.0. + Future bulkTagAssets( + TagBulkAssetsDto tagBulkAssetsDto, { + Future? abortTrigger, + }) async { + final response = await bulkTagAssetsWithHttpInfo(tagBulkAssetsDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'TagBulkAssetsResponseDto') + as TagBulkAssetsResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete a tag + /// + /// Delete a specific tag by its ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteTagWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/tags/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete a tag + /// + /// Delete a specific tag by its ID. + /// + /// Available since server v1.0.0. + Future deleteTag(String id, {Future? abortTrigger}) async { + final response = await deleteTagWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve a tag + /// + /// Retrieve a specific tag by its ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getTagByIdWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/tags/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve a tag + /// + /// Retrieve a specific tag by its ID. + /// + /// Available since server v1.0.0. + Future getTagById(String id, {Future? abortTrigger}) async { + final response = await getTagByIdWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'TagResponseDto') as TagResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Update a tag + /// + /// Update an existing tag identified by its ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future updateTagWithHttpInfo(String id, TagUpdateDto tagUpdateDto, {Future? abortTrigger}) async { + final apiPath = r'/tags/{id}'.replaceAll('{id}', id); + + Object? postBody = tagUpdateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Update a tag + /// + /// Update an existing tag identified by its ID. + /// + /// Available since server v1.0.0. + Future updateTag(String id, TagUpdateDto tagUpdateDto, {Future? abortTrigger}) async { + final response = await updateTagWithHttpInfo(id, tagUpdateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'TagResponseDto') as TagResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Untag assets + /// + /// Remove a tag from all the specified assets. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future untagAssetsWithHttpInfo(String id, BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { + final apiPath = r'/tags/{id}/assets'.replaceAll('{id}', id); + + Object? postBody = bulkIdsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Untag assets + /// + /// Remove a tag from all the specified assets. + /// + /// Available since server v1.0.0. + Future> untagAssets(String id, BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { + final response = await untagAssetsWithHttpInfo(id, bulkIdsDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Tag assets + /// + /// Add a tag to all the specified assets. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future tagAssetsWithHttpInfo(String id, BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { + final apiPath = r'/tags/{id}/assets'.replaceAll('{id}', id); + + Object? postBody = bulkIdsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Tag assets + /// + /// Add a tag to all the specified assets. + /// + /// Available since server v1.0.0. + Future> tagAssets(String id, BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { + final response = await tagAssetsWithHttpInfo(id, bulkIdsDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/timeline_api.dart b/mobile/openapi/lib/api/timeline_api.dart index 6c72f62604..9ce552d48d 100644 --- a/mobile/openapi/lib/api/timeline_api.dart +++ b/mobile/openapi/lib/api/timeline_api.dart @@ -1,79 +1,48 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class TimelineApi { TimelineApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion getTimeBucketAddedIn = .new(1, 0, 0); + + static const ApiState getTimeBucketState = .internal; + + static const ApiVersion getTimeBucketsAddedIn = .new(1, 0, 0); + + static const ApiState getTimeBucketsState = .internal; + /// Get time bucket /// /// Retrieve a string of all asset ids in a given time bucket. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] timeBucket (required): - /// Time bucket identifier in YYYY-MM-DD format - /// - /// * [String] albumId: - /// Filter assets belonging to a specific album - /// - /// * [String] bbox: - /// Bounding box coordinates as west,south,east,north (WGS84) - /// - /// * [bool] isFavorite: - /// Filter by favorite status (true for favorites only, false for non-favorites only) - /// - /// * [bool] isTrashed: - /// Filter by trash status (true for trashed assets only, false for non-trashed only) - /// - /// * [String] key: - /// - /// * [AssetOrder] order: - /// Sort order for assets within time buckets (ASC for oldest first, DESC for newest first) - /// - /// * [AssetOrderBy] orderBy: - /// Date to group and order assets by (takenAt for date taken, createdAt for date added to Immich) - /// - /// * [String] personId: - /// Filter assets containing a specific person (face recognition) - /// - /// * [String] slug: - /// - /// * [String] tagId: - /// Filter assets with a specific tag - /// - /// * [String] userId: - /// Filter assets by specific user ID - /// - /// * [AssetVisibility] visibility: - /// Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED) - /// - /// * [bool] withCoordinates: - /// Include location data in the response - /// - /// * [bool] withPartners: - /// Include assets shared by partners - /// - /// * [bool] withStacked: - /// Include stacked assets in the response. When true, only primary assets from stacks are returned. - Future getTimeBucketWithHttpInfo(String timeBucket, { String? albumId, String? bbox, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, AssetOrderBy? orderBy, String? personId, String? slug, String? tagId, String? userId, AssetVisibility? visibility, bool? withCoordinates, bool? withPartners, bool? withStacked, }) async { - // ignore: prefer_const_declarations + Future getTimeBucketWithHttpInfo({ + String? albumId, + String? bbox, + bool? isFavorite, + bool? isTrashed, + String? key, + AssetOrder? order, + AssetOrderBy? orderBy, + String? personId, + String? slug, + String? tagId, + required String timeBucket, + String? userId, + AssetVisibility? visibility, + bool? withCoordinates, + bool? withPartners, + bool? withStacked, + Future? abortTrigger, + }) async { final apiPath = r'/timeline/bucket'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -110,7 +79,7 @@ class TimelineApi { if (tagId != null) { queryParams.addAll(_queryParams('', 'tagId', tagId)); } - queryParams.addAll(_queryParams('', 'timeBucket', timeBucket)); + queryParams.addAll(_queryParams('', 'timeBucket', timeBucket)); if (userId != null) { queryParams.addAll(_queryParams('', 'userId', userId)); } @@ -129,15 +98,15 @@ class TimelineApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -145,123 +114,82 @@ class TimelineApi { /// /// Retrieve a string of all asset ids in a given time bucket. /// - /// Parameters: - /// - /// * [String] timeBucket (required): - /// Time bucket identifier in YYYY-MM-DD format - /// - /// * [String] albumId: - /// Filter assets belonging to a specific album - /// - /// * [String] bbox: - /// Bounding box coordinates as west,south,east,north (WGS84) - /// - /// * [bool] isFavorite: - /// Filter by favorite status (true for favorites only, false for non-favorites only) - /// - /// * [bool] isTrashed: - /// Filter by trash status (true for trashed assets only, false for non-trashed only) - /// - /// * [String] key: - /// - /// * [AssetOrder] order: - /// Sort order for assets within time buckets (ASC for oldest first, DESC for newest first) - /// - /// * [AssetOrderBy] orderBy: - /// Date to group and order assets by (takenAt for date taken, createdAt for date added to Immich) - /// - /// * [String] personId: - /// Filter assets containing a specific person (face recognition) - /// - /// * [String] slug: - /// - /// * [String] tagId: - /// Filter assets with a specific tag - /// - /// * [String] userId: - /// Filter assets by specific user ID - /// - /// * [AssetVisibility] visibility: - /// Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED) - /// - /// * [bool] withCoordinates: - /// Include location data in the response - /// - /// * [bool] withPartners: - /// Include assets shared by partners - /// - /// * [bool] withStacked: - /// Include stacked assets in the response. When true, only primary assets from stacks are returned. - Future getTimeBucket(String timeBucket, { String? albumId, String? bbox, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, AssetOrderBy? orderBy, String? personId, String? slug, String? tagId, String? userId, AssetVisibility? visibility, bool? withCoordinates, bool? withPartners, bool? withStacked, }) async { - final response = await getTimeBucketWithHttpInfo(timeBucket, albumId: albumId, bbox: bbox, isFavorite: isFavorite, isTrashed: isTrashed, key: key, order: order, orderBy: orderBy, personId: personId, slug: slug, tagId: tagId, userId: userId, visibility: visibility, withCoordinates: withCoordinates, withPartners: withPartners, withStacked: withStacked, ); + /// Available since server v1.0.0. + Future getTimeBucket({ + String? albumId, + String? bbox, + bool? isFavorite, + bool? isTrashed, + String? key, + AssetOrder? order, + AssetOrderBy? orderBy, + String? personId, + String? slug, + String? tagId, + required String timeBucket, + String? userId, + AssetVisibility? visibility, + bool? withCoordinates, + bool? withPartners, + bool? withStacked, + Future? abortTrigger, + }) async { + final response = await getTimeBucketWithHttpInfo( + albumId: albumId, + bbox: bbox, + isFavorite: isFavorite, + isTrashed: isTrashed, + key: key, + order: order, + orderBy: orderBy, + personId: personId, + slug: slug, + tagId: tagId, + timeBucket: timeBucket, + userId: userId, + visibility: visibility, + withCoordinates: withCoordinates, + withPartners: withPartners, + withStacked: withStacked, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TimeBucketAssetResponseDto',) as TimeBucketAssetResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'TimeBucketAssetResponseDto') + as TimeBucketAssetResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Get time buckets /// /// Retrieve a list of all minimal time buckets. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] albumId: - /// Filter assets belonging to a specific album - /// - /// * [String] bbox: - /// Bounding box coordinates as west,south,east,north (WGS84) - /// - /// * [bool] isFavorite: - /// Filter by favorite status (true for favorites only, false for non-favorites only) - /// - /// * [bool] isTrashed: - /// Filter by trash status (true for trashed assets only, false for non-trashed only) - /// - /// * [String] key: - /// - /// * [AssetOrder] order: - /// Sort order for assets within time buckets (ASC for oldest first, DESC for newest first) - /// - /// * [AssetOrderBy] orderBy: - /// Date to group and order assets by (takenAt for date taken, createdAt for date added to Immich) - /// - /// * [String] personId: - /// Filter assets containing a specific person (face recognition) - /// - /// * [String] slug: - /// - /// * [String] tagId: - /// Filter assets with a specific tag - /// - /// * [String] userId: - /// Filter assets by specific user ID - /// - /// * [AssetVisibility] visibility: - /// Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED) - /// - /// * [bool] withCoordinates: - /// Include location data in the response - /// - /// * [bool] withPartners: - /// Include assets shared by partners - /// - /// * [bool] withStacked: - /// Include stacked assets in the response. When true, only primary assets from stacks are returned. - Future getTimeBucketsWithHttpInfo({ String? albumId, String? bbox, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, AssetOrderBy? orderBy, String? personId, String? slug, String? tagId, String? userId, AssetVisibility? visibility, bool? withCoordinates, bool? withPartners, bool? withStacked, }) async { - // ignore: prefer_const_declarations + Future getTimeBucketsWithHttpInfo({ + String? albumId, + String? bbox, + bool? isFavorite, + bool? isTrashed, + String? key, + AssetOrder? order, + AssetOrderBy? orderBy, + String? personId, + String? slug, + String? tagId, + String? userId, + AssetVisibility? visibility, + bool? withCoordinates, + bool? withPartners, + bool? withStacked, + Future? abortTrigger, + }) async { final apiPath = r'/timeline/buckets'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -316,15 +244,15 @@ class TimelineApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -332,65 +260,52 @@ class TimelineApi { /// /// Retrieve a list of all minimal time buckets. /// - /// Parameters: - /// - /// * [String] albumId: - /// Filter assets belonging to a specific album - /// - /// * [String] bbox: - /// Bounding box coordinates as west,south,east,north (WGS84) - /// - /// * [bool] isFavorite: - /// Filter by favorite status (true for favorites only, false for non-favorites only) - /// - /// * [bool] isTrashed: - /// Filter by trash status (true for trashed assets only, false for non-trashed only) - /// - /// * [String] key: - /// - /// * [AssetOrder] order: - /// Sort order for assets within time buckets (ASC for oldest first, DESC for newest first) - /// - /// * [AssetOrderBy] orderBy: - /// Date to group and order assets by (takenAt for date taken, createdAt for date added to Immich) - /// - /// * [String] personId: - /// Filter assets containing a specific person (face recognition) - /// - /// * [String] slug: - /// - /// * [String] tagId: - /// Filter assets with a specific tag - /// - /// * [String] userId: - /// Filter assets by specific user ID - /// - /// * [AssetVisibility] visibility: - /// Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED) - /// - /// * [bool] withCoordinates: - /// Include location data in the response - /// - /// * [bool] withPartners: - /// Include assets shared by partners - /// - /// * [bool] withStacked: - /// Include stacked assets in the response. When true, only primary assets from stacks are returned. - Future?> getTimeBuckets({ String? albumId, String? bbox, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, AssetOrderBy? orderBy, String? personId, String? slug, String? tagId, String? userId, AssetVisibility? visibility, bool? withCoordinates, bool? withPartners, bool? withStacked, }) async { - final response = await getTimeBucketsWithHttpInfo( albumId: albumId, bbox: bbox, isFavorite: isFavorite, isTrashed: isTrashed, key: key, order: order, orderBy: orderBy, personId: personId, slug: slug, tagId: tagId, userId: userId, visibility: visibility, withCoordinates: withCoordinates, withPartners: withPartners, withStacked: withStacked, ); + /// Available since server v1.0.0. + Future> getTimeBuckets({ + String? albumId, + String? bbox, + bool? isFavorite, + bool? isTrashed, + String? key, + AssetOrder? order, + AssetOrderBy? orderBy, + String? personId, + String? slug, + String? tagId, + String? userId, + AssetVisibility? visibility, + bool? withCoordinates, + bool? withPartners, + bool? withStacked, + Future? abortTrigger, + }) async { + final response = await getTimeBucketsWithHttpInfo( + albumId: albumId, + bbox: bbox, + isFavorite: isFavorite, + isTrashed: isTrashed, + key: key, + order: order, + orderBy: orderBy, + personId: personId, + slug: slug, + tagId: tagId, + userId: userId, + visibility: visibility, + withCoordinates: withCoordinates, + withPartners: withPartners, + withStacked: withStacked, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/trash_api.dart b/mobile/openapi/lib/api/trash_api.dart index f1dcbb8896..58c9537c3b 100644 --- a/mobile/openapi/lib/api/trash_api.dart +++ b/mobile/openapi/lib/api/trash_api.dart @@ -1,31 +1,34 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class TrashApi { TrashApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion emptyTrashAddedIn = .new(1, 0, 0); + + static const ApiState emptyTrashState = .stable; + + static const ApiVersion restoreTrashAddedIn = .new(1, 0, 0); + + static const ApiState restoreTrashState = .stable; + + static const ApiVersion restoreAssetsAddedIn = .new(1, 0, 0); + + static const ApiState restoreAssetsState = .stable; + /// Empty trash /// /// Permanently delete all items in the trash. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future emptyTrashWithHttpInfo() async { - // ignore: prefer_const_declarations + Future emptyTrashWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/trash/empty'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -34,67 +37,109 @@ class TrashApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Empty trash /// /// Permanently delete all items in the trash. - Future emptyTrash() async { - final response = await emptyTrashWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future emptyTrash({Future? abortTrigger}) async { + final response = await emptyTrashWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TrashResponseDto',) as TrashResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'TrashResponseDto') + as TrashResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Restore trash + /// + /// Restore all items in the trash. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future restoreTrashWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/trash/restore'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Restore trash + /// + /// Restore all items in the trash. + /// + /// Available since server v1.0.0. + Future restoreTrash({Future? abortTrigger}) async { + final response = await restoreTrashWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'TrashResponseDto') + as TrashResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Restore assets /// /// Restore specific assets from the trash. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future restoreAssetsWithHttpInfo(BulkIdsDto bulkIdsDto,) async { - // ignore: prefer_const_declarations + Future restoreAssetsWithHttpInfo(BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { final apiPath = r'/trash/restore/assets'; - // ignore: prefer_final_locals Object? postBody = bulkIdsDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -102,69 +147,16 @@ class TrashApi { /// /// Restore specific assets from the trash. /// - /// Parameters: - /// - /// * [BulkIdsDto] bulkIdsDto (required): - Future restoreAssets(BulkIdsDto bulkIdsDto,) async { - final response = await restoreAssetsWithHttpInfo(bulkIdsDto,); + /// Available since server v1.0.0. + Future restoreAssets(BulkIdsDto bulkIdsDto, {Future? abortTrigger}) async { + final response = await restoreAssetsWithHttpInfo(bulkIdsDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TrashResponseDto',) as TrashResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'TrashResponseDto') + as TrashResponseDto; } - return null; - } - - /// Restore trash - /// - /// Restore all items in the trash. - /// - /// Note: This method returns the HTTP [Response]. - Future restoreTrashWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/trash/restore'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Restore trash - /// - /// Restore all items in the trash. - Future restoreTrash() async { - final response = await restoreTrashWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TrashResponseDto',) as TrashResponseDto; - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/users_admin_api.dart b/mobile/openapi/lib/api/users_admin_api.dart index 5e165ffd5d..7979d34cae 100644 --- a/mobile/openapi/lib/api/users_admin_api.dart +++ b/mobile/openapi/lib/api/users_admin_api.dart @@ -1,52 +1,142 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class UsersAdminApi { UsersAdminApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion searchUsersAdminAddedIn = .new(1, 0, 0); + + static const ApiState searchUsersAdminState = .stable; + + static const ApiVersion createUserAdminAddedIn = .new(1, 0, 0); + + static const ApiState createUserAdminState = .stable; + + static const ApiVersion deleteUserAdminAddedIn = .new(1, 0, 0); + + static const ApiState deleteUserAdminState = .stable; + + static const ApiVersion getUserAdminAddedIn = .new(1, 0, 0); + + static const ApiState getUserAdminState = .stable; + + static const ApiVersion updateUserAdminAddedIn = .new(1, 0, 0); + + static const ApiState updateUserAdminState = .stable; + + static const ApiVersion getUserPreferencesAdminAddedIn = .new(1, 0, 0); + + static const ApiState getUserPreferencesAdminState = .stable; + + static const ApiVersion updateUserPreferencesAdminAddedIn = .new(1, 0, 0); + + static const ApiState updateUserPreferencesAdminState = .stable; + + static const ApiVersion restoreUserAdminAddedIn = .new(1, 0, 0); + + static const ApiState restoreUserAdminState = .stable; + + static const ApiVersion getUserSessionsAdminAddedIn = .new(1, 0, 0); + + static const ApiState getUserSessionsAdminState = .stable; + + static const ApiVersion getUserStatisticsAdminAddedIn = .new(1, 0, 0); + + static const ApiState getUserStatisticsAdminState = .stable; + + /// Search users + /// + /// Search for users. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future searchUsersAdminWithHttpInfo({String? id, bool? withDeleted, Future? abortTrigger}) async { + final apiPath = r'/admin/users'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + if (id != null) { + queryParams.addAll(_queryParams('', 'id', id)); + } + if (withDeleted != null) { + queryParams.addAll(_queryParams('', 'withDeleted', withDeleted)); + } + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Search users + /// + /// Search for users. + /// + /// Available since server v1.0.0. + Future> searchUsersAdmin({ + String? id, + bool? withDeleted, + Future? abortTrigger, + }) async { + final response = await searchUsersAdminWithHttpInfo(id: id, withDeleted: withDeleted, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + /// Create a user /// /// Create a new user. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [UserAdminCreateDto] userAdminCreateDto (required): - Future createUserAdminWithHttpInfo(UserAdminCreateDto userAdminCreateDto,) async { - // ignore: prefer_const_declarations + Future createUserAdminWithHttpInfo( + UserAdminCreateDto userAdminCreateDto, { + Future? abortTrigger, + }) async { final apiPath = r'/admin/users'; - // ignore: prefer_final_locals Object? postBody = userAdminCreateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'POST', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -54,58 +144,53 @@ class UsersAdminApi { /// /// Create a new user. /// - /// Parameters: - /// - /// * [UserAdminCreateDto] userAdminCreateDto (required): - Future createUserAdmin(UserAdminCreateDto userAdminCreateDto,) async { - final response = await createUserAdminWithHttpInfo(userAdminCreateDto,); + /// Available since server v1.0.0. + Future createUserAdmin( + UserAdminCreateDto userAdminCreateDto, { + Future? abortTrigger, + }) async { + final response = await createUserAdminWithHttpInfo(userAdminCreateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserAdminResponseDto',) as UserAdminResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserAdminResponseDto') + as UserAdminResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Delete a user /// /// Delete a user. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UserAdminDeleteDto] userAdminDeleteDto (required): - Future deleteUserAdminWithHttpInfo(String id, UserAdminDeleteDto userAdminDeleteDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/users/{id}' - .replaceAll('{id}', id); + Future deleteUserAdminWithHttpInfo( + String id, + UserAdminDeleteDto userAdminDeleteDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/admin/users/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = userAdminDeleteDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'DELETE', + r'DELETE', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -113,41 +198,33 @@ class UsersAdminApi { /// /// Delete a user. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UserAdminDeleteDto] userAdminDeleteDto (required): - Future deleteUserAdmin(String id, UserAdminDeleteDto userAdminDeleteDto,) async { - final response = await deleteUserAdminWithHttpInfo(id, userAdminDeleteDto,); + /// Available since server v1.0.0. + Future deleteUserAdmin( + String id, + UserAdminDeleteDto userAdminDeleteDto, { + Future? abortTrigger, + }) async { + final response = await deleteUserAdminWithHttpInfo(id, userAdminDeleteDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserAdminResponseDto',) as UserAdminResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserAdminResponseDto') + as UserAdminResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Retrieve a user /// /// Retrieve a specific user by their ID. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getUserAdminWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/users/{id}' - .replaceAll('{id}', id); + Future getUserAdminWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/admin/users/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -156,15 +233,15 @@ class UsersAdminApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -172,39 +249,84 @@ class UsersAdminApi { /// /// Retrieve a specific user by their ID. /// - /// Parameters: - /// - /// * [String] id (required): - Future getUserAdmin(String id,) async { - final response = await getUserAdminWithHttpInfo(id,); + /// Available since server v1.0.0. + Future getUserAdmin(String id, {Future? abortTrigger}) async { + final response = await getUserAdminWithHttpInfo(id, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserAdminResponseDto',) as UserAdminResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserAdminResponseDto') + as UserAdminResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Update a user + /// + /// Update an existing user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future updateUserAdminWithHttpInfo( + String id, + UserAdminUpdateDto userAdminUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/admin/users/{id}'.replaceAll('{id}', id); + + Object? postBody = userAdminUpdateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Update a user + /// + /// Update an existing user. + /// + /// Available since server v1.0.0. + Future updateUserAdmin( + String id, + UserAdminUpdateDto userAdminUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updateUserAdminWithHttpInfo(id, userAdminUpdateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserAdminResponseDto') + as UserAdminResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Retrieve user preferences /// /// Retrieve the preferences of a specific user. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getUserPreferencesAdminWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/users/{id}/preferences' - .replaceAll('{id}', id); + Future getUserPreferencesAdminWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/admin/users/{id}/preferences'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -213,15 +335,15 @@ class UsersAdminApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -229,39 +351,88 @@ class UsersAdminApi { /// /// Retrieve the preferences of a specific user. /// - /// Parameters: - /// - /// * [String] id (required): - Future getUserPreferencesAdmin(String id,) async { - final response = await getUserPreferencesAdminWithHttpInfo(id,); + /// Available since server v1.0.0. + Future getUserPreferencesAdmin(String id, {Future? abortTrigger}) async { + final response = await getUserPreferencesAdminWithHttpInfo(id, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserPreferencesResponseDto',) as UserPreferencesResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserPreferencesResponseDto') + as UserPreferencesResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } - /// Retrieve user sessions + /// Update user preferences /// - /// Retrieve all sessions for a specific user. + /// Update the preferences of a specific user. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getUserSessionsAdminWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/users/{id}/sessions' - .replaceAll('{id}', id); + Future updateUserPreferencesAdminWithHttpInfo( + String id, + UserPreferencesUpdateDto userPreferencesUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/admin/users/{id}/preferences'.replaceAll('{id}', id); + + Object? postBody = userPreferencesUpdateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Update user preferences + /// + /// Update the preferences of a specific user. + /// + /// Available since server v1.0.0. + Future updateUserPreferencesAdmin( + String id, + UserPreferencesUpdateDto userPreferencesUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updateUserPreferencesAdminWithHttpInfo( + id, + userPreferencesUpdateDto, + abortTrigger: abortTrigger, + ); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserPreferencesResponseDto') + as UserPreferencesResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Restore a deleted user + /// + /// Restore a previously deleted user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future restoreUserAdminWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/admin/users/{id}/restore'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -270,15 +441,62 @@ class UsersAdminApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'POST', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Restore a deleted user + /// + /// Restore a previously deleted user. + /// + /// Available since server v1.0.0. + Future restoreUserAdmin(String id, {Future? abortTrigger}) async { + final response = await restoreUserAdminWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserAdminResponseDto') + as UserAdminResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve user sessions + /// + /// Retrieve all sessions for a specific user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getUserSessionsAdminWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/admin/users/{id}/sessions'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -286,50 +504,37 @@ class UsersAdminApi { /// /// Retrieve all sessions for a specific user. /// - /// Parameters: - /// - /// * [String] id (required): - Future?> getUserSessionsAdmin(String id,) async { - final response = await getUserSessionsAdminWithHttpInfo(id,); + /// Available since server v1.0.0. + Future> getUserSessionsAdmin(String id, {Future? abortTrigger}) async { + final response = await getUserSessionsAdminWithHttpInfo(id, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Retrieve user statistics /// /// Retrieve asset statistics for a specific user. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [bool] isFavorite: - /// Filter by favorite status - /// - /// * [bool] isTrashed: - /// Filter by trash status - /// - /// * [AssetVisibility] visibility: - Future getUserStatisticsAdminWithHttpInfo(String id, { bool? isFavorite, bool? isTrashed, AssetVisibility? visibility, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/users/{id}/statistics' - .replaceAll('{id}', id); + Future getUserStatisticsAdminWithHttpInfo( + String id, { + bool? isFavorite, + bool? isTrashed, + AssetVisibility? visibility, + Future? abortTrigger, + }) async { + final apiPath = r'/admin/users/{id}/statistics'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -348,15 +553,15 @@ class UsersAdminApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -364,282 +569,28 @@ class UsersAdminApi { /// /// Retrieve asset statistics for a specific user. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [bool] isFavorite: - /// Filter by favorite status - /// - /// * [bool] isTrashed: - /// Filter by trash status - /// - /// * [AssetVisibility] visibility: - Future getUserStatisticsAdmin(String id, { bool? isFavorite, bool? isTrashed, AssetVisibility? visibility, }) async { - final response = await getUserStatisticsAdminWithHttpInfo(id, isFavorite: isFavorite, isTrashed: isTrashed, visibility: visibility, ); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AssetStatsResponseDto',) as AssetStatsResponseDto; - - } - return null; - } - - /// Restore a deleted user - /// - /// Restore a previously deleted user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future restoreUserAdminWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/users/{id}/restore' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, + /// Available since server v1.0.0. + Future getUserStatisticsAdmin( + String id, { + bool? isFavorite, + bool? isTrashed, + AssetVisibility? visibility, + Future? abortTrigger, + }) async { + final response = await getUserStatisticsAdminWithHttpInfo( + id, + isFavorite: isFavorite, + isTrashed: isTrashed, + visibility: visibility, + abortTrigger: abortTrigger, ); - } - - /// Restore a deleted user - /// - /// Restore a previously deleted user. - /// - /// Parameters: - /// - /// * [String] id (required): - Future restoreUserAdmin(String id,) async { - final response = await restoreUserAdminWithHttpInfo(id,); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserAdminResponseDto',) as UserAdminResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'AssetStatsResponseDto') + as AssetStatsResponseDto; } - return null; - } - - /// Search users - /// - /// Search for users. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id: - /// User ID filter - /// - /// * [bool] withDeleted: - /// Include deleted users - Future searchUsersAdminWithHttpInfo({ String? id, bool? withDeleted, }) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/users'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - if (id != null) { - queryParams.addAll(_queryParams('', 'id', id)); - } - if (withDeleted != null) { - queryParams.addAll(_queryParams('', 'withDeleted', withDeleted)); - } - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Search users - /// - /// Search for users. - /// - /// Parameters: - /// - /// * [String] id: - /// User ID filter - /// - /// * [bool] withDeleted: - /// Include deleted users - Future?> searchUsersAdmin({ String? id, bool? withDeleted, }) async { - final response = await searchUsersAdminWithHttpInfo( id: id, withDeleted: withDeleted, ); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } - - /// Update a user - /// - /// Update an existing user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UserAdminUpdateDto] userAdminUpdateDto (required): - Future updateUserAdminWithHttpInfo(String id, UserAdminUpdateDto userAdminUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/users/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = userAdminUpdateDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Update a user - /// - /// Update an existing user. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UserAdminUpdateDto] userAdminUpdateDto (required): - Future updateUserAdmin(String id, UserAdminUpdateDto userAdminUpdateDto,) async { - final response = await updateUserAdminWithHttpInfo(id, userAdminUpdateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserAdminResponseDto',) as UserAdminResponseDto; - - } - return null; - } - - /// Update user preferences - /// - /// Update the preferences of a specific user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UserPreferencesUpdateDto] userPreferencesUpdateDto (required): - Future updateUserPreferencesAdminWithHttpInfo(String id, UserPreferencesUpdateDto userPreferencesUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/admin/users/{id}/preferences' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody = userPreferencesUpdateDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Update user preferences - /// - /// Update the preferences of a specific user. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [UserPreferencesUpdateDto] userPreferencesUpdateDto (required): - Future updateUserPreferencesAdmin(String id, UserPreferencesUpdateDto userPreferencesUpdateDto,) async { - final response = await updateUserPreferencesAdminWithHttpInfo(id, userPreferencesUpdateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserPreferencesResponseDto',) as UserPreferencesResponseDto; - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/users_api.dart b/mobile/openapi/lib/api/users_api.dart index 401cf4e94b..c22e0ffcaa 100644 --- a/mobile/openapi/lib/api/users_api.dart +++ b/mobile/openapi/lib/api/users_api.dart @@ -1,525 +1,82 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class UsersApi { UsersApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Create user profile image - /// - /// Upload and set a new profile image for the current user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [MultipartFile] file (required): - /// Profile image file - Future createProfileImageWithHttpInfo(MultipartFile file,) async { - // ignore: prefer_const_declarations - final apiPath = r'/users/profile-image'; + static const ApiVersion searchUsersAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody; + static const ApiState searchUsersState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion getMyUserAddedIn = .new(1, 0, 0); - const contentTypes = ['multipart/form-data']; + static const ApiState getMyUserState = .stable; - bool hasFields = false; - final mp = MultipartRequest('POST', Uri.parse(apiPath)); - if (file != null) { - hasFields = true; - mp.fields[r'file'] = file.field; - mp.files.add(file); - } - if (hasFields) { - postBody = mp; - } + static const ApiVersion updateMyUserAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState updateMyUserState = .stable; - /// Create user profile image - /// - /// Upload and set a new profile image for the current user. - /// - /// Parameters: - /// - /// * [MultipartFile] file (required): - /// Profile image file - Future createProfileImage(MultipartFile file,) async { - final response = await createProfileImageWithHttpInfo(file,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'CreateProfileImageResponseDto',) as CreateProfileImageResponseDto; - - } - return null; - } + static const ApiVersion deleteUserLicenseAddedIn = .new(1, 0, 0); - /// Delete user profile image - /// - /// Delete the profile image of the current user. - /// - /// Note: This method returns the HTTP [Response]. - Future deleteProfileImageWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/users/profile-image'; + static const ApiState deleteUserLicenseState = .stable; - // ignore: prefer_final_locals - Object? postBody; + static const ApiVersion getUserLicenseAddedIn = .new(1, 0, 0); - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiState getUserLicenseState = .stable; - const contentTypes = []; + static const ApiVersion setUserLicenseAddedIn = .new(1, 0, 0); + static const ApiState setUserLicenseState = .stable; - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiVersion deleteUserOnboardingAddedIn = .new(1, 0, 0); - /// Delete user profile image - /// - /// Delete the profile image of the current user. - Future deleteProfileImage() async { - final response = await deleteProfileImageWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiState deleteUserOnboardingState = .stable; - /// Delete user product key - /// - /// Delete the registered product key for the current user. - /// - /// Note: This method returns the HTTP [Response]. - Future deleteUserLicenseWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/users/me/license'; + static const ApiVersion getUserOnboardingAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody; + static const ApiState getUserOnboardingState = .stable; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion setUserOnboardingAddedIn = .new(1, 0, 0); - const contentTypes = []; + static const ApiState setUserOnboardingState = .stable; + static const ApiVersion getMyPreferencesAddedIn = .new(1, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState getMyPreferencesState = .stable; - /// Delete user product key - /// - /// Delete the registered product key for the current user. - Future deleteUserLicense() async { - final response = await deleteUserLicenseWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiVersion updateMyPreferencesAddedIn = .new(1, 0, 0); - /// Delete user onboarding - /// - /// Delete the onboarding status of the current user. - /// - /// Note: This method returns the HTTP [Response]. - Future deleteUserOnboardingWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/users/me/onboarding'; + static const ApiState updateMyPreferencesState = .stable; - // ignore: prefer_final_locals - Object? postBody; + static const ApiVersion deleteProfileImageAddedIn = .new(1, 0, 0); - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiState deleteProfileImageState = .stable; - const contentTypes = []; + static const ApiVersion createProfileImageAddedIn = .new(1, 0, 0); + static const ApiState createProfileImageState = .stable; - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiVersion getUserAddedIn = .new(1, 0, 0); - /// Delete user onboarding - /// - /// Delete the onboarding status of the current user. - Future deleteUserOnboarding() async { - final response = await deleteUserOnboardingWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } + static const ApiState getUserState = .stable; - /// Get my preferences - /// - /// Retrieve the preferences for the current user. - /// - /// Note: This method returns the HTTP [Response]. - Future getMyPreferencesWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/users/me/preferences'; + static const ApiVersion getProfileImageAddedIn = .new(1, 0, 0); - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get my preferences - /// - /// Retrieve the preferences for the current user. - Future getMyPreferences() async { - final response = await getMyPreferencesWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserPreferencesResponseDto',) as UserPreferencesResponseDto; - - } - return null; - } - - /// Get current user - /// - /// Retrieve information about the user making the API request. - /// - /// Note: This method returns the HTTP [Response]. - Future getMyUserWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/users/me'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Get current user - /// - /// Retrieve information about the user making the API request. - Future getMyUser() async { - final response = await getMyUserWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserAdminResponseDto',) as UserAdminResponseDto; - - } - return null; - } - - /// Retrieve user profile image - /// - /// Retrieve the profile image file for a user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getProfileImageWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/users/{id}/profile-image' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve user profile image - /// - /// Retrieve the profile image file for a user. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getProfileImage(String id,) async { - final response = await getProfileImageWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MultipartFile',) as MultipartFile; - - } - return null; - } - - /// Retrieve a user - /// - /// Retrieve a specific user by their ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getUserWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/users/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve a user - /// - /// Retrieve a specific user by their ID. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getUser(String id,) async { - final response = await getUserWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserResponseDto',) as UserResponseDto; - - } - return null; - } - - /// Retrieve user product key - /// - /// Retrieve information about whether the current user has a registered product key. - /// - /// Note: This method returns the HTTP [Response]. - Future getUserLicenseWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/users/me/license'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve user product key - /// - /// Retrieve information about whether the current user has a registered product key. - Future getUserLicense() async { - final response = await getUserLicenseWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserLicense',) as UserLicense; - - } - return null; - } - - /// Retrieve user onboarding - /// - /// Retrieve the onboarding status of the current user. - /// - /// Note: This method returns the HTTP [Response]. - Future getUserOnboardingWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/users/me/onboarding'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve user onboarding - /// - /// Retrieve the onboarding status of the current user. - Future getUserOnboarding() async { - final response = await getUserOnboardingWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'OnboardingResponseDto',) as OnboardingResponseDto; - - } - return null; - } + static const ApiState getProfileImageState = .stable; /// Get all users /// /// Retrieve a list of all users on the server. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future searchUsersWithHttpInfo() async { - // ignore: prefer_const_declarations + Future searchUsersWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/users'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -528,238 +85,111 @@ class UsersApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Get all users /// /// Retrieve a list of all users on the server. - Future?> searchUsers() async { - final response = await searchUsersWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future> searchUsers({Future? abortTrigger}) async { + final response = await searchUsersWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } - /// Set user product key + /// Get current user /// - /// Register a product key for the current user. + /// Retrieve information about the user making the API request. + /// + /// Available since server v1.0.0. /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [LicenseKeyDto] licenseKeyDto (required): - Future setUserLicenseWithHttpInfo(LicenseKeyDto licenseKeyDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/users/me/license'; + Future getMyUserWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/users/me'; - // ignore: prefer_final_locals - Object? postBody = licenseKeyDto; + Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = []; return apiClient.invokeAPI( apiPath, - 'PUT', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } - /// Set user product key + /// Get current user /// - /// Register a product key for the current user. + /// Retrieve information about the user making the API request. /// - /// Parameters: - /// - /// * [LicenseKeyDto] licenseKeyDto (required): - Future setUserLicense(LicenseKeyDto licenseKeyDto,) async { - final response = await setUserLicenseWithHttpInfo(licenseKeyDto,); + /// Available since server v1.0.0. + Future getMyUser({Future? abortTrigger}) async { + final response = await getMyUserWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserLicense',) as UserLicense; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserAdminResponseDto') + as UserAdminResponseDto; } - return null; - } - - /// Update user onboarding - /// - /// Update the onboarding status of the current user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [OnboardingDto] onboardingDto (required): - Future setUserOnboardingWithHttpInfo(OnboardingDto onboardingDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/users/me/onboarding'; - - // ignore: prefer_final_locals - Object? postBody = onboardingDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Update user onboarding - /// - /// Update the onboarding status of the current user. - /// - /// Parameters: - /// - /// * [OnboardingDto] onboardingDto (required): - Future setUserOnboarding(OnboardingDto onboardingDto,) async { - final response = await setUserOnboardingWithHttpInfo(onboardingDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'OnboardingResponseDto',) as OnboardingResponseDto; - - } - return null; - } - - /// Update my preferences - /// - /// Update the preferences of the current user. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [UserPreferencesUpdateDto] userPreferencesUpdateDto (required): - Future updateMyPreferencesWithHttpInfo(UserPreferencesUpdateDto userPreferencesUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/users/me/preferences'; - - // ignore: prefer_final_locals - Object? postBody = userPreferencesUpdateDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - apiPath, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Update my preferences - /// - /// Update the preferences of the current user. - /// - /// Parameters: - /// - /// * [UserPreferencesUpdateDto] userPreferencesUpdateDto (required): - Future updateMyPreferences(UserPreferencesUpdateDto userPreferencesUpdateDto,) async { - final response = await updateMyPreferencesWithHttpInfo(userPreferencesUpdateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserPreferencesResponseDto',) as UserPreferencesResponseDto; - - } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update current user /// /// Update the current user making the API request. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [UserUpdateMeDto] userUpdateMeDto (required): - Future updateMyUserWithHttpInfo(UserUpdateMeDto userUpdateMeDto,) async { - // ignore: prefer_const_declarations + Future updateMyUserWithHttpInfo(UserUpdateMeDto userUpdateMeDto, {Future? abortTrigger}) async { final apiPath = r'/users/me'; - // ignore: prefer_final_locals Object? postBody = userUpdateMeDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -767,21 +197,575 @@ class UsersApi { /// /// Update the current user making the API request. /// - /// Parameters: - /// - /// * [UserUpdateMeDto] userUpdateMeDto (required): - Future updateMyUser(UserUpdateMeDto userUpdateMeDto,) async { - final response = await updateMyUserWithHttpInfo(userUpdateMeDto,); + /// Available since server v1.0.0. + Future updateMyUser(UserUpdateMeDto userUpdateMeDto, {Future? abortTrigger}) async { + final response = await updateMyUserWithHttpInfo(userUpdateMeDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserAdminResponseDto',) as UserAdminResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserAdminResponseDto') + as UserAdminResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete user product key + /// + /// Delete the registered product key for the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteUserLicenseWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/users/me/license'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete user product key + /// + /// Delete the registered product key for the current user. + /// + /// Available since server v1.0.0. + Future deleteUserLicense({Future? abortTrigger}) async { + final response = await deleteUserLicenseWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve user product key + /// + /// Retrieve information about whether the current user has a registered product key. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getUserLicenseWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/users/me/license'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve user product key + /// + /// Retrieve information about whether the current user has a registered product key. + /// + /// Available since server v1.0.0. + Future getUserLicense({Future? abortTrigger}) async { + final response = await getUserLicenseWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'LicenseResponseDto') + as LicenseResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Set user product key + /// + /// Register a product key for the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future setUserLicenseWithHttpInfo(LicenseKeyDto licenseKeyDto, {Future? abortTrigger}) async { + final apiPath = r'/users/me/license'; + + Object? postBody = licenseKeyDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Set user product key + /// + /// Register a product key for the current user. + /// + /// Available since server v1.0.0. + Future setUserLicense(LicenseKeyDto licenseKeyDto, {Future? abortTrigger}) async { + final response = await setUserLicenseWithHttpInfo(licenseKeyDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'LicenseResponseDto') + as LicenseResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete user onboarding + /// + /// Delete the onboarding status of the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteUserOnboardingWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/users/me/onboarding'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete user onboarding + /// + /// Delete the onboarding status of the current user. + /// + /// Available since server v1.0.0. + Future deleteUserOnboarding({Future? abortTrigger}) async { + final response = await deleteUserOnboardingWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve user onboarding + /// + /// Retrieve the onboarding status of the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getUserOnboardingWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/users/me/onboarding'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve user onboarding + /// + /// Retrieve the onboarding status of the current user. + /// + /// Available since server v1.0.0. + Future getUserOnboarding({Future? abortTrigger}) async { + final response = await getUserOnboardingWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'OnboardingResponseDto') + as OnboardingResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Update user onboarding + /// + /// Update the onboarding status of the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future setUserOnboardingWithHttpInfo(OnboardingDto onboardingDto, {Future? abortTrigger}) async { + final apiPath = r'/users/me/onboarding'; + + Object? postBody = onboardingDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Update user onboarding + /// + /// Update the onboarding status of the current user. + /// + /// Available since server v1.0.0. + Future setUserOnboarding(OnboardingDto onboardingDto, {Future? abortTrigger}) async { + final response = await setUserOnboardingWithHttpInfo(onboardingDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'OnboardingResponseDto') + as OnboardingResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Get my preferences + /// + /// Retrieve the preferences for the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getMyPreferencesWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/users/me/preferences'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Get my preferences + /// + /// Retrieve the preferences for the current user. + /// + /// Available since server v1.0.0. + Future getMyPreferences({Future? abortTrigger}) async { + final response = await getMyPreferencesWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserPreferencesResponseDto') + as UserPreferencesResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Update my preferences + /// + /// Update the preferences of the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future updateMyPreferencesWithHttpInfo( + UserPreferencesUpdateDto userPreferencesUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/users/me/preferences'; + + Object? postBody = userPreferencesUpdateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Update my preferences + /// + /// Update the preferences of the current user. + /// + /// Available since server v1.0.0. + Future updateMyPreferences( + UserPreferencesUpdateDto userPreferencesUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updateMyPreferencesWithHttpInfo(userPreferencesUpdateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserPreferencesResponseDto') + as UserPreferencesResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete user profile image + /// + /// Delete the profile image of the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteProfileImageWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/users/profile-image'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete user profile image + /// + /// Delete the profile image of the current user. + /// + /// Available since server v1.0.0. + Future deleteProfileImage({Future? abortTrigger}) async { + final response = await deleteProfileImageWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Create user profile image + /// + /// Upload and set a new profile image for the current user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future createProfileImageWithHttpInfo(MultipartFile file, {Future? abortTrigger}) async { + final apiPath = r'/users/profile-image'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'multipart/form-data']; + + bool hasFields = false; + final mp = MultipartRequest('POST', Uri.parse(apiPath)); + hasFields = true; + mp.fields[r'file'] = file.field; + mp.files.add(file); + if (hasFields) { + postBody = mp; + } + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Create user profile image + /// + /// Upload and set a new profile image for the current user. + /// + /// Available since server v1.0.0. + Future createProfileImage(MultipartFile file, {Future? abortTrigger}) async { + final response = await createProfileImageWithHttpInfo(file, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'CreateProfileImageResponseDto') + as CreateProfileImageResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve a user + /// + /// Retrieve a specific user by their ID. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getUserWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/users/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve a user + /// + /// Retrieve a specific user by their ID. + /// + /// Available since server v1.0.0. + Future getUser(String id, {Future? abortTrigger}) async { + final response = await getUserWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'UserResponseDto') as UserResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve user profile image + /// + /// Retrieve the profile image file for a user. + /// + /// Available since server v1.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getProfileImageWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/users/{id}/profile-image'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve user profile image + /// + /// Retrieve the profile image file for a user. + /// + /// Available since server v1.0.0. + Future getProfileImage(String id, {Future? abortTrigger}) async { + final response = await getProfileImageWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + return response.bodyBytes; } } diff --git a/mobile/openapi/lib/api/views_api.dart b/mobile/openapi/lib/api/views_api.dart index a45e89d58f..62827fad35 100644 --- a/mobile/openapi/lib/api/views_api.dart +++ b/mobile/openapi/lib/api/views_api.dart @@ -1,54 +1,49 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class ViewsApi { ViewsApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; + static const ApiVersion getAssetsByOriginalPathAddedIn = .new(1, 0, 0); + + static const ApiState getAssetsByOriginalPathState = .stable; + + static const ApiVersion getUniqueOriginalPathsAddedIn = .new(1, 0, 0); + + static const ApiState getUniqueOriginalPathsState = .stable; + /// Retrieve assets by original path /// /// Retrieve assets that are children of a specific folder. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] path (required): - Future getAssetsByOriginalPathWithHttpInfo(String path,) async { - // ignore: prefer_const_declarations + Future getAssetsByOriginalPathWithHttpInfo({required String path, Future? abortTrigger}) async { final apiPath = r'/view/folder'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; final headerParams = {}; final formParams = {}; - queryParams.addAll(_queryParams('', 'path', path)); + queryParams.addAll(_queryParams('', 'path', path)); const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -56,37 +51,31 @@ class ViewsApi { /// /// Retrieve assets that are children of a specific folder. /// - /// Parameters: - /// - /// * [String] path (required): - Future?> getAssetsByOriginalPath(String path,) async { - final response = await getAssetsByOriginalPathWithHttpInfo(path,); + /// Available since server v1.0.0. + Future> getAssetsByOriginalPath({required String path, Future? abortTrigger}) async { + final response = await getAssetsByOriginalPathWithHttpInfo(path: path, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Retrieve unique paths /// /// Retrieve a list of unique folder paths from asset original paths. /// + /// Available since server v1.0.0. + /// /// Note: This method returns the HTTP [Response]. - Future getUniqueOriginalPathsWithHttpInfo() async { - // ignore: prefer_const_declarations + Future getUniqueOriginalPathsWithHttpInfo({Future? abortTrigger}) async { final apiPath = r'/view/folder/unique-paths'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -95,36 +84,34 @@ class ViewsApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } /// Retrieve unique paths /// /// Retrieve a list of unique folder paths from asset original paths. - Future?> getUniqueOriginalPaths() async { - final response = await getUniqueOriginalPathsWithHttpInfo(); + /// + /// Available since server v1.0.0. + Future> getUniqueOriginalPaths({Future? abortTrigger}) async { + final response = await getUniqueOriginalPathsWithHttpInfo(abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List).cast().toList( + growable: false, + ); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api/workflows_api.dart b/mobile/openapi/lib/api/workflows_api.dart index 12b33b7238..cf45a4d200 100644 --- a/mobile/openapi/lib/api/workflows_api.dart +++ b/mobile/openapi/lib/api/workflows_api.dart @@ -1,318 +1,57 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; - class WorkflowsApi { WorkflowsApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; final ApiClient apiClient; - /// Create a workflow - /// - /// Create a new workflow, the workflow can also be created with empty filters and actions. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [WorkflowCreateDto] workflowCreateDto (required): - Future createWorkflowWithHttpInfo(WorkflowCreateDto workflowCreateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/workflows'; + static const ApiVersion searchWorkflowsAddedIn = .new(3, 0, 0); - // ignore: prefer_final_locals - Object? postBody = workflowCreateDto; + static const ApiState searchWorkflowsState = .added; - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiVersion createWorkflowAddedIn = .new(3, 0, 0); - const contentTypes = ['application/json']; + static const ApiState createWorkflowState = .added; + static const ApiVersion getWorkflowTriggersAddedIn = .new(3, 0, 0); - return apiClient.invokeAPI( - apiPath, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiState getWorkflowTriggersState = .added; - /// Create a workflow - /// - /// Create a new workflow, the workflow can also be created with empty filters and actions. - /// - /// Parameters: - /// - /// * [WorkflowCreateDto] workflowCreateDto (required): - Future createWorkflow(WorkflowCreateDto workflowCreateDto,) async { - final response = await createWorkflowWithHttpInfo(workflowCreateDto,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'WorkflowResponseDto',) as WorkflowResponseDto; - - } - return null; - } + static const ApiVersion deleteWorkflowAddedIn = .new(3, 0, 0); - /// Delete a workflow - /// - /// Delete a workflow by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteWorkflowWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/workflows/{id}' - .replaceAll('{id}', id); + static const ApiState deleteWorkflowState = .added; - // ignore: prefer_final_locals - Object? postBody; + static const ApiVersion getWorkflowAddedIn = .new(3, 0, 0); - final queryParams = []; - final headerParams = {}; - final formParams = {}; + static const ApiState getWorkflowState = .added; - const contentTypes = []; + static const ApiVersion updateWorkflowAddedIn = .new(3, 0, 0); + static const ApiState updateWorkflowState = .added; - return apiClient.invokeAPI( - apiPath, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } + static const ApiVersion getWorkflowForShareAddedIn = .new(3, 0, 0); - /// Delete a workflow - /// - /// Delete a workflow by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - Future deleteWorkflow(String id,) async { - final response = await deleteWorkflowWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - } - - /// Retrieve a workflow - /// - /// Retrieve information about a specific workflow by its ID. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getWorkflowWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/workflows/{id}' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve a workflow - /// - /// Retrieve information about a specific workflow by its ID. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getWorkflow(String id,) async { - final response = await getWorkflowWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'WorkflowResponseDto',) as WorkflowResponseDto; - - } - return null; - } - - /// Retrieve a workflow - /// - /// Retrieve a workflow details without ids, default values, etc. - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getWorkflowForShareWithHttpInfo(String id,) async { - // ignore: prefer_const_declarations - final apiPath = r'/workflows/{id}/share' - .replaceAll('{id}', id); - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// Retrieve a workflow - /// - /// Retrieve a workflow details without ids, default values, etc. - /// - /// Parameters: - /// - /// * [String] id (required): - Future getWorkflowForShare(String id,) async { - final response = await getWorkflowForShareWithHttpInfo(id,); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'WorkflowShareResponseDto',) as WorkflowShareResponseDto; - - } - return null; - } - - /// List all workflow triggers - /// - /// Retrieve a list of all available workflow triggers. - /// - /// Note: This method returns the HTTP [Response]. - Future getWorkflowTriggersWithHttpInfo() async { - // ignore: prefer_const_declarations - final apiPath = r'/workflows/triggers'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - apiPath, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// List all workflow triggers - /// - /// Retrieve a list of all available workflow triggers. - Future?> getWorkflowTriggers() async { - final response = await getWorkflowTriggersWithHttpInfo(); - if (response.statusCode >= HttpStatus.badRequest) { - throw ApiException(response.statusCode, await _decodeBodyBytes(response)); - } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. - if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - - } - return null; - } + static const ApiState getWorkflowForShareState = .added; /// List all workflows /// /// Retrieve a list of workflows available to the authenticated user. /// + /// Available since server v3.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] description: - /// Workflow description - /// - /// * [bool] enabled: - /// Workflow enabled - /// - /// * [String] id: - /// Workflow ID - /// - /// * [String] name: - /// Workflow name - /// - /// * [WorkflowTrigger] trigger: - /// Workflow trigger type - Future searchWorkflowsWithHttpInfo({ String? description, bool? enabled, String? id, String? name, WorkflowTrigger? trigger, }) async { - // ignore: prefer_const_declarations + Future searchWorkflowsWithHttpInfo({ + String? description, + bool? enabled, + String? id, + String? name, + WorkflowTrigger? trigger, + Future? abortTrigger, + }) async { final apiPath = r'/workflows'; - // ignore: prefer_final_locals Object? postBody; final queryParams = []; @@ -337,15 +76,15 @@ class WorkflowsApi { const contentTypes = []; - return apiClient.invokeAPI( apiPath, - 'GET', + r'GET', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -353,74 +92,251 @@ class WorkflowsApi { /// /// Retrieve a list of workflows available to the authenticated user. /// - /// Parameters: - /// - /// * [String] description: - /// Workflow description - /// - /// * [bool] enabled: - /// Workflow enabled - /// - /// * [String] id: - /// Workflow ID - /// - /// * [String] name: - /// Workflow name - /// - /// * [WorkflowTrigger] trigger: - /// Workflow trigger type - Future?> searchWorkflows({ String? description, bool? enabled, String? id, String? name, WorkflowTrigger? trigger, }) async { - final response = await searchWorkflowsWithHttpInfo( description: description, enabled: enabled, id: id, name: name, trigger: trigger, ); + /// Available since server v3.0.0. + Future> searchWorkflows({ + String? description, + bool? enabled, + String? id, + String? name, + WorkflowTrigger? trigger, + Future? abortTrigger, + }) async { + final response = await searchWorkflowsWithHttpInfo( + description: description, + enabled: enabled, + id: id, + name: name, + trigger: trigger, + abortTrigger: abortTrigger, + ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { final responseBody = await _decodeBodyBytes(response); - return (await apiClient.deserializeAsync(responseBody, 'List') as List) - .cast() - .toList(growable: false); - + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Create a workflow + /// + /// Create a new workflow, the workflow can also be created with empty filters and actions. + /// + /// Available since server v3.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future createWorkflowWithHttpInfo(WorkflowCreateDto workflowCreateDto, {Future? abortTrigger}) async { + final apiPath = r'/workflows'; + + Object? postBody = workflowCreateDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = [r'application/json']; + + return apiClient.invokeAPI( + apiPath, + r'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Create a workflow + /// + /// Create a new workflow, the workflow can also be created with empty filters and actions. + /// + /// Available since server v3.0.0. + Future createWorkflow(WorkflowCreateDto workflowCreateDto, {Future? abortTrigger}) async { + final response = await createWorkflowWithHttpInfo(workflowCreateDto, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'WorkflowResponseDto') + as WorkflowResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// List all workflow triggers + /// + /// Retrieve a list of all available workflow triggers. + /// + /// Available since server v3.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getWorkflowTriggersWithHttpInfo({Future? abortTrigger}) async { + final apiPath = r'/workflows/triggers'; + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// List all workflow triggers + /// + /// Retrieve a list of all available workflow triggers. + /// + /// Available since server v3.0.0. + Future> getWorkflowTriggers({Future? abortTrigger}) async { + final response = await getWorkflowTriggersWithHttpInfo(abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, r'List') as List) + .cast() + .toList(growable: false); + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Delete a workflow + /// + /// Delete a workflow by its ID. + /// + /// Available since server v3.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future deleteWorkflowWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/workflows/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Delete a workflow + /// + /// Delete a workflow by its ID. + /// + /// Available since server v3.0.0. + Future deleteWorkflow(String id, {Future? abortTrigger}) async { + final response = await deleteWorkflowWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Retrieve a workflow + /// + /// Retrieve information about a specific workflow by its ID. + /// + /// Available since server v3.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getWorkflowWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/workflows/{id}'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve a workflow + /// + /// Retrieve information about a specific workflow by its ID. + /// + /// Available since server v3.0.0. + Future getWorkflow(String id, {Future? abortTrigger}) async { + final response = await getWorkflowWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'WorkflowResponseDto') + as WorkflowResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } /// Update a workflow /// /// Update the information of a specific workflow by its ID. This endpoint can be used to update the workflow name, description, trigger type, filters and actions order, etc. /// + /// Available since server v3.0.0. + /// /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [WorkflowUpdateDto] workflowUpdateDto (required): - Future updateWorkflowWithHttpInfo(String id, WorkflowUpdateDto workflowUpdateDto,) async { - // ignore: prefer_const_declarations - final apiPath = r'/workflows/{id}' - .replaceAll('{id}', id); + Future updateWorkflowWithHttpInfo( + String id, + WorkflowUpdateDto workflowUpdateDto, { + Future? abortTrigger, + }) async { + final apiPath = r'/workflows/{id}'.replaceAll('{id}', id); - // ignore: prefer_final_locals Object? postBody = workflowUpdateDto; final queryParams = []; final headerParams = {}; final formParams = {}; - const contentTypes = ['application/json']; - + const contentTypes = [r'application/json']; return apiClient.invokeAPI( apiPath, - 'PUT', + r'PUT', queryParams, postBody, headerParams, formParams, contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, ); } @@ -428,23 +344,67 @@ class WorkflowsApi { /// /// Update the information of a specific workflow by its ID. This endpoint can be used to update the workflow name, description, trigger type, filters and actions order, etc. /// - /// Parameters: - /// - /// * [String] id (required): - /// - /// * [WorkflowUpdateDto] workflowUpdateDto (required): - Future updateWorkflow(String id, WorkflowUpdateDto workflowUpdateDto,) async { - final response = await updateWorkflowWithHttpInfo(id, workflowUpdateDto,); + /// Available since server v3.0.0. + Future updateWorkflow( + String id, + WorkflowUpdateDto workflowUpdateDto, { + Future? abortTrigger, + }) async { + final response = await updateWorkflowWithHttpInfo(id, workflowUpdateDto, abortTrigger: abortTrigger); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } - // When a remote server returns no body with a status of 204, we shall not decode it. - // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" - // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'WorkflowResponseDto',) as WorkflowResponseDto; - + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'WorkflowResponseDto') + as WorkflowResponseDto; } - return null; + throw ApiException(response.statusCode, r'Unexpected empty response body'); + } + + /// Retrieve a workflow + /// + /// Retrieve a workflow details without ids, default values, etc. + /// + /// Available since server v3.0.0. + /// + /// Note: This method returns the HTTP [Response]. + Future getWorkflowForShareWithHttpInfo(String id, {Future? abortTrigger}) async { + final apiPath = r'/workflows/{id}/share'.replaceAll('{id}', id); + + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + return apiClient.invokeAPI( + apiPath, + r'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + abortTrigger: abortTrigger, + ); + } + + /// Retrieve a workflow + /// + /// Retrieve a workflow details without ids, default values, etc. + /// + /// Available since server v3.0.0. + Future getWorkflowForShare(String id, {Future? abortTrigger}) async { + final response = await getWorkflowForShareWithHttpInfo(id, abortTrigger: abortTrigger); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), r'WorkflowShareResponseDto') + as WorkflowShareResponseDto; + } + throw ApiException(response.statusCode, r'Unexpected empty response body'); } } diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index fd0d73aebb..6072b76a82 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -1,42 +1,47 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; +/// The HTTP transport + (de)serialization core shared by every `XxxApi` class. +/// +/// [basePath] and [client] are mutable so the host app can repoint the client +/// at a different server or inject a custom (e.g. platform-native or mocked) +/// `http.Client` at runtime. JSON decoding runs on a background isolate via +/// [compute] to keep large payloads off the UI thread. class ApiClient { - ApiClient({this.basePath = '/api', this.authentication,}); + ApiClient({this.basePath = '/api', this.authentication}); + /// Server base path; mutable so the app can switch endpoints at runtime. String basePath; + final Authentication? authentication; var _client = Client(); final _defaultHeaderMap = {}; - /// Returns the current HTTP [Client] instance to use in this class. - /// - /// The return value is guaranteed to never be null. + /// The HTTP [Client] used for every request. Never null. Client get client => _client; - /// Requests to use a new HTTP [Client] in this class. + /// Swaps in a new HTTP [Client] (e.g. a platform-native or mocked client). set client(Client newClient) { _client = newClient; } + /// Headers applied to every request, in addition to per-call headers. Map get defaultHeaderMap => _defaultHeaderMap; + /// Registers a header sent with every subsequent request. void addDefaultHeader(String key, String value) { - _defaultHeaderMap[key] = value; + _defaultHeaderMap[key] = value; } - // We don't use a Map for queryParams. - // If collectionFormat is 'multi', a key might appear multiple times. + /// Builds, authenticates, and sends a request, returning the full [Response]. + /// + /// [queryParams] is a list (not a map) because a key may legitimately repeat + /// under the `multi` collection format. [body] may be a JSON-encodable value, + /// a [MultipartFile] (single-file upload), or a [MultipartRequest]. When + /// [abortTrigger] completes the request is aborted with a + /// [RequestAbortedException]. Future invokeAPI( String path, String method, @@ -44,8 +49,9 @@ class ApiClient { Object? body, Map headerParams, Map formParams, - String? contentType, - ) async { + String? contentType, { + Future? abortTrigger, + }) async { await authentication?.applyToParams(queryParams, headerParams); headerParams.addAll(_defaultHeaderMap); @@ -58,12 +64,10 @@ class ApiClient { final uri = Uri.parse('$basePath$path$queryString'); try { - // Special case for uploading a single file which isn't a 'multipart/form-data'. - if ( - body is MultipartFile && (contentType == null || - !contentType.toLowerCase().startsWith('multipart/form-data')) - ) { - final request = StreamedRequest(method, uri); + // Single-file upload that is not itself a multipart/form-data body. + if (body is MultipartFile && + (contentType == null || !contentType.toLowerCase().startsWith('multipart/form-data'))) { + final request = AbortableStreamedRequest(method, uri, abortTrigger: abortTrigger); request.headers.addAll(headerParams); request.contentLength = body.length; body.finalize().listen( @@ -73,107 +77,74 @@ class ApiClient { onError: (Object error, StackTrace trace) => request.sink.close(), cancelOnError: true, ); - final response = await _client.send(request); - return Response.fromStream(response); + return Response.fromStream(await _client.send(request)); } if (body is MultipartRequest) { - final request = MultipartRequest(method, uri); + final request = AbortableMultipartRequest(method, uri, abortTrigger: abortTrigger); request.fields.addAll(body.fields); request.files.addAll(body.files); request.headers.addAll(body.headers); request.headers.addAll(headerParams); - final response = await _client.send(request); - return Response.fromStream(response); + return Response.fromStream(await _client.send(request)); } - final msgBody = contentType == 'application/x-www-form-urlencoded' - ? formParams - : await serializeAsync(body); - final nullableHeaderParams = headerParams.isEmpty ? null : headerParams; - - switch(method) { - case 'POST': return await _client.post(uri, headers: nullableHeaderParams, body: msgBody,); - case 'PUT': return await _client.put(uri, headers: nullableHeaderParams, body: msgBody,); - case 'DELETE': return await _client.delete(uri, headers: nullableHeaderParams, body: msgBody,); - case 'PATCH': return await _client.patch(uri, headers: nullableHeaderParams, body: msgBody,); - case 'HEAD': return await _client.head(uri, headers: nullableHeaderParams,); - case 'GET': return await _client.get(uri, headers: nullableHeaderParams,); + final request = AbortableRequest(method, uri, abortTrigger: abortTrigger); + request.headers.addAll(headerParams); + if (contentType == 'application/x-www-form-urlencoded') { + request.bodyFields = formParams; + } else if (body != null) { + request.body = await serializeAsync(body); } + return Response.fromStream(await _client.send(request)); + } on RequestAbortedException { + rethrow; } on SocketException catch (error, trace) { - throw ApiException.withInner( - HttpStatus.badRequest, - 'Socket operation failed: $method $path', - error, - trace, - ); + throw ApiException.withInner(HttpStatus.badRequest, 'Socket operation failed: $method $path', error, trace); } on TlsException catch (error, trace) { - throw ApiException.withInner( - HttpStatus.badRequest, - 'TLS/SSL communication failed: $method $path', - error, - trace, - ); + throw ApiException.withInner(HttpStatus.badRequest, 'TLS/SSL communication failed: $method $path', error, trace); } on IOException catch (error, trace) { - throw ApiException.withInner( - HttpStatus.badRequest, - 'I/O operation failed: $method $path', - error, - trace, - ); + throw ApiException.withInner(HttpStatus.badRequest, 'I/O operation failed: $method $path', error, trace); } on ClientException catch (error, trace) { - throw ApiException.withInner( - HttpStatus.badRequest, - 'HTTP connection failed: $method $path', - error, - trace, - ); + throw ApiException.withInner(HttpStatus.badRequest, 'HTTP connection failed: $method $path', error, trace); } on Exception catch (error, trace) { - throw ApiException.withInner( - HttpStatus.badRequest, - 'Exception occurred: $method $path', - error, - trace, - ); + throw ApiException.withInner(HttpStatus.badRequest, 'Exception occurred: $method $path', error, trace); } - - throw ApiException( - HttpStatus.badRequest, - 'Invalid HTTP operation: $method $path', - ); } - Future deserializeAsync(String value, String targetType, {bool growable = false,}) => - // ignore: deprecated_member_use_from_same_package - deserialize(value, targetType, growable: growable); - - @Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use deserializeAsync() instead.') - Future deserialize(String value, String targetType, {bool growable = false,}) async { - // Remove all spaces. Necessary for regular expressions as well. - targetType = targetType.replaceAll(' ', ''); // ignore: parameter_assignments - - // If the expected target type is String, nothing to do... - return targetType == 'String' - ? value - : fromJson(await compute((String j) => json.decode(j), value), targetType, growable: growable); + /// Decodes a JSON [value] into an instance of [targetType]. + /// + /// JSON parsing runs on a background isolate via [compute] so large payloads + /// do not block the UI thread. + Future deserializeAsync(String value, String targetType, {bool growable = false}) async { + // Decode off the main isolate; the type-dispatch below is cheap. + if (targetType == 'String') { + return value; + } + final decoded = await compute(_decodeJson, value); + return fromJson(decoded, targetType, growable: growable); } - // ignore: deprecated_member_use_from_same_package - Future serializeAsync(Object? value) async => serialize(value); + /// JSON-encodes [value], returning `''` for `null`. + Future serializeAsync(Object? value) async => value == null ? '' : json.encode(value); - @Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use serializeAsync() instead.') - String serialize(Object? value) => value == null ? '' : json.encode(value); - - /// Returns a native instance of an OpenAPI class matching the [specified type][targetType]. - static dynamic fromJson(dynamic value, String targetType, {bool growable = false,}) { + /// Returns a native instance of the OpenAPI class named by [targetType]. + /// + /// Scalars are coerced inline; `List` / `Set` / `Map` recurse + /// on their element type; everything else dispatches to the generated + /// [deserializeNamed] table over all model and enum names. + static dynamic fromJson(dynamic value, String targetType, {bool growable = false}) { + final type = targetType.replaceAll(' ', ''); try { - switch (targetType) { + switch (type) { case 'String': return value is String ? value : value.toString(); case 'int': return value is int ? value : int.parse('$value'); case 'double': return value is double ? value : double.parse('$value'); + case 'num': + return value is num ? value : num.parse('$value'); case 'bool': if (value is bool) { return value; @@ -181,780 +152,793 @@ class ApiClient { final valueString = '$value'.toLowerCase(); return valueString == 'true' || valueString == '1'; case 'DateTime': - return value is DateTime ? value : DateTime.tryParse(value); - case 'ActivityCreateDto': - return ActivityCreateDto.fromJson(value); - case 'ActivityResponseDto': - return ActivityResponseDto.fromJson(value); - case 'ActivityStatisticsResponseDto': - return ActivityStatisticsResponseDto.fromJson(value); - case 'AddUsersDto': - return AddUsersDto.fromJson(value); - case 'AdminOnboardingUpdateDto': - return AdminOnboardingUpdateDto.fromJson(value); - case 'AlbumResponseDto': - return AlbumResponseDto.fromJson(value); - case 'AlbumStatisticsResponseDto': - return AlbumStatisticsResponseDto.fromJson(value); - case 'AlbumUserAddDto': - return AlbumUserAddDto.fromJson(value); - case 'AlbumUserCreateDto': - return AlbumUserCreateDto.fromJson(value); - case 'AlbumUserResponseDto': - return AlbumUserResponseDto.fromJson(value); - case 'AlbumUserRole': - return AlbumUserRoleTypeTransformer().decode(value); - case 'AlbumsAddAssetsDto': - return AlbumsAddAssetsDto.fromJson(value); - case 'AlbumsAddAssetsResponseDto': - return AlbumsAddAssetsResponseDto.fromJson(value); - case 'AlbumsResponse': - return AlbumsResponse.fromJson(value); - case 'AlbumsUpdate': - return AlbumsUpdate.fromJson(value); - case 'ApiKeyCreateDto': - return ApiKeyCreateDto.fromJson(value); - case 'ApiKeyCreateResponseDto': - return ApiKeyCreateResponseDto.fromJson(value); - case 'ApiKeyResponseDto': - return ApiKeyResponseDto.fromJson(value); - case 'ApiKeyUpdateDto': - return ApiKeyUpdateDto.fromJson(value); - case 'AssetBulkDeleteDto': - return AssetBulkDeleteDto.fromJson(value); - case 'AssetBulkUpdateDto': - return AssetBulkUpdateDto.fromJson(value); - case 'AssetBulkUploadCheckDto': - return AssetBulkUploadCheckDto.fromJson(value); - case 'AssetBulkUploadCheckItem': - return AssetBulkUploadCheckItem.fromJson(value); - case 'AssetBulkUploadCheckResponseDto': - return AssetBulkUploadCheckResponseDto.fromJson(value); - case 'AssetBulkUploadCheckResult': - return AssetBulkUploadCheckResult.fromJson(value); - case 'AssetCopyDto': - return AssetCopyDto.fromJson(value); - case 'AssetEditAction': - return AssetEditActionTypeTransformer().decode(value); - case 'AssetEditActionItemDto': - return AssetEditActionItemDto.fromJson(value); - case 'AssetEditActionItemDtoParameters': - return AssetEditActionItemDtoParameters.fromJson(value); - case 'AssetEditActionItemResponseDto': - return AssetEditActionItemResponseDto.fromJson(value); - case 'AssetEditsCreateDto': - return AssetEditsCreateDto.fromJson(value); - case 'AssetEditsResponseDto': - return AssetEditsResponseDto.fromJson(value); - case 'AssetFaceCreateDto': - return AssetFaceCreateDto.fromJson(value); - case 'AssetFaceDeleteDto': - return AssetFaceDeleteDto.fromJson(value); - case 'AssetFaceResponseDto': - return AssetFaceResponseDto.fromJson(value); - case 'AssetFaceUpdateDto': - return AssetFaceUpdateDto.fromJson(value); - case 'AssetFaceUpdateItem': - return AssetFaceUpdateItem.fromJson(value); - case 'AssetIdErrorReason': - return AssetIdErrorReasonTypeTransformer().decode(value); - case 'AssetIdsDto': - return AssetIdsDto.fromJson(value); - case 'AssetIdsResponseDto': - return AssetIdsResponseDto.fromJson(value); - case 'AssetJobName': - return AssetJobNameTypeTransformer().decode(value); - case 'AssetJobsDto': - return AssetJobsDto.fromJson(value); - case 'AssetMediaResponseDto': - return AssetMediaResponseDto.fromJson(value); - case 'AssetMediaSize': - return AssetMediaSizeTypeTransformer().decode(value); - case 'AssetMediaStatus': - return AssetMediaStatusTypeTransformer().decode(value); - case 'AssetMetadataBulkDeleteDto': - return AssetMetadataBulkDeleteDto.fromJson(value); - case 'AssetMetadataBulkDeleteItemDto': - return AssetMetadataBulkDeleteItemDto.fromJson(value); - case 'AssetMetadataBulkResponseDto': - return AssetMetadataBulkResponseDto.fromJson(value); - case 'AssetMetadataBulkUpsertDto': - return AssetMetadataBulkUpsertDto.fromJson(value); - case 'AssetMetadataBulkUpsertItemDto': - return AssetMetadataBulkUpsertItemDto.fromJson(value); - case 'AssetMetadataResponseDto': - return AssetMetadataResponseDto.fromJson(value); - case 'AssetMetadataUpsertDto': - return AssetMetadataUpsertDto.fromJson(value); - case 'AssetMetadataUpsertItemDto': - return AssetMetadataUpsertItemDto.fromJson(value); - case 'AssetOcrResponseDto': - return AssetOcrResponseDto.fromJson(value); - case 'AssetOrder': - return AssetOrderTypeTransformer().decode(value); - case 'AssetOrderBy': - return AssetOrderByTypeTransformer().decode(value); - case 'AssetRejectReason': - return AssetRejectReasonTypeTransformer().decode(value); - case 'AssetResponseDto': - return AssetResponseDto.fromJson(value); - case 'AssetStackResponseDto': - return AssetStackResponseDto.fromJson(value); - case 'AssetStatsResponseDto': - return AssetStatsResponseDto.fromJson(value); - case 'AssetTypeEnum': - return AssetTypeEnumTypeTransformer().decode(value); - case 'AssetUploadAction': - return AssetUploadActionTypeTransformer().decode(value); - case 'AssetVisibility': - return AssetVisibilityTypeTransformer().decode(value); - case 'AudioCodec': - return AudioCodecTypeTransformer().decode(value); - case 'AuthStatusResponseDto': - return AuthStatusResponseDto.fromJson(value); - case 'AvatarUpdate': - return AvatarUpdate.fromJson(value); - case 'BulkIdErrorReason': - return BulkIdErrorReasonTypeTransformer().decode(value); - case 'BulkIdResponseDto': - return BulkIdResponseDto.fromJson(value); - case 'BulkIdsDto': - return BulkIdsDto.fromJson(value); - case 'CLIPConfig': - return CLIPConfig.fromJson(value); - case 'CQMode': - return CQModeTypeTransformer().decode(value); - case 'CastResponse': - return CastResponse.fromJson(value); - case 'CastUpdate': - return CastUpdate.fromJson(value); - case 'ChangePasswordDto': - return ChangePasswordDto.fromJson(value); - case 'Colorspace': - return ColorspaceTypeTransformer().decode(value); - case 'ContributorCountResponseDto': - return ContributorCountResponseDto.fromJson(value); - case 'CreateAlbumDto': - return CreateAlbumDto.fromJson(value); - case 'CreateLibraryDto': - return CreateLibraryDto.fromJson(value); - case 'CreateProfileImageResponseDto': - return CreateProfileImageResponseDto.fromJson(value); - case 'CropParameters': - return CropParameters.fromJson(value); - case 'DatabaseBackupConfig': - return DatabaseBackupConfig.fromJson(value); - case 'DatabaseBackupDeleteDto': - return DatabaseBackupDeleteDto.fromJson(value); - case 'DatabaseBackupDto': - return DatabaseBackupDto.fromJson(value); - case 'DatabaseBackupListResponseDto': - return DatabaseBackupListResponseDto.fromJson(value); - case 'DownloadArchiveDto': - return DownloadArchiveDto.fromJson(value); - case 'DownloadArchiveInfo': - return DownloadArchiveInfo.fromJson(value); - case 'DownloadInfoDto': - return DownloadInfoDto.fromJson(value); - case 'DownloadResponse': - return DownloadResponse.fromJson(value); - case 'DownloadResponseDto': - return DownloadResponseDto.fromJson(value); - case 'DownloadUpdate': - return DownloadUpdate.fromJson(value); - case 'DuplicateDetectionConfig': - return DuplicateDetectionConfig.fromJson(value); - case 'DuplicateResolveDto': - return DuplicateResolveDto.fromJson(value); - case 'DuplicateResolveGroupDto': - return DuplicateResolveGroupDto.fromJson(value); - case 'DuplicateResponseDto': - return DuplicateResponseDto.fromJson(value); - case 'EmailNotificationsResponse': - return EmailNotificationsResponse.fromJson(value); - case 'EmailNotificationsUpdate': - return EmailNotificationsUpdate.fromJson(value); - case 'ExifResponseDto': - return ExifResponseDto.fromJson(value); - case 'FaceDto': - return FaceDto.fromJson(value); - case 'FacialRecognitionConfig': - return FacialRecognitionConfig.fromJson(value); - case 'FoldersResponse': - return FoldersResponse.fromJson(value); - case 'FoldersUpdate': - return FoldersUpdate.fromJson(value); - case 'ImageFormat': - return ImageFormatTypeTransformer().decode(value); - case 'JobCreateDto': - return JobCreateDto.fromJson(value); - case 'JobName': - return JobNameTypeTransformer().decode(value); - case 'JobSettingsDto': - return JobSettingsDto.fromJson(value); - case 'LibraryResponseDto': - return LibraryResponseDto.fromJson(value); - case 'LibraryStatsResponseDto': - return LibraryStatsResponseDto.fromJson(value); - case 'LicenseKeyDto': - return LicenseKeyDto.fromJson(value); - case 'LogLevel': - return LogLevelTypeTransformer().decode(value); - case 'LoginCredentialDto': - return LoginCredentialDto.fromJson(value); - case 'LoginResponseDto': - return LoginResponseDto.fromJson(value); - case 'LogoutResponseDto': - return LogoutResponseDto.fromJson(value); - case 'MachineLearningAvailabilityChecksDto': - return MachineLearningAvailabilityChecksDto.fromJson(value); - case 'MaintenanceAction': - return MaintenanceActionTypeTransformer().decode(value); - case 'MaintenanceAuthDto': - return MaintenanceAuthDto.fromJson(value); - case 'MaintenanceDetectInstallResponseDto': - return MaintenanceDetectInstallResponseDto.fromJson(value); - case 'MaintenanceDetectInstallStorageFolderDto': - return MaintenanceDetectInstallStorageFolderDto.fromJson(value); - case 'MaintenanceLoginDto': - return MaintenanceLoginDto.fromJson(value); - case 'MaintenanceStatusResponseDto': - return MaintenanceStatusResponseDto.fromJson(value); - case 'ManualJobName': - return ManualJobNameTypeTransformer().decode(value); - case 'MapMarkerResponseDto': - return MapMarkerResponseDto.fromJson(value); - case 'MapReverseGeocodeResponseDto': - return MapReverseGeocodeResponseDto.fromJson(value); - case 'MemoriesResponse': - return MemoriesResponse.fromJson(value); - case 'MemoriesUpdate': - return MemoriesUpdate.fromJson(value); - case 'MemoryCreateDto': - return MemoryCreateDto.fromJson(value); - case 'MemoryResponseDto': - return MemoryResponseDto.fromJson(value); - case 'MemorySearchOrder': - return MemorySearchOrderTypeTransformer().decode(value); - case 'MemoryStatisticsResponseDto': - return MemoryStatisticsResponseDto.fromJson(value); - case 'MemoryType': - return MemoryTypeTypeTransformer().decode(value); - case 'MemoryUpdateDto': - return MemoryUpdateDto.fromJson(value); - case 'MergePersonDto': - return MergePersonDto.fromJson(value); - case 'MetadataSearchDto': - return MetadataSearchDto.fromJson(value); - case 'MirrorAxis': - return MirrorAxisTypeTransformer().decode(value); - case 'MirrorParameters': - return MirrorParameters.fromJson(value); - case 'NotificationCreateDto': - return NotificationCreateDto.fromJson(value); - case 'NotificationDeleteAllDto': - return NotificationDeleteAllDto.fromJson(value); - case 'NotificationDto': - return NotificationDto.fromJson(value); - case 'NotificationLevel': - return NotificationLevelTypeTransformer().decode(value); - case 'NotificationType': - return NotificationTypeTypeTransformer().decode(value); - case 'NotificationUpdateAllDto': - return NotificationUpdateAllDto.fromJson(value); - case 'NotificationUpdateDto': - return NotificationUpdateDto.fromJson(value); - case 'OAuthAuthorizeResponseDto': - return OAuthAuthorizeResponseDto.fromJson(value); - case 'OAuthCallbackDto': - return OAuthCallbackDto.fromJson(value); - case 'OAuthConfigDto': - return OAuthConfigDto.fromJson(value); - case 'OAuthTokenEndpointAuthMethod': - return OAuthTokenEndpointAuthMethodTypeTransformer().decode(value); - case 'OcrConfig': - return OcrConfig.fromJson(value); - case 'OnThisDayDto': - return OnThisDayDto.fromJson(value); - case 'OnboardingDto': - return OnboardingDto.fromJson(value); - case 'OnboardingResponseDto': - return OnboardingResponseDto.fromJson(value); - case 'PartnerCreateDto': - return PartnerCreateDto.fromJson(value); - case 'PartnerDirection': - return PartnerDirectionTypeTransformer().decode(value); - case 'PartnerResponseDto': - return PartnerResponseDto.fromJson(value); - case 'PartnerUpdateDto': - return PartnerUpdateDto.fromJson(value); - case 'PeopleResponse': - return PeopleResponse.fromJson(value); - case 'PeopleResponseDto': - return PeopleResponseDto.fromJson(value); - case 'PeopleUpdate': - return PeopleUpdate.fromJson(value); - case 'PeopleUpdateDto': - return PeopleUpdateDto.fromJson(value); - case 'PeopleUpdateItem': - return PeopleUpdateItem.fromJson(value); - case 'Permission': - return PermissionTypeTransformer().decode(value); - case 'PersonCreateDto': - return PersonCreateDto.fromJson(value); - case 'PersonResponseDto': - return PersonResponseDto.fromJson(value); - case 'PersonStatisticsResponseDto': - return PersonStatisticsResponseDto.fromJson(value); - case 'PersonUpdateDto': - return PersonUpdateDto.fromJson(value); - case 'PinCodeChangeDto': - return PinCodeChangeDto.fromJson(value); - case 'PinCodeResetDto': - return PinCodeResetDto.fromJson(value); - case 'PinCodeSetupDto': - return PinCodeSetupDto.fromJson(value); - case 'PlacesResponseDto': - return PlacesResponseDto.fromJson(value); - case 'PluginMethodResponseDto': - return PluginMethodResponseDto.fromJson(value); - case 'PluginResponseDto': - return PluginResponseDto.fromJson(value); - case 'PluginTemplateResponseDto': - return PluginTemplateResponseDto.fromJson(value); - case 'PluginTemplateStepResponseDto': - return PluginTemplateStepResponseDto.fromJson(value); - case 'PurchaseResponse': - return PurchaseResponse.fromJson(value); - case 'PurchaseUpdate': - return PurchaseUpdate.fromJson(value); - case 'QueueCommand': - return QueueCommandTypeTransformer().decode(value); - case 'QueueCommandDto': - return QueueCommandDto.fromJson(value); - case 'QueueDeleteDto': - return QueueDeleteDto.fromJson(value); - case 'QueueJobResponseDto': - return QueueJobResponseDto.fromJson(value); - case 'QueueJobStatus': - return QueueJobStatusTypeTransformer().decode(value); - case 'QueueName': - return QueueNameTypeTransformer().decode(value); - case 'QueueResponseDto': - return QueueResponseDto.fromJson(value); - case 'QueueResponseLegacyDto': - return QueueResponseLegacyDto.fromJson(value); - case 'QueueStatisticsDto': - return QueueStatisticsDto.fromJson(value); - case 'QueueStatusLegacyDto': - return QueueStatusLegacyDto.fromJson(value); - case 'QueueUpdateDto': - return QueueUpdateDto.fromJson(value); - case 'QueuesResponseLegacyDto': - return QueuesResponseLegacyDto.fromJson(value); - case 'RandomSearchDto': - return RandomSearchDto.fromJson(value); - case 'RatingsResponse': - return RatingsResponse.fromJson(value); - case 'RatingsUpdate': - return RatingsUpdate.fromJson(value); - case 'ReactionLevel': - return ReactionLevelTypeTransformer().decode(value); - case 'ReactionType': - return ReactionTypeTypeTransformer().decode(value); - case 'ReverseGeocodingStateResponseDto': - return ReverseGeocodingStateResponseDto.fromJson(value); - case 'RotateParameters': - return RotateParameters.fromJson(value); - case 'SearchAlbumResponseDto': - return SearchAlbumResponseDto.fromJson(value); - case 'SearchAssetResponseDto': - return SearchAssetResponseDto.fromJson(value); - case 'SearchExploreItem': - return SearchExploreItem.fromJson(value); - case 'SearchExploreResponseDto': - return SearchExploreResponseDto.fromJson(value); - case 'SearchFacetCountResponseDto': - return SearchFacetCountResponseDto.fromJson(value); - case 'SearchFacetResponseDto': - return SearchFacetResponseDto.fromJson(value); - case 'SearchResponseDto': - return SearchResponseDto.fromJson(value); - case 'SearchStatisticsResponseDto': - return SearchStatisticsResponseDto.fromJson(value); - case 'SearchSuggestionType': - return SearchSuggestionTypeTypeTransformer().decode(value); - case 'ServerAboutResponseDto': - return ServerAboutResponseDto.fromJson(value); - case 'ServerApkLinksDto': - return ServerApkLinksDto.fromJson(value); - case 'ServerConfigDto': - return ServerConfigDto.fromJson(value); - case 'ServerFeaturesDto': - return ServerFeaturesDto.fromJson(value); - case 'ServerMediaTypesResponseDto': - return ServerMediaTypesResponseDto.fromJson(value); - case 'ServerPingResponse': - return ServerPingResponse.fromJson(value); - case 'ServerStatsResponseDto': - return ServerStatsResponseDto.fromJson(value); - case 'ServerStorageResponseDto': - return ServerStorageResponseDto.fromJson(value); - case 'ServerVersionHistoryResponseDto': - return ServerVersionHistoryResponseDto.fromJson(value); - case 'ServerVersionResponseDto': - return ServerVersionResponseDto.fromJson(value); - case 'SessionCreateDto': - return SessionCreateDto.fromJson(value); - case 'SessionCreateResponseDto': - return SessionCreateResponseDto.fromJson(value); - case 'SessionResponseDto': - return SessionResponseDto.fromJson(value); - case 'SessionUnlockDto': - return SessionUnlockDto.fromJson(value); - case 'SessionUpdateDto': - return SessionUpdateDto.fromJson(value); - case 'SetMaintenanceModeDto': - return SetMaintenanceModeDto.fromJson(value); - case 'SharedLinkCreateDto': - return SharedLinkCreateDto.fromJson(value); - case 'SharedLinkEditDto': - return SharedLinkEditDto.fromJson(value); - case 'SharedLinkLoginDto': - return SharedLinkLoginDto.fromJson(value); - case 'SharedLinkResponseDto': - return SharedLinkResponseDto.fromJson(value); - case 'SharedLinkType': - return SharedLinkTypeTypeTransformer().decode(value); - case 'SharedLinksResponse': - return SharedLinksResponse.fromJson(value); - case 'SharedLinksUpdate': - return SharedLinksUpdate.fromJson(value); - case 'SignUpDto': - return SignUpDto.fromJson(value); - case 'SmartSearchDto': - return SmartSearchDto.fromJson(value); - case 'SourceType': - return SourceTypeTypeTransformer().decode(value); - case 'StackCreateDto': - return StackCreateDto.fromJson(value); - case 'StackResponseDto': - return StackResponseDto.fromJson(value); - case 'StackUpdateDto': - return StackUpdateDto.fromJson(value); - case 'StatisticsSearchDto': - return StatisticsSearchDto.fromJson(value); - case 'StorageFolder': - return StorageFolderTypeTransformer().decode(value); - case 'SyncAckDeleteDto': - return SyncAckDeleteDto.fromJson(value); - case 'SyncAckDto': - return SyncAckDto.fromJson(value); - case 'SyncAckSetDto': - return SyncAckSetDto.fromJson(value); - case 'SyncAlbumDeleteV1': - return SyncAlbumDeleteV1.fromJson(value); - case 'SyncAlbumToAssetDeleteV1': - return SyncAlbumToAssetDeleteV1.fromJson(value); - case 'SyncAlbumToAssetV1': - return SyncAlbumToAssetV1.fromJson(value); - case 'SyncAlbumUserDeleteV1': - return SyncAlbumUserDeleteV1.fromJson(value); - case 'SyncAlbumUserV1': - return SyncAlbumUserV1.fromJson(value); - case 'SyncAlbumV1': - return SyncAlbumV1.fromJson(value); - case 'SyncAlbumV2': - return SyncAlbumV2.fromJson(value); - case 'SyncAssetDeleteV1': - return SyncAssetDeleteV1.fromJson(value); - case 'SyncAssetEditDeleteV1': - return SyncAssetEditDeleteV1.fromJson(value); - case 'SyncAssetEditV1': - return SyncAssetEditV1.fromJson(value); - case 'SyncAssetExifV1': - return SyncAssetExifV1.fromJson(value); - case 'SyncAssetFaceDeleteV1': - return SyncAssetFaceDeleteV1.fromJson(value); - case 'SyncAssetFaceV1': - return SyncAssetFaceV1.fromJson(value); - case 'SyncAssetFaceV2': - return SyncAssetFaceV2.fromJson(value); - case 'SyncAssetMetadataDeleteV1': - return SyncAssetMetadataDeleteV1.fromJson(value); - case 'SyncAssetMetadataV1': - return SyncAssetMetadataV1.fromJson(value); - case 'SyncAssetV1': - return SyncAssetV1.fromJson(value); - case 'SyncAssetV2': - return SyncAssetV2.fromJson(value); - case 'SyncAuthUserV1': - return SyncAuthUserV1.fromJson(value); - case 'SyncEntityType': - return SyncEntityTypeTypeTransformer().decode(value); - case 'SyncMemoryAssetDeleteV1': - return SyncMemoryAssetDeleteV1.fromJson(value); - case 'SyncMemoryAssetV1': - return SyncMemoryAssetV1.fromJson(value); - case 'SyncMemoryDeleteV1': - return SyncMemoryDeleteV1.fromJson(value); - case 'SyncMemoryV1': - return SyncMemoryV1.fromJson(value); - case 'SyncPartnerDeleteV1': - return SyncPartnerDeleteV1.fromJson(value); - case 'SyncPartnerV1': - return SyncPartnerV1.fromJson(value); - case 'SyncPersonDeleteV1': - return SyncPersonDeleteV1.fromJson(value); - case 'SyncPersonV1': - return SyncPersonV1.fromJson(value); - case 'SyncRequestType': - return SyncRequestTypeTypeTransformer().decode(value); - case 'SyncStackDeleteV1': - return SyncStackDeleteV1.fromJson(value); - case 'SyncStackV1': - return SyncStackV1.fromJson(value); - case 'SyncStreamDto': - return SyncStreamDto.fromJson(value); - case 'SyncUserDeleteV1': - return SyncUserDeleteV1.fromJson(value); - case 'SyncUserMetadataDeleteV1': - return SyncUserMetadataDeleteV1.fromJson(value); - case 'SyncUserMetadataV1': - return SyncUserMetadataV1.fromJson(value); - case 'SyncUserV1': - return SyncUserV1.fromJson(value); - case 'SystemConfigBackupsDto': - return SystemConfigBackupsDto.fromJson(value); - case 'SystemConfigDto': - return SystemConfigDto.fromJson(value); - case 'SystemConfigFFmpegDto': - return SystemConfigFFmpegDto.fromJson(value); - case 'SystemConfigFacesDto': - return SystemConfigFacesDto.fromJson(value); - case 'SystemConfigGeneratedFullsizeImageDto': - return SystemConfigGeneratedFullsizeImageDto.fromJson(value); - case 'SystemConfigGeneratedImageDto': - return SystemConfigGeneratedImageDto.fromJson(value); - case 'SystemConfigImageDto': - return SystemConfigImageDto.fromJson(value); - case 'SystemConfigJobDto': - return SystemConfigJobDto.fromJson(value); - case 'SystemConfigLibraryDto': - return SystemConfigLibraryDto.fromJson(value); - case 'SystemConfigLibraryScanDto': - return SystemConfigLibraryScanDto.fromJson(value); - case 'SystemConfigLibraryWatchDto': - return SystemConfigLibraryWatchDto.fromJson(value); - case 'SystemConfigLoggingDto': - return SystemConfigLoggingDto.fromJson(value); - case 'SystemConfigMachineLearningDto': - return SystemConfigMachineLearningDto.fromJson(value); - case 'SystemConfigMapDto': - return SystemConfigMapDto.fromJson(value); - case 'SystemConfigMetadataDto': - return SystemConfigMetadataDto.fromJson(value); - case 'SystemConfigNewVersionCheckDto': - return SystemConfigNewVersionCheckDto.fromJson(value); - case 'SystemConfigNightlyTasksDto': - return SystemConfigNightlyTasksDto.fromJson(value); - case 'SystemConfigNotificationsDto': - return SystemConfigNotificationsDto.fromJson(value); - case 'SystemConfigOAuthDto': - return SystemConfigOAuthDto.fromJson(value); - case 'SystemConfigPasswordLoginDto': - return SystemConfigPasswordLoginDto.fromJson(value); - case 'SystemConfigReverseGeocodingDto': - return SystemConfigReverseGeocodingDto.fromJson(value); - case 'SystemConfigServerDto': - return SystemConfigServerDto.fromJson(value); - case 'SystemConfigSmtpDto': - return SystemConfigSmtpDto.fromJson(value); - case 'SystemConfigSmtpTransportDto': - return SystemConfigSmtpTransportDto.fromJson(value); - case 'SystemConfigStorageTemplateDto': - return SystemConfigStorageTemplateDto.fromJson(value); - case 'SystemConfigTemplateEmailsDto': - return SystemConfigTemplateEmailsDto.fromJson(value); - case 'SystemConfigTemplateStorageOptionDto': - return SystemConfigTemplateStorageOptionDto.fromJson(value); - case 'SystemConfigTemplatesDto': - return SystemConfigTemplatesDto.fromJson(value); - case 'SystemConfigThemeDto': - return SystemConfigThemeDto.fromJson(value); - case 'SystemConfigTrashDto': - return SystemConfigTrashDto.fromJson(value); - case 'SystemConfigUserDto': - return SystemConfigUserDto.fromJson(value); - case 'TagBulkAssetsDto': - return TagBulkAssetsDto.fromJson(value); - case 'TagBulkAssetsResponseDto': - return TagBulkAssetsResponseDto.fromJson(value); - case 'TagCreateDto': - return TagCreateDto.fromJson(value); - case 'TagResponseDto': - return TagResponseDto.fromJson(value); - case 'TagUpdateDto': - return TagUpdateDto.fromJson(value); - case 'TagUpsertDto': - return TagUpsertDto.fromJson(value); - case 'TagsResponse': - return TagsResponse.fromJson(value); - case 'TagsUpdate': - return TagsUpdate.fromJson(value); - case 'TemplateDto': - return TemplateDto.fromJson(value); - case 'TemplateResponseDto': - return TemplateResponseDto.fromJson(value); - case 'TestEmailResponseDto': - return TestEmailResponseDto.fromJson(value); - case 'TimeBucketAssetResponseDto': - return TimeBucketAssetResponseDto.fromJson(value); - case 'TimeBucketsResponseDto': - return TimeBucketsResponseDto.fromJson(value); - case 'ToneMapping': - return ToneMappingTypeTransformer().decode(value); - case 'TranscodeHWAccel': - return TranscodeHWAccelTypeTransformer().decode(value); - case 'TranscodePolicy': - return TranscodePolicyTypeTransformer().decode(value); - case 'TrashResponseDto': - return TrashResponseDto.fromJson(value); - case 'UpdateAlbumDto': - return UpdateAlbumDto.fromJson(value); - case 'UpdateAlbumUserDto': - return UpdateAlbumUserDto.fromJson(value); - case 'UpdateAssetDto': - return UpdateAssetDto.fromJson(value); - case 'UpdateLibraryDto': - return UpdateLibraryDto.fromJson(value); - case 'UsageByUserDto': - return UsageByUserDto.fromJson(value); - case 'UserAdminCreateDto': - return UserAdminCreateDto.fromJson(value); - case 'UserAdminDeleteDto': - return UserAdminDeleteDto.fromJson(value); - case 'UserAdminResponseDto': - return UserAdminResponseDto.fromJson(value); - case 'UserAdminUpdateDto': - return UserAdminUpdateDto.fromJson(value); - case 'UserAvatarColor': - return UserAvatarColorTypeTransformer().decode(value); - case 'UserLicense': - return UserLicense.fromJson(value); - case 'UserMetadataKey': - return UserMetadataKeyTypeTransformer().decode(value); - case 'UserPreferencesResponseDto': - return UserPreferencesResponseDto.fromJson(value); - case 'UserPreferencesUpdateDto': - return UserPreferencesUpdateDto.fromJson(value); - case 'UserResponseDto': - return UserResponseDto.fromJson(value); - case 'UserStatus': - return UserStatusTypeTransformer().decode(value); - case 'UserUpdateMeDto': - return UserUpdateMeDto.fromJson(value); - case 'ValidateAccessTokenResponseDto': - return ValidateAccessTokenResponseDto.fromJson(value); - case 'ValidateLibraryDto': - return ValidateLibraryDto.fromJson(value); - case 'ValidateLibraryImportPathResponseDto': - return ValidateLibraryImportPathResponseDto.fromJson(value); - case 'ValidateLibraryResponseDto': - return ValidateLibraryResponseDto.fromJson(value); - case 'VersionCheckStateResponseDto': - return VersionCheckStateResponseDto.fromJson(value); - case 'VideoCodec': - return VideoCodecTypeTransformer().decode(value); - case 'VideoContainer': - return VideoContainerTypeTransformer().decode(value); - case 'WorkflowCreateDto': - return WorkflowCreateDto.fromJson(value); - case 'WorkflowResponseDto': - return WorkflowResponseDto.fromJson(value); - case 'WorkflowShareResponseDto': - return WorkflowShareResponseDto.fromJson(value); - case 'WorkflowShareStepDto': - return WorkflowShareStepDto.fromJson(value); - case 'WorkflowStepDto': - return WorkflowStepDto.fromJson(value); - case 'WorkflowTrigger': - return WorkflowTriggerTypeTransformer().decode(value); - case 'WorkflowTriggerResponseDto': - return WorkflowTriggerResponseDto.fromJson(value); - case 'WorkflowType': - return WorkflowTypeTypeTransformer().decode(value); - case 'WorkflowUpdateDto': - return WorkflowUpdateDto.fromJson(value); + return value is DateTime ? value : DateTime.tryParse('$value'); default: + // Collection wrappers recurse on the element type. dynamic match; - if (value is List && (match = _regList.firstMatch(targetType)?.group(1)) != null) { - return value - .map((dynamic v) => fromJson(v, match, growable: growable,)) - .toList(growable: growable); + if (value is List && (match = _regList.firstMatch(type)?.group(1)) != null) { + return value.map((dynamic v) => fromJson(v, match, growable: growable)).toList(growable: growable); } - if (value is Set && (match = _regSet.firstMatch(targetType)?.group(1)) != null) { - return value - .map((dynamic v) => fromJson(v, match, growable: growable,)) - .toSet(); + if (value is Set && (match = _regSet.firstMatch(type)?.group(1)) != null) { + return value.map((dynamic v) => fromJson(v, match, growable: growable)).toSet(); } - if (value is Map && (match = _regMap.firstMatch(targetType)?.group(1)) != null) { + if (value is Map && (match = _regMap.firstMatch(type)?.group(1)) != null) { return Map.fromIterables( value.keys.cast(), - value.values.map((dynamic v) => fromJson(v, match, growable: growable,)), + value.values.map((dynamic v) => fromJson(v, match, growable: growable)), ); } + // Named model / enum dispatch (generated; see deserializeNamed). + final hit = deserializeNamed(value, type); + if (hit != _noMatch) { + return hit; + } } } on Exception catch (error, trace) { - throw ApiException.withInner(HttpStatus.internalServerError, 'Exception during deserialization.', error, trace,); + throw ApiException.withInner(HttpStatus.internalServerError, 'Exception during deserialization.', error, trace); } - throw ApiException(HttpStatus.internalServerError, 'Could not find a suitable class for deserialization',); + throw ApiException(HttpStatus.internalServerError, 'Could not find a suitable class for deserialization'); } } -/// Primarily intended for use in an isolate. -class DeserializationMessage { - const DeserializationMessage({ - required this.json, - required this.targetType, - this.growable = false, - }); +/// Decodes a JSON string; invoked inside [compute] on a background isolate. +dynamic _decodeJson(String value) => json.decode(value); - /// The JSON value to deserialize. - final String json; +final _regList = RegExp(r'^List<(.*)>$'); +final _regSet = RegExp(r'^Set<(.*)>$'); +final _regMap = RegExp(r'^Map$'); - /// Target type to deserialize to. - final String targetType; +/// Sentinel returned by [deserializeNamed] when [targetType] is not a known +/// model/enum name, so [ApiClient.fromJson] can fall through to its error path. +const Object _noMatch = Object(); - /// Whether to make deserialized lists or maps growable. - final bool growable; +// ─────────────────────────────────────────────────────────────────────────── +// GENERATED DISPATCH — INJECTION POINT +// +// The integrator emits `deserializeNamed` as part of the generated client (a +// `part of openapi.api;` file). It must: +// * `switch (targetType)` over EVERY model / enum / union / alias dartName; +// * `return .fromJson(value);` for each case; +// * `return _noMatch;` in the default branch (NOT throw) so collection and +// error handling in `ApiClient.fromJson` stays centralized. +// +// Example body the generator should produce: +// +// dynamic deserializeNamed(dynamic value, String targetType) { +// switch (targetType) { +// case 'ActivityCreateDto': +// return ActivityCreateDto.fromJson(value); +// // ... one case per declaration ... +// default: +// return _noMatch; +// } +// } +// +// TODO(integrator): replace this stub with the generated `deserializeNamed`. +// The stub below makes the runtime compile standalone; the generated version +// SHADOWS nothing — remove this stub when emitting the real one, or have the +// generator omit this stub file. It is kept here only so reviewers see the +// exact contract. +// ─────────────────────────────────────────────────────────────────────────── +dynamic deserializeNamed(dynamic value, String targetType) { + switch (targetType) { + case 'ActivityCreateDto': + return ActivityCreateDto.fromJson(value); + case 'ActivityResponseDto': + return ActivityResponseDto.fromJson(value); + case 'ActivityStatisticsResponseDto': + return ActivityStatisticsResponseDto.fromJson(value); + case 'AddUsersDto': + return AddUsersDto.fromJson(value); + case 'AdminOnboardingUpdateDto': + return AdminOnboardingUpdateDto.fromJson(value); + case 'AlbumResponseDto': + return AlbumResponseDto.fromJson(value); + case 'AlbumStatisticsResponseDto': + return AlbumStatisticsResponseDto.fromJson(value); + case 'AlbumUserAddDto': + return AlbumUserAddDto.fromJson(value); + case 'AlbumUserCreateDto': + return AlbumUserCreateDto.fromJson(value); + case 'AlbumUserResponseDto': + return AlbumUserResponseDto.fromJson(value); + case 'AlbumUserRole': + return AlbumUserRole.fromJson(value); + case 'AlbumsAddAssetsDto': + return AlbumsAddAssetsDto.fromJson(value); + case 'AlbumsAddAssetsResponseDto': + return AlbumsAddAssetsResponseDto.fromJson(value); + case 'AlbumsResponse': + return AlbumsResponse.fromJson(value); + case 'AlbumsUpdate': + return AlbumsUpdate.fromJson(value); + case 'ApiKeyCreateDto': + return ApiKeyCreateDto.fromJson(value); + case 'ApiKeyCreateResponseDto': + return ApiKeyCreateResponseDto.fromJson(value); + case 'ApiKeyResponseDto': + return ApiKeyResponseDto.fromJson(value); + case 'ApiKeyUpdateDto': + return ApiKeyUpdateDto.fromJson(value); + case 'AssetBulkDeleteDto': + return AssetBulkDeleteDto.fromJson(value); + case 'AssetBulkUpdateDto': + return AssetBulkUpdateDto.fromJson(value); + case 'AssetBulkUploadCheckDto': + return AssetBulkUploadCheckDto.fromJson(value); + case 'AssetBulkUploadCheckItem': + return AssetBulkUploadCheckItem.fromJson(value); + case 'AssetBulkUploadCheckResponseDto': + return AssetBulkUploadCheckResponseDto.fromJson(value); + case 'AssetBulkUploadCheckResult': + return AssetBulkUploadCheckResult.fromJson(value); + case 'AssetCopyDto': + return AssetCopyDto.fromJson(value); + case 'AssetEditAction': + return AssetEditAction.fromJson(value); + case 'AssetEditActionItemDto': + return AssetEditActionItemDto.fromJson(value); + case 'AssetEditActionItemResponseDto': + return AssetEditActionItemResponseDto.fromJson(value); + case 'AssetEditsCreateDto': + return AssetEditsCreateDto.fromJson(value); + case 'AssetEditsResponseDto': + return AssetEditsResponseDto.fromJson(value); + case 'AssetFaceCreateDto': + return AssetFaceCreateDto.fromJson(value); + case 'AssetFaceDeleteDto': + return AssetFaceDeleteDto.fromJson(value); + case 'AssetFaceResponseDto': + return AssetFaceResponseDto.fromJson(value); + case 'AssetFaceUpdateDto': + return AssetFaceUpdateDto.fromJson(value); + case 'AssetFaceUpdateItem': + return AssetFaceUpdateItem.fromJson(value); + case 'AssetIdErrorReason': + return AssetIdErrorReason.fromJson(value); + case 'AssetIdsDto': + return AssetIdsDto.fromJson(value); + case 'AssetIdsResponseDto': + return AssetIdsResponseDto.fromJson(value); + case 'AssetJobName': + return AssetJobName.fromJson(value); + case 'AssetJobsDto': + return AssetJobsDto.fromJson(value); + case 'AssetMediaCreateDto': + return AssetMediaCreateDto.fromJson(value); + case 'AssetMediaResponseDto': + return AssetMediaResponseDto.fromJson(value); + case 'AssetMediaSize': + return AssetMediaSize.fromJson(value); + case 'AssetMediaStatus': + return AssetMediaStatus.fromJson(value); + case 'AssetMetadataBulkDeleteDto': + return AssetMetadataBulkDeleteDto.fromJson(value); + case 'AssetMetadataBulkDeleteItemDto': + return AssetMetadataBulkDeleteItemDto.fromJson(value); + case 'AssetMetadataBulkResponseDto': + return AssetMetadataBulkResponseDto.fromJson(value); + case 'AssetMetadataBulkUpsertDto': + return AssetMetadataBulkUpsertDto.fromJson(value); + case 'AssetMetadataBulkUpsertItemDto': + return AssetMetadataBulkUpsertItemDto.fromJson(value); + case 'AssetMetadataResponseDto': + return AssetMetadataResponseDto.fromJson(value); + case 'AssetMetadataUpsertDto': + return AssetMetadataUpsertDto.fromJson(value); + case 'AssetMetadataUpsertItemDto': + return AssetMetadataUpsertItemDto.fromJson(value); + case 'AssetOcrResponseDto': + return AssetOcrResponseDto.fromJson(value); + case 'AssetOrder': + return AssetOrder.fromJson(value); + case 'AssetOrderBy': + return AssetOrderBy.fromJson(value); + case 'AssetRejectReason': + return AssetRejectReason.fromJson(value); + case 'AssetResponseDto': + return AssetResponseDto.fromJson(value); + case 'AssetStackResponseDto': + return AssetStackResponseDto.fromJson(value); + case 'AssetStatsResponseDto': + return AssetStatsResponseDto.fromJson(value); + case 'AssetTypeEnum': + return AssetTypeEnum.fromJson(value); + case 'AssetUploadAction': + return AssetUploadAction.fromJson(value); + case 'AssetVisibility': + return AssetVisibility.fromJson(value); + case 'AudioCodec': + return AudioCodec.fromJson(value); + case 'AuthStatusResponseDto': + return AuthStatusResponseDto.fromJson(value); + case 'AvatarUpdate': + return AvatarUpdate.fromJson(value); + case 'BulkIdErrorReason': + return BulkIdErrorReason.fromJson(value); + case 'BulkIdResponseDto': + return BulkIdResponseDto.fromJson(value); + case 'BulkIdsDto': + return BulkIdsDto.fromJson(value); + case 'CastResponse': + return CastResponse.fromJson(value); + case 'CastUpdate': + return CastUpdate.fromJson(value); + case 'ChangePasswordDto': + return ChangePasswordDto.fromJson(value); + case 'ClipConfig': + return ClipConfig.fromJson(value); + case 'Colorspace': + return Colorspace.fromJson(value); + case 'ContributorCountResponseDto': + return ContributorCountResponseDto.fromJson(value); + case 'CqMode': + return CqMode.fromJson(value); + case 'CreateAlbumDto': + return CreateAlbumDto.fromJson(value); + case 'CreateLibraryDto': + return CreateLibraryDto.fromJson(value); + case 'CreateProfileImageDto': + return CreateProfileImageDto.fromJson(value); + case 'CreateProfileImageResponseDto': + return CreateProfileImageResponseDto.fromJson(value); + case 'CropParameters': + return CropParameters.fromJson(value); + case 'DatabaseBackupConfig': + return DatabaseBackupConfig.fromJson(value); + case 'DatabaseBackupDeleteDto': + return DatabaseBackupDeleteDto.fromJson(value); + case 'DatabaseBackupDto': + return DatabaseBackupDto.fromJson(value); + case 'DatabaseBackupListResponseDto': + return DatabaseBackupListResponseDto.fromJson(value); + case 'DatabaseBackupUploadDto': + return DatabaseBackupUploadDto.fromJson(value); + case 'DownloadArchiveDto': + return DownloadArchiveDto.fromJson(value); + case 'DownloadArchiveInfo': + return DownloadArchiveInfo.fromJson(value); + case 'DownloadInfoDto': + return DownloadInfoDto.fromJson(value); + case 'DownloadResponse': + return DownloadResponse.fromJson(value); + case 'DownloadResponseDto': + return DownloadResponseDto.fromJson(value); + case 'DownloadUpdate': + return DownloadUpdate.fromJson(value); + case 'DuplicateDetectionConfig': + return DuplicateDetectionConfig.fromJson(value); + case 'DuplicateResolveDto': + return DuplicateResolveDto.fromJson(value); + case 'DuplicateResolveGroupDto': + return DuplicateResolveGroupDto.fromJson(value); + case 'DuplicateResponseDto': + return DuplicateResponseDto.fromJson(value); + case 'EmailNotificationsResponse': + return EmailNotificationsResponse.fromJson(value); + case 'EmailNotificationsUpdate': + return EmailNotificationsUpdate.fromJson(value); + case 'ExifResponseDto': + return ExifResponseDto.fromJson(value); + case 'FaceDto': + return FaceDto.fromJson(value); + case 'FacialRecognitionConfig': + return FacialRecognitionConfig.fromJson(value); + case 'FoldersResponse': + return FoldersResponse.fromJson(value); + case 'FoldersUpdate': + return FoldersUpdate.fromJson(value); + case 'ImageFormat': + return ImageFormat.fromJson(value); + case 'JobCreateDto': + return JobCreateDto.fromJson(value); + case 'JobName': + return JobName.fromJson(value); + case 'JobSettingsDto': + return JobSettingsDto.fromJson(value); + case 'LibraryResponseDto': + return LibraryResponseDto.fromJson(value); + case 'LibraryStatsResponseDto': + return LibraryStatsResponseDto.fromJson(value); + case 'LicenseKeyDto': + return LicenseKeyDto.fromJson(value); + case 'LogLevel': + return LogLevel.fromJson(value); + case 'LoginCredentialDto': + return LoginCredentialDto.fromJson(value); + case 'LoginResponseDto': + return LoginResponseDto.fromJson(value); + case 'LogoutResponseDto': + return LogoutResponseDto.fromJson(value); + case 'MachineLearningAvailabilityChecksDto': + return MachineLearningAvailabilityChecksDto.fromJson(value); + case 'MaintenanceAction': + return MaintenanceAction.fromJson(value); + case 'MaintenanceAuthDto': + return MaintenanceAuthDto.fromJson(value); + case 'MaintenanceDetectInstallResponseDto': + return MaintenanceDetectInstallResponseDto.fromJson(value); + case 'MaintenanceDetectInstallStorageFolderDto': + return MaintenanceDetectInstallStorageFolderDto.fromJson(value); + case 'MaintenanceLoginDto': + return MaintenanceLoginDto.fromJson(value); + case 'MaintenanceStatusResponseDto': + return MaintenanceStatusResponseDto.fromJson(value); + case 'ManualJobName': + return ManualJobName.fromJson(value); + case 'MapMarkerResponseDto': + return MapMarkerResponseDto.fromJson(value); + case 'MapReverseGeocodeResponseDto': + return MapReverseGeocodeResponseDto.fromJson(value); + case 'MemoriesResponse': + return MemoriesResponse.fromJson(value); + case 'MemoriesUpdate': + return MemoriesUpdate.fromJson(value); + case 'MemoryCreateDto': + return MemoryCreateDto.fromJson(value); + case 'MemoryResponseDto': + return MemoryResponseDto.fromJson(value); + case 'MemorySearchOrder': + return MemorySearchOrder.fromJson(value); + case 'MemoryStatisticsResponseDto': + return MemoryStatisticsResponseDto.fromJson(value); + case 'MemoryType': + return MemoryType.fromJson(value); + case 'MemoryUpdateDto': + return MemoryUpdateDto.fromJson(value); + case 'MergePersonDto': + return MergePersonDto.fromJson(value); + case 'MetadataSearchDto': + return MetadataSearchDto.fromJson(value); + case 'MirrorAxis': + return MirrorAxis.fromJson(value); + case 'MirrorParameters': + return MirrorParameters.fromJson(value); + case 'NotificationCreateDto': + return NotificationCreateDto.fromJson(value); + case 'NotificationDeleteAllDto': + return NotificationDeleteAllDto.fromJson(value); + case 'NotificationDto': + return NotificationDto.fromJson(value); + case 'NotificationLevel': + return NotificationLevel.fromJson(value); + case 'NotificationType': + return NotificationType.fromJson(value); + case 'NotificationUpdateAllDto': + return NotificationUpdateAllDto.fromJson(value); + case 'NotificationUpdateDto': + return NotificationUpdateDto.fromJson(value); + case 'OAuthAuthorizeResponseDto': + return OAuthAuthorizeResponseDto.fromJson(value); + case 'OAuthBackchannelLogoutDto': + return OAuthBackchannelLogoutDto.fromJson(value); + case 'OAuthCallbackDto': + return OAuthCallbackDto.fromJson(value); + case 'OAuthConfigDto': + return OAuthConfigDto.fromJson(value); + case 'OAuthTokenEndpointAuthMethod': + return OAuthTokenEndpointAuthMethod.fromJson(value); + case 'OcrConfig': + return OcrConfig.fromJson(value); + case 'OnThisDayDto': + return OnThisDayDto.fromJson(value); + case 'OnboardingDto': + return OnboardingDto.fromJson(value); + case 'OnboardingResponseDto': + return OnboardingResponseDto.fromJson(value); + case 'PartnerCreateDto': + return PartnerCreateDto.fromJson(value); + case 'PartnerDirection': + return PartnerDirection.fromJson(value); + case 'PartnerResponseDto': + return PartnerResponseDto.fromJson(value); + case 'PartnerUpdateDto': + return PartnerUpdateDto.fromJson(value); + case 'PeopleResponse': + return PeopleResponse.fromJson(value); + case 'PeopleResponseDto': + return PeopleResponseDto.fromJson(value); + case 'PeopleUpdate': + return PeopleUpdate.fromJson(value); + case 'PeopleUpdateDto': + return PeopleUpdateDto.fromJson(value); + case 'PeopleUpdateItem': + return PeopleUpdateItem.fromJson(value); + case 'Permission': + return Permission.fromJson(value); + case 'PersonCreateDto': + return PersonCreateDto.fromJson(value); + case 'PersonResponseDto': + return PersonResponseDto.fromJson(value); + case 'PersonStatisticsResponseDto': + return PersonStatisticsResponseDto.fromJson(value); + case 'PersonUpdateDto': + return PersonUpdateDto.fromJson(value); + case 'PinCodeChangeDto': + return PinCodeChangeDto.fromJson(value); + case 'PinCodeResetDto': + return PinCodeResetDto.fromJson(value); + case 'PinCodeSetupDto': + return PinCodeSetupDto.fromJson(value); + case 'PlacesResponseDto': + return PlacesResponseDto.fromJson(value); + case 'PluginMethodResponseDto': + return PluginMethodResponseDto.fromJson(value); + case 'PluginResponseDto': + return PluginResponseDto.fromJson(value); + case 'PluginTemplateResponseDto': + return PluginTemplateResponseDto.fromJson(value); + case 'PluginTemplateStepResponseDto': + return PluginTemplateStepResponseDto.fromJson(value); + case 'PurchaseResponse': + return PurchaseResponse.fromJson(value); + case 'PurchaseUpdate': + return PurchaseUpdate.fromJson(value); + case 'QueueCommand': + return QueueCommand.fromJson(value); + case 'QueueCommandDto': + return QueueCommandDto.fromJson(value); + case 'QueueDeleteDto': + return QueueDeleteDto.fromJson(value); + case 'QueueJobResponseDto': + return QueueJobResponseDto.fromJson(value); + case 'QueueJobStatus': + return QueueJobStatus.fromJson(value); + case 'QueueName': + return QueueName.fromJson(value); + case 'QueueResponseDto': + return QueueResponseDto.fromJson(value); + case 'QueueResponseLegacyDto': + return QueueResponseLegacyDto.fromJson(value); + case 'QueueStatisticsDto': + return QueueStatisticsDto.fromJson(value); + case 'QueueStatusLegacyDto': + return QueueStatusLegacyDto.fromJson(value); + case 'QueueUpdateDto': + return QueueUpdateDto.fromJson(value); + case 'QueuesResponseLegacyDto': + return QueuesResponseLegacyDto.fromJson(value); + case 'RandomSearchDto': + return RandomSearchDto.fromJson(value); + case 'RatingsResponse': + return RatingsResponse.fromJson(value); + case 'RatingsUpdate': + return RatingsUpdate.fromJson(value); + case 'ReactionLevel': + return ReactionLevel.fromJson(value); + case 'ReactionType': + return ReactionType.fromJson(value); + case 'ReverseGeocodingStateResponseDto': + return ReverseGeocodingStateResponseDto.fromJson(value); + case 'RotateParameters': + return RotateParameters.fromJson(value); + case 'SearchAlbumResponseDto': + return SearchAlbumResponseDto.fromJson(value); + case 'SearchAssetResponseDto': + return SearchAssetResponseDto.fromJson(value); + case 'SearchExploreItem': + return SearchExploreItem.fromJson(value); + case 'SearchExploreResponseDto': + return SearchExploreResponseDto.fromJson(value); + case 'SearchFacetCountResponseDto': + return SearchFacetCountResponseDto.fromJson(value); + case 'SearchFacetResponseDto': + return SearchFacetResponseDto.fromJson(value); + case 'SearchResponseDto': + return SearchResponseDto.fromJson(value); + case 'SearchStatisticsResponseDto': + return SearchStatisticsResponseDto.fromJson(value); + case 'SearchSuggestionType': + return SearchSuggestionType.fromJson(value); + case 'ServerAboutResponseDto': + return ServerAboutResponseDto.fromJson(value); + case 'ServerApkLinksDto': + return ServerApkLinksDto.fromJson(value); + case 'ServerConfigDto': + return ServerConfigDto.fromJson(value); + case 'ServerFeaturesDto': + return ServerFeaturesDto.fromJson(value); + case 'ServerMediaTypesResponseDto': + return ServerMediaTypesResponseDto.fromJson(value); + case 'ServerPingResponse': + return ServerPingResponse.fromJson(value); + case 'ServerStatsResponseDto': + return ServerStatsResponseDto.fromJson(value); + case 'ServerStorageResponseDto': + return ServerStorageResponseDto.fromJson(value); + case 'ServerVersionHistoryResponseDto': + return ServerVersionHistoryResponseDto.fromJson(value); + case 'ServerVersionResponseDto': + return ServerVersionResponseDto.fromJson(value); + case 'SessionCreateDto': + return SessionCreateDto.fromJson(value); + case 'SessionCreateResponseDto': + return SessionCreateResponseDto.fromJson(value); + case 'SessionResponseDto': + return SessionResponseDto.fromJson(value); + case 'SessionUnlockDto': + return SessionUnlockDto.fromJson(value); + case 'SessionUpdateDto': + return SessionUpdateDto.fromJson(value); + case 'SetMaintenanceModeDto': + return SetMaintenanceModeDto.fromJson(value); + case 'SharedLinkCreateDto': + return SharedLinkCreateDto.fromJson(value); + case 'SharedLinkEditDto': + return SharedLinkEditDto.fromJson(value); + case 'SharedLinkLoginDto': + return SharedLinkLoginDto.fromJson(value); + case 'SharedLinkResponseDto': + return SharedLinkResponseDto.fromJson(value); + case 'SharedLinkType': + return SharedLinkType.fromJson(value); + case 'SharedLinksResponse': + return SharedLinksResponse.fromJson(value); + case 'SharedLinksUpdate': + return SharedLinksUpdate.fromJson(value); + case 'SignUpDto': + return SignUpDto.fromJson(value); + case 'SmartSearchDto': + return SmartSearchDto.fromJson(value); + case 'SourceType': + return SourceType.fromJson(value); + case 'StackCreateDto': + return StackCreateDto.fromJson(value); + case 'StackResponseDto': + return StackResponseDto.fromJson(value); + case 'StackUpdateDto': + return StackUpdateDto.fromJson(value); + case 'StatisticsSearchDto': + return StatisticsSearchDto.fromJson(value); + case 'StorageFolder': + return StorageFolder.fromJson(value); + case 'SyncAckDeleteDto': + return SyncAckDeleteDto.fromJson(value); + case 'SyncAckDto': + return SyncAckDto.fromJson(value); + case 'SyncAckSetDto': + return SyncAckSetDto.fromJson(value); + case 'SyncAckV1': + return SyncAckV1.fromJson(value); + case 'SyncAlbumDeleteV1': + return SyncAlbumDeleteV1.fromJson(value); + case 'SyncAlbumToAssetDeleteV1': + return SyncAlbumToAssetDeleteV1.fromJson(value); + case 'SyncAlbumToAssetV1': + return SyncAlbumToAssetV1.fromJson(value); + case 'SyncAlbumUserDeleteV1': + return SyncAlbumUserDeleteV1.fromJson(value); + case 'SyncAlbumUserV1': + return SyncAlbumUserV1.fromJson(value); + case 'SyncAlbumV1': + return SyncAlbumV1.fromJson(value); + case 'SyncAlbumV2': + return SyncAlbumV2.fromJson(value); + case 'SyncAssetDeleteV1': + return SyncAssetDeleteV1.fromJson(value); + case 'SyncAssetEditDeleteV1': + return SyncAssetEditDeleteV1.fromJson(value); + case 'SyncAssetEditV1': + return SyncAssetEditV1.fromJson(value); + case 'SyncAssetExifV1': + return SyncAssetExifV1.fromJson(value); + case 'SyncAssetFaceDeleteV1': + return SyncAssetFaceDeleteV1.fromJson(value); + case 'SyncAssetFaceV1': + return SyncAssetFaceV1.fromJson(value); + case 'SyncAssetFaceV2': + return SyncAssetFaceV2.fromJson(value); + case 'SyncAssetMetadataDeleteV1': + return SyncAssetMetadataDeleteV1.fromJson(value); + case 'SyncAssetMetadataV1': + return SyncAssetMetadataV1.fromJson(value); + case 'SyncAssetV1': + return SyncAssetV1.fromJson(value); + case 'SyncAssetV2': + return SyncAssetV2.fromJson(value); + case 'SyncAuthUserV1': + return SyncAuthUserV1.fromJson(value); + case 'SyncCompleteV1': + return SyncCompleteV1.fromJson(value); + case 'SyncEntityType': + return SyncEntityType.fromJson(value); + case 'SyncMemoryAssetDeleteV1': + return SyncMemoryAssetDeleteV1.fromJson(value); + case 'SyncMemoryAssetV1': + return SyncMemoryAssetV1.fromJson(value); + case 'SyncMemoryDeleteV1': + return SyncMemoryDeleteV1.fromJson(value); + case 'SyncMemoryV1': + return SyncMemoryV1.fromJson(value); + case 'SyncPartnerDeleteV1': + return SyncPartnerDeleteV1.fromJson(value); + case 'SyncPartnerV1': + return SyncPartnerV1.fromJson(value); + case 'SyncPersonDeleteV1': + return SyncPersonDeleteV1.fromJson(value); + case 'SyncPersonV1': + return SyncPersonV1.fromJson(value); + case 'SyncRequestType': + return SyncRequestType.fromJson(value); + case 'SyncResetV1': + return SyncResetV1.fromJson(value); + case 'SyncStackDeleteV1': + return SyncStackDeleteV1.fromJson(value); + case 'SyncStackV1': + return SyncStackV1.fromJson(value); + case 'SyncStreamDto': + return SyncStreamDto.fromJson(value); + case 'SyncUserDeleteV1': + return SyncUserDeleteV1.fromJson(value); + case 'SyncUserMetadataDeleteV1': + return SyncUserMetadataDeleteV1.fromJson(value); + case 'SyncUserMetadataV1': + return SyncUserMetadataV1.fromJson(value); + case 'SyncUserV1': + return SyncUserV1.fromJson(value); + case 'SystemConfigBackupsDto': + return SystemConfigBackupsDto.fromJson(value); + case 'SystemConfigDto': + return SystemConfigDto.fromJson(value); + case 'SystemConfigFFmpegDto': + return SystemConfigFFmpegDto.fromJson(value); + case 'SystemConfigFacesDto': + return SystemConfigFacesDto.fromJson(value); + case 'SystemConfigGeneratedFullsizeImageDto': + return SystemConfigGeneratedFullsizeImageDto.fromJson(value); + case 'SystemConfigGeneratedImageDto': + return SystemConfigGeneratedImageDto.fromJson(value); + case 'SystemConfigImageDto': + return SystemConfigImageDto.fromJson(value); + case 'SystemConfigJobDto': + return SystemConfigJobDto.fromJson(value); + case 'SystemConfigLibraryDto': + return SystemConfigLibraryDto.fromJson(value); + case 'SystemConfigLibraryScanDto': + return SystemConfigLibraryScanDto.fromJson(value); + case 'SystemConfigLibraryWatchDto': + return SystemConfigLibraryWatchDto.fromJson(value); + case 'SystemConfigLoggingDto': + return SystemConfigLoggingDto.fromJson(value); + case 'SystemConfigMachineLearningDto': + return SystemConfigMachineLearningDto.fromJson(value); + case 'SystemConfigMapDto': + return SystemConfigMapDto.fromJson(value); + case 'SystemConfigMetadataDto': + return SystemConfigMetadataDto.fromJson(value); + case 'SystemConfigNewVersionCheckDto': + return SystemConfigNewVersionCheckDto.fromJson(value); + case 'SystemConfigNightlyTasksDto': + return SystemConfigNightlyTasksDto.fromJson(value); + case 'SystemConfigNotificationsDto': + return SystemConfigNotificationsDto.fromJson(value); + case 'SystemConfigOAuthDto': + return SystemConfigOAuthDto.fromJson(value); + case 'SystemConfigPasswordLoginDto': + return SystemConfigPasswordLoginDto.fromJson(value); + case 'SystemConfigReverseGeocodingDto': + return SystemConfigReverseGeocodingDto.fromJson(value); + case 'SystemConfigServerDto': + return SystemConfigServerDto.fromJson(value); + case 'SystemConfigSmtpDto': + return SystemConfigSmtpDto.fromJson(value); + case 'SystemConfigSmtpTransportDto': + return SystemConfigSmtpTransportDto.fromJson(value); + case 'SystemConfigStorageTemplateDto': + return SystemConfigStorageTemplateDto.fromJson(value); + case 'SystemConfigTemplateEmailsDto': + return SystemConfigTemplateEmailsDto.fromJson(value); + case 'SystemConfigTemplateStorageOptionDto': + return SystemConfigTemplateStorageOptionDto.fromJson(value); + case 'SystemConfigTemplatesDto': + return SystemConfigTemplatesDto.fromJson(value); + case 'SystemConfigThemeDto': + return SystemConfigThemeDto.fromJson(value); + case 'SystemConfigTrashDto': + return SystemConfigTrashDto.fromJson(value); + case 'SystemConfigUserDto': + return SystemConfigUserDto.fromJson(value); + case 'TagBulkAssetsDto': + return TagBulkAssetsDto.fromJson(value); + case 'TagBulkAssetsResponseDto': + return TagBulkAssetsResponseDto.fromJson(value); + case 'TagCreateDto': + return TagCreateDto.fromJson(value); + case 'TagResponseDto': + return TagResponseDto.fromJson(value); + case 'TagUpdateDto': + return TagUpdateDto.fromJson(value); + case 'TagUpsertDto': + return TagUpsertDto.fromJson(value); + case 'TagsResponse': + return TagsResponse.fromJson(value); + case 'TagsUpdate': + return TagsUpdate.fromJson(value); + case 'TemplateDto': + return TemplateDto.fromJson(value); + case 'TemplateResponseDto': + return TemplateResponseDto.fromJson(value); + case 'TestEmailResponseDto': + return TestEmailResponseDto.fromJson(value); + case 'TimeBucketAssetResponseDto': + return TimeBucketAssetResponseDto.fromJson(value); + case 'TimeBucketsResponseDto': + return TimeBucketsResponseDto.fromJson(value); + case 'ToneMapping': + return ToneMapping.fromJson(value); + case 'TranscodeHwAccel': + return TranscodeHwAccel.fromJson(value); + case 'TranscodePolicy': + return TranscodePolicy.fromJson(value); + case 'TrashResponseDto': + return TrashResponseDto.fromJson(value); + case 'UpdateAlbumDto': + return UpdateAlbumDto.fromJson(value); + case 'UpdateAlbumUserDto': + return UpdateAlbumUserDto.fromJson(value); + case 'UpdateAssetDto': + return UpdateAssetDto.fromJson(value); + case 'UpdateLibraryDto': + return UpdateLibraryDto.fromJson(value); + case 'UsageByUserDto': + return UsageByUserDto.fromJson(value); + case 'UserAdminCreateDto': + return UserAdminCreateDto.fromJson(value); + case 'UserAdminDeleteDto': + return UserAdminDeleteDto.fromJson(value); + case 'UserAdminResponseDto': + return UserAdminResponseDto.fromJson(value); + case 'UserAdminUpdateDto': + return UserAdminUpdateDto.fromJson(value); + case 'UserAvatarColor': + return UserAvatarColor.fromJson(value); + case 'UserLicense': + return UserLicense.fromJson(value); + case 'UserMetadataKey': + return UserMetadataKey.fromJson(value); + case 'UserPreferencesResponseDto': + return UserPreferencesResponseDto.fromJson(value); + case 'UserPreferencesUpdateDto': + return UserPreferencesUpdateDto.fromJson(value); + case 'UserResponseDto': + return UserResponseDto.fromJson(value); + case 'UserStatus': + return UserStatus.fromJson(value); + case 'UserUpdateMeDto': + return UserUpdateMeDto.fromJson(value); + case 'ValidateAccessTokenResponseDto': + return ValidateAccessTokenResponseDto.fromJson(value); + case 'ValidateLibraryDto': + return ValidateLibraryDto.fromJson(value); + case 'ValidateLibraryImportPathResponseDto': + return ValidateLibraryImportPathResponseDto.fromJson(value); + case 'ValidateLibraryResponseDto': + return ValidateLibraryResponseDto.fromJson(value); + case 'VersionCheckStateResponseDto': + return VersionCheckStateResponseDto.fromJson(value); + case 'VideoCodec': + return VideoCodec.fromJson(value); + case 'VideoContainer': + return VideoContainer.fromJson(value); + case 'WorkflowCreateDto': + return WorkflowCreateDto.fromJson(value); + case 'WorkflowResponseDto': + return WorkflowResponseDto.fromJson(value); + case 'WorkflowShareResponseDto': + return WorkflowShareResponseDto.fromJson(value); + case 'WorkflowShareStepDto': + return WorkflowShareStepDto.fromJson(value); + case 'WorkflowStepDto': + return WorkflowStepDto.fromJson(value); + case 'WorkflowTrigger': + return WorkflowTrigger.fromJson(value); + case 'WorkflowTriggerResponseDto': + return WorkflowTriggerResponseDto.fromJson(value); + case 'WorkflowType': + return WorkflowType.fromJson(value); + case 'WorkflowUpdateDto': + return WorkflowUpdateDto.fromJson(value); + default: + return _noMatch; + } } - -/// Primarily intended for use in an isolate. -Future decodeAsync(DeserializationMessage message) async { - // Remove all spaces. Necessary for regular expressions as well. - final targetType = message.targetType.replaceAll(' ', ''); - - // If the expected target type is String, nothing to do... - return targetType == 'String' - ? message.json - : json.decode(message.json); -} - -/// Primarily intended for use in an isolate. -Future deserializeAsync(DeserializationMessage message) async { - // Remove all spaces. Necessary for regular expressions as well. - final targetType = message.targetType.replaceAll(' ', ''); - - // If the expected target type is String, nothing to do... - return targetType == 'String' - ? message.json - : ApiClient.fromJson( - json.decode(message.json), - targetType, - growable: message.growable, - ); -} - -/// Primarily intended for use in an isolate. -Future serializeAsync(Object? value) async => value == null ? '' : json.encode(value); diff --git a/mobile/openapi/lib/api_compat.dart b/mobile/openapi/lib/api_compat.dart new file mode 100644 index 0000000000..7770c0ec8c --- /dev/null +++ b/mobile/openapi/lib/api_compat.dart @@ -0,0 +1,90 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// Backward-compatibility mechanism. The generated client owns this hook but +// knows NO rules; the host app supplies them at startup, so the dependency +// flows app -> client only (this file has no app imports). +part of openapi.api; + +/// One backward-compatibility default: when the wire JSON omits [path] +/// (dot-separated, e.g. `'download.includeEmbeddedVideos'`), fill it with +/// [value] before the DTO is parsed. +/// +/// The constructor is `const`, so rule sets built entirely from static values +/// can be `const`; sets that need a DTO's `toJson()` or `DateTime.now()` are +/// plain (those values are computed when the rule set is built at startup). +final class JsonDefault { + /// The dot-separated wire path to back-fill. + final String path; + + /// The value to set when [path] is absent or null. + final Object? value; + + const JsonDefault(this.path, this.value); +} + +/// Registry of per-DTO backward-compatibility defaults, keyed by the DTO [Type] +/// for compile-time safety. +/// +/// Newer DTOs may declare fields that older servers don't send. Each model's +/// `fromJson` calls [upgrade] with its own type before parsing; the host app's +/// registered defaults fill any missing fields so deserialization tolerates +/// older servers. +/// +/// Configured once at startup, keyed by DTO type so a renamed/removed DTO is a +/// compile error. Static-only entries can be `const` lists: +/// +/// ```dart +/// ApiCompat.configure({ +/// AssetResponseDto: const [ +/// JsonDefault('visibility', 'timeline'), +/// JsonDefault('isEdited', false), +/// ], +/// }); +/// ``` +abstract final class ApiCompat { + ApiCompat._(); + + static Map> _defaults = const >{}; + + /// Install the backward-compat rule set (replaces any previous one). + static void configure(Map> defaults) { + _defaults = defaults; + } + + /// Clear all rules. Intended for test isolation. + static void reset() { + _defaults = const >{}; + } + + /// Apply the registered defaults for DTO type [T] to [json], if any. Called + /// by every generated `fromJson`; a no-op when [json] is not a map or no + /// rules are registered for [T]. + static void upgrade(Object? json) { + if (json is! Map) return; + final defaults = _defaults[T]; + if (defaults == null) return; + for (final entry in defaults) { + _putDefault(json, entry.path, entry.value); + } + } + + /// Set [keyPath] (dot-separated) to [value] only when currently absent/null, + /// creating intermediate maps as needed. + static void _putDefault(Map json, String keyPath, Object? value) { + final keys = keyPath.split('.'); + var node = json; + for (var i = 0; i < keys.length - 1; i++) { + final existing = node[keys[i]]; + if (existing is Map) { + node = existing; + } else { + final created = {}; + node[keys[i]] = created; + node = created; + } + } + if (node[keys.last] == null) { + node[keys.last] = value; + } + } +} diff --git a/mobile/openapi/lib/api_exception.dart b/mobile/openapi/lib/api_exception.dart index 53077d686d..ad4f8e0d4d 100644 --- a/mobile/openapi/lib/api_exception.dart +++ b/mobile/openapi/lib/api_exception.dart @@ -1,24 +1,30 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; +/// Thrown when an API call fails: a non-2xx HTTP status, a transport error, or +/// a (de)serialization failure. +/// +/// [code] is the HTTP status code (or a transport-level sentinel such as +/// [HttpStatus.badRequest]) and [message] is a human-readable description. class ApiException implements Exception { - ApiException(this.code, this.message); + ApiException(this.code, [this.message]) + : innerException = null, + stackTrace = null; ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace); - int code = 0; - String? message; - Exception? innerException; - StackTrace? stackTrace; + /// HTTP status code, or a transport sentinel for non-HTTP failures. + final int code; + + /// Human-readable failure description; may be the decoded response body. + final String? message; + + /// The originating exception for transport / deserialization failures. + final Object? innerException; + + /// The stack trace captured when [innerException] was caught. + final StackTrace? stackTrace; @override String toString() { diff --git a/mobile/openapi/lib/api_helper.dart b/mobile/openapi/lib/api_helper.dart index b5d348edd6..46fdc89b38 100644 --- a/mobile/openapi/lib/api_helper.dart +++ b/mobile/openapi/lib/api_helper.dart @@ -1,15 +1,10 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; +/// A single `name=value` query-string entry. Both halves are URL-encoded by +/// [toString], so multi-valued params (`?k=a&k=b`) are modeled as repeated +/// [QueryParam]s rather than a `Map`. class QueryParam { const QueryParam(this.name, this.value); @@ -20,34 +15,42 @@ class QueryParam { String toString() => '${Uri.encodeQueryComponent(name)}=${Uri.encodeQueryComponent(value)}'; } -// Ported from the Java version. -Iterable _queryParams(String collectionFormat, String name, dynamic value,) { - // Assertions to run in debug mode only. - assert(name.isNotEmpty, 'Parameter cannot be an empty string.'); +/// Delimiters for the non-`multi` array [collectionFormat]s. +const _delimiters = {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; - final params = []; +/// Shared deep-equality used by generated model `==` operators so that `List`, +/// `Set`, and `Map` fields compare by structure rather than identity. +const _deepEquality = DeepCollectionEquality(); + +/// Expands a parameter [value] into zero or more [QueryParam]s under the given +/// [collectionFormat] (`'multi'`, `'csv'`, `'ssv'`, `'tsv'`, `'pipes'`). +/// +/// A `null` value yields no params (the key is omitted); a `List` either repeats +/// the key (`multi`) or joins with the format delimiter; any other value is +/// stringified via [parameterToString]. +Iterable _queryParams(String collectionFormat, String name, dynamic value) { + assert(name.isNotEmpty, 'Parameter cannot be an empty string.'); if (value is List) { if (collectionFormat == 'multi') { - return value.map((dynamic v) => QueryParam(name, parameterToString(v)),); + return value.map((dynamic v) => QueryParam(name, parameterToString(v))); } - - // Default collection format is 'csv'. - if (collectionFormat.isEmpty) { - collectionFormat = 'csv'; // ignore: parameter_assignments - } - - final delimiter = _delimiters[collectionFormat] ?? ','; - - params.add(QueryParam(name, value.map(parameterToString).join(delimiter),)); - } else if (value != null) { - params.add(QueryParam(name, parameterToString(value))); + final format = collectionFormat.isEmpty ? 'csv' : collectionFormat; + final delimiter = _delimiters[format] ?? ','; + return [QueryParam(name, value.map(parameterToString).join(delimiter))]; } - - return params; + if (value != null) { + return [QueryParam(name, parameterToString(value))]; + } + return const []; } -/// Format the given parameter object into a [String]. +/// Formats a single parameter [value] for use in a path, query, header, or form +/// field. +/// +/// `null` becomes the empty string, `DateTime` is emitted as a UTC ISO-8601 +/// string, generated enums delegate to their `toJson()` (the raw wire value), +/// and everything else uses [Object.toString]. String parameterToString(dynamic value) { if (value == null) { return ''; @@ -55,197 +58,40 @@ String parameterToString(dynamic value) { if (value is DateTime) { return value.toUtc().toIso8601String(); } - if (value is AlbumUserRole) { - return AlbumUserRoleTypeTransformer().encode(value).toString(); - } - if (value is AssetEditAction) { - return AssetEditActionTypeTransformer().encode(value).toString(); - } - if (value is AssetIdErrorReason) { - return AssetIdErrorReasonTypeTransformer().encode(value).toString(); - } - if (value is AssetJobName) { - return AssetJobNameTypeTransformer().encode(value).toString(); - } - if (value is AssetMediaSize) { - return AssetMediaSizeTypeTransformer().encode(value).toString(); - } - if (value is AssetMediaStatus) { - return AssetMediaStatusTypeTransformer().encode(value).toString(); - } - if (value is AssetOrder) { - return AssetOrderTypeTransformer().encode(value).toString(); - } - if (value is AssetOrderBy) { - return AssetOrderByTypeTransformer().encode(value).toString(); - } - if (value is AssetRejectReason) { - return AssetRejectReasonTypeTransformer().encode(value).toString(); - } - if (value is AssetTypeEnum) { - return AssetTypeEnumTypeTransformer().encode(value).toString(); - } - if (value is AssetUploadAction) { - return AssetUploadActionTypeTransformer().encode(value).toString(); - } - if (value is AssetVisibility) { - return AssetVisibilityTypeTransformer().encode(value).toString(); - } - if (value is AudioCodec) { - return AudioCodecTypeTransformer().encode(value).toString(); - } - if (value is BulkIdErrorReason) { - return BulkIdErrorReasonTypeTransformer().encode(value).toString(); - } - if (value is CQMode) { - return CQModeTypeTransformer().encode(value).toString(); - } - if (value is Colorspace) { - return ColorspaceTypeTransformer().encode(value).toString(); - } - if (value is ImageFormat) { - return ImageFormatTypeTransformer().encode(value).toString(); - } - if (value is JobName) { - return JobNameTypeTransformer().encode(value).toString(); - } - if (value is LogLevel) { - return LogLevelTypeTransformer().encode(value).toString(); - } - if (value is MaintenanceAction) { - return MaintenanceActionTypeTransformer().encode(value).toString(); - } - if (value is ManualJobName) { - return ManualJobNameTypeTransformer().encode(value).toString(); - } - if (value is MemorySearchOrder) { - return MemorySearchOrderTypeTransformer().encode(value).toString(); - } - if (value is MemoryType) { - return MemoryTypeTypeTransformer().encode(value).toString(); - } - if (value is MirrorAxis) { - return MirrorAxisTypeTransformer().encode(value).toString(); - } - if (value is NotificationLevel) { - return NotificationLevelTypeTransformer().encode(value).toString(); - } - if (value is NotificationType) { - return NotificationTypeTypeTransformer().encode(value).toString(); - } - if (value is OAuthTokenEndpointAuthMethod) { - return OAuthTokenEndpointAuthMethodTypeTransformer().encode(value).toString(); - } - if (value is PartnerDirection) { - return PartnerDirectionTypeTransformer().encode(value).toString(); - } - if (value is Permission) { - return PermissionTypeTransformer().encode(value).toString(); - } - if (value is QueueCommand) { - return QueueCommandTypeTransformer().encode(value).toString(); - } - if (value is QueueJobStatus) { - return QueueJobStatusTypeTransformer().encode(value).toString(); - } - if (value is QueueName) { - return QueueNameTypeTransformer().encode(value).toString(); - } - if (value is ReactionLevel) { - return ReactionLevelTypeTransformer().encode(value).toString(); - } - if (value is ReactionType) { - return ReactionTypeTypeTransformer().encode(value).toString(); - } - if (value is SearchSuggestionType) { - return SearchSuggestionTypeTypeTransformer().encode(value).toString(); - } - if (value is SharedLinkType) { - return SharedLinkTypeTypeTransformer().encode(value).toString(); - } - if (value is SourceType) { - return SourceTypeTypeTransformer().encode(value).toString(); - } - if (value is StorageFolder) { - return StorageFolderTypeTransformer().encode(value).toString(); - } - if (value is SyncEntityType) { - return SyncEntityTypeTypeTransformer().encode(value).toString(); - } - if (value is SyncRequestType) { - return SyncRequestTypeTypeTransformer().encode(value).toString(); - } - if (value is ToneMapping) { - return ToneMappingTypeTransformer().encode(value).toString(); - } - if (value is TranscodeHWAccel) { - return TranscodeHWAccelTypeTransformer().encode(value).toString(); - } - if (value is TranscodePolicy) { - return TranscodePolicyTypeTransformer().encode(value).toString(); - } - if (value is UserAvatarColor) { - return UserAvatarColorTypeTransformer().encode(value).toString(); - } - if (value is UserMetadataKey) { - return UserMetadataKeyTypeTransformer().encode(value).toString(); - } - if (value is UserStatus) { - return UserStatusTypeTransformer().encode(value).toString(); - } - if (value is VideoCodec) { - return VideoCodecTypeTransformer().encode(value).toString(); - } - if (value is VideoContainer) { - return VideoContainerTypeTransformer().encode(value).toString(); - } - if (value is WorkflowTrigger) { - return WorkflowTriggerTypeTransformer().encode(value).toString(); - } - if (value is WorkflowType) { - return WorkflowTypeTypeTransformer().encode(value).toString(); + // Every generated enum is a Dart `enum` exposing `Object toJson()` returning + // its raw wire value; this keeps the helper free of per-enum branches. + if (value is Enum) { + return (value as dynamic).toJson().toString(); } return value.toString(); } -/// Returns the decoded body as UTF-8 if the given headers indicate an 'application/json' -/// content type. Otherwise, returns the decoded body as decoded by dart:http package. +/// Decodes a response body as UTF-8 when the headers declare JSON, otherwise +/// returns the body as already decoded by `package:http`. Future _decodeBodyBytes(Response response) async { final contentType = response.headers['content-type']; return contentType != null && contentType.toLowerCase().startsWith('application/json') - ? response.bodyBytes.isEmpty ? '' : utf8.decode(response.bodyBytes) - : response.body; + ? (response.bodyBytes.isEmpty ? '' : utf8.decode(response.bodyBytes)) + : response.body; } -/// Returns a valid [T] value found at the specified Map [key], null otherwise. +/// Parses a JSON scalar into a [DateTime]: an ISO-8601 string or epoch +/// milliseconds (`int`). Returns `null` when [value] is absent or unparseable. +DateTime? _dateTimeFromJson(Object? value) { + return switch (value) { + DateTime() => value, + String() => DateTime.tryParse(value), + int() => DateTime.fromMillisecondsSinceEpoch(value, isUtc: true), + _ => null, + }; +} + +/// Widens a JSON number to `double`, tolerating an integer wire value. Returns +/// `null` when [value] is not a number. +double? _toDouble(Object? value) => (value as num?)?.toDouble(); + +/// Returns the value at [key] of [map] when it is a [T], else `null`. T? mapValueOfType(dynamic map, String key) { final dynamic value = map is Map ? map[key] : null; return value is T ? value : null; } - -/// Returns a valid Map found at the specified Map [key], null otherwise. -Map? mapCastOfType(dynamic map, String key) { - final dynamic value = map is Map ? map[key] : null; - return value is Map ? value.cast() : null; -} - -/// Returns a valid [DateTime] found at the specified Map [key], null otherwise. -DateTime? mapDateTime(dynamic map, String key, [String? pattern]) { - final dynamic value = map is Map ? map[key] : null; - if (value != null) { - int? millis; - if (value is int) { - millis = value; - } else if (value is String) { - if (_isEpochMarker(pattern)) { - millis = int.tryParse(value); - } else { - return DateTime.tryParse(value); - } - } - if (millis != null) { - return DateTime.fromMillisecondsSinceEpoch(millis, isUtc: true); - } - } - return null; -} diff --git a/mobile/openapi/lib/api_state.dart b/mobile/openapi/lib/api_state.dart new file mode 100644 index 0000000000..2396660f36 --- /dev/null +++ b/mobile/openapi/lib/api_state.dart @@ -0,0 +1,8 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +part of openapi.api; + +/// Lifecycle state of an endpoint or DTO field, from the spec's +/// `x-immich-state` / `x-immich-history`. Surfaced on the inlined `*State` +/// metadata (e.g. `AssetResponseDto.isEditedState == ApiState.beta`). +enum ApiState { added, alpha, beta, stable, updated, deprecated, internal } diff --git a/mobile/openapi/lib/api_version.dart b/mobile/openapi/lib/api_version.dart new file mode 100644 index 0000000000..c3fe2281cc --- /dev/null +++ b/mobile/openapi/lib/api_version.dart @@ -0,0 +1,81 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// Self-contained version type for server-capability gating. Intentionally has +// no dependency on the host app: the generated client is a lower layer and +// must not reach up into application utilities. +part of openapi.api; + +/// An Immich server API version, used to gate endpoints and DTO fields that +/// were added or deprecated at a particular release. +/// +/// Version metadata is derived at generation time from the spec's +/// `x-immich-history` and emitted as `const ApiVersion(...)` literals on the +/// `*Meta` types, so comparisons are const-friendly and cheap: +/// +/// ```dart +/// if (ApiVersion.parse(server.version) >= AssetResponseDtoMeta.isEditedAddedIn) { +/// // safe to read `isEdited` +/// } +/// ``` +final class ApiVersion implements Comparable { + const ApiVersion(this.major, this.minor, this.patch); + + final int major; + final int minor; + final int patch; + + /// Parses `"v2.6.0"`, `"2.6.0"`, or a bare `"v1"`/`"2"` (missing components + /// default to zero). Returns `null` when the string is not a version. + static ApiVersion? tryParse(String value) { + final core = value.trim().replaceFirst(RegExp(r'^v', caseSensitive: false), '').split(RegExp(r'[-+]')).first; + if (core.isEmpty) return null; + final parts = core.split('.'); + final nums = []; + for (final part in parts) { + final n = int.tryParse(part); + if (n == null) return null; + nums.add(n); + } + return ApiVersion( + nums.isNotEmpty ? nums[0] : 0, + nums.length > 1 ? nums[1] : 0, + nums.length > 2 ? nums[2] : 0, + ); + } + + /// Like [tryParse] but throws [FormatException] on a malformed string. + factory ApiVersion.parse(String value) => + tryParse(value) ?? (throw FormatException('Invalid API version', value)); + + @override + int compareTo(ApiVersion other) { + final byMajor = major.compareTo(other.major); + if (byMajor != 0) return byMajor; + final byMinor = minor.compareTo(other.minor); + if (byMinor != 0) return byMinor; + return patch.compareTo(other.patch); + } + + bool operator >(ApiVersion other) => compareTo(other) > 0; + bool operator >=(ApiVersion other) => compareTo(other) >= 0; + bool operator <(ApiVersion other) => compareTo(other) < 0; + bool operator <=(ApiVersion other) => compareTo(other) <= 0; + + /// Whether this version (typically the connected server's) is new enough to + /// support a [feature] introduced at the given version. Reads naturally: + /// + /// ```dart + /// if (serverVersion.supports(AssetResponseDto.isEditedAddedIn)) { ... } + /// ``` + bool supports(ApiVersion feature) => this >= feature; + + @override + bool operator ==(Object other) => + other is ApiVersion && other.major == major && other.minor == minor && other.patch == patch; + + @override + int get hashCode => Object.hash(major, minor, patch); + + @override + String toString() => '$major.$minor.$patch'; +} diff --git a/mobile/openapi/lib/auth/api_key_auth.dart b/mobile/openapi/lib/auth/api_key_auth.dart index 6c5621798f..770e3545f1 100644 --- a/mobile/openapi/lib/auth/api_key_auth.dart +++ b/mobile/openapi/lib/auth/api_key_auth.dart @@ -1,15 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; +/// API-key authentication, applied to a query param, header, or cookie +/// depending on [location] (`'query'`, `'header'`, or `'cookie'`). class ApiKeyAuth implements Authentication { ApiKeyAuth(this.location, this.paramName); @@ -20,21 +14,21 @@ class ApiKeyAuth implements Authentication { String apiKey = ''; @override - Future applyToParams(List queryParams, Map headerParams,) async { + Future applyToParams(List queryParams, Map headerParams) async { final paramValue = apiKeyPrefix.isEmpty ? apiKey : '$apiKeyPrefix $apiKey'; + if (paramValue.isEmpty) return; - if (paramValue.isNotEmpty) { - if (location == 'query') { + switch (location) { + case 'query': queryParams.add(QueryParam(paramName, paramValue)); - } else if (location == 'header') { + case 'header': headerParams[paramName] = paramValue; - } else if (location == 'cookie') { + case 'cookie': headerParams.update( 'Cookie', (existingCookie) => '$existingCookie; $paramName=$paramValue', ifAbsent: () => '$paramName=$paramValue', ); - } } } } diff --git a/mobile/openapi/lib/auth/authentication.dart b/mobile/openapi/lib/auth/authentication.dart index 5377fb6f34..3901ed73d8 100644 --- a/mobile/openapi/lib/auth/authentication.dart +++ b/mobile/openapi/lib/auth/authentication.dart @@ -1,15 +1,8 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; +/// Applies credentials to an outgoing request's query and header params. // ignore: one_member_abstracts abstract class Authentication { /// Apply authentication settings to header and query params. diff --git a/mobile/openapi/lib/auth/http_basic_auth.dart b/mobile/openapi/lib/auth/http_basic_auth.dart deleted file mode 100644 index 5e8b1c4147..0000000000 --- a/mobile/openapi/lib/auth/http_basic_auth.dart +++ /dev/null @@ -1,26 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -part of openapi.api; - -class HttpBasicAuth implements Authentication { - HttpBasicAuth({this.username = '', this.password = ''}); - - String username; - String password; - - @override - Future applyToParams(List queryParams, Map headerParams,) async { - if (username.isNotEmpty && password.isNotEmpty) { - final credentials = '$username:$password'; - headerParams['Authorization'] = 'Basic ${base64.encode(utf8.encode(credentials))}'; - } - } -} diff --git a/mobile/openapi/lib/auth/http_bearer_auth.dart b/mobile/openapi/lib/auth/http_bearer_auth.dart index 847dc056e1..30c4a31e51 100644 --- a/mobile/openapi/lib/auth/http_bearer_auth.dart +++ b/mobile/openapi/lib/auth/http_bearer_auth.dart @@ -1,25 +1,21 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; +/// Supplies a bearer token, either as a literal `String` or lazily via a +/// `String Function()` resolved on each request. typedef HttpBearerAuthProvider = String Function(); +/// HTTP bearer-token authentication, applied as an `Authorization: Bearer ...` +/// header. class HttpBearerAuth implements Authentication { HttpBearerAuth(); - dynamic _accessToken; + Object? _accessToken; - dynamic get accessToken => _accessToken; + Object? get accessToken => _accessToken; - set accessToken(dynamic accessToken) { + set accessToken(Object? accessToken) { if (accessToken is! String && accessToken is! HttpBearerAuthProvider) { throw ArgumentError('accessToken value must be either a String or a String Function().'); } @@ -27,22 +23,14 @@ class HttpBearerAuth implements Authentication { } @override - Future applyToParams(List queryParams, Map headerParams,) async { - if (_accessToken == null) { - return; - } - - String accessToken; - - if (_accessToken is String) { - accessToken = _accessToken; - } else if (_accessToken is HttpBearerAuthProvider) { - accessToken = _accessToken!(); - } else { - return; - } - - if (accessToken.isNotEmpty) { + Future applyToParams(List queryParams, Map headerParams) async { + final token = _accessToken; + final accessToken = switch (token) { + String() => token, + HttpBearerAuthProvider() => token(), + _ => null, + }; + if (accessToken != null && accessToken.isNotEmpty) { headerParams['Authorization'] = 'Bearer $accessToken'; } } diff --git a/mobile/openapi/lib/auth/oauth.dart b/mobile/openapi/lib/auth/oauth.dart index 73fd8202dc..547e5336af 100644 --- a/mobile/openapi/lib/auth/oauth.dart +++ b/mobile/openapi/lib/auth/oauth.dart @@ -1,22 +1,16 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; +/// OAuth bearer-token authentication, applied as an `Authorization: Bearer ...` +/// header. class OAuth implements Authentication { OAuth({this.accessToken = ''}); String accessToken; @override - Future applyToParams(List queryParams, Map headerParams,) async { + Future applyToParams(List queryParams, Map headerParams) async { if (accessToken.isNotEmpty) { headerParams['Authorization'] = 'Bearer $accessToken'; } diff --git a/mobile/openapi/lib/model/activity_create_dto.dart b/mobile/openapi/lib/model/activity_create_dto.dart index bc220e64ce..c4e5536a94 100644 --- a/mobile/openapi/lib/model/activity_create_dto.dart +++ b/mobile/openapi/lib/model/activity_create_dto.dart @@ -1,144 +1,81 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ActivityCreateDto { - /// Returns a new [ActivityCreateDto] instance. - ActivityCreateDto({ +/// Activity create +final class ActivityCreateDto { + const ActivityCreateDto({ required this.albumId, - this.assetId, - this.comment, + this.assetId = const Optional.absent(), + this.comment = const Optional.absent(), required this.type, }); /// Album ID - String albumId; + final String albumId; /// Asset ID (if activity is for an asset) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? assetId; + final Optional assetId; /// Comment text (required if type is comment) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? comment; + final Optional comment; - ReactionType type; + final ReactionType type; - @override - bool operator ==(Object other) => identical(this, other) || other is ActivityCreateDto && - other.albumId == albumId && - other.assetId == assetId && - other.comment == comment && - other.type == type; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumId.hashCode) + - (assetId == null ? 0 : assetId!.hashCode) + - (comment == null ? 0 : comment!.hashCode) + - (type.hashCode); - - @override - String toString() => 'ActivityCreateDto[albumId=$albumId, assetId=$assetId, comment=$comment, type=$type]'; + static ActivityCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumId: json[r'albumId'] as String, + assetId: json.containsKey(r'assetId') ? Optional.present(json[r'assetId'] as String) : const Optional.absent(), + comment: json.containsKey(r'comment') ? Optional.present(json[r'comment'] as String) : const Optional.absent(), + type: (ReactionType.fromJson(json[r'type']))!, + ); + } Map toJson() { final json = {}; - json[r'albumId'] = this.albumId; - if (this.assetId != null) { - json[r'assetId'] = this.assetId; - } else { - // json[r'assetId'] = null; + json[r'albumId'] = albumId; + if (assetId case Present(:final value)) { + json[r'assetId'] = value; } - if (this.comment != null) { - json[r'comment'] = this.comment; - } else { - // json[r'comment'] = null; + if (comment case Present(:final value)) { + json[r'comment'] = value; } - json[r'type'] = this.type; + json[r'type'] = type.toJson(); return json; } - /// Returns a new [ActivityCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ActivityCreateDto? fromJson(dynamic value) { - upgradeDto(value, "ActivityCreateDto"); - if (value is Map) { - final json = value.cast(); - - return ActivityCreateDto( - albumId: mapValueOfType(json, r'albumId')!, - assetId: mapValueOfType(json, r'assetId'), - comment: mapValueOfType(json, r'comment'), - type: ReactionType.fromJson(json[r'type'])!, - ); - } - return null; + ActivityCreateDto copyWith({ + String? albumId, + Optional? assetId, + Optional? comment, + ReactionType? type, + }) { + return .new( + albumId: albumId ?? this.albumId, + assetId: assetId ?? this.assetId, + comment: comment ?? this.comment, + type: type ?? this.type, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ActivityCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ActivityCreateDto && + albumId == other.albumId && + assetId == other.assetId && + comment == other.comment && + type == other.type); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ActivityCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumId, assetId, comment, type]); } - // maps a json object with a list of ActivityCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ActivityCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumId', - 'type', - }; + @override + String toString() => 'ActivityCreateDto(albumId=$albumId, assetId=$assetId, comment=$comment, type=$type)'; } - diff --git a/mobile/openapi/lib/model/activity_response_dto.dart b/mobile/openapi/lib/model/activity_response_dto.dart index 1b0e279ab7..2111e49fde 100644 --- a/mobile/openapi/lib/model/activity_response_dto.dart +++ b/mobile/openapi/lib/model/activity_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ActivityResponseDto { - /// Returns a new [ActivityResponseDto] instance. - ActivityResponseDto({ +final class ActivityResponseDto { + const ActivityResponseDto({ required this.assetId, this.comment, required this.createdAt, @@ -22,131 +13,88 @@ class ActivityResponseDto { }); /// Asset ID (if activity is for an asset) - String? assetId; + final String? assetId; /// Comment text (for comment activities) - String? comment; + final String? comment; /// Creation date - DateTime createdAt; + final DateTime createdAt; /// Activity ID - String id; + final String id; - ReactionType type; + final ReactionType type; - UserResponseDto user; + final UserResponseDto user; - @override - bool operator ==(Object other) => identical(this, other) || other is ActivityResponseDto && - other.assetId == assetId && - other.comment == comment && - other.createdAt == createdAt && - other.id == id && - other.type == type && - other.user == user; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId == null ? 0 : assetId!.hashCode) + - (comment == null ? 0 : comment!.hashCode) + - (createdAt.hashCode) + - (id.hashCode) + - (type.hashCode) + - (user.hashCode); - - @override - String toString() => 'ActivityResponseDto[assetId=$assetId, comment=$comment, createdAt=$createdAt, id=$id, type=$type, user=$user]'; + static ActivityResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetId: (json[r'assetId'] as String?), + comment: (json[r'comment'] as String?), + createdAt: DateTime.parse(json[r'createdAt'] as String), + id: json[r'id'] as String, + type: (ReactionType.fromJson(json[r'type']))!, + user: (UserResponseDto.fromJson(json[r'user']))!, + ); + } Map toJson() { final json = {}; - if (this.assetId != null) { - json[r'assetId'] = this.assetId; - } else { - // json[r'assetId'] = null; + if (assetId != null) { + json[r'assetId'] = assetId!; } - if (this.comment != null) { - json[r'comment'] = this.comment; - } else { - // json[r'comment'] = null; + if (comment != null) { + json[r'comment'] = comment!; } - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - json[r'id'] = this.id; - json[r'type'] = this.type; - json[r'user'] = this.user; + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + json[r'id'] = id; + json[r'type'] = type.toJson(); + json[r'user'] = user.toJson(); return json; } - /// Returns a new [ActivityResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ActivityResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ActivityResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ActivityResponseDto( - assetId: mapValueOfType(json, r'assetId'), - comment: mapValueOfType(json, r'comment'), - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - id: mapValueOfType(json, r'id')!, - type: ReactionType.fromJson(json[r'type'])!, - user: UserResponseDto.fromJson(json[r'user'])!, - ); - } - return null; + ActivityResponseDto copyWith({ + Object? assetId = _undefined, + Object? comment = _undefined, + DateTime? createdAt, + String? id, + ReactionType? type, + UserResponseDto? user, + }) { + return .new( + assetId: identical(assetId, _undefined) ? this.assetId : assetId as String?, + comment: identical(comment, _undefined) ? this.comment : comment as String?, + createdAt: createdAt ?? this.createdAt, + id: id ?? this.id, + type: type ?? this.type, + user: user ?? this.user, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ActivityResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ActivityResponseDto && + assetId == other.assetId && + comment == other.comment && + createdAt == other.createdAt && + id == other.id && + type == other.type && + user == other.user); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ActivityResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, comment, createdAt, id, type, user]); } - // maps a json object with a list of ActivityResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ActivityResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'createdAt', - 'id', - 'type', - 'user', - }; + @override + String toString() => + 'ActivityResponseDto(assetId=$assetId, comment=$comment, createdAt=$createdAt, id=$id, type=$type, user=$user)'; } - diff --git a/mobile/openapi/lib/model/activity_statistics_response_dto.dart b/mobile/openapi/lib/model/activity_statistics_response_dto.dart index d9ac019ee2..d51cb580f1 100644 --- a/mobile/openapi/lib/model/activity_statistics_response_dto.dart +++ b/mobile/openapi/lib/model/activity_statistics_response_dto.dart @@ -1,115 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ActivityStatisticsResponseDto { - /// Returns a new [ActivityStatisticsResponseDto] instance. - ActivityStatisticsResponseDto({ - required this.comments, - required this.likes, - }); +final class ActivityStatisticsResponseDto { + const ActivityStatisticsResponseDto({required this.comments, required this.likes}); /// Number of comments - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int comments; + final int comments; /// Number of likes - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int likes; + final int likes; - @override - bool operator ==(Object other) => identical(this, other) || other is ActivityStatisticsResponseDto && - other.comments == comments && - other.likes == likes; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (comments.hashCode) + - (likes.hashCode); - - @override - String toString() => 'ActivityStatisticsResponseDto[comments=$comments, likes=$likes]'; + static ActivityStatisticsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(comments: json[r'comments'] as int, likes: json[r'likes'] as int); + } Map toJson() { final json = {}; - json[r'comments'] = this.comments; - json[r'likes'] = this.likes; + json[r'comments'] = comments; + json[r'likes'] = likes; return json; } - /// Returns a new [ActivityStatisticsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ActivityStatisticsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ActivityStatisticsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ActivityStatisticsResponseDto( - comments: mapValueOfType(json, r'comments')!, - likes: mapValueOfType(json, r'likes')!, - ); - } - return null; + ActivityStatisticsResponseDto copyWith({int? comments, int? likes}) { + return .new(comments: comments ?? this.comments, likes: likes ?? this.likes); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ActivityStatisticsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ActivityStatisticsResponseDto && comments == other.comments && likes == other.likes); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ActivityStatisticsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([comments, likes]); } - // maps a json object with a list of ActivityStatisticsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ActivityStatisticsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'comments', - 'likes', - }; + @override + String toString() => 'ActivityStatisticsResponseDto(comments=$comments, likes=$likes)'; } - diff --git a/mobile/openapi/lib/model/add_users_dto.dart b/mobile/openapi/lib/model/add_users_dto.dart index 1dad234811..0bc7db84ad 100644 --- a/mobile/openapi/lib/model/add_users_dto.dart +++ b/mobile/openapi/lib/model/add_users_dto.dart @@ -1,100 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AddUsersDto { - /// Returns a new [AddUsersDto] instance. - AddUsersDto({ - this.albumUsers = const [], - }); +final class AddUsersDto { + const AddUsersDto({required this.albumUsers}); /// Album users to add - List albumUsers; + final List albumUsers; - @override - bool operator ==(Object other) => identical(this, other) || other is AddUsersDto && - _deepEquality.equals(other.albumUsers, albumUsers); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumUsers.hashCode); - - @override - String toString() => 'AddUsersDto[albumUsers=$albumUsers]'; + static AddUsersDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumUsers: ((json[r'albumUsers'] as List?) + ?.map(($e) => (AlbumUserAddDto.fromJson($e))!) + .toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'albumUsers'] = this.albumUsers; + json[r'albumUsers'] = albumUsers.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [AddUsersDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AddUsersDto? fromJson(dynamic value) { - upgradeDto(value, "AddUsersDto"); - if (value is Map) { - final json = value.cast(); - - return AddUsersDto( - albumUsers: AlbumUserAddDto.listFromJson(json[r'albumUsers']), - ); - } - return null; + AddUsersDto copyWith({List? albumUsers}) { + return .new(albumUsers: albumUsers ?? this.albumUsers); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AddUsersDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AddUsersDto && const DeepCollectionEquality().equals(albumUsers, other.albumUsers)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AddUsersDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(albumUsers)]); } - // maps a json object with a list of AddUsersDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AddUsersDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumUsers', - }; + @override + String toString() => 'AddUsersDto(albumUsers=$albumUsers)'; } - diff --git a/mobile/openapi/lib/model/admin_onboarding_update_dto.dart b/mobile/openapi/lib/model/admin_onboarding_update_dto.dart index 6daba2a796..e6656777f7 100644 --- a/mobile/openapi/lib/model/admin_onboarding_update_dto.dart +++ b/mobile/openapi/lib/model/admin_onboarding_update_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AdminOnboardingUpdateDto { - /// Returns a new [AdminOnboardingUpdateDto] instance. - AdminOnboardingUpdateDto({ - required this.isOnboarded, - }); +final class AdminOnboardingUpdateDto { + const AdminOnboardingUpdateDto({required this.isOnboarded}); /// Is admin onboarded - bool isOnboarded; + final bool isOnboarded; - @override - bool operator ==(Object other) => identical(this, other) || other is AdminOnboardingUpdateDto && - other.isOnboarded == isOnboarded; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (isOnboarded.hashCode); - - @override - String toString() => 'AdminOnboardingUpdateDto[isOnboarded=$isOnboarded]'; + static AdminOnboardingUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(isOnboarded: json[r'isOnboarded'] as bool); + } Map toJson() { final json = {}; - json[r'isOnboarded'] = this.isOnboarded; + json[r'isOnboarded'] = isOnboarded; return json; } - /// Returns a new [AdminOnboardingUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AdminOnboardingUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "AdminOnboardingUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return AdminOnboardingUpdateDto( - isOnboarded: mapValueOfType(json, r'isOnboarded')!, - ); - } - return null; + AdminOnboardingUpdateDto copyWith({bool? isOnboarded}) { + return .new(isOnboarded: isOnboarded ?? this.isOnboarded); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AdminOnboardingUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is AdminOnboardingUpdateDto && isOnboarded == other.isOnboarded); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AdminOnboardingUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([isOnboarded]); } - // maps a json object with a list of AdminOnboardingUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AdminOnboardingUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'isOnboarded', - }; + @override + String toString() => 'AdminOnboardingUpdateDto(isOnboarded=$isOnboarded)'; } - diff --git a/mobile/openapi/lib/model/album_response_dto.dart b/mobile/openapi/lib/model/album_response_dto.dart index fd90f23e3a..505ee030c8 100644 --- a/mobile/openapi/lib/model/album_response_dto.dart +++ b/mobile/openapi/lib/model/album_response_dto.dart @@ -1,23 +1,14 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AlbumResponseDto { - /// Returns a new [AlbumResponseDto] instance. - AlbumResponseDto({ +final class AlbumResponseDto { + const AlbumResponseDto({ required this.albumName, required this.albumThumbnailAssetId, - this.albumUsers = const [], + required this.albumUsers, required this.assetCount, - this.contributorCounts = const [], + this.contributorCounts, required this.createdAt, required this.description, this.endDate, @@ -32,244 +23,205 @@ class AlbumResponseDto { }); /// Album name - String albumName; + final String albumName; /// Thumbnail asset ID - String? albumThumbnailAssetId; + final String? albumThumbnailAssetId; /// First entry is always the album owner. Second entry is the auth user, if it differs from the owner. The rest are ordered alphabetically. - List albumUsers; + final List albumUsers; /// Number of assets - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int assetCount; + final int assetCount; - List contributorCounts; + final List? contributorCounts; /// Creation date - DateTime createdAt; + final DateTime createdAt; /// Album description - String description; + final String description; /// End date (latest asset) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? endDate; + final DateTime? endDate; /// Has shared link - bool hasSharedLink; + final bool hasSharedLink; /// Album ID - String id; + final String id; /// Activity feed enabled - bool isActivityEnabled; + final bool isActivityEnabled; /// Last modified asset timestamp - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? lastModifiedAssetTimestamp; + final DateTime? lastModifiedAssetTimestamp; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetOrder? order; + final AssetOrder? order; /// Is shared album - bool shared; + final bool shared; /// Start date (earliest asset) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? startDate; + final DateTime? startDate; /// Last update date - DateTime updatedAt; + final DateTime updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is AlbumResponseDto && - other.albumName == albumName && - other.albumThumbnailAssetId == albumThumbnailAssetId && - _deepEquality.equals(other.albumUsers, albumUsers) && - other.assetCount == assetCount && - _deepEquality.equals(other.contributorCounts, contributorCounts) && - other.createdAt == createdAt && - other.description == description && - other.endDate == endDate && - other.hasSharedLink == hasSharedLink && - other.id == id && - other.isActivityEnabled == isActivityEnabled && - other.lastModifiedAssetTimestamp == lastModifiedAssetTimestamp && - other.order == order && - other.shared == shared && - other.startDate == startDate && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumName.hashCode) + - (albumThumbnailAssetId == null ? 0 : albumThumbnailAssetId!.hashCode) + - (albumUsers.hashCode) + - (assetCount.hashCode) + - (contributorCounts.hashCode) + - (createdAt.hashCode) + - (description.hashCode) + - (endDate == null ? 0 : endDate!.hashCode) + - (hasSharedLink.hashCode) + - (id.hashCode) + - (isActivityEnabled.hashCode) + - (lastModifiedAssetTimestamp == null ? 0 : lastModifiedAssetTimestamp!.hashCode) + - (order == null ? 0 : order!.hashCode) + - (shared.hashCode) + - (startDate == null ? 0 : startDate!.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'AlbumResponseDto[albumName=$albumName, albumThumbnailAssetId=$albumThumbnailAssetId, albumUsers=$albumUsers, assetCount=$assetCount, contributorCounts=$contributorCounts, createdAt=$createdAt, description=$description, endDate=$endDate, hasSharedLink=$hasSharedLink, id=$id, isActivityEnabled=$isActivityEnabled, lastModifiedAssetTimestamp=$lastModifiedAssetTimestamp, order=$order, shared=$shared, startDate=$startDate, updatedAt=$updatedAt]'; + static AlbumResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumName: json[r'albumName'] as String, + albumThumbnailAssetId: (json[r'albumThumbnailAssetId'] as String?), + albumUsers: ((json[r'albumUsers'] as List?) + ?.map(($e) => (AlbumUserResponseDto.fromJson($e))!) + .toList(growable: false))!, + assetCount: json[r'assetCount'] as int, + contributorCounts: (json[r'contributorCounts'] as List?) + ?.map(($e) => (ContributorCountResponseDto.fromJson($e))!) + .toList(growable: false), + createdAt: DateTime.parse(json[r'createdAt'] as String), + description: json[r'description'] as String, + endDate: (json[r'endDate'] == null ? null : DateTime.parse(json[r'endDate'] as String)), + hasSharedLink: json[r'hasSharedLink'] as bool, + id: json[r'id'] as String, + isActivityEnabled: json[r'isActivityEnabled'] as bool, + lastModifiedAssetTimestamp: (json[r'lastModifiedAssetTimestamp'] == null + ? null + : DateTime.parse(json[r'lastModifiedAssetTimestamp'] as String)), + order: AssetOrder.fromJson(json[r'order']), + shared: json[r'shared'] as bool, + startDate: (json[r'startDate'] == null ? null : DateTime.parse(json[r'startDate'] as String)), + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + ); + } Map toJson() { final json = {}; - json[r'albumName'] = this.albumName; - if (this.albumThumbnailAssetId != null) { - json[r'albumThumbnailAssetId'] = this.albumThumbnailAssetId; - } else { - // json[r'albumThumbnailAssetId'] = null; + json[r'albumName'] = albumName; + if (albumThumbnailAssetId != null) { + json[r'albumThumbnailAssetId'] = albumThumbnailAssetId!; } - json[r'albumUsers'] = this.albumUsers; - json[r'assetCount'] = this.assetCount; - json[r'contributorCounts'] = this.contributorCounts; - json[r'createdAt'] = this.createdAt.toUtc().toIso8601String(); - json[r'description'] = this.description; - if (this.endDate != null) { - json[r'endDate'] = this.endDate!.toUtc().toIso8601String(); - } else { - // json[r'endDate'] = null; + json[r'albumUsers'] = albumUsers.map(($e) => $e.toJson()).toList(growable: false); + json[r'assetCount'] = assetCount; + if (contributorCounts != null) { + json[r'contributorCounts'] = contributorCounts!.map(($e) => $e.toJson()).toList(growable: false); } - json[r'hasSharedLink'] = this.hasSharedLink; - json[r'id'] = this.id; - json[r'isActivityEnabled'] = this.isActivityEnabled; - if (this.lastModifiedAssetTimestamp != null) { - json[r'lastModifiedAssetTimestamp'] = this.lastModifiedAssetTimestamp!.toUtc().toIso8601String(); - } else { - // json[r'lastModifiedAssetTimestamp'] = null; + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + json[r'description'] = description; + if (endDate != null) { + json[r'endDate'] = endDate!.toUtc().toIso8601String(); } - if (this.order != null) { - json[r'order'] = this.order; - } else { - // json[r'order'] = null; + json[r'hasSharedLink'] = hasSharedLink; + json[r'id'] = id; + json[r'isActivityEnabled'] = isActivityEnabled; + if (lastModifiedAssetTimestamp != null) { + json[r'lastModifiedAssetTimestamp'] = lastModifiedAssetTimestamp!.toUtc().toIso8601String(); } - json[r'shared'] = this.shared; - if (this.startDate != null) { - json[r'startDate'] = this.startDate!.toUtc().toIso8601String(); - } else { - // json[r'startDate'] = null; + if (order != null) { + json[r'order'] = order!.toJson(); } - json[r'updatedAt'] = this.updatedAt.toUtc().toIso8601String(); + json[r'shared'] = shared; + if (startDate != null) { + json[r'startDate'] = startDate!.toUtc().toIso8601String(); + } + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); return json; } - /// Returns a new [AlbumResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AlbumResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AlbumResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AlbumResponseDto( - albumName: mapValueOfType(json, r'albumName')!, - albumThumbnailAssetId: mapValueOfType(json, r'albumThumbnailAssetId'), - albumUsers: AlbumUserResponseDto.listFromJson(json[r'albumUsers']), - assetCount: mapValueOfType(json, r'assetCount')!, - contributorCounts: ContributorCountResponseDto.listFromJson(json[r'contributorCounts']), - createdAt: mapDateTime(json, r'createdAt', r'')!, - description: mapValueOfType(json, r'description')!, - endDate: mapDateTime(json, r'endDate', r''), - hasSharedLink: mapValueOfType(json, r'hasSharedLink')!, - id: mapValueOfType(json, r'id')!, - isActivityEnabled: mapValueOfType(json, r'isActivityEnabled')!, - lastModifiedAssetTimestamp: mapDateTime(json, r'lastModifiedAssetTimestamp', r''), - order: AssetOrder.fromJson(json[r'order']), - shared: mapValueOfType(json, r'shared')!, - startDate: mapDateTime(json, r'startDate', r''), - updatedAt: mapDateTime(json, r'updatedAt', r'')!, - ); - } - return null; + AlbumResponseDto copyWith({ + String? albumName, + Object? albumThumbnailAssetId = _undefined, + List? albumUsers, + int? assetCount, + Object? contributorCounts = _undefined, + DateTime? createdAt, + String? description, + Object? endDate = _undefined, + bool? hasSharedLink, + String? id, + bool? isActivityEnabled, + Object? lastModifiedAssetTimestamp = _undefined, + Object? order = _undefined, + bool? shared, + Object? startDate = _undefined, + DateTime? updatedAt, + }) { + return .new( + albumName: albumName ?? this.albumName, + albumThumbnailAssetId: identical(albumThumbnailAssetId, _undefined) + ? this.albumThumbnailAssetId + : albumThumbnailAssetId as String?, + albumUsers: albumUsers ?? this.albumUsers, + assetCount: assetCount ?? this.assetCount, + contributorCounts: identical(contributorCounts, _undefined) + ? this.contributorCounts + : contributorCounts as List?, + createdAt: createdAt ?? this.createdAt, + description: description ?? this.description, + endDate: identical(endDate, _undefined) ? this.endDate : endDate as DateTime?, + hasSharedLink: hasSharedLink ?? this.hasSharedLink, + id: id ?? this.id, + isActivityEnabled: isActivityEnabled ?? this.isActivityEnabled, + lastModifiedAssetTimestamp: identical(lastModifiedAssetTimestamp, _undefined) + ? this.lastModifiedAssetTimestamp + : lastModifiedAssetTimestamp as DateTime?, + order: identical(order, _undefined) ? this.order : order as AssetOrder?, + shared: shared ?? this.shared, + startDate: identical(startDate, _undefined) ? this.startDate : startDate as DateTime?, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AlbumResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AlbumResponseDto && + albumName == other.albumName && + albumThumbnailAssetId == other.albumThumbnailAssetId && + const DeepCollectionEquality().equals(albumUsers, other.albumUsers) && + assetCount == other.assetCount && + const DeepCollectionEquality().equals(contributorCounts, other.contributorCounts) && + createdAt == other.createdAt && + description == other.description && + endDate == other.endDate && + hasSharedLink == other.hasSharedLink && + id == other.id && + isActivityEnabled == other.isActivityEnabled && + lastModifiedAssetTimestamp == other.lastModifiedAssetTimestamp && + order == other.order && + shared == other.shared && + startDate == other.startDate && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AlbumResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + albumName, + albumThumbnailAssetId, + const DeepCollectionEquality().hash(albumUsers), + assetCount, + const DeepCollectionEquality().hash(contributorCounts), + createdAt, + description, + endDate, + hasSharedLink, + id, + isActivityEnabled, + lastModifiedAssetTimestamp, + order, + shared, + startDate, + updatedAt, + ]); } - // maps a json object with a list of AlbumResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AlbumResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumName', - 'albumThumbnailAssetId', - 'albumUsers', - 'assetCount', - 'createdAt', - 'description', - 'hasSharedLink', - 'id', - 'isActivityEnabled', - 'shared', - 'updatedAt', - }; + @override + String toString() => + 'AlbumResponseDto(albumName=$albumName, albumThumbnailAssetId=$albumThumbnailAssetId, albumUsers=$albumUsers, assetCount=$assetCount, contributorCounts=$contributorCounts, createdAt=$createdAt, description=$description, endDate=$endDate, hasSharedLink=$hasSharedLink, id=$id, isActivityEnabled=$isActivityEnabled, lastModifiedAssetTimestamp=$lastModifiedAssetTimestamp, order=$order, shared=$shared, startDate=$startDate, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/album_statistics_response_dto.dart b/mobile/openapi/lib/model/album_statistics_response_dto.dart index 0f440d572d..1daaf61b19 100644 --- a/mobile/openapi/lib/model/album_statistics_response_dto.dart +++ b/mobile/openapi/lib/model/album_statistics_response_dto.dart @@ -1,127 +1,52 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AlbumStatisticsResponseDto { - /// Returns a new [AlbumStatisticsResponseDto] instance. - AlbumStatisticsResponseDto({ - required this.notShared, - required this.owned, - required this.shared, - }); +final class AlbumStatisticsResponseDto { + const AlbumStatisticsResponseDto({required this.notShared, required this.owned, required this.shared}); /// Number of non-shared albums - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int notShared; + final int notShared; /// Number of owned albums - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int owned; + final int owned; /// Number of shared albums - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int shared; + final int shared; - @override - bool operator ==(Object other) => identical(this, other) || other is AlbumStatisticsResponseDto && - other.notShared == notShared && - other.owned == owned && - other.shared == shared; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (notShared.hashCode) + - (owned.hashCode) + - (shared.hashCode); - - @override - String toString() => 'AlbumStatisticsResponseDto[notShared=$notShared, owned=$owned, shared=$shared]'; + static AlbumStatisticsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(notShared: json[r'notShared'] as int, owned: json[r'owned'] as int, shared: json[r'shared'] as int); + } Map toJson() { final json = {}; - json[r'notShared'] = this.notShared; - json[r'owned'] = this.owned; - json[r'shared'] = this.shared; + json[r'notShared'] = notShared; + json[r'owned'] = owned; + json[r'shared'] = shared; return json; } - /// Returns a new [AlbumStatisticsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AlbumStatisticsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AlbumStatisticsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AlbumStatisticsResponseDto( - notShared: mapValueOfType(json, r'notShared')!, - owned: mapValueOfType(json, r'owned')!, - shared: mapValueOfType(json, r'shared')!, - ); - } - return null; + AlbumStatisticsResponseDto copyWith({int? notShared, int? owned, int? shared}) { + return .new(notShared: notShared ?? this.notShared, owned: owned ?? this.owned, shared: shared ?? this.shared); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AlbumStatisticsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AlbumStatisticsResponseDto && + notShared == other.notShared && + owned == other.owned && + shared == other.shared); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AlbumStatisticsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([notShared, owned, shared]); } - // maps a json object with a list of AlbumStatisticsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AlbumStatisticsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'notShared', - 'owned', - 'shared', - }; + @override + String toString() => 'AlbumStatisticsResponseDto(notShared=$notShared, owned=$owned, shared=$shared)'; } - diff --git a/mobile/openapi/lib/model/album_user_add_dto.dart b/mobile/openapi/lib/model/album_user_add_dto.dart index ee457905bd..ee842bff88 100644 --- a/mobile/openapi/lib/model/album_user_add_dto.dart +++ b/mobile/openapi/lib/model/album_user_add_dto.dart @@ -1,117 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AlbumUserAddDto { - /// Returns a new [AlbumUserAddDto] instance. - AlbumUserAddDto({ - this.role, - required this.userId, - }); +final class AlbumUserAddDto { + const AlbumUserAddDto({this.role = AlbumUserRole.editor, required this.userId}); - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AlbumUserRole? role; + /// Album user role + final AlbumUserRole role; /// User ID - String userId; + final String userId; - @override - bool operator ==(Object other) => identical(this, other) || other is AlbumUserAddDto && - other.role == role && - other.userId == userId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (role == null ? 0 : role!.hashCode) + - (userId.hashCode); - - @override - String toString() => 'AlbumUserAddDto[role=$role, userId=$userId]'; + static AlbumUserAddDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(role: AlbumUserRole.fromJson(json[r'role']) ?? AlbumUserRole.editor, userId: json[r'userId'] as String); + } Map toJson() { final json = {}; - if (this.role != null) { - json[r'role'] = this.role; - } else { - // json[r'role'] = null; - } - json[r'userId'] = this.userId; + json[r'role'] = role.toJson(); + json[r'userId'] = userId; return json; } - /// Returns a new [AlbumUserAddDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AlbumUserAddDto? fromJson(dynamic value) { - upgradeDto(value, "AlbumUserAddDto"); - if (value is Map) { - final json = value.cast(); - - return AlbumUserAddDto( - role: AlbumUserRole.fromJson(json[r'role']), - userId: mapValueOfType(json, r'userId')!, - ); - } - return null; + AlbumUserAddDto copyWith({AlbumUserRole? role, String? userId}) { + return .new(role: role ?? this.role, userId: userId ?? this.userId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AlbumUserAddDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is AlbumUserAddDto && role == other.role && userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AlbumUserAddDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([role, userId]); } - // maps a json object with a list of AlbumUserAddDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AlbumUserAddDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'userId', - }; + @override + String toString() => 'AlbumUserAddDto(role=$role, userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/album_user_create_dto.dart b/mobile/openapi/lib/model/album_user_create_dto.dart index 26aa35ae78..b57df811bb 100644 --- a/mobile/openapi/lib/model/album_user_create_dto.dart +++ b/mobile/openapi/lib/model/album_user_create_dto.dart @@ -1,108 +1,43 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AlbumUserCreateDto { - /// Returns a new [AlbumUserCreateDto] instance. - AlbumUserCreateDto({ - required this.role, - required this.userId, - }); +final class AlbumUserCreateDto { + const AlbumUserCreateDto({required this.role, required this.userId}); - AlbumUserRole role; + final AlbumUserRole role; /// User ID - String userId; + final String userId; - @override - bool operator ==(Object other) => identical(this, other) || other is AlbumUserCreateDto && - other.role == role && - other.userId == userId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (role.hashCode) + - (userId.hashCode); - - @override - String toString() => 'AlbumUserCreateDto[role=$role, userId=$userId]'; + static AlbumUserCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(role: (AlbumUserRole.fromJson(json[r'role']))!, userId: json[r'userId'] as String); + } Map toJson() { final json = {}; - json[r'role'] = this.role; - json[r'userId'] = this.userId; + json[r'role'] = role.toJson(); + json[r'userId'] = userId; return json; } - /// Returns a new [AlbumUserCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AlbumUserCreateDto? fromJson(dynamic value) { - upgradeDto(value, "AlbumUserCreateDto"); - if (value is Map) { - final json = value.cast(); - - return AlbumUserCreateDto( - role: AlbumUserRole.fromJson(json[r'role'])!, - userId: mapValueOfType(json, r'userId')!, - ); - } - return null; + AlbumUserCreateDto copyWith({AlbumUserRole? role, String? userId}) { + return .new(role: role ?? this.role, userId: userId ?? this.userId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AlbumUserCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is AlbumUserCreateDto && role == other.role && userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AlbumUserCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([role, userId]); } - // maps a json object with a list of AlbumUserCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AlbumUserCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'role', - 'userId', - }; + @override + String toString() => 'AlbumUserCreateDto(role=$role, userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/album_user_response_dto.dart b/mobile/openapi/lib/model/album_user_response_dto.dart index bbae03fba7..88ecc18563 100644 --- a/mobile/openapi/lib/model/album_user_response_dto.dart +++ b/mobile/openapi/lib/model/album_user_response_dto.dart @@ -1,107 +1,42 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AlbumUserResponseDto { - /// Returns a new [AlbumUserResponseDto] instance. - AlbumUserResponseDto({ - required this.role, - required this.user, - }); +final class AlbumUserResponseDto { + const AlbumUserResponseDto({required this.role, required this.user}); - AlbumUserRole role; + final AlbumUserRole role; - UserResponseDto user; + final UserResponseDto user; - @override - bool operator ==(Object other) => identical(this, other) || other is AlbumUserResponseDto && - other.role == role && - other.user == user; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (role.hashCode) + - (user.hashCode); - - @override - String toString() => 'AlbumUserResponseDto[role=$role, user=$user]'; + static AlbumUserResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(role: (AlbumUserRole.fromJson(json[r'role']))!, user: (UserResponseDto.fromJson(json[r'user']))!); + } Map toJson() { final json = {}; - json[r'role'] = this.role; - json[r'user'] = this.user; + json[r'role'] = role.toJson(); + json[r'user'] = user.toJson(); return json; } - /// Returns a new [AlbumUserResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AlbumUserResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AlbumUserResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AlbumUserResponseDto( - role: AlbumUserRole.fromJson(json[r'role'])!, - user: UserResponseDto.fromJson(json[r'user'])!, - ); - } - return null; + AlbumUserResponseDto copyWith({AlbumUserRole? role, UserResponseDto? user}) { + return .new(role: role ?? this.role, user: user ?? this.user); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AlbumUserResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is AlbumUserResponseDto && role == other.role && user == other.user); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AlbumUserResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([role, user]); } - // maps a json object with a list of AlbumUserResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AlbumUserResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'role', - 'user', - }; + @override + String toString() => 'AlbumUserResponseDto(role=$role, user=$user)'; } - diff --git a/mobile/openapi/lib/model/album_user_role.dart b/mobile/openapi/lib/model/album_user_role.dart index 6fb7830115..d7e3995ea7 100644 --- a/mobile/openapi/lib/model/album_user_role.dart +++ b/mobile/openapi/lib/model/album_user_role.dart @@ -1,88 +1,29 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Album user role -class AlbumUserRole { - /// Instantiate a new enum with the provided [value]. +enum AlbumUserRole { + editor._(r'editor'), + owner._(r'owner'), + viewer._(r'viewer'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AlbumUserRole._(this.value); - /// The underlying value of this enum member. final String value; + static AlbumUserRole? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const editor = AlbumUserRole._(r'editor'); - static const owner = AlbumUserRole._(r'owner'); - static const viewer = AlbumUserRole._(r'viewer'); - - /// List of all possible values in this [enum][AlbumUserRole]. - static const values = [ - editor, - owner, - viewer, - ]; - - static AlbumUserRole? fromJson(dynamic value) => AlbumUserRoleTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AlbumUserRole.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AlbumUserRole] to String, -/// and [decode] dynamic data back to [AlbumUserRole]. -class AlbumUserRoleTypeTransformer { - factory AlbumUserRoleTypeTransformer() => _instance ??= const AlbumUserRoleTypeTransformer._(); - - const AlbumUserRoleTypeTransformer._(); - - String encode(AlbumUserRole data) => data.value; - - /// Decodes a [dynamic value][data] to a AlbumUserRole. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AlbumUserRole? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'editor': return AlbumUserRole.editor; - case r'owner': return AlbumUserRole.owner; - case r'viewer': return AlbumUserRole.viewer; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AlbumUserRoleTypeTransformer] instance. - static AlbumUserRoleTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/albums_add_assets_dto.dart b/mobile/openapi/lib/model/albums_add_assets_dto.dart index d6aa3db1c1..df9c57d061 100644 --- a/mobile/openapi/lib/model/albums_add_assets_dto.dart +++ b/mobile/openapi/lib/model/albums_add_assets_dto.dart @@ -1,113 +1,53 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AlbumsAddAssetsDto { - /// Returns a new [AlbumsAddAssetsDto] instance. - AlbumsAddAssetsDto({ - this.albumIds = const [], - this.assetIds = const [], - }); +final class AlbumsAddAssetsDto { + const AlbumsAddAssetsDto({required this.albumIds, required this.assetIds}); /// Album IDs - List albumIds; + final List albumIds; /// Asset IDs - List assetIds; + final List assetIds; - @override - bool operator ==(Object other) => identical(this, other) || other is AlbumsAddAssetsDto && - _deepEquality.equals(other.albumIds, albumIds) && - _deepEquality.equals(other.assetIds, assetIds); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumIds.hashCode) + - (assetIds.hashCode); - - @override - String toString() => 'AlbumsAddAssetsDto[albumIds=$albumIds, assetIds=$assetIds]'; + static AlbumsAddAssetsDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumIds: ((json[r'albumIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + assetIds: ((json[r'assetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'albumIds'] = this.albumIds; - json[r'assetIds'] = this.assetIds; + json[r'albumIds'] = albumIds; + json[r'assetIds'] = assetIds; return json; } - /// Returns a new [AlbumsAddAssetsDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AlbumsAddAssetsDto? fromJson(dynamic value) { - upgradeDto(value, "AlbumsAddAssetsDto"); - if (value is Map) { - final json = value.cast(); - - return AlbumsAddAssetsDto( - albumIds: json[r'albumIds'] is Iterable - ? (json[r'albumIds'] as Iterable).cast().toList(growable: false) - : const [], - assetIds: json[r'assetIds'] is Iterable - ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + AlbumsAddAssetsDto copyWith({List? albumIds, List? assetIds}) { + return .new(albumIds: albumIds ?? this.albumIds, assetIds: assetIds ?? this.assetIds); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AlbumsAddAssetsDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AlbumsAddAssetsDto && + const DeepCollectionEquality().equals(albumIds, other.albumIds) && + const DeepCollectionEquality().equals(assetIds, other.assetIds)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AlbumsAddAssetsDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + const DeepCollectionEquality().hash(albumIds), + const DeepCollectionEquality().hash(assetIds), + ]); } - // maps a json object with a list of AlbumsAddAssetsDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AlbumsAddAssetsDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumIds', - 'assetIds', - }; + @override + String toString() => 'AlbumsAddAssetsDto(albumIds=$albumIds, assetIds=$assetIds)'; } - diff --git a/mobile/openapi/lib/model/albums_add_assets_response_dto.dart b/mobile/openapi/lib/model/albums_add_assets_response_dto.dart index 99e679222e..d9e20d6206 100644 --- a/mobile/openapi/lib/model/albums_add_assets_response_dto.dart +++ b/mobile/openapi/lib/model/albums_add_assets_response_dto.dart @@ -1,117 +1,51 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AlbumsAddAssetsResponseDto { - /// Returns a new [AlbumsAddAssetsResponseDto] instance. - AlbumsAddAssetsResponseDto({ - this.error, - required this.success, - }); +final class AlbumsAddAssetsResponseDto { + const AlbumsAddAssetsResponseDto({this.error, required this.success}); - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - BulkIdErrorReason? error; + final BulkIdErrorReason? error; /// Operation success - bool success; + final bool success; - @override - bool operator ==(Object other) => identical(this, other) || other is AlbumsAddAssetsResponseDto && - other.error == error && - other.success == success; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (error == null ? 0 : error!.hashCode) + - (success.hashCode); - - @override - String toString() => 'AlbumsAddAssetsResponseDto[error=$error, success=$success]'; + static AlbumsAddAssetsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(error: BulkIdErrorReason.fromJson(json[r'error']), success: json[r'success'] as bool); + } Map toJson() { final json = {}; - if (this.error != null) { - json[r'error'] = this.error; - } else { - // json[r'error'] = null; + if (error != null) { + json[r'error'] = error!.toJson(); } - json[r'success'] = this.success; + json[r'success'] = success; return json; } - /// Returns a new [AlbumsAddAssetsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AlbumsAddAssetsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AlbumsAddAssetsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AlbumsAddAssetsResponseDto( - error: BulkIdErrorReason.fromJson(json[r'error']), - success: mapValueOfType(json, r'success')!, - ); - } - return null; + AlbumsAddAssetsResponseDto copyWith({Object? error = _undefined, bool? success}) { + return .new( + error: identical(error, _undefined) ? this.error : error as BulkIdErrorReason?, + success: success ?? this.success, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AlbumsAddAssetsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AlbumsAddAssetsResponseDto && error == other.error && success == other.success); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AlbumsAddAssetsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([error, success]); } - // maps a json object with a list of AlbumsAddAssetsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AlbumsAddAssetsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'success', - }; + @override + String toString() => 'AlbumsAddAssetsResponseDto(error=$error, success=$success)'; } - diff --git a/mobile/openapi/lib/model/albums_response.dart b/mobile/openapi/lib/model/albums_response.dart index def205de90..bd75172229 100644 --- a/mobile/openapi/lib/model/albums_response.dart +++ b/mobile/openapi/lib/model/albums_response.dart @@ -1,99 +1,39 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AlbumsResponse { - /// Returns a new [AlbumsResponse] instance. - AlbumsResponse({ - required this.defaultAssetOrder, - }); +final class AlbumsResponse { + const AlbumsResponse({required this.defaultAssetOrder}); - AssetOrder defaultAssetOrder; + final AssetOrder defaultAssetOrder; - @override - bool operator ==(Object other) => identical(this, other) || other is AlbumsResponse && - other.defaultAssetOrder == defaultAssetOrder; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (defaultAssetOrder.hashCode); - - @override - String toString() => 'AlbumsResponse[defaultAssetOrder=$defaultAssetOrder]'; + static AlbumsResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(defaultAssetOrder: (AssetOrder.fromJson(json[r'defaultAssetOrder']))!); + } Map toJson() { final json = {}; - json[r'defaultAssetOrder'] = this.defaultAssetOrder; + json[r'defaultAssetOrder'] = defaultAssetOrder.toJson(); return json; } - /// Returns a new [AlbumsResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AlbumsResponse? fromJson(dynamic value) { - upgradeDto(value, "AlbumsResponse"); - if (value is Map) { - final json = value.cast(); - - return AlbumsResponse( - defaultAssetOrder: AssetOrder.fromJson(json[r'defaultAssetOrder'])!, - ); - } - return null; + AlbumsResponse copyWith({AssetOrder? defaultAssetOrder}) { + return .new(defaultAssetOrder: defaultAssetOrder ?? this.defaultAssetOrder); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AlbumsResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is AlbumsResponse && defaultAssetOrder == other.defaultAssetOrder); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AlbumsResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([defaultAssetOrder]); } - // maps a json object with a list of AlbumsResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AlbumsResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'defaultAssetOrder', - }; + @override + String toString() => 'AlbumsResponse(defaultAssetOrder=$defaultAssetOrder)'; } - diff --git a/mobile/openapi/lib/model/albums_update.dart b/mobile/openapi/lib/model/albums_update.dart index d61b5c1398..1ce21273c6 100644 --- a/mobile/openapi/lib/model/albums_update.dart +++ b/mobile/openapi/lib/model/albums_update.dart @@ -1,108 +1,48 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AlbumsUpdate { - /// Returns a new [AlbumsUpdate] instance. - AlbumsUpdate({ - this.defaultAssetOrder, - }); +/// Album preferences +final class AlbumsUpdate { + const AlbumsUpdate({this.defaultAssetOrder}); - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetOrder? defaultAssetOrder; + final AssetOrder? defaultAssetOrder; - @override - bool operator ==(Object other) => identical(this, other) || other is AlbumsUpdate && - other.defaultAssetOrder == defaultAssetOrder; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (defaultAssetOrder == null ? 0 : defaultAssetOrder!.hashCode); - - @override - String toString() => 'AlbumsUpdate[defaultAssetOrder=$defaultAssetOrder]'; + static AlbumsUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(defaultAssetOrder: AssetOrder.fromJson(json[r'defaultAssetOrder'])); + } Map toJson() { final json = {}; - if (this.defaultAssetOrder != null) { - json[r'defaultAssetOrder'] = this.defaultAssetOrder; - } else { - // json[r'defaultAssetOrder'] = null; + if (defaultAssetOrder != null) { + json[r'defaultAssetOrder'] = defaultAssetOrder!.toJson(); } return json; } - /// Returns a new [AlbumsUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AlbumsUpdate? fromJson(dynamic value) { - upgradeDto(value, "AlbumsUpdate"); - if (value is Map) { - final json = value.cast(); - - return AlbumsUpdate( - defaultAssetOrder: AssetOrder.fromJson(json[r'defaultAssetOrder']), - ); - } - return null; + AlbumsUpdate copyWith({Object? defaultAssetOrder = _undefined}) { + return .new( + defaultAssetOrder: identical(defaultAssetOrder, _undefined) + ? this.defaultAssetOrder + : defaultAssetOrder as AssetOrder?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AlbumsUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is AlbumsUpdate && defaultAssetOrder == other.defaultAssetOrder); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AlbumsUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([defaultAssetOrder]); } - // maps a json object with a list of AlbumsUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AlbumsUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'AlbumsUpdate(defaultAssetOrder=$defaultAssetOrder)'; } - diff --git a/mobile/openapi/lib/model/api_key_create_dto.dart b/mobile/openapi/lib/model/api_key_create_dto.dart index 6d3ffc1eb1..7f9fe10111 100644 --- a/mobile/openapi/lib/model/api_key_create_dto.dart +++ b/mobile/openapi/lib/model/api_key_create_dto.dart @@ -1,118 +1,52 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ApiKeyCreateDto { - /// Returns a new [ApiKeyCreateDto] instance. - ApiKeyCreateDto({ - this.name, - this.permissions = const [], - }); +final class ApiKeyCreateDto { + const ApiKeyCreateDto({this.name = const Optional.absent(), required this.permissions}); /// API key name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? name; + final Optional name; /// List of permissions - List permissions; + final List permissions; - @override - bool operator ==(Object other) => identical(this, other) || other is ApiKeyCreateDto && - other.name == name && - _deepEquality.equals(other.permissions, permissions); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (name == null ? 0 : name!.hashCode) + - (permissions.hashCode); - - @override - String toString() => 'ApiKeyCreateDto[name=$name, permissions=$permissions]'; + static ApiKeyCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + name: json.containsKey(r'name') ? Optional.present(json[r'name'] as String) : const Optional.absent(), + permissions: ((json[r'permissions'] as List?)?.map(($e) => (Permission.fromJson($e))!).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (name case Present(:final value)) { + json[r'name'] = value; } - json[r'permissions'] = this.permissions; + json[r'permissions'] = permissions.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [ApiKeyCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ApiKeyCreateDto? fromJson(dynamic value) { - upgradeDto(value, "ApiKeyCreateDto"); - if (value is Map) { - final json = value.cast(); - - return ApiKeyCreateDto( - name: mapValueOfType(json, r'name'), - permissions: Permission.listFromJson(json[r'permissions']), - ); - } - return null; + ApiKeyCreateDto copyWith({Optional? name, List? permissions}) { + return .new(name: name ?? this.name, permissions: permissions ?? this.permissions); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ApiKeyCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ApiKeyCreateDto && + name == other.name && + const DeepCollectionEquality().equals(permissions, other.permissions)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ApiKeyCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([name, const DeepCollectionEquality().hash(permissions)]); } - // maps a json object with a list of ApiKeyCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ApiKeyCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'permissions', - }; + @override + String toString() => 'ApiKeyCreateDto(name=$name, permissions=$permissions)'; } - diff --git a/mobile/openapi/lib/model/api_key_create_response_dto.dart b/mobile/openapi/lib/model/api_key_create_response_dto.dart index 77b19ebfd2..95edaf971a 100644 --- a/mobile/openapi/lib/model/api_key_create_response_dto.dart +++ b/mobile/openapi/lib/model/api_key_create_response_dto.dart @@ -1,108 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ApiKeyCreateResponseDto { - /// Returns a new [ApiKeyCreateResponseDto] instance. - ApiKeyCreateResponseDto({ - required this.apiKey, - required this.secret, - }); +final class ApiKeyCreateResponseDto { + const ApiKeyCreateResponseDto({required this.apiKey, required this.secret}); - ApiKeyResponseDto apiKey; + final ApiKeyResponseDto apiKey; /// API key secret (only shown once) - String secret; + final String secret; - @override - bool operator ==(Object other) => identical(this, other) || other is ApiKeyCreateResponseDto && - other.apiKey == apiKey && - other.secret == secret; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (apiKey.hashCode) + - (secret.hashCode); - - @override - String toString() => 'ApiKeyCreateResponseDto[apiKey=$apiKey, secret=$secret]'; + static ApiKeyCreateResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(apiKey: (ApiKeyResponseDto.fromJson(json[r'apiKey']))!, secret: json[r'secret'] as String); + } Map toJson() { final json = {}; - json[r'apiKey'] = this.apiKey; - json[r'secret'] = this.secret; + json[r'apiKey'] = apiKey.toJson(); + json[r'secret'] = secret; return json; } - /// Returns a new [ApiKeyCreateResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ApiKeyCreateResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ApiKeyCreateResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ApiKeyCreateResponseDto( - apiKey: ApiKeyResponseDto.fromJson(json[r'apiKey'])!, - secret: mapValueOfType(json, r'secret')!, - ); - } - return null; + ApiKeyCreateResponseDto copyWith({ApiKeyResponseDto? apiKey, String? secret}) { + return .new(apiKey: apiKey ?? this.apiKey, secret: secret ?? this.secret); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ApiKeyCreateResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ApiKeyCreateResponseDto && apiKey == other.apiKey && secret == other.secret); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ApiKeyCreateResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([apiKey, secret]); } - // maps a json object with a list of ApiKeyCreateResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ApiKeyCreateResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'apiKey', - 'secret', - }; + @override + String toString() => 'ApiKeyCreateResponseDto(apiKey=$apiKey, secret=$secret)'; } - diff --git a/mobile/openapi/lib/model/api_key_response_dto.dart b/mobile/openapi/lib/model/api_key_response_dto.dart index 79099188a3..32916bf5f9 100644 --- a/mobile/openapi/lib/model/api_key_response_dto.dart +++ b/mobile/openapi/lib/model/api_key_response_dto.dart @@ -1,140 +1,87 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ApiKeyResponseDto { - /// Returns a new [ApiKeyResponseDto] instance. - ApiKeyResponseDto({ +final class ApiKeyResponseDto { + const ApiKeyResponseDto({ required this.createdAt, required this.id, required this.name, - this.permissions = const [], + required this.permissions, required this.updatedAt, }); /// Creation date - DateTime createdAt; + final DateTime createdAt; /// API key ID - String id; + final String id; /// API key name - String name; + final String name; /// List of permissions - List permissions; + final List permissions; /// Last update date - DateTime updatedAt; + final DateTime updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is ApiKeyResponseDto && - other.createdAt == createdAt && - other.id == id && - other.name == name && - _deepEquality.equals(other.permissions, permissions) && - other.updatedAt == updatedAt; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (createdAt.hashCode) + - (id.hashCode) + - (name.hashCode) + - (permissions.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'ApiKeyResponseDto[createdAt=$createdAt, id=$id, name=$name, permissions=$permissions, updatedAt=$updatedAt]'; + static ApiKeyResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + createdAt: DateTime.parse(json[r'createdAt'] as String), + id: json[r'id'] as String, + name: json[r'name'] as String, + permissions: ((json[r'permissions'] as List?)?.map(($e) => (Permission.fromJson($e))!).toList(growable: false))!, + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + ); + } Map toJson() { final json = {}; - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - json[r'id'] = this.id; - json[r'name'] = this.name; - json[r'permissions'] = this.permissions; - json[r'updatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAt.millisecondsSinceEpoch - : this.updatedAt.toUtc().toIso8601String(); + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + json[r'id'] = id; + json[r'name'] = name; + json[r'permissions'] = permissions.map(($e) => $e.toJson()).toList(growable: false); + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); return json; } - /// Returns a new [ApiKeyResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ApiKeyResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ApiKeyResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ApiKeyResponseDto( - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - id: mapValueOfType(json, r'id')!, - name: mapValueOfType(json, r'name')!, - permissions: Permission.listFromJson(json[r'permissions']), - updatedAt: mapDateTime(json, r'updatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ); - } - return null; + ApiKeyResponseDto copyWith({ + DateTime? createdAt, + String? id, + String? name, + List? permissions, + DateTime? updatedAt, + }) { + return .new( + createdAt: createdAt ?? this.createdAt, + id: id ?? this.id, + name: name ?? this.name, + permissions: permissions ?? this.permissions, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ApiKeyResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ApiKeyResponseDto && + createdAt == other.createdAt && + id == other.id && + name == other.name && + const DeepCollectionEquality().equals(permissions, other.permissions) && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ApiKeyResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([createdAt, id, name, const DeepCollectionEquality().hash(permissions), updatedAt]); } - // maps a json object with a list of ApiKeyResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ApiKeyResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'createdAt', - 'id', - 'name', - 'permissions', - 'updatedAt', - }; + @override + String toString() => + 'ApiKeyResponseDto(createdAt=$createdAt, id=$id, name=$name, permissions=$permissions, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/api_key_update_dto.dart b/mobile/openapi/lib/model/api_key_update_dto.dart index c8df4be654..6785c553e2 100644 --- a/mobile/openapi/lib/model/api_key_update_dto.dart +++ b/mobile/openapi/lib/model/api_key_update_dto.dart @@ -1,117 +1,56 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ApiKeyUpdateDto { - /// Returns a new [ApiKeyUpdateDto] instance. - ApiKeyUpdateDto({ - this.name, - this.permissions = const [], - }); +final class ApiKeyUpdateDto { + const ApiKeyUpdateDto({this.name = const Optional.absent(), this.permissions = const Optional.absent()}); /// API key name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? name; + final Optional name; /// List of permissions - List permissions; + final Optional> permissions; - @override - bool operator ==(Object other) => identical(this, other) || other is ApiKeyUpdateDto && - other.name == name && - _deepEquality.equals(other.permissions, permissions); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (name == null ? 0 : name!.hashCode) + - (permissions.hashCode); - - @override - String toString() => 'ApiKeyUpdateDto[name=$name, permissions=$permissions]'; + static ApiKeyUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + name: json.containsKey(r'name') ? Optional.present(json[r'name'] as String) : const Optional.absent(), + permissions: json.containsKey(r'permissions') + ? Optional.present( + ((json[r'permissions'] as List?)?.map(($e) => (Permission.fromJson($e))!).toList(growable: false))!, + ) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (name case Present(:final value)) { + json[r'name'] = value; + } + if (permissions case Present(:final value)) { + json[r'permissions'] = value.map(($e) => $e.toJson()).toList(growable: false); } - json[r'permissions'] = this.permissions; return json; } - /// Returns a new [ApiKeyUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ApiKeyUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "ApiKeyUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return ApiKeyUpdateDto( - name: mapValueOfType(json, r'name'), - permissions: Permission.listFromJson(json[r'permissions']), - ); - } - return null; + ApiKeyUpdateDto copyWith({Optional? name, Optional>? permissions}) { + return .new(name: name ?? this.name, permissions: permissions ?? this.permissions); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ApiKeyUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ApiKeyUpdateDto && name == other.name && permissions == other.permissions); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ApiKeyUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([name, permissions]); } - // maps a json object with a list of ApiKeyUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ApiKeyUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'ApiKeyUpdateDto(name=$name, permissions=$permissions)'; } - diff --git a/mobile/openapi/lib/model/asset_bulk_delete_dto.dart b/mobile/openapi/lib/model/asset_bulk_delete_dto.dart index 055ef16015..a5a830e6ee 100644 --- a/mobile/openapi/lib/model/asset_bulk_delete_dto.dart +++ b/mobile/openapi/lib/model/asset_bulk_delete_dto.dart @@ -1,120 +1,50 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetBulkDeleteDto { - /// Returns a new [AssetBulkDeleteDto] instance. - AssetBulkDeleteDto({ - this.force, - this.ids = const [], - }); +final class AssetBulkDeleteDto { + const AssetBulkDeleteDto({this.force = const Optional.absent(), required this.ids}); /// Force delete even if in use - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? force; + final Optional force; /// IDs to process - List ids; + final List ids; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetBulkDeleteDto && - other.force == force && - _deepEquality.equals(other.ids, ids); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (force == null ? 0 : force!.hashCode) + - (ids.hashCode); - - @override - String toString() => 'AssetBulkDeleteDto[force=$force, ids=$ids]'; + static AssetBulkDeleteDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + force: json.containsKey(r'force') ? Optional.present(json[r'force'] as bool) : const Optional.absent(), + ids: ((json[r'ids'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - if (this.force != null) { - json[r'force'] = this.force; - } else { - // json[r'force'] = null; + if (force case Present(:final value)) { + json[r'force'] = value; } - json[r'ids'] = this.ids; + json[r'ids'] = ids; return json; } - /// Returns a new [AssetBulkDeleteDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetBulkDeleteDto? fromJson(dynamic value) { - upgradeDto(value, "AssetBulkDeleteDto"); - if (value is Map) { - final json = value.cast(); - - return AssetBulkDeleteDto( - force: mapValueOfType(json, r'force'), - ids: json[r'ids'] is Iterable - ? (json[r'ids'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + AssetBulkDeleteDto copyWith({Optional? force, List? ids}) { + return .new(force: force ?? this.force, ids: ids ?? this.ids); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetBulkDeleteDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetBulkDeleteDto && force == other.force && const DeepCollectionEquality().equals(ids, other.ids)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetBulkDeleteDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([force, const DeepCollectionEquality().hash(ids)]); } - // maps a json object with a list of AssetBulkDeleteDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetBulkDeleteDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'ids', - }; + @override + String toString() => 'AssetBulkDeleteDto(force=$force, ids=$ids)'; } - diff --git a/mobile/openapi/lib/model/asset_bulk_update_dto.dart b/mobile/openapi/lib/model/asset_bulk_update_dto.dart index f85026f054..89d4b7b236 100644 --- a/mobile/openapi/lib/model/asset_bulk_update_dto.dart +++ b/mobile/openapi/lib/model/asset_bulk_update_dto.dart @@ -1,281 +1,193 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetBulkUpdateDto { - /// Returns a new [AssetBulkUpdateDto] instance. - AssetBulkUpdateDto({ - this.dateTimeOriginal, - this.dateTimeRelative, - this.description, - this.duplicateId, - this.ids = const [], - this.isFavorite, - this.latitude, - this.longitude, - this.rating, - this.timeZone, - this.visibility, +final class AssetBulkUpdateDto { + const AssetBulkUpdateDto({ + this.dateTimeOriginal = const Optional.absent(), + this.dateTimeRelative = const Optional.absent(), + this.description = const Optional.absent(), + this.duplicateId = const Optional.absent(), + required this.ids, + this.isFavorite = const Optional.absent(), + this.latitude = const Optional.absent(), + this.longitude = const Optional.absent(), + this.rating = const Optional.absent(), + this.timeZone = const Optional.absent(), + this.visibility = const Optional.absent(), }); /// Original date and time - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? dateTimeOriginal; + final Optional dateTimeOriginal; /// Relative time offset in seconds - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - int? dateTimeRelative; + final Optional dateTimeRelative; /// Asset description - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? description; + final Optional description; /// Duplicate ID - String? duplicateId; + final Optional duplicateId; /// Asset IDs to update - List ids; + final List ids; /// Mark as favorite - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isFavorite; + final Optional isFavorite; /// Latitude coordinate - /// - /// Minimum value: -90 - /// Maximum value: 90 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - num? latitude; + final Optional latitude; /// Longitude coordinate - /// - /// Minimum value: -180 - /// Maximum value: 180 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - num? longitude; + final Optional longitude; /// Rating in range [1-5], or null for unrated - /// - /// Minimum value: -1 - /// Maximum value: 5 - int? rating; + /// Available since server v1.0.0. + final Optional rating; /// Time zone (IANA timezone) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? timeZone; + final Optional timeZone; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetVisibility? visibility; + final Optional visibility; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetBulkUpdateDto && - other.dateTimeOriginal == dateTimeOriginal && - other.dateTimeRelative == dateTimeRelative && - other.description == description && - other.duplicateId == duplicateId && - _deepEquality.equals(other.ids, ids) && - other.isFavorite == isFavorite && - other.latitude == latitude && - other.longitude == longitude && - other.rating == rating && - other.timeZone == timeZone && - other.visibility == visibility; + static const ApiVersion ratingAddedIn = .new(1, 0, 0); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (dateTimeOriginal == null ? 0 : dateTimeOriginal!.hashCode) + - (dateTimeRelative == null ? 0 : dateTimeRelative!.hashCode) + - (description == null ? 0 : description!.hashCode) + - (duplicateId == null ? 0 : duplicateId!.hashCode) + - (ids.hashCode) + - (isFavorite == null ? 0 : isFavorite!.hashCode) + - (latitude == null ? 0 : latitude!.hashCode) + - (longitude == null ? 0 : longitude!.hashCode) + - (rating == null ? 0 : rating!.hashCode) + - (timeZone == null ? 0 : timeZone!.hashCode) + - (visibility == null ? 0 : visibility!.hashCode); + static const ApiState ratingState = .stable; - @override - String toString() => 'AssetBulkUpdateDto[dateTimeOriginal=$dateTimeOriginal, dateTimeRelative=$dateTimeRelative, description=$description, duplicateId=$duplicateId, ids=$ids, isFavorite=$isFavorite, latitude=$latitude, longitude=$longitude, rating=$rating, timeZone=$timeZone, visibility=$visibility]'; + static AssetBulkUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + dateTimeOriginal: json.containsKey(r'dateTimeOriginal') + ? Optional.present(json[r'dateTimeOriginal'] as String) + : const Optional.absent(), + dateTimeRelative: json.containsKey(r'dateTimeRelative') + ? Optional.present(json[r'dateTimeRelative'] as int) + : const Optional.absent(), + description: json.containsKey(r'description') + ? Optional.present(json[r'description'] as String) + : const Optional.absent(), + duplicateId: json.containsKey(r'duplicateId') + ? Optional.present((json[r'duplicateId'] as String?)) + : const Optional.absent(), + ids: ((json[r'ids'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + isFavorite: json.containsKey(r'isFavorite') + ? Optional.present(json[r'isFavorite'] as bool) + : const Optional.absent(), + latitude: json.containsKey(r'latitude') + ? Optional.present((json[r'latitude'] as num).toDouble()) + : const Optional.absent(), + longitude: json.containsKey(r'longitude') + ? Optional.present((json[r'longitude'] as num).toDouble()) + : const Optional.absent(), + rating: json.containsKey(r'rating') ? Optional.present((json[r'rating'] as int?)) : const Optional.absent(), + timeZone: json.containsKey(r'timeZone') ? Optional.present(json[r'timeZone'] as String) : const Optional.absent(), + visibility: json.containsKey(r'visibility') + ? Optional.present((AssetVisibility.fromJson(json[r'visibility']))!) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.dateTimeOriginal != null) { - json[r'dateTimeOriginal'] = this.dateTimeOriginal; - } else { - // json[r'dateTimeOriginal'] = null; + if (dateTimeOriginal case Present(:final value)) { + json[r'dateTimeOriginal'] = value; } - if (this.dateTimeRelative != null) { - json[r'dateTimeRelative'] = this.dateTimeRelative; - } else { - // json[r'dateTimeRelative'] = null; + if (dateTimeRelative case Present(:final value)) { + json[r'dateTimeRelative'] = value; } - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (description case Present(:final value)) { + json[r'description'] = value; } - if (this.duplicateId != null) { - json[r'duplicateId'] = this.duplicateId; - } else { - // json[r'duplicateId'] = null; + if (duplicateId case Present(:final value)) { + json[r'duplicateId'] = value; } - json[r'ids'] = this.ids; - if (this.isFavorite != null) { - json[r'isFavorite'] = this.isFavorite; - } else { - // json[r'isFavorite'] = null; + json[r'ids'] = ids; + if (isFavorite case Present(:final value)) { + json[r'isFavorite'] = value; } - if (this.latitude != null) { - json[r'latitude'] = this.latitude; - } else { - // json[r'latitude'] = null; + if (latitude case Present(:final value)) { + json[r'latitude'] = value; } - if (this.longitude != null) { - json[r'longitude'] = this.longitude; - } else { - // json[r'longitude'] = null; + if (longitude case Present(:final value)) { + json[r'longitude'] = value; } - if (this.rating != null) { - json[r'rating'] = this.rating; - } else { - // json[r'rating'] = null; + if (rating case Present(:final value)) { + json[r'rating'] = value; } - if (this.timeZone != null) { - json[r'timeZone'] = this.timeZone; - } else { - // json[r'timeZone'] = null; + if (timeZone case Present(:final value)) { + json[r'timeZone'] = value; } - if (this.visibility != null) { - json[r'visibility'] = this.visibility; - } else { - // json[r'visibility'] = null; + if (visibility case Present(:final value)) { + json[r'visibility'] = value.toJson(); } return json; } - /// Returns a new [AssetBulkUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetBulkUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "AssetBulkUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return AssetBulkUpdateDto( - dateTimeOriginal: mapValueOfType(json, r'dateTimeOriginal'), - dateTimeRelative: mapValueOfType(json, r'dateTimeRelative'), - description: mapValueOfType(json, r'description'), - duplicateId: mapValueOfType(json, r'duplicateId'), - ids: json[r'ids'] is Iterable - ? (json[r'ids'] as Iterable).cast().toList(growable: false) - : const [], - isFavorite: mapValueOfType(json, r'isFavorite'), - latitude: num.parse('${json[r'latitude']}'), - longitude: num.parse('${json[r'longitude']}'), - rating: mapValueOfType(json, r'rating'), - timeZone: mapValueOfType(json, r'timeZone'), - visibility: AssetVisibility.fromJson(json[r'visibility']), - ); - } - return null; + AssetBulkUpdateDto copyWith({ + Optional? dateTimeOriginal, + Optional? dateTimeRelative, + Optional? description, + Optional? duplicateId, + List? ids, + Optional? isFavorite, + Optional? latitude, + Optional? longitude, + Optional? rating, + Optional? timeZone, + Optional? visibility, + }) { + return .new( + dateTimeOriginal: dateTimeOriginal ?? this.dateTimeOriginal, + dateTimeRelative: dateTimeRelative ?? this.dateTimeRelative, + description: description ?? this.description, + duplicateId: duplicateId ?? this.duplicateId, + ids: ids ?? this.ids, + isFavorite: isFavorite ?? this.isFavorite, + latitude: latitude ?? this.latitude, + longitude: longitude ?? this.longitude, + rating: rating ?? this.rating, + timeZone: timeZone ?? this.timeZone, + visibility: visibility ?? this.visibility, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetBulkUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetBulkUpdateDto && + dateTimeOriginal == other.dateTimeOriginal && + dateTimeRelative == other.dateTimeRelative && + description == other.description && + duplicateId == other.duplicateId && + const DeepCollectionEquality().equals(ids, other.ids) && + isFavorite == other.isFavorite && + latitude == other.latitude && + longitude == other.longitude && + rating == other.rating && + timeZone == other.timeZone && + visibility == other.visibility); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetBulkUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + dateTimeOriginal, + dateTimeRelative, + description, + duplicateId, + const DeepCollectionEquality().hash(ids), + isFavorite, + latitude, + longitude, + rating, + timeZone, + visibility, + ]); } - // maps a json object with a list of AssetBulkUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetBulkUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'ids', - }; + @override + String toString() => + 'AssetBulkUpdateDto(dateTimeOriginal=$dateTimeOriginal, dateTimeRelative=$dateTimeRelative, description=$description, duplicateId=$duplicateId, ids=$ids, isFavorite=$isFavorite, latitude=$latitude, longitude=$longitude, rating=$rating, timeZone=$timeZone, visibility=$visibility)'; } - diff --git a/mobile/openapi/lib/model/asset_bulk_upload_check_dto.dart b/mobile/openapi/lib/model/asset_bulk_upload_check_dto.dart index 66f46795e8..4f05221813 100644 --- a/mobile/openapi/lib/model/asset_bulk_upload_check_dto.dart +++ b/mobile/openapi/lib/model/asset_bulk_upload_check_dto.dart @@ -1,100 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetBulkUploadCheckDto { - /// Returns a new [AssetBulkUploadCheckDto] instance. - AssetBulkUploadCheckDto({ - this.assets = const [], - }); +final class AssetBulkUploadCheckDto { + const AssetBulkUploadCheckDto({required this.assets}); /// Assets to check - List assets; + final List assets; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetBulkUploadCheckDto && - _deepEquality.equals(other.assets, assets); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assets.hashCode); - - @override - String toString() => 'AssetBulkUploadCheckDto[assets=$assets]'; + static AssetBulkUploadCheckDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assets: ((json[r'assets'] as List?) + ?.map(($e) => (AssetBulkUploadCheckItem.fromJson($e))!) + .toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'assets'] = this.assets; + json[r'assets'] = assets.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [AssetBulkUploadCheckDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetBulkUploadCheckDto? fromJson(dynamic value) { - upgradeDto(value, "AssetBulkUploadCheckDto"); - if (value is Map) { - final json = value.cast(); - - return AssetBulkUploadCheckDto( - assets: AssetBulkUploadCheckItem.listFromJson(json[r'assets']), - ); - } - return null; + AssetBulkUploadCheckDto copyWith({List? assets}) { + return .new(assets: assets ?? this.assets); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetBulkUploadCheckDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetBulkUploadCheckDto && const DeepCollectionEquality().equals(assets, other.assets)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetBulkUploadCheckDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(assets)]); } - // maps a json object with a list of AssetBulkUploadCheckDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetBulkUploadCheckDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assets', - }; + @override + String toString() => 'AssetBulkUploadCheckDto(assets=$assets)'; } - diff --git a/mobile/openapi/lib/model/asset_bulk_upload_check_item.dart b/mobile/openapi/lib/model/asset_bulk_upload_check_item.dart index 65f81926e3..c5552f1626 100644 --- a/mobile/openapi/lib/model/asset_bulk_upload_check_item.dart +++ b/mobile/openapi/lib/model/asset_bulk_upload_check_item.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetBulkUploadCheckItem { - /// Returns a new [AssetBulkUploadCheckItem] instance. - AssetBulkUploadCheckItem({ - required this.checksum, - required this.id, - }); +final class AssetBulkUploadCheckItem { + const AssetBulkUploadCheckItem({required this.checksum, required this.id}); /// Base64 or hex encoded SHA1 hash - String checksum; + final String checksum; /// Asset ID - String id; + final String id; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetBulkUploadCheckItem && - other.checksum == checksum && - other.id == id; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (checksum.hashCode) + - (id.hashCode); - - @override - String toString() => 'AssetBulkUploadCheckItem[checksum=$checksum, id=$id]'; + static AssetBulkUploadCheckItem? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(checksum: json[r'checksum'] as String, id: json[r'id'] as String); + } Map toJson() { final json = {}; - json[r'checksum'] = this.checksum; - json[r'id'] = this.id; + json[r'checksum'] = checksum; + json[r'id'] = id; return json; } - /// Returns a new [AssetBulkUploadCheckItem] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetBulkUploadCheckItem? fromJson(dynamic value) { - upgradeDto(value, "AssetBulkUploadCheckItem"); - if (value is Map) { - final json = value.cast(); - - return AssetBulkUploadCheckItem( - checksum: mapValueOfType(json, r'checksum')!, - id: mapValueOfType(json, r'id')!, - ); - } - return null; + AssetBulkUploadCheckItem copyWith({String? checksum, String? id}) { + return .new(checksum: checksum ?? this.checksum, id: id ?? this.id); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetBulkUploadCheckItem.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetBulkUploadCheckItem && checksum == other.checksum && id == other.id); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetBulkUploadCheckItem.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([checksum, id]); } - // maps a json object with a list of AssetBulkUploadCheckItem-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetBulkUploadCheckItem.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'checksum', - 'id', - }; + @override + String toString() => 'AssetBulkUploadCheckItem(checksum=$checksum, id=$id)'; } - diff --git a/mobile/openapi/lib/model/asset_bulk_upload_check_response_dto.dart b/mobile/openapi/lib/model/asset_bulk_upload_check_response_dto.dart index b37bb0de8a..326cf56d1e 100644 --- a/mobile/openapi/lib/model/asset_bulk_upload_check_response_dto.dart +++ b/mobile/openapi/lib/model/asset_bulk_upload_check_response_dto.dart @@ -1,100 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetBulkUploadCheckResponseDto { - /// Returns a new [AssetBulkUploadCheckResponseDto] instance. - AssetBulkUploadCheckResponseDto({ - this.results = const [], - }); +final class AssetBulkUploadCheckResponseDto { + const AssetBulkUploadCheckResponseDto({required this.results}); /// Upload check results - List results; + final List results; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetBulkUploadCheckResponseDto && - _deepEquality.equals(other.results, results); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (results.hashCode); - - @override - String toString() => 'AssetBulkUploadCheckResponseDto[results=$results]'; + static AssetBulkUploadCheckResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + results: ((json[r'results'] as List?) + ?.map(($e) => (AssetBulkUploadCheckResult.fromJson($e))!) + .toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'results'] = this.results; + json[r'results'] = results.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [AssetBulkUploadCheckResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetBulkUploadCheckResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetBulkUploadCheckResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetBulkUploadCheckResponseDto( - results: AssetBulkUploadCheckResult.listFromJson(json[r'results']), - ); - } - return null; + AssetBulkUploadCheckResponseDto copyWith({List? results}) { + return .new(results: results ?? this.results); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetBulkUploadCheckResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetBulkUploadCheckResponseDto && const DeepCollectionEquality().equals(results, other.results)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetBulkUploadCheckResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(results)]); } - // maps a json object with a list of AssetBulkUploadCheckResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetBulkUploadCheckResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'results', - }; + @override + String toString() => 'AssetBulkUploadCheckResponseDto(results=$results)'; } - diff --git a/mobile/openapi/lib/model/asset_bulk_upload_check_result.dart b/mobile/openapi/lib/model/asset_bulk_upload_check_result.dart index bf3ee8e244..ec90c1b25d 100644 --- a/mobile/openapi/lib/model/asset_bulk_upload_check_result.dart +++ b/mobile/openapi/lib/model/asset_bulk_upload_check_result.dart @@ -1,161 +1,87 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetBulkUploadCheckResult { - /// Returns a new [AssetBulkUploadCheckResult] instance. - AssetBulkUploadCheckResult({ - required this.action, - this.assetId, - required this.id, - this.isTrashed, - this.reason, - }); +final class AssetBulkUploadCheckResult { + const AssetBulkUploadCheckResult({required this.action, this.assetId, required this.id, this.isTrashed, this.reason}); - AssetUploadAction action; + final AssetUploadAction action; /// Existing asset ID if duplicate - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? assetId; + final String? assetId; /// Asset ID - String id; + final String id; /// Whether existing asset is trashed - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isTrashed; + final bool? isTrashed; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetRejectReason? reason; + final AssetRejectReason? reason; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetBulkUploadCheckResult && - other.action == action && - other.assetId == assetId && - other.id == id && - other.isTrashed == isTrashed && - other.reason == reason; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (action.hashCode) + - (assetId == null ? 0 : assetId!.hashCode) + - (id.hashCode) + - (isTrashed == null ? 0 : isTrashed!.hashCode) + - (reason == null ? 0 : reason!.hashCode); - - @override - String toString() => 'AssetBulkUploadCheckResult[action=$action, assetId=$assetId, id=$id, isTrashed=$isTrashed, reason=$reason]'; + static AssetBulkUploadCheckResult? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + action: (AssetUploadAction.fromJson(json[r'action']))!, + assetId: (json[r'assetId'] as String?), + id: json[r'id'] as String, + isTrashed: (json[r'isTrashed'] as bool?), + reason: AssetRejectReason.fromJson(json[r'reason']), + ); + } Map toJson() { final json = {}; - json[r'action'] = this.action; - if (this.assetId != null) { - json[r'assetId'] = this.assetId; - } else { - // json[r'assetId'] = null; + json[r'action'] = action.toJson(); + if (assetId != null) { + json[r'assetId'] = assetId!; } - json[r'id'] = this.id; - if (this.isTrashed != null) { - json[r'isTrashed'] = this.isTrashed; - } else { - // json[r'isTrashed'] = null; + json[r'id'] = id; + if (isTrashed != null) { + json[r'isTrashed'] = isTrashed!; } - if (this.reason != null) { - json[r'reason'] = this.reason; - } else { - // json[r'reason'] = null; + if (reason != null) { + json[r'reason'] = reason!.toJson(); } return json; } - /// Returns a new [AssetBulkUploadCheckResult] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetBulkUploadCheckResult? fromJson(dynamic value) { - upgradeDto(value, "AssetBulkUploadCheckResult"); - if (value is Map) { - final json = value.cast(); - - return AssetBulkUploadCheckResult( - action: AssetUploadAction.fromJson(json[r'action'])!, - assetId: mapValueOfType(json, r'assetId'), - id: mapValueOfType(json, r'id')!, - isTrashed: mapValueOfType(json, r'isTrashed'), - reason: AssetRejectReason.fromJson(json[r'reason']), - ); - } - return null; + AssetBulkUploadCheckResult copyWith({ + AssetUploadAction? action, + Object? assetId = _undefined, + String? id, + Object? isTrashed = _undefined, + Object? reason = _undefined, + }) { + return .new( + action: action ?? this.action, + assetId: identical(assetId, _undefined) ? this.assetId : assetId as String?, + id: id ?? this.id, + isTrashed: identical(isTrashed, _undefined) ? this.isTrashed : isTrashed as bool?, + reason: identical(reason, _undefined) ? this.reason : reason as AssetRejectReason?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetBulkUploadCheckResult.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetBulkUploadCheckResult && + action == other.action && + assetId == other.assetId && + id == other.id && + isTrashed == other.isTrashed && + reason == other.reason); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetBulkUploadCheckResult.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([action, assetId, id, isTrashed, reason]); } - // maps a json object with a list of AssetBulkUploadCheckResult-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetBulkUploadCheckResult.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'action', - 'id', - }; + @override + String toString() => + 'AssetBulkUploadCheckResult(action=$action, assetId=$assetId, id=$id, isTrashed=$isTrashed, reason=$reason)'; } - diff --git a/mobile/openapi/lib/model/asset_copy_dto.dart b/mobile/openapi/lib/model/asset_copy_dto.dart index 2e68c5c113..a402c1e485 100644 --- a/mobile/openapi/lib/model/asset_copy_dto.dart +++ b/mobile/openapi/lib/model/asset_copy_dto.dart @@ -1,149 +1,117 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetCopyDto { - /// Returns a new [AssetCopyDto] instance. - AssetCopyDto({ - this.albums = true, - this.favorite = true, - this.sharedLinks = true, - this.sidecar = true, +final class AssetCopyDto { + const AssetCopyDto({ + this.albums = const Optional.absent(), + this.favorite = const Optional.absent(), + this.sharedLinks = const Optional.absent(), + this.sidecar = const Optional.absent(), required this.sourceId, - this.stack = true, + this.stack = const Optional.absent(), required this.targetId, }); /// Copy album associations - bool albums; + final Optional albums; /// Copy favorite status - bool favorite; + final Optional favorite; /// Copy shared links - bool sharedLinks; + final Optional sharedLinks; /// Copy sidecar file - bool sidecar; + final Optional sidecar; /// Source asset ID - String sourceId; + final String sourceId; /// Copy stack association - bool stack; + final Optional stack; /// Target asset ID - String targetId; + final String targetId; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetCopyDto && - other.albums == albums && - other.favorite == favorite && - other.sharedLinks == sharedLinks && - other.sidecar == sidecar && - other.sourceId == sourceId && - other.stack == stack && - other.targetId == targetId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albums.hashCode) + - (favorite.hashCode) + - (sharedLinks.hashCode) + - (sidecar.hashCode) + - (sourceId.hashCode) + - (stack.hashCode) + - (targetId.hashCode); - - @override - String toString() => 'AssetCopyDto[albums=$albums, favorite=$favorite, sharedLinks=$sharedLinks, sidecar=$sidecar, sourceId=$sourceId, stack=$stack, targetId=$targetId]'; + static AssetCopyDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albums: json.containsKey(r'albums') ? Optional.present(json[r'albums'] as bool) : const Optional.absent(), + favorite: json.containsKey(r'favorite') ? Optional.present(json[r'favorite'] as bool) : const Optional.absent(), + sharedLinks: json.containsKey(r'sharedLinks') + ? Optional.present(json[r'sharedLinks'] as bool) + : const Optional.absent(), + sidecar: json.containsKey(r'sidecar') ? Optional.present(json[r'sidecar'] as bool) : const Optional.absent(), + sourceId: json[r'sourceId'] as String, + stack: json.containsKey(r'stack') ? Optional.present(json[r'stack'] as bool) : const Optional.absent(), + targetId: json[r'targetId'] as String, + ); + } Map toJson() { final json = {}; - json[r'albums'] = this.albums; - json[r'favorite'] = this.favorite; - json[r'sharedLinks'] = this.sharedLinks; - json[r'sidecar'] = this.sidecar; - json[r'sourceId'] = this.sourceId; - json[r'stack'] = this.stack; - json[r'targetId'] = this.targetId; + if (albums case Present(:final value)) { + json[r'albums'] = value; + } + if (favorite case Present(:final value)) { + json[r'favorite'] = value; + } + if (sharedLinks case Present(:final value)) { + json[r'sharedLinks'] = value; + } + if (sidecar case Present(:final value)) { + json[r'sidecar'] = value; + } + json[r'sourceId'] = sourceId; + if (stack case Present(:final value)) { + json[r'stack'] = value; + } + json[r'targetId'] = targetId; return json; } - /// Returns a new [AssetCopyDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetCopyDto? fromJson(dynamic value) { - upgradeDto(value, "AssetCopyDto"); - if (value is Map) { - final json = value.cast(); - - return AssetCopyDto( - albums: mapValueOfType(json, r'albums') ?? true, - favorite: mapValueOfType(json, r'favorite') ?? true, - sharedLinks: mapValueOfType(json, r'sharedLinks') ?? true, - sidecar: mapValueOfType(json, r'sidecar') ?? true, - sourceId: mapValueOfType(json, r'sourceId')!, - stack: mapValueOfType(json, r'stack') ?? true, - targetId: mapValueOfType(json, r'targetId')!, - ); - } - return null; + AssetCopyDto copyWith({ + Optional? albums, + Optional? favorite, + Optional? sharedLinks, + Optional? sidecar, + String? sourceId, + Optional? stack, + String? targetId, + }) { + return .new( + albums: albums ?? this.albums, + favorite: favorite ?? this.favorite, + sharedLinks: sharedLinks ?? this.sharedLinks, + sidecar: sidecar ?? this.sidecar, + sourceId: sourceId ?? this.sourceId, + stack: stack ?? this.stack, + targetId: targetId ?? this.targetId, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetCopyDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetCopyDto && + albums == other.albums && + favorite == other.favorite && + sharedLinks == other.sharedLinks && + sidecar == other.sidecar && + sourceId == other.sourceId && + stack == other.stack && + targetId == other.targetId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetCopyDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albums, favorite, sharedLinks, sidecar, sourceId, stack, targetId]); } - // maps a json object with a list of AssetCopyDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetCopyDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'sourceId', - 'targetId', - }; + @override + String toString() => + 'AssetCopyDto(albums=$albums, favorite=$favorite, sharedLinks=$sharedLinks, sidecar=$sidecar, sourceId=$sourceId, stack=$stack, targetId=$targetId)'; } - diff --git a/mobile/openapi/lib/model/asset_edit_action.dart b/mobile/openapi/lib/model/asset_edit_action.dart index 3754cb4501..e1b7314f30 100644 --- a/mobile/openapi/lib/model/asset_edit_action.dart +++ b/mobile/openapi/lib/model/asset_edit_action.dart @@ -1,88 +1,29 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Type of edit action to perform -class AssetEditAction { - /// Instantiate a new enum with the provided [value]. +enum AssetEditAction { + crop._(r'crop'), + rotate._(r'rotate'), + mirror._(r'mirror'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AssetEditAction._(this.value); - /// The underlying value of this enum member. final String value; + static AssetEditAction? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const crop = AssetEditAction._(r'crop'); - static const rotate = AssetEditAction._(r'rotate'); - static const mirror = AssetEditAction._(r'mirror'); - - /// List of all possible values in this [enum][AssetEditAction]. - static const values = [ - crop, - rotate, - mirror, - ]; - - static AssetEditAction? fromJson(dynamic value) => AssetEditActionTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetEditAction.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AssetEditAction] to String, -/// and [decode] dynamic data back to [AssetEditAction]. -class AssetEditActionTypeTransformer { - factory AssetEditActionTypeTransformer() => _instance ??= const AssetEditActionTypeTransformer._(); - - const AssetEditActionTypeTransformer._(); - - String encode(AssetEditAction data) => data.value; - - /// Decodes a [dynamic value][data] to a AssetEditAction. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AssetEditAction? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'crop': return AssetEditAction.crop; - case r'rotate': return AssetEditAction.rotate; - case r'mirror': return AssetEditAction.mirror; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AssetEditActionTypeTransformer] instance. - static AssetEditActionTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/asset_edit_action_item_dto.dart b/mobile/openapi/lib/model/asset_edit_action_item_dto.dart index 1b19612bf3..c9922ac154 100644 --- a/mobile/openapi/lib/model/asset_edit_action_item_dto.dart +++ b/mobile/openapi/lib/model/asset_edit_action_item_dto.dart @@ -1,107 +1,54 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetEditActionItemDto { - /// Returns a new [AssetEditActionItemDto] instance. - AssetEditActionItemDto({ - required this.action, - required this.parameters, - }); +final class AssetEditActionItemDto { + const AssetEditActionItemDto({required this.action, required this.parameters}); - AssetEditAction action; + final AssetEditAction action; - Map parameters; + /// List of edit actions to apply (crop, rotate, or mirror) + final Map? parameters; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetEditActionItemDto && - other.action == action && - other.parameters == parameters; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (action.hashCode) + - (parameters.hashCode); - - @override - String toString() => 'AssetEditActionItemDto[action=$action, parameters=$parameters]'; + static AssetEditActionItemDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + action: (AssetEditAction.fromJson(json[r'action']))!, + parameters: (json[r'parameters'] as Map?)?.cast(), + ); + } Map toJson() { final json = {}; - json[r'action'] = this.action; - json[r'parameters'] = this.parameters; + json[r'action'] = action.toJson(); + if (parameters != null) { + json[r'parameters'] = parameters; + } return json; } - /// Returns a new [AssetEditActionItemDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetEditActionItemDto? fromJson(dynamic value) { - upgradeDto(value, "AssetEditActionItemDto"); - if (value is Map) { - final json = value.cast(); - - return AssetEditActionItemDto( - action: AssetEditAction.fromJson(json[r'action'])!, - parameters: json[r'parameters'], - ); - } - return null; + AssetEditActionItemDto copyWith({AssetEditAction? action, Object? parameters = _undefined}) { + return .new( + action: action ?? this.action, + parameters: identical(parameters, _undefined) ? this.parameters : parameters as Map?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetEditActionItemDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetEditActionItemDto && action == other.action && parameters == other.parameters); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetEditActionItemDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([action, parameters]); } - // maps a json object with a list of AssetEditActionItemDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetEditActionItemDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'action', - 'parameters', - }; + @override + String toString() => 'AssetEditActionItemDto(action=$action, parameters=$parameters)'; } - diff --git a/mobile/openapi/lib/model/asset_edit_action_item_dto_parameters.dart b/mobile/openapi/lib/model/asset_edit_action_item_dto_parameters.dart deleted file mode 100644 index 6f2811e89d..0000000000 --- a/mobile/openapi/lib/model/asset_edit_action_item_dto_parameters.dart +++ /dev/null @@ -1,156 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -part of openapi.api; - -class AssetEditActionItemDtoParameters { - /// Returns a new [AssetEditActionItemDtoParameters] instance. - AssetEditActionItemDtoParameters({ - required this.height, - required this.width, - required this.x, - required this.y, - required this.angle, - required this.axis, - }); - - /// Height of the crop - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - int height; - - /// Width of the crop - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - int width; - - /// Top-Left X coordinate of crop - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int x; - - /// Top-Left Y coordinate of crop - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int y; - - /// Rotation angle in degrees - num angle; - - MirrorAxis axis; - - @override - bool operator ==(Object other) => identical(this, other) || other is AssetEditActionItemDtoParameters && - other.height == height && - other.width == width && - other.x == x && - other.y == y && - other.angle == angle && - other.axis == axis; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (height.hashCode) + - (width.hashCode) + - (x.hashCode) + - (y.hashCode) + - (angle.hashCode) + - (axis.hashCode); - - @override - String toString() => 'AssetEditActionItemDtoParameters[height=$height, width=$width, x=$x, y=$y, angle=$angle, axis=$axis]'; - - Map toJson() { - final json = {}; - json[r'height'] = this.height; - json[r'width'] = this.width; - json[r'x'] = this.x; - json[r'y'] = this.y; - json[r'angle'] = this.angle; - json[r'axis'] = this.axis; - return json; - } - - /// Returns a new [AssetEditActionItemDtoParameters] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetEditActionItemDtoParameters? fromJson(dynamic value) { - upgradeDto(value, "AssetEditActionItemDtoParameters"); - if (value is Map) { - final json = value.cast(); - - return AssetEditActionItemDtoParameters( - height: mapValueOfType(json, r'height')!, - width: mapValueOfType(json, r'width')!, - x: mapValueOfType(json, r'x')!, - y: mapValueOfType(json, r'y')!, - angle: num.parse('${json[r'angle']}'), - axis: MirrorAxis.fromJson(json[r'axis'])!, - ); - } - return null; - } - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetEditActionItemDtoParameters.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } - - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetEditActionItemDtoParameters.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; - } - - // maps a json object with a list of AssetEditActionItemDtoParameters-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetEditActionItemDtoParameters.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'height', - 'width', - 'x', - 'y', - 'angle', - 'axis', - }; -} - diff --git a/mobile/openapi/lib/model/asset_edit_action_item_response_dto.dart b/mobile/openapi/lib/model/asset_edit_action_item_response_dto.dart index 3315fe8579..b5ab7ffb02 100644 --- a/mobile/openapi/lib/model/asset_edit_action_item_response_dto.dart +++ b/mobile/openapi/lib/model/asset_edit_action_item_response_dto.dart @@ -1,116 +1,63 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetEditActionItemResponseDto { - /// Returns a new [AssetEditActionItemResponseDto] instance. - AssetEditActionItemResponseDto({ - required this.action, - required this.id, - required this.parameters, - }); +final class AssetEditActionItemResponseDto { + const AssetEditActionItemResponseDto({required this.action, required this.id, required this.parameters}); - AssetEditAction action; + final AssetEditAction action; /// Asset edit ID - String id; + final String id; - AssetEditActionItemDtoParameters parameters; + /// List of edit actions to apply (crop, rotate, or mirror) + final Map? parameters; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetEditActionItemResponseDto && - other.action == action && - other.id == id && - other.parameters == parameters; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (action.hashCode) + - (id.hashCode) + - (parameters.hashCode); - - @override - String toString() => 'AssetEditActionItemResponseDto[action=$action, id=$id, parameters=$parameters]'; + static AssetEditActionItemResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + action: (AssetEditAction.fromJson(json[r'action']))!, + id: json[r'id'] as String, + parameters: (json[r'parameters'] as Map?)?.cast(), + ); + } Map toJson() { final json = {}; - json[r'action'] = this.action; - json[r'id'] = this.id; - json[r'parameters'] = this.parameters; + json[r'action'] = action.toJson(); + json[r'id'] = id; + if (parameters != null) { + json[r'parameters'] = parameters; + } return json; } - /// Returns a new [AssetEditActionItemResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetEditActionItemResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetEditActionItemResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetEditActionItemResponseDto( - action: AssetEditAction.fromJson(json[r'action'])!, - id: mapValueOfType(json, r'id')!, - parameters: AssetEditActionItemDtoParameters.fromJson(json[r'parameters'])!, - ); - } - return null; + AssetEditActionItemResponseDto copyWith({AssetEditAction? action, String? id, Object? parameters = _undefined}) { + return .new( + action: action ?? this.action, + id: id ?? this.id, + parameters: identical(parameters, _undefined) ? this.parameters : parameters as Map?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetEditActionItemResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetEditActionItemResponseDto && + action == other.action && + id == other.id && + parameters == other.parameters); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetEditActionItemResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([action, id, parameters]); } - // maps a json object with a list of AssetEditActionItemResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetEditActionItemResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'action', - 'id', - 'parameters', - }; + @override + String toString() => 'AssetEditActionItemResponseDto(action=$action, id=$id, parameters=$parameters)'; } - diff --git a/mobile/openapi/lib/model/asset_edits_create_dto.dart b/mobile/openapi/lib/model/asset_edits_create_dto.dart index 9f6fc66904..43871fa996 100644 --- a/mobile/openapi/lib/model/asset_edits_create_dto.dart +++ b/mobile/openapi/lib/model/asset_edits_create_dto.dart @@ -1,100 +1,43 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetEditsCreateDto { - /// Returns a new [AssetEditsCreateDto] instance. - AssetEditsCreateDto({ - this.edits = const [], - }); +final class AssetEditsCreateDto { + const AssetEditsCreateDto({required this.edits}); /// List of edit actions to apply (crop, rotate, or mirror) - List edits; + final List edits; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetEditsCreateDto && - _deepEquality.equals(other.edits, edits); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (edits.hashCode); - - @override - String toString() => 'AssetEditsCreateDto[edits=$edits]'; + static AssetEditsCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + edits: ((json[r'edits'] as List?)?.map(($e) => (AssetEditActionItemDto.fromJson($e))!).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'edits'] = this.edits; + json[r'edits'] = edits.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [AssetEditsCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetEditsCreateDto? fromJson(dynamic value) { - upgradeDto(value, "AssetEditsCreateDto"); - if (value is Map) { - final json = value.cast(); - - return AssetEditsCreateDto( - edits: AssetEditActionItemDto.listFromJson(json[r'edits']), - ); - } - return null; + AssetEditsCreateDto copyWith({List? edits}) { + return .new(edits: edits ?? this.edits); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetEditsCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetEditsCreateDto && const DeepCollectionEquality().equals(edits, other.edits)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetEditsCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(edits)]); } - // maps a json object with a list of AssetEditsCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetEditsCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'edits', - }; + @override + String toString() => 'AssetEditsCreateDto(edits=$edits)'; } - diff --git a/mobile/openapi/lib/model/asset_edits_response_dto.dart b/mobile/openapi/lib/model/asset_edits_response_dto.dart index 322b4c0a4c..a66e767e29 100644 --- a/mobile/openapi/lib/model/asset_edits_response_dto.dart +++ b/mobile/openapi/lib/model/asset_edits_response_dto.dart @@ -1,109 +1,52 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetEditsResponseDto { - /// Returns a new [AssetEditsResponseDto] instance. - AssetEditsResponseDto({ - required this.assetId, - this.edits = const [], - }); +final class AssetEditsResponseDto { + const AssetEditsResponseDto({required this.assetId, required this.edits}); /// Asset ID these edits belong to - String assetId; + final String assetId; /// List of edit actions applied to the asset - List edits; + final List edits; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetEditsResponseDto && - other.assetId == assetId && - _deepEquality.equals(other.edits, edits); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (edits.hashCode); - - @override - String toString() => 'AssetEditsResponseDto[assetId=$assetId, edits=$edits]'; + static AssetEditsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetId: json[r'assetId'] as String, + edits: ((json[r'edits'] as List?) + ?.map(($e) => (AssetEditActionItemResponseDto.fromJson($e))!) + .toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'edits'] = this.edits; + json[r'assetId'] = assetId; + json[r'edits'] = edits.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [AssetEditsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetEditsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetEditsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetEditsResponseDto( - assetId: mapValueOfType(json, r'assetId')!, - edits: AssetEditActionItemResponseDto.listFromJson(json[r'edits']), - ); - } - return null; + AssetEditsResponseDto copyWith({String? assetId, List? edits}) { + return .new(assetId: assetId ?? this.assetId, edits: edits ?? this.edits); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetEditsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetEditsResponseDto && + assetId == other.assetId && + const DeepCollectionEquality().equals(edits, other.edits)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetEditsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, const DeepCollectionEquality().hash(edits)]); } - // maps a json object with a list of AssetEditsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetEditsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'edits', - }; + @override + String toString() => 'AssetEditsResponseDto(assetId=$assetId, edits=$edits)'; } - diff --git a/mobile/openapi/lib/model/asset_face_create_dto.dart b/mobile/openapi/lib/model/asset_face_create_dto.dart index 29c28175cd..211a0a4e1c 100644 --- a/mobile/openapi/lib/model/asset_face_create_dto.dart +++ b/mobile/openapi/lib/model/asset_face_create_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetFaceCreateDto { - /// Returns a new [AssetFaceCreateDto] instance. - AssetFaceCreateDto({ +final class AssetFaceCreateDto { + const AssetFaceCreateDto({ required this.assetId, required this.height, required this.imageHeight, @@ -24,158 +15,100 @@ class AssetFaceCreateDto { }); /// Asset ID - String assetId; + final String assetId; /// Face bounding box height - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int height; + final int height; /// Image height in pixels - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int imageHeight; + final int imageHeight; /// Image width in pixels - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int imageWidth; + final int imageWidth; /// Person ID - String personId; + final String personId; /// Face bounding box width - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int width; + final int width; /// Face bounding box X coordinate - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int x; + final int x; /// Face bounding box Y coordinate - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int y; + final int y; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetFaceCreateDto && - other.assetId == assetId && - other.height == height && - other.imageHeight == imageHeight && - other.imageWidth == imageWidth && - other.personId == personId && - other.width == width && - other.x == x && - other.y == y; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (height.hashCode) + - (imageHeight.hashCode) + - (imageWidth.hashCode) + - (personId.hashCode) + - (width.hashCode) + - (x.hashCode) + - (y.hashCode); - - @override - String toString() => 'AssetFaceCreateDto[assetId=$assetId, height=$height, imageHeight=$imageHeight, imageWidth=$imageWidth, personId=$personId, width=$width, x=$x, y=$y]'; + static AssetFaceCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetId: json[r'assetId'] as String, + height: json[r'height'] as int, + imageHeight: json[r'imageHeight'] as int, + imageWidth: json[r'imageWidth'] as int, + personId: json[r'personId'] as String, + width: json[r'width'] as int, + x: json[r'x'] as int, + y: json[r'y'] as int, + ); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'height'] = this.height; - json[r'imageHeight'] = this.imageHeight; - json[r'imageWidth'] = this.imageWidth; - json[r'personId'] = this.personId; - json[r'width'] = this.width; - json[r'x'] = this.x; - json[r'y'] = this.y; + json[r'assetId'] = assetId; + json[r'height'] = height; + json[r'imageHeight'] = imageHeight; + json[r'imageWidth'] = imageWidth; + json[r'personId'] = personId; + json[r'width'] = width; + json[r'x'] = x; + json[r'y'] = y; return json; } - /// Returns a new [AssetFaceCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetFaceCreateDto? fromJson(dynamic value) { - upgradeDto(value, "AssetFaceCreateDto"); - if (value is Map) { - final json = value.cast(); - - return AssetFaceCreateDto( - assetId: mapValueOfType(json, r'assetId')!, - height: mapValueOfType(json, r'height')!, - imageHeight: mapValueOfType(json, r'imageHeight')!, - imageWidth: mapValueOfType(json, r'imageWidth')!, - personId: mapValueOfType(json, r'personId')!, - width: mapValueOfType(json, r'width')!, - x: mapValueOfType(json, r'x')!, - y: mapValueOfType(json, r'y')!, - ); - } - return null; + AssetFaceCreateDto copyWith({ + String? assetId, + int? height, + int? imageHeight, + int? imageWidth, + String? personId, + int? width, + int? x, + int? y, + }) { + return .new( + assetId: assetId ?? this.assetId, + height: height ?? this.height, + imageHeight: imageHeight ?? this.imageHeight, + imageWidth: imageWidth ?? this.imageWidth, + personId: personId ?? this.personId, + width: width ?? this.width, + x: x ?? this.x, + y: y ?? this.y, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetFaceCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetFaceCreateDto && + assetId == other.assetId && + height == other.height && + imageHeight == other.imageHeight && + imageWidth == other.imageWidth && + personId == other.personId && + width == other.width && + x == other.x && + y == other.y); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetFaceCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, height, imageHeight, imageWidth, personId, width, x, y]); } - // maps a json object with a list of AssetFaceCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetFaceCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'height', - 'imageHeight', - 'imageWidth', - 'personId', - 'width', - 'x', - 'y', - }; + @override + String toString() => + 'AssetFaceCreateDto(assetId=$assetId, height=$height, imageHeight=$imageHeight, imageWidth=$imageWidth, personId=$personId, width=$width, x=$x, y=$y)'; } - diff --git a/mobile/openapi/lib/model/asset_face_delete_dto.dart b/mobile/openapi/lib/model/asset_face_delete_dto.dart index a1f3731bea..c569bfcb99 100644 --- a/mobile/openapi/lib/model/asset_face_delete_dto.dart +++ b/mobile/openapi/lib/model/asset_face_delete_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetFaceDeleteDto { - /// Returns a new [AssetFaceDeleteDto] instance. - AssetFaceDeleteDto({ - required this.force, - }); +final class AssetFaceDeleteDto { + const AssetFaceDeleteDto({required this.force}); /// Force delete even if person has other faces - bool force; + final bool force; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetFaceDeleteDto && - other.force == force; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (force.hashCode); - - @override - String toString() => 'AssetFaceDeleteDto[force=$force]'; + static AssetFaceDeleteDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(force: json[r'force'] as bool); + } Map toJson() { final json = {}; - json[r'force'] = this.force; + json[r'force'] = force; return json; } - /// Returns a new [AssetFaceDeleteDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetFaceDeleteDto? fromJson(dynamic value) { - upgradeDto(value, "AssetFaceDeleteDto"); - if (value is Map) { - final json = value.cast(); - - return AssetFaceDeleteDto( - force: mapValueOfType(json, r'force')!, - ); - } - return null; + AssetFaceDeleteDto copyWith({bool? force}) { + return .new(force: force ?? this.force); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetFaceDeleteDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is AssetFaceDeleteDto && force == other.force); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetFaceDeleteDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([force]); } - // maps a json object with a list of AssetFaceDeleteDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetFaceDeleteDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'force', - }; + @override + String toString() => 'AssetFaceDeleteDto(force=$force)'; } - diff --git a/mobile/openapi/lib/model/asset_face_response_dto.dart b/mobile/openapi/lib/model/asset_face_response_dto.dart index 21b86dfe4e..c4eb224ee1 100644 --- a/mobile/openapi/lib/model/asset_face_response_dto.dart +++ b/mobile/openapi/lib/model/asset_face_response_dto.dart @@ -1,18 +1,10 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetFaceResponseDto { - /// Returns a new [AssetFaceResponseDto] instance. - AssetFaceResponseDto({ +/// Asset face with person +final class AssetFaceResponseDto { + const AssetFaceResponseDto({ required this.boundingBoxX1, required this.boundingBoxX2, required this.boundingBoxY1, @@ -25,177 +17,122 @@ class AssetFaceResponseDto { }); /// Bounding box X1 coordinate - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxX1; + final int boundingBoxX1; /// Bounding box X2 coordinate - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxX2; + final int boundingBoxX2; /// Bounding box Y1 coordinate - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxY1; + final int boundingBoxY1; /// Bounding box Y2 coordinate - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxY2; + final int boundingBoxY2; /// Face ID - String id; + final String id; /// Image height in pixels - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int imageHeight; + final int imageHeight; /// Image width in pixels - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int imageWidth; + final int imageWidth; - PersonResponseDto? person; + final PersonResponseDto? person; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - SourceType? sourceType; + final SourceType? sourceType; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetFaceResponseDto && - other.boundingBoxX1 == boundingBoxX1 && - other.boundingBoxX2 == boundingBoxX2 && - other.boundingBoxY1 == boundingBoxY1 && - other.boundingBoxY2 == boundingBoxY2 && - other.id == id && - other.imageHeight == imageHeight && - other.imageWidth == imageWidth && - other.person == person && - other.sourceType == sourceType; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (boundingBoxX1.hashCode) + - (boundingBoxX2.hashCode) + - (boundingBoxY1.hashCode) + - (boundingBoxY2.hashCode) + - (id.hashCode) + - (imageHeight.hashCode) + - (imageWidth.hashCode) + - (person == null ? 0 : person!.hashCode) + - (sourceType == null ? 0 : sourceType!.hashCode); - - @override - String toString() => 'AssetFaceResponseDto[boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, person=$person, sourceType=$sourceType]'; + static AssetFaceResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + boundingBoxX1: json[r'boundingBoxX1'] as int, + boundingBoxX2: json[r'boundingBoxX2'] as int, + boundingBoxY1: json[r'boundingBoxY1'] as int, + boundingBoxY2: json[r'boundingBoxY2'] as int, + id: json[r'id'] as String, + imageHeight: json[r'imageHeight'] as int, + imageWidth: json[r'imageWidth'] as int, + person: PersonResponseDto.fromJson(json[r'person']), + sourceType: SourceType.fromJson(json[r'sourceType']), + ); + } Map toJson() { final json = {}; - json[r'boundingBoxX1'] = this.boundingBoxX1; - json[r'boundingBoxX2'] = this.boundingBoxX2; - json[r'boundingBoxY1'] = this.boundingBoxY1; - json[r'boundingBoxY2'] = this.boundingBoxY2; - json[r'id'] = this.id; - json[r'imageHeight'] = this.imageHeight; - json[r'imageWidth'] = this.imageWidth; - if (this.person != null) { - json[r'person'] = this.person; - } else { - // json[r'person'] = null; + json[r'boundingBoxX1'] = boundingBoxX1; + json[r'boundingBoxX2'] = boundingBoxX2; + json[r'boundingBoxY1'] = boundingBoxY1; + json[r'boundingBoxY2'] = boundingBoxY2; + json[r'id'] = id; + json[r'imageHeight'] = imageHeight; + json[r'imageWidth'] = imageWidth; + if (person != null) { + json[r'person'] = person!.toJson(); } - if (this.sourceType != null) { - json[r'sourceType'] = this.sourceType; - } else { - // json[r'sourceType'] = null; + if (sourceType != null) { + json[r'sourceType'] = sourceType!.toJson(); } return json; } - /// Returns a new [AssetFaceResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetFaceResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetFaceResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetFaceResponseDto( - boundingBoxX1: mapValueOfType(json, r'boundingBoxX1')!, - boundingBoxX2: mapValueOfType(json, r'boundingBoxX2')!, - boundingBoxY1: mapValueOfType(json, r'boundingBoxY1')!, - boundingBoxY2: mapValueOfType(json, r'boundingBoxY2')!, - id: mapValueOfType(json, r'id')!, - imageHeight: mapValueOfType(json, r'imageHeight')!, - imageWidth: mapValueOfType(json, r'imageWidth')!, - person: PersonResponseDto.fromJson(json[r'person']), - sourceType: SourceType.fromJson(json[r'sourceType']), - ); - } - return null; + AssetFaceResponseDto copyWith({ + int? boundingBoxX1, + int? boundingBoxX2, + int? boundingBoxY1, + int? boundingBoxY2, + String? id, + int? imageHeight, + int? imageWidth, + Object? person = _undefined, + Object? sourceType = _undefined, + }) { + return .new( + boundingBoxX1: boundingBoxX1 ?? this.boundingBoxX1, + boundingBoxX2: boundingBoxX2 ?? this.boundingBoxX2, + boundingBoxY1: boundingBoxY1 ?? this.boundingBoxY1, + boundingBoxY2: boundingBoxY2 ?? this.boundingBoxY2, + id: id ?? this.id, + imageHeight: imageHeight ?? this.imageHeight, + imageWidth: imageWidth ?? this.imageWidth, + person: identical(person, _undefined) ? this.person : person as PersonResponseDto?, + sourceType: identical(sourceType, _undefined) ? this.sourceType : sourceType as SourceType?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetFaceResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetFaceResponseDto && + boundingBoxX1 == other.boundingBoxX1 && + boundingBoxX2 == other.boundingBoxX2 && + boundingBoxY1 == other.boundingBoxY1 && + boundingBoxY2 == other.boundingBoxY2 && + id == other.id && + imageHeight == other.imageHeight && + imageWidth == other.imageWidth && + person == other.person && + sourceType == other.sourceType); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetFaceResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + boundingBoxX1, + boundingBoxX2, + boundingBoxY1, + boundingBoxY2, + id, + imageHeight, + imageWidth, + person, + sourceType, + ]); } - // maps a json object with a list of AssetFaceResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetFaceResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'boundingBoxX1', - 'boundingBoxX2', - 'boundingBoxY1', - 'boundingBoxY2', - 'id', - 'imageHeight', - 'imageWidth', - 'person', - }; + @override + String toString() => + 'AssetFaceResponseDto(boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, person=$person, sourceType=$sourceType)'; } - diff --git a/mobile/openapi/lib/model/asset_face_update_dto.dart b/mobile/openapi/lib/model/asset_face_update_dto.dart index 1027627552..087d60681e 100644 --- a/mobile/openapi/lib/model/asset_face_update_dto.dart +++ b/mobile/openapi/lib/model/asset_face_update_dto.dart @@ -1,100 +1,43 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetFaceUpdateDto { - /// Returns a new [AssetFaceUpdateDto] instance. - AssetFaceUpdateDto({ - this.data = const [], - }); +final class AssetFaceUpdateDto { + const AssetFaceUpdateDto({required this.data}); /// Face update items - List data; + final List data; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetFaceUpdateDto && - _deepEquality.equals(other.data, data); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (data.hashCode); - - @override - String toString() => 'AssetFaceUpdateDto[data=$data]'; + static AssetFaceUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + data: ((json[r'data'] as List?)?.map(($e) => (AssetFaceUpdateItem.fromJson($e))!).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'data'] = this.data; + json[r'data'] = data.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [AssetFaceUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetFaceUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "AssetFaceUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return AssetFaceUpdateDto( - data: AssetFaceUpdateItem.listFromJson(json[r'data']), - ); - } - return null; + AssetFaceUpdateDto copyWith({List? data}) { + return .new(data: data ?? this.data); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetFaceUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetFaceUpdateDto && const DeepCollectionEquality().equals(data, other.data)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetFaceUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(data)]); } - // maps a json object with a list of AssetFaceUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetFaceUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'data', - }; + @override + String toString() => 'AssetFaceUpdateDto(data=$data)'; } - diff --git a/mobile/openapi/lib/model/asset_face_update_item.dart b/mobile/openapi/lib/model/asset_face_update_item.dart index a81b21e139..169982bfb7 100644 --- a/mobile/openapi/lib/model/asset_face_update_item.dart +++ b/mobile/openapi/lib/model/asset_face_update_item.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetFaceUpdateItem { - /// Returns a new [AssetFaceUpdateItem] instance. - AssetFaceUpdateItem({ - required this.assetId, - required this.personId, - }); +final class AssetFaceUpdateItem { + const AssetFaceUpdateItem({required this.assetId, required this.personId}); /// Asset ID - String assetId; + final String assetId; /// Person ID - String personId; + final String personId; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetFaceUpdateItem && - other.assetId == assetId && - other.personId == personId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (personId.hashCode); - - @override - String toString() => 'AssetFaceUpdateItem[assetId=$assetId, personId=$personId]'; + static AssetFaceUpdateItem? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(assetId: json[r'assetId'] as String, personId: json[r'personId'] as String); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'personId'] = this.personId; + json[r'assetId'] = assetId; + json[r'personId'] = personId; return json; } - /// Returns a new [AssetFaceUpdateItem] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetFaceUpdateItem? fromJson(dynamic value) { - upgradeDto(value, "AssetFaceUpdateItem"); - if (value is Map) { - final json = value.cast(); - - return AssetFaceUpdateItem( - assetId: mapValueOfType(json, r'assetId')!, - personId: mapValueOfType(json, r'personId')!, - ); - } - return null; + AssetFaceUpdateItem copyWith({String? assetId, String? personId}) { + return .new(assetId: assetId ?? this.assetId, personId: personId ?? this.personId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetFaceUpdateItem.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetFaceUpdateItem && assetId == other.assetId && personId == other.personId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetFaceUpdateItem.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, personId]); } - // maps a json object with a list of AssetFaceUpdateItem-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetFaceUpdateItem.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'personId', - }; + @override + String toString() => 'AssetFaceUpdateItem(assetId=$assetId, personId=$personId)'; } - diff --git a/mobile/openapi/lib/model/asset_id_error_reason.dart b/mobile/openapi/lib/model/asset_id_error_reason.dart index c51eab1692..439538239f 100644 --- a/mobile/openapi/lib/model/asset_id_error_reason.dart +++ b/mobile/openapi/lib/model/asset_id_error_reason.dart @@ -1,88 +1,29 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Error reason if failed -class AssetIdErrorReason { - /// Instantiate a new enum with the provided [value]. +enum AssetIdErrorReason { + duplicate._(r'duplicate'), + noPermission._(r'no_permission'), + notFound._(r'not_found'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AssetIdErrorReason._(this.value); - /// The underlying value of this enum member. final String value; + static AssetIdErrorReason? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const duplicate = AssetIdErrorReason._(r'duplicate'); - static const noPermission = AssetIdErrorReason._(r'no_permission'); - static const notFound = AssetIdErrorReason._(r'not_found'); - - /// List of all possible values in this [enum][AssetIdErrorReason]. - static const values = [ - duplicate, - noPermission, - notFound, - ]; - - static AssetIdErrorReason? fromJson(dynamic value) => AssetIdErrorReasonTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetIdErrorReason.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AssetIdErrorReason] to String, -/// and [decode] dynamic data back to [AssetIdErrorReason]. -class AssetIdErrorReasonTypeTransformer { - factory AssetIdErrorReasonTypeTransformer() => _instance ??= const AssetIdErrorReasonTypeTransformer._(); - - const AssetIdErrorReasonTypeTransformer._(); - - String encode(AssetIdErrorReason data) => data.value; - - /// Decodes a [dynamic value][data] to a AssetIdErrorReason. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AssetIdErrorReason? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'duplicate': return AssetIdErrorReason.duplicate; - case r'no_permission': return AssetIdErrorReason.noPermission; - case r'not_found': return AssetIdErrorReason.notFound; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AssetIdErrorReasonTypeTransformer] instance. - static AssetIdErrorReasonTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/asset_ids_dto.dart b/mobile/openapi/lib/model/asset_ids_dto.dart index 85e5cc3aee..a8d6eddef2 100644 --- a/mobile/openapi/lib/model/asset_ids_dto.dart +++ b/mobile/openapi/lib/model/asset_ids_dto.dart @@ -1,102 +1,41 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetIdsDto { - /// Returns a new [AssetIdsDto] instance. - AssetIdsDto({ - this.assetIds = const [], - }); +final class AssetIdsDto { + const AssetIdsDto({required this.assetIds}); /// Asset IDs - List assetIds; + final List assetIds; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetIdsDto && - _deepEquality.equals(other.assetIds, assetIds); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetIds.hashCode); - - @override - String toString() => 'AssetIdsDto[assetIds=$assetIds]'; + static AssetIdsDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(assetIds: ((json[r'assetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!); + } Map toJson() { final json = {}; - json[r'assetIds'] = this.assetIds; + json[r'assetIds'] = assetIds; return json; } - /// Returns a new [AssetIdsDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetIdsDto? fromJson(dynamic value) { - upgradeDto(value, "AssetIdsDto"); - if (value is Map) { - final json = value.cast(); - - return AssetIdsDto( - assetIds: json[r'assetIds'] is Iterable - ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + AssetIdsDto copyWith({List? assetIds}) { + return .new(assetIds: assetIds ?? this.assetIds); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetIdsDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetIdsDto && const DeepCollectionEquality().equals(assetIds, other.assetIds)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetIdsDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(assetIds)]); } - // maps a json object with a list of AssetIdsDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetIdsDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetIds', - }; + @override + String toString() => 'AssetIdsDto(assetIds=$assetIds)'; } - diff --git a/mobile/openapi/lib/model/asset_ids_response_dto.dart b/mobile/openapi/lib/model/asset_ids_response_dto.dart index cafe1b21b9..67b0150530 100644 --- a/mobile/openapi/lib/model/asset_ids_response_dto.dart +++ b/mobile/openapi/lib/model/asset_ids_response_dto.dart @@ -1,126 +1,60 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetIdsResponseDto { - /// Returns a new [AssetIdsResponseDto] instance. - AssetIdsResponseDto({ - required this.assetId, - this.error, - required this.success, - }); +final class AssetIdsResponseDto { + const AssetIdsResponseDto({required this.assetId, this.error, required this.success}); /// Asset ID - String assetId; + final String assetId; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetIdErrorReason? error; + final AssetIdErrorReason? error; /// Whether operation succeeded - bool success; + final bool success; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetIdsResponseDto && - other.assetId == assetId && - other.error == error && - other.success == success; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (error == null ? 0 : error!.hashCode) + - (success.hashCode); - - @override - String toString() => 'AssetIdsResponseDto[assetId=$assetId, error=$error, success=$success]'; + static AssetIdsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetId: json[r'assetId'] as String, + error: AssetIdErrorReason.fromJson(json[r'error']), + success: json[r'success'] as bool, + ); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - if (this.error != null) { - json[r'error'] = this.error; - } else { - // json[r'error'] = null; + json[r'assetId'] = assetId; + if (error != null) { + json[r'error'] = error!.toJson(); } - json[r'success'] = this.success; + json[r'success'] = success; return json; } - /// Returns a new [AssetIdsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetIdsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetIdsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetIdsResponseDto( - assetId: mapValueOfType(json, r'assetId')!, - error: AssetIdErrorReason.fromJson(json[r'error']), - success: mapValueOfType(json, r'success')!, - ); - } - return null; + AssetIdsResponseDto copyWith({String? assetId, Object? error = _undefined, bool? success}) { + return .new( + assetId: assetId ?? this.assetId, + error: identical(error, _undefined) ? this.error : error as AssetIdErrorReason?, + success: success ?? this.success, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetIdsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetIdsResponseDto && assetId == other.assetId && error == other.error && success == other.success); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetIdsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, error, success]); } - // maps a json object with a list of AssetIdsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetIdsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'success', - }; + @override + String toString() => 'AssetIdsResponseDto(assetId=$assetId, error=$error, success=$success)'; } - diff --git a/mobile/openapi/lib/model/asset_job_name.dart b/mobile/openapi/lib/model/asset_job_name.dart index 7625677bb5..bc9cd86796 100644 --- a/mobile/openapi/lib/model/asset_job_name.dart +++ b/mobile/openapi/lib/model/asset_job_name.dart @@ -1,91 +1,30 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Job name -class AssetJobName { - /// Instantiate a new enum with the provided [value]. +enum AssetJobName { + refreshFaces._(r'refresh-faces'), + refreshMetadata._(r'refresh-metadata'), + regenerateThumbnail._(r'regenerate-thumbnail'), + transcodeVideo._(r'transcode-video'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AssetJobName._(this.value); - /// The underlying value of this enum member. final String value; + static AssetJobName? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const refreshFaces = AssetJobName._(r'refresh-faces'); - static const refreshMetadata = AssetJobName._(r'refresh-metadata'); - static const regenerateThumbnail = AssetJobName._(r'regenerate-thumbnail'); - static const transcodeVideo = AssetJobName._(r'transcode-video'); - - /// List of all possible values in this [enum][AssetJobName]. - static const values = [ - refreshFaces, - refreshMetadata, - regenerateThumbnail, - transcodeVideo, - ]; - - static AssetJobName? fromJson(dynamic value) => AssetJobNameTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetJobName.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AssetJobName] to String, -/// and [decode] dynamic data back to [AssetJobName]. -class AssetJobNameTypeTransformer { - factory AssetJobNameTypeTransformer() => _instance ??= const AssetJobNameTypeTransformer._(); - - const AssetJobNameTypeTransformer._(); - - String encode(AssetJobName data) => data.value; - - /// Decodes a [dynamic value][data] to a AssetJobName. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AssetJobName? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'refresh-faces': return AssetJobName.refreshFaces; - case r'refresh-metadata': return AssetJobName.refreshMetadata; - case r'regenerate-thumbnail': return AssetJobName.regenerateThumbnail; - case r'transcode-video': return AssetJobName.transcodeVideo; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AssetJobNameTypeTransformer] instance. - static AssetJobNameTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/asset_jobs_dto.dart b/mobile/openapi/lib/model/asset_jobs_dto.dart index 5085e3820c..6b7956ae93 100644 --- a/mobile/openapi/lib/model/asset_jobs_dto.dart +++ b/mobile/openapi/lib/model/asset_jobs_dto.dart @@ -1,110 +1,49 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetJobsDto { - /// Returns a new [AssetJobsDto] instance. - AssetJobsDto({ - this.assetIds = const [], - required this.name, - }); +final class AssetJobsDto { + const AssetJobsDto({required this.assetIds, required this.name}); /// Asset IDs - List assetIds; + final List assetIds; - AssetJobName name; + final AssetJobName name; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetJobsDto && - _deepEquality.equals(other.assetIds, assetIds) && - other.name == name; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetIds.hashCode) + - (name.hashCode); - - @override - String toString() => 'AssetJobsDto[assetIds=$assetIds, name=$name]'; + static AssetJobsDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetIds: ((json[r'assetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + name: (AssetJobName.fromJson(json[r'name']))!, + ); + } Map toJson() { final json = {}; - json[r'assetIds'] = this.assetIds; - json[r'name'] = this.name; + json[r'assetIds'] = assetIds; + json[r'name'] = name.toJson(); return json; } - /// Returns a new [AssetJobsDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetJobsDto? fromJson(dynamic value) { - upgradeDto(value, "AssetJobsDto"); - if (value is Map) { - final json = value.cast(); - - return AssetJobsDto( - assetIds: json[r'assetIds'] is Iterable - ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) - : const [], - name: AssetJobName.fromJson(json[r'name'])!, - ); - } - return null; + AssetJobsDto copyWith({List? assetIds, AssetJobName? name}) { + return .new(assetIds: assetIds ?? this.assetIds, name: name ?? this.name); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetJobsDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetJobsDto && + const DeepCollectionEquality().equals(assetIds, other.assetIds) && + name == other.name); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetJobsDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(assetIds), name]); } - // maps a json object with a list of AssetJobsDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetJobsDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetIds', - 'name', - }; + @override + String toString() => 'AssetJobsDto(assetIds=$assetIds, name=$name)'; } - diff --git a/mobile/openapi/lib/model/asset_media_create_dto.dart b/mobile/openapi/lib/model/asset_media_create_dto.dart new file mode 100644 index 0000000000..21ac733098 --- /dev/null +++ b/mobile/openapi/lib/model/asset_media_create_dto.dart @@ -0,0 +1,160 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +part of openapi.api; + +final class AssetMediaCreateDto { + const AssetMediaCreateDto({ + required this.assetData, + this.duration, + required this.fileCreatedAt, + required this.fileModifiedAt, + this.filename, + this.isFavorite, + this.livePhotoVideoId, + this.metadata, + this.sidecarData, + this.visibility, + }); + + /// Asset file data + final MultipartFile assetData; + + /// Duration in milliseconds (for videos) + final int? duration; + + /// File creation date + final DateTime fileCreatedAt; + + /// File modification date + final DateTime fileModifiedAt; + + /// Filename + final String? filename; + + /// Mark as favorite + final bool? isFavorite; + + /// Live photo video ID + final String? livePhotoVideoId; + + /// Asset metadata items + final List? metadata; + + /// Sidecar file data + final MultipartFile? sidecarData; + + final AssetVisibility? visibility; + + static const _undefined = Object(); + + static AssetMediaCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetData: (json[r'assetData'] as MultipartFile?)!, + duration: (json[r'duration'] as int?), + fileCreatedAt: DateTime.parse(json[r'fileCreatedAt'] as String), + fileModifiedAt: DateTime.parse(json[r'fileModifiedAt'] as String), + filename: (json[r'filename'] as String?), + isFavorite: (json[r'isFavorite'] as bool?), + livePhotoVideoId: (json[r'livePhotoVideoId'] as String?), + metadata: (json[r'metadata'] as List?) + ?.map(($e) => (AssetMetadataUpsertItemDto.fromJson($e))!) + .toList(growable: false), + sidecarData: (json[r'sidecarData'] as MultipartFile?), + visibility: AssetVisibility.fromJson(json[r'visibility']), + ); + } + + Map toJson() { + final json = {}; + json[r'assetData'] = assetData; + if (duration != null) { + json[r'duration'] = duration!; + } + json[r'fileCreatedAt'] = fileCreatedAt.toUtc().toIso8601String(); + json[r'fileModifiedAt'] = fileModifiedAt.toUtc().toIso8601String(); + if (filename != null) { + json[r'filename'] = filename!; + } + if (isFavorite != null) { + json[r'isFavorite'] = isFavorite!; + } + if (livePhotoVideoId != null) { + json[r'livePhotoVideoId'] = livePhotoVideoId!; + } + if (metadata != null) { + json[r'metadata'] = metadata!.map(($e) => $e.toJson()).toList(growable: false); + } + if (sidecarData != null) { + json[r'sidecarData'] = sidecarData!; + } + if (visibility != null) { + json[r'visibility'] = visibility!.toJson(); + } + return json; + } + + AssetMediaCreateDto copyWith({ + MultipartFile? assetData, + Object? duration = _undefined, + DateTime? fileCreatedAt, + DateTime? fileModifiedAt, + Object? filename = _undefined, + Object? isFavorite = _undefined, + Object? livePhotoVideoId = _undefined, + Object? metadata = _undefined, + Object? sidecarData = _undefined, + Object? visibility = _undefined, + }) { + return .new( + assetData: assetData ?? this.assetData, + duration: identical(duration, _undefined) ? this.duration : duration as int?, + fileCreatedAt: fileCreatedAt ?? this.fileCreatedAt, + fileModifiedAt: fileModifiedAt ?? this.fileModifiedAt, + filename: identical(filename, _undefined) ? this.filename : filename as String?, + isFavorite: identical(isFavorite, _undefined) ? this.isFavorite : isFavorite as bool?, + livePhotoVideoId: identical(livePhotoVideoId, _undefined) ? this.livePhotoVideoId : livePhotoVideoId as String?, + metadata: identical(metadata, _undefined) ? this.metadata : metadata as List?, + sidecarData: identical(sidecarData, _undefined) ? this.sidecarData : sidecarData as MultipartFile?, + visibility: identical(visibility, _undefined) ? this.visibility : visibility as AssetVisibility?, + ); + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetMediaCreateDto && + assetData == other.assetData && + duration == other.duration && + fileCreatedAt == other.fileCreatedAt && + fileModifiedAt == other.fileModifiedAt && + filename == other.filename && + isFavorite == other.isFavorite && + livePhotoVideoId == other.livePhotoVideoId && + const DeepCollectionEquality().equals(metadata, other.metadata) && + sidecarData == other.sidecarData && + visibility == other.visibility); + } + + @override + int get hashCode { + return Object.hashAll([ + assetData, + duration, + fileCreatedAt, + fileModifiedAt, + filename, + isFavorite, + livePhotoVideoId, + const DeepCollectionEquality().hash(metadata), + sidecarData, + visibility, + ]); + } + + @override + String toString() => + 'AssetMediaCreateDto(assetData=$assetData, duration=$duration, fileCreatedAt=$fileCreatedAt, fileModifiedAt=$fileModifiedAt, filename=$filename, isFavorite=$isFavorite, livePhotoVideoId=$livePhotoVideoId, metadata=$metadata, sidecarData=$sidecarData, visibility=$visibility)'; +} diff --git a/mobile/openapi/lib/model/asset_media_response_dto.dart b/mobile/openapi/lib/model/asset_media_response_dto.dart index 6dc5cd3c92..1bb9365bda 100644 --- a/mobile/openapi/lib/model/asset_media_response_dto.dart +++ b/mobile/openapi/lib/model/asset_media_response_dto.dart @@ -1,108 +1,43 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetMediaResponseDto { - /// Returns a new [AssetMediaResponseDto] instance. - AssetMediaResponseDto({ - required this.id, - required this.status, - }); +final class AssetMediaResponseDto { + const AssetMediaResponseDto({required this.id, required this.status}); /// Asset media ID - String id; + final String id; - AssetMediaStatus status; + final AssetMediaStatus status; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetMediaResponseDto && - other.id == id && - other.status == status; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (id.hashCode) + - (status.hashCode); - - @override - String toString() => 'AssetMediaResponseDto[id=$id, status=$status]'; + static AssetMediaResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(id: json[r'id'] as String, status: (AssetMediaStatus.fromJson(json[r'status']))!); + } Map toJson() { final json = {}; - json[r'id'] = this.id; - json[r'status'] = this.status; + json[r'id'] = id; + json[r'status'] = status.toJson(); return json; } - /// Returns a new [AssetMediaResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetMediaResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetMediaResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetMediaResponseDto( - id: mapValueOfType(json, r'id')!, - status: AssetMediaStatus.fromJson(json[r'status'])!, - ); - } - return null; + AssetMediaResponseDto copyWith({String? id, AssetMediaStatus? status}) { + return .new(id: id ?? this.id, status: status ?? this.status); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetMediaResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is AssetMediaResponseDto && id == other.id && status == other.status); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetMediaResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([id, status]); } - // maps a json object with a list of AssetMediaResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetMediaResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'id', - 'status', - }; + @override + String toString() => 'AssetMediaResponseDto(id=$id, status=$status)'; } - diff --git a/mobile/openapi/lib/model/asset_media_size.dart b/mobile/openapi/lib/model/asset_media_size.dart index ed7a72a613..40b88d24fd 100644 --- a/mobile/openapi/lib/model/asset_media_size.dart +++ b/mobile/openapi/lib/model/asset_media_size.dart @@ -1,91 +1,30 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Asset media size -class AssetMediaSize { - /// Instantiate a new enum with the provided [value]. +enum AssetMediaSize { + original._(r'original'), + fullsize._(r'fullsize'), + preview._(r'preview'), + thumbnail._(r'thumbnail'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AssetMediaSize._(this.value); - /// The underlying value of this enum member. final String value; + static AssetMediaSize? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const original = AssetMediaSize._(r'original'); - static const fullsize = AssetMediaSize._(r'fullsize'); - static const preview = AssetMediaSize._(r'preview'); - static const thumbnail = AssetMediaSize._(r'thumbnail'); - - /// List of all possible values in this [enum][AssetMediaSize]. - static const values = [ - original, - fullsize, - preview, - thumbnail, - ]; - - static AssetMediaSize? fromJson(dynamic value) => AssetMediaSizeTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetMediaSize.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AssetMediaSize] to String, -/// and [decode] dynamic data back to [AssetMediaSize]. -class AssetMediaSizeTypeTransformer { - factory AssetMediaSizeTypeTransformer() => _instance ??= const AssetMediaSizeTypeTransformer._(); - - const AssetMediaSizeTypeTransformer._(); - - String encode(AssetMediaSize data) => data.value; - - /// Decodes a [dynamic value][data] to a AssetMediaSize. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AssetMediaSize? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'original': return AssetMediaSize.original; - case r'fullsize': return AssetMediaSize.fullsize; - case r'preview': return AssetMediaSize.preview; - case r'thumbnail': return AssetMediaSize.thumbnail; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AssetMediaSizeTypeTransformer] instance. - static AssetMediaSizeTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/asset_media_status.dart b/mobile/openapi/lib/model/asset_media_status.dart index 44438f15ab..759c6a5da0 100644 --- a/mobile/openapi/lib/model/asset_media_status.dart +++ b/mobile/openapi/lib/model/asset_media_status.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Upload status -class AssetMediaStatus { - /// Instantiate a new enum with the provided [value]. +enum AssetMediaStatus { + created._(r'created'), + duplicate._(r'duplicate'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AssetMediaStatus._(this.value); - /// The underlying value of this enum member. final String value; + static AssetMediaStatus? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const created = AssetMediaStatus._(r'created'); - static const duplicate = AssetMediaStatus._(r'duplicate'); - - /// List of all possible values in this [enum][AssetMediaStatus]. - static const values = [ - created, - duplicate, - ]; - - static AssetMediaStatus? fromJson(dynamic value) => AssetMediaStatusTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetMediaStatus.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AssetMediaStatus] to String, -/// and [decode] dynamic data back to [AssetMediaStatus]. -class AssetMediaStatusTypeTransformer { - factory AssetMediaStatusTypeTransformer() => _instance ??= const AssetMediaStatusTypeTransformer._(); - - const AssetMediaStatusTypeTransformer._(); - - String encode(AssetMediaStatus data) => data.value; - - /// Decodes a [dynamic value][data] to a AssetMediaStatus. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AssetMediaStatus? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'created': return AssetMediaStatus.created; - case r'duplicate': return AssetMediaStatus.duplicate; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AssetMediaStatusTypeTransformer] instance. - static AssetMediaStatusTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/asset_metadata_bulk_delete_dto.dart b/mobile/openapi/lib/model/asset_metadata_bulk_delete_dto.dart index 6376ebc531..4ee4acf470 100644 --- a/mobile/openapi/lib/model/asset_metadata_bulk_delete_dto.dart +++ b/mobile/openapi/lib/model/asset_metadata_bulk_delete_dto.dart @@ -1,100 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetMetadataBulkDeleteDto { - /// Returns a new [AssetMetadataBulkDeleteDto] instance. - AssetMetadataBulkDeleteDto({ - this.items = const [], - }); +final class AssetMetadataBulkDeleteDto { + const AssetMetadataBulkDeleteDto({required this.items}); /// Metadata items to delete - List items; + final List items; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetMetadataBulkDeleteDto && - _deepEquality.equals(other.items, items); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (items.hashCode); - - @override - String toString() => 'AssetMetadataBulkDeleteDto[items=$items]'; + static AssetMetadataBulkDeleteDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + items: ((json[r'items'] as List?) + ?.map(($e) => (AssetMetadataBulkDeleteItemDto.fromJson($e))!) + .toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'items'] = this.items; + json[r'items'] = items.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [AssetMetadataBulkDeleteDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetMetadataBulkDeleteDto? fromJson(dynamic value) { - upgradeDto(value, "AssetMetadataBulkDeleteDto"); - if (value is Map) { - final json = value.cast(); - - return AssetMetadataBulkDeleteDto( - items: AssetMetadataBulkDeleteItemDto.listFromJson(json[r'items']), - ); - } - return null; + AssetMetadataBulkDeleteDto copyWith({List? items}) { + return .new(items: items ?? this.items); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetMetadataBulkDeleteDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetMetadataBulkDeleteDto && const DeepCollectionEquality().equals(items, other.items)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetMetadataBulkDeleteDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(items)]); } - // maps a json object with a list of AssetMetadataBulkDeleteDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetMetadataBulkDeleteDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'items', - }; + @override + String toString() => 'AssetMetadataBulkDeleteDto(items=$items)'; } - diff --git a/mobile/openapi/lib/model/asset_metadata_bulk_delete_item_dto.dart b/mobile/openapi/lib/model/asset_metadata_bulk_delete_item_dto.dart index 90417b79e0..bbd2b31f27 100644 --- a/mobile/openapi/lib/model/asset_metadata_bulk_delete_item_dto.dart +++ b/mobile/openapi/lib/model/asset_metadata_bulk_delete_item_dto.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetMetadataBulkDeleteItemDto { - /// Returns a new [AssetMetadataBulkDeleteItemDto] instance. - AssetMetadataBulkDeleteItemDto({ - required this.assetId, - required this.key, - }); +final class AssetMetadataBulkDeleteItemDto { + const AssetMetadataBulkDeleteItemDto({required this.assetId, required this.key}); /// Asset ID - String assetId; + final String assetId; /// Metadata key - String key; + final String key; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetMetadataBulkDeleteItemDto && - other.assetId == assetId && - other.key == key; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (key.hashCode); - - @override - String toString() => 'AssetMetadataBulkDeleteItemDto[assetId=$assetId, key=$key]'; + static AssetMetadataBulkDeleteItemDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(assetId: json[r'assetId'] as String, key: json[r'key'] as String); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'key'] = this.key; + json[r'assetId'] = assetId; + json[r'key'] = key; return json; } - /// Returns a new [AssetMetadataBulkDeleteItemDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetMetadataBulkDeleteItemDto? fromJson(dynamic value) { - upgradeDto(value, "AssetMetadataBulkDeleteItemDto"); - if (value is Map) { - final json = value.cast(); - - return AssetMetadataBulkDeleteItemDto( - assetId: mapValueOfType(json, r'assetId')!, - key: mapValueOfType(json, r'key')!, - ); - } - return null; + AssetMetadataBulkDeleteItemDto copyWith({String? assetId, String? key}) { + return .new(assetId: assetId ?? this.assetId, key: key ?? this.key); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetMetadataBulkDeleteItemDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetMetadataBulkDeleteItemDto && assetId == other.assetId && key == other.key); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetMetadataBulkDeleteItemDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, key]); } - // maps a json object with a list of AssetMetadataBulkDeleteItemDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetMetadataBulkDeleteItemDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'key', - }; + @override + String toString() => 'AssetMetadataBulkDeleteItemDto(assetId=$assetId, key=$key)'; } - diff --git a/mobile/openapi/lib/model/asset_metadata_bulk_response_dto.dart b/mobile/openapi/lib/model/asset_metadata_bulk_response_dto.dart index 3e16ed8721..4ac55aff6c 100644 --- a/mobile/openapi/lib/model/asset_metadata_bulk_response_dto.dart +++ b/mobile/openapi/lib/model/asset_metadata_bulk_response_dto.dart @@ -1,129 +1,77 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetMetadataBulkResponseDto { - /// Returns a new [AssetMetadataBulkResponseDto] instance. - AssetMetadataBulkResponseDto({ +final class AssetMetadataBulkResponseDto { + const AssetMetadataBulkResponseDto({ required this.assetId, required this.key, required this.updatedAt, - this.value = const {}, + required this.value, }); /// Asset ID - String assetId; + final String assetId; /// Metadata key - String key; + final String key; /// Last update date - DateTime updatedAt; + final DateTime updatedAt; /// Metadata value (object) - Map value; + final Map value; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetMetadataBulkResponseDto && - other.assetId == assetId && - other.key == key && - other.updatedAt == updatedAt && - _deepEquality.equals(other.value, value); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (key.hashCode) + - (updatedAt.hashCode) + - (value.hashCode); - - @override - String toString() => 'AssetMetadataBulkResponseDto[assetId=$assetId, key=$key, updatedAt=$updatedAt, value=$value]'; + static AssetMetadataBulkResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetId: json[r'assetId'] as String, + key: json[r'key'] as String, + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + value: ((json[r'value'] as Map?)?.cast())!, + ); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'key'] = this.key; - json[r'updatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAt.millisecondsSinceEpoch - : this.updatedAt.toUtc().toIso8601String(); - json[r'value'] = this.value; + json[r'assetId'] = assetId; + json[r'key'] = key; + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); + json[r'value'] = value; return json; } - /// Returns a new [AssetMetadataBulkResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetMetadataBulkResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetMetadataBulkResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetMetadataBulkResponseDto( - assetId: mapValueOfType(json, r'assetId')!, - key: mapValueOfType(json, r'key')!, - updatedAt: mapDateTime(json, r'updatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - value: mapCastOfType(json, r'value')!, - ); - } - return null; + AssetMetadataBulkResponseDto copyWith({ + String? assetId, + String? key, + DateTime? updatedAt, + Map? value, + }) { + return .new( + assetId: assetId ?? this.assetId, + key: key ?? this.key, + updatedAt: updatedAt ?? this.updatedAt, + value: value ?? this.value, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetMetadataBulkResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetMetadataBulkResponseDto && + assetId == other.assetId && + key == other.key && + updatedAt == other.updatedAt && + const DeepCollectionEquality().equals(value, other.value)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetMetadataBulkResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, key, updatedAt, const DeepCollectionEquality().hash(value)]); } - // maps a json object with a list of AssetMetadataBulkResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetMetadataBulkResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'key', - 'updatedAt', - 'value', - }; + @override + String toString() => 'AssetMetadataBulkResponseDto(assetId=$assetId, key=$key, updatedAt=$updatedAt, value=$value)'; } - diff --git a/mobile/openapi/lib/model/asset_metadata_bulk_upsert_dto.dart b/mobile/openapi/lib/model/asset_metadata_bulk_upsert_dto.dart index a5e770b02a..80f0ffdd83 100644 --- a/mobile/openapi/lib/model/asset_metadata_bulk_upsert_dto.dart +++ b/mobile/openapi/lib/model/asset_metadata_bulk_upsert_dto.dart @@ -1,100 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetMetadataBulkUpsertDto { - /// Returns a new [AssetMetadataBulkUpsertDto] instance. - AssetMetadataBulkUpsertDto({ - this.items = const [], - }); +final class AssetMetadataBulkUpsertDto { + const AssetMetadataBulkUpsertDto({required this.items}); /// Metadata items to upsert - List items; + final List items; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetMetadataBulkUpsertDto && - _deepEquality.equals(other.items, items); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (items.hashCode); - - @override - String toString() => 'AssetMetadataBulkUpsertDto[items=$items]'; + static AssetMetadataBulkUpsertDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + items: ((json[r'items'] as List?) + ?.map(($e) => (AssetMetadataBulkUpsertItemDto.fromJson($e))!) + .toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'items'] = this.items; + json[r'items'] = items.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [AssetMetadataBulkUpsertDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetMetadataBulkUpsertDto? fromJson(dynamic value) { - upgradeDto(value, "AssetMetadataBulkUpsertDto"); - if (value is Map) { - final json = value.cast(); - - return AssetMetadataBulkUpsertDto( - items: AssetMetadataBulkUpsertItemDto.listFromJson(json[r'items']), - ); - } - return null; + AssetMetadataBulkUpsertDto copyWith({List? items}) { + return .new(items: items ?? this.items); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetMetadataBulkUpsertDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetMetadataBulkUpsertDto && const DeepCollectionEquality().equals(items, other.items)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetMetadataBulkUpsertDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(items)]); } - // maps a json object with a list of AssetMetadataBulkUpsertDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetMetadataBulkUpsertDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'items', - }; + @override + String toString() => 'AssetMetadataBulkUpsertDto(items=$items)'; } - diff --git a/mobile/openapi/lib/model/asset_metadata_bulk_upsert_item_dto.dart b/mobile/openapi/lib/model/asset_metadata_bulk_upsert_item_dto.dart index e4eab08bf1..92a9c961c9 100644 --- a/mobile/openapi/lib/model/asset_metadata_bulk_upsert_item_dto.dart +++ b/mobile/openapi/lib/model/asset_metadata_bulk_upsert_item_dto.dart @@ -1,118 +1,56 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetMetadataBulkUpsertItemDto { - /// Returns a new [AssetMetadataBulkUpsertItemDto] instance. - AssetMetadataBulkUpsertItemDto({ - required this.assetId, - required this.key, - this.value = const {}, - }); +final class AssetMetadataBulkUpsertItemDto { + const AssetMetadataBulkUpsertItemDto({required this.assetId, required this.key, required this.value}); /// Asset ID - String assetId; + final String assetId; /// Metadata key - String key; + final String key; /// Metadata value (object) - Map value; + final Map value; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetMetadataBulkUpsertItemDto && - other.assetId == assetId && - other.key == key && - _deepEquality.equals(other.value, value); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (key.hashCode) + - (value.hashCode); - - @override - String toString() => 'AssetMetadataBulkUpsertItemDto[assetId=$assetId, key=$key, value=$value]'; + static AssetMetadataBulkUpsertItemDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetId: json[r'assetId'] as String, + key: json[r'key'] as String, + value: ((json[r'value'] as Map?)?.cast())!, + ); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'key'] = this.key; - json[r'value'] = this.value; + json[r'assetId'] = assetId; + json[r'key'] = key; + json[r'value'] = value; return json; } - /// Returns a new [AssetMetadataBulkUpsertItemDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetMetadataBulkUpsertItemDto? fromJson(dynamic value) { - upgradeDto(value, "AssetMetadataBulkUpsertItemDto"); - if (value is Map) { - final json = value.cast(); - - return AssetMetadataBulkUpsertItemDto( - assetId: mapValueOfType(json, r'assetId')!, - key: mapValueOfType(json, r'key')!, - value: mapCastOfType(json, r'value')!, - ); - } - return null; + AssetMetadataBulkUpsertItemDto copyWith({String? assetId, String? key, Map? value}) { + return .new(assetId: assetId ?? this.assetId, key: key ?? this.key, value: value ?? this.value); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetMetadataBulkUpsertItemDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetMetadataBulkUpsertItemDto && + assetId == other.assetId && + key == other.key && + const DeepCollectionEquality().equals(value, other.value)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetMetadataBulkUpsertItemDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, key, const DeepCollectionEquality().hash(value)]); } - // maps a json object with a list of AssetMetadataBulkUpsertItemDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetMetadataBulkUpsertItemDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'key', - 'value', - }; + @override + String toString() => 'AssetMetadataBulkUpsertItemDto(assetId=$assetId, key=$key, value=$value)'; } - diff --git a/mobile/openapi/lib/model/asset_metadata_response_dto.dart b/mobile/openapi/lib/model/asset_metadata_response_dto.dart index d3562f5a48..7df8793216 100644 --- a/mobile/openapi/lib/model/asset_metadata_response_dto.dart +++ b/mobile/openapi/lib/model/asset_metadata_response_dto.dart @@ -1,120 +1,56 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetMetadataResponseDto { - /// Returns a new [AssetMetadataResponseDto] instance. - AssetMetadataResponseDto({ - required this.key, - required this.updatedAt, - this.value = const {}, - }); +final class AssetMetadataResponseDto { + const AssetMetadataResponseDto({required this.key, required this.updatedAt, required this.value}); /// Metadata key - String key; + final String key; /// Last update date - DateTime updatedAt; + final DateTime updatedAt; /// Metadata value (object) - Map value; + final Map value; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetMetadataResponseDto && - other.key == key && - other.updatedAt == updatedAt && - _deepEquality.equals(other.value, value); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (key.hashCode) + - (updatedAt.hashCode) + - (value.hashCode); - - @override - String toString() => 'AssetMetadataResponseDto[key=$key, updatedAt=$updatedAt, value=$value]'; + static AssetMetadataResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + key: json[r'key'] as String, + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + value: ((json[r'value'] as Map?)?.cast())!, + ); + } Map toJson() { final json = {}; - json[r'key'] = this.key; - json[r'updatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAt.millisecondsSinceEpoch - : this.updatedAt.toUtc().toIso8601String(); - json[r'value'] = this.value; + json[r'key'] = key; + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); + json[r'value'] = value; return json; } - /// Returns a new [AssetMetadataResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetMetadataResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetMetadataResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetMetadataResponseDto( - key: mapValueOfType(json, r'key')!, - updatedAt: mapDateTime(json, r'updatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - value: mapCastOfType(json, r'value')!, - ); - } - return null; + AssetMetadataResponseDto copyWith({String? key, DateTime? updatedAt, Map? value}) { + return .new(key: key ?? this.key, updatedAt: updatedAt ?? this.updatedAt, value: value ?? this.value); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetMetadataResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetMetadataResponseDto && + key == other.key && + updatedAt == other.updatedAt && + const DeepCollectionEquality().equals(value, other.value)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetMetadataResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([key, updatedAt, const DeepCollectionEquality().hash(value)]); } - // maps a json object with a list of AssetMetadataResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetMetadataResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'key', - 'updatedAt', - 'value', - }; + @override + String toString() => 'AssetMetadataResponseDto(key=$key, updatedAt=$updatedAt, value=$value)'; } - diff --git a/mobile/openapi/lib/model/asset_metadata_upsert_dto.dart b/mobile/openapi/lib/model/asset_metadata_upsert_dto.dart index b1473d4826..99e465546e 100644 --- a/mobile/openapi/lib/model/asset_metadata_upsert_dto.dart +++ b/mobile/openapi/lib/model/asset_metadata_upsert_dto.dart @@ -1,100 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetMetadataUpsertDto { - /// Returns a new [AssetMetadataUpsertDto] instance. - AssetMetadataUpsertDto({ - this.items = const [], - }); +final class AssetMetadataUpsertDto { + const AssetMetadataUpsertDto({required this.items}); /// Metadata items to upsert - List items; + final List items; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetMetadataUpsertDto && - _deepEquality.equals(other.items, items); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (items.hashCode); - - @override - String toString() => 'AssetMetadataUpsertDto[items=$items]'; + static AssetMetadataUpsertDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + items: ((json[r'items'] as List?) + ?.map(($e) => (AssetMetadataUpsertItemDto.fromJson($e))!) + .toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'items'] = this.items; + json[r'items'] = items.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [AssetMetadataUpsertDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetMetadataUpsertDto? fromJson(dynamic value) { - upgradeDto(value, "AssetMetadataUpsertDto"); - if (value is Map) { - final json = value.cast(); - - return AssetMetadataUpsertDto( - items: AssetMetadataUpsertItemDto.listFromJson(json[r'items']), - ); - } - return null; + AssetMetadataUpsertDto copyWith({List? items}) { + return .new(items: items ?? this.items); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetMetadataUpsertDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetMetadataUpsertDto && const DeepCollectionEquality().equals(items, other.items)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetMetadataUpsertDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(items)]); } - // maps a json object with a list of AssetMetadataUpsertDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetMetadataUpsertDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'items', - }; + @override + String toString() => 'AssetMetadataUpsertDto(items=$items)'; } - diff --git a/mobile/openapi/lib/model/asset_metadata_upsert_item_dto.dart b/mobile/openapi/lib/model/asset_metadata_upsert_item_dto.dart index 70de1941f3..9013133f33 100644 --- a/mobile/openapi/lib/model/asset_metadata_upsert_item_dto.dart +++ b/mobile/openapi/lib/model/asset_metadata_upsert_item_dto.dart @@ -1,109 +1,47 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetMetadataUpsertItemDto { - /// Returns a new [AssetMetadataUpsertItemDto] instance. - AssetMetadataUpsertItemDto({ - required this.key, - this.value = const {}, - }); +final class AssetMetadataUpsertItemDto { + const AssetMetadataUpsertItemDto({required this.key, required this.value}); /// Metadata key - String key; + final String key; /// Metadata value (object) - Map value; + final Map value; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetMetadataUpsertItemDto && - other.key == key && - _deepEquality.equals(other.value, value); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (key.hashCode) + - (value.hashCode); - - @override - String toString() => 'AssetMetadataUpsertItemDto[key=$key, value=$value]'; + static AssetMetadataUpsertItemDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(key: json[r'key'] as String, value: ((json[r'value'] as Map?)?.cast())!); + } Map toJson() { final json = {}; - json[r'key'] = this.key; - json[r'value'] = this.value; + json[r'key'] = key; + json[r'value'] = value; return json; } - /// Returns a new [AssetMetadataUpsertItemDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetMetadataUpsertItemDto? fromJson(dynamic value) { - upgradeDto(value, "AssetMetadataUpsertItemDto"); - if (value is Map) { - final json = value.cast(); - - return AssetMetadataUpsertItemDto( - key: mapValueOfType(json, r'key')!, - value: mapCastOfType(json, r'value')!, - ); - } - return null; + AssetMetadataUpsertItemDto copyWith({String? key, Map? value}) { + return .new(key: key ?? this.key, value: value ?? this.value); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetMetadataUpsertItemDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetMetadataUpsertItemDto && + key == other.key && + const DeepCollectionEquality().equals(value, other.value)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetMetadataUpsertItemDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([key, const DeepCollectionEquality().hash(value)]); } - // maps a json object with a list of AssetMetadataUpsertItemDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetMetadataUpsertItemDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'key', - 'value', - }; + @override + String toString() => 'AssetMetadataUpsertItemDto(key=$key, value=$value)'; } - diff --git a/mobile/openapi/lib/model/asset_ocr_response_dto.dart b/mobile/openapi/lib/model/asset_ocr_response_dto.dart index c7937c6eb2..566976ffbf 100644 --- a/mobile/openapi/lib/model/asset_ocr_response_dto.dart +++ b/mobile/openapi/lib/model/asset_ocr_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetOcrResponseDto { - /// Returns a new [AssetOcrResponseDto] instance. - AssetOcrResponseDto({ +final class AssetOcrResponseDto { + const AssetOcrResponseDto({ required this.assetId, required this.boxScore, required this.id, @@ -28,179 +19,139 @@ class AssetOcrResponseDto { required this.y4, }); - String assetId; + final String assetId; /// Confidence score for text detection box - double boxScore; + final double boxScore; - String id; + final String id; /// Recognized text - String text; + final String text; /// Confidence score for text recognition - double textScore; + final double textScore; /// Normalized x coordinate of box corner 1 (0-1) - double x1; + final double x1; /// Normalized x coordinate of box corner 2 (0-1) - double x2; + final double x2; /// Normalized x coordinate of box corner 3 (0-1) - double x3; + final double x3; /// Normalized x coordinate of box corner 4 (0-1) - double x4; + final double x4; /// Normalized y coordinate of box corner 1 (0-1) - double y1; + final double y1; /// Normalized y coordinate of box corner 2 (0-1) - double y2; + final double y2; /// Normalized y coordinate of box corner 3 (0-1) - double y3; + final double y3; /// Normalized y coordinate of box corner 4 (0-1) - double y4; + final double y4; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetOcrResponseDto && - other.assetId == assetId && - other.boxScore == boxScore && - other.id == id && - other.text == text && - other.textScore == textScore && - other.x1 == x1 && - other.x2 == x2 && - other.x3 == x3 && - other.x4 == x4 && - other.y1 == y1 && - other.y2 == y2 && - other.y3 == y3 && - other.y4 == y4; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (boxScore.hashCode) + - (id.hashCode) + - (text.hashCode) + - (textScore.hashCode) + - (x1.hashCode) + - (x2.hashCode) + - (x3.hashCode) + - (x4.hashCode) + - (y1.hashCode) + - (y2.hashCode) + - (y3.hashCode) + - (y4.hashCode); - - @override - String toString() => 'AssetOcrResponseDto[assetId=$assetId, boxScore=$boxScore, id=$id, text=$text, textScore=$textScore, x1=$x1, x2=$x2, x3=$x3, x4=$x4, y1=$y1, y2=$y2, y3=$y3, y4=$y4]'; + static AssetOcrResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetId: json[r'assetId'] as String, + boxScore: (json[r'boxScore'] as num).toDouble(), + id: json[r'id'] as String, + text: json[r'text'] as String, + textScore: (json[r'textScore'] as num).toDouble(), + x1: (json[r'x1'] as num).toDouble(), + x2: (json[r'x2'] as num).toDouble(), + x3: (json[r'x3'] as num).toDouble(), + x4: (json[r'x4'] as num).toDouble(), + y1: (json[r'y1'] as num).toDouble(), + y2: (json[r'y2'] as num).toDouble(), + y3: (json[r'y3'] as num).toDouble(), + y4: (json[r'y4'] as num).toDouble(), + ); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'boxScore'] = this.boxScore; - json[r'id'] = this.id; - json[r'text'] = this.text; - json[r'textScore'] = this.textScore; - json[r'x1'] = this.x1; - json[r'x2'] = this.x2; - json[r'x3'] = this.x3; - json[r'x4'] = this.x4; - json[r'y1'] = this.y1; - json[r'y2'] = this.y2; - json[r'y3'] = this.y3; - json[r'y4'] = this.y4; + json[r'assetId'] = assetId; + json[r'boxScore'] = boxScore; + json[r'id'] = id; + json[r'text'] = text; + json[r'textScore'] = textScore; + json[r'x1'] = x1; + json[r'x2'] = x2; + json[r'x3'] = x3; + json[r'x4'] = x4; + json[r'y1'] = y1; + json[r'y2'] = y2; + json[r'y3'] = y3; + json[r'y4'] = y4; return json; } - /// Returns a new [AssetOcrResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetOcrResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetOcrResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetOcrResponseDto( - assetId: mapValueOfType(json, r'assetId')!, - boxScore: (mapValueOfType(json, r'boxScore')!).toDouble(), - id: mapValueOfType(json, r'id')!, - text: mapValueOfType(json, r'text')!, - textScore: (mapValueOfType(json, r'textScore')!).toDouble(), - x1: (mapValueOfType(json, r'x1')!).toDouble(), - x2: (mapValueOfType(json, r'x2')!).toDouble(), - x3: (mapValueOfType(json, r'x3')!).toDouble(), - x4: (mapValueOfType(json, r'x4')!).toDouble(), - y1: (mapValueOfType(json, r'y1')!).toDouble(), - y2: (mapValueOfType(json, r'y2')!).toDouble(), - y3: (mapValueOfType(json, r'y3')!).toDouble(), - y4: (mapValueOfType(json, r'y4')!).toDouble(), - ); - } - return null; + AssetOcrResponseDto copyWith({ + String? assetId, + double? boxScore, + String? id, + String? text, + double? textScore, + double? x1, + double? x2, + double? x3, + double? x4, + double? y1, + double? y2, + double? y3, + double? y4, + }) { + return .new( + assetId: assetId ?? this.assetId, + boxScore: boxScore ?? this.boxScore, + id: id ?? this.id, + text: text ?? this.text, + textScore: textScore ?? this.textScore, + x1: x1 ?? this.x1, + x2: x2 ?? this.x2, + x3: x3 ?? this.x3, + x4: x4 ?? this.x4, + y1: y1 ?? this.y1, + y2: y2 ?? this.y2, + y3: y3 ?? this.y3, + y4: y4 ?? this.y4, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetOcrResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetOcrResponseDto && + assetId == other.assetId && + boxScore == other.boxScore && + id == other.id && + text == other.text && + textScore == other.textScore && + x1 == other.x1 && + x2 == other.x2 && + x3 == other.x3 && + x4 == other.x4 && + y1 == other.y1 && + y2 == other.y2 && + y3 == other.y3 && + y4 == other.y4); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetOcrResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, boxScore, id, text, textScore, x1, x2, x3, x4, y1, y2, y3, y4]); } - // maps a json object with a list of AssetOcrResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetOcrResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'boxScore', - 'id', - 'text', - 'textScore', - 'x1', - 'x2', - 'x3', - 'x4', - 'y1', - 'y2', - 'y3', - 'y4', - }; + @override + String toString() => + 'AssetOcrResponseDto(assetId=$assetId, boxScore=$boxScore, id=$id, text=$text, textScore=$textScore, x1=$x1, x2=$x2, x3=$x3, x4=$x4, y1=$y1, y2=$y2, y3=$y3, y4=$y4)'; } - diff --git a/mobile/openapi/lib/model/asset_order.dart b/mobile/openapi/lib/model/asset_order.dart index 21edd95ff6..7945bff758 100644 --- a/mobile/openapi/lib/model/asset_order.dart +++ b/mobile/openapi/lib/model/asset_order.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Asset sort order -class AssetOrder { - /// Instantiate a new enum with the provided [value]. +enum AssetOrder { + asc._(r'asc'), + desc._(r'desc'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AssetOrder._(this.value); - /// The underlying value of this enum member. final String value; + static AssetOrder? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const asc = AssetOrder._(r'asc'); - static const desc = AssetOrder._(r'desc'); - - /// List of all possible values in this [enum][AssetOrder]. - static const values = [ - asc, - desc, - ]; - - static AssetOrder? fromJson(dynamic value) => AssetOrderTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetOrder.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AssetOrder] to String, -/// and [decode] dynamic data back to [AssetOrder]. -class AssetOrderTypeTransformer { - factory AssetOrderTypeTransformer() => _instance ??= const AssetOrderTypeTransformer._(); - - const AssetOrderTypeTransformer._(); - - String encode(AssetOrder data) => data.value; - - /// Decodes a [dynamic value][data] to a AssetOrder. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AssetOrder? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'asc': return AssetOrder.asc; - case r'desc': return AssetOrder.desc; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AssetOrderTypeTransformer] instance. - static AssetOrderTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/asset_order_by.dart b/mobile/openapi/lib/model/asset_order_by.dart index 2edba961d9..5d217a5c4a 100644 --- a/mobile/openapi/lib/model/asset_order_by.dart +++ b/mobile/openapi/lib/model/asset_order_by.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Asset sorting property -class AssetOrderBy { - /// Instantiate a new enum with the provided [value]. +enum AssetOrderBy { + takenAt._(r'takenAt'), + createdAt._(r'createdAt'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AssetOrderBy._(this.value); - /// The underlying value of this enum member. final String value; + static AssetOrderBy? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const takenAt = AssetOrderBy._(r'takenAt'); - static const createdAt = AssetOrderBy._(r'createdAt'); - - /// List of all possible values in this [enum][AssetOrderBy]. - static const values = [ - takenAt, - createdAt, - ]; - - static AssetOrderBy? fromJson(dynamic value) => AssetOrderByTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetOrderBy.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AssetOrderBy] to String, -/// and [decode] dynamic data back to [AssetOrderBy]. -class AssetOrderByTypeTransformer { - factory AssetOrderByTypeTransformer() => _instance ??= const AssetOrderByTypeTransformer._(); - - const AssetOrderByTypeTransformer._(); - - String encode(AssetOrderBy data) => data.value; - - /// Decodes a [dynamic value][data] to a AssetOrderBy. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AssetOrderBy? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'takenAt': return AssetOrderBy.takenAt; - case r'createdAt': return AssetOrderBy.createdAt; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AssetOrderByTypeTransformer] instance. - static AssetOrderByTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/asset_reject_reason.dart b/mobile/openapi/lib/model/asset_reject_reason.dart index a31e1e6117..6cb3d23aaf 100644 --- a/mobile/openapi/lib/model/asset_reject_reason.dart +++ b/mobile/openapi/lib/model/asset_reject_reason.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Rejection reason if rejected -class AssetRejectReason { - /// Instantiate a new enum with the provided [value]. +enum AssetRejectReason { + duplicate._(r'duplicate'), + unsupportedFormat._(r'unsupported-format'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AssetRejectReason._(this.value); - /// The underlying value of this enum member. final String value; + static AssetRejectReason? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const duplicate = AssetRejectReason._(r'duplicate'); - static const unsupportedFormat = AssetRejectReason._(r'unsupported-format'); - - /// List of all possible values in this [enum][AssetRejectReason]. - static const values = [ - duplicate, - unsupportedFormat, - ]; - - static AssetRejectReason? fromJson(dynamic value) => AssetRejectReasonTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetRejectReason.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AssetRejectReason] to String, -/// and [decode] dynamic data back to [AssetRejectReason]. -class AssetRejectReasonTypeTransformer { - factory AssetRejectReasonTypeTransformer() => _instance ??= const AssetRejectReasonTypeTransformer._(); - - const AssetRejectReasonTypeTransformer._(); - - String encode(AssetRejectReason data) => data.value; - - /// Decodes a [dynamic value][data] to a AssetRejectReason. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AssetRejectReason? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'duplicate': return AssetRejectReason.duplicate; - case r'unsupported-format': return AssetRejectReason.unsupportedFormat; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AssetRejectReasonTypeTransformer] instance. - static AssetRejectReasonTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/asset_response_dto.dart b/mobile/openapi/lib/model/asset_response_dto.dart index eca87789ce..28b2907f2b 100644 --- a/mobile/openapi/lib/model/asset_response_dto.dart +++ b/mobile/openapi/lib/model/asset_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetResponseDto { - /// Returns a new [AssetResponseDto] instance. - AssetResponseDto({ +final class AssetResponseDto { + const AssetResponseDto({ required this.checksum, required this.createdAt, this.duplicateId, @@ -36,10 +27,10 @@ class AssetResponseDto { required this.originalPath, this.owner, required this.ownerId, - this.people = const [], + this.people, this.resized, this.stack, - this.tags = const [], + this.tags, required this.thumbhash, required this.type, required this.updatedAt, @@ -48,396 +39,369 @@ class AssetResponseDto { }); /// Base64 encoded SHA1 hash - String checksum; + final String checksum; /// The UTC timestamp when the asset was originally uploaded to Immich. - DateTime createdAt; + final DateTime createdAt; /// Duplicate group ID - String? duplicateId; + final String? duplicateId; /// Video/gif duration in milliseconds (null for static images) - /// - /// Minimum value: 0 - /// Maximum value: 2147483647 - int? duration; + final int? duration; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - ExifResponseDto? exifInfo; + final ExifResponseDto? exifInfo; /// The actual UTC timestamp when the file was created/captured, preserving timezone information. This is the authoritative timestamp for chronological sorting within timeline groups. Combined with timezone data, this can be used to determine the exact moment the photo was taken. - DateTime fileCreatedAt; + final DateTime fileCreatedAt; /// The UTC timestamp when the file was last modified on the filesystem. This reflects the last time the physical file was changed, which may be different from when the photo was originally taken. - DateTime fileModifiedAt; + final DateTime fileModifiedAt; /// Whether asset has metadata - bool hasMetadata; + final bool hasMetadata; /// Asset height - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int? height; + final int? height; /// Asset ID - String id; + final String id; /// Is archived - bool isArchived; + final bool isArchived; /// Is edited - bool isEdited; + /// Available since server v2.5.0. + final bool isEdited; /// Is favorite - bool isFavorite; + final bool isFavorite; /// Is offline - bool isOffline; + final bool isOffline; /// Is trashed - bool isTrashed; + final bool isTrashed; /// Library ID - String? libraryId; + /// Available since server v1.0.0. + @Deprecated(r'Deprecated by the Immich server API since v1.0.0.') + final String? libraryId; /// Live photo video ID - String? livePhotoVideoId; + final String? livePhotoVideoId; - /// The local date and time when the photo/video was taken, derived from EXIF metadata. This represents the photographer's local time regardless of timezone, stored as a timezone-agnostic timestamp. Used for timeline grouping by \"local\" days and months. - DateTime localDateTime; + /// The local date and time when the photo/video was taken, derived from EXIF metadata. This represents the photographer's local time regardless of timezone, stored as a timezone-agnostic timestamp. Used for timeline grouping by "local" days and months. + final DateTime localDateTime; /// Original file name - String originalFileName; + final String originalFileName; /// Original MIME type - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? originalMimeType; + final String? originalMimeType; /// Original file path - String originalPath; + final String originalPath; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - UserResponseDto? owner; + final UserResponseDto? owner; /// Owner user ID - String ownerId; + final String ownerId; - List people; + final List? people; /// Is resized - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? resized; + /// Available since server v1.0.0. + @Deprecated(r'Deprecated by the Immich server API since v1.113.0.') + final bool? resized; - AssetStackResponseDto? stack; + final AssetStackResponseDto? stack; - List tags; + final List? tags; /// Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting. - String? thumbhash; + final String? thumbhash; - AssetTypeEnum type; + final AssetTypeEnum type; /// The UTC timestamp when the asset record was last updated in the database. This is automatically maintained by the database and reflects when any field in the asset was last modified. - DateTime updatedAt; + final DateTime updatedAt; - AssetVisibility visibility; + final AssetVisibility visibility; /// Asset width - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int? width; + final int? width; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetResponseDto && - other.checksum == checksum && - other.createdAt == createdAt && - other.duplicateId == duplicateId && - other.duration == duration && - other.exifInfo == exifInfo && - other.fileCreatedAt == fileCreatedAt && - other.fileModifiedAt == fileModifiedAt && - other.hasMetadata == hasMetadata && - other.height == height && - other.id == id && - other.isArchived == isArchived && - other.isEdited == isEdited && - other.isFavorite == isFavorite && - other.isOffline == isOffline && - other.isTrashed == isTrashed && - other.libraryId == libraryId && - other.livePhotoVideoId == livePhotoVideoId && - other.localDateTime == localDateTime && - other.originalFileName == originalFileName && - other.originalMimeType == originalMimeType && - other.originalPath == originalPath && - other.owner == owner && - other.ownerId == ownerId && - _deepEquality.equals(other.people, people) && - other.resized == resized && - other.stack == stack && - _deepEquality.equals(other.tags, tags) && - other.thumbhash == thumbhash && - other.type == type && - other.updatedAt == updatedAt && - other.visibility == visibility && - other.width == width; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (checksum.hashCode) + - (createdAt.hashCode) + - (duplicateId == null ? 0 : duplicateId!.hashCode) + - (duration == null ? 0 : duration!.hashCode) + - (exifInfo == null ? 0 : exifInfo!.hashCode) + - (fileCreatedAt.hashCode) + - (fileModifiedAt.hashCode) + - (hasMetadata.hashCode) + - (height == null ? 0 : height!.hashCode) + - (id.hashCode) + - (isArchived.hashCode) + - (isEdited.hashCode) + - (isFavorite.hashCode) + - (isOffline.hashCode) + - (isTrashed.hashCode) + - (libraryId == null ? 0 : libraryId!.hashCode) + - (livePhotoVideoId == null ? 0 : livePhotoVideoId!.hashCode) + - (localDateTime.hashCode) + - (originalFileName.hashCode) + - (originalMimeType == null ? 0 : originalMimeType!.hashCode) + - (originalPath.hashCode) + - (owner == null ? 0 : owner!.hashCode) + - (ownerId.hashCode) + - (people.hashCode) + - (resized == null ? 0 : resized!.hashCode) + - (stack == null ? 0 : stack!.hashCode) + - (tags.hashCode) + - (thumbhash == null ? 0 : thumbhash!.hashCode) + - (type.hashCode) + - (updatedAt.hashCode) + - (visibility.hashCode) + - (width == null ? 0 : width!.hashCode); + static const ApiVersion isEditedAddedIn = .new(2, 5, 0); - @override - String toString() => 'AssetResponseDto[checksum=$checksum, createdAt=$createdAt, duplicateId=$duplicateId, duration=$duration, exifInfo=$exifInfo, fileCreatedAt=$fileCreatedAt, fileModifiedAt=$fileModifiedAt, hasMetadata=$hasMetadata, height=$height, id=$id, isArchived=$isArchived, isEdited=$isEdited, isFavorite=$isFavorite, isOffline=$isOffline, isTrashed=$isTrashed, libraryId=$libraryId, livePhotoVideoId=$livePhotoVideoId, localDateTime=$localDateTime, originalFileName=$originalFileName, originalMimeType=$originalMimeType, originalPath=$originalPath, owner=$owner, ownerId=$ownerId, people=$people, resized=$resized, stack=$stack, tags=$tags, thumbhash=$thumbhash, type=$type, updatedAt=$updatedAt, visibility=$visibility, width=$width]'; + static const ApiState isEditedState = .beta; + + static const ApiVersion libraryIdAddedIn = .new(1, 0, 0); + + static const ApiVersion libraryIdDeprecatedIn = .new(1, 0, 0); + + static const ApiState libraryIdState = .deprecated; + + static const ApiVersion resizedAddedIn = .new(1, 0, 0); + + static const ApiVersion resizedDeprecatedIn = .new(1, 113, 0); + + static const ApiState resizedState = .deprecated; + + static AssetResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + checksum: json[r'checksum'] as String, + createdAt: DateTime.parse(json[r'createdAt'] as String), + duplicateId: (json[r'duplicateId'] as String?), + duration: (json[r'duration'] as int?), + exifInfo: ExifResponseDto.fromJson(json[r'exifInfo']), + fileCreatedAt: DateTime.parse(json[r'fileCreatedAt'] as String), + fileModifiedAt: DateTime.parse(json[r'fileModifiedAt'] as String), + hasMetadata: json[r'hasMetadata'] as bool, + height: (json[r'height'] as int?), + id: json[r'id'] as String, + isArchived: json[r'isArchived'] as bool, + isEdited: json[r'isEdited'] as bool, + isFavorite: json[r'isFavorite'] as bool, + isOffline: json[r'isOffline'] as bool, + isTrashed: json[r'isTrashed'] as bool, + libraryId: (json[r'libraryId'] as String?), + livePhotoVideoId: (json[r'livePhotoVideoId'] as String?), + localDateTime: DateTime.parse(json[r'localDateTime'] as String), + originalFileName: json[r'originalFileName'] as String, + originalMimeType: (json[r'originalMimeType'] as String?), + originalPath: json[r'originalPath'] as String, + owner: UserResponseDto.fromJson(json[r'owner']), + ownerId: json[r'ownerId'] as String, + people: (json[r'people'] as List?)?.map(($e) => (PersonResponseDto.fromJson($e))!).toList(growable: false), + resized: (json[r'resized'] as bool?), + stack: AssetStackResponseDto.fromJson(json[r'stack']), + tags: (json[r'tags'] as List?)?.map(($e) => (TagResponseDto.fromJson($e))!).toList(growable: false), + thumbhash: (json[r'thumbhash'] as String?), + type: (AssetTypeEnum.fromJson(json[r'type']))!, + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + visibility: (AssetVisibility.fromJson(json[r'visibility']))!, + width: (json[r'width'] as int?), + ); + } Map toJson() { final json = {}; - json[r'checksum'] = this.checksum; - json[r'createdAt'] = this.createdAt.toUtc().toIso8601String(); - if (this.duplicateId != null) { - json[r'duplicateId'] = this.duplicateId; - } else { - // json[r'duplicateId'] = null; + json[r'checksum'] = checksum; + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + if (duplicateId != null) { + json[r'duplicateId'] = duplicateId!; } - if (this.duration != null) { - json[r'duration'] = this.duration; - } else { - // json[r'duration'] = null; + if (duration != null) { + json[r'duration'] = duration!; } - if (this.exifInfo != null) { - json[r'exifInfo'] = this.exifInfo; - } else { - // json[r'exifInfo'] = null; + if (exifInfo != null) { + json[r'exifInfo'] = exifInfo!.toJson(); } - json[r'fileCreatedAt'] = this.fileCreatedAt.toUtc().toIso8601String(); - json[r'fileModifiedAt'] = this.fileModifiedAt.toUtc().toIso8601String(); - json[r'hasMetadata'] = this.hasMetadata; - if (this.height != null) { - json[r'height'] = this.height; - } else { - // json[r'height'] = null; + json[r'fileCreatedAt'] = fileCreatedAt.toUtc().toIso8601String(); + json[r'fileModifiedAt'] = fileModifiedAt.toUtc().toIso8601String(); + json[r'hasMetadata'] = hasMetadata; + if (height != null) { + json[r'height'] = height!; } - json[r'id'] = this.id; - json[r'isArchived'] = this.isArchived; - json[r'isEdited'] = this.isEdited; - json[r'isFavorite'] = this.isFavorite; - json[r'isOffline'] = this.isOffline; - json[r'isTrashed'] = this.isTrashed; - if (this.libraryId != null) { - json[r'libraryId'] = this.libraryId; - } else { - // json[r'libraryId'] = null; + json[r'id'] = id; + json[r'isArchived'] = isArchived; + json[r'isEdited'] = isEdited; + json[r'isFavorite'] = isFavorite; + json[r'isOffline'] = isOffline; + json[r'isTrashed'] = isTrashed; + if (libraryId != null) { + json[r'libraryId'] = libraryId!; } - if (this.livePhotoVideoId != null) { - json[r'livePhotoVideoId'] = this.livePhotoVideoId; - } else { - // json[r'livePhotoVideoId'] = null; + if (livePhotoVideoId != null) { + json[r'livePhotoVideoId'] = livePhotoVideoId!; } - json[r'localDateTime'] = this.localDateTime.toUtc().toIso8601String(); - json[r'originalFileName'] = this.originalFileName; - if (this.originalMimeType != null) { - json[r'originalMimeType'] = this.originalMimeType; - } else { - // json[r'originalMimeType'] = null; + json[r'localDateTime'] = localDateTime.toUtc().toIso8601String(); + json[r'originalFileName'] = originalFileName; + if (originalMimeType != null) { + json[r'originalMimeType'] = originalMimeType!; } - json[r'originalPath'] = this.originalPath; - if (this.owner != null) { - json[r'owner'] = this.owner; - } else { - // json[r'owner'] = null; + json[r'originalPath'] = originalPath; + if (owner != null) { + json[r'owner'] = owner!.toJson(); } - json[r'ownerId'] = this.ownerId; - json[r'people'] = this.people; - if (this.resized != null) { - json[r'resized'] = this.resized; - } else { - // json[r'resized'] = null; + json[r'ownerId'] = ownerId; + if (people != null) { + json[r'people'] = people!.map(($e) => $e.toJson()).toList(growable: false); } - if (this.stack != null) { - json[r'stack'] = this.stack; - } else { - // json[r'stack'] = null; + if (resized != null) { + json[r'resized'] = resized!; } - json[r'tags'] = this.tags; - if (this.thumbhash != null) { - json[r'thumbhash'] = this.thumbhash; - } else { - // json[r'thumbhash'] = null; + if (stack != null) { + json[r'stack'] = stack!.toJson(); } - json[r'type'] = this.type; - json[r'updatedAt'] = this.updatedAt.toUtc().toIso8601String(); - json[r'visibility'] = this.visibility; - if (this.width != null) { - json[r'width'] = this.width; - } else { - // json[r'width'] = null; + if (tags != null) { + json[r'tags'] = tags!.map(($e) => $e.toJson()).toList(growable: false); + } + if (thumbhash != null) { + json[r'thumbhash'] = thumbhash!; + } + json[r'type'] = type.toJson(); + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); + json[r'visibility'] = visibility.toJson(); + if (width != null) { + json[r'width'] = width!; } return json; } - /// Returns a new [AssetResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetResponseDto( - checksum: mapValueOfType(json, r'checksum')!, - createdAt: mapDateTime(json, r'createdAt', r'')!, - duplicateId: mapValueOfType(json, r'duplicateId'), - duration: mapValueOfType(json, r'duration'), - exifInfo: ExifResponseDto.fromJson(json[r'exifInfo']), - fileCreatedAt: mapDateTime(json, r'fileCreatedAt', r'')!, - fileModifiedAt: mapDateTime(json, r'fileModifiedAt', r'')!, - hasMetadata: mapValueOfType(json, r'hasMetadata')!, - height: mapValueOfType(json, r'height'), - id: mapValueOfType(json, r'id')!, - isArchived: mapValueOfType(json, r'isArchived')!, - isEdited: mapValueOfType(json, r'isEdited')!, - isFavorite: mapValueOfType(json, r'isFavorite')!, - isOffline: mapValueOfType(json, r'isOffline')!, - isTrashed: mapValueOfType(json, r'isTrashed')!, - libraryId: mapValueOfType(json, r'libraryId'), - livePhotoVideoId: mapValueOfType(json, r'livePhotoVideoId'), - localDateTime: mapDateTime(json, r'localDateTime', r'')!, - originalFileName: mapValueOfType(json, r'originalFileName')!, - originalMimeType: mapValueOfType(json, r'originalMimeType'), - originalPath: mapValueOfType(json, r'originalPath')!, - owner: UserResponseDto.fromJson(json[r'owner']), - ownerId: mapValueOfType(json, r'ownerId')!, - people: PersonResponseDto.listFromJson(json[r'people']), - resized: mapValueOfType(json, r'resized'), - stack: AssetStackResponseDto.fromJson(json[r'stack']), - tags: TagResponseDto.listFromJson(json[r'tags']), - thumbhash: mapValueOfType(json, r'thumbhash'), - type: AssetTypeEnum.fromJson(json[r'type'])!, - updatedAt: mapDateTime(json, r'updatedAt', r'')!, - visibility: AssetVisibility.fromJson(json[r'visibility'])!, - width: mapValueOfType(json, r'width'), - ); - } - return null; + AssetResponseDto copyWith({ + String? checksum, + DateTime? createdAt, + Object? duplicateId = _undefined, + Object? duration = _undefined, + Object? exifInfo = _undefined, + DateTime? fileCreatedAt, + DateTime? fileModifiedAt, + bool? hasMetadata, + Object? height = _undefined, + String? id, + bool? isArchived, + bool? isEdited, + bool? isFavorite, + bool? isOffline, + bool? isTrashed, + Object? libraryId = _undefined, + Object? livePhotoVideoId = _undefined, + DateTime? localDateTime, + String? originalFileName, + Object? originalMimeType = _undefined, + String? originalPath, + Object? owner = _undefined, + String? ownerId, + Object? people = _undefined, + Object? resized = _undefined, + Object? stack = _undefined, + Object? tags = _undefined, + Object? thumbhash = _undefined, + AssetTypeEnum? type, + DateTime? updatedAt, + AssetVisibility? visibility, + Object? width = _undefined, + }) { + return .new( + checksum: checksum ?? this.checksum, + createdAt: createdAt ?? this.createdAt, + duplicateId: identical(duplicateId, _undefined) ? this.duplicateId : duplicateId as String?, + duration: identical(duration, _undefined) ? this.duration : duration as int?, + exifInfo: identical(exifInfo, _undefined) ? this.exifInfo : exifInfo as ExifResponseDto?, + fileCreatedAt: fileCreatedAt ?? this.fileCreatedAt, + fileModifiedAt: fileModifiedAt ?? this.fileModifiedAt, + hasMetadata: hasMetadata ?? this.hasMetadata, + height: identical(height, _undefined) ? this.height : height as int?, + id: id ?? this.id, + isArchived: isArchived ?? this.isArchived, + isEdited: isEdited ?? this.isEdited, + isFavorite: isFavorite ?? this.isFavorite, + isOffline: isOffline ?? this.isOffline, + isTrashed: isTrashed ?? this.isTrashed, + libraryId: identical(libraryId, _undefined) ? this.libraryId : libraryId as String?, + livePhotoVideoId: identical(livePhotoVideoId, _undefined) ? this.livePhotoVideoId : livePhotoVideoId as String?, + localDateTime: localDateTime ?? this.localDateTime, + originalFileName: originalFileName ?? this.originalFileName, + originalMimeType: identical(originalMimeType, _undefined) ? this.originalMimeType : originalMimeType as String?, + originalPath: originalPath ?? this.originalPath, + owner: identical(owner, _undefined) ? this.owner : owner as UserResponseDto?, + ownerId: ownerId ?? this.ownerId, + people: identical(people, _undefined) ? this.people : people as List?, + resized: identical(resized, _undefined) ? this.resized : resized as bool?, + stack: identical(stack, _undefined) ? this.stack : stack as AssetStackResponseDto?, + tags: identical(tags, _undefined) ? this.tags : tags as List?, + thumbhash: identical(thumbhash, _undefined) ? this.thumbhash : thumbhash as String?, + type: type ?? this.type, + updatedAt: updatedAt ?? this.updatedAt, + visibility: visibility ?? this.visibility, + width: identical(width, _undefined) ? this.width : width as int?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetResponseDto && + checksum == other.checksum && + createdAt == other.createdAt && + duplicateId == other.duplicateId && + duration == other.duration && + exifInfo == other.exifInfo && + fileCreatedAt == other.fileCreatedAt && + fileModifiedAt == other.fileModifiedAt && + hasMetadata == other.hasMetadata && + height == other.height && + id == other.id && + isArchived == other.isArchived && + isEdited == other.isEdited && + isFavorite == other.isFavorite && + isOffline == other.isOffline && + isTrashed == other.isTrashed && + libraryId == other.libraryId && + livePhotoVideoId == other.livePhotoVideoId && + localDateTime == other.localDateTime && + originalFileName == other.originalFileName && + originalMimeType == other.originalMimeType && + originalPath == other.originalPath && + owner == other.owner && + ownerId == other.ownerId && + const DeepCollectionEquality().equals(people, other.people) && + resized == other.resized && + stack == other.stack && + const DeepCollectionEquality().equals(tags, other.tags) && + thumbhash == other.thumbhash && + type == other.type && + updatedAt == other.updatedAt && + visibility == other.visibility && + width == other.width); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + checksum, + createdAt, + duplicateId, + duration, + exifInfo, + fileCreatedAt, + fileModifiedAt, + hasMetadata, + height, + id, + isArchived, + isEdited, + isFavorite, + isOffline, + isTrashed, + libraryId, + livePhotoVideoId, + localDateTime, + originalFileName, + originalMimeType, + originalPath, + owner, + ownerId, + const DeepCollectionEquality().hash(people), + resized, + stack, + const DeepCollectionEquality().hash(tags), + thumbhash, + type, + updatedAt, + visibility, + width, + ]); } - // maps a json object with a list of AssetResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'checksum', - 'createdAt', - 'duration', - 'fileCreatedAt', - 'fileModifiedAt', - 'hasMetadata', - 'height', - 'id', - 'isArchived', - 'isEdited', - 'isFavorite', - 'isOffline', - 'isTrashed', - 'localDateTime', - 'originalFileName', - 'originalPath', - 'ownerId', - 'thumbhash', - 'type', - 'updatedAt', - 'visibility', - 'width', - }; + @override + String toString() => + 'AssetResponseDto(checksum=$checksum, createdAt=$createdAt, duplicateId=$duplicateId, duration=$duration, exifInfo=$exifInfo, fileCreatedAt=$fileCreatedAt, fileModifiedAt=$fileModifiedAt, hasMetadata=$hasMetadata, height=$height, id=$id, isArchived=$isArchived, isEdited=$isEdited, isFavorite=$isFavorite, isOffline=$isOffline, isTrashed=$isTrashed, libraryId=$libraryId, livePhotoVideoId=$livePhotoVideoId, localDateTime=$localDateTime, originalFileName=$originalFileName, originalMimeType=$originalMimeType, originalPath=$originalPath, owner=$owner, ownerId=$ownerId, people=$people, resized=$resized, stack=$stack, tags=$tags, thumbhash=$thumbhash, type=$type, updatedAt=$updatedAt, visibility=$visibility, width=$width)'; } - diff --git a/mobile/openapi/lib/model/asset_stack_response_dto.dart b/mobile/openapi/lib/model/asset_stack_response_dto.dart index 96fd66a392..c8be73b8a4 100644 --- a/mobile/openapi/lib/model/asset_stack_response_dto.dart +++ b/mobile/openapi/lib/model/asset_stack_response_dto.dart @@ -1,121 +1,60 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetStackResponseDto { - /// Returns a new [AssetStackResponseDto] instance. - AssetStackResponseDto({ - required this.assetCount, - required this.id, - required this.primaryAssetId, - }); +final class AssetStackResponseDto { + const AssetStackResponseDto({required this.assetCount, required this.id, required this.primaryAssetId}); /// Number of assets in stack - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int assetCount; + final int assetCount; /// Stack ID - String id; + final String id; /// Primary asset ID - String primaryAssetId; + final String primaryAssetId; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetStackResponseDto && - other.assetCount == assetCount && - other.id == id && - other.primaryAssetId == primaryAssetId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetCount.hashCode) + - (id.hashCode) + - (primaryAssetId.hashCode); - - @override - String toString() => 'AssetStackResponseDto[assetCount=$assetCount, id=$id, primaryAssetId=$primaryAssetId]'; + static AssetStackResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetCount: json[r'assetCount'] as int, + id: json[r'id'] as String, + primaryAssetId: json[r'primaryAssetId'] as String, + ); + } Map toJson() { final json = {}; - json[r'assetCount'] = this.assetCount; - json[r'id'] = this.id; - json[r'primaryAssetId'] = this.primaryAssetId; + json[r'assetCount'] = assetCount; + json[r'id'] = id; + json[r'primaryAssetId'] = primaryAssetId; return json; } - /// Returns a new [AssetStackResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetStackResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetStackResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetStackResponseDto( - assetCount: mapValueOfType(json, r'assetCount')!, - id: mapValueOfType(json, r'id')!, - primaryAssetId: mapValueOfType(json, r'primaryAssetId')!, - ); - } - return null; + AssetStackResponseDto copyWith({int? assetCount, String? id, String? primaryAssetId}) { + return .new( + assetCount: assetCount ?? this.assetCount, + id: id ?? this.id, + primaryAssetId: primaryAssetId ?? this.primaryAssetId, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetStackResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetStackResponseDto && + assetCount == other.assetCount && + id == other.id && + primaryAssetId == other.primaryAssetId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetStackResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetCount, id, primaryAssetId]); } - // maps a json object with a list of AssetStackResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetStackResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetCount', - 'id', - 'primaryAssetId', - }; + @override + String toString() => 'AssetStackResponseDto(assetCount=$assetCount, id=$id, primaryAssetId=$primaryAssetId)'; } - diff --git a/mobile/openapi/lib/model/asset_stats_response_dto.dart b/mobile/openapi/lib/model/asset_stats_response_dto.dart index df2762a2f3..1f15a907f5 100644 --- a/mobile/openapi/lib/model/asset_stats_response_dto.dart +++ b/mobile/openapi/lib/model/asset_stats_response_dto.dart @@ -1,127 +1,49 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AssetStatsResponseDto { - /// Returns a new [AssetStatsResponseDto] instance. - AssetStatsResponseDto({ - required this.images, - required this.total, - required this.videos, - }); +final class AssetStatsResponseDto { + const AssetStatsResponseDto({required this.images, required this.total, required this.videos}); /// Number of images - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int images; + final int images; /// Total number of assets - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int total; + final int total; /// Number of videos - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int videos; + final int videos; - @override - bool operator ==(Object other) => identical(this, other) || other is AssetStatsResponseDto && - other.images == images && - other.total == total && - other.videos == videos; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (images.hashCode) + - (total.hashCode) + - (videos.hashCode); - - @override - String toString() => 'AssetStatsResponseDto[images=$images, total=$total, videos=$videos]'; + static AssetStatsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(images: json[r'images'] as int, total: json[r'total'] as int, videos: json[r'videos'] as int); + } Map toJson() { final json = {}; - json[r'images'] = this.images; - json[r'total'] = this.total; - json[r'videos'] = this.videos; + json[r'images'] = images; + json[r'total'] = total; + json[r'videos'] = videos; return json; } - /// Returns a new [AssetStatsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AssetStatsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AssetStatsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AssetStatsResponseDto( - images: mapValueOfType(json, r'images')!, - total: mapValueOfType(json, r'total')!, - videos: mapValueOfType(json, r'videos')!, - ); - } - return null; + AssetStatsResponseDto copyWith({int? images, int? total, int? videos}) { + return .new(images: images ?? this.images, total: total ?? this.total, videos: videos ?? this.videos); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetStatsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AssetStatsResponseDto && images == other.images && total == other.total && videos == other.videos); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AssetStatsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([images, total, videos]); } - // maps a json object with a list of AssetStatsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AssetStatsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'images', - 'total', - 'videos', - }; + @override + String toString() => 'AssetStatsResponseDto(images=$images, total=$total, videos=$videos)'; } - diff --git a/mobile/openapi/lib/model/asset_type_enum.dart b/mobile/openapi/lib/model/asset_type_enum.dart index b6e0351198..97868a02fb 100644 --- a/mobile/openapi/lib/model/asset_type_enum.dart +++ b/mobile/openapi/lib/model/asset_type_enum.dart @@ -1,91 +1,30 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Asset type -class AssetTypeEnum { - /// Instantiate a new enum with the provided [value]. +enum AssetTypeEnum { + image._(r'IMAGE'), + video._(r'VIDEO'), + audio._(r'AUDIO'), + other._(r'OTHER'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AssetTypeEnum._(this.value); - /// The underlying value of this enum member. final String value; + static AssetTypeEnum? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const IMAGE = AssetTypeEnum._(r'IMAGE'); - static const VIDEO = AssetTypeEnum._(r'VIDEO'); - static const AUDIO = AssetTypeEnum._(r'AUDIO'); - static const OTHER = AssetTypeEnum._(r'OTHER'); - - /// List of all possible values in this [enum][AssetTypeEnum]. - static const values = [ - IMAGE, - VIDEO, - AUDIO, - OTHER, - ]; - - static AssetTypeEnum? fromJson(dynamic value) => AssetTypeEnumTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetTypeEnum.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AssetTypeEnum] to String, -/// and [decode] dynamic data back to [AssetTypeEnum]. -class AssetTypeEnumTypeTransformer { - factory AssetTypeEnumTypeTransformer() => _instance ??= const AssetTypeEnumTypeTransformer._(); - - const AssetTypeEnumTypeTransformer._(); - - String encode(AssetTypeEnum data) => data.value; - - /// Decodes a [dynamic value][data] to a AssetTypeEnum. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AssetTypeEnum? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'IMAGE': return AssetTypeEnum.IMAGE; - case r'VIDEO': return AssetTypeEnum.VIDEO; - case r'AUDIO': return AssetTypeEnum.AUDIO; - case r'OTHER': return AssetTypeEnum.OTHER; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AssetTypeEnumTypeTransformer] instance. - static AssetTypeEnumTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/asset_upload_action.dart b/mobile/openapi/lib/model/asset_upload_action.dart index b5cdbb0151..dbc9a06e59 100644 --- a/mobile/openapi/lib/model/asset_upload_action.dart +++ b/mobile/openapi/lib/model/asset_upload_action.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Upload action -class AssetUploadAction { - /// Instantiate a new enum with the provided [value]. +enum AssetUploadAction { + accept._(r'accept'), + reject._(r'reject'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AssetUploadAction._(this.value); - /// The underlying value of this enum member. final String value; + static AssetUploadAction? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const accept = AssetUploadAction._(r'accept'); - static const reject = AssetUploadAction._(r'reject'); - - /// List of all possible values in this [enum][AssetUploadAction]. - static const values = [ - accept, - reject, - ]; - - static AssetUploadAction? fromJson(dynamic value) => AssetUploadActionTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetUploadAction.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AssetUploadAction] to String, -/// and [decode] dynamic data back to [AssetUploadAction]. -class AssetUploadActionTypeTransformer { - factory AssetUploadActionTypeTransformer() => _instance ??= const AssetUploadActionTypeTransformer._(); - - const AssetUploadActionTypeTransformer._(); - - String encode(AssetUploadAction data) => data.value; - - /// Decodes a [dynamic value][data] to a AssetUploadAction. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AssetUploadAction? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'accept': return AssetUploadAction.accept; - case r'reject': return AssetUploadAction.reject; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AssetUploadActionTypeTransformer] instance. - static AssetUploadActionTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/asset_visibility.dart b/mobile/openapi/lib/model/asset_visibility.dart index 6290dffb2e..33b9b92475 100644 --- a/mobile/openapi/lib/model/asset_visibility.dart +++ b/mobile/openapi/lib/model/asset_visibility.dart @@ -1,91 +1,30 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Asset visibility -class AssetVisibility { - /// Instantiate a new enum with the provided [value]. +enum AssetVisibility { + archive._(r'archive'), + timeline._(r'timeline'), + hidden._(r'hidden'), + locked._(r'locked'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AssetVisibility._(this.value); - /// The underlying value of this enum member. final String value; + static AssetVisibility? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const archive = AssetVisibility._(r'archive'); - static const timeline = AssetVisibility._(r'timeline'); - static const hidden = AssetVisibility._(r'hidden'); - static const locked = AssetVisibility._(r'locked'); - - /// List of all possible values in this [enum][AssetVisibility]. - static const values = [ - archive, - timeline, - hidden, - locked, - ]; - - static AssetVisibility? fromJson(dynamic value) => AssetVisibilityTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AssetVisibility.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AssetVisibility] to String, -/// and [decode] dynamic data back to [AssetVisibility]. -class AssetVisibilityTypeTransformer { - factory AssetVisibilityTypeTransformer() => _instance ??= const AssetVisibilityTypeTransformer._(); - - const AssetVisibilityTypeTransformer._(); - - String encode(AssetVisibility data) => data.value; - - /// Decodes a [dynamic value][data] to a AssetVisibility. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AssetVisibility? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'archive': return AssetVisibility.archive; - case r'timeline': return AssetVisibility.timeline; - case r'hidden': return AssetVisibility.hidden; - case r'locked': return AssetVisibility.locked; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AssetVisibilityTypeTransformer] instance. - static AssetVisibilityTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/audio_codec.dart b/mobile/openapi/lib/model/audio_codec.dart index d1c10e08a1..47ca3dc1d8 100644 --- a/mobile/openapi/lib/model/audio_codec.dart +++ b/mobile/openapi/lib/model/audio_codec.dart @@ -1,91 +1,30 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Target audio codec -class AudioCodec { - /// Instantiate a new enum with the provided [value]. +enum AudioCodec { + mp3._(r'mp3'), + aac._(r'aac'), + opus._(r'opus'), + pcmS16le._(r'pcm_s16le'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const AudioCodec._(this.value); - /// The underlying value of this enum member. final String value; + static AudioCodec? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const mp3 = AudioCodec._(r'mp3'); - static const aac = AudioCodec._(r'aac'); - static const opus = AudioCodec._(r'opus'); - static const pcmS16le = AudioCodec._(r'pcm_s16le'); - - /// List of all possible values in this [enum][AudioCodec]. - static const values = [ - mp3, - aac, - opus, - pcmS16le, - ]; - - static AudioCodec? fromJson(dynamic value) => AudioCodecTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AudioCodec.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [AudioCodec] to String, -/// and [decode] dynamic data back to [AudioCodec]. -class AudioCodecTypeTransformer { - factory AudioCodecTypeTransformer() => _instance ??= const AudioCodecTypeTransformer._(); - - const AudioCodecTypeTransformer._(); - - String encode(AudioCodec data) => data.value; - - /// Decodes a [dynamic value][data] to a AudioCodec. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - AudioCodec? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'mp3': return AudioCodec.mp3; - case r'aac': return AudioCodec.aac; - case r'opus': return AudioCodec.opus; - case r'pcm_s16le': return AudioCodec.pcmS16le; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [AudioCodecTypeTransformer] instance. - static AudioCodecTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/auth_status_response_dto.dart b/mobile/openapi/lib/model/auth_status_response_dto.dart index 23b9d40525..ca78552d32 100644 --- a/mobile/openapi/lib/model/auth_status_response_dto.dart +++ b/mobile/openapi/lib/model/auth_status_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AuthStatusResponseDto { - /// Returns a new [AuthStatusResponseDto] instance. - AuthStatusResponseDto({ +final class AuthStatusResponseDto { + const AuthStatusResponseDto({ this.expiresAt, required this.isElevated, required this.password, @@ -21,134 +12,82 @@ class AuthStatusResponseDto { }); /// Session expiration date - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? expiresAt; + final String? expiresAt; /// Is elevated session - bool isElevated; + final bool isElevated; /// Has password set - bool password; + final bool password; /// Has PIN code set - bool pinCode; + final bool pinCode; /// PIN expiration date - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? pinExpiresAt; + final String? pinExpiresAt; - @override - bool operator ==(Object other) => identical(this, other) || other is AuthStatusResponseDto && - other.expiresAt == expiresAt && - other.isElevated == isElevated && - other.password == password && - other.pinCode == pinCode && - other.pinExpiresAt == pinExpiresAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (expiresAt == null ? 0 : expiresAt!.hashCode) + - (isElevated.hashCode) + - (password.hashCode) + - (pinCode.hashCode) + - (pinExpiresAt == null ? 0 : pinExpiresAt!.hashCode); - - @override - String toString() => 'AuthStatusResponseDto[expiresAt=$expiresAt, isElevated=$isElevated, password=$password, pinCode=$pinCode, pinExpiresAt=$pinExpiresAt]'; + static AuthStatusResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + expiresAt: (json[r'expiresAt'] as String?), + isElevated: json[r'isElevated'] as bool, + password: json[r'password'] as bool, + pinCode: json[r'pinCode'] as bool, + pinExpiresAt: (json[r'pinExpiresAt'] as String?), + ); + } Map toJson() { final json = {}; - if (this.expiresAt != null) { - json[r'expiresAt'] = this.expiresAt; - } else { - // json[r'expiresAt'] = null; + if (expiresAt != null) { + json[r'expiresAt'] = expiresAt!; } - json[r'isElevated'] = this.isElevated; - json[r'password'] = this.password; - json[r'pinCode'] = this.pinCode; - if (this.pinExpiresAt != null) { - json[r'pinExpiresAt'] = this.pinExpiresAt; - } else { - // json[r'pinExpiresAt'] = null; + json[r'isElevated'] = isElevated; + json[r'password'] = password; + json[r'pinCode'] = pinCode; + if (pinExpiresAt != null) { + json[r'pinExpiresAt'] = pinExpiresAt!; } return json; } - /// Returns a new [AuthStatusResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AuthStatusResponseDto? fromJson(dynamic value) { - upgradeDto(value, "AuthStatusResponseDto"); - if (value is Map) { - final json = value.cast(); - - return AuthStatusResponseDto( - expiresAt: mapValueOfType(json, r'expiresAt'), - isElevated: mapValueOfType(json, r'isElevated')!, - password: mapValueOfType(json, r'password')!, - pinCode: mapValueOfType(json, r'pinCode')!, - pinExpiresAt: mapValueOfType(json, r'pinExpiresAt'), - ); - } - return null; + AuthStatusResponseDto copyWith({ + Object? expiresAt = _undefined, + bool? isElevated, + bool? password, + bool? pinCode, + Object? pinExpiresAt = _undefined, + }) { + return .new( + expiresAt: identical(expiresAt, _undefined) ? this.expiresAt : expiresAt as String?, + isElevated: isElevated ?? this.isElevated, + password: password ?? this.password, + pinCode: pinCode ?? this.pinCode, + pinExpiresAt: identical(pinExpiresAt, _undefined) ? this.pinExpiresAt : pinExpiresAt as String?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AuthStatusResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is AuthStatusResponseDto && + expiresAt == other.expiresAt && + isElevated == other.isElevated && + password == other.password && + pinCode == other.pinCode && + pinExpiresAt == other.pinExpiresAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AuthStatusResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([expiresAt, isElevated, password, pinCode, pinExpiresAt]); } - // maps a json object with a list of AuthStatusResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AuthStatusResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'isElevated', - 'password', - 'pinCode', - }; + @override + String toString() => + 'AuthStatusResponseDto(expiresAt=$expiresAt, isElevated=$isElevated, password=$password, pinCode=$pinCode, pinExpiresAt=$pinExpiresAt)'; } - diff --git a/mobile/openapi/lib/model/avatar_update.dart b/mobile/openapi/lib/model/avatar_update.dart index 875eb138a8..d4824e8f65 100644 --- a/mobile/openapi/lib/model/avatar_update.dart +++ b/mobile/openapi/lib/model/avatar_update.dart @@ -1,108 +1,43 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class AvatarUpdate { - /// Returns a new [AvatarUpdate] instance. - AvatarUpdate({ - this.color, - }); +final class AvatarUpdate { + const AvatarUpdate({this.color}); - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - UserAvatarColor? color; + final UserAvatarColor? color; - @override - bool operator ==(Object other) => identical(this, other) || other is AvatarUpdate && - other.color == color; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (color == null ? 0 : color!.hashCode); - - @override - String toString() => 'AvatarUpdate[color=$color]'; + static AvatarUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(color: UserAvatarColor.fromJson(json[r'color'])); + } Map toJson() { final json = {}; - if (this.color != null) { - json[r'color'] = this.color; - } else { - // json[r'color'] = null; + if (color != null) { + json[r'color'] = color!.toJson(); } return json; } - /// Returns a new [AvatarUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static AvatarUpdate? fromJson(dynamic value) { - upgradeDto(value, "AvatarUpdate"); - if (value is Map) { - final json = value.cast(); - - return AvatarUpdate( - color: UserAvatarColor.fromJson(json[r'color']), - ); - } - return null; + AvatarUpdate copyWith({Object? color = _undefined}) { + return .new(color: identical(color, _undefined) ? this.color : color as UserAvatarColor?); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = AvatarUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is AvatarUpdate && color == other.color); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = AvatarUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([color]); } - // maps a json object with a list of AvatarUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = AvatarUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'AvatarUpdate(color=$color)'; } - diff --git a/mobile/openapi/lib/model/bulk_id_error_reason.dart b/mobile/openapi/lib/model/bulk_id_error_reason.dart index fd6c61d6fd..511b5419c6 100644 --- a/mobile/openapi/lib/model/bulk_id_error_reason.dart +++ b/mobile/openapi/lib/model/bulk_id_error_reason.dart @@ -1,94 +1,31 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Error reason -class BulkIdErrorReason { - /// Instantiate a new enum with the provided [value]. +enum BulkIdErrorReason { + duplicate._(r'duplicate'), + noPermission._(r'no_permission'), + notFound._(r'not_found'), + unknown._(r'unknown'), + validation._(r'validation'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const BulkIdErrorReason._(this.value); - /// The underlying value of this enum member. final String value; + static BulkIdErrorReason? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const duplicate = BulkIdErrorReason._(r'duplicate'); - static const noPermission = BulkIdErrorReason._(r'no_permission'); - static const notFound = BulkIdErrorReason._(r'not_found'); - static const unknown = BulkIdErrorReason._(r'unknown'); - static const validation = BulkIdErrorReason._(r'validation'); - - /// List of all possible values in this [enum][BulkIdErrorReason]. - static const values = [ - duplicate, - noPermission, - notFound, - unknown, - validation, - ]; - - static BulkIdErrorReason? fromJson(dynamic value) => BulkIdErrorReasonTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = BulkIdErrorReason.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [BulkIdErrorReason] to String, -/// and [decode] dynamic data back to [BulkIdErrorReason]. -class BulkIdErrorReasonTypeTransformer { - factory BulkIdErrorReasonTypeTransformer() => _instance ??= const BulkIdErrorReasonTypeTransformer._(); - - const BulkIdErrorReasonTypeTransformer._(); - - String encode(BulkIdErrorReason data) => data.value; - - /// Decodes a [dynamic value][data] to a BulkIdErrorReason. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - BulkIdErrorReason? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'duplicate': return BulkIdErrorReason.duplicate; - case r'no_permission': return BulkIdErrorReason.noPermission; - case r'not_found': return BulkIdErrorReason.notFound; - case r'unknown': return BulkIdErrorReason.unknown; - case r'validation': return BulkIdErrorReason.validation; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [BulkIdErrorReasonTypeTransformer] instance. - static BulkIdErrorReasonTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/bulk_id_response_dto.dart b/mobile/openapi/lib/model/bulk_id_response_dto.dart index bb3f1d8856..31c8be2a58 100644 --- a/mobile/openapi/lib/model/bulk_id_response_dto.dart +++ b/mobile/openapi/lib/model/bulk_id_response_dto.dart @@ -1,143 +1,76 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class BulkIdResponseDto { - /// Returns a new [BulkIdResponseDto] instance. - BulkIdResponseDto({ - this.error, - this.errorMessage, - required this.id, - required this.success, - }); +final class BulkIdResponseDto { + const BulkIdResponseDto({this.error, this.errorMessage, required this.id, required this.success}); - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - BulkIdErrorReason? error; + final BulkIdErrorReason? error; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? errorMessage; + final String? errorMessage; /// ID - String id; + final String id; /// Whether operation succeeded - bool success; + final bool success; - @override - bool operator ==(Object other) => identical(this, other) || other is BulkIdResponseDto && - other.error == error && - other.errorMessage == errorMessage && - other.id == id && - other.success == success; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (error == null ? 0 : error!.hashCode) + - (errorMessage == null ? 0 : errorMessage!.hashCode) + - (id.hashCode) + - (success.hashCode); - - @override - String toString() => 'BulkIdResponseDto[error=$error, errorMessage=$errorMessage, id=$id, success=$success]'; + static BulkIdResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + error: BulkIdErrorReason.fromJson(json[r'error']), + errorMessage: (json[r'errorMessage'] as String?), + id: json[r'id'] as String, + success: json[r'success'] as bool, + ); + } Map toJson() { final json = {}; - if (this.error != null) { - json[r'error'] = this.error; - } else { - // json[r'error'] = null; + if (error != null) { + json[r'error'] = error!.toJson(); } - if (this.errorMessage != null) { - json[r'errorMessage'] = this.errorMessage; - } else { - // json[r'errorMessage'] = null; + if (errorMessage != null) { + json[r'errorMessage'] = errorMessage!; } - json[r'id'] = this.id; - json[r'success'] = this.success; + json[r'id'] = id; + json[r'success'] = success; return json; } - /// Returns a new [BulkIdResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static BulkIdResponseDto? fromJson(dynamic value) { - upgradeDto(value, "BulkIdResponseDto"); - if (value is Map) { - final json = value.cast(); - - return BulkIdResponseDto( - error: BulkIdErrorReason.fromJson(json[r'error']), - errorMessage: mapValueOfType(json, r'errorMessage'), - id: mapValueOfType(json, r'id')!, - success: mapValueOfType(json, r'success')!, - ); - } - return null; + BulkIdResponseDto copyWith({ + Object? error = _undefined, + Object? errorMessage = _undefined, + String? id, + bool? success, + }) { + return .new( + error: identical(error, _undefined) ? this.error : error as BulkIdErrorReason?, + errorMessage: identical(errorMessage, _undefined) ? this.errorMessage : errorMessage as String?, + id: id ?? this.id, + success: success ?? this.success, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = BulkIdResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is BulkIdResponseDto && + error == other.error && + errorMessage == other.errorMessage && + id == other.id && + success == other.success); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = BulkIdResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([error, errorMessage, id, success]); } - // maps a json object with a list of BulkIdResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = BulkIdResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'id', - 'success', - }; + @override + String toString() => 'BulkIdResponseDto(error=$error, errorMessage=$errorMessage, id=$id, success=$success)'; } - diff --git a/mobile/openapi/lib/model/bulk_ids_dto.dart b/mobile/openapi/lib/model/bulk_ids_dto.dart index 7e7864a285..da2da35aa4 100644 --- a/mobile/openapi/lib/model/bulk_ids_dto.dart +++ b/mobile/openapi/lib/model/bulk_ids_dto.dart @@ -1,102 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class BulkIdsDto { - /// Returns a new [BulkIdsDto] instance. - BulkIdsDto({ - this.ids = const [], - }); +final class BulkIdsDto { + const BulkIdsDto({required this.ids}); /// IDs to process - List ids; + final List ids; - @override - bool operator ==(Object other) => identical(this, other) || other is BulkIdsDto && - _deepEquality.equals(other.ids, ids); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (ids.hashCode); - - @override - String toString() => 'BulkIdsDto[ids=$ids]'; + static BulkIdsDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(ids: ((json[r'ids'] as List?)?.map(($e) => $e as String).toList(growable: false))!); + } Map toJson() { final json = {}; - json[r'ids'] = this.ids; + json[r'ids'] = ids; return json; } - /// Returns a new [BulkIdsDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static BulkIdsDto? fromJson(dynamic value) { - upgradeDto(value, "BulkIdsDto"); - if (value is Map) { - final json = value.cast(); - - return BulkIdsDto( - ids: json[r'ids'] is Iterable - ? (json[r'ids'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + BulkIdsDto copyWith({List? ids}) { + return .new(ids: ids ?? this.ids); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = BulkIdsDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is BulkIdsDto && const DeepCollectionEquality().equals(ids, other.ids)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = BulkIdsDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(ids)]); } - // maps a json object with a list of BulkIdsDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = BulkIdsDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'ids', - }; + @override + String toString() => 'BulkIdsDto(ids=$ids)'; } - diff --git a/mobile/openapi/lib/model/cast_response.dart b/mobile/openapi/lib/model/cast_response.dart index 796138b0bf..d268548255 100644 --- a/mobile/openapi/lib/model/cast_response.dart +++ b/mobile/openapi/lib/model/cast_response.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class CastResponse { - /// Returns a new [CastResponse] instance. - CastResponse({ - required this.gCastEnabled, - }); +final class CastResponse { + const CastResponse({required this.gCastEnabled}); /// Whether Google Cast is enabled - bool gCastEnabled; + final bool gCastEnabled; - @override - bool operator ==(Object other) => identical(this, other) || other is CastResponse && - other.gCastEnabled == gCastEnabled; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (gCastEnabled.hashCode); - - @override - String toString() => 'CastResponse[gCastEnabled=$gCastEnabled]'; + static CastResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(gCastEnabled: json[r'gCastEnabled'] as bool); + } Map toJson() { final json = {}; - json[r'gCastEnabled'] = this.gCastEnabled; + json[r'gCastEnabled'] = gCastEnabled; return json; } - /// Returns a new [CastResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static CastResponse? fromJson(dynamic value) { - upgradeDto(value, "CastResponse"); - if (value is Map) { - final json = value.cast(); - - return CastResponse( - gCastEnabled: mapValueOfType(json, r'gCastEnabled')!, - ); - } - return null; + CastResponse copyWith({bool? gCastEnabled}) { + return .new(gCastEnabled: gCastEnabled ?? this.gCastEnabled); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = CastResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is CastResponse && gCastEnabled == other.gCastEnabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = CastResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([gCastEnabled]); } - // maps a json object with a list of CastResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = CastResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'gCastEnabled', - }; + @override + String toString() => 'CastResponse(gCastEnabled=$gCastEnabled)'; } - diff --git a/mobile/openapi/lib/model/cast_update.dart b/mobile/openapi/lib/model/cast_update.dart index 8dbf80f171..2c5627a8e5 100644 --- a/mobile/openapi/lib/model/cast_update.dart +++ b/mobile/openapi/lib/model/cast_update.dart @@ -1,109 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class CastUpdate { - /// Returns a new [CastUpdate] instance. - CastUpdate({ - this.gCastEnabled, - }); +final class CastUpdate { + const CastUpdate({this.gCastEnabled}); /// Whether Google Cast is enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? gCastEnabled; + final bool? gCastEnabled; - @override - bool operator ==(Object other) => identical(this, other) || other is CastUpdate && - other.gCastEnabled == gCastEnabled; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (gCastEnabled == null ? 0 : gCastEnabled!.hashCode); - - @override - String toString() => 'CastUpdate[gCastEnabled=$gCastEnabled]'; + static CastUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(gCastEnabled: (json[r'gCastEnabled'] as bool?)); + } Map toJson() { final json = {}; - if (this.gCastEnabled != null) { - json[r'gCastEnabled'] = this.gCastEnabled; - } else { - // json[r'gCastEnabled'] = null; + if (gCastEnabled != null) { + json[r'gCastEnabled'] = gCastEnabled!; } return json; } - /// Returns a new [CastUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static CastUpdate? fromJson(dynamic value) { - upgradeDto(value, "CastUpdate"); - if (value is Map) { - final json = value.cast(); - - return CastUpdate( - gCastEnabled: mapValueOfType(json, r'gCastEnabled'), - ); - } - return null; + CastUpdate copyWith({Object? gCastEnabled = _undefined}) { + return .new(gCastEnabled: identical(gCastEnabled, _undefined) ? this.gCastEnabled : gCastEnabled as bool?); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = CastUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is CastUpdate && gCastEnabled == other.gCastEnabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = CastUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([gCastEnabled]); } - // maps a json object with a list of CastUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = CastUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'CastUpdate(gCastEnabled=$gCastEnabled)'; } - diff --git a/mobile/openapi/lib/model/change_password_dto.dart b/mobile/openapi/lib/model/change_password_dto.dart index 3dd6e437da..dc59886168 100644 --- a/mobile/openapi/lib/model/change_password_dto.dart +++ b/mobile/openapi/lib/model/change_password_dto.dart @@ -1,117 +1,69 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ChangePasswordDto { - /// Returns a new [ChangePasswordDto] instance. - ChangePasswordDto({ - this.invalidateSessions = false, +final class ChangePasswordDto { + const ChangePasswordDto({ + this.invalidateSessions = const Optional.absent(), required this.newPassword, required this.password, }); /// Invalidate all other sessions - bool invalidateSessions; + final Optional invalidateSessions; /// New password (min 8 characters) - String newPassword; + final String newPassword; /// Current password - String password; + final String password; - @override - bool operator ==(Object other) => identical(this, other) || other is ChangePasswordDto && - other.invalidateSessions == invalidateSessions && - other.newPassword == newPassword && - other.password == password; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (invalidateSessions.hashCode) + - (newPassword.hashCode) + - (password.hashCode); - - @override - String toString() => 'ChangePasswordDto[invalidateSessions=$invalidateSessions, newPassword=$newPassword, password=$password]'; + static ChangePasswordDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + invalidateSessions: json.containsKey(r'invalidateSessions') + ? Optional.present(json[r'invalidateSessions'] as bool) + : const Optional.absent(), + newPassword: json[r'newPassword'] as String, + password: json[r'password'] as String, + ); + } Map toJson() { final json = {}; - json[r'invalidateSessions'] = this.invalidateSessions; - json[r'newPassword'] = this.newPassword; - json[r'password'] = this.password; + if (invalidateSessions case Present(:final value)) { + json[r'invalidateSessions'] = value; + } + json[r'newPassword'] = newPassword; + json[r'password'] = password; return json; } - /// Returns a new [ChangePasswordDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ChangePasswordDto? fromJson(dynamic value) { - upgradeDto(value, "ChangePasswordDto"); - if (value is Map) { - final json = value.cast(); - - return ChangePasswordDto( - invalidateSessions: mapValueOfType(json, r'invalidateSessions') ?? false, - newPassword: mapValueOfType(json, r'newPassword')!, - password: mapValueOfType(json, r'password')!, - ); - } - return null; + ChangePasswordDto copyWith({Optional? invalidateSessions, String? newPassword, String? password}) { + return .new( + invalidateSessions: invalidateSessions ?? this.invalidateSessions, + newPassword: newPassword ?? this.newPassword, + password: password ?? this.password, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ChangePasswordDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ChangePasswordDto && + invalidateSessions == other.invalidateSessions && + newPassword == other.newPassword && + password == other.password); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ChangePasswordDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([invalidateSessions, newPassword, password]); } - // maps a json object with a list of ChangePasswordDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ChangePasswordDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'newPassword', - 'password', - }; + @override + String toString() => + 'ChangePasswordDto(invalidateSessions=$invalidateSessions, newPassword=$newPassword, password=$password)'; } - diff --git a/mobile/openapi/lib/model/clip_config.dart b/mobile/openapi/lib/model/clip_config.dart index 915e4975ed..43d0ca15e8 100644 --- a/mobile/openapi/lib/model/clip_config.dart +++ b/mobile/openapi/lib/model/clip_config.dart @@ -1,109 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class CLIPConfig { - /// Returns a new [CLIPConfig] instance. - CLIPConfig({ - required this.enabled, - required this.modelName, - }); +final class ClipConfig { + const ClipConfig({required this.enabled, required this.modelName}); /// Whether the task is enabled - bool enabled; + final bool enabled; /// Name of the model to use - String modelName; + final String modelName; - @override - bool operator ==(Object other) => identical(this, other) || other is CLIPConfig && - other.enabled == enabled && - other.modelName == modelName; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (modelName.hashCode); - - @override - String toString() => 'CLIPConfig[enabled=$enabled, modelName=$modelName]'; + static ClipConfig? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool, modelName: json[r'modelName'] as String); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'modelName'] = this.modelName; + json[r'enabled'] = enabled; + json[r'modelName'] = modelName; return json; } - /// Returns a new [CLIPConfig] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static CLIPConfig? fromJson(dynamic value) { - upgradeDto(value, "CLIPConfig"); - if (value is Map) { - final json = value.cast(); - - return CLIPConfig( - enabled: mapValueOfType(json, r'enabled')!, - modelName: mapValueOfType(json, r'modelName')!, - ); - } - return null; + ClipConfig copyWith({bool? enabled, String? modelName}) { + return .new(enabled: enabled ?? this.enabled, modelName: modelName ?? this.modelName); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = CLIPConfig.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is ClipConfig && enabled == other.enabled && modelName == other.modelName); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = CLIPConfig.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, modelName]); } - // maps a json object with a list of CLIPConfig-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = CLIPConfig.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'modelName', - }; + @override + String toString() => 'ClipConfig(enabled=$enabled, modelName=$modelName)'; } - diff --git a/mobile/openapi/lib/model/colorspace.dart b/mobile/openapi/lib/model/colorspace.dart index e871e140fb..960db6e3f1 100644 --- a/mobile/openapi/lib/model/colorspace.dart +++ b/mobile/openapi/lib/model/colorspace.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Colorspace -class Colorspace { - /// Instantiate a new enum with the provided [value]. +enum Colorspace { + srgb._(r'srgb'), + p3._(r'p3'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const Colorspace._(this.value); - /// The underlying value of this enum member. final String value; + static Colorspace? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const srgb = Colorspace._(r'srgb'); - static const p3 = Colorspace._(r'p3'); - - /// List of all possible values in this [enum][Colorspace]. - static const values = [ - srgb, - p3, - ]; - - static Colorspace? fromJson(dynamic value) => ColorspaceTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = Colorspace.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [Colorspace] to String, -/// and [decode] dynamic data back to [Colorspace]. -class ColorspaceTypeTransformer { - factory ColorspaceTypeTransformer() => _instance ??= const ColorspaceTypeTransformer._(); - - const ColorspaceTypeTransformer._(); - - String encode(Colorspace data) => data.value; - - /// Decodes a [dynamic value][data] to a Colorspace. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - Colorspace? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'srgb': return Colorspace.srgb; - case r'p3': return Colorspace.p3; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [ColorspaceTypeTransformer] instance. - static ColorspaceTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/contributor_count_response_dto.dart b/mobile/openapi/lib/model/contributor_count_response_dto.dart index af5b2cbf68..053b9fe99a 100644 --- a/mobile/openapi/lib/model/contributor_count_response_dto.dart +++ b/mobile/openapi/lib/model/contributor_count_response_dto.dart @@ -1,112 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ContributorCountResponseDto { - /// Returns a new [ContributorCountResponseDto] instance. - ContributorCountResponseDto({ - required this.assetCount, - required this.userId, - }); +final class ContributorCountResponseDto { + const ContributorCountResponseDto({required this.assetCount, required this.userId}); /// Number of assets contributed - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int assetCount; + final int assetCount; /// User ID - String userId; + final String userId; - @override - bool operator ==(Object other) => identical(this, other) || other is ContributorCountResponseDto && - other.assetCount == assetCount && - other.userId == userId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetCount.hashCode) + - (userId.hashCode); - - @override - String toString() => 'ContributorCountResponseDto[assetCount=$assetCount, userId=$userId]'; + static ContributorCountResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(assetCount: json[r'assetCount'] as int, userId: json[r'userId'] as String); + } Map toJson() { final json = {}; - json[r'assetCount'] = this.assetCount; - json[r'userId'] = this.userId; + json[r'assetCount'] = assetCount; + json[r'userId'] = userId; return json; } - /// Returns a new [ContributorCountResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ContributorCountResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ContributorCountResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ContributorCountResponseDto( - assetCount: mapValueOfType(json, r'assetCount')!, - userId: mapValueOfType(json, r'userId')!, - ); - } - return null; + ContributorCountResponseDto copyWith({int? assetCount, String? userId}) { + return .new(assetCount: assetCount ?? this.assetCount, userId: userId ?? this.userId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ContributorCountResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ContributorCountResponseDto && assetCount == other.assetCount && userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ContributorCountResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetCount, userId]); } - // maps a json object with a list of ContributorCountResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ContributorCountResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetCount', - 'userId', - }; + @override + String toString() => 'ContributorCountResponseDto(assetCount=$assetCount, userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/cq_mode.dart b/mobile/openapi/lib/model/cq_mode.dart index efd788b5fb..8d0178723b 100644 --- a/mobile/openapi/lib/model/cq_mode.dart +++ b/mobile/openapi/lib/model/cq_mode.dart @@ -1,88 +1,29 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// CQ mode -class CQMode { - /// Instantiate a new enum with the provided [value]. - const CQMode._(this.value); +enum CqMode { + auto._(r'auto'), + cqp._(r'cqp'), + icq._(r'icq'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + + const CqMode._(this.value); - /// The underlying value of this enum member. final String value; + static CqMode? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const auto = CQMode._(r'auto'); - static const cqp = CQMode._(r'cqp'); - static const icq = CQMode._(r'icq'); - - /// List of all possible values in this [enum][CQMode]. - static const values = [ - auto, - cqp, - icq, - ]; - - static CQMode? fromJson(dynamic value) => CQModeTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = CQMode.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [CQMode] to String, -/// and [decode] dynamic data back to [CQMode]. -class CQModeTypeTransformer { - factory CQModeTypeTransformer() => _instance ??= const CQModeTypeTransformer._(); - - const CQModeTypeTransformer._(); - - String encode(CQMode data) => data.value; - - /// Decodes a [dynamic value][data] to a CQMode. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - CQMode? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'auto': return CQMode.auto; - case r'cqp': return CQMode.cqp; - case r'icq': return CQMode.icq; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [CQModeTypeTransformer] instance. - static CQModeTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/create_album_dto.dart b/mobile/openapi/lib/model/create_album_dto.dart index 183a41c772..17affe08a8 100644 --- a/mobile/openapi/lib/model/create_album_dto.dart +++ b/mobile/openapi/lib/model/create_album_dto.dart @@ -1,136 +1,94 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class CreateAlbumDto { - /// Returns a new [CreateAlbumDto] instance. - CreateAlbumDto({ +final class CreateAlbumDto { + const CreateAlbumDto({ required this.albumName, - this.albumUsers = const [], - this.assetIds = const [], - this.description, + this.albumUsers = const Optional.absent(), + this.assetIds = const Optional.absent(), + this.description = const Optional.absent(), }); /// Album name - String albumName; + final String albumName; /// Album users - List albumUsers; + final Optional> albumUsers; /// Initial asset IDs - List assetIds; + final Optional> assetIds; /// Album description - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? description; + final Optional description; - @override - bool operator ==(Object other) => identical(this, other) || other is CreateAlbumDto && - other.albumName == albumName && - _deepEquality.equals(other.albumUsers, albumUsers) && - _deepEquality.equals(other.assetIds, assetIds) && - other.description == description; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumName.hashCode) + - (albumUsers.hashCode) + - (assetIds.hashCode) + - (description == null ? 0 : description!.hashCode); - - @override - String toString() => 'CreateAlbumDto[albumName=$albumName, albumUsers=$albumUsers, assetIds=$assetIds, description=$description]'; + static CreateAlbumDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumName: json[r'albumName'] as String, + albumUsers: json.containsKey(r'albumUsers') + ? Optional.present( + ((json[r'albumUsers'] as List?) + ?.map(($e) => (AlbumUserCreateDto.fromJson($e))!) + .toList(growable: false))!, + ) + : const Optional.absent(), + assetIds: json.containsKey(r'assetIds') + ? Optional.present(((json[r'assetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + description: json.containsKey(r'description') + ? Optional.present(json[r'description'] as String) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'albumName'] = this.albumName; - json[r'albumUsers'] = this.albumUsers; - json[r'assetIds'] = this.assetIds; - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + json[r'albumName'] = albumName; + if (albumUsers case Present(:final value)) { + json[r'albumUsers'] = value.map(($e) => $e.toJson()).toList(growable: false); + } + if (assetIds case Present(:final value)) { + json[r'assetIds'] = value; + } + if (description case Present(:final value)) { + json[r'description'] = value; } return json; } - /// Returns a new [CreateAlbumDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static CreateAlbumDto? fromJson(dynamic value) { - upgradeDto(value, "CreateAlbumDto"); - if (value is Map) { - final json = value.cast(); - - return CreateAlbumDto( - albumName: mapValueOfType(json, r'albumName')!, - albumUsers: AlbumUserCreateDto.listFromJson(json[r'albumUsers']), - assetIds: json[r'assetIds'] is Iterable - ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) - : const [], - description: mapValueOfType(json, r'description'), - ); - } - return null; + CreateAlbumDto copyWith({ + String? albumName, + Optional>? albumUsers, + Optional>? assetIds, + Optional? description, + }) { + return .new( + albumName: albumName ?? this.albumName, + albumUsers: albumUsers ?? this.albumUsers, + assetIds: assetIds ?? this.assetIds, + description: description ?? this.description, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = CreateAlbumDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is CreateAlbumDto && + albumName == other.albumName && + albumUsers == other.albumUsers && + assetIds == other.assetIds && + description == other.description); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = CreateAlbumDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumName, albumUsers, assetIds, description]); } - // maps a json object with a list of CreateAlbumDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = CreateAlbumDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumName', - }; + @override + String toString() => + 'CreateAlbumDto(albumName=$albumName, albumUsers=$albumUsers, assetIds=$assetIds, description=$description)'; } - diff --git a/mobile/openapi/lib/model/create_library_dto.dart b/mobile/openapi/lib/model/create_library_dto.dart index ba12c62d76..b22cb6045d 100644 --- a/mobile/openapi/lib/model/create_library_dto.dart +++ b/mobile/openapi/lib/model/create_library_dto.dart @@ -1,138 +1,90 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class CreateLibraryDto { - /// Returns a new [CreateLibraryDto] instance. - CreateLibraryDto({ - this.exclusionPatterns = const [], - this.importPaths = const [], - this.name, +final class CreateLibraryDto { + const CreateLibraryDto({ + this.exclusionPatterns = const Optional.absent(), + this.importPaths = const Optional.absent(), + this.name = const Optional.absent(), required this.ownerId, }); /// Exclusion patterns (max 128) - List exclusionPatterns; + final Optional> exclusionPatterns; /// Import paths (max 128) - List importPaths; + final Optional> importPaths; /// Library name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? name; + final Optional name; /// Owner user ID - String ownerId; + final String ownerId; - @override - bool operator ==(Object other) => identical(this, other) || other is CreateLibraryDto && - _deepEquality.equals(other.exclusionPatterns, exclusionPatterns) && - _deepEquality.equals(other.importPaths, importPaths) && - other.name == name && - other.ownerId == ownerId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (exclusionPatterns.hashCode) + - (importPaths.hashCode) + - (name == null ? 0 : name!.hashCode) + - (ownerId.hashCode); - - @override - String toString() => 'CreateLibraryDto[exclusionPatterns=$exclusionPatterns, importPaths=$importPaths, name=$name, ownerId=$ownerId]'; + static CreateLibraryDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + exclusionPatterns: json.containsKey(r'exclusionPatterns') + ? Optional.present( + ((json[r'exclusionPatterns'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ) + : const Optional.absent(), + importPaths: json.containsKey(r'importPaths') + ? Optional.present(((json[r'importPaths'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + name: json.containsKey(r'name') ? Optional.present(json[r'name'] as String) : const Optional.absent(), + ownerId: json[r'ownerId'] as String, + ); + } Map toJson() { final json = {}; - json[r'exclusionPatterns'] = this.exclusionPatterns; - json[r'importPaths'] = this.importPaths; - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (exclusionPatterns case Present(:final value)) { + json[r'exclusionPatterns'] = value; } - json[r'ownerId'] = this.ownerId; + if (importPaths case Present(:final value)) { + json[r'importPaths'] = value; + } + if (name case Present(:final value)) { + json[r'name'] = value; + } + json[r'ownerId'] = ownerId; return json; } - /// Returns a new [CreateLibraryDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static CreateLibraryDto? fromJson(dynamic value) { - upgradeDto(value, "CreateLibraryDto"); - if (value is Map) { - final json = value.cast(); - - return CreateLibraryDto( - exclusionPatterns: json[r'exclusionPatterns'] is Iterable - ? (json[r'exclusionPatterns'] as Iterable).cast().toList(growable: false) - : const [], - importPaths: json[r'importPaths'] is Iterable - ? (json[r'importPaths'] as Iterable).cast().toList(growable: false) - : const [], - name: mapValueOfType(json, r'name'), - ownerId: mapValueOfType(json, r'ownerId')!, - ); - } - return null; + CreateLibraryDto copyWith({ + Optional>? exclusionPatterns, + Optional>? importPaths, + Optional? name, + String? ownerId, + }) { + return .new( + exclusionPatterns: exclusionPatterns ?? this.exclusionPatterns, + importPaths: importPaths ?? this.importPaths, + name: name ?? this.name, + ownerId: ownerId ?? this.ownerId, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = CreateLibraryDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is CreateLibraryDto && + exclusionPatterns == other.exclusionPatterns && + importPaths == other.importPaths && + name == other.name && + ownerId == other.ownerId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = CreateLibraryDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([exclusionPatterns, importPaths, name, ownerId]); } - // maps a json object with a list of CreateLibraryDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = CreateLibraryDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'ownerId', - }; + @override + String toString() => + 'CreateLibraryDto(exclusionPatterns=$exclusionPatterns, importPaths=$importPaths, name=$name, ownerId=$ownerId)'; } - diff --git a/mobile/openapi/lib/model/create_profile_image_dto.dart b/mobile/openapi/lib/model/create_profile_image_dto.dart new file mode 100644 index 0000000000..4cf3dff6b9 --- /dev/null +++ b/mobile/openapi/lib/model/create_profile_image_dto.dart @@ -0,0 +1,40 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +part of openapi.api; + +final class CreateProfileImageDto { + const CreateProfileImageDto({required this.file}); + + /// Profile image file + final MultipartFile file; + + static CreateProfileImageDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(file: (json[r'file'] as MultipartFile?)!); + } + + Map toJson() { + final json = {}; + json[r'file'] = file; + return json; + } + + CreateProfileImageDto copyWith({MultipartFile? file}) { + return .new(file: file ?? this.file); + } + + @override + bool operator ==(Object other) { + return identical(this, other) || (other is CreateProfileImageDto && file == other.file); + } + + @override + int get hashCode { + return Object.hashAll([file]); + } + + @override + String toString() => 'CreateProfileImageDto(file=$file)'; +} diff --git a/mobile/openapi/lib/model/create_profile_image_response_dto.dart b/mobile/openapi/lib/model/create_profile_image_response_dto.dart index c6ec0d94a0..7098bfc590 100644 --- a/mobile/openapi/lib/model/create_profile_image_response_dto.dart +++ b/mobile/openapi/lib/model/create_profile_image_response_dto.dart @@ -1,120 +1,65 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class CreateProfileImageResponseDto { - /// Returns a new [CreateProfileImageResponseDto] instance. - CreateProfileImageResponseDto({ +final class CreateProfileImageResponseDto { + const CreateProfileImageResponseDto({ required this.profileChangedAt, required this.profileImagePath, required this.userId, }); /// Profile image change date - DateTime profileChangedAt; + final DateTime profileChangedAt; /// Profile image file path - String profileImagePath; + final String profileImagePath; /// User ID - String userId; + final String userId; - @override - bool operator ==(Object other) => identical(this, other) || other is CreateProfileImageResponseDto && - other.profileChangedAt == profileChangedAt && - other.profileImagePath == profileImagePath && - other.userId == userId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (profileChangedAt.hashCode) + - (profileImagePath.hashCode) + - (userId.hashCode); - - @override - String toString() => 'CreateProfileImageResponseDto[profileChangedAt=$profileChangedAt, profileImagePath=$profileImagePath, userId=$userId]'; + static CreateProfileImageResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + profileChangedAt: DateTime.parse(json[r'profileChangedAt'] as String), + profileImagePath: json[r'profileImagePath'] as String, + userId: json[r'userId'] as String, + ); + } Map toJson() { final json = {}; - json[r'profileChangedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.profileChangedAt.millisecondsSinceEpoch - : this.profileChangedAt.toUtc().toIso8601String(); - json[r'profileImagePath'] = this.profileImagePath; - json[r'userId'] = this.userId; + json[r'profileChangedAt'] = profileChangedAt.toUtc().toIso8601String(); + json[r'profileImagePath'] = profileImagePath; + json[r'userId'] = userId; return json; } - /// Returns a new [CreateProfileImageResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static CreateProfileImageResponseDto? fromJson(dynamic value) { - upgradeDto(value, "CreateProfileImageResponseDto"); - if (value is Map) { - final json = value.cast(); - - return CreateProfileImageResponseDto( - profileChangedAt: mapDateTime(json, r'profileChangedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - profileImagePath: mapValueOfType(json, r'profileImagePath')!, - userId: mapValueOfType(json, r'userId')!, - ); - } - return null; + CreateProfileImageResponseDto copyWith({DateTime? profileChangedAt, String? profileImagePath, String? userId}) { + return .new( + profileChangedAt: profileChangedAt ?? this.profileChangedAt, + profileImagePath: profileImagePath ?? this.profileImagePath, + userId: userId ?? this.userId, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = CreateProfileImageResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is CreateProfileImageResponseDto && + profileChangedAt == other.profileChangedAt && + profileImagePath == other.profileImagePath && + userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = CreateProfileImageResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([profileChangedAt, profileImagePath, userId]); } - // maps a json object with a list of CreateProfileImageResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = CreateProfileImageResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'profileChangedAt', - 'profileImagePath', - 'userId', - }; + @override + String toString() => + 'CreateProfileImageResponseDto(profileChangedAt=$profileChangedAt, profileImagePath=$profileImagePath, userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/crop_parameters.dart b/mobile/openapi/lib/model/crop_parameters.dart index d19c23562b..b9a9a06577 100644 --- a/mobile/openapi/lib/model/crop_parameters.dart +++ b/mobile/openapi/lib/model/crop_parameters.dart @@ -1,139 +1,58 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class CropParameters { - /// Returns a new [CropParameters] instance. - CropParameters({ - required this.height, - required this.width, - required this.x, - required this.y, - }); +final class CropParameters { + const CropParameters({required this.height, required this.width, required this.x, required this.y}); /// Height of the crop - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - int height; + final int height; /// Width of the crop - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - int width; + final int width; /// Top-Left X coordinate of crop - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int x; + final int x; /// Top-Left Y coordinate of crop - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int y; + final int y; - @override - bool operator ==(Object other) => identical(this, other) || other is CropParameters && - other.height == height && - other.width == width && - other.x == x && - other.y == y; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (height.hashCode) + - (width.hashCode) + - (x.hashCode) + - (y.hashCode); - - @override - String toString() => 'CropParameters[height=$height, width=$width, x=$x, y=$y]'; + static CropParameters? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + height: json[r'height'] as int, + width: json[r'width'] as int, + x: json[r'x'] as int, + y: json[r'y'] as int, + ); + } Map toJson() { final json = {}; - json[r'height'] = this.height; - json[r'width'] = this.width; - json[r'x'] = this.x; - json[r'y'] = this.y; + json[r'height'] = height; + json[r'width'] = width; + json[r'x'] = x; + json[r'y'] = y; return json; } - /// Returns a new [CropParameters] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static CropParameters? fromJson(dynamic value) { - upgradeDto(value, "CropParameters"); - if (value is Map) { - final json = value.cast(); - - return CropParameters( - height: mapValueOfType(json, r'height')!, - width: mapValueOfType(json, r'width')!, - x: mapValueOfType(json, r'x')!, - y: mapValueOfType(json, r'y')!, - ); - } - return null; + CropParameters copyWith({int? height, int? width, int? x, int? y}) { + return .new(height: height ?? this.height, width: width ?? this.width, x: x ?? this.x, y: y ?? this.y); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = CropParameters.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is CropParameters && height == other.height && width == other.width && x == other.x && y == other.y); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = CropParameters.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([height, width, x, y]); } - // maps a json object with a list of CropParameters-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = CropParameters.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'height', - 'width', - 'x', - 'y', - }; + @override + String toString() => 'CropParameters(height=$height, width=$width, x=$x, y=$y)'; } - diff --git a/mobile/openapi/lib/model/database_backup_config.dart b/mobile/openapi/lib/model/database_backup_config.dart index 4beb32849e..20ebbd0a3a 100644 --- a/mobile/openapi/lib/model/database_backup_config.dart +++ b/mobile/openapi/lib/model/database_backup_config.dart @@ -1,121 +1,61 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DatabaseBackupConfig { - /// Returns a new [DatabaseBackupConfig] instance. - DatabaseBackupConfig({ - required this.cronExpression, - required this.enabled, - required this.keepLastAmount, - }); +final class DatabaseBackupConfig { + const DatabaseBackupConfig({required this.cronExpression, required this.enabled, required this.keepLastAmount}); /// Cron expression - String cronExpression; + final String cronExpression; /// Enabled - bool enabled; + final bool enabled; /// Keep last amount - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - int keepLastAmount; + final int keepLastAmount; - @override - bool operator ==(Object other) => identical(this, other) || other is DatabaseBackupConfig && - other.cronExpression == cronExpression && - other.enabled == enabled && - other.keepLastAmount == keepLastAmount; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (cronExpression.hashCode) + - (enabled.hashCode) + - (keepLastAmount.hashCode); - - @override - String toString() => 'DatabaseBackupConfig[cronExpression=$cronExpression, enabled=$enabled, keepLastAmount=$keepLastAmount]'; + static DatabaseBackupConfig? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + cronExpression: json[r'cronExpression'] as String, + enabled: json[r'enabled'] as bool, + keepLastAmount: json[r'keepLastAmount'] as int, + ); + } Map toJson() { final json = {}; - json[r'cronExpression'] = this.cronExpression; - json[r'enabled'] = this.enabled; - json[r'keepLastAmount'] = this.keepLastAmount; + json[r'cronExpression'] = cronExpression; + json[r'enabled'] = enabled; + json[r'keepLastAmount'] = keepLastAmount; return json; } - /// Returns a new [DatabaseBackupConfig] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DatabaseBackupConfig? fromJson(dynamic value) { - upgradeDto(value, "DatabaseBackupConfig"); - if (value is Map) { - final json = value.cast(); - - return DatabaseBackupConfig( - cronExpression: mapValueOfType(json, r'cronExpression')!, - enabled: mapValueOfType(json, r'enabled')!, - keepLastAmount: mapValueOfType(json, r'keepLastAmount')!, - ); - } - return null; + DatabaseBackupConfig copyWith({String? cronExpression, bool? enabled, int? keepLastAmount}) { + return .new( + cronExpression: cronExpression ?? this.cronExpression, + enabled: enabled ?? this.enabled, + keepLastAmount: keepLastAmount ?? this.keepLastAmount, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DatabaseBackupConfig.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DatabaseBackupConfig && + cronExpression == other.cronExpression && + enabled == other.enabled && + keepLastAmount == other.keepLastAmount); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DatabaseBackupConfig.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([cronExpression, enabled, keepLastAmount]); } - // maps a json object with a list of DatabaseBackupConfig-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DatabaseBackupConfig.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'cronExpression', - 'enabled', - 'keepLastAmount', - }; + @override + String toString() => + 'DatabaseBackupConfig(cronExpression=$cronExpression, enabled=$enabled, keepLastAmount=$keepLastAmount)'; } - diff --git a/mobile/openapi/lib/model/database_backup_delete_dto.dart b/mobile/openapi/lib/model/database_backup_delete_dto.dart index c336270b84..cf4c22a369 100644 --- a/mobile/openapi/lib/model/database_backup_delete_dto.dart +++ b/mobile/openapi/lib/model/database_backup_delete_dto.dart @@ -1,102 +1,41 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DatabaseBackupDeleteDto { - /// Returns a new [DatabaseBackupDeleteDto] instance. - DatabaseBackupDeleteDto({ - this.backups = const [], - }); +final class DatabaseBackupDeleteDto { + const DatabaseBackupDeleteDto({required this.backups}); /// Backup filenames to delete - List backups; + final List backups; - @override - bool operator ==(Object other) => identical(this, other) || other is DatabaseBackupDeleteDto && - _deepEquality.equals(other.backups, backups); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (backups.hashCode); - - @override - String toString() => 'DatabaseBackupDeleteDto[backups=$backups]'; + static DatabaseBackupDeleteDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(backups: ((json[r'backups'] as List?)?.map(($e) => $e as String).toList(growable: false))!); + } Map toJson() { final json = {}; - json[r'backups'] = this.backups; + json[r'backups'] = backups; return json; } - /// Returns a new [DatabaseBackupDeleteDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DatabaseBackupDeleteDto? fromJson(dynamic value) { - upgradeDto(value, "DatabaseBackupDeleteDto"); - if (value is Map) { - final json = value.cast(); - - return DatabaseBackupDeleteDto( - backups: json[r'backups'] is Iterable - ? (json[r'backups'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + DatabaseBackupDeleteDto copyWith({List? backups}) { + return .new(backups: backups ?? this.backups); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DatabaseBackupDeleteDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DatabaseBackupDeleteDto && const DeepCollectionEquality().equals(backups, other.backups)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DatabaseBackupDeleteDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(backups)]); } - // maps a json object with a list of DatabaseBackupDeleteDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DatabaseBackupDeleteDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'backups', - }; + @override + String toString() => 'DatabaseBackupDeleteDto(backups=$backups)'; } - diff --git a/mobile/openapi/lib/model/database_backup_dto.dart b/mobile/openapi/lib/model/database_backup_dto.dart index 5a2590da40..55912c2eb7 100644 --- a/mobile/openapi/lib/model/database_backup_dto.dart +++ b/mobile/openapi/lib/model/database_backup_dto.dart @@ -1,121 +1,60 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DatabaseBackupDto { - /// Returns a new [DatabaseBackupDto] instance. - DatabaseBackupDto({ - required this.filename, - required this.filesize, - required this.timezone, - }); +final class DatabaseBackupDto { + const DatabaseBackupDto({required this.filename, required this.filesize, required this.timezone}); /// Backup filename - String filename; + final String filename; /// Backup file size - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int filesize; + final int filesize; /// Backup timezone - String timezone; + final String timezone; - @override - bool operator ==(Object other) => identical(this, other) || other is DatabaseBackupDto && - other.filename == filename && - other.filesize == filesize && - other.timezone == timezone; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (filename.hashCode) + - (filesize.hashCode) + - (timezone.hashCode); - - @override - String toString() => 'DatabaseBackupDto[filename=$filename, filesize=$filesize, timezone=$timezone]'; + static DatabaseBackupDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + filename: json[r'filename'] as String, + filesize: json[r'filesize'] as int, + timezone: json[r'timezone'] as String, + ); + } Map toJson() { final json = {}; - json[r'filename'] = this.filename; - json[r'filesize'] = this.filesize; - json[r'timezone'] = this.timezone; + json[r'filename'] = filename; + json[r'filesize'] = filesize; + json[r'timezone'] = timezone; return json; } - /// Returns a new [DatabaseBackupDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DatabaseBackupDto? fromJson(dynamic value) { - upgradeDto(value, "DatabaseBackupDto"); - if (value is Map) { - final json = value.cast(); - - return DatabaseBackupDto( - filename: mapValueOfType(json, r'filename')!, - filesize: mapValueOfType(json, r'filesize')!, - timezone: mapValueOfType(json, r'timezone')!, - ); - } - return null; + DatabaseBackupDto copyWith({String? filename, int? filesize, String? timezone}) { + return .new( + filename: filename ?? this.filename, + filesize: filesize ?? this.filesize, + timezone: timezone ?? this.timezone, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DatabaseBackupDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DatabaseBackupDto && + filename == other.filename && + filesize == other.filesize && + timezone == other.timezone); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DatabaseBackupDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([filename, filesize, timezone]); } - // maps a json object with a list of DatabaseBackupDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DatabaseBackupDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'filename', - 'filesize', - 'timezone', - }; + @override + String toString() => 'DatabaseBackupDto(filename=$filename, filesize=$filesize, timezone=$timezone)'; } - diff --git a/mobile/openapi/lib/model/database_backup_list_response_dto.dart b/mobile/openapi/lib/model/database_backup_list_response_dto.dart index de7bf78d5a..8e85149713 100644 --- a/mobile/openapi/lib/model/database_backup_list_response_dto.dart +++ b/mobile/openapi/lib/model/database_backup_list_response_dto.dart @@ -1,100 +1,43 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DatabaseBackupListResponseDto { - /// Returns a new [DatabaseBackupListResponseDto] instance. - DatabaseBackupListResponseDto({ - this.backups = const [], - }); +final class DatabaseBackupListResponseDto { + const DatabaseBackupListResponseDto({required this.backups}); /// List of backups - List backups; + final List backups; - @override - bool operator ==(Object other) => identical(this, other) || other is DatabaseBackupListResponseDto && - _deepEquality.equals(other.backups, backups); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (backups.hashCode); - - @override - String toString() => 'DatabaseBackupListResponseDto[backups=$backups]'; + static DatabaseBackupListResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + backups: ((json[r'backups'] as List?)?.map(($e) => (DatabaseBackupDto.fromJson($e))!).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'backups'] = this.backups; + json[r'backups'] = backups.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [DatabaseBackupListResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DatabaseBackupListResponseDto? fromJson(dynamic value) { - upgradeDto(value, "DatabaseBackupListResponseDto"); - if (value is Map) { - final json = value.cast(); - - return DatabaseBackupListResponseDto( - backups: DatabaseBackupDto.listFromJson(json[r'backups']), - ); - } - return null; + DatabaseBackupListResponseDto copyWith({List? backups}) { + return .new(backups: backups ?? this.backups); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DatabaseBackupListResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DatabaseBackupListResponseDto && const DeepCollectionEquality().equals(backups, other.backups)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DatabaseBackupListResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(backups)]); } - // maps a json object with a list of DatabaseBackupListResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DatabaseBackupListResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'backups', - }; + @override + String toString() => 'DatabaseBackupListResponseDto(backups=$backups)'; } - diff --git a/mobile/openapi/lib/model/database_backup_upload_dto.dart b/mobile/openapi/lib/model/database_backup_upload_dto.dart new file mode 100644 index 0000000000..7eefba8532 --- /dev/null +++ b/mobile/openapi/lib/model/database_backup_upload_dto.dart @@ -0,0 +1,44 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +part of openapi.api; + +final class DatabaseBackupUploadDto { + const DatabaseBackupUploadDto({this.file}); + + /// Database backup file + final MultipartFile? file; + + static const _undefined = Object(); + + static DatabaseBackupUploadDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(file: (json[r'file'] as MultipartFile?)); + } + + Map toJson() { + final json = {}; + if (file != null) { + json[r'file'] = file!; + } + return json; + } + + DatabaseBackupUploadDto copyWith({Object? file = _undefined}) { + return .new(file: identical(file, _undefined) ? this.file : file as MultipartFile?); + } + + @override + bool operator ==(Object other) { + return identical(this, other) || (other is DatabaseBackupUploadDto && file == other.file); + } + + @override + int get hashCode { + return Object.hashAll([file]); + } + + @override + String toString() => 'DatabaseBackupUploadDto(file=$file)'; +} diff --git a/mobile/openapi/lib/model/download_archive_dto.dart b/mobile/openapi/lib/model/download_archive_dto.dart index 20e8527f18..12ac0b742d 100644 --- a/mobile/openapi/lib/model/download_archive_dto.dart +++ b/mobile/openapi/lib/model/download_archive_dto.dart @@ -1,120 +1,52 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DownloadArchiveDto { - /// Returns a new [DownloadArchiveDto] instance. - DownloadArchiveDto({ - this.assetIds = const [], - this.edited, - }); +final class DownloadArchiveDto { + const DownloadArchiveDto({required this.assetIds, this.edited = const Optional.absent()}); /// Asset IDs - List assetIds; + final List assetIds; /// Download edited asset if available - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? edited; + final Optional edited; - @override - bool operator ==(Object other) => identical(this, other) || other is DownloadArchiveDto && - _deepEquality.equals(other.assetIds, assetIds) && - other.edited == edited; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetIds.hashCode) + - (edited == null ? 0 : edited!.hashCode); - - @override - String toString() => 'DownloadArchiveDto[assetIds=$assetIds, edited=$edited]'; + static DownloadArchiveDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetIds: ((json[r'assetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + edited: json.containsKey(r'edited') ? Optional.present(json[r'edited'] as bool) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'assetIds'] = this.assetIds; - if (this.edited != null) { - json[r'edited'] = this.edited; - } else { - // json[r'edited'] = null; + json[r'assetIds'] = assetIds; + if (edited case Present(:final value)) { + json[r'edited'] = value; } return json; } - /// Returns a new [DownloadArchiveDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DownloadArchiveDto? fromJson(dynamic value) { - upgradeDto(value, "DownloadArchiveDto"); - if (value is Map) { - final json = value.cast(); - - return DownloadArchiveDto( - assetIds: json[r'assetIds'] is Iterable - ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) - : const [], - edited: mapValueOfType(json, r'edited'), - ); - } - return null; + DownloadArchiveDto copyWith({List? assetIds, Optional? edited}) { + return .new(assetIds: assetIds ?? this.assetIds, edited: edited ?? this.edited); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DownloadArchiveDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DownloadArchiveDto && + const DeepCollectionEquality().equals(assetIds, other.assetIds) && + edited == other.edited); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DownloadArchiveDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(assetIds), edited]); } - // maps a json object with a list of DownloadArchiveDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DownloadArchiveDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetIds', - }; + @override + String toString() => 'DownloadArchiveDto(assetIds=$assetIds, edited=$edited)'; } - diff --git a/mobile/openapi/lib/model/download_archive_info.dart b/mobile/openapi/lib/model/download_archive_info.dart index dcb1258457..47542a7023 100644 --- a/mobile/openapi/lib/model/download_archive_info.dart +++ b/mobile/openapi/lib/model/download_archive_info.dart @@ -1,114 +1,50 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DownloadArchiveInfo { - /// Returns a new [DownloadArchiveInfo] instance. - DownloadArchiveInfo({ - this.assetIds = const [], - required this.size, - }); +final class DownloadArchiveInfo { + const DownloadArchiveInfo({required this.assetIds, required this.size}); /// Asset IDs in this archive - List assetIds; + final List assetIds; /// Archive size in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int size; + final int size; - @override - bool operator ==(Object other) => identical(this, other) || other is DownloadArchiveInfo && - _deepEquality.equals(other.assetIds, assetIds) && - other.size == size; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetIds.hashCode) + - (size.hashCode); - - @override - String toString() => 'DownloadArchiveInfo[assetIds=$assetIds, size=$size]'; + static DownloadArchiveInfo? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetIds: ((json[r'assetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + size: json[r'size'] as int, + ); + } Map toJson() { final json = {}; - json[r'assetIds'] = this.assetIds; - json[r'size'] = this.size; + json[r'assetIds'] = assetIds; + json[r'size'] = size; return json; } - /// Returns a new [DownloadArchiveInfo] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DownloadArchiveInfo? fromJson(dynamic value) { - upgradeDto(value, "DownloadArchiveInfo"); - if (value is Map) { - final json = value.cast(); - - return DownloadArchiveInfo( - assetIds: json[r'assetIds'] is Iterable - ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) - : const [], - size: mapValueOfType(json, r'size')!, - ); - } - return null; + DownloadArchiveInfo copyWith({List? assetIds, int? size}) { + return .new(assetIds: assetIds ?? this.assetIds, size: size ?? this.size); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DownloadArchiveInfo.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DownloadArchiveInfo && + const DeepCollectionEquality().equals(assetIds, other.assetIds) && + size == other.size); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DownloadArchiveInfo.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(assetIds), size]); } - // maps a json object with a list of DownloadArchiveInfo-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DownloadArchiveInfo.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetIds', - 'size', - }; + @override + String toString() => 'DownloadArchiveInfo(assetIds=$assetIds, size=$size)'; } - diff --git a/mobile/openapi/lib/model/download_info_dto.dart b/mobile/openapi/lib/model/download_info_dto.dart index 8a0cebd945..69050a87a2 100644 --- a/mobile/openapi/lib/model/download_info_dto.dart +++ b/mobile/openapi/lib/model/download_info_dto.dart @@ -1,158 +1,90 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DownloadInfoDto { - /// Returns a new [DownloadInfoDto] instance. - DownloadInfoDto({ - this.albumId, - this.archiveSize, - this.assetIds = const [], - this.userId, +final class DownloadInfoDto { + const DownloadInfoDto({ + this.albumId = const Optional.absent(), + this.archiveSize = const Optional.absent(), + this.assetIds = const Optional.absent(), + this.userId = const Optional.absent(), }); /// Album ID to download - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? albumId; + final Optional albumId; /// Archive size limit in bytes - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - int? archiveSize; + final Optional archiveSize; /// Asset IDs to download - List assetIds; + final Optional> assetIds; /// User ID to download assets from - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? userId; + final Optional userId; - @override - bool operator ==(Object other) => identical(this, other) || other is DownloadInfoDto && - other.albumId == albumId && - other.archiveSize == archiveSize && - _deepEquality.equals(other.assetIds, assetIds) && - other.userId == userId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumId == null ? 0 : albumId!.hashCode) + - (archiveSize == null ? 0 : archiveSize!.hashCode) + - (assetIds.hashCode) + - (userId == null ? 0 : userId!.hashCode); - - @override - String toString() => 'DownloadInfoDto[albumId=$albumId, archiveSize=$archiveSize, assetIds=$assetIds, userId=$userId]'; + static DownloadInfoDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumId: json.containsKey(r'albumId') ? Optional.present(json[r'albumId'] as String) : const Optional.absent(), + archiveSize: json.containsKey(r'archiveSize') + ? Optional.present(json[r'archiveSize'] as int) + : const Optional.absent(), + assetIds: json.containsKey(r'assetIds') + ? Optional.present(((json[r'assetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + userId: json.containsKey(r'userId') ? Optional.present(json[r'userId'] as String) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.albumId != null) { - json[r'albumId'] = this.albumId; - } else { - // json[r'albumId'] = null; + if (albumId case Present(:final value)) { + json[r'albumId'] = value; } - if (this.archiveSize != null) { - json[r'archiveSize'] = this.archiveSize; - } else { - // json[r'archiveSize'] = null; + if (archiveSize case Present(:final value)) { + json[r'archiveSize'] = value; } - json[r'assetIds'] = this.assetIds; - if (this.userId != null) { - json[r'userId'] = this.userId; - } else { - // json[r'userId'] = null; + if (assetIds case Present(:final value)) { + json[r'assetIds'] = value; + } + if (userId case Present(:final value)) { + json[r'userId'] = value; } return json; } - /// Returns a new [DownloadInfoDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DownloadInfoDto? fromJson(dynamic value) { - upgradeDto(value, "DownloadInfoDto"); - if (value is Map) { - final json = value.cast(); - - return DownloadInfoDto( - albumId: mapValueOfType(json, r'albumId'), - archiveSize: mapValueOfType(json, r'archiveSize'), - assetIds: json[r'assetIds'] is Iterable - ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) - : const [], - userId: mapValueOfType(json, r'userId'), - ); - } - return null; + DownloadInfoDto copyWith({ + Optional? albumId, + Optional? archiveSize, + Optional>? assetIds, + Optional? userId, + }) { + return .new( + albumId: albumId ?? this.albumId, + archiveSize: archiveSize ?? this.archiveSize, + assetIds: assetIds ?? this.assetIds, + userId: userId ?? this.userId, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DownloadInfoDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DownloadInfoDto && + albumId == other.albumId && + archiveSize == other.archiveSize && + assetIds == other.assetIds && + userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DownloadInfoDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumId, archiveSize, assetIds, userId]); } - // maps a json object with a list of DownloadInfoDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DownloadInfoDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'DownloadInfoDto(albumId=$albumId, archiveSize=$archiveSize, assetIds=$assetIds, userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/download_response.dart b/mobile/openapi/lib/model/download_response.dart index bc1d7b4047..5b6c04e17a 100644 --- a/mobile/openapi/lib/model/download_response.dart +++ b/mobile/openapi/lib/model/download_response.dart @@ -1,112 +1,53 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DownloadResponse { - /// Returns a new [DownloadResponse] instance. - DownloadResponse({ - required this.archiveSize, - required this.includeEmbeddedVideos, - }); +final class DownloadResponse { + const DownloadResponse({required this.archiveSize, required this.includeEmbeddedVideos}); /// Maximum archive size in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int archiveSize; + final int archiveSize; /// Whether to include embedded videos in downloads - bool includeEmbeddedVideos; + final bool includeEmbeddedVideos; - @override - bool operator ==(Object other) => identical(this, other) || other is DownloadResponse && - other.archiveSize == archiveSize && - other.includeEmbeddedVideos == includeEmbeddedVideos; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (archiveSize.hashCode) + - (includeEmbeddedVideos.hashCode); - - @override - String toString() => 'DownloadResponse[archiveSize=$archiveSize, includeEmbeddedVideos=$includeEmbeddedVideos]'; + static DownloadResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + archiveSize: json[r'archiveSize'] as int, + includeEmbeddedVideos: json[r'includeEmbeddedVideos'] as bool, + ); + } Map toJson() { final json = {}; - json[r'archiveSize'] = this.archiveSize; - json[r'includeEmbeddedVideos'] = this.includeEmbeddedVideos; + json[r'archiveSize'] = archiveSize; + json[r'includeEmbeddedVideos'] = includeEmbeddedVideos; return json; } - /// Returns a new [DownloadResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DownloadResponse? fromJson(dynamic value) { - upgradeDto(value, "DownloadResponse"); - if (value is Map) { - final json = value.cast(); - - return DownloadResponse( - archiveSize: mapValueOfType(json, r'archiveSize')!, - includeEmbeddedVideos: mapValueOfType(json, r'includeEmbeddedVideos')!, - ); - } - return null; + DownloadResponse copyWith({int? archiveSize, bool? includeEmbeddedVideos}) { + return .new( + archiveSize: archiveSize ?? this.archiveSize, + includeEmbeddedVideos: includeEmbeddedVideos ?? this.includeEmbeddedVideos, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DownloadResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DownloadResponse && + archiveSize == other.archiveSize && + includeEmbeddedVideos == other.includeEmbeddedVideos); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DownloadResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([archiveSize, includeEmbeddedVideos]); } - // maps a json object with a list of DownloadResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DownloadResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'archiveSize', - 'includeEmbeddedVideos', - }; + @override + String toString() => 'DownloadResponse(archiveSize=$archiveSize, includeEmbeddedVideos=$includeEmbeddedVideos)'; } - diff --git a/mobile/openapi/lib/model/download_response_dto.dart b/mobile/openapi/lib/model/download_response_dto.dart index bfe32307fa..b5fc06305d 100644 --- a/mobile/openapi/lib/model/download_response_dto.dart +++ b/mobile/openapi/lib/model/download_response_dto.dart @@ -1,112 +1,52 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DownloadResponseDto { - /// Returns a new [DownloadResponseDto] instance. - DownloadResponseDto({ - this.archives = const [], - required this.totalSize, - }); +final class DownloadResponseDto { + const DownloadResponseDto({required this.archives, required this.totalSize}); /// Archive information - List archives; + final List archives; /// Total size in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int totalSize; + final int totalSize; - @override - bool operator ==(Object other) => identical(this, other) || other is DownloadResponseDto && - _deepEquality.equals(other.archives, archives) && - other.totalSize == totalSize; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (archives.hashCode) + - (totalSize.hashCode); - - @override - String toString() => 'DownloadResponseDto[archives=$archives, totalSize=$totalSize]'; + static DownloadResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + archives: ((json[r'archives'] as List?) + ?.map(($e) => (DownloadArchiveInfo.fromJson($e))!) + .toList(growable: false))!, + totalSize: json[r'totalSize'] as int, + ); + } Map toJson() { final json = {}; - json[r'archives'] = this.archives; - json[r'totalSize'] = this.totalSize; + json[r'archives'] = archives.map(($e) => $e.toJson()).toList(growable: false); + json[r'totalSize'] = totalSize; return json; } - /// Returns a new [DownloadResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DownloadResponseDto? fromJson(dynamic value) { - upgradeDto(value, "DownloadResponseDto"); - if (value is Map) { - final json = value.cast(); - - return DownloadResponseDto( - archives: DownloadArchiveInfo.listFromJson(json[r'archives']), - totalSize: mapValueOfType(json, r'totalSize')!, - ); - } - return null; + DownloadResponseDto copyWith({List? archives, int? totalSize}) { + return .new(archives: archives ?? this.archives, totalSize: totalSize ?? this.totalSize); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DownloadResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DownloadResponseDto && + const DeepCollectionEquality().equals(archives, other.archives) && + totalSize == other.totalSize); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DownloadResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(archives), totalSize]); } - // maps a json object with a list of DownloadResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DownloadResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'archives', - 'totalSize', - }; + @override + String toString() => 'DownloadResponseDto(archives=$archives, totalSize=$totalSize)'; } - diff --git a/mobile/openapi/lib/model/download_update.dart b/mobile/openapi/lib/model/download_update.dart index c5feb9df43..1d2c68f5be 100644 --- a/mobile/openapi/lib/model/download_update.dart +++ b/mobile/openapi/lib/model/download_update.dart @@ -1,130 +1,61 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DownloadUpdate { - /// Returns a new [DownloadUpdate] instance. - DownloadUpdate({ - this.archiveSize, - this.includeEmbeddedVideos, - }); +final class DownloadUpdate { + const DownloadUpdate({this.archiveSize, this.includeEmbeddedVideos}); /// Maximum archive size in bytes - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - int? archiveSize; + final int? archiveSize; /// Whether to include embedded videos in downloads - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? includeEmbeddedVideos; + final bool? includeEmbeddedVideos; - @override - bool operator ==(Object other) => identical(this, other) || other is DownloadUpdate && - other.archiveSize == archiveSize && - other.includeEmbeddedVideos == includeEmbeddedVideos; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (archiveSize == null ? 0 : archiveSize!.hashCode) + - (includeEmbeddedVideos == null ? 0 : includeEmbeddedVideos!.hashCode); - - @override - String toString() => 'DownloadUpdate[archiveSize=$archiveSize, includeEmbeddedVideos=$includeEmbeddedVideos]'; + static DownloadUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + archiveSize: (json[r'archiveSize'] as int?), + includeEmbeddedVideos: (json[r'includeEmbeddedVideos'] as bool?), + ); + } Map toJson() { final json = {}; - if (this.archiveSize != null) { - json[r'archiveSize'] = this.archiveSize; - } else { - // json[r'archiveSize'] = null; + if (archiveSize != null) { + json[r'archiveSize'] = archiveSize!; } - if (this.includeEmbeddedVideos != null) { - json[r'includeEmbeddedVideos'] = this.includeEmbeddedVideos; - } else { - // json[r'includeEmbeddedVideos'] = null; + if (includeEmbeddedVideos != null) { + json[r'includeEmbeddedVideos'] = includeEmbeddedVideos!; } return json; } - /// Returns a new [DownloadUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DownloadUpdate? fromJson(dynamic value) { - upgradeDto(value, "DownloadUpdate"); - if (value is Map) { - final json = value.cast(); - - return DownloadUpdate( - archiveSize: mapValueOfType(json, r'archiveSize'), - includeEmbeddedVideos: mapValueOfType(json, r'includeEmbeddedVideos'), - ); - } - return null; + DownloadUpdate copyWith({Object? archiveSize = _undefined, Object? includeEmbeddedVideos = _undefined}) { + return .new( + archiveSize: identical(archiveSize, _undefined) ? this.archiveSize : archiveSize as int?, + includeEmbeddedVideos: identical(includeEmbeddedVideos, _undefined) + ? this.includeEmbeddedVideos + : includeEmbeddedVideos as bool?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DownloadUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DownloadUpdate && + archiveSize == other.archiveSize && + includeEmbeddedVideos == other.includeEmbeddedVideos); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DownloadUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([archiveSize, includeEmbeddedVideos]); } - // maps a json object with a list of DownloadUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DownloadUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'DownloadUpdate(archiveSize=$archiveSize, includeEmbeddedVideos=$includeEmbeddedVideos)'; } - diff --git a/mobile/openapi/lib/model/duplicate_detection_config.dart b/mobile/openapi/lib/model/duplicate_detection_config.dart index 43233826ef..832745d604 100644 --- a/mobile/openapi/lib/model/duplicate_detection_config.dart +++ b/mobile/openapi/lib/model/duplicate_detection_config.dart @@ -1,112 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DuplicateDetectionConfig { - /// Returns a new [DuplicateDetectionConfig] instance. - DuplicateDetectionConfig({ - required this.enabled, - required this.maxDistance, - }); +final class DuplicateDetectionConfig { + const DuplicateDetectionConfig({required this.enabled, required this.maxDistance}); /// Whether the task is enabled - bool enabled; + final bool enabled; /// Maximum distance threshold for duplicate detection - /// - /// Minimum value: 0.001 - /// Maximum value: 0.1 - double maxDistance; + final double maxDistance; - @override - bool operator ==(Object other) => identical(this, other) || other is DuplicateDetectionConfig && - other.enabled == enabled && - other.maxDistance == maxDistance; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (maxDistance.hashCode); - - @override - String toString() => 'DuplicateDetectionConfig[enabled=$enabled, maxDistance=$maxDistance]'; + static DuplicateDetectionConfig? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool, maxDistance: (json[r'maxDistance'] as num).toDouble()); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'maxDistance'] = this.maxDistance; + json[r'enabled'] = enabled; + json[r'maxDistance'] = maxDistance; return json; } - /// Returns a new [DuplicateDetectionConfig] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DuplicateDetectionConfig? fromJson(dynamic value) { - upgradeDto(value, "DuplicateDetectionConfig"); - if (value is Map) { - final json = value.cast(); - - return DuplicateDetectionConfig( - enabled: mapValueOfType(json, r'enabled')!, - maxDistance: (mapValueOfType(json, r'maxDistance')!).toDouble(), - ); - } - return null; + DuplicateDetectionConfig copyWith({bool? enabled, double? maxDistance}) { + return .new(enabled: enabled ?? this.enabled, maxDistance: maxDistance ?? this.maxDistance); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DuplicateDetectionConfig.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DuplicateDetectionConfig && enabled == other.enabled && maxDistance == other.maxDistance); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DuplicateDetectionConfig.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, maxDistance]); } - // maps a json object with a list of DuplicateDetectionConfig-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DuplicateDetectionConfig.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'maxDistance', - }; + @override + String toString() => 'DuplicateDetectionConfig(enabled=$enabled, maxDistance=$maxDistance)'; } - diff --git a/mobile/openapi/lib/model/duplicate_resolve_dto.dart b/mobile/openapi/lib/model/duplicate_resolve_dto.dart index 3466d3a620..e915beb6c9 100644 --- a/mobile/openapi/lib/model/duplicate_resolve_dto.dart +++ b/mobile/openapi/lib/model/duplicate_resolve_dto.dart @@ -1,100 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DuplicateResolveDto { - /// Returns a new [DuplicateResolveDto] instance. - DuplicateResolveDto({ - this.groups = const [], - }); +final class DuplicateResolveDto { + const DuplicateResolveDto({required this.groups}); /// List of duplicate groups to resolve - List groups; + final List groups; - @override - bool operator ==(Object other) => identical(this, other) || other is DuplicateResolveDto && - _deepEquality.equals(other.groups, groups); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (groups.hashCode); - - @override - String toString() => 'DuplicateResolveDto[groups=$groups]'; + static DuplicateResolveDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + groups: ((json[r'groups'] as List?) + ?.map(($e) => (DuplicateResolveGroupDto.fromJson($e))!) + .toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'groups'] = this.groups; + json[r'groups'] = groups.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [DuplicateResolveDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DuplicateResolveDto? fromJson(dynamic value) { - upgradeDto(value, "DuplicateResolveDto"); - if (value is Map) { - final json = value.cast(); - - return DuplicateResolveDto( - groups: DuplicateResolveGroupDto.listFromJson(json[r'groups']), - ); - } - return null; + DuplicateResolveDto copyWith({List? groups}) { + return .new(groups: groups ?? this.groups); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DuplicateResolveDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DuplicateResolveDto && const DeepCollectionEquality().equals(groups, other.groups)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DuplicateResolveDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(groups)]); } - // maps a json object with a list of DuplicateResolveDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DuplicateResolveDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'groups', - }; + @override + String toString() => 'DuplicateResolveDto(groups=$groups)'; } - diff --git a/mobile/openapi/lib/model/duplicate_resolve_group_dto.dart b/mobile/openapi/lib/model/duplicate_resolve_group_dto.dart index 94ca53eb7d..acddf38329 100644 --- a/mobile/openapi/lib/model/duplicate_resolve_group_dto.dart +++ b/mobile/openapi/lib/model/duplicate_resolve_group_dto.dart @@ -1,121 +1,64 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DuplicateResolveGroupDto { - /// Returns a new [DuplicateResolveGroupDto] instance. - DuplicateResolveGroupDto({ - required this.duplicateId, - this.keepAssetIds = const [], - this.trashAssetIds = const [], - }); +final class DuplicateResolveGroupDto { + const DuplicateResolveGroupDto({required this.duplicateId, required this.keepAssetIds, required this.trashAssetIds}); - String duplicateId; + final String duplicateId; /// Asset IDs to keep - List keepAssetIds; + final List keepAssetIds; /// Asset IDs to trash or delete - List trashAssetIds; + final List trashAssetIds; - @override - bool operator ==(Object other) => identical(this, other) || other is DuplicateResolveGroupDto && - other.duplicateId == duplicateId && - _deepEquality.equals(other.keepAssetIds, keepAssetIds) && - _deepEquality.equals(other.trashAssetIds, trashAssetIds); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (duplicateId.hashCode) + - (keepAssetIds.hashCode) + - (trashAssetIds.hashCode); - - @override - String toString() => 'DuplicateResolveGroupDto[duplicateId=$duplicateId, keepAssetIds=$keepAssetIds, trashAssetIds=$trashAssetIds]'; + static DuplicateResolveGroupDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + duplicateId: json[r'duplicateId'] as String, + keepAssetIds: ((json[r'keepAssetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + trashAssetIds: ((json[r'trashAssetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'duplicateId'] = this.duplicateId; - json[r'keepAssetIds'] = this.keepAssetIds; - json[r'trashAssetIds'] = this.trashAssetIds; + json[r'duplicateId'] = duplicateId; + json[r'keepAssetIds'] = keepAssetIds; + json[r'trashAssetIds'] = trashAssetIds; return json; } - /// Returns a new [DuplicateResolveGroupDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DuplicateResolveGroupDto? fromJson(dynamic value) { - upgradeDto(value, "DuplicateResolveGroupDto"); - if (value is Map) { - final json = value.cast(); - - return DuplicateResolveGroupDto( - duplicateId: mapValueOfType(json, r'duplicateId')!, - keepAssetIds: json[r'keepAssetIds'] is Iterable - ? (json[r'keepAssetIds'] as Iterable).cast().toList(growable: false) - : const [], - trashAssetIds: json[r'trashAssetIds'] is Iterable - ? (json[r'trashAssetIds'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + DuplicateResolveGroupDto copyWith({String? duplicateId, List? keepAssetIds, List? trashAssetIds}) { + return .new( + duplicateId: duplicateId ?? this.duplicateId, + keepAssetIds: keepAssetIds ?? this.keepAssetIds, + trashAssetIds: trashAssetIds ?? this.trashAssetIds, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DuplicateResolveGroupDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DuplicateResolveGroupDto && + duplicateId == other.duplicateId && + const DeepCollectionEquality().equals(keepAssetIds, other.keepAssetIds) && + const DeepCollectionEquality().equals(trashAssetIds, other.trashAssetIds)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DuplicateResolveGroupDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + duplicateId, + const DeepCollectionEquality().hash(keepAssetIds), + const DeepCollectionEquality().hash(trashAssetIds), + ]); } - // maps a json object with a list of DuplicateResolveGroupDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DuplicateResolveGroupDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'duplicateId', - 'keepAssetIds', - 'trashAssetIds', - }; + @override + String toString() => + 'DuplicateResolveGroupDto(duplicateId=$duplicateId, keepAssetIds=$keepAssetIds, trashAssetIds=$trashAssetIds)'; } - diff --git a/mobile/openapi/lib/model/duplicate_response_dto.dart b/mobile/openapi/lib/model/duplicate_response_dto.dart index f0ddbb4fdd..bc19319d1e 100644 --- a/mobile/openapi/lib/model/duplicate_response_dto.dart +++ b/mobile/openapi/lib/model/duplicate_response_dto.dart @@ -1,120 +1,71 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class DuplicateResponseDto { - /// Returns a new [DuplicateResponseDto] instance. - DuplicateResponseDto({ - this.assets = const [], - required this.duplicateId, - this.suggestedKeepAssetIds = const [], - }); +final class DuplicateResponseDto { + const DuplicateResponseDto({required this.assets, required this.duplicateId, required this.suggestedKeepAssetIds}); /// Duplicate assets - List assets; + final List assets; /// Duplicate group ID - String duplicateId; + final String duplicateId; /// Suggested asset IDs to keep based on file size and EXIF data - List suggestedKeepAssetIds; + final List suggestedKeepAssetIds; - @override - bool operator ==(Object other) => identical(this, other) || other is DuplicateResponseDto && - _deepEquality.equals(other.assets, assets) && - other.duplicateId == duplicateId && - _deepEquality.equals(other.suggestedKeepAssetIds, suggestedKeepAssetIds); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assets.hashCode) + - (duplicateId.hashCode) + - (suggestedKeepAssetIds.hashCode); - - @override - String toString() => 'DuplicateResponseDto[assets=$assets, duplicateId=$duplicateId, suggestedKeepAssetIds=$suggestedKeepAssetIds]'; + static DuplicateResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assets: ((json[r'assets'] as List?)?.map(($e) => (AssetResponseDto.fromJson($e))!).toList(growable: false))!, + duplicateId: json[r'duplicateId'] as String, + suggestedKeepAssetIds: ((json[r'suggestedKeepAssetIds'] as List?) + ?.map(($e) => $e as String) + .toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'assets'] = this.assets; - json[r'duplicateId'] = this.duplicateId; - json[r'suggestedKeepAssetIds'] = this.suggestedKeepAssetIds; + json[r'assets'] = assets.map(($e) => $e.toJson()).toList(growable: false); + json[r'duplicateId'] = duplicateId; + json[r'suggestedKeepAssetIds'] = suggestedKeepAssetIds; return json; } - /// Returns a new [DuplicateResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static DuplicateResponseDto? fromJson(dynamic value) { - upgradeDto(value, "DuplicateResponseDto"); - if (value is Map) { - final json = value.cast(); - - return DuplicateResponseDto( - assets: AssetResponseDto.listFromJson(json[r'assets']), - duplicateId: mapValueOfType(json, r'duplicateId')!, - suggestedKeepAssetIds: json[r'suggestedKeepAssetIds'] is Iterable - ? (json[r'suggestedKeepAssetIds'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + DuplicateResponseDto copyWith({ + List? assets, + String? duplicateId, + List? suggestedKeepAssetIds, + }) { + return .new( + assets: assets ?? this.assets, + duplicateId: duplicateId ?? this.duplicateId, + suggestedKeepAssetIds: suggestedKeepAssetIds ?? this.suggestedKeepAssetIds, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = DuplicateResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is DuplicateResponseDto && + const DeepCollectionEquality().equals(assets, other.assets) && + duplicateId == other.duplicateId && + const DeepCollectionEquality().equals(suggestedKeepAssetIds, other.suggestedKeepAssetIds)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = DuplicateResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + const DeepCollectionEquality().hash(assets), + duplicateId, + const DeepCollectionEquality().hash(suggestedKeepAssetIds), + ]); } - // maps a json object with a list of DuplicateResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = DuplicateResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assets', - 'duplicateId', - 'suggestedKeepAssetIds', - }; + @override + String toString() => + 'DuplicateResponseDto(assets=$assets, duplicateId=$duplicateId, suggestedKeepAssetIds=$suggestedKeepAssetIds)'; } - diff --git a/mobile/openapi/lib/model/email_notifications_response.dart b/mobile/openapi/lib/model/email_notifications_response.dart index 08a3d580c6..7829da02a5 100644 --- a/mobile/openapi/lib/model/email_notifications_response.dart +++ b/mobile/openapi/lib/model/email_notifications_response.dart @@ -1,118 +1,61 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class EmailNotificationsResponse { - /// Returns a new [EmailNotificationsResponse] instance. - EmailNotificationsResponse({ - required this.albumInvite, - required this.albumUpdate, - required this.enabled, - }); +final class EmailNotificationsResponse { + const EmailNotificationsResponse({required this.albumInvite, required this.albumUpdate, required this.enabled}); /// Whether to receive email notifications for album invites - bool albumInvite; + final bool albumInvite; /// Whether to receive email notifications for album updates - bool albumUpdate; + final bool albumUpdate; /// Whether email notifications are enabled - bool enabled; + final bool enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is EmailNotificationsResponse && - other.albumInvite == albumInvite && - other.albumUpdate == albumUpdate && - other.enabled == enabled; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumInvite.hashCode) + - (albumUpdate.hashCode) + - (enabled.hashCode); - - @override - String toString() => 'EmailNotificationsResponse[albumInvite=$albumInvite, albumUpdate=$albumUpdate, enabled=$enabled]'; + static EmailNotificationsResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumInvite: json[r'albumInvite'] as bool, + albumUpdate: json[r'albumUpdate'] as bool, + enabled: json[r'enabled'] as bool, + ); + } Map toJson() { final json = {}; - json[r'albumInvite'] = this.albumInvite; - json[r'albumUpdate'] = this.albumUpdate; - json[r'enabled'] = this.enabled; + json[r'albumInvite'] = albumInvite; + json[r'albumUpdate'] = albumUpdate; + json[r'enabled'] = enabled; return json; } - /// Returns a new [EmailNotificationsResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static EmailNotificationsResponse? fromJson(dynamic value) { - upgradeDto(value, "EmailNotificationsResponse"); - if (value is Map) { - final json = value.cast(); - - return EmailNotificationsResponse( - albumInvite: mapValueOfType(json, r'albumInvite')!, - albumUpdate: mapValueOfType(json, r'albumUpdate')!, - enabled: mapValueOfType(json, r'enabled')!, - ); - } - return null; + EmailNotificationsResponse copyWith({bool? albumInvite, bool? albumUpdate, bool? enabled}) { + return .new( + albumInvite: albumInvite ?? this.albumInvite, + albumUpdate: albumUpdate ?? this.albumUpdate, + enabled: enabled ?? this.enabled, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = EmailNotificationsResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is EmailNotificationsResponse && + albumInvite == other.albumInvite && + albumUpdate == other.albumUpdate && + enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = EmailNotificationsResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumInvite, albumUpdate, enabled]); } - // maps a json object with a list of EmailNotificationsResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = EmailNotificationsResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumInvite', - 'albumUpdate', - 'enabled', - }; + @override + String toString() => + 'EmailNotificationsResponse(albumInvite=$albumInvite, albumUpdate=$albumUpdate, enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/email_notifications_update.dart b/mobile/openapi/lib/model/email_notifications_update.dart index e158e45598..77c422be4d 100644 --- a/mobile/openapi/lib/model/email_notifications_update.dart +++ b/mobile/openapi/lib/model/email_notifications_update.dart @@ -1,145 +1,72 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class EmailNotificationsUpdate { - /// Returns a new [EmailNotificationsUpdate] instance. - EmailNotificationsUpdate({ - this.albumInvite, - this.albumUpdate, - this.enabled, - }); +final class EmailNotificationsUpdate { + const EmailNotificationsUpdate({this.albumInvite, this.albumUpdate, this.enabled}); /// Whether to receive email notifications for album invites - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? albumInvite; + final bool? albumInvite; /// Whether to receive email notifications for album updates - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? albumUpdate; + final bool? albumUpdate; /// Whether email notifications are enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final bool? enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is EmailNotificationsUpdate && - other.albumInvite == albumInvite && - other.albumUpdate == albumUpdate && - other.enabled == enabled; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumInvite == null ? 0 : albumInvite!.hashCode) + - (albumUpdate == null ? 0 : albumUpdate!.hashCode) + - (enabled == null ? 0 : enabled!.hashCode); - - @override - String toString() => 'EmailNotificationsUpdate[albumInvite=$albumInvite, albumUpdate=$albumUpdate, enabled=$enabled]'; + static EmailNotificationsUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumInvite: (json[r'albumInvite'] as bool?), + albumUpdate: (json[r'albumUpdate'] as bool?), + enabled: (json[r'enabled'] as bool?), + ); + } Map toJson() { final json = {}; - if (this.albumInvite != null) { - json[r'albumInvite'] = this.albumInvite; - } else { - // json[r'albumInvite'] = null; + if (albumInvite != null) { + json[r'albumInvite'] = albumInvite!; } - if (this.albumUpdate != null) { - json[r'albumUpdate'] = this.albumUpdate; - } else { - // json[r'albumUpdate'] = null; + if (albumUpdate != null) { + json[r'albumUpdate'] = albumUpdate!; } - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled != null) { + json[r'enabled'] = enabled!; } return json; } - /// Returns a new [EmailNotificationsUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static EmailNotificationsUpdate? fromJson(dynamic value) { - upgradeDto(value, "EmailNotificationsUpdate"); - if (value is Map) { - final json = value.cast(); - - return EmailNotificationsUpdate( - albumInvite: mapValueOfType(json, r'albumInvite'), - albumUpdate: mapValueOfType(json, r'albumUpdate'), - enabled: mapValueOfType(json, r'enabled'), - ); - } - return null; + EmailNotificationsUpdate copyWith({ + Object? albumInvite = _undefined, + Object? albumUpdate = _undefined, + Object? enabled = _undefined, + }) { + return .new( + albumInvite: identical(albumInvite, _undefined) ? this.albumInvite : albumInvite as bool?, + albumUpdate: identical(albumUpdate, _undefined) ? this.albumUpdate : albumUpdate as bool?, + enabled: identical(enabled, _undefined) ? this.enabled : enabled as bool?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = EmailNotificationsUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is EmailNotificationsUpdate && + albumInvite == other.albumInvite && + albumUpdate == other.albumUpdate && + enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = EmailNotificationsUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumInvite, albumUpdate, enabled]); } - // maps a json object with a list of EmailNotificationsUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = EmailNotificationsUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'EmailNotificationsUpdate(albumInvite=$albumInvite, albumUpdate=$albumUpdate, enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/exif_response_dto.dart b/mobile/openapi/lib/model/exif_response_dto.dart index ed5ffd2958..4da458ac5c 100644 --- a/mobile/openapi/lib/model/exif_response_dto.dart +++ b/mobile/openapi/lib/model/exif_response_dto.dart @@ -1,378 +1,312 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ExifResponseDto { - /// Returns a new [ExifResponseDto] instance. - ExifResponseDto({ - this.city, - this.country, - this.dateTimeOriginal, - this.description, - this.exifImageHeight, - this.exifImageWidth, - this.exposureTime, - this.fNumber, - this.fileSizeInByte, - this.focalLength, - this.iso, - this.latitude, - this.lensModel, - this.longitude, - this.make, - this.model, - this.modifyDate, - this.orientation, - this.projectionType, - this.rating, - this.state, - this.timeZone, +/// EXIF response +final class ExifResponseDto { + const ExifResponseDto({ + this.city = null, + this.country = null, + this.dateTimeOriginal = null, + this.description = null, + this.exifImageHeight = null, + this.exifImageWidth = null, + this.exposureTime = null, + this.fNumber = null, + this.fileSizeInByte = null, + this.focalLength = null, + this.iso = null, + this.latitude = null, + this.lensModel = null, + this.longitude = null, + this.make = null, + this.model = null, + this.modifyDate = null, + this.orientation = null, + this.projectionType = null, + this.rating = null, + this.state = null, + this.timeZone = null, }); /// City name - String? city; + final String? city; /// Country name - String? country; + final String? country; /// Original date/time - DateTime? dateTimeOriginal; + final DateTime? dateTimeOriginal; /// Image description - String? description; + final String? description; /// Image height in pixels - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int? exifImageHeight; + final int? exifImageHeight; /// Image width in pixels - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int? exifImageWidth; + final int? exifImageWidth; /// Exposure time - String? exposureTime; + final String? exposureTime; /// F-number (aperture) - num? fNumber; + final double? fNumber; /// File size in bytes - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int? fileSizeInByte; + final int? fileSizeInByte; /// Focal length in mm - num? focalLength; + final double? focalLength; /// ISO sensitivity - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? iso; + final int? iso; /// GPS latitude - num? latitude; + final double? latitude; /// Lens model - String? lensModel; + final String? lensModel; /// GPS longitude - num? longitude; + final double? longitude; /// Camera make - String? make; + final String? make; /// Camera model - String? model; + final String? model; /// Modification date/time - DateTime? modifyDate; + final DateTime? modifyDate; /// Image orientation - String? orientation; + final String? orientation; /// Projection type - String? projectionType; + final String? projectionType; /// Rating - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? rating; + final int? rating; /// State/province name - String? state; + final String? state; /// Time zone - String? timeZone; + final String? timeZone; - @override - bool operator ==(Object other) => identical(this, other) || other is ExifResponseDto && - other.city == city && - other.country == country && - other.dateTimeOriginal == dateTimeOriginal && - other.description == description && - other.exifImageHeight == exifImageHeight && - other.exifImageWidth == exifImageWidth && - other.exposureTime == exposureTime && - other.fNumber == fNumber && - other.fileSizeInByte == fileSizeInByte && - other.focalLength == focalLength && - other.iso == iso && - other.latitude == latitude && - other.lensModel == lensModel && - other.longitude == longitude && - other.make == make && - other.model == model && - other.modifyDate == modifyDate && - other.orientation == orientation && - other.projectionType == projectionType && - other.rating == rating && - other.state == state && - other.timeZone == timeZone; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (city == null ? 0 : city!.hashCode) + - (country == null ? 0 : country!.hashCode) + - (dateTimeOriginal == null ? 0 : dateTimeOriginal!.hashCode) + - (description == null ? 0 : description!.hashCode) + - (exifImageHeight == null ? 0 : exifImageHeight!.hashCode) + - (exifImageWidth == null ? 0 : exifImageWidth!.hashCode) + - (exposureTime == null ? 0 : exposureTime!.hashCode) + - (fNumber == null ? 0 : fNumber!.hashCode) + - (fileSizeInByte == null ? 0 : fileSizeInByte!.hashCode) + - (focalLength == null ? 0 : focalLength!.hashCode) + - (iso == null ? 0 : iso!.hashCode) + - (latitude == null ? 0 : latitude!.hashCode) + - (lensModel == null ? 0 : lensModel!.hashCode) + - (longitude == null ? 0 : longitude!.hashCode) + - (make == null ? 0 : make!.hashCode) + - (model == null ? 0 : model!.hashCode) + - (modifyDate == null ? 0 : modifyDate!.hashCode) + - (orientation == null ? 0 : orientation!.hashCode) + - (projectionType == null ? 0 : projectionType!.hashCode) + - (rating == null ? 0 : rating!.hashCode) + - (state == null ? 0 : state!.hashCode) + - (timeZone == null ? 0 : timeZone!.hashCode); - - @override - String toString() => 'ExifResponseDto[city=$city, country=$country, dateTimeOriginal=$dateTimeOriginal, description=$description, exifImageHeight=$exifImageHeight, exifImageWidth=$exifImageWidth, exposureTime=$exposureTime, fNumber=$fNumber, fileSizeInByte=$fileSizeInByte, focalLength=$focalLength, iso=$iso, latitude=$latitude, lensModel=$lensModel, longitude=$longitude, make=$make, model=$model, modifyDate=$modifyDate, orientation=$orientation, projectionType=$projectionType, rating=$rating, state=$state, timeZone=$timeZone]'; + static ExifResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + city: (json[r'city'] as String?), + country: (json[r'country'] as String?), + dateTimeOriginal: (json[r'dateTimeOriginal'] == null + ? null + : DateTime.parse(json[r'dateTimeOriginal'] as String)), + description: (json[r'description'] as String?), + exifImageHeight: (json[r'exifImageHeight'] as int?), + exifImageWidth: (json[r'exifImageWidth'] as int?), + exposureTime: (json[r'exposureTime'] as String?), + fNumber: (json[r'fNumber'] as num?)?.toDouble(), + fileSizeInByte: (json[r'fileSizeInByte'] as int?), + focalLength: (json[r'focalLength'] as num?)?.toDouble(), + iso: (json[r'iso'] as int?), + latitude: (json[r'latitude'] as num?)?.toDouble(), + lensModel: (json[r'lensModel'] as String?), + longitude: (json[r'longitude'] as num?)?.toDouble(), + make: (json[r'make'] as String?), + model: (json[r'model'] as String?), + modifyDate: (json[r'modifyDate'] == null ? null : DateTime.parse(json[r'modifyDate'] as String)), + orientation: (json[r'orientation'] as String?), + projectionType: (json[r'projectionType'] as String?), + rating: (json[r'rating'] as int?), + state: (json[r'state'] as String?), + timeZone: (json[r'timeZone'] as String?), + ); + } Map toJson() { final json = {}; - if (this.city != null) { - json[r'city'] = this.city; - } else { - // json[r'city'] = null; + if (city != null) { + json[r'city'] = city!; } - if (this.country != null) { - json[r'country'] = this.country; - } else { - // json[r'country'] = null; + if (country != null) { + json[r'country'] = country!; } - if (this.dateTimeOriginal != null) { - json[r'dateTimeOriginal'] = this.dateTimeOriginal!.toUtc().toIso8601String(); - } else { - // json[r'dateTimeOriginal'] = null; + if (dateTimeOriginal != null) { + json[r'dateTimeOriginal'] = dateTimeOriginal!.toUtc().toIso8601String(); } - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (description != null) { + json[r'description'] = description!; } - if (this.exifImageHeight != null) { - json[r'exifImageHeight'] = this.exifImageHeight; - } else { - // json[r'exifImageHeight'] = null; + if (exifImageHeight != null) { + json[r'exifImageHeight'] = exifImageHeight!; } - if (this.exifImageWidth != null) { - json[r'exifImageWidth'] = this.exifImageWidth; - } else { - // json[r'exifImageWidth'] = null; + if (exifImageWidth != null) { + json[r'exifImageWidth'] = exifImageWidth!; } - if (this.exposureTime != null) { - json[r'exposureTime'] = this.exposureTime; - } else { - // json[r'exposureTime'] = null; + if (exposureTime != null) { + json[r'exposureTime'] = exposureTime!; } - if (this.fNumber != null) { - json[r'fNumber'] = this.fNumber; - } else { - // json[r'fNumber'] = null; + if (fNumber != null) { + json[r'fNumber'] = fNumber!; } - if (this.fileSizeInByte != null) { - json[r'fileSizeInByte'] = this.fileSizeInByte; - } else { - // json[r'fileSizeInByte'] = null; + if (fileSizeInByte != null) { + json[r'fileSizeInByte'] = fileSizeInByte!; } - if (this.focalLength != null) { - json[r'focalLength'] = this.focalLength; - } else { - // json[r'focalLength'] = null; + if (focalLength != null) { + json[r'focalLength'] = focalLength!; } - if (this.iso != null) { - json[r'iso'] = this.iso; - } else { - // json[r'iso'] = null; + if (iso != null) { + json[r'iso'] = iso!; } - if (this.latitude != null) { - json[r'latitude'] = this.latitude; - } else { - // json[r'latitude'] = null; + if (latitude != null) { + json[r'latitude'] = latitude!; } - if (this.lensModel != null) { - json[r'lensModel'] = this.lensModel; - } else { - // json[r'lensModel'] = null; + if (lensModel != null) { + json[r'lensModel'] = lensModel!; } - if (this.longitude != null) { - json[r'longitude'] = this.longitude; - } else { - // json[r'longitude'] = null; + if (longitude != null) { + json[r'longitude'] = longitude!; } - if (this.make != null) { - json[r'make'] = this.make; - } else { - // json[r'make'] = null; + if (make != null) { + json[r'make'] = make!; } - if (this.model != null) { - json[r'model'] = this.model; - } else { - // json[r'model'] = null; + if (model != null) { + json[r'model'] = model!; } - if (this.modifyDate != null) { - json[r'modifyDate'] = this.modifyDate!.toUtc().toIso8601String(); - } else { - // json[r'modifyDate'] = null; + if (modifyDate != null) { + json[r'modifyDate'] = modifyDate!.toUtc().toIso8601String(); } - if (this.orientation != null) { - json[r'orientation'] = this.orientation; - } else { - // json[r'orientation'] = null; + if (orientation != null) { + json[r'orientation'] = orientation!; } - if (this.projectionType != null) { - json[r'projectionType'] = this.projectionType; - } else { - // json[r'projectionType'] = null; + if (projectionType != null) { + json[r'projectionType'] = projectionType!; } - if (this.rating != null) { - json[r'rating'] = this.rating; - } else { - // json[r'rating'] = null; + if (rating != null) { + json[r'rating'] = rating!; } - if (this.state != null) { - json[r'state'] = this.state; - } else { - // json[r'state'] = null; + if (state != null) { + json[r'state'] = state!; } - if (this.timeZone != null) { - json[r'timeZone'] = this.timeZone; - } else { - // json[r'timeZone'] = null; + if (timeZone != null) { + json[r'timeZone'] = timeZone!; } return json; } - /// Returns a new [ExifResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ExifResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ExifResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ExifResponseDto( - city: mapValueOfType(json, r'city'), - country: mapValueOfType(json, r'country'), - dateTimeOriginal: mapDateTime(json, r'dateTimeOriginal', r''), - description: mapValueOfType(json, r'description'), - exifImageHeight: mapValueOfType(json, r'exifImageHeight'), - exifImageWidth: mapValueOfType(json, r'exifImageWidth'), - exposureTime: mapValueOfType(json, r'exposureTime'), - fNumber: json[r'fNumber'] == null - ? null - : num.parse('${json[r'fNumber']}'), - fileSizeInByte: mapValueOfType(json, r'fileSizeInByte'), - focalLength: json[r'focalLength'] == null - ? null - : num.parse('${json[r'focalLength']}'), - iso: mapValueOfType(json, r'iso'), - latitude: json[r'latitude'] == null - ? null - : num.parse('${json[r'latitude']}'), - lensModel: mapValueOfType(json, r'lensModel'), - longitude: json[r'longitude'] == null - ? null - : num.parse('${json[r'longitude']}'), - make: mapValueOfType(json, r'make'), - model: mapValueOfType(json, r'model'), - modifyDate: mapDateTime(json, r'modifyDate', r''), - orientation: mapValueOfType(json, r'orientation'), - projectionType: mapValueOfType(json, r'projectionType'), - rating: mapValueOfType(json, r'rating'), - state: mapValueOfType(json, r'state'), - timeZone: mapValueOfType(json, r'timeZone'), - ); - } - return null; + ExifResponseDto copyWith({ + Object? city = _undefined, + Object? country = _undefined, + Object? dateTimeOriginal = _undefined, + Object? description = _undefined, + Object? exifImageHeight = _undefined, + Object? exifImageWidth = _undefined, + Object? exposureTime = _undefined, + Object? fNumber = _undefined, + Object? fileSizeInByte = _undefined, + Object? focalLength = _undefined, + Object? iso = _undefined, + Object? latitude = _undefined, + Object? lensModel = _undefined, + Object? longitude = _undefined, + Object? make = _undefined, + Object? model = _undefined, + Object? modifyDate = _undefined, + Object? orientation = _undefined, + Object? projectionType = _undefined, + Object? rating = _undefined, + Object? state = _undefined, + Object? timeZone = _undefined, + }) { + return .new( + city: identical(city, _undefined) ? this.city : city as String?, + country: identical(country, _undefined) ? this.country : country as String?, + dateTimeOriginal: identical(dateTimeOriginal, _undefined) ? this.dateTimeOriginal : dateTimeOriginal as DateTime?, + description: identical(description, _undefined) ? this.description : description as String?, + exifImageHeight: identical(exifImageHeight, _undefined) ? this.exifImageHeight : exifImageHeight as int?, + exifImageWidth: identical(exifImageWidth, _undefined) ? this.exifImageWidth : exifImageWidth as int?, + exposureTime: identical(exposureTime, _undefined) ? this.exposureTime : exposureTime as String?, + fNumber: identical(fNumber, _undefined) ? this.fNumber : fNumber as double?, + fileSizeInByte: identical(fileSizeInByte, _undefined) ? this.fileSizeInByte : fileSizeInByte as int?, + focalLength: identical(focalLength, _undefined) ? this.focalLength : focalLength as double?, + iso: identical(iso, _undefined) ? this.iso : iso as int?, + latitude: identical(latitude, _undefined) ? this.latitude : latitude as double?, + lensModel: identical(lensModel, _undefined) ? this.lensModel : lensModel as String?, + longitude: identical(longitude, _undefined) ? this.longitude : longitude as double?, + make: identical(make, _undefined) ? this.make : make as String?, + model: identical(model, _undefined) ? this.model : model as String?, + modifyDate: identical(modifyDate, _undefined) ? this.modifyDate : modifyDate as DateTime?, + orientation: identical(orientation, _undefined) ? this.orientation : orientation as String?, + projectionType: identical(projectionType, _undefined) ? this.projectionType : projectionType as String?, + rating: identical(rating, _undefined) ? this.rating : rating as int?, + state: identical(state, _undefined) ? this.state : state as String?, + timeZone: identical(timeZone, _undefined) ? this.timeZone : timeZone as String?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ExifResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ExifResponseDto && + city == other.city && + country == other.country && + dateTimeOriginal == other.dateTimeOriginal && + description == other.description && + exifImageHeight == other.exifImageHeight && + exifImageWidth == other.exifImageWidth && + exposureTime == other.exposureTime && + fNumber == other.fNumber && + fileSizeInByte == other.fileSizeInByte && + focalLength == other.focalLength && + iso == other.iso && + latitude == other.latitude && + lensModel == other.lensModel && + longitude == other.longitude && + make == other.make && + model == other.model && + modifyDate == other.modifyDate && + orientation == other.orientation && + projectionType == other.projectionType && + rating == other.rating && + state == other.state && + timeZone == other.timeZone); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ExifResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + city, + country, + dateTimeOriginal, + description, + exifImageHeight, + exifImageWidth, + exposureTime, + fNumber, + fileSizeInByte, + focalLength, + iso, + latitude, + lensModel, + longitude, + make, + model, + modifyDate, + orientation, + projectionType, + rating, + state, + timeZone, + ]); } - // maps a json object with a list of ExifResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ExifResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'ExifResponseDto(city=$city, country=$country, dateTimeOriginal=$dateTimeOriginal, description=$description, exifImageHeight=$exifImageHeight, exifImageWidth=$exifImageWidth, exposureTime=$exposureTime, fNumber=$fNumber, fileSizeInByte=$fileSizeInByte, focalLength=$focalLength, iso=$iso, latitude=$latitude, lensModel=$lensModel, longitude=$longitude, make=$make, model=$model, modifyDate=$modifyDate, orientation=$orientation, projectionType=$projectionType, rating=$rating, state=$state, timeZone=$timeZone)'; } - diff --git a/mobile/openapi/lib/model/face_dto.dart b/mobile/openapi/lib/model/face_dto.dart index ec5f5c8a6c..e7cbd2f2be 100644 --- a/mobile/openapi/lib/model/face_dto.dart +++ b/mobile/openapi/lib/model/face_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class FaceDto { - /// Returns a new [FaceDto] instance. - FaceDto({ - required this.id, - }); +final class FaceDto { + const FaceDto({required this.id}); /// Face ID - String id; + final String id; - @override - bool operator ==(Object other) => identical(this, other) || other is FaceDto && - other.id == id; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (id.hashCode); - - @override - String toString() => 'FaceDto[id=$id]'; + static FaceDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(id: json[r'id'] as String); + } Map toJson() { final json = {}; - json[r'id'] = this.id; + json[r'id'] = id; return json; } - /// Returns a new [FaceDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static FaceDto? fromJson(dynamic value) { - upgradeDto(value, "FaceDto"); - if (value is Map) { - final json = value.cast(); - - return FaceDto( - id: mapValueOfType(json, r'id')!, - ); - } - return null; + FaceDto copyWith({String? id}) { + return .new(id: id ?? this.id); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = FaceDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is FaceDto && id == other.id); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = FaceDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([id]); } - // maps a json object with a list of FaceDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = FaceDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'id', - }; + @override + String toString() => 'FaceDto(id=$id)'; } - diff --git a/mobile/openapi/lib/model/facial_recognition_config.dart b/mobile/openapi/lib/model/facial_recognition_config.dart index 66cb542ccf..06c2bd67b3 100644 --- a/mobile/openapi/lib/model/facial_recognition_config.dart +++ b/mobile/openapi/lib/model/facial_recognition_config.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class FacialRecognitionConfig { - /// Returns a new [FacialRecognitionConfig] instance. - FacialRecognitionConfig({ +final class FacialRecognitionConfig { + const FacialRecognitionConfig({ required this.enabled, required this.maxDistance, required this.minFaces, @@ -21,125 +12,76 @@ class FacialRecognitionConfig { }); /// Whether the task is enabled - bool enabled; + final bool enabled; /// Maximum distance threshold for face recognition - /// - /// Minimum value: 0.1 - /// Maximum value: 2 - double maxDistance; + final double maxDistance; /// Minimum number of faces required for recognition - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - int minFaces; + final int minFaces; /// Minimum confidence score for face detection - /// - /// Minimum value: 0.1 - /// Maximum value: 1 - double minScore; + final double minScore; /// Name of the model to use - String modelName; + final String modelName; - @override - bool operator ==(Object other) => identical(this, other) || other is FacialRecognitionConfig && - other.enabled == enabled && - other.maxDistance == maxDistance && - other.minFaces == minFaces && - other.minScore == minScore && - other.modelName == modelName; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (maxDistance.hashCode) + - (minFaces.hashCode) + - (minScore.hashCode) + - (modelName.hashCode); - - @override - String toString() => 'FacialRecognitionConfig[enabled=$enabled, maxDistance=$maxDistance, minFaces=$minFaces, minScore=$minScore, modelName=$modelName]'; + static FacialRecognitionConfig? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + enabled: json[r'enabled'] as bool, + maxDistance: (json[r'maxDistance'] as num).toDouble(), + minFaces: json[r'minFaces'] as int, + minScore: (json[r'minScore'] as num).toDouble(), + modelName: json[r'modelName'] as String, + ); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'maxDistance'] = this.maxDistance; - json[r'minFaces'] = this.minFaces; - json[r'minScore'] = this.minScore; - json[r'modelName'] = this.modelName; + json[r'enabled'] = enabled; + json[r'maxDistance'] = maxDistance; + json[r'minFaces'] = minFaces; + json[r'minScore'] = minScore; + json[r'modelName'] = modelName; return json; } - /// Returns a new [FacialRecognitionConfig] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static FacialRecognitionConfig? fromJson(dynamic value) { - upgradeDto(value, "FacialRecognitionConfig"); - if (value is Map) { - final json = value.cast(); - - return FacialRecognitionConfig( - enabled: mapValueOfType(json, r'enabled')!, - maxDistance: (mapValueOfType(json, r'maxDistance')!).toDouble(), - minFaces: mapValueOfType(json, r'minFaces')!, - minScore: (mapValueOfType(json, r'minScore')!).toDouble(), - modelName: mapValueOfType(json, r'modelName')!, - ); - } - return null; + FacialRecognitionConfig copyWith({ + bool? enabled, + double? maxDistance, + int? minFaces, + double? minScore, + String? modelName, + }) { + return .new( + enabled: enabled ?? this.enabled, + maxDistance: maxDistance ?? this.maxDistance, + minFaces: minFaces ?? this.minFaces, + minScore: minScore ?? this.minScore, + modelName: modelName ?? this.modelName, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = FacialRecognitionConfig.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is FacialRecognitionConfig && + enabled == other.enabled && + maxDistance == other.maxDistance && + minFaces == other.minFaces && + minScore == other.minScore && + modelName == other.modelName); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = FacialRecognitionConfig.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, maxDistance, minFaces, minScore, modelName]); } - // maps a json object with a list of FacialRecognitionConfig-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = FacialRecognitionConfig.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'maxDistance', - 'minFaces', - 'minScore', - 'modelName', - }; + @override + String toString() => + 'FacialRecognitionConfig(enabled=$enabled, maxDistance=$maxDistance, minFaces=$minFaces, minScore=$minScore, modelName=$modelName)'; } - diff --git a/mobile/openapi/lib/model/folders_response.dart b/mobile/openapi/lib/model/folders_response.dart index 873404c786..b521a69a93 100644 --- a/mobile/openapi/lib/model/folders_response.dart +++ b/mobile/openapi/lib/model/folders_response.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class FoldersResponse { - /// Returns a new [FoldersResponse] instance. - FoldersResponse({ - required this.enabled, - required this.sidebarWeb, - }); +final class FoldersResponse { + const FoldersResponse({required this.enabled, required this.sidebarWeb}); /// Whether folders are enabled - bool enabled; + final bool enabled; /// Whether folders appear in web sidebar - bool sidebarWeb; + final bool sidebarWeb; - @override - bool operator ==(Object other) => identical(this, other) || other is FoldersResponse && - other.enabled == enabled && - other.sidebarWeb == sidebarWeb; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (sidebarWeb.hashCode); - - @override - String toString() => 'FoldersResponse[enabled=$enabled, sidebarWeb=$sidebarWeb]'; + static FoldersResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool, sidebarWeb: json[r'sidebarWeb'] as bool); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'sidebarWeb'] = this.sidebarWeb; + json[r'enabled'] = enabled; + json[r'sidebarWeb'] = sidebarWeb; return json; } - /// Returns a new [FoldersResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static FoldersResponse? fromJson(dynamic value) { - upgradeDto(value, "FoldersResponse"); - if (value is Map) { - final json = value.cast(); - - return FoldersResponse( - enabled: mapValueOfType(json, r'enabled')!, - sidebarWeb: mapValueOfType(json, r'sidebarWeb')!, - ); - } - return null; + FoldersResponse copyWith({bool? enabled, bool? sidebarWeb}) { + return .new(enabled: enabled ?? this.enabled, sidebarWeb: sidebarWeb ?? this.sidebarWeb); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = FoldersResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is FoldersResponse && enabled == other.enabled && sidebarWeb == other.sidebarWeb); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = FoldersResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, sidebarWeb]); } - // maps a json object with a list of FoldersResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = FoldersResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'sidebarWeb', - }; + @override + String toString() => 'FoldersResponse(enabled=$enabled, sidebarWeb=$sidebarWeb)'; } - diff --git a/mobile/openapi/lib/model/folders_update.dart b/mobile/openapi/lib/model/folders_update.dart index edd58014d4..1c561a4456 100644 --- a/mobile/openapi/lib/model/folders_update.dart +++ b/mobile/openapi/lib/model/folders_update.dart @@ -1,127 +1,54 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class FoldersUpdate { - /// Returns a new [FoldersUpdate] instance. - FoldersUpdate({ - this.enabled, - this.sidebarWeb, - }); +final class FoldersUpdate { + const FoldersUpdate({this.enabled, this.sidebarWeb}); /// Whether folders are enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final bool? enabled; /// Whether folders appear in web sidebar - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? sidebarWeb; + final bool? sidebarWeb; - @override - bool operator ==(Object other) => identical(this, other) || other is FoldersUpdate && - other.enabled == enabled && - other.sidebarWeb == sidebarWeb; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled == null ? 0 : enabled!.hashCode) + - (sidebarWeb == null ? 0 : sidebarWeb!.hashCode); - - @override - String toString() => 'FoldersUpdate[enabled=$enabled, sidebarWeb=$sidebarWeb]'; + static FoldersUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: (json[r'enabled'] as bool?), sidebarWeb: (json[r'sidebarWeb'] as bool?)); + } Map toJson() { final json = {}; - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled != null) { + json[r'enabled'] = enabled!; } - if (this.sidebarWeb != null) { - json[r'sidebarWeb'] = this.sidebarWeb; - } else { - // json[r'sidebarWeb'] = null; + if (sidebarWeb != null) { + json[r'sidebarWeb'] = sidebarWeb!; } return json; } - /// Returns a new [FoldersUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static FoldersUpdate? fromJson(dynamic value) { - upgradeDto(value, "FoldersUpdate"); - if (value is Map) { - final json = value.cast(); - - return FoldersUpdate( - enabled: mapValueOfType(json, r'enabled'), - sidebarWeb: mapValueOfType(json, r'sidebarWeb'), - ); - } - return null; + FoldersUpdate copyWith({Object? enabled = _undefined, Object? sidebarWeb = _undefined}) { + return .new( + enabled: identical(enabled, _undefined) ? this.enabled : enabled as bool?, + sidebarWeb: identical(sidebarWeb, _undefined) ? this.sidebarWeb : sidebarWeb as bool?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = FoldersUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is FoldersUpdate && enabled == other.enabled && sidebarWeb == other.sidebarWeb); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = FoldersUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, sidebarWeb]); } - // maps a json object with a list of FoldersUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = FoldersUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'FoldersUpdate(enabled=$enabled, sidebarWeb=$sidebarWeb)'; } - diff --git a/mobile/openapi/lib/model/image_format.dart b/mobile/openapi/lib/model/image_format.dart index 1a0dde5def..b017e732d8 100644 --- a/mobile/openapi/lib/model/image_format.dart +++ b/mobile/openapi/lib/model/image_format.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Image format -class ImageFormat { - /// Instantiate a new enum with the provided [value]. +enum ImageFormat { + jpeg._(r'jpeg'), + webp._(r'webp'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const ImageFormat._(this.value); - /// The underlying value of this enum member. final String value; + static ImageFormat? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const jpeg = ImageFormat._(r'jpeg'); - static const webp = ImageFormat._(r'webp'); - - /// List of all possible values in this [enum][ImageFormat]. - static const values = [ - jpeg, - webp, - ]; - - static ImageFormat? fromJson(dynamic value) => ImageFormatTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ImageFormat.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [ImageFormat] to String, -/// and [decode] dynamic data back to [ImageFormat]. -class ImageFormatTypeTransformer { - factory ImageFormatTypeTransformer() => _instance ??= const ImageFormatTypeTransformer._(); - - const ImageFormatTypeTransformer._(); - - String encode(ImageFormat data) => data.value; - - /// Decodes a [dynamic value][data] to a ImageFormat. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - ImageFormat? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'jpeg': return ImageFormat.jpeg; - case r'webp': return ImageFormat.webp; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [ImageFormatTypeTransformer] instance. - static ImageFormatTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/job_create_dto.dart b/mobile/openapi/lib/model/job_create_dto.dart index fe6743cba0..0dfb0dc3e1 100644 --- a/mobile/openapi/lib/model/job_create_dto.dart +++ b/mobile/openapi/lib/model/job_create_dto.dart @@ -1,99 +1,39 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class JobCreateDto { - /// Returns a new [JobCreateDto] instance. - JobCreateDto({ - required this.name, - }); +final class JobCreateDto { + const JobCreateDto({required this.name}); - ManualJobName name; + final ManualJobName name; - @override - bool operator ==(Object other) => identical(this, other) || other is JobCreateDto && - other.name == name; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (name.hashCode); - - @override - String toString() => 'JobCreateDto[name=$name]'; + static JobCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(name: (ManualJobName.fromJson(json[r'name']))!); + } Map toJson() { final json = {}; - json[r'name'] = this.name; + json[r'name'] = name.toJson(); return json; } - /// Returns a new [JobCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static JobCreateDto? fromJson(dynamic value) { - upgradeDto(value, "JobCreateDto"); - if (value is Map) { - final json = value.cast(); - - return JobCreateDto( - name: ManualJobName.fromJson(json[r'name'])!, - ); - } - return null; + JobCreateDto copyWith({ManualJobName? name}) { + return .new(name: name ?? this.name); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = JobCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is JobCreateDto && name == other.name); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = JobCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([name]); } - // maps a json object with a list of JobCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = JobCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'name', - }; + @override + String toString() => 'JobCreateDto(name=$name)'; } - diff --git a/mobile/openapi/lib/model/job_name.dart b/mobile/openapi/lib/model/job_name.dart index 511e1158e9..0e959e9a82 100644 --- a/mobile/openapi/lib/model/job_name.dart +++ b/mobile/openapi/lib/model/job_name.dart @@ -1,244 +1,81 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Job name -class JobName { - /// Instantiate a new enum with the provided [value]. +enum JobName { + assetDelete._(r'AssetDelete'), + assetDeleteCheck._(r'AssetDeleteCheck'), + assetDetectFacesQueueAll._(r'AssetDetectFacesQueueAll'), + assetDetectFaces._(r'AssetDetectFaces'), + assetDetectDuplicatesQueueAll._(r'AssetDetectDuplicatesQueueAll'), + assetDetectDuplicates._(r'AssetDetectDuplicates'), + assetEditThumbnailGeneration._(r'AssetEditThumbnailGeneration'), + assetEncodeVideoQueueAll._(r'AssetEncodeVideoQueueAll'), + assetEncodeVideo._(r'AssetEncodeVideo'), + assetEmptyTrash._(r'AssetEmptyTrash'), + assetExtractMetadataQueueAll._(r'AssetExtractMetadataQueueAll'), + assetExtractMetadata._(r'AssetExtractMetadata'), + assetFileMigration._(r'AssetFileMigration'), + assetGenerateThumbnailsQueueAll._(r'AssetGenerateThumbnailsQueueAll'), + assetGenerateThumbnails._(r'AssetGenerateThumbnails'), + auditTableCleanup._(r'AuditTableCleanup'), + databaseBackup._(r'DatabaseBackup'), + facialRecognitionQueueAll._(r'FacialRecognitionQueueAll'), + facialRecognition._(r'FacialRecognition'), + fileDelete._(r'FileDelete'), + fileMigrationQueueAll._(r'FileMigrationQueueAll'), + libraryDeleteCheck._(r'LibraryDeleteCheck'), + libraryDelete._(r'LibraryDelete'), + libraryRemoveAsset._(r'LibraryRemoveAsset'), + libraryScanAssetsQueueAll._(r'LibraryScanAssetsQueueAll'), + librarySyncAssets._(r'LibrarySyncAssets'), + librarySyncFilesQueueAll._(r'LibrarySyncFilesQueueAll'), + librarySyncFiles._(r'LibrarySyncFiles'), + libraryScanQueueAll._(r'LibraryScanQueueAll'), + memoryCleanup._(r'MemoryCleanup'), + memoryGenerate._(r'MemoryGenerate'), + notificationsCleanup._(r'NotificationsCleanup'), + notifyUserSignup._(r'NotifyUserSignup'), + notifyAlbumInvite._(r'NotifyAlbumInvite'), + notifyAlbumUpdate._(r'NotifyAlbumUpdate'), + userDelete._(r'UserDelete'), + userDeleteCheck._(r'UserDeleteCheck'), + userSyncUsage._(r'UserSyncUsage'), + personCleanup._(r'PersonCleanup'), + personFileMigration._(r'PersonFileMigration'), + personGenerateThumbnail._(r'PersonGenerateThumbnail'), + sessionCleanup._(r'SessionCleanup'), + sendMail._(r'SendMail'), + sidecarQueueAll._(r'SidecarQueueAll'), + sidecarCheck._(r'SidecarCheck'), + sidecarWrite._(r'SidecarWrite'), + smartSearchQueueAll._(r'SmartSearchQueueAll'), + smartSearch._(r'SmartSearch'), + storageTemplateMigration._(r'StorageTemplateMigration'), + storageTemplateMigrationSingle._(r'StorageTemplateMigrationSingle'), + tagCleanup._(r'TagCleanup'), + versionCheck._(r'VersionCheck'), + ocrQueueAll._(r'OcrQueueAll'), + ocr._(r'Ocr'), + workflowAssetTrigger._(r'WorkflowAssetTrigger'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const JobName._(this.value); - /// The underlying value of this enum member. final String value; + static JobName? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const assetDelete = JobName._(r'AssetDelete'); - static const assetDeleteCheck = JobName._(r'AssetDeleteCheck'); - static const assetDetectFacesQueueAll = JobName._(r'AssetDetectFacesQueueAll'); - static const assetDetectFaces = JobName._(r'AssetDetectFaces'); - static const assetDetectDuplicatesQueueAll = JobName._(r'AssetDetectDuplicatesQueueAll'); - static const assetDetectDuplicates = JobName._(r'AssetDetectDuplicates'); - static const assetEditThumbnailGeneration = JobName._(r'AssetEditThumbnailGeneration'); - static const assetEncodeVideoQueueAll = JobName._(r'AssetEncodeVideoQueueAll'); - static const assetEncodeVideo = JobName._(r'AssetEncodeVideo'); - static const assetEmptyTrash = JobName._(r'AssetEmptyTrash'); - static const assetExtractMetadataQueueAll = JobName._(r'AssetExtractMetadataQueueAll'); - static const assetExtractMetadata = JobName._(r'AssetExtractMetadata'); - static const assetFileMigration = JobName._(r'AssetFileMigration'); - static const assetGenerateThumbnailsQueueAll = JobName._(r'AssetGenerateThumbnailsQueueAll'); - static const assetGenerateThumbnails = JobName._(r'AssetGenerateThumbnails'); - static const auditTableCleanup = JobName._(r'AuditTableCleanup'); - static const databaseBackup = JobName._(r'DatabaseBackup'); - static const facialRecognitionQueueAll = JobName._(r'FacialRecognitionQueueAll'); - static const facialRecognition = JobName._(r'FacialRecognition'); - static const fileDelete = JobName._(r'FileDelete'); - static const fileMigrationQueueAll = JobName._(r'FileMigrationQueueAll'); - static const libraryDeleteCheck = JobName._(r'LibraryDeleteCheck'); - static const libraryDelete = JobName._(r'LibraryDelete'); - static const libraryRemoveAsset = JobName._(r'LibraryRemoveAsset'); - static const libraryScanAssetsQueueAll = JobName._(r'LibraryScanAssetsQueueAll'); - static const librarySyncAssets = JobName._(r'LibrarySyncAssets'); - static const librarySyncFilesQueueAll = JobName._(r'LibrarySyncFilesQueueAll'); - static const librarySyncFiles = JobName._(r'LibrarySyncFiles'); - static const libraryScanQueueAll = JobName._(r'LibraryScanQueueAll'); - static const memoryCleanup = JobName._(r'MemoryCleanup'); - static const memoryGenerate = JobName._(r'MemoryGenerate'); - static const notificationsCleanup = JobName._(r'NotificationsCleanup'); - static const notifyUserSignup = JobName._(r'NotifyUserSignup'); - static const notifyAlbumInvite = JobName._(r'NotifyAlbumInvite'); - static const notifyAlbumUpdate = JobName._(r'NotifyAlbumUpdate'); - static const userDelete = JobName._(r'UserDelete'); - static const userDeleteCheck = JobName._(r'UserDeleteCheck'); - static const userSyncUsage = JobName._(r'UserSyncUsage'); - static const personCleanup = JobName._(r'PersonCleanup'); - static const personFileMigration = JobName._(r'PersonFileMigration'); - static const personGenerateThumbnail = JobName._(r'PersonGenerateThumbnail'); - static const sessionCleanup = JobName._(r'SessionCleanup'); - static const sendMail = JobName._(r'SendMail'); - static const sidecarQueueAll = JobName._(r'SidecarQueueAll'); - static const sidecarCheck = JobName._(r'SidecarCheck'); - static const sidecarWrite = JobName._(r'SidecarWrite'); - static const smartSearchQueueAll = JobName._(r'SmartSearchQueueAll'); - static const smartSearch = JobName._(r'SmartSearch'); - static const storageTemplateMigration = JobName._(r'StorageTemplateMigration'); - static const storageTemplateMigrationSingle = JobName._(r'StorageTemplateMigrationSingle'); - static const tagCleanup = JobName._(r'TagCleanup'); - static const versionCheck = JobName._(r'VersionCheck'); - static const ocrQueueAll = JobName._(r'OcrQueueAll'); - static const ocr = JobName._(r'Ocr'); - static const workflowAssetTrigger = JobName._(r'WorkflowAssetTrigger'); - - /// List of all possible values in this [enum][JobName]. - static const values = [ - assetDelete, - assetDeleteCheck, - assetDetectFacesQueueAll, - assetDetectFaces, - assetDetectDuplicatesQueueAll, - assetDetectDuplicates, - assetEditThumbnailGeneration, - assetEncodeVideoQueueAll, - assetEncodeVideo, - assetEmptyTrash, - assetExtractMetadataQueueAll, - assetExtractMetadata, - assetFileMigration, - assetGenerateThumbnailsQueueAll, - assetGenerateThumbnails, - auditTableCleanup, - databaseBackup, - facialRecognitionQueueAll, - facialRecognition, - fileDelete, - fileMigrationQueueAll, - libraryDeleteCheck, - libraryDelete, - libraryRemoveAsset, - libraryScanAssetsQueueAll, - librarySyncAssets, - librarySyncFilesQueueAll, - librarySyncFiles, - libraryScanQueueAll, - memoryCleanup, - memoryGenerate, - notificationsCleanup, - notifyUserSignup, - notifyAlbumInvite, - notifyAlbumUpdate, - userDelete, - userDeleteCheck, - userSyncUsage, - personCleanup, - personFileMigration, - personGenerateThumbnail, - sessionCleanup, - sendMail, - sidecarQueueAll, - sidecarCheck, - sidecarWrite, - smartSearchQueueAll, - smartSearch, - storageTemplateMigration, - storageTemplateMigrationSingle, - tagCleanup, - versionCheck, - ocrQueueAll, - ocr, - workflowAssetTrigger, - ]; - - static JobName? fromJson(dynamic value) => JobNameTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = JobName.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [JobName] to String, -/// and [decode] dynamic data back to [JobName]. -class JobNameTypeTransformer { - factory JobNameTypeTransformer() => _instance ??= const JobNameTypeTransformer._(); - - const JobNameTypeTransformer._(); - - String encode(JobName data) => data.value; - - /// Decodes a [dynamic value][data] to a JobName. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - JobName? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'AssetDelete': return JobName.assetDelete; - case r'AssetDeleteCheck': return JobName.assetDeleteCheck; - case r'AssetDetectFacesQueueAll': return JobName.assetDetectFacesQueueAll; - case r'AssetDetectFaces': return JobName.assetDetectFaces; - case r'AssetDetectDuplicatesQueueAll': return JobName.assetDetectDuplicatesQueueAll; - case r'AssetDetectDuplicates': return JobName.assetDetectDuplicates; - case r'AssetEditThumbnailGeneration': return JobName.assetEditThumbnailGeneration; - case r'AssetEncodeVideoQueueAll': return JobName.assetEncodeVideoQueueAll; - case r'AssetEncodeVideo': return JobName.assetEncodeVideo; - case r'AssetEmptyTrash': return JobName.assetEmptyTrash; - case r'AssetExtractMetadataQueueAll': return JobName.assetExtractMetadataQueueAll; - case r'AssetExtractMetadata': return JobName.assetExtractMetadata; - case r'AssetFileMigration': return JobName.assetFileMigration; - case r'AssetGenerateThumbnailsQueueAll': return JobName.assetGenerateThumbnailsQueueAll; - case r'AssetGenerateThumbnails': return JobName.assetGenerateThumbnails; - case r'AuditTableCleanup': return JobName.auditTableCleanup; - case r'DatabaseBackup': return JobName.databaseBackup; - case r'FacialRecognitionQueueAll': return JobName.facialRecognitionQueueAll; - case r'FacialRecognition': return JobName.facialRecognition; - case r'FileDelete': return JobName.fileDelete; - case r'FileMigrationQueueAll': return JobName.fileMigrationQueueAll; - case r'LibraryDeleteCheck': return JobName.libraryDeleteCheck; - case r'LibraryDelete': return JobName.libraryDelete; - case r'LibraryRemoveAsset': return JobName.libraryRemoveAsset; - case r'LibraryScanAssetsQueueAll': return JobName.libraryScanAssetsQueueAll; - case r'LibrarySyncAssets': return JobName.librarySyncAssets; - case r'LibrarySyncFilesQueueAll': return JobName.librarySyncFilesQueueAll; - case r'LibrarySyncFiles': return JobName.librarySyncFiles; - case r'LibraryScanQueueAll': return JobName.libraryScanQueueAll; - case r'MemoryCleanup': return JobName.memoryCleanup; - case r'MemoryGenerate': return JobName.memoryGenerate; - case r'NotificationsCleanup': return JobName.notificationsCleanup; - case r'NotifyUserSignup': return JobName.notifyUserSignup; - case r'NotifyAlbumInvite': return JobName.notifyAlbumInvite; - case r'NotifyAlbumUpdate': return JobName.notifyAlbumUpdate; - case r'UserDelete': return JobName.userDelete; - case r'UserDeleteCheck': return JobName.userDeleteCheck; - case r'UserSyncUsage': return JobName.userSyncUsage; - case r'PersonCleanup': return JobName.personCleanup; - case r'PersonFileMigration': return JobName.personFileMigration; - case r'PersonGenerateThumbnail': return JobName.personGenerateThumbnail; - case r'SessionCleanup': return JobName.sessionCleanup; - case r'SendMail': return JobName.sendMail; - case r'SidecarQueueAll': return JobName.sidecarQueueAll; - case r'SidecarCheck': return JobName.sidecarCheck; - case r'SidecarWrite': return JobName.sidecarWrite; - case r'SmartSearchQueueAll': return JobName.smartSearchQueueAll; - case r'SmartSearch': return JobName.smartSearch; - case r'StorageTemplateMigration': return JobName.storageTemplateMigration; - case r'StorageTemplateMigrationSingle': return JobName.storageTemplateMigrationSingle; - case r'TagCleanup': return JobName.tagCleanup; - case r'VersionCheck': return JobName.versionCheck; - case r'OcrQueueAll': return JobName.ocrQueueAll; - case r'Ocr': return JobName.ocr; - case r'WorkflowAssetTrigger': return JobName.workflowAssetTrigger; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [JobNameTypeTransformer] instance. - static JobNameTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/job_settings_dto.dart b/mobile/openapi/lib/model/job_settings_dto.dart index 98fe3d3536..a859ce3e02 100644 --- a/mobile/openapi/lib/model/job_settings_dto.dart +++ b/mobile/openapi/lib/model/job_settings_dto.dart @@ -1,103 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class JobSettingsDto { - /// Returns a new [JobSettingsDto] instance. - JobSettingsDto({ - required this.concurrency, - }); +final class JobSettingsDto { + const JobSettingsDto({required this.concurrency}); /// Concurrency - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - int concurrency; + final int concurrency; - @override - bool operator ==(Object other) => identical(this, other) || other is JobSettingsDto && - other.concurrency == concurrency; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (concurrency.hashCode); - - @override - String toString() => 'JobSettingsDto[concurrency=$concurrency]'; + static JobSettingsDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(concurrency: json[r'concurrency'] as int); + } Map toJson() { final json = {}; - json[r'concurrency'] = this.concurrency; + json[r'concurrency'] = concurrency; return json; } - /// Returns a new [JobSettingsDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static JobSettingsDto? fromJson(dynamic value) { - upgradeDto(value, "JobSettingsDto"); - if (value is Map) { - final json = value.cast(); - - return JobSettingsDto( - concurrency: mapValueOfType(json, r'concurrency')!, - ); - } - return null; + JobSettingsDto copyWith({int? concurrency}) { + return .new(concurrency: concurrency ?? this.concurrency); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = JobSettingsDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is JobSettingsDto && concurrency == other.concurrency); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = JobSettingsDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([concurrency]); } - // maps a json object with a list of JobSettingsDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = JobSettingsDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'concurrency', - }; + @override + String toString() => 'JobSettingsDto(concurrency=$concurrency)'; } - diff --git a/mobile/openapi/lib/model/library_response_dto.dart b/mobile/openapi/lib/model/library_response_dto.dart index 88ebceae24..2eeb7d61f0 100644 --- a/mobile/openapi/lib/model/library_response_dto.dart +++ b/mobile/openapi/lib/model/library_response_dto.dart @@ -1,23 +1,14 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class LibraryResponseDto { - /// Returns a new [LibraryResponseDto] instance. - LibraryResponseDto({ +final class LibraryResponseDto { + const LibraryResponseDto({ required this.assetCount, required this.createdAt, - this.exclusionPatterns = const [], + required this.exclusionPatterns, required this.id, - this.importPaths = const [], + required this.importPaths, required this.name, required this.ownerId, required this.refreshedAt, @@ -25,165 +16,122 @@ class LibraryResponseDto { }); /// Number of assets - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int assetCount; + final int assetCount; /// Creation date - DateTime createdAt; + final DateTime createdAt; /// Exclusion patterns - List exclusionPatterns; + final List exclusionPatterns; /// Library ID - String id; + final String id; /// Import paths - List importPaths; + final List importPaths; /// Library name - String name; + final String name; /// Owner user ID - String ownerId; + final String ownerId; /// Last refresh date - DateTime? refreshedAt; + final DateTime? refreshedAt; /// Last update date - DateTime updatedAt; + final DateTime updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is LibraryResponseDto && - other.assetCount == assetCount && - other.createdAt == createdAt && - _deepEquality.equals(other.exclusionPatterns, exclusionPatterns) && - other.id == id && - _deepEquality.equals(other.importPaths, importPaths) && - other.name == name && - other.ownerId == ownerId && - other.refreshedAt == refreshedAt && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetCount.hashCode) + - (createdAt.hashCode) + - (exclusionPatterns.hashCode) + - (id.hashCode) + - (importPaths.hashCode) + - (name.hashCode) + - (ownerId.hashCode) + - (refreshedAt == null ? 0 : refreshedAt!.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'LibraryResponseDto[assetCount=$assetCount, createdAt=$createdAt, exclusionPatterns=$exclusionPatterns, id=$id, importPaths=$importPaths, name=$name, ownerId=$ownerId, refreshedAt=$refreshedAt, updatedAt=$updatedAt]'; + static LibraryResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetCount: json[r'assetCount'] as int, + createdAt: DateTime.parse(json[r'createdAt'] as String), + exclusionPatterns: ((json[r'exclusionPatterns'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + id: json[r'id'] as String, + importPaths: ((json[r'importPaths'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + name: json[r'name'] as String, + ownerId: json[r'ownerId'] as String, + refreshedAt: (json[r'refreshedAt'] == null ? null : DateTime.parse(json[r'refreshedAt'] as String)), + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + ); + } Map toJson() { final json = {}; - json[r'assetCount'] = this.assetCount; - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - json[r'exclusionPatterns'] = this.exclusionPatterns; - json[r'id'] = this.id; - json[r'importPaths'] = this.importPaths; - json[r'name'] = this.name; - json[r'ownerId'] = this.ownerId; - if (this.refreshedAt != null) { - json[r'refreshedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.refreshedAt!.millisecondsSinceEpoch - : this.refreshedAt!.toUtc().toIso8601String(); - } else { - // json[r'refreshedAt'] = null; + json[r'assetCount'] = assetCount; + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + json[r'exclusionPatterns'] = exclusionPatterns; + json[r'id'] = id; + json[r'importPaths'] = importPaths; + json[r'name'] = name; + json[r'ownerId'] = ownerId; + if (refreshedAt != null) { + json[r'refreshedAt'] = refreshedAt!.toUtc().toIso8601String(); } - json[r'updatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAt.millisecondsSinceEpoch - : this.updatedAt.toUtc().toIso8601String(); + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); return json; } - /// Returns a new [LibraryResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static LibraryResponseDto? fromJson(dynamic value) { - upgradeDto(value, "LibraryResponseDto"); - if (value is Map) { - final json = value.cast(); - - return LibraryResponseDto( - assetCount: mapValueOfType(json, r'assetCount')!, - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - exclusionPatterns: json[r'exclusionPatterns'] is Iterable - ? (json[r'exclusionPatterns'] as Iterable).cast().toList(growable: false) - : const [], - id: mapValueOfType(json, r'id')!, - importPaths: json[r'importPaths'] is Iterable - ? (json[r'importPaths'] as Iterable).cast().toList(growable: false) - : const [], - name: mapValueOfType(json, r'name')!, - ownerId: mapValueOfType(json, r'ownerId')!, - refreshedAt: mapDateTime(json, r'refreshedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - updatedAt: mapDateTime(json, r'updatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ); - } - return null; + LibraryResponseDto copyWith({ + int? assetCount, + DateTime? createdAt, + List? exclusionPatterns, + String? id, + List? importPaths, + String? name, + String? ownerId, + Object? refreshedAt = _undefined, + DateTime? updatedAt, + }) { + return .new( + assetCount: assetCount ?? this.assetCount, + createdAt: createdAt ?? this.createdAt, + exclusionPatterns: exclusionPatterns ?? this.exclusionPatterns, + id: id ?? this.id, + importPaths: importPaths ?? this.importPaths, + name: name ?? this.name, + ownerId: ownerId ?? this.ownerId, + refreshedAt: identical(refreshedAt, _undefined) ? this.refreshedAt : refreshedAt as DateTime?, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = LibraryResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is LibraryResponseDto && + assetCount == other.assetCount && + createdAt == other.createdAt && + const DeepCollectionEquality().equals(exclusionPatterns, other.exclusionPatterns) && + id == other.id && + const DeepCollectionEquality().equals(importPaths, other.importPaths) && + name == other.name && + ownerId == other.ownerId && + refreshedAt == other.refreshedAt && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = LibraryResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + assetCount, + createdAt, + const DeepCollectionEquality().hash(exclusionPatterns), + id, + const DeepCollectionEquality().hash(importPaths), + name, + ownerId, + refreshedAt, + updatedAt, + ]); } - // maps a json object with a list of LibraryResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = LibraryResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetCount', - 'createdAt', - 'exclusionPatterns', - 'id', - 'importPaths', - 'name', - 'ownerId', - 'refreshedAt', - 'updatedAt', - }; + @override + String toString() => + 'LibraryResponseDto(assetCount=$assetCount, createdAt=$createdAt, exclusionPatterns=$exclusionPatterns, id=$id, importPaths=$importPaths, name=$name, ownerId=$ownerId, refreshedAt=$refreshedAt, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/library_stats_response_dto.dart b/mobile/openapi/lib/model/library_stats_response_dto.dart index 55adbc2b49..77a8364d46 100644 --- a/mobile/openapi/lib/model/library_stats_response_dto.dart +++ b/mobile/openapi/lib/model/library_stats_response_dto.dart @@ -1,139 +1,67 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class LibraryStatsResponseDto { - /// Returns a new [LibraryStatsResponseDto] instance. - LibraryStatsResponseDto({ - required this.photos, - required this.total, - required this.usage, - required this.videos, - }); +final class LibraryStatsResponseDto { + const LibraryStatsResponseDto({required this.photos, required this.total, required this.usage, required this.videos}); /// Number of photos - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int photos; + final int photos; /// Total number of assets - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int total; + final int total; /// Storage usage in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int usage; + final int usage; /// Number of videos - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int videos; + final int videos; - @override - bool operator ==(Object other) => identical(this, other) || other is LibraryStatsResponseDto && - other.photos == photos && - other.total == total && - other.usage == usage && - other.videos == videos; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (photos.hashCode) + - (total.hashCode) + - (usage.hashCode) + - (videos.hashCode); - - @override - String toString() => 'LibraryStatsResponseDto[photos=$photos, total=$total, usage=$usage, videos=$videos]'; + static LibraryStatsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + photos: json[r'photos'] as int, + total: json[r'total'] as int, + usage: json[r'usage'] as int, + videos: json[r'videos'] as int, + ); + } Map toJson() { final json = {}; - json[r'photos'] = this.photos; - json[r'total'] = this.total; - json[r'usage'] = this.usage; - json[r'videos'] = this.videos; + json[r'photos'] = photos; + json[r'total'] = total; + json[r'usage'] = usage; + json[r'videos'] = videos; return json; } - /// Returns a new [LibraryStatsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static LibraryStatsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "LibraryStatsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return LibraryStatsResponseDto( - photos: mapValueOfType(json, r'photos')!, - total: mapValueOfType(json, r'total')!, - usage: mapValueOfType(json, r'usage')!, - videos: mapValueOfType(json, r'videos')!, - ); - } - return null; + LibraryStatsResponseDto copyWith({int? photos, int? total, int? usage, int? videos}) { + return .new( + photos: photos ?? this.photos, + total: total ?? this.total, + usage: usage ?? this.usage, + videos: videos ?? this.videos, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = LibraryStatsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is LibraryStatsResponseDto && + photos == other.photos && + total == other.total && + usage == other.usage && + videos == other.videos); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = LibraryStatsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([photos, total, usage, videos]); } - // maps a json object with a list of LibraryStatsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = LibraryStatsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'photos', - 'total', - 'usage', - 'videos', - }; + @override + String toString() => 'LibraryStatsResponseDto(photos=$photos, total=$total, usage=$usage, videos=$videos)'; } - diff --git a/mobile/openapi/lib/model/license_key_dto.dart b/mobile/openapi/lib/model/license_key_dto.dart index d1818a2a43..c6e5e35cf2 100644 --- a/mobile/openapi/lib/model/license_key_dto.dart +++ b/mobile/openapi/lib/model/license_key_dto.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class LicenseKeyDto { - /// Returns a new [LicenseKeyDto] instance. - LicenseKeyDto({ - required this.activationKey, - required this.licenseKey, - }); +final class LicenseKeyDto { + const LicenseKeyDto({required this.activationKey, required this.licenseKey}); /// Activation key - String activationKey; + final String activationKey; - /// License key (format: /^IM(SV|CL)(-[\\dA-Za-z]{4}){8}$/) - String licenseKey; + /// License key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/) + final String licenseKey; - @override - bool operator ==(Object other) => identical(this, other) || other is LicenseKeyDto && - other.activationKey == activationKey && - other.licenseKey == licenseKey; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (activationKey.hashCode) + - (licenseKey.hashCode); - - @override - String toString() => 'LicenseKeyDto[activationKey=$activationKey, licenseKey=$licenseKey]'; + static LicenseKeyDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(activationKey: json[r'activationKey'] as String, licenseKey: json[r'licenseKey'] as String); + } Map toJson() { final json = {}; - json[r'activationKey'] = this.activationKey; - json[r'licenseKey'] = this.licenseKey; + json[r'activationKey'] = activationKey; + json[r'licenseKey'] = licenseKey; return json; } - /// Returns a new [LicenseKeyDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static LicenseKeyDto? fromJson(dynamic value) { - upgradeDto(value, "LicenseKeyDto"); - if (value is Map) { - final json = value.cast(); - - return LicenseKeyDto( - activationKey: mapValueOfType(json, r'activationKey')!, - licenseKey: mapValueOfType(json, r'licenseKey')!, - ); - } - return null; + LicenseKeyDto copyWith({String? activationKey, String? licenseKey}) { + return .new(activationKey: activationKey ?? this.activationKey, licenseKey: licenseKey ?? this.licenseKey); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = LicenseKeyDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is LicenseKeyDto && activationKey == other.activationKey && licenseKey == other.licenseKey); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = LicenseKeyDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([activationKey, licenseKey]); } - // maps a json object with a list of LicenseKeyDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = LicenseKeyDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'activationKey', - 'licenseKey', - }; + @override + String toString() => 'LicenseKeyDto(activationKey=$activationKey, licenseKey=$licenseKey)'; } - diff --git a/mobile/openapi/lib/model/license_response_dto.dart b/mobile/openapi/lib/model/license_response_dto.dart new file mode 100644 index 0000000000..7de0cf7fa8 --- /dev/null +++ b/mobile/openapi/lib/model/license_response_dto.dart @@ -0,0 +1,5 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +part of openapi.api; + +typedef LicenseResponseDto = UserLicense; diff --git a/mobile/openapi/lib/model/log_level.dart b/mobile/openapi/lib/model/log_level.dart index edb6a1ddda..1f60f426e2 100644 --- a/mobile/openapi/lib/model/log_level.dart +++ b/mobile/openapi/lib/model/log_level.dart @@ -1,97 +1,32 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Log level -class LogLevel { - /// Instantiate a new enum with the provided [value]. +enum LogLevel { + verbose._(r'verbose'), + debug._(r'debug'), + log._(r'log'), + warn._(r'warn'), + error._(r'error'), + fatal._(r'fatal'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const LogLevel._(this.value); - /// The underlying value of this enum member. final String value; + static LogLevel? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const verbose = LogLevel._(r'verbose'); - static const debug = LogLevel._(r'debug'); - static const log = LogLevel._(r'log'); - static const warn = LogLevel._(r'warn'); - static const error = LogLevel._(r'error'); - static const fatal = LogLevel._(r'fatal'); - - /// List of all possible values in this [enum][LogLevel]. - static const values = [ - verbose, - debug, - log, - warn, - error, - fatal, - ]; - - static LogLevel? fromJson(dynamic value) => LogLevelTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = LogLevel.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [LogLevel] to String, -/// and [decode] dynamic data back to [LogLevel]. -class LogLevelTypeTransformer { - factory LogLevelTypeTransformer() => _instance ??= const LogLevelTypeTransformer._(); - - const LogLevelTypeTransformer._(); - - String encode(LogLevel data) => data.value; - - /// Decodes a [dynamic value][data] to a LogLevel. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - LogLevel? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'verbose': return LogLevel.verbose; - case r'debug': return LogLevel.debug; - case r'log': return LogLevel.log; - case r'warn': return LogLevel.warn; - case r'error': return LogLevel.error; - case r'fatal': return LogLevel.fatal; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [LogLevelTypeTransformer] instance. - static LogLevelTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/login_credential_dto.dart b/mobile/openapi/lib/model/login_credential_dto.dart index 1fdfdc3d40..e7e37950f2 100644 --- a/mobile/openapi/lib/model/login_credential_dto.dart +++ b/mobile/openapi/lib/model/login_credential_dto.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class LoginCredentialDto { - /// Returns a new [LoginCredentialDto] instance. - LoginCredentialDto({ - required this.email, - required this.password, - }); +final class LoginCredentialDto { + const LoginCredentialDto({required this.email, required this.password}); /// User email - String email; + final String email; /// User password - String password; + final String password; - @override - bool operator ==(Object other) => identical(this, other) || other is LoginCredentialDto && - other.email == email && - other.password == password; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (email.hashCode) + - (password.hashCode); - - @override - String toString() => 'LoginCredentialDto[email=$email, password=$password]'; + static LoginCredentialDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(email: json[r'email'] as String, password: json[r'password'] as String); + } Map toJson() { final json = {}; - json[r'email'] = this.email; - json[r'password'] = this.password; + json[r'email'] = email; + json[r'password'] = password; return json; } - /// Returns a new [LoginCredentialDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static LoginCredentialDto? fromJson(dynamic value) { - upgradeDto(value, "LoginCredentialDto"); - if (value is Map) { - final json = value.cast(); - - return LoginCredentialDto( - email: mapValueOfType(json, r'email')!, - password: mapValueOfType(json, r'password')!, - ); - } - return null; + LoginCredentialDto copyWith({String? email, String? password}) { + return .new(email: email ?? this.email, password: password ?? this.password); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = LoginCredentialDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is LoginCredentialDto && email == other.email && password == other.password); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = LoginCredentialDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([email, password]); } - // maps a json object with a list of LoginCredentialDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = LoginCredentialDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'email', - 'password', - }; + @override + String toString() => 'LoginCredentialDto(email=$email, password=$password)'; } - diff --git a/mobile/openapi/lib/model/login_response_dto.dart b/mobile/openapi/lib/model/login_response_dto.dart index c6938c2393..07e88062c8 100644 --- a/mobile/openapi/lib/model/login_response_dto.dart +++ b/mobile/openapi/lib/model/login_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class LoginResponseDto { - /// Returns a new [LoginResponseDto] instance. - LoginResponseDto({ +final class LoginResponseDto { + const LoginResponseDto({ required this.accessToken, required this.isAdmin, required this.isOnboarded, @@ -24,140 +15,109 @@ class LoginResponseDto { }); /// Access token - String accessToken; + final String accessToken; /// Is admin user - bool isAdmin; + final bool isAdmin; /// Is onboarded - bool isOnboarded; + final bool isOnboarded; /// User name - String name; + final String name; /// Profile image path - String profileImagePath; + final String profileImagePath; /// Should change password - bool shouldChangePassword; + final bool shouldChangePassword; /// User email - String userEmail; + final String userEmail; /// User ID - String userId; + final String userId; - @override - bool operator ==(Object other) => identical(this, other) || other is LoginResponseDto && - other.accessToken == accessToken && - other.isAdmin == isAdmin && - other.isOnboarded == isOnboarded && - other.name == name && - other.profileImagePath == profileImagePath && - other.shouldChangePassword == shouldChangePassword && - other.userEmail == userEmail && - other.userId == userId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (accessToken.hashCode) + - (isAdmin.hashCode) + - (isOnboarded.hashCode) + - (name.hashCode) + - (profileImagePath.hashCode) + - (shouldChangePassword.hashCode) + - (userEmail.hashCode) + - (userId.hashCode); - - @override - String toString() => 'LoginResponseDto[accessToken=$accessToken, isAdmin=$isAdmin, isOnboarded=$isOnboarded, name=$name, profileImagePath=$profileImagePath, shouldChangePassword=$shouldChangePassword, userEmail=$userEmail, userId=$userId]'; + static LoginResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + accessToken: json[r'accessToken'] as String, + isAdmin: json[r'isAdmin'] as bool, + isOnboarded: json[r'isOnboarded'] as bool, + name: json[r'name'] as String, + profileImagePath: json[r'profileImagePath'] as String, + shouldChangePassword: json[r'shouldChangePassword'] as bool, + userEmail: json[r'userEmail'] as String, + userId: json[r'userId'] as String, + ); + } Map toJson() { final json = {}; - json[r'accessToken'] = this.accessToken; - json[r'isAdmin'] = this.isAdmin; - json[r'isOnboarded'] = this.isOnboarded; - json[r'name'] = this.name; - json[r'profileImagePath'] = this.profileImagePath; - json[r'shouldChangePassword'] = this.shouldChangePassword; - json[r'userEmail'] = this.userEmail; - json[r'userId'] = this.userId; + json[r'accessToken'] = accessToken; + json[r'isAdmin'] = isAdmin; + json[r'isOnboarded'] = isOnboarded; + json[r'name'] = name; + json[r'profileImagePath'] = profileImagePath; + json[r'shouldChangePassword'] = shouldChangePassword; + json[r'userEmail'] = userEmail; + json[r'userId'] = userId; return json; } - /// Returns a new [LoginResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static LoginResponseDto? fromJson(dynamic value) { - upgradeDto(value, "LoginResponseDto"); - if (value is Map) { - final json = value.cast(); - - return LoginResponseDto( - accessToken: mapValueOfType(json, r'accessToken')!, - isAdmin: mapValueOfType(json, r'isAdmin')!, - isOnboarded: mapValueOfType(json, r'isOnboarded')!, - name: mapValueOfType(json, r'name')!, - profileImagePath: mapValueOfType(json, r'profileImagePath')!, - shouldChangePassword: mapValueOfType(json, r'shouldChangePassword')!, - userEmail: mapValueOfType(json, r'userEmail')!, - userId: mapValueOfType(json, r'userId')!, - ); - } - return null; + LoginResponseDto copyWith({ + String? accessToken, + bool? isAdmin, + bool? isOnboarded, + String? name, + String? profileImagePath, + bool? shouldChangePassword, + String? userEmail, + String? userId, + }) { + return .new( + accessToken: accessToken ?? this.accessToken, + isAdmin: isAdmin ?? this.isAdmin, + isOnboarded: isOnboarded ?? this.isOnboarded, + name: name ?? this.name, + profileImagePath: profileImagePath ?? this.profileImagePath, + shouldChangePassword: shouldChangePassword ?? this.shouldChangePassword, + userEmail: userEmail ?? this.userEmail, + userId: userId ?? this.userId, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = LoginResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is LoginResponseDto && + accessToken == other.accessToken && + isAdmin == other.isAdmin && + isOnboarded == other.isOnboarded && + name == other.name && + profileImagePath == other.profileImagePath && + shouldChangePassword == other.shouldChangePassword && + userEmail == other.userEmail && + userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = LoginResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + accessToken, + isAdmin, + isOnboarded, + name, + profileImagePath, + shouldChangePassword, + userEmail, + userId, + ]); } - // maps a json object with a list of LoginResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = LoginResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'accessToken', - 'isAdmin', - 'isOnboarded', - 'name', - 'profileImagePath', - 'shouldChangePassword', - 'userEmail', - 'userId', - }; + @override + String toString() => + 'LoginResponseDto(accessToken=$accessToken, isAdmin=$isAdmin, isOnboarded=$isOnboarded, name=$name, profileImagePath=$profileImagePath, shouldChangePassword=$shouldChangePassword, userEmail=$userEmail, userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/logout_response_dto.dart b/mobile/openapi/lib/model/logout_response_dto.dart index b50db2c28b..9d417b9ef5 100644 --- a/mobile/openapi/lib/model/logout_response_dto.dart +++ b/mobile/openapi/lib/model/logout_response_dto.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class LogoutResponseDto { - /// Returns a new [LogoutResponseDto] instance. - LogoutResponseDto({ - required this.redirectUri, - required this.successful, - }); +final class LogoutResponseDto { + const LogoutResponseDto({required this.redirectUri, required this.successful}); /// Redirect URI - String redirectUri; + final String redirectUri; /// Logout successful - bool successful; + final bool successful; - @override - bool operator ==(Object other) => identical(this, other) || other is LogoutResponseDto && - other.redirectUri == redirectUri && - other.successful == successful; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (redirectUri.hashCode) + - (successful.hashCode); - - @override - String toString() => 'LogoutResponseDto[redirectUri=$redirectUri, successful=$successful]'; + static LogoutResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(redirectUri: json[r'redirectUri'] as String, successful: json[r'successful'] as bool); + } Map toJson() { final json = {}; - json[r'redirectUri'] = this.redirectUri; - json[r'successful'] = this.successful; + json[r'redirectUri'] = redirectUri; + json[r'successful'] = successful; return json; } - /// Returns a new [LogoutResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static LogoutResponseDto? fromJson(dynamic value) { - upgradeDto(value, "LogoutResponseDto"); - if (value is Map) { - final json = value.cast(); - - return LogoutResponseDto( - redirectUri: mapValueOfType(json, r'redirectUri')!, - successful: mapValueOfType(json, r'successful')!, - ); - } - return null; + LogoutResponseDto copyWith({String? redirectUri, bool? successful}) { + return .new(redirectUri: redirectUri ?? this.redirectUri, successful: successful ?? this.successful); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = LogoutResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is LogoutResponseDto && redirectUri == other.redirectUri && successful == other.successful); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = LogoutResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([redirectUri, successful]); } - // maps a json object with a list of LogoutResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = LogoutResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'redirectUri', - 'successful', - }; + @override + String toString() => 'LogoutResponseDto(redirectUri=$redirectUri, successful=$successful)'; } - diff --git a/mobile/openapi/lib/model/machine_learning_availability_checks_dto.dart b/mobile/openapi/lib/model/machine_learning_availability_checks_dto.dart index a9b8608ac1..aad452280c 100644 --- a/mobile/openapi/lib/model/machine_learning_availability_checks_dto.dart +++ b/mobile/openapi/lib/model/machine_learning_availability_checks_dto.dart @@ -1,120 +1,58 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MachineLearningAvailabilityChecksDto { - /// Returns a new [MachineLearningAvailabilityChecksDto] instance. - MachineLearningAvailabilityChecksDto({ - required this.enabled, - required this.interval, - required this.timeout, - }); +final class MachineLearningAvailabilityChecksDto { + const MachineLearningAvailabilityChecksDto({required this.enabled, required this.interval, required this.timeout}); /// Enabled - bool enabled; + final bool enabled; - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int interval; + final int interval; - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int timeout; + final int timeout; - @override - bool operator ==(Object other) => identical(this, other) || other is MachineLearningAvailabilityChecksDto && - other.enabled == enabled && - other.interval == interval && - other.timeout == timeout; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (interval.hashCode) + - (timeout.hashCode); - - @override - String toString() => 'MachineLearningAvailabilityChecksDto[enabled=$enabled, interval=$interval, timeout=$timeout]'; + static MachineLearningAvailabilityChecksDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + enabled: json[r'enabled'] as bool, + interval: json[r'interval'] as int, + timeout: json[r'timeout'] as int, + ); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'interval'] = this.interval; - json[r'timeout'] = this.timeout; + json[r'enabled'] = enabled; + json[r'interval'] = interval; + json[r'timeout'] = timeout; return json; } - /// Returns a new [MachineLearningAvailabilityChecksDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MachineLearningAvailabilityChecksDto? fromJson(dynamic value) { - upgradeDto(value, "MachineLearningAvailabilityChecksDto"); - if (value is Map) { - final json = value.cast(); - - return MachineLearningAvailabilityChecksDto( - enabled: mapValueOfType(json, r'enabled')!, - interval: mapValueOfType(json, r'interval')!, - timeout: mapValueOfType(json, r'timeout')!, - ); - } - return null; + MachineLearningAvailabilityChecksDto copyWith({bool? enabled, int? interval, int? timeout}) { + return .new( + enabled: enabled ?? this.enabled, + interval: interval ?? this.interval, + timeout: timeout ?? this.timeout, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MachineLearningAvailabilityChecksDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MachineLearningAvailabilityChecksDto && + enabled == other.enabled && + interval == other.interval && + timeout == other.timeout); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MachineLearningAvailabilityChecksDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, interval, timeout]); } - // maps a json object with a list of MachineLearningAvailabilityChecksDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MachineLearningAvailabilityChecksDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'interval', - 'timeout', - }; + @override + String toString() => 'MachineLearningAvailabilityChecksDto(enabled=$enabled, interval=$interval, timeout=$timeout)'; } - diff --git a/mobile/openapi/lib/model/maintenance_action.dart b/mobile/openapi/lib/model/maintenance_action.dart index ebf5ec0f71..54dbeb40f4 100644 --- a/mobile/openapi/lib/model/maintenance_action.dart +++ b/mobile/openapi/lib/model/maintenance_action.dart @@ -1,91 +1,30 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Maintenance action -class MaintenanceAction { - /// Instantiate a new enum with the provided [value]. +enum MaintenanceAction { + start._(r'start'), + end._(r'end'), + selectDatabaseRestore._(r'select_database_restore'), + restoreDatabase._(r'restore_database'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const MaintenanceAction._(this.value); - /// The underlying value of this enum member. final String value; + static MaintenanceAction? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const start = MaintenanceAction._(r'start'); - static const end = MaintenanceAction._(r'end'); - static const selectDatabaseRestore = MaintenanceAction._(r'select_database_restore'); - static const restoreDatabase = MaintenanceAction._(r'restore_database'); - - /// List of all possible values in this [enum][MaintenanceAction]. - static const values = [ - start, - end, - selectDatabaseRestore, - restoreDatabase, - ]; - - static MaintenanceAction? fromJson(dynamic value) => MaintenanceActionTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MaintenanceAction.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [MaintenanceAction] to String, -/// and [decode] dynamic data back to [MaintenanceAction]. -class MaintenanceActionTypeTransformer { - factory MaintenanceActionTypeTransformer() => _instance ??= const MaintenanceActionTypeTransformer._(); - - const MaintenanceActionTypeTransformer._(); - - String encode(MaintenanceAction data) => data.value; - - /// Decodes a [dynamic value][data] to a MaintenanceAction. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - MaintenanceAction? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'start': return MaintenanceAction.start; - case r'end': return MaintenanceAction.end; - case r'select_database_restore': return MaintenanceAction.selectDatabaseRestore; - case r'restore_database': return MaintenanceAction.restoreDatabase; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [MaintenanceActionTypeTransformer] instance. - static MaintenanceActionTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/maintenance_auth_dto.dart b/mobile/openapi/lib/model/maintenance_auth_dto.dart index f9511bdd2b..934d3a48ae 100644 --- a/mobile/openapi/lib/model/maintenance_auth_dto.dart +++ b/mobile/openapi/lib/model/maintenance_auth_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MaintenanceAuthDto { - /// Returns a new [MaintenanceAuthDto] instance. - MaintenanceAuthDto({ - required this.username, - }); +final class MaintenanceAuthDto { + const MaintenanceAuthDto({required this.username}); /// Maintenance username - String username; + final String username; - @override - bool operator ==(Object other) => identical(this, other) || other is MaintenanceAuthDto && - other.username == username; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (username.hashCode); - - @override - String toString() => 'MaintenanceAuthDto[username=$username]'; + static MaintenanceAuthDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(username: json[r'username'] as String); + } Map toJson() { final json = {}; - json[r'username'] = this.username; + json[r'username'] = username; return json; } - /// Returns a new [MaintenanceAuthDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MaintenanceAuthDto? fromJson(dynamic value) { - upgradeDto(value, "MaintenanceAuthDto"); - if (value is Map) { - final json = value.cast(); - - return MaintenanceAuthDto( - username: mapValueOfType(json, r'username')!, - ); - } - return null; + MaintenanceAuthDto copyWith({String? username}) { + return .new(username: username ?? this.username); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MaintenanceAuthDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is MaintenanceAuthDto && username == other.username); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MaintenanceAuthDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([username]); } - // maps a json object with a list of MaintenanceAuthDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MaintenanceAuthDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'username', - }; + @override + String toString() => 'MaintenanceAuthDto(username=$username)'; } - diff --git a/mobile/openapi/lib/model/maintenance_detect_install_response_dto.dart b/mobile/openapi/lib/model/maintenance_detect_install_response_dto.dart index 1c364a6fdc..0b74678087 100644 --- a/mobile/openapi/lib/model/maintenance_detect_install_response_dto.dart +++ b/mobile/openapi/lib/model/maintenance_detect_install_response_dto.dart @@ -1,99 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MaintenanceDetectInstallResponseDto { - /// Returns a new [MaintenanceDetectInstallResponseDto] instance. - MaintenanceDetectInstallResponseDto({ - this.storage = const [], - }); +final class MaintenanceDetectInstallResponseDto { + const MaintenanceDetectInstallResponseDto({required this.storage}); - List storage; + final List storage; - @override - bool operator ==(Object other) => identical(this, other) || other is MaintenanceDetectInstallResponseDto && - _deepEquality.equals(other.storage, storage); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (storage.hashCode); - - @override - String toString() => 'MaintenanceDetectInstallResponseDto[storage=$storage]'; + static MaintenanceDetectInstallResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + storage: ((json[r'storage'] as List?) + ?.map(($e) => (MaintenanceDetectInstallStorageFolderDto.fromJson($e))!) + .toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'storage'] = this.storage; + json[r'storage'] = storage.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [MaintenanceDetectInstallResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MaintenanceDetectInstallResponseDto? fromJson(dynamic value) { - upgradeDto(value, "MaintenanceDetectInstallResponseDto"); - if (value is Map) { - final json = value.cast(); - - return MaintenanceDetectInstallResponseDto( - storage: MaintenanceDetectInstallStorageFolderDto.listFromJson(json[r'storage']), - ); - } - return null; + MaintenanceDetectInstallResponseDto copyWith({List? storage}) { + return .new(storage: storage ?? this.storage); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MaintenanceDetectInstallResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MaintenanceDetectInstallResponseDto && const DeepCollectionEquality().equals(storage, other.storage)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MaintenanceDetectInstallResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(storage)]); } - // maps a json object with a list of MaintenanceDetectInstallResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MaintenanceDetectInstallResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'storage', - }; + @override + String toString() => 'MaintenanceDetectInstallResponseDto(storage=$storage)'; } - diff --git a/mobile/openapi/lib/model/maintenance_detect_install_storage_folder_dto.dart b/mobile/openapi/lib/model/maintenance_detect_install_storage_folder_dto.dart index 83182f53d7..cfd24a6362 100644 --- a/mobile/openapi/lib/model/maintenance_detect_install_storage_folder_dto.dart +++ b/mobile/openapi/lib/model/maintenance_detect_install_storage_folder_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MaintenanceDetectInstallStorageFolderDto { - /// Returns a new [MaintenanceDetectInstallStorageFolderDto] instance. - MaintenanceDetectInstallStorageFolderDto({ +final class MaintenanceDetectInstallStorageFolderDto { + const MaintenanceDetectInstallStorageFolderDto({ required this.files, required this.folder, required this.readable, @@ -20,110 +11,67 @@ class MaintenanceDetectInstallStorageFolderDto { }); /// Number of files in the folder - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int files; + final int files; - StorageFolder folder; + final StorageFolder folder; /// Whether the folder is readable - bool readable; + final bool readable; /// Whether the folder is writable - bool writable; + final bool writable; - @override - bool operator ==(Object other) => identical(this, other) || other is MaintenanceDetectInstallStorageFolderDto && - other.files == files && - other.folder == folder && - other.readable == readable && - other.writable == writable; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (files.hashCode) + - (folder.hashCode) + - (readable.hashCode) + - (writable.hashCode); - - @override - String toString() => 'MaintenanceDetectInstallStorageFolderDto[files=$files, folder=$folder, readable=$readable, writable=$writable]'; + static MaintenanceDetectInstallStorageFolderDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + files: json[r'files'] as int, + folder: (StorageFolder.fromJson(json[r'folder']))!, + readable: json[r'readable'] as bool, + writable: json[r'writable'] as bool, + ); + } Map toJson() { final json = {}; - json[r'files'] = this.files; - json[r'folder'] = this.folder; - json[r'readable'] = this.readable; - json[r'writable'] = this.writable; + json[r'files'] = files; + json[r'folder'] = folder.toJson(); + json[r'readable'] = readable; + json[r'writable'] = writable; return json; } - /// Returns a new [MaintenanceDetectInstallStorageFolderDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MaintenanceDetectInstallStorageFolderDto? fromJson(dynamic value) { - upgradeDto(value, "MaintenanceDetectInstallStorageFolderDto"); - if (value is Map) { - final json = value.cast(); - - return MaintenanceDetectInstallStorageFolderDto( - files: mapValueOfType(json, r'files')!, - folder: StorageFolder.fromJson(json[r'folder'])!, - readable: mapValueOfType(json, r'readable')!, - writable: mapValueOfType(json, r'writable')!, - ); - } - return null; + MaintenanceDetectInstallStorageFolderDto copyWith({ + int? files, + StorageFolder? folder, + bool? readable, + bool? writable, + }) { + return .new( + files: files ?? this.files, + folder: folder ?? this.folder, + readable: readable ?? this.readable, + writable: writable ?? this.writable, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MaintenanceDetectInstallStorageFolderDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MaintenanceDetectInstallStorageFolderDto && + files == other.files && + folder == other.folder && + readable == other.readable && + writable == other.writable); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MaintenanceDetectInstallStorageFolderDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([files, folder, readable, writable]); } - // maps a json object with a list of MaintenanceDetectInstallStorageFolderDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MaintenanceDetectInstallStorageFolderDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'files', - 'folder', - 'readable', - 'writable', - }; + @override + String toString() => + 'MaintenanceDetectInstallStorageFolderDto(files=$files, folder=$folder, readable=$readable, writable=$writable)'; } - diff --git a/mobile/openapi/lib/model/maintenance_login_dto.dart b/mobile/openapi/lib/model/maintenance_login_dto.dart index 64cf6b234b..f60bce09e5 100644 --- a/mobile/openapi/lib/model/maintenance_login_dto.dart +++ b/mobile/openapi/lib/model/maintenance_login_dto.dart @@ -1,109 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MaintenanceLoginDto { - /// Returns a new [MaintenanceLoginDto] instance. - MaintenanceLoginDto({ - this.token, - }); +final class MaintenanceLoginDto { + const MaintenanceLoginDto({this.token = const Optional.absent()}); /// Maintenance token - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? token; + final Optional token; - @override - bool operator ==(Object other) => identical(this, other) || other is MaintenanceLoginDto && - other.token == token; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (token == null ? 0 : token!.hashCode); - - @override - String toString() => 'MaintenanceLoginDto[token=$token]'; + static MaintenanceLoginDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + token: json.containsKey(r'token') ? Optional.present(json[r'token'] as String) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.token != null) { - json[r'token'] = this.token; - } else { - // json[r'token'] = null; + if (token case Present(:final value)) { + json[r'token'] = value; } return json; } - /// Returns a new [MaintenanceLoginDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MaintenanceLoginDto? fromJson(dynamic value) { - upgradeDto(value, "MaintenanceLoginDto"); - if (value is Map) { - final json = value.cast(); - - return MaintenanceLoginDto( - token: mapValueOfType(json, r'token'), - ); - } - return null; + MaintenanceLoginDto copyWith({Optional? token}) { + return .new(token: token ?? this.token); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MaintenanceLoginDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is MaintenanceLoginDto && token == other.token); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MaintenanceLoginDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([token]); } - // maps a json object with a list of MaintenanceLoginDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MaintenanceLoginDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'MaintenanceLoginDto(token=$token)'; } - diff --git a/mobile/openapi/lib/model/maintenance_status_response_dto.dart b/mobile/openapi/lib/model/maintenance_status_response_dto.dart index c1c94acd91..eb13f93f85 100644 --- a/mobile/openapi/lib/model/maintenance_status_response_dto.dart +++ b/mobile/openapi/lib/model/maintenance_status_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MaintenanceStatusResponseDto { - /// Returns a new [MaintenanceStatusResponseDto] instance. - MaintenanceStatusResponseDto({ +final class MaintenanceStatusResponseDto { + const MaintenanceStatusResponseDto({ required this.action, required this.active, this.error, @@ -20,141 +11,80 @@ class MaintenanceStatusResponseDto { this.task, }); - MaintenanceAction action; + final MaintenanceAction action; - bool active; + final bool active; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? error; + final String? error; - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - int? progress; + final int? progress; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? task; + final String? task; - @override - bool operator ==(Object other) => identical(this, other) || other is MaintenanceStatusResponseDto && - other.action == action && - other.active == active && - other.error == error && - other.progress == progress && - other.task == task; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (action.hashCode) + - (active.hashCode) + - (error == null ? 0 : error!.hashCode) + - (progress == null ? 0 : progress!.hashCode) + - (task == null ? 0 : task!.hashCode); - - @override - String toString() => 'MaintenanceStatusResponseDto[action=$action, active=$active, error=$error, progress=$progress, task=$task]'; + static MaintenanceStatusResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + action: (MaintenanceAction.fromJson(json[r'action']))!, + active: json[r'active'] as bool, + error: (json[r'error'] as String?), + progress: (json[r'progress'] as int?), + task: (json[r'task'] as String?), + ); + } Map toJson() { final json = {}; - json[r'action'] = this.action; - json[r'active'] = this.active; - if (this.error != null) { - json[r'error'] = this.error; - } else { - // json[r'error'] = null; + json[r'action'] = action.toJson(); + json[r'active'] = active; + if (error != null) { + json[r'error'] = error!; } - if (this.progress != null) { - json[r'progress'] = this.progress; - } else { - // json[r'progress'] = null; + if (progress != null) { + json[r'progress'] = progress!; } - if (this.task != null) { - json[r'task'] = this.task; - } else { - // json[r'task'] = null; + if (task != null) { + json[r'task'] = task!; } return json; } - /// Returns a new [MaintenanceStatusResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MaintenanceStatusResponseDto? fromJson(dynamic value) { - upgradeDto(value, "MaintenanceStatusResponseDto"); - if (value is Map) { - final json = value.cast(); - - return MaintenanceStatusResponseDto( - action: MaintenanceAction.fromJson(json[r'action'])!, - active: mapValueOfType(json, r'active')!, - error: mapValueOfType(json, r'error'), - progress: mapValueOfType(json, r'progress'), - task: mapValueOfType(json, r'task'), - ); - } - return null; + MaintenanceStatusResponseDto copyWith({ + MaintenanceAction? action, + bool? active, + Object? error = _undefined, + Object? progress = _undefined, + Object? task = _undefined, + }) { + return .new( + action: action ?? this.action, + active: active ?? this.active, + error: identical(error, _undefined) ? this.error : error as String?, + progress: identical(progress, _undefined) ? this.progress : progress as int?, + task: identical(task, _undefined) ? this.task : task as String?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MaintenanceStatusResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MaintenanceStatusResponseDto && + action == other.action && + active == other.active && + error == other.error && + progress == other.progress && + task == other.task); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MaintenanceStatusResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([action, active, error, progress, task]); } - // maps a json object with a list of MaintenanceStatusResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MaintenanceStatusResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'action', - 'active', - }; + @override + String toString() => + 'MaintenanceStatusResponseDto(action=$action, active=$active, error=$error, progress=$progress, task=$task)'; } - diff --git a/mobile/openapi/lib/model/manual_job_name.dart b/mobile/openapi/lib/model/manual_job_name.dart index 27753eb9dc..ad1d9fc90f 100644 --- a/mobile/openapi/lib/model/manual_job_name.dart +++ b/mobile/openapi/lib/model/manual_job_name.dart @@ -1,97 +1,32 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Manual job name -class ManualJobName { - /// Instantiate a new enum with the provided [value]. +enum ManualJobName { + personCleanup._(r'person-cleanup'), + tagCleanup._(r'tag-cleanup'), + userCleanup._(r'user-cleanup'), + memoryCleanup._(r'memory-cleanup'), + memoryCreate._(r'memory-create'), + backupDatabase._(r'backup-database'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const ManualJobName._(this.value); - /// The underlying value of this enum member. final String value; + static ManualJobName? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const personCleanup = ManualJobName._(r'person-cleanup'); - static const tagCleanup = ManualJobName._(r'tag-cleanup'); - static const userCleanup = ManualJobName._(r'user-cleanup'); - static const memoryCleanup = ManualJobName._(r'memory-cleanup'); - static const memoryCreate = ManualJobName._(r'memory-create'); - static const backupDatabase = ManualJobName._(r'backup-database'); - - /// List of all possible values in this [enum][ManualJobName]. - static const values = [ - personCleanup, - tagCleanup, - userCleanup, - memoryCleanup, - memoryCreate, - backupDatabase, - ]; - - static ManualJobName? fromJson(dynamic value) => ManualJobNameTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ManualJobName.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [ManualJobName] to String, -/// and [decode] dynamic data back to [ManualJobName]. -class ManualJobNameTypeTransformer { - factory ManualJobNameTypeTransformer() => _instance ??= const ManualJobNameTypeTransformer._(); - - const ManualJobNameTypeTransformer._(); - - String encode(ManualJobName data) => data.value; - - /// Decodes a [dynamic value][data] to a ManualJobName. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - ManualJobName? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'person-cleanup': return ManualJobName.personCleanup; - case r'tag-cleanup': return ManualJobName.tagCleanup; - case r'user-cleanup': return ManualJobName.userCleanup; - case r'memory-cleanup': return ManualJobName.memoryCleanup; - case r'memory-create': return ManualJobName.memoryCreate; - case r'backup-database': return ManualJobName.backupDatabase; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [ManualJobNameTypeTransformer] instance. - static ManualJobNameTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/map_marker_response_dto.dart b/mobile/openapi/lib/model/map_marker_response_dto.dart index c0a47a5458..f9b86b9984 100644 --- a/mobile/openapi/lib/model/map_marker_response_dto.dart +++ b/mobile/openapi/lib/model/map_marker_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MapMarkerResponseDto { - /// Returns a new [MapMarkerResponseDto] instance. - MapMarkerResponseDto({ +final class MapMarkerResponseDto { + const MapMarkerResponseDto({ required this.city, required this.country, required this.id, @@ -22,136 +13,91 @@ class MapMarkerResponseDto { }); /// City name - String? city; + final String? city; /// Country name - String? country; + final String? country; /// Asset ID - String id; + final String id; /// Latitude - double lat; + final double lat; /// Longitude - double lon; + final double lon; /// State/Province name - String? state; + final String? state; - @override - bool operator ==(Object other) => identical(this, other) || other is MapMarkerResponseDto && - other.city == city && - other.country == country && - other.id == id && - other.lat == lat && - other.lon == lon && - other.state == state; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (city == null ? 0 : city!.hashCode) + - (country == null ? 0 : country!.hashCode) + - (id.hashCode) + - (lat.hashCode) + - (lon.hashCode) + - (state == null ? 0 : state!.hashCode); - - @override - String toString() => 'MapMarkerResponseDto[city=$city, country=$country, id=$id, lat=$lat, lon=$lon, state=$state]'; + static MapMarkerResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + city: (json[r'city'] as String?), + country: (json[r'country'] as String?), + id: json[r'id'] as String, + lat: (json[r'lat'] as num).toDouble(), + lon: (json[r'lon'] as num).toDouble(), + state: (json[r'state'] as String?), + ); + } Map toJson() { final json = {}; - if (this.city != null) { - json[r'city'] = this.city; - } else { - // json[r'city'] = null; + if (city != null) { + json[r'city'] = city!; } - if (this.country != null) { - json[r'country'] = this.country; - } else { - // json[r'country'] = null; + if (country != null) { + json[r'country'] = country!; } - json[r'id'] = this.id; - json[r'lat'] = this.lat; - json[r'lon'] = this.lon; - if (this.state != null) { - json[r'state'] = this.state; - } else { - // json[r'state'] = null; + json[r'id'] = id; + json[r'lat'] = lat; + json[r'lon'] = lon; + if (state != null) { + json[r'state'] = state!; } return json; } - /// Returns a new [MapMarkerResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MapMarkerResponseDto? fromJson(dynamic value) { - upgradeDto(value, "MapMarkerResponseDto"); - if (value is Map) { - final json = value.cast(); - - return MapMarkerResponseDto( - city: mapValueOfType(json, r'city'), - country: mapValueOfType(json, r'country'), - id: mapValueOfType(json, r'id')!, - lat: (mapValueOfType(json, r'lat')!).toDouble(), - lon: (mapValueOfType(json, r'lon')!).toDouble(), - state: mapValueOfType(json, r'state'), - ); - } - return null; + MapMarkerResponseDto copyWith({ + Object? city = _undefined, + Object? country = _undefined, + String? id, + double? lat, + double? lon, + Object? state = _undefined, + }) { + return .new( + city: identical(city, _undefined) ? this.city : city as String?, + country: identical(country, _undefined) ? this.country : country as String?, + id: id ?? this.id, + lat: lat ?? this.lat, + lon: lon ?? this.lon, + state: identical(state, _undefined) ? this.state : state as String?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MapMarkerResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MapMarkerResponseDto && + city == other.city && + country == other.country && + id == other.id && + lat == other.lat && + lon == other.lon && + state == other.state); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MapMarkerResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([city, country, id, lat, lon, state]); } - // maps a json object with a list of MapMarkerResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MapMarkerResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'city', - 'country', - 'id', - 'lat', - 'lon', - 'state', - }; + @override + String toString() => 'MapMarkerResponseDto(city=$city, country=$country, id=$id, lat=$lat, lon=$lon, state=$state)'; } - diff --git a/mobile/openapi/lib/model/map_reverse_geocode_response_dto.dart b/mobile/openapi/lib/model/map_reverse_geocode_response_dto.dart index 85435485e6..1698609bd7 100644 --- a/mobile/openapi/lib/model/map_reverse_geocode_response_dto.dart +++ b/mobile/openapi/lib/model/map_reverse_geocode_response_dto.dart @@ -1,130 +1,72 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MapReverseGeocodeResponseDto { - /// Returns a new [MapReverseGeocodeResponseDto] instance. - MapReverseGeocodeResponseDto({ - required this.city, - required this.country, - required this.state, - }); +final class MapReverseGeocodeResponseDto { + const MapReverseGeocodeResponseDto({required this.city, required this.country, required this.state}); /// City name - String? city; + final String? city; /// Country name - String? country; + final String? country; /// State/Province name - String? state; + final String? state; - @override - bool operator ==(Object other) => identical(this, other) || other is MapReverseGeocodeResponseDto && - other.city == city && - other.country == country && - other.state == state; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (city == null ? 0 : city!.hashCode) + - (country == null ? 0 : country!.hashCode) + - (state == null ? 0 : state!.hashCode); - - @override - String toString() => 'MapReverseGeocodeResponseDto[city=$city, country=$country, state=$state]'; + static MapReverseGeocodeResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + city: (json[r'city'] as String?), + country: (json[r'country'] as String?), + state: (json[r'state'] as String?), + ); + } Map toJson() { final json = {}; - if (this.city != null) { - json[r'city'] = this.city; - } else { - // json[r'city'] = null; + if (city != null) { + json[r'city'] = city!; } - if (this.country != null) { - json[r'country'] = this.country; - } else { - // json[r'country'] = null; + if (country != null) { + json[r'country'] = country!; } - if (this.state != null) { - json[r'state'] = this.state; - } else { - // json[r'state'] = null; + if (state != null) { + json[r'state'] = state!; } return json; } - /// Returns a new [MapReverseGeocodeResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MapReverseGeocodeResponseDto? fromJson(dynamic value) { - upgradeDto(value, "MapReverseGeocodeResponseDto"); - if (value is Map) { - final json = value.cast(); - - return MapReverseGeocodeResponseDto( - city: mapValueOfType(json, r'city'), - country: mapValueOfType(json, r'country'), - state: mapValueOfType(json, r'state'), - ); - } - return null; + MapReverseGeocodeResponseDto copyWith({ + Object? city = _undefined, + Object? country = _undefined, + Object? state = _undefined, + }) { + return .new( + city: identical(city, _undefined) ? this.city : city as String?, + country: identical(country, _undefined) ? this.country : country as String?, + state: identical(state, _undefined) ? this.state : state as String?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MapReverseGeocodeResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MapReverseGeocodeResponseDto && + city == other.city && + country == other.country && + state == other.state); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MapReverseGeocodeResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([city, country, state]); } - // maps a json object with a list of MapReverseGeocodeResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MapReverseGeocodeResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'city', - 'country', - 'state', - }; + @override + String toString() => 'MapReverseGeocodeResponseDto(city=$city, country=$country, state=$state)'; } - diff --git a/mobile/openapi/lib/model/memories_response.dart b/mobile/openapi/lib/model/memories_response.dart index 250e214a60..ad9eb3fb5f 100644 --- a/mobile/openapi/lib/model/memories_response.dart +++ b/mobile/openapi/lib/model/memories_response.dart @@ -1,112 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MemoriesResponse { - /// Returns a new [MemoriesResponse] instance. - MemoriesResponse({ - required this.duration, - required this.enabled, - }); +final class MemoriesResponse { + const MemoriesResponse({required this.duration, required this.enabled}); /// Memory duration in seconds - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int duration; + final int duration; /// Whether memories are enabled - bool enabled; + final bool enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is MemoriesResponse && - other.duration == duration && - other.enabled == enabled; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (duration.hashCode) + - (enabled.hashCode); - - @override - String toString() => 'MemoriesResponse[duration=$duration, enabled=$enabled]'; + static MemoriesResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(duration: json[r'duration'] as int, enabled: json[r'enabled'] as bool); + } Map toJson() { final json = {}; - json[r'duration'] = this.duration; - json[r'enabled'] = this.enabled; + json[r'duration'] = duration; + json[r'enabled'] = enabled; return json; } - /// Returns a new [MemoriesResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MemoriesResponse? fromJson(dynamic value) { - upgradeDto(value, "MemoriesResponse"); - if (value is Map) { - final json = value.cast(); - - return MemoriesResponse( - duration: mapValueOfType(json, r'duration')!, - enabled: mapValueOfType(json, r'enabled')!, - ); - } - return null; + MemoriesResponse copyWith({int? duration, bool? enabled}) { + return .new(duration: duration ?? this.duration, enabled: enabled ?? this.enabled); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MemoriesResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MemoriesResponse && duration == other.duration && enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MemoriesResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([duration, enabled]); } - // maps a json object with a list of MemoriesResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MemoriesResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'duration', - 'enabled', - }; + @override + String toString() => 'MemoriesResponse(duration=$duration, enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/memories_update.dart b/mobile/openapi/lib/model/memories_update.dart index ede9910d74..3c2a7bf08d 100644 --- a/mobile/openapi/lib/model/memories_update.dart +++ b/mobile/openapi/lib/model/memories_update.dart @@ -1,130 +1,54 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MemoriesUpdate { - /// Returns a new [MemoriesUpdate] instance. - MemoriesUpdate({ - this.duration, - this.enabled, - }); +final class MemoriesUpdate { + const MemoriesUpdate({this.duration, this.enabled}); /// Memory duration in seconds - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - int? duration; + final int? duration; /// Whether memories are enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final bool? enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is MemoriesUpdate && - other.duration == duration && - other.enabled == enabled; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (duration == null ? 0 : duration!.hashCode) + - (enabled == null ? 0 : enabled!.hashCode); - - @override - String toString() => 'MemoriesUpdate[duration=$duration, enabled=$enabled]'; + static MemoriesUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(duration: (json[r'duration'] as int?), enabled: (json[r'enabled'] as bool?)); + } Map toJson() { final json = {}; - if (this.duration != null) { - json[r'duration'] = this.duration; - } else { - // json[r'duration'] = null; + if (duration != null) { + json[r'duration'] = duration!; } - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled != null) { + json[r'enabled'] = enabled!; } return json; } - /// Returns a new [MemoriesUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MemoriesUpdate? fromJson(dynamic value) { - upgradeDto(value, "MemoriesUpdate"); - if (value is Map) { - final json = value.cast(); - - return MemoriesUpdate( - duration: mapValueOfType(json, r'duration'), - enabled: mapValueOfType(json, r'enabled'), - ); - } - return null; + MemoriesUpdate copyWith({Object? duration = _undefined, Object? enabled = _undefined}) { + return .new( + duration: identical(duration, _undefined) ? this.duration : duration as int?, + enabled: identical(enabled, _undefined) ? this.enabled : enabled as bool?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MemoriesUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MemoriesUpdate && duration == other.duration && enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MemoriesUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([duration, enabled]); } - // maps a json object with a list of MemoriesUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MemoriesUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'MemoriesUpdate(duration=$duration, enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/memory_create_dto.dart b/mobile/openapi/lib/model/memory_create_dto.dart index b906f6dd1d..ce2691ff07 100644 --- a/mobile/openapi/lib/model/memory_create_dto.dart +++ b/mobile/openapi/lib/model/memory_create_dto.dart @@ -1,206 +1,140 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MemoryCreateDto { - /// Returns a new [MemoryCreateDto] instance. - MemoryCreateDto({ - this.assetIds = const [], +final class MemoryCreateDto { + const MemoryCreateDto({ + this.assetIds = const Optional.absent(), required this.data, - this.hideAt, - this.isSaved, + this.hideAt = const Optional.absent(), + this.isSaved = const Optional.absent(), required this.memoryAt, - this.seenAt, - this.showAt, + this.seenAt = const Optional.absent(), + this.showAt = const Optional.absent(), required this.type, }); /// Asset IDs to associate with memory - List assetIds; + final Optional> assetIds; - OnThisDayDto data; + final OnThisDayDto data; /// Date when memory should be hidden - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? hideAt; + /// Available since server v2.6.0. + final Optional hideAt; /// Is memory saved - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isSaved; + final Optional isSaved; /// Memory date - DateTime memoryAt; + final DateTime memoryAt; /// Date when memory was seen - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? seenAt; + final Optional seenAt; /// Date when memory should be shown - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? showAt; + /// Available since server v2.6.0. + final Optional showAt; - MemoryType type; + final MemoryType type; - @override - bool operator ==(Object other) => identical(this, other) || other is MemoryCreateDto && - _deepEquality.equals(other.assetIds, assetIds) && - other.data == data && - other.hideAt == hideAt && - other.isSaved == isSaved && - other.memoryAt == memoryAt && - other.seenAt == seenAt && - other.showAt == showAt && - other.type == type; + static const ApiVersion hideAtAddedIn = .new(2, 6, 0); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetIds.hashCode) + - (data.hashCode) + - (hideAt == null ? 0 : hideAt!.hashCode) + - (isSaved == null ? 0 : isSaved!.hashCode) + - (memoryAt.hashCode) + - (seenAt == null ? 0 : seenAt!.hashCode) + - (showAt == null ? 0 : showAt!.hashCode) + - (type.hashCode); + static const ApiState hideAtState = .stable; - @override - String toString() => 'MemoryCreateDto[assetIds=$assetIds, data=$data, hideAt=$hideAt, isSaved=$isSaved, memoryAt=$memoryAt, seenAt=$seenAt, showAt=$showAt, type=$type]'; + static const ApiVersion showAtAddedIn = .new(2, 6, 0); + + static const ApiState showAtState = .stable; + + static MemoryCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetIds: json.containsKey(r'assetIds') + ? Optional.present(((json[r'assetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + data: (OnThisDayDto.fromJson(json[r'data']))!, + hideAt: json.containsKey(r'hideAt') + ? Optional.present(DateTime.parse(json[r'hideAt'] as String)) + : const Optional.absent(), + isSaved: json.containsKey(r'isSaved') ? Optional.present(json[r'isSaved'] as bool) : const Optional.absent(), + memoryAt: DateTime.parse(json[r'memoryAt'] as String), + seenAt: json.containsKey(r'seenAt') + ? Optional.present(DateTime.parse(json[r'seenAt'] as String)) + : const Optional.absent(), + showAt: json.containsKey(r'showAt') + ? Optional.present(DateTime.parse(json[r'showAt'] as String)) + : const Optional.absent(), + type: (MemoryType.fromJson(json[r'type']))!, + ); + } Map toJson() { final json = {}; - json[r'assetIds'] = this.assetIds; - json[r'data'] = this.data; - if (this.hideAt != null) { - json[r'hideAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.hideAt!.millisecondsSinceEpoch - : this.hideAt!.toUtc().toIso8601String(); - } else { - // json[r'hideAt'] = null; + if (assetIds case Present(:final value)) { + json[r'assetIds'] = value; } - if (this.isSaved != null) { - json[r'isSaved'] = this.isSaved; - } else { - // json[r'isSaved'] = null; + json[r'data'] = data.toJson(); + if (hideAt case Present(:final value)) { + json[r'hideAt'] = value.toUtc().toIso8601String(); } - json[r'memoryAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.memoryAt.millisecondsSinceEpoch - : this.memoryAt.toUtc().toIso8601String(); - if (this.seenAt != null) { - json[r'seenAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.seenAt!.millisecondsSinceEpoch - : this.seenAt!.toUtc().toIso8601String(); - } else { - // json[r'seenAt'] = null; + if (isSaved case Present(:final value)) { + json[r'isSaved'] = value; } - if (this.showAt != null) { - json[r'showAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.showAt!.millisecondsSinceEpoch - : this.showAt!.toUtc().toIso8601String(); - } else { - // json[r'showAt'] = null; + json[r'memoryAt'] = memoryAt.toUtc().toIso8601String(); + if (seenAt case Present(:final value)) { + json[r'seenAt'] = value.toUtc().toIso8601String(); } - json[r'type'] = this.type; + if (showAt case Present(:final value)) { + json[r'showAt'] = value.toUtc().toIso8601String(); + } + json[r'type'] = type.toJson(); return json; } - /// Returns a new [MemoryCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MemoryCreateDto? fromJson(dynamic value) { - upgradeDto(value, "MemoryCreateDto"); - if (value is Map) { - final json = value.cast(); - - return MemoryCreateDto( - assetIds: json[r'assetIds'] is Iterable - ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) - : const [], - data: OnThisDayDto.fromJson(json[r'data'])!, - hideAt: mapDateTime(json, r'hideAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - isSaved: mapValueOfType(json, r'isSaved'), - memoryAt: mapDateTime(json, r'memoryAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - seenAt: mapDateTime(json, r'seenAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - showAt: mapDateTime(json, r'showAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - type: MemoryType.fromJson(json[r'type'])!, - ); - } - return null; + MemoryCreateDto copyWith({ + Optional>? assetIds, + OnThisDayDto? data, + Optional? hideAt, + Optional? isSaved, + DateTime? memoryAt, + Optional? seenAt, + Optional? showAt, + MemoryType? type, + }) { + return .new( + assetIds: assetIds ?? this.assetIds, + data: data ?? this.data, + hideAt: hideAt ?? this.hideAt, + isSaved: isSaved ?? this.isSaved, + memoryAt: memoryAt ?? this.memoryAt, + seenAt: seenAt ?? this.seenAt, + showAt: showAt ?? this.showAt, + type: type ?? this.type, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MemoryCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MemoryCreateDto && + assetIds == other.assetIds && + data == other.data && + hideAt == other.hideAt && + isSaved == other.isSaved && + memoryAt == other.memoryAt && + seenAt == other.seenAt && + showAt == other.showAt && + type == other.type); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MemoryCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetIds, data, hideAt, isSaved, memoryAt, seenAt, showAt, type]); } - // maps a json object with a list of MemoryCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MemoryCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'data', - 'memoryAt', - 'type', - }; + @override + String toString() => + 'MemoryCreateDto(assetIds=$assetIds, data=$data, hideAt=$hideAt, isSaved=$isSaved, memoryAt=$memoryAt, seenAt=$seenAt, showAt=$showAt, type=$type)'; } - diff --git a/mobile/openapi/lib/model/memory_response_dto.dart b/mobile/openapi/lib/model/memory_response_dto.dart index e736667d57..45235db7a7 100644 --- a/mobile/openapi/lib/model/memory_response_dto.dart +++ b/mobile/openapi/lib/model/memory_response_dto.dart @@ -1,19 +1,10 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MemoryResponseDto { - /// Returns a new [MemoryResponseDto] instance. - MemoryResponseDto({ - this.assets = const [], +final class MemoryResponseDto { + const MemoryResponseDto({ + required this.assets, required this.createdAt, required this.data, this.deletedAt, @@ -28,228 +19,162 @@ class MemoryResponseDto { required this.updatedAt, }); - List assets; + final List assets; /// Creation date - DateTime createdAt; + final DateTime createdAt; - OnThisDayDto data; + final OnThisDayDto data; /// Deletion date - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? deletedAt; + final DateTime? deletedAt; /// Date when memory should be hidden - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? hideAt; + final DateTime? hideAt; /// Memory ID - String id; + final String id; /// Is memory saved - bool isSaved; + final bool isSaved; /// Memory date - DateTime memoryAt; + final DateTime memoryAt; /// Owner user ID - String ownerId; + final String ownerId; /// Date when memory was seen - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? seenAt; + final DateTime? seenAt; /// Date when memory should be shown - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? showAt; + final DateTime? showAt; - MemoryType type; + final MemoryType type; /// Last update date - DateTime updatedAt; + final DateTime updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is MemoryResponseDto && - _deepEquality.equals(other.assets, assets) && - other.createdAt == createdAt && - other.data == data && - other.deletedAt == deletedAt && - other.hideAt == hideAt && - other.id == id && - other.isSaved == isSaved && - other.memoryAt == memoryAt && - other.ownerId == ownerId && - other.seenAt == seenAt && - other.showAt == showAt && - other.type == type && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assets.hashCode) + - (createdAt.hashCode) + - (data.hashCode) + - (deletedAt == null ? 0 : deletedAt!.hashCode) + - (hideAt == null ? 0 : hideAt!.hashCode) + - (id.hashCode) + - (isSaved.hashCode) + - (memoryAt.hashCode) + - (ownerId.hashCode) + - (seenAt == null ? 0 : seenAt!.hashCode) + - (showAt == null ? 0 : showAt!.hashCode) + - (type.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'MemoryResponseDto[assets=$assets, createdAt=$createdAt, data=$data, deletedAt=$deletedAt, hideAt=$hideAt, id=$id, isSaved=$isSaved, memoryAt=$memoryAt, ownerId=$ownerId, seenAt=$seenAt, showAt=$showAt, type=$type, updatedAt=$updatedAt]'; + static MemoryResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assets: ((json[r'assets'] as List?)?.map(($e) => (AssetResponseDto.fromJson($e))!).toList(growable: false))!, + createdAt: DateTime.parse(json[r'createdAt'] as String), + data: (OnThisDayDto.fromJson(json[r'data']))!, + deletedAt: (json[r'deletedAt'] == null ? null : DateTime.parse(json[r'deletedAt'] as String)), + hideAt: (json[r'hideAt'] == null ? null : DateTime.parse(json[r'hideAt'] as String)), + id: json[r'id'] as String, + isSaved: json[r'isSaved'] as bool, + memoryAt: DateTime.parse(json[r'memoryAt'] as String), + ownerId: json[r'ownerId'] as String, + seenAt: (json[r'seenAt'] == null ? null : DateTime.parse(json[r'seenAt'] as String)), + showAt: (json[r'showAt'] == null ? null : DateTime.parse(json[r'showAt'] as String)), + type: (MemoryType.fromJson(json[r'type']))!, + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + ); + } Map toJson() { final json = {}; - json[r'assets'] = this.assets; - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - json[r'data'] = this.data; - if (this.deletedAt != null) { - json[r'deletedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.deletedAt!.millisecondsSinceEpoch - : this.deletedAt!.toUtc().toIso8601String(); - } else { - // json[r'deletedAt'] = null; + json[r'assets'] = assets.map(($e) => $e.toJson()).toList(growable: false); + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + json[r'data'] = data.toJson(); + if (deletedAt != null) { + json[r'deletedAt'] = deletedAt!.toUtc().toIso8601String(); } - if (this.hideAt != null) { - json[r'hideAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.hideAt!.millisecondsSinceEpoch - : this.hideAt!.toUtc().toIso8601String(); - } else { - // json[r'hideAt'] = null; + if (hideAt != null) { + json[r'hideAt'] = hideAt!.toUtc().toIso8601String(); } - json[r'id'] = this.id; - json[r'isSaved'] = this.isSaved; - json[r'memoryAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.memoryAt.millisecondsSinceEpoch - : this.memoryAt.toUtc().toIso8601String(); - json[r'ownerId'] = this.ownerId; - if (this.seenAt != null) { - json[r'seenAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.seenAt!.millisecondsSinceEpoch - : this.seenAt!.toUtc().toIso8601String(); - } else { - // json[r'seenAt'] = null; + json[r'id'] = id; + json[r'isSaved'] = isSaved; + json[r'memoryAt'] = memoryAt.toUtc().toIso8601String(); + json[r'ownerId'] = ownerId; + if (seenAt != null) { + json[r'seenAt'] = seenAt!.toUtc().toIso8601String(); } - if (this.showAt != null) { - json[r'showAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.showAt!.millisecondsSinceEpoch - : this.showAt!.toUtc().toIso8601String(); - } else { - // json[r'showAt'] = null; + if (showAt != null) { + json[r'showAt'] = showAt!.toUtc().toIso8601String(); } - json[r'type'] = this.type; - json[r'updatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAt.millisecondsSinceEpoch - : this.updatedAt.toUtc().toIso8601String(); + json[r'type'] = type.toJson(); + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); return json; } - /// Returns a new [MemoryResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MemoryResponseDto? fromJson(dynamic value) { - upgradeDto(value, "MemoryResponseDto"); - if (value is Map) { - final json = value.cast(); - - return MemoryResponseDto( - assets: AssetResponseDto.listFromJson(json[r'assets']), - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - data: OnThisDayDto.fromJson(json[r'data'])!, - deletedAt: mapDateTime(json, r'deletedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - hideAt: mapDateTime(json, r'hideAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - id: mapValueOfType(json, r'id')!, - isSaved: mapValueOfType(json, r'isSaved')!, - memoryAt: mapDateTime(json, r'memoryAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ownerId: mapValueOfType(json, r'ownerId')!, - seenAt: mapDateTime(json, r'seenAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - showAt: mapDateTime(json, r'showAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - type: MemoryType.fromJson(json[r'type'])!, - updatedAt: mapDateTime(json, r'updatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ); - } - return null; + MemoryResponseDto copyWith({ + List? assets, + DateTime? createdAt, + OnThisDayDto? data, + Object? deletedAt = _undefined, + Object? hideAt = _undefined, + String? id, + bool? isSaved, + DateTime? memoryAt, + String? ownerId, + Object? seenAt = _undefined, + Object? showAt = _undefined, + MemoryType? type, + DateTime? updatedAt, + }) { + return .new( + assets: assets ?? this.assets, + createdAt: createdAt ?? this.createdAt, + data: data ?? this.data, + deletedAt: identical(deletedAt, _undefined) ? this.deletedAt : deletedAt as DateTime?, + hideAt: identical(hideAt, _undefined) ? this.hideAt : hideAt as DateTime?, + id: id ?? this.id, + isSaved: isSaved ?? this.isSaved, + memoryAt: memoryAt ?? this.memoryAt, + ownerId: ownerId ?? this.ownerId, + seenAt: identical(seenAt, _undefined) ? this.seenAt : seenAt as DateTime?, + showAt: identical(showAt, _undefined) ? this.showAt : showAt as DateTime?, + type: type ?? this.type, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MemoryResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MemoryResponseDto && + const DeepCollectionEquality().equals(assets, other.assets) && + createdAt == other.createdAt && + data == other.data && + deletedAt == other.deletedAt && + hideAt == other.hideAt && + id == other.id && + isSaved == other.isSaved && + memoryAt == other.memoryAt && + ownerId == other.ownerId && + seenAt == other.seenAt && + showAt == other.showAt && + type == other.type && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MemoryResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + const DeepCollectionEquality().hash(assets), + createdAt, + data, + deletedAt, + hideAt, + id, + isSaved, + memoryAt, + ownerId, + seenAt, + showAt, + type, + updatedAt, + ]); } - // maps a json object with a list of MemoryResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MemoryResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assets', - 'createdAt', - 'data', - 'id', - 'isSaved', - 'memoryAt', - 'ownerId', - 'type', - 'updatedAt', - }; + @override + String toString() => + 'MemoryResponseDto(assets=$assets, createdAt=$createdAt, data=$data, deletedAt=$deletedAt, hideAt=$hideAt, id=$id, isSaved=$isSaved, memoryAt=$memoryAt, ownerId=$ownerId, seenAt=$seenAt, showAt=$showAt, type=$type, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/memory_search_order.dart b/mobile/openapi/lib/model/memory_search_order.dart index 67d0b69f46..6882137339 100644 --- a/mobile/openapi/lib/model/memory_search_order.dart +++ b/mobile/openapi/lib/model/memory_search_order.dart @@ -1,88 +1,29 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Sort order -class MemorySearchOrder { - /// Instantiate a new enum with the provided [value]. +enum MemorySearchOrder { + asc._(r'asc'), + desc._(r'desc'), + random._(r'random'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const MemorySearchOrder._(this.value); - /// The underlying value of this enum member. final String value; + static MemorySearchOrder? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const asc = MemorySearchOrder._(r'asc'); - static const desc = MemorySearchOrder._(r'desc'); - static const random = MemorySearchOrder._(r'random'); - - /// List of all possible values in this [enum][MemorySearchOrder]. - static const values = [ - asc, - desc, - random, - ]; - - static MemorySearchOrder? fromJson(dynamic value) => MemorySearchOrderTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MemorySearchOrder.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [MemorySearchOrder] to String, -/// and [decode] dynamic data back to [MemorySearchOrder]. -class MemorySearchOrderTypeTransformer { - factory MemorySearchOrderTypeTransformer() => _instance ??= const MemorySearchOrderTypeTransformer._(); - - const MemorySearchOrderTypeTransformer._(); - - String encode(MemorySearchOrder data) => data.value; - - /// Decodes a [dynamic value][data] to a MemorySearchOrder. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - MemorySearchOrder? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'asc': return MemorySearchOrder.asc; - case r'desc': return MemorySearchOrder.desc; - case r'random': return MemorySearchOrder.random; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [MemorySearchOrderTypeTransformer] instance. - static MemorySearchOrderTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/memory_statistics_response_dto.dart b/mobile/openapi/lib/model/memory_statistics_response_dto.dart index ae542870d9..4fa2a5811e 100644 --- a/mobile/openapi/lib/model/memory_statistics_response_dto.dart +++ b/mobile/openapi/lib/model/memory_statistics_response_dto.dart @@ -1,103 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MemoryStatisticsResponseDto { - /// Returns a new [MemoryStatisticsResponseDto] instance. - MemoryStatisticsResponseDto({ - required this.total, - }); +final class MemoryStatisticsResponseDto { + const MemoryStatisticsResponseDto({required this.total}); /// Total number of memories - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int total; + final int total; - @override - bool operator ==(Object other) => identical(this, other) || other is MemoryStatisticsResponseDto && - other.total == total; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (total.hashCode); - - @override - String toString() => 'MemoryStatisticsResponseDto[total=$total]'; + static MemoryStatisticsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(total: json[r'total'] as int); + } Map toJson() { final json = {}; - json[r'total'] = this.total; + json[r'total'] = total; return json; } - /// Returns a new [MemoryStatisticsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MemoryStatisticsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "MemoryStatisticsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return MemoryStatisticsResponseDto( - total: mapValueOfType(json, r'total')!, - ); - } - return null; + MemoryStatisticsResponseDto copyWith({int? total}) { + return .new(total: total ?? this.total); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MemoryStatisticsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is MemoryStatisticsResponseDto && total == other.total); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MemoryStatisticsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([total]); } - // maps a json object with a list of MemoryStatisticsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MemoryStatisticsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'total', - }; + @override + String toString() => 'MemoryStatisticsResponseDto(total=$total)'; } - diff --git a/mobile/openapi/lib/model/memory_type.dart b/mobile/openapi/lib/model/memory_type.dart index ecfc93edb0..77c04dae20 100644 --- a/mobile/openapi/lib/model/memory_type.dart +++ b/mobile/openapi/lib/model/memory_type.dart @@ -1,82 +1,27 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Memory type -class MemoryType { - /// Instantiate a new enum with the provided [value]. +enum MemoryType { + onThisDay._(r'on_this_day'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const MemoryType._(this.value); - /// The underlying value of this enum member. final String value; + static MemoryType? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const onThisDay = MemoryType._(r'on_this_day'); - - /// List of all possible values in this [enum][MemoryType]. - static const values = [ - onThisDay, - ]; - - static MemoryType? fromJson(dynamic value) => MemoryTypeTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MemoryType.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [MemoryType] to String, -/// and [decode] dynamic data back to [MemoryType]. -class MemoryTypeTypeTransformer { - factory MemoryTypeTypeTransformer() => _instance ??= const MemoryTypeTypeTransformer._(); - - const MemoryTypeTypeTransformer._(); - - String encode(MemoryType data) => data.value; - - /// Decodes a [dynamic value][data] to a MemoryType. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - MemoryType? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'on_this_day': return MemoryType.onThisDay; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [MemoryTypeTypeTransformer] instance. - static MemoryTypeTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/memory_update_dto.dart b/mobile/openapi/lib/model/memory_update_dto.dart index d8d7e9643b..b8a33b2eed 100644 --- a/mobile/openapi/lib/model/memory_update_dto.dart +++ b/mobile/openapi/lib/model/memory_update_dto.dart @@ -1,149 +1,67 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MemoryUpdateDto { - /// Returns a new [MemoryUpdateDto] instance. - MemoryUpdateDto({ - this.isSaved, - this.memoryAt, - this.seenAt, +final class MemoryUpdateDto { + const MemoryUpdateDto({ + this.isSaved = const Optional.absent(), + this.memoryAt = const Optional.absent(), + this.seenAt = const Optional.absent(), }); /// Is memory saved - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isSaved; + final Optional isSaved; /// Memory date - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? memoryAt; + final Optional memoryAt; /// Date when memory was seen - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? seenAt; + final Optional seenAt; - @override - bool operator ==(Object other) => identical(this, other) || other is MemoryUpdateDto && - other.isSaved == isSaved && - other.memoryAt == memoryAt && - other.seenAt == seenAt; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (isSaved == null ? 0 : isSaved!.hashCode) + - (memoryAt == null ? 0 : memoryAt!.hashCode) + - (seenAt == null ? 0 : seenAt!.hashCode); - - @override - String toString() => 'MemoryUpdateDto[isSaved=$isSaved, memoryAt=$memoryAt, seenAt=$seenAt]'; + static MemoryUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + isSaved: json.containsKey(r'isSaved') ? Optional.present(json[r'isSaved'] as bool) : const Optional.absent(), + memoryAt: json.containsKey(r'memoryAt') + ? Optional.present(DateTime.parse(json[r'memoryAt'] as String)) + : const Optional.absent(), + seenAt: json.containsKey(r'seenAt') + ? Optional.present(DateTime.parse(json[r'seenAt'] as String)) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.isSaved != null) { - json[r'isSaved'] = this.isSaved; - } else { - // json[r'isSaved'] = null; + if (isSaved case Present(:final value)) { + json[r'isSaved'] = value; } - if (this.memoryAt != null) { - json[r'memoryAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.memoryAt!.millisecondsSinceEpoch - : this.memoryAt!.toUtc().toIso8601String(); - } else { - // json[r'memoryAt'] = null; + if (memoryAt case Present(:final value)) { + json[r'memoryAt'] = value.toUtc().toIso8601String(); } - if (this.seenAt != null) { - json[r'seenAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.seenAt!.millisecondsSinceEpoch - : this.seenAt!.toUtc().toIso8601String(); - } else { - // json[r'seenAt'] = null; + if (seenAt case Present(:final value)) { + json[r'seenAt'] = value.toUtc().toIso8601String(); } return json; } - /// Returns a new [MemoryUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MemoryUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "MemoryUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return MemoryUpdateDto( - isSaved: mapValueOfType(json, r'isSaved'), - memoryAt: mapDateTime(json, r'memoryAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - seenAt: mapDateTime(json, r'seenAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - ); - } - return null; + MemoryUpdateDto copyWith({Optional? isSaved, Optional? memoryAt, Optional? seenAt}) { + return .new(isSaved: isSaved ?? this.isSaved, memoryAt: memoryAt ?? this.memoryAt, seenAt: seenAt ?? this.seenAt); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MemoryUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MemoryUpdateDto && isSaved == other.isSaved && memoryAt == other.memoryAt && seenAt == other.seenAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MemoryUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([isSaved, memoryAt, seenAt]); } - // maps a json object with a list of MemoryUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MemoryUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'MemoryUpdateDto(isSaved=$isSaved, memoryAt=$memoryAt, seenAt=$seenAt)'; } - diff --git a/mobile/openapi/lib/model/merge_person_dto.dart b/mobile/openapi/lib/model/merge_person_dto.dart index 8a647890c3..cd12c62c6e 100644 --- a/mobile/openapi/lib/model/merge_person_dto.dart +++ b/mobile/openapi/lib/model/merge_person_dto.dart @@ -1,102 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MergePersonDto { - /// Returns a new [MergePersonDto] instance. - MergePersonDto({ - this.ids = const [], - }); +final class MergePersonDto { + const MergePersonDto({required this.ids}); /// Person IDs to merge - List ids; + final List ids; - @override - bool operator ==(Object other) => identical(this, other) || other is MergePersonDto && - _deepEquality.equals(other.ids, ids); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (ids.hashCode); - - @override - String toString() => 'MergePersonDto[ids=$ids]'; + static MergePersonDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(ids: ((json[r'ids'] as List?)?.map(($e) => $e as String).toList(growable: false))!); + } Map toJson() { final json = {}; - json[r'ids'] = this.ids; + json[r'ids'] = ids; return json; } - /// Returns a new [MergePersonDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MergePersonDto? fromJson(dynamic value) { - upgradeDto(value, "MergePersonDto"); - if (value is Map) { - final json = value.cast(); - - return MergePersonDto( - ids: json[r'ids'] is Iterable - ? (json[r'ids'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + MergePersonDto copyWith({List? ids}) { + return .new(ids: ids ?? this.ids); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MergePersonDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is MergePersonDto && const DeepCollectionEquality().equals(ids, other.ids)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MergePersonDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(ids)]); } - // maps a json object with a list of MergePersonDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MergePersonDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'ids', - }; + @override + String toString() => 'MergePersonDto(ids=$ids)'; } - diff --git a/mobile/openapi/lib/model/metadata_search_dto.dart b/mobile/openapi/lib/model/metadata_search_dto.dart index 29b1d5b68d..b5db87517e 100644 --- a/mobile/openapi/lib/model/metadata_search_dto.dart +++ b/mobile/openapi/lib/model/metadata_search_dto.dart @@ -1,801 +1,608 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MetadataSearchDto { - /// Returns a new [MetadataSearchDto] instance. - MetadataSearchDto({ - this.albumIds = const [], - this.checksum, - this.city, - this.country, - this.createdAfter, - this.createdBefore, - this.description, - this.encodedVideoPath, - this.id, - this.isEncoded, - this.isFavorite, - this.isMotion, - this.isNotInAlbum, - this.isOffline, - this.lensModel, - this.libraryId, - this.make, - this.model, - this.ocr, - this.order, - this.originalFileName, - this.originalPath, - this.page, - this.personIds = const [], - this.previewPath, - this.rating, - this.size, - this.state, - this.tagIds = const [], - this.takenAfter, - this.takenBefore, - this.thumbnailPath, - this.trashedAfter, - this.trashedBefore, - this.type, - this.updatedAfter, - this.updatedBefore, - this.visibility, - this.withDeleted, - this.withExif, - this.withPeople, - this.withStacked, +final class MetadataSearchDto { + const MetadataSearchDto({ + this.albumIds = const Optional.absent(), + this.checksum = const Optional.absent(), + this.city = const Optional.absent(), + this.country = const Optional.absent(), + this.createdAfter = const Optional.absent(), + this.createdBefore = const Optional.absent(), + this.description = const Optional.absent(), + this.encodedVideoPath = const Optional.absent(), + this.id = const Optional.absent(), + this.isEncoded = const Optional.absent(), + this.isFavorite = const Optional.absent(), + this.isMotion = const Optional.absent(), + this.isNotInAlbum = const Optional.absent(), + this.isOffline = const Optional.absent(), + this.lensModel = const Optional.absent(), + this.libraryId = const Optional.absent(), + this.make = const Optional.absent(), + this.model = const Optional.absent(), + this.ocr = const Optional.absent(), + this.order = const Optional.absent(), + this.originalFileName = const Optional.absent(), + this.originalPath = const Optional.absent(), + this.page = const Optional.absent(), + this.personIds = const Optional.absent(), + this.previewPath = const Optional.absent(), + this.rating = const Optional.absent(), + this.size = const Optional.absent(), + this.state = const Optional.absent(), + this.tagIds = const Optional.absent(), + this.takenAfter = const Optional.absent(), + this.takenBefore = const Optional.absent(), + this.thumbnailPath = const Optional.absent(), + this.trashedAfter = const Optional.absent(), + this.trashedBefore = const Optional.absent(), + this.type = const Optional.absent(), + this.updatedAfter = const Optional.absent(), + this.updatedBefore = const Optional.absent(), + this.visibility = const Optional.absent(), + this.withDeleted = const Optional.absent(), + this.withExif = const Optional.absent(), + this.withPeople = const Optional.absent(), + this.withStacked = const Optional.absent(), }); /// Filter by album IDs - List albumIds; + final Optional> albumIds; /// Filter by file checksum - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? checksum; + final Optional checksum; /// Filter by city name - String? city; + final Optional city; /// Filter by country name - String? country; + final Optional country; /// Filter by creation date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? createdAfter; + final Optional createdAfter; /// Filter by creation date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? createdBefore; + final Optional createdBefore; /// Filter by description text - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? description; + final Optional description; /// Filter by encoded video file path - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? encodedVideoPath; + final Optional encodedVideoPath; /// Filter by asset ID - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? id; + final Optional id; /// Filter by encoded status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isEncoded; + final Optional isEncoded; /// Filter by favorite status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isFavorite; + final Optional isFavorite; /// Filter by motion photo status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isMotion; + final Optional isMotion; /// Filter assets not in any album - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isNotInAlbum; + final Optional isNotInAlbum; /// Filter by offline status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isOffline; + final Optional isOffline; /// Filter by lens model - String? lensModel; + final Optional lensModel; /// Library ID to filter by - String? libraryId; + final Optional libraryId; /// Filter by camera make - String? make; + final Optional make; /// Filter by camera model - String? model; + final Optional model; /// Filter by OCR text content - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? ocr; + final Optional ocr; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetOrder? order; + /// Sort order + final Optional order; /// Filter by original file name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? originalFileName; + final Optional originalFileName; /// Filter by original file path - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? originalPath; + final Optional originalPath; /// Page number - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - int? page; + final Optional page; /// Filter by person IDs - List personIds; + final Optional> personIds; /// Filter by preview file path - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? previewPath; + final Optional previewPath; /// Filter by rating [1-5], or null for unrated - /// - /// Minimum value: -1 - /// Maximum value: 5 - int? rating; + /// Available since server v1.0.0. + final Optional rating; /// Number of results to return - /// - /// Minimum value: 1 - /// Maximum value: 1000 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - int? size; + final Optional size; /// Filter by state/province name - String? state; + final Optional state; /// Filter by tag IDs - List? tagIds; + final Optional?> tagIds; /// Filter by taken date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? takenAfter; + final Optional takenAfter; /// Filter by taken date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? takenBefore; + final Optional takenBefore; /// Filter by thumbnail file path - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? thumbnailPath; + final Optional thumbnailPath; /// Filter by trash date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? trashedAfter; + final Optional trashedAfter; /// Filter by trash date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? trashedBefore; + final Optional trashedBefore; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetTypeEnum? type; + final Optional type; /// Filter by update date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? updatedAfter; + final Optional updatedAfter; /// Filter by update date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? updatedBefore; + final Optional updatedBefore; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetVisibility? visibility; + final Optional visibility; /// Include deleted assets - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? withDeleted; + final Optional withDeleted; /// Include EXIF data in response - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? withExif; + final Optional withExif; /// Include people data in response - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? withPeople; + final Optional withPeople; /// Include stacked assets - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? withStacked; + final Optional withStacked; - @override - bool operator ==(Object other) => identical(this, other) || other is MetadataSearchDto && - _deepEquality.equals(other.albumIds, albumIds) && - other.checksum == checksum && - other.city == city && - other.country == country && - other.createdAfter == createdAfter && - other.createdBefore == createdBefore && - other.description == description && - other.encodedVideoPath == encodedVideoPath && - other.id == id && - other.isEncoded == isEncoded && - other.isFavorite == isFavorite && - other.isMotion == isMotion && - other.isNotInAlbum == isNotInAlbum && - other.isOffline == isOffline && - other.lensModel == lensModel && - other.libraryId == libraryId && - other.make == make && - other.model == model && - other.ocr == ocr && - other.order == order && - other.originalFileName == originalFileName && - other.originalPath == originalPath && - other.page == page && - _deepEquality.equals(other.personIds, personIds) && - other.previewPath == previewPath && - other.rating == rating && - other.size == size && - other.state == state && - _deepEquality.equals(other.tagIds, tagIds) && - other.takenAfter == takenAfter && - other.takenBefore == takenBefore && - other.thumbnailPath == thumbnailPath && - other.trashedAfter == trashedAfter && - other.trashedBefore == trashedBefore && - other.type == type && - other.updatedAfter == updatedAfter && - other.updatedBefore == updatedBefore && - other.visibility == visibility && - other.withDeleted == withDeleted && - other.withExif == withExif && - other.withPeople == withPeople && - other.withStacked == withStacked; + static const ApiVersion ratingAddedIn = .new(1, 0, 0); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumIds.hashCode) + - (checksum == null ? 0 : checksum!.hashCode) + - (city == null ? 0 : city!.hashCode) + - (country == null ? 0 : country!.hashCode) + - (createdAfter == null ? 0 : createdAfter!.hashCode) + - (createdBefore == null ? 0 : createdBefore!.hashCode) + - (description == null ? 0 : description!.hashCode) + - (encodedVideoPath == null ? 0 : encodedVideoPath!.hashCode) + - (id == null ? 0 : id!.hashCode) + - (isEncoded == null ? 0 : isEncoded!.hashCode) + - (isFavorite == null ? 0 : isFavorite!.hashCode) + - (isMotion == null ? 0 : isMotion!.hashCode) + - (isNotInAlbum == null ? 0 : isNotInAlbum!.hashCode) + - (isOffline == null ? 0 : isOffline!.hashCode) + - (lensModel == null ? 0 : lensModel!.hashCode) + - (libraryId == null ? 0 : libraryId!.hashCode) + - (make == null ? 0 : make!.hashCode) + - (model == null ? 0 : model!.hashCode) + - (ocr == null ? 0 : ocr!.hashCode) + - (order == null ? 0 : order!.hashCode) + - (originalFileName == null ? 0 : originalFileName!.hashCode) + - (originalPath == null ? 0 : originalPath!.hashCode) + - (page == null ? 0 : page!.hashCode) + - (personIds.hashCode) + - (previewPath == null ? 0 : previewPath!.hashCode) + - (rating == null ? 0 : rating!.hashCode) + - (size == null ? 0 : size!.hashCode) + - (state == null ? 0 : state!.hashCode) + - (tagIds == null ? 0 : tagIds!.hashCode) + - (takenAfter == null ? 0 : takenAfter!.hashCode) + - (takenBefore == null ? 0 : takenBefore!.hashCode) + - (thumbnailPath == null ? 0 : thumbnailPath!.hashCode) + - (trashedAfter == null ? 0 : trashedAfter!.hashCode) + - (trashedBefore == null ? 0 : trashedBefore!.hashCode) + - (type == null ? 0 : type!.hashCode) + - (updatedAfter == null ? 0 : updatedAfter!.hashCode) + - (updatedBefore == null ? 0 : updatedBefore!.hashCode) + - (visibility == null ? 0 : visibility!.hashCode) + - (withDeleted == null ? 0 : withDeleted!.hashCode) + - (withExif == null ? 0 : withExif!.hashCode) + - (withPeople == null ? 0 : withPeople!.hashCode) + - (withStacked == null ? 0 : withStacked!.hashCode); + static const ApiState ratingState = .stable; - @override - String toString() => 'MetadataSearchDto[albumIds=$albumIds, checksum=$checksum, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, description=$description, encodedVideoPath=$encodedVideoPath, id=$id, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, ocr=$ocr, order=$order, originalFileName=$originalFileName, originalPath=$originalPath, page=$page, personIds=$personIds, previewPath=$previewPath, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, thumbnailPath=$thumbnailPath, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, visibility=$visibility, withDeleted=$withDeleted, withExif=$withExif, withPeople=$withPeople, withStacked=$withStacked]'; + static MetadataSearchDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumIds: json.containsKey(r'albumIds') + ? Optional.present(((json[r'albumIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + checksum: json.containsKey(r'checksum') ? Optional.present(json[r'checksum'] as String) : const Optional.absent(), + city: json.containsKey(r'city') ? Optional.present((json[r'city'] as String?)) : const Optional.absent(), + country: json.containsKey(r'country') ? Optional.present((json[r'country'] as String?)) : const Optional.absent(), + createdAfter: json.containsKey(r'createdAfter') + ? Optional.present(DateTime.parse(json[r'createdAfter'] as String)) + : const Optional.absent(), + createdBefore: json.containsKey(r'createdBefore') + ? Optional.present(DateTime.parse(json[r'createdBefore'] as String)) + : const Optional.absent(), + description: json.containsKey(r'description') + ? Optional.present(json[r'description'] as String) + : const Optional.absent(), + encodedVideoPath: json.containsKey(r'encodedVideoPath') + ? Optional.present(json[r'encodedVideoPath'] as String) + : const Optional.absent(), + id: json.containsKey(r'id') ? Optional.present(json[r'id'] as String) : const Optional.absent(), + isEncoded: json.containsKey(r'isEncoded') + ? Optional.present(json[r'isEncoded'] as bool) + : const Optional.absent(), + isFavorite: json.containsKey(r'isFavorite') + ? Optional.present(json[r'isFavorite'] as bool) + : const Optional.absent(), + isMotion: json.containsKey(r'isMotion') ? Optional.present(json[r'isMotion'] as bool) : const Optional.absent(), + isNotInAlbum: json.containsKey(r'isNotInAlbum') + ? Optional.present(json[r'isNotInAlbum'] as bool) + : const Optional.absent(), + isOffline: json.containsKey(r'isOffline') + ? Optional.present(json[r'isOffline'] as bool) + : const Optional.absent(), + lensModel: json.containsKey(r'lensModel') + ? Optional.present((json[r'lensModel'] as String?)) + : const Optional.absent(), + libraryId: json.containsKey(r'libraryId') + ? Optional.present((json[r'libraryId'] as String?)) + : const Optional.absent(), + make: json.containsKey(r'make') ? Optional.present((json[r'make'] as String?)) : const Optional.absent(), + model: json.containsKey(r'model') ? Optional.present((json[r'model'] as String?)) : const Optional.absent(), + ocr: json.containsKey(r'ocr') ? Optional.present(json[r'ocr'] as String) : const Optional.absent(), + order: json.containsKey(r'order') + ? Optional.present((AssetOrder.fromJson(json[r'order']))!) + : const Optional.absent(), + originalFileName: json.containsKey(r'originalFileName') + ? Optional.present(json[r'originalFileName'] as String) + : const Optional.absent(), + originalPath: json.containsKey(r'originalPath') + ? Optional.present(json[r'originalPath'] as String) + : const Optional.absent(), + page: json.containsKey(r'page') ? Optional.present(json[r'page'] as int) : const Optional.absent(), + personIds: json.containsKey(r'personIds') + ? Optional.present(((json[r'personIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + previewPath: json.containsKey(r'previewPath') + ? Optional.present(json[r'previewPath'] as String) + : const Optional.absent(), + rating: json.containsKey(r'rating') ? Optional.present((json[r'rating'] as int?)) : const Optional.absent(), + size: json.containsKey(r'size') ? Optional.present(json[r'size'] as int) : const Optional.absent(), + state: json.containsKey(r'state') ? Optional.present((json[r'state'] as String?)) : const Optional.absent(), + tagIds: json.containsKey(r'tagIds') + ? Optional.present((json[r'tagIds'] as List?)?.map(($e) => $e as String).toList(growable: false)) + : const Optional.absent(), + takenAfter: json.containsKey(r'takenAfter') + ? Optional.present(DateTime.parse(json[r'takenAfter'] as String)) + : const Optional.absent(), + takenBefore: json.containsKey(r'takenBefore') + ? Optional.present(DateTime.parse(json[r'takenBefore'] as String)) + : const Optional.absent(), + thumbnailPath: json.containsKey(r'thumbnailPath') + ? Optional.present(json[r'thumbnailPath'] as String) + : const Optional.absent(), + trashedAfter: json.containsKey(r'trashedAfter') + ? Optional.present(DateTime.parse(json[r'trashedAfter'] as String)) + : const Optional.absent(), + trashedBefore: json.containsKey(r'trashedBefore') + ? Optional.present(DateTime.parse(json[r'trashedBefore'] as String)) + : const Optional.absent(), + type: json.containsKey(r'type') + ? Optional.present((AssetTypeEnum.fromJson(json[r'type']))!) + : const Optional.absent(), + updatedAfter: json.containsKey(r'updatedAfter') + ? Optional.present(DateTime.parse(json[r'updatedAfter'] as String)) + : const Optional.absent(), + updatedBefore: json.containsKey(r'updatedBefore') + ? Optional.present(DateTime.parse(json[r'updatedBefore'] as String)) + : const Optional.absent(), + visibility: json.containsKey(r'visibility') + ? Optional.present((AssetVisibility.fromJson(json[r'visibility']))!) + : const Optional.absent(), + withDeleted: json.containsKey(r'withDeleted') + ? Optional.present(json[r'withDeleted'] as bool) + : const Optional.absent(), + withExif: json.containsKey(r'withExif') ? Optional.present(json[r'withExif'] as bool) : const Optional.absent(), + withPeople: json.containsKey(r'withPeople') + ? Optional.present(json[r'withPeople'] as bool) + : const Optional.absent(), + withStacked: json.containsKey(r'withStacked') + ? Optional.present(json[r'withStacked'] as bool) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'albumIds'] = this.albumIds; - if (this.checksum != null) { - json[r'checksum'] = this.checksum; - } else { - // json[r'checksum'] = null; + if (albumIds case Present(:final value)) { + json[r'albumIds'] = value; } - if (this.city != null) { - json[r'city'] = this.city; - } else { - // json[r'city'] = null; + if (checksum case Present(:final value)) { + json[r'checksum'] = value; } - if (this.country != null) { - json[r'country'] = this.country; - } else { - // json[r'country'] = null; + if (city case Present(:final value)) { + json[r'city'] = value; } - if (this.createdAfter != null) { - json[r'createdAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAfter!.millisecondsSinceEpoch - : this.createdAfter!.toUtc().toIso8601String(); - } else { - // json[r'createdAfter'] = null; + if (country case Present(:final value)) { + json[r'country'] = value; } - if (this.createdBefore != null) { - json[r'createdBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdBefore!.millisecondsSinceEpoch - : this.createdBefore!.toUtc().toIso8601String(); - } else { - // json[r'createdBefore'] = null; + if (createdAfter case Present(:final value)) { + json[r'createdAfter'] = value.toUtc().toIso8601String(); } - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (createdBefore case Present(:final value)) { + json[r'createdBefore'] = value.toUtc().toIso8601String(); } - if (this.encodedVideoPath != null) { - json[r'encodedVideoPath'] = this.encodedVideoPath; - } else { - // json[r'encodedVideoPath'] = null; + if (description case Present(:final value)) { + json[r'description'] = value; } - if (this.id != null) { - json[r'id'] = this.id; - } else { - // json[r'id'] = null; + if (encodedVideoPath case Present(:final value)) { + json[r'encodedVideoPath'] = value; } - if (this.isEncoded != null) { - json[r'isEncoded'] = this.isEncoded; - } else { - // json[r'isEncoded'] = null; + if (id case Present(:final value)) { + json[r'id'] = value; } - if (this.isFavorite != null) { - json[r'isFavorite'] = this.isFavorite; - } else { - // json[r'isFavorite'] = null; + if (isEncoded case Present(:final value)) { + json[r'isEncoded'] = value; } - if (this.isMotion != null) { - json[r'isMotion'] = this.isMotion; - } else { - // json[r'isMotion'] = null; + if (isFavorite case Present(:final value)) { + json[r'isFavorite'] = value; } - if (this.isNotInAlbum != null) { - json[r'isNotInAlbum'] = this.isNotInAlbum; - } else { - // json[r'isNotInAlbum'] = null; + if (isMotion case Present(:final value)) { + json[r'isMotion'] = value; } - if (this.isOffline != null) { - json[r'isOffline'] = this.isOffline; - } else { - // json[r'isOffline'] = null; + if (isNotInAlbum case Present(:final value)) { + json[r'isNotInAlbum'] = value; } - if (this.lensModel != null) { - json[r'lensModel'] = this.lensModel; - } else { - // json[r'lensModel'] = null; + if (isOffline case Present(:final value)) { + json[r'isOffline'] = value; } - if (this.libraryId != null) { - json[r'libraryId'] = this.libraryId; - } else { - // json[r'libraryId'] = null; + if (lensModel case Present(:final value)) { + json[r'lensModel'] = value; } - if (this.make != null) { - json[r'make'] = this.make; - } else { - // json[r'make'] = null; + if (libraryId case Present(:final value)) { + json[r'libraryId'] = value; } - if (this.model != null) { - json[r'model'] = this.model; - } else { - // json[r'model'] = null; + if (make case Present(:final value)) { + json[r'make'] = value; } - if (this.ocr != null) { - json[r'ocr'] = this.ocr; - } else { - // json[r'ocr'] = null; + if (model case Present(:final value)) { + json[r'model'] = value; } - if (this.order != null) { - json[r'order'] = this.order; - } else { - // json[r'order'] = null; + if (ocr case Present(:final value)) { + json[r'ocr'] = value; } - if (this.originalFileName != null) { - json[r'originalFileName'] = this.originalFileName; - } else { - // json[r'originalFileName'] = null; + if (order case Present(:final value)) { + json[r'order'] = value.toJson(); } - if (this.originalPath != null) { - json[r'originalPath'] = this.originalPath; - } else { - // json[r'originalPath'] = null; + if (originalFileName case Present(:final value)) { + json[r'originalFileName'] = value; } - if (this.page != null) { - json[r'page'] = this.page; - } else { - // json[r'page'] = null; + if (originalPath case Present(:final value)) { + json[r'originalPath'] = value; } - json[r'personIds'] = this.personIds; - if (this.previewPath != null) { - json[r'previewPath'] = this.previewPath; - } else { - // json[r'previewPath'] = null; + if (page case Present(:final value)) { + json[r'page'] = value; } - if (this.rating != null) { - json[r'rating'] = this.rating; - } else { - // json[r'rating'] = null; + if (personIds case Present(:final value)) { + json[r'personIds'] = value; } - if (this.size != null) { - json[r'size'] = this.size; - } else { - // json[r'size'] = null; + if (previewPath case Present(:final value)) { + json[r'previewPath'] = value; } - if (this.state != null) { - json[r'state'] = this.state; - } else { - // json[r'state'] = null; + if (rating case Present(:final value)) { + json[r'rating'] = value; } - if (this.tagIds != null) { - json[r'tagIds'] = this.tagIds; - } else { - // json[r'tagIds'] = null; + if (size case Present(:final value)) { + json[r'size'] = value; } - if (this.takenAfter != null) { - json[r'takenAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.takenAfter!.millisecondsSinceEpoch - : this.takenAfter!.toUtc().toIso8601String(); - } else { - // json[r'takenAfter'] = null; + if (state case Present(:final value)) { + json[r'state'] = value; } - if (this.takenBefore != null) { - json[r'takenBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.takenBefore!.millisecondsSinceEpoch - : this.takenBefore!.toUtc().toIso8601String(); - } else { - // json[r'takenBefore'] = null; + if (tagIds case Present(:final value)) { + json[r'tagIds'] = value; } - if (this.thumbnailPath != null) { - json[r'thumbnailPath'] = this.thumbnailPath; - } else { - // json[r'thumbnailPath'] = null; + if (takenAfter case Present(:final value)) { + json[r'takenAfter'] = value.toUtc().toIso8601String(); } - if (this.trashedAfter != null) { - json[r'trashedAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.trashedAfter!.millisecondsSinceEpoch - : this.trashedAfter!.toUtc().toIso8601String(); - } else { - // json[r'trashedAfter'] = null; + if (takenBefore case Present(:final value)) { + json[r'takenBefore'] = value.toUtc().toIso8601String(); } - if (this.trashedBefore != null) { - json[r'trashedBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.trashedBefore!.millisecondsSinceEpoch - : this.trashedBefore!.toUtc().toIso8601String(); - } else { - // json[r'trashedBefore'] = null; + if (thumbnailPath case Present(:final value)) { + json[r'thumbnailPath'] = value; } - if (this.type != null) { - json[r'type'] = this.type; - } else { - // json[r'type'] = null; + if (trashedAfter case Present(:final value)) { + json[r'trashedAfter'] = value.toUtc().toIso8601String(); } - if (this.updatedAfter != null) { - json[r'updatedAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAfter!.millisecondsSinceEpoch - : this.updatedAfter!.toUtc().toIso8601String(); - } else { - // json[r'updatedAfter'] = null; + if (trashedBefore case Present(:final value)) { + json[r'trashedBefore'] = value.toUtc().toIso8601String(); } - if (this.updatedBefore != null) { - json[r'updatedBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedBefore!.millisecondsSinceEpoch - : this.updatedBefore!.toUtc().toIso8601String(); - } else { - // json[r'updatedBefore'] = null; + if (type case Present(:final value)) { + json[r'type'] = value.toJson(); } - if (this.visibility != null) { - json[r'visibility'] = this.visibility; - } else { - // json[r'visibility'] = null; + if (updatedAfter case Present(:final value)) { + json[r'updatedAfter'] = value.toUtc().toIso8601String(); } - if (this.withDeleted != null) { - json[r'withDeleted'] = this.withDeleted; - } else { - // json[r'withDeleted'] = null; + if (updatedBefore case Present(:final value)) { + json[r'updatedBefore'] = value.toUtc().toIso8601String(); } - if (this.withExif != null) { - json[r'withExif'] = this.withExif; - } else { - // json[r'withExif'] = null; + if (visibility case Present(:final value)) { + json[r'visibility'] = value.toJson(); } - if (this.withPeople != null) { - json[r'withPeople'] = this.withPeople; - } else { - // json[r'withPeople'] = null; + if (withDeleted case Present(:final value)) { + json[r'withDeleted'] = value; } - if (this.withStacked != null) { - json[r'withStacked'] = this.withStacked; - } else { - // json[r'withStacked'] = null; + if (withExif case Present(:final value)) { + json[r'withExif'] = value; + } + if (withPeople case Present(:final value)) { + json[r'withPeople'] = value; + } + if (withStacked case Present(:final value)) { + json[r'withStacked'] = value; } return json; } - /// Returns a new [MetadataSearchDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MetadataSearchDto? fromJson(dynamic value) { - upgradeDto(value, "MetadataSearchDto"); - if (value is Map) { - final json = value.cast(); - - return MetadataSearchDto( - albumIds: json[r'albumIds'] is Iterable - ? (json[r'albumIds'] as Iterable).cast().toList(growable: false) - : const [], - checksum: mapValueOfType(json, r'checksum'), - city: mapValueOfType(json, r'city'), - country: mapValueOfType(json, r'country'), - createdAfter: mapDateTime(json, r'createdAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - createdBefore: mapDateTime(json, r'createdBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - description: mapValueOfType(json, r'description'), - encodedVideoPath: mapValueOfType(json, r'encodedVideoPath'), - id: mapValueOfType(json, r'id'), - isEncoded: mapValueOfType(json, r'isEncoded'), - isFavorite: mapValueOfType(json, r'isFavorite'), - isMotion: mapValueOfType(json, r'isMotion'), - isNotInAlbum: mapValueOfType(json, r'isNotInAlbum'), - isOffline: mapValueOfType(json, r'isOffline'), - lensModel: mapValueOfType(json, r'lensModel'), - libraryId: mapValueOfType(json, r'libraryId'), - make: mapValueOfType(json, r'make'), - model: mapValueOfType(json, r'model'), - ocr: mapValueOfType(json, r'ocr'), - order: AssetOrder.fromJson(json[r'order']), - originalFileName: mapValueOfType(json, r'originalFileName'), - originalPath: mapValueOfType(json, r'originalPath'), - page: mapValueOfType(json, r'page'), - personIds: json[r'personIds'] is Iterable - ? (json[r'personIds'] as Iterable).cast().toList(growable: false) - : const [], - previewPath: mapValueOfType(json, r'previewPath'), - rating: mapValueOfType(json, r'rating'), - size: mapValueOfType(json, r'size'), - state: mapValueOfType(json, r'state'), - tagIds: json[r'tagIds'] is Iterable - ? (json[r'tagIds'] as Iterable).cast().toList(growable: false) - : const [], - takenAfter: mapDateTime(json, r'takenAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - takenBefore: mapDateTime(json, r'takenBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - thumbnailPath: mapValueOfType(json, r'thumbnailPath'), - trashedAfter: mapDateTime(json, r'trashedAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - trashedBefore: mapDateTime(json, r'trashedBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - type: AssetTypeEnum.fromJson(json[r'type']), - updatedAfter: mapDateTime(json, r'updatedAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - updatedBefore: mapDateTime(json, r'updatedBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - visibility: AssetVisibility.fromJson(json[r'visibility']), - withDeleted: mapValueOfType(json, r'withDeleted'), - withExif: mapValueOfType(json, r'withExif'), - withPeople: mapValueOfType(json, r'withPeople'), - withStacked: mapValueOfType(json, r'withStacked'), - ); - } - return null; + MetadataSearchDto copyWith({ + Optional>? albumIds, + Optional? checksum, + Optional? city, + Optional? country, + Optional? createdAfter, + Optional? createdBefore, + Optional? description, + Optional? encodedVideoPath, + Optional? id, + Optional? isEncoded, + Optional? isFavorite, + Optional? isMotion, + Optional? isNotInAlbum, + Optional? isOffline, + Optional? lensModel, + Optional? libraryId, + Optional? make, + Optional? model, + Optional? ocr, + Optional? order, + Optional? originalFileName, + Optional? originalPath, + Optional? page, + Optional>? personIds, + Optional? previewPath, + Optional? rating, + Optional? size, + Optional? state, + Optional?>? tagIds, + Optional? takenAfter, + Optional? takenBefore, + Optional? thumbnailPath, + Optional? trashedAfter, + Optional? trashedBefore, + Optional? type, + Optional? updatedAfter, + Optional? updatedBefore, + Optional? visibility, + Optional? withDeleted, + Optional? withExif, + Optional? withPeople, + Optional? withStacked, + }) { + return .new( + albumIds: albumIds ?? this.albumIds, + checksum: checksum ?? this.checksum, + city: city ?? this.city, + country: country ?? this.country, + createdAfter: createdAfter ?? this.createdAfter, + createdBefore: createdBefore ?? this.createdBefore, + description: description ?? this.description, + encodedVideoPath: encodedVideoPath ?? this.encodedVideoPath, + id: id ?? this.id, + isEncoded: isEncoded ?? this.isEncoded, + isFavorite: isFavorite ?? this.isFavorite, + isMotion: isMotion ?? this.isMotion, + isNotInAlbum: isNotInAlbum ?? this.isNotInAlbum, + isOffline: isOffline ?? this.isOffline, + lensModel: lensModel ?? this.lensModel, + libraryId: libraryId ?? this.libraryId, + make: make ?? this.make, + model: model ?? this.model, + ocr: ocr ?? this.ocr, + order: order ?? this.order, + originalFileName: originalFileName ?? this.originalFileName, + originalPath: originalPath ?? this.originalPath, + page: page ?? this.page, + personIds: personIds ?? this.personIds, + previewPath: previewPath ?? this.previewPath, + rating: rating ?? this.rating, + size: size ?? this.size, + state: state ?? this.state, + tagIds: tagIds ?? this.tagIds, + takenAfter: takenAfter ?? this.takenAfter, + takenBefore: takenBefore ?? this.takenBefore, + thumbnailPath: thumbnailPath ?? this.thumbnailPath, + trashedAfter: trashedAfter ?? this.trashedAfter, + trashedBefore: trashedBefore ?? this.trashedBefore, + type: type ?? this.type, + updatedAfter: updatedAfter ?? this.updatedAfter, + updatedBefore: updatedBefore ?? this.updatedBefore, + visibility: visibility ?? this.visibility, + withDeleted: withDeleted ?? this.withDeleted, + withExif: withExif ?? this.withExif, + withPeople: withPeople ?? this.withPeople, + withStacked: withStacked ?? this.withStacked, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MetadataSearchDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is MetadataSearchDto && + albumIds == other.albumIds && + checksum == other.checksum && + city == other.city && + country == other.country && + createdAfter == other.createdAfter && + createdBefore == other.createdBefore && + description == other.description && + encodedVideoPath == other.encodedVideoPath && + id == other.id && + isEncoded == other.isEncoded && + isFavorite == other.isFavorite && + isMotion == other.isMotion && + isNotInAlbum == other.isNotInAlbum && + isOffline == other.isOffline && + lensModel == other.lensModel && + libraryId == other.libraryId && + make == other.make && + model == other.model && + ocr == other.ocr && + order == other.order && + originalFileName == other.originalFileName && + originalPath == other.originalPath && + page == other.page && + personIds == other.personIds && + previewPath == other.previewPath && + rating == other.rating && + size == other.size && + state == other.state && + tagIds == other.tagIds && + takenAfter == other.takenAfter && + takenBefore == other.takenBefore && + thumbnailPath == other.thumbnailPath && + trashedAfter == other.trashedAfter && + trashedBefore == other.trashedBefore && + type == other.type && + updatedAfter == other.updatedAfter && + updatedBefore == other.updatedBefore && + visibility == other.visibility && + withDeleted == other.withDeleted && + withExif == other.withExif && + withPeople == other.withPeople && + withStacked == other.withStacked); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MetadataSearchDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + albumIds, + checksum, + city, + country, + createdAfter, + createdBefore, + description, + encodedVideoPath, + id, + isEncoded, + isFavorite, + isMotion, + isNotInAlbum, + isOffline, + lensModel, + libraryId, + make, + model, + ocr, + order, + originalFileName, + originalPath, + page, + personIds, + previewPath, + rating, + size, + state, + tagIds, + takenAfter, + takenBefore, + thumbnailPath, + trashedAfter, + trashedBefore, + type, + updatedAfter, + updatedBefore, + visibility, + withDeleted, + withExif, + withPeople, + withStacked, + ]); } - // maps a json object with a list of MetadataSearchDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MetadataSearchDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'MetadataSearchDto(albumIds=$albumIds, checksum=$checksum, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, description=$description, encodedVideoPath=$encodedVideoPath, id=$id, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, ocr=$ocr, order=$order, originalFileName=$originalFileName, originalPath=$originalPath, page=$page, personIds=$personIds, previewPath=$previewPath, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, thumbnailPath=$thumbnailPath, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, visibility=$visibility, withDeleted=$withDeleted, withExif=$withExif, withPeople=$withPeople, withStacked=$withStacked)'; } - diff --git a/mobile/openapi/lib/model/mirror_axis.dart b/mobile/openapi/lib/model/mirror_axis.dart index 4deeeb047c..570ec19cb9 100644 --- a/mobile/openapi/lib/model/mirror_axis.dart +++ b/mobile/openapi/lib/model/mirror_axis.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Axis to mirror along -class MirrorAxis { - /// Instantiate a new enum with the provided [value]. +enum MirrorAxis { + horizontal._(r'horizontal'), + vertical._(r'vertical'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const MirrorAxis._(this.value); - /// The underlying value of this enum member. final String value; + static MirrorAxis? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const horizontal = MirrorAxis._(r'horizontal'); - static const vertical = MirrorAxis._(r'vertical'); - - /// List of all possible values in this [enum][MirrorAxis]. - static const values = [ - horizontal, - vertical, - ]; - - static MirrorAxis? fromJson(dynamic value) => MirrorAxisTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MirrorAxis.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [MirrorAxis] to String, -/// and [decode] dynamic data back to [MirrorAxis]. -class MirrorAxisTypeTransformer { - factory MirrorAxisTypeTransformer() => _instance ??= const MirrorAxisTypeTransformer._(); - - const MirrorAxisTypeTransformer._(); - - String encode(MirrorAxis data) => data.value; - - /// Decodes a [dynamic value][data] to a MirrorAxis. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - MirrorAxis? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'horizontal': return MirrorAxis.horizontal; - case r'vertical': return MirrorAxis.vertical; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [MirrorAxisTypeTransformer] instance. - static MirrorAxisTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/mirror_parameters.dart b/mobile/openapi/lib/model/mirror_parameters.dart index 78c3da786c..0251317d86 100644 --- a/mobile/openapi/lib/model/mirror_parameters.dart +++ b/mobile/openapi/lib/model/mirror_parameters.dart @@ -1,99 +1,39 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class MirrorParameters { - /// Returns a new [MirrorParameters] instance. - MirrorParameters({ - required this.axis, - }); +final class MirrorParameters { + const MirrorParameters({required this.axis}); - MirrorAxis axis; + final MirrorAxis axis; - @override - bool operator ==(Object other) => identical(this, other) || other is MirrorParameters && - other.axis == axis; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (axis.hashCode); - - @override - String toString() => 'MirrorParameters[axis=$axis]'; + static MirrorParameters? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(axis: (MirrorAxis.fromJson(json[r'axis']))!); + } Map toJson() { final json = {}; - json[r'axis'] = this.axis; + json[r'axis'] = axis.toJson(); return json; } - /// Returns a new [MirrorParameters] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static MirrorParameters? fromJson(dynamic value) { - upgradeDto(value, "MirrorParameters"); - if (value is Map) { - final json = value.cast(); - - return MirrorParameters( - axis: MirrorAxis.fromJson(json[r'axis'])!, - ); - } - return null; + MirrorParameters copyWith({MirrorAxis? axis}) { + return .new(axis: axis ?? this.axis); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = MirrorParameters.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is MirrorParameters && axis == other.axis); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = MirrorParameters.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([axis]); } - // maps a json object with a list of MirrorParameters-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = MirrorParameters.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'axis', - }; + @override + String toString() => 'MirrorParameters(axis=$axis)'; } - diff --git a/mobile/openapi/lib/model/notification_create_dto.dart b/mobile/openapi/lib/model/notification_create_dto.dart index f9771246f9..df9dc414c6 100644 --- a/mobile/openapi/lib/model/notification_create_dto.dart +++ b/mobile/openapi/lib/model/notification_create_dto.dart @@ -1,177 +1,123 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class NotificationCreateDto { - /// Returns a new [NotificationCreateDto] instance. - NotificationCreateDto({ - this.data = const {}, - this.description, - this.level, - this.readAt, +final class NotificationCreateDto { + const NotificationCreateDto({ + this.data = const Optional.absent(), + this.description = const Optional.absent(), + this.level = const Optional.absent(), + this.readAt = const Optional.absent(), required this.title, - this.type, + this.type = const Optional.absent(), required this.userId, }); /// Additional notification data - Map data; + final Optional> data; /// Notification description - String? description; + final Optional description; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - NotificationLevel? level; + final Optional level; /// Date when notification was read - DateTime? readAt; + final Optional readAt; /// Notification title - String title; + final String title; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - NotificationType? type; + final Optional type; /// User ID to send notification to - String userId; + final String userId; - @override - bool operator ==(Object other) => identical(this, other) || other is NotificationCreateDto && - _deepEquality.equals(other.data, data) && - other.description == description && - other.level == level && - other.readAt == readAt && - other.title == title && - other.type == type && - other.userId == userId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (data.hashCode) + - (description == null ? 0 : description!.hashCode) + - (level == null ? 0 : level!.hashCode) + - (readAt == null ? 0 : readAt!.hashCode) + - (title.hashCode) + - (type == null ? 0 : type!.hashCode) + - (userId.hashCode); - - @override - String toString() => 'NotificationCreateDto[data=$data, description=$description, level=$level, readAt=$readAt, title=$title, type=$type, userId=$userId]'; + static NotificationCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + data: json.containsKey(r'data') + ? Optional.present(((json[r'data'] as Map?)?.cast())!) + : const Optional.absent(), + description: json.containsKey(r'description') + ? Optional.present((json[r'description'] as String?)) + : const Optional.absent(), + level: json.containsKey(r'level') + ? Optional.present((NotificationLevel.fromJson(json[r'level']))!) + : const Optional.absent(), + readAt: json.containsKey(r'readAt') + ? Optional.present((json[r'readAt'] == null ? null : DateTime.parse(json[r'readAt'] as String))) + : const Optional.absent(), + title: json[r'title'] as String, + type: json.containsKey(r'type') + ? Optional.present((NotificationType.fromJson(json[r'type']))!) + : const Optional.absent(), + userId: json[r'userId'] as String, + ); + } Map toJson() { final json = {}; - json[r'data'] = this.data; - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (data case Present(:final value)) { + json[r'data'] = value; } - if (this.level != null) { - json[r'level'] = this.level; - } else { - // json[r'level'] = null; + if (description case Present(:final value)) { + json[r'description'] = value; } - if (this.readAt != null) { - json[r'readAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.readAt!.millisecondsSinceEpoch - : this.readAt!.toUtc().toIso8601String(); - } else { - // json[r'readAt'] = null; + if (level case Present(:final value)) { + json[r'level'] = value.toJson(); } - json[r'title'] = this.title; - if (this.type != null) { - json[r'type'] = this.type; - } else { - // json[r'type'] = null; + if (readAt case Present(:final value)) { + json[r'readAt'] = value?.toUtc().toIso8601String(); } - json[r'userId'] = this.userId; + json[r'title'] = title; + if (type case Present(:final value)) { + json[r'type'] = value.toJson(); + } + json[r'userId'] = userId; return json; } - /// Returns a new [NotificationCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static NotificationCreateDto? fromJson(dynamic value) { - upgradeDto(value, "NotificationCreateDto"); - if (value is Map) { - final json = value.cast(); - - return NotificationCreateDto( - data: mapCastOfType(json, r'data') ?? const {}, - description: mapValueOfType(json, r'description'), - level: NotificationLevel.fromJson(json[r'level']), - readAt: mapDateTime(json, r'readAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - title: mapValueOfType(json, r'title')!, - type: NotificationType.fromJson(json[r'type']), - userId: mapValueOfType(json, r'userId')!, - ); - } - return null; + NotificationCreateDto copyWith({ + Optional>? data, + Optional? description, + Optional? level, + Optional? readAt, + String? title, + Optional? type, + String? userId, + }) { + return .new( + data: data ?? this.data, + description: description ?? this.description, + level: level ?? this.level, + readAt: readAt ?? this.readAt, + title: title ?? this.title, + type: type ?? this.type, + userId: userId ?? this.userId, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = NotificationCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is NotificationCreateDto && + data == other.data && + description == other.description && + level == other.level && + readAt == other.readAt && + title == other.title && + type == other.type && + userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = NotificationCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([data, description, level, readAt, title, type, userId]); } - // maps a json object with a list of NotificationCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = NotificationCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'title', - 'userId', - }; + @override + String toString() => + 'NotificationCreateDto(data=$data, description=$description, level=$level, readAt=$readAt, title=$title, type=$type, userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/notification_delete_all_dto.dart b/mobile/openapi/lib/model/notification_delete_all_dto.dart index 1b398a4f33..1fa97a7c8e 100644 --- a/mobile/openapi/lib/model/notification_delete_all_dto.dart +++ b/mobile/openapi/lib/model/notification_delete_all_dto.dart @@ -1,102 +1,41 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class NotificationDeleteAllDto { - /// Returns a new [NotificationDeleteAllDto] instance. - NotificationDeleteAllDto({ - this.ids = const [], - }); +final class NotificationDeleteAllDto { + const NotificationDeleteAllDto({required this.ids}); /// Notification IDs to delete - List ids; + final List ids; - @override - bool operator ==(Object other) => identical(this, other) || other is NotificationDeleteAllDto && - _deepEquality.equals(other.ids, ids); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (ids.hashCode); - - @override - String toString() => 'NotificationDeleteAllDto[ids=$ids]'; + static NotificationDeleteAllDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(ids: ((json[r'ids'] as List?)?.map(($e) => $e as String).toList(growable: false))!); + } Map toJson() { final json = {}; - json[r'ids'] = this.ids; + json[r'ids'] = ids; return json; } - /// Returns a new [NotificationDeleteAllDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static NotificationDeleteAllDto? fromJson(dynamic value) { - upgradeDto(value, "NotificationDeleteAllDto"); - if (value is Map) { - final json = value.cast(); - - return NotificationDeleteAllDto( - ids: json[r'ids'] is Iterable - ? (json[r'ids'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + NotificationDeleteAllDto copyWith({List? ids}) { + return .new(ids: ids ?? this.ids); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = NotificationDeleteAllDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is NotificationDeleteAllDto && const DeepCollectionEquality().equals(ids, other.ids)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = NotificationDeleteAllDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(ids)]); } - // maps a json object with a list of NotificationDeleteAllDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = NotificationDeleteAllDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'ids', - }; + @override + String toString() => 'NotificationDeleteAllDto(ids=$ids)'; } - diff --git a/mobile/openapi/lib/model/notification_dto.dart b/mobile/openapi/lib/model/notification_dto.dart index ad0e79cb27..f97bca48d4 100644 --- a/mobile/openapi/lib/model/notification_dto.dart +++ b/mobile/openapi/lib/model/notification_dto.dart @@ -1,20 +1,11 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class NotificationDto { - /// Returns a new [NotificationDto] instance. - NotificationDto({ +final class NotificationDto { + const NotificationDto({ required this.createdAt, - this.data = const {}, + this.data, this.description, required this.id, required this.level, @@ -24,159 +15,115 @@ class NotificationDto { }); /// Creation date - DateTime createdAt; + final DateTime createdAt; /// Additional notification data - Map data; + final Map? data; /// Notification description - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? description; + final String? description; /// Notification ID - String id; + final String id; - NotificationLevel level; + final NotificationLevel level; /// Date when notification was read - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? readAt; + final DateTime? readAt; /// Notification title - String title; + final String title; - NotificationType type; + final NotificationType type; - @override - bool operator ==(Object other) => identical(this, other) || other is NotificationDto && - other.createdAt == createdAt && - _deepEquality.equals(other.data, data) && - other.description == description && - other.id == id && - other.level == level && - other.readAt == readAt && - other.title == title && - other.type == type; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (createdAt.hashCode) + - (data.hashCode) + - (description == null ? 0 : description!.hashCode) + - (id.hashCode) + - (level.hashCode) + - (readAt == null ? 0 : readAt!.hashCode) + - (title.hashCode) + - (type.hashCode); - - @override - String toString() => 'NotificationDto[createdAt=$createdAt, data=$data, description=$description, id=$id, level=$level, readAt=$readAt, title=$title, type=$type]'; + static NotificationDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + createdAt: DateTime.parse(json[r'createdAt'] as String), + data: (json[r'data'] as Map?)?.cast(), + description: (json[r'description'] as String?), + id: json[r'id'] as String, + level: (NotificationLevel.fromJson(json[r'level']))!, + readAt: (json[r'readAt'] == null ? null : DateTime.parse(json[r'readAt'] as String)), + title: json[r'title'] as String, + type: (NotificationType.fromJson(json[r'type']))!, + ); + } Map toJson() { final json = {}; - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - json[r'data'] = this.data; - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + if (data != null) { + json[r'data'] = data!; } - json[r'id'] = this.id; - json[r'level'] = this.level; - if (this.readAt != null) { - json[r'readAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.readAt!.millisecondsSinceEpoch - : this.readAt!.toUtc().toIso8601String(); - } else { - // json[r'readAt'] = null; + if (description != null) { + json[r'description'] = description!; } - json[r'title'] = this.title; - json[r'type'] = this.type; + json[r'id'] = id; + json[r'level'] = level.toJson(); + if (readAt != null) { + json[r'readAt'] = readAt!.toUtc().toIso8601String(); + } + json[r'title'] = title; + json[r'type'] = type.toJson(); return json; } - /// Returns a new [NotificationDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static NotificationDto? fromJson(dynamic value) { - upgradeDto(value, "NotificationDto"); - if (value is Map) { - final json = value.cast(); - - return NotificationDto( - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - data: mapCastOfType(json, r'data') ?? const {}, - description: mapValueOfType(json, r'description'), - id: mapValueOfType(json, r'id')!, - level: NotificationLevel.fromJson(json[r'level'])!, - readAt: mapDateTime(json, r'readAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - title: mapValueOfType(json, r'title')!, - type: NotificationType.fromJson(json[r'type'])!, - ); - } - return null; + NotificationDto copyWith({ + DateTime? createdAt, + Object? data = _undefined, + Object? description = _undefined, + String? id, + NotificationLevel? level, + Object? readAt = _undefined, + String? title, + NotificationType? type, + }) { + return .new( + createdAt: createdAt ?? this.createdAt, + data: identical(data, _undefined) ? this.data : data as Map?, + description: identical(description, _undefined) ? this.description : description as String?, + id: id ?? this.id, + level: level ?? this.level, + readAt: identical(readAt, _undefined) ? this.readAt : readAt as DateTime?, + title: title ?? this.title, + type: type ?? this.type, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = NotificationDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is NotificationDto && + createdAt == other.createdAt && + const DeepCollectionEquality().equals(data, other.data) && + description == other.description && + id == other.id && + level == other.level && + readAt == other.readAt && + title == other.title && + type == other.type); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = NotificationDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + createdAt, + const DeepCollectionEquality().hash(data), + description, + id, + level, + readAt, + title, + type, + ]); } - // maps a json object with a list of NotificationDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = NotificationDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'createdAt', - 'id', - 'level', - 'title', - 'type', - }; + @override + String toString() => + 'NotificationDto(createdAt=$createdAt, data=$data, description=$description, id=$id, level=$level, readAt=$readAt, title=$title, type=$type)'; } - diff --git a/mobile/openapi/lib/model/notification_level.dart b/mobile/openapi/lib/model/notification_level.dart index 4ca4e2bcc8..43df0cc180 100644 --- a/mobile/openapi/lib/model/notification_level.dart +++ b/mobile/openapi/lib/model/notification_level.dart @@ -1,91 +1,30 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Notification level -class NotificationLevel { - /// Instantiate a new enum with the provided [value]. +enum NotificationLevel { + success._(r'success'), + error._(r'error'), + warning._(r'warning'), + info._(r'info'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const NotificationLevel._(this.value); - /// The underlying value of this enum member. final String value; + static NotificationLevel? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const success = NotificationLevel._(r'success'); - static const error = NotificationLevel._(r'error'); - static const warning = NotificationLevel._(r'warning'); - static const info = NotificationLevel._(r'info'); - - /// List of all possible values in this [enum][NotificationLevel]. - static const values = [ - success, - error, - warning, - info, - ]; - - static NotificationLevel? fromJson(dynamic value) => NotificationLevelTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = NotificationLevel.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [NotificationLevel] to String, -/// and [decode] dynamic data back to [NotificationLevel]. -class NotificationLevelTypeTransformer { - factory NotificationLevelTypeTransformer() => _instance ??= const NotificationLevelTypeTransformer._(); - - const NotificationLevelTypeTransformer._(); - - String encode(NotificationLevel data) => data.value; - - /// Decodes a [dynamic value][data] to a NotificationLevel. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - NotificationLevel? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'success': return NotificationLevel.success; - case r'error': return NotificationLevel.error; - case r'warning': return NotificationLevel.warning; - case r'info': return NotificationLevel.info; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [NotificationLevelTypeTransformer] instance. - static NotificationLevelTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/notification_type.dart b/mobile/openapi/lib/model/notification_type.dart index dbc9c12f84..b5737be8ae 100644 --- a/mobile/openapi/lib/model/notification_type.dart +++ b/mobile/openapi/lib/model/notification_type.dart @@ -1,97 +1,32 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Notification type -class NotificationType { - /// Instantiate a new enum with the provided [value]. +enum NotificationType { + jobFailed._(r'JobFailed'), + backupFailed._(r'BackupFailed'), + systemMessage._(r'SystemMessage'), + albumInvite._(r'AlbumInvite'), + albumUpdate._(r'AlbumUpdate'), + custom._(r'Custom'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const NotificationType._(this.value); - /// The underlying value of this enum member. final String value; + static NotificationType? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const jobFailed = NotificationType._(r'JobFailed'); - static const backupFailed = NotificationType._(r'BackupFailed'); - static const systemMessage = NotificationType._(r'SystemMessage'); - static const albumInvite = NotificationType._(r'AlbumInvite'); - static const albumUpdate = NotificationType._(r'AlbumUpdate'); - static const custom = NotificationType._(r'Custom'); - - /// List of all possible values in this [enum][NotificationType]. - static const values = [ - jobFailed, - backupFailed, - systemMessage, - albumInvite, - albumUpdate, - custom, - ]; - - static NotificationType? fromJson(dynamic value) => NotificationTypeTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = NotificationType.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [NotificationType] to String, -/// and [decode] dynamic data back to [NotificationType]. -class NotificationTypeTypeTransformer { - factory NotificationTypeTypeTransformer() => _instance ??= const NotificationTypeTypeTransformer._(); - - const NotificationTypeTypeTransformer._(); - - String encode(NotificationType data) => data.value; - - /// Decodes a [dynamic value][data] to a NotificationType. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - NotificationType? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'JobFailed': return NotificationType.jobFailed; - case r'BackupFailed': return NotificationType.backupFailed; - case r'SystemMessage': return NotificationType.systemMessage; - case r'AlbumInvite': return NotificationType.albumInvite; - case r'AlbumUpdate': return NotificationType.albumUpdate; - case r'Custom': return NotificationType.custom; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [NotificationTypeTypeTransformer] instance. - static NotificationTypeTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/notification_update_all_dto.dart b/mobile/openapi/lib/model/notification_update_all_dto.dart index 5ac61ededc..1caa1fbfd5 100644 --- a/mobile/openapi/lib/model/notification_update_all_dto.dart +++ b/mobile/openapi/lib/model/notification_update_all_dto.dart @@ -1,116 +1,54 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class NotificationUpdateAllDto { - /// Returns a new [NotificationUpdateAllDto] instance. - NotificationUpdateAllDto({ - this.ids = const [], - this.readAt, - }); +final class NotificationUpdateAllDto { + const NotificationUpdateAllDto({required this.ids, this.readAt = const Optional.absent()}); /// Notification IDs to update - List ids; + final List ids; /// Date when notifications were read - DateTime? readAt; + final Optional readAt; - @override - bool operator ==(Object other) => identical(this, other) || other is NotificationUpdateAllDto && - _deepEquality.equals(other.ids, ids) && - other.readAt == readAt; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (ids.hashCode) + - (readAt == null ? 0 : readAt!.hashCode); - - @override - String toString() => 'NotificationUpdateAllDto[ids=$ids, readAt=$readAt]'; + static NotificationUpdateAllDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + ids: ((json[r'ids'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + readAt: json.containsKey(r'readAt') + ? Optional.present((json[r'readAt'] == null ? null : DateTime.parse(json[r'readAt'] as String))) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'ids'] = this.ids; - if (this.readAt != null) { - json[r'readAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.readAt!.millisecondsSinceEpoch - : this.readAt!.toUtc().toIso8601String(); - } else { - // json[r'readAt'] = null; + json[r'ids'] = ids; + if (readAt case Present(:final value)) { + json[r'readAt'] = value?.toUtc().toIso8601String(); } return json; } - /// Returns a new [NotificationUpdateAllDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static NotificationUpdateAllDto? fromJson(dynamic value) { - upgradeDto(value, "NotificationUpdateAllDto"); - if (value is Map) { - final json = value.cast(); - - return NotificationUpdateAllDto( - ids: json[r'ids'] is Iterable - ? (json[r'ids'] as Iterable).cast().toList(growable: false) - : const [], - readAt: mapDateTime(json, r'readAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - ); - } - return null; + NotificationUpdateAllDto copyWith({List? ids, Optional? readAt}) { + return .new(ids: ids ?? this.ids, readAt: readAt ?? this.readAt); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = NotificationUpdateAllDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is NotificationUpdateAllDto && + const DeepCollectionEquality().equals(ids, other.ids) && + readAt == other.readAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = NotificationUpdateAllDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(ids), readAt]); } - // maps a json object with a list of NotificationUpdateAllDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = NotificationUpdateAllDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'ids', - }; + @override + String toString() => 'NotificationUpdateAllDto(ids=$ids, readAt=$readAt)'; } - diff --git a/mobile/openapi/lib/model/notification_update_dto.dart b/mobile/openapi/lib/model/notification_update_dto.dart index c5d949d7b2..9842b1a2e1 100644 --- a/mobile/openapi/lib/model/notification_update_dto.dart +++ b/mobile/openapi/lib/model/notification_update_dto.dart @@ -1,105 +1,46 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class NotificationUpdateDto { - /// Returns a new [NotificationUpdateDto] instance. - NotificationUpdateDto({ - this.readAt, - }); +final class NotificationUpdateDto { + const NotificationUpdateDto({this.readAt = const Optional.absent()}); /// Date when notification was read - DateTime? readAt; + final Optional readAt; - @override - bool operator ==(Object other) => identical(this, other) || other is NotificationUpdateDto && - other.readAt == readAt; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (readAt == null ? 0 : readAt!.hashCode); - - @override - String toString() => 'NotificationUpdateDto[readAt=$readAt]'; + static NotificationUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + readAt: json.containsKey(r'readAt') + ? Optional.present((json[r'readAt'] == null ? null : DateTime.parse(json[r'readAt'] as String))) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.readAt != null) { - json[r'readAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.readAt!.millisecondsSinceEpoch - : this.readAt!.toUtc().toIso8601String(); - } else { - // json[r'readAt'] = null; + if (readAt case Present(:final value)) { + json[r'readAt'] = value?.toUtc().toIso8601String(); } return json; } - /// Returns a new [NotificationUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static NotificationUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "NotificationUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return NotificationUpdateDto( - readAt: mapDateTime(json, r'readAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - ); - } - return null; + NotificationUpdateDto copyWith({Optional? readAt}) { + return .new(readAt: readAt ?? this.readAt); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = NotificationUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is NotificationUpdateDto && readAt == other.readAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = NotificationUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([readAt]); } - // maps a json object with a list of NotificationUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = NotificationUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'NotificationUpdateDto(readAt=$readAt)'; } - diff --git a/mobile/openapi/lib/model/o_auth_authorize_response_dto.dart b/mobile/openapi/lib/model/o_auth_authorize_response_dto.dart index 7eedc45673..52c442aa19 100644 --- a/mobile/openapi/lib/model/o_auth_authorize_response_dto.dart +++ b/mobile/openapi/lib/model/o_auth_authorize_response_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class OAuthAuthorizeResponseDto { - /// Returns a new [OAuthAuthorizeResponseDto] instance. - OAuthAuthorizeResponseDto({ - required this.url, - }); +final class OAuthAuthorizeResponseDto { + const OAuthAuthorizeResponseDto({required this.url}); /// OAuth authorization URL - String url; + final String url; - @override - bool operator ==(Object other) => identical(this, other) || other is OAuthAuthorizeResponseDto && - other.url == url; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (url.hashCode); - - @override - String toString() => 'OAuthAuthorizeResponseDto[url=$url]'; + static OAuthAuthorizeResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(url: json[r'url'] as String); + } Map toJson() { final json = {}; - json[r'url'] = this.url; + json[r'url'] = url; return json; } - /// Returns a new [OAuthAuthorizeResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static OAuthAuthorizeResponseDto? fromJson(dynamic value) { - upgradeDto(value, "OAuthAuthorizeResponseDto"); - if (value is Map) { - final json = value.cast(); - - return OAuthAuthorizeResponseDto( - url: mapValueOfType(json, r'url')!, - ); - } - return null; + OAuthAuthorizeResponseDto copyWith({String? url}) { + return .new(url: url ?? this.url); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = OAuthAuthorizeResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is OAuthAuthorizeResponseDto && url == other.url); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = OAuthAuthorizeResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([url]); } - // maps a json object with a list of OAuthAuthorizeResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = OAuthAuthorizeResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'url', - }; + @override + String toString() => 'OAuthAuthorizeResponseDto(url=$url)'; } - diff --git a/mobile/openapi/lib/model/o_auth_backchannel_logout_dto.dart b/mobile/openapi/lib/model/o_auth_backchannel_logout_dto.dart new file mode 100644 index 0000000000..ecddbc774d --- /dev/null +++ b/mobile/openapi/lib/model/o_auth_backchannel_logout_dto.dart @@ -0,0 +1,40 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +part of openapi.api; + +final class OAuthBackchannelLogoutDto { + const OAuthBackchannelLogoutDto({required this.logoutToken}); + + /// OAuth logout token + final String logoutToken; + + static OAuthBackchannelLogoutDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(logoutToken: json[r'logout_token'] as String); + } + + Map toJson() { + final json = {}; + json[r'logout_token'] = logoutToken; + return json; + } + + OAuthBackchannelLogoutDto copyWith({String? logoutToken}) { + return .new(logoutToken: logoutToken ?? this.logoutToken); + } + + @override + bool operator ==(Object other) { + return identical(this, other) || (other is OAuthBackchannelLogoutDto && logoutToken == other.logoutToken); + } + + @override + int get hashCode { + return Object.hashAll([logoutToken]); + } + + @override + String toString() => 'OAuthBackchannelLogoutDto(logoutToken=$logoutToken)'; +} diff --git a/mobile/openapi/lib/model/o_auth_callback_dto.dart b/mobile/openapi/lib/model/o_auth_callback_dto.dart index d94374935a..1b67bb6f63 100644 --- a/mobile/openapi/lib/model/o_auth_callback_dto.dart +++ b/mobile/openapi/lib/model/o_auth_callback_dto.dart @@ -1,136 +1,63 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class OAuthCallbackDto { - /// Returns a new [OAuthCallbackDto] instance. - OAuthCallbackDto({ - this.codeVerifier, - this.state, +final class OAuthCallbackDto { + const OAuthCallbackDto({ + this.codeVerifier = const Optional.absent(), + this.state = const Optional.absent(), required this.url, }); /// OAuth code verifier (PKCE) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? codeVerifier; + final Optional codeVerifier; /// OAuth state parameter - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? state; + final Optional state; /// OAuth callback URL - String url; + final String url; - @override - bool operator ==(Object other) => identical(this, other) || other is OAuthCallbackDto && - other.codeVerifier == codeVerifier && - other.state == state && - other.url == url; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (codeVerifier == null ? 0 : codeVerifier!.hashCode) + - (state == null ? 0 : state!.hashCode) + - (url.hashCode); - - @override - String toString() => 'OAuthCallbackDto[codeVerifier=$codeVerifier, state=$state, url=$url]'; + static OAuthCallbackDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + codeVerifier: json.containsKey(r'codeVerifier') + ? Optional.present(json[r'codeVerifier'] as String) + : const Optional.absent(), + state: json.containsKey(r'state') ? Optional.present(json[r'state'] as String) : const Optional.absent(), + url: json[r'url'] as String, + ); + } Map toJson() { final json = {}; - if (this.codeVerifier != null) { - json[r'codeVerifier'] = this.codeVerifier; - } else { - // json[r'codeVerifier'] = null; + if (codeVerifier case Present(:final value)) { + json[r'codeVerifier'] = value; } - if (this.state != null) { - json[r'state'] = this.state; - } else { - // json[r'state'] = null; + if (state case Present(:final value)) { + json[r'state'] = value; } - json[r'url'] = this.url; + json[r'url'] = url; return json; } - /// Returns a new [OAuthCallbackDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static OAuthCallbackDto? fromJson(dynamic value) { - upgradeDto(value, "OAuthCallbackDto"); - if (value is Map) { - final json = value.cast(); - - return OAuthCallbackDto( - codeVerifier: mapValueOfType(json, r'codeVerifier'), - state: mapValueOfType(json, r'state'), - url: mapValueOfType(json, r'url')!, - ); - } - return null; + OAuthCallbackDto copyWith({Optional? codeVerifier, Optional? state, String? url}) { + return .new(codeVerifier: codeVerifier ?? this.codeVerifier, state: state ?? this.state, url: url ?? this.url); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = OAuthCallbackDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is OAuthCallbackDto && codeVerifier == other.codeVerifier && state == other.state && url == other.url); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = OAuthCallbackDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([codeVerifier, state, url]); } - // maps a json object with a list of OAuthCallbackDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = OAuthCallbackDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'url', - }; + @override + String toString() => 'OAuthCallbackDto(codeVerifier=$codeVerifier, state=$state, url=$url)'; } - diff --git a/mobile/openapi/lib/model/o_auth_config_dto.dart b/mobile/openapi/lib/model/o_auth_config_dto.dart index 1c9ce8d5b8..33ede030d2 100644 --- a/mobile/openapi/lib/model/o_auth_config_dto.dart +++ b/mobile/openapi/lib/model/o_auth_config_dto.dart @@ -1,136 +1,70 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class OAuthConfigDto { - /// Returns a new [OAuthConfigDto] instance. - OAuthConfigDto({ - this.codeChallenge, +final class OAuthConfigDto { + const OAuthConfigDto({ + this.codeChallenge = const Optional.absent(), required this.redirectUri, - this.state, + this.state = const Optional.absent(), }); /// OAuth code challenge (PKCE) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? codeChallenge; + final Optional codeChallenge; /// OAuth redirect URI - String redirectUri; + final String redirectUri; /// OAuth state parameter - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? state; + final Optional state; - @override - bool operator ==(Object other) => identical(this, other) || other is OAuthConfigDto && - other.codeChallenge == codeChallenge && - other.redirectUri == redirectUri && - other.state == state; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (codeChallenge == null ? 0 : codeChallenge!.hashCode) + - (redirectUri.hashCode) + - (state == null ? 0 : state!.hashCode); - - @override - String toString() => 'OAuthConfigDto[codeChallenge=$codeChallenge, redirectUri=$redirectUri, state=$state]'; + static OAuthConfigDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + codeChallenge: json.containsKey(r'codeChallenge') + ? Optional.present(json[r'codeChallenge'] as String) + : const Optional.absent(), + redirectUri: json[r'redirectUri'] as String, + state: json.containsKey(r'state') ? Optional.present(json[r'state'] as String) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.codeChallenge != null) { - json[r'codeChallenge'] = this.codeChallenge; - } else { - // json[r'codeChallenge'] = null; + if (codeChallenge case Present(:final value)) { + json[r'codeChallenge'] = value; } - json[r'redirectUri'] = this.redirectUri; - if (this.state != null) { - json[r'state'] = this.state; - } else { - // json[r'state'] = null; + json[r'redirectUri'] = redirectUri; + if (state case Present(:final value)) { + json[r'state'] = value; } return json; } - /// Returns a new [OAuthConfigDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static OAuthConfigDto? fromJson(dynamic value) { - upgradeDto(value, "OAuthConfigDto"); - if (value is Map) { - final json = value.cast(); - - return OAuthConfigDto( - codeChallenge: mapValueOfType(json, r'codeChallenge'), - redirectUri: mapValueOfType(json, r'redirectUri')!, - state: mapValueOfType(json, r'state'), - ); - } - return null; + OAuthConfigDto copyWith({Optional? codeChallenge, String? redirectUri, Optional? state}) { + return .new( + codeChallenge: codeChallenge ?? this.codeChallenge, + redirectUri: redirectUri ?? this.redirectUri, + state: state ?? this.state, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = OAuthConfigDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is OAuthConfigDto && + codeChallenge == other.codeChallenge && + redirectUri == other.redirectUri && + state == other.state); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = OAuthConfigDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([codeChallenge, redirectUri, state]); } - // maps a json object with a list of OAuthConfigDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = OAuthConfigDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'redirectUri', - }; + @override + String toString() => 'OAuthConfigDto(codeChallenge=$codeChallenge, redirectUri=$redirectUri, state=$state)'; } - diff --git a/mobile/openapi/lib/model/o_auth_token_endpoint_auth_method.dart b/mobile/openapi/lib/model/o_auth_token_endpoint_auth_method.dart index b63f027af7..fd3d27f282 100644 --- a/mobile/openapi/lib/model/o_auth_token_endpoint_auth_method.dart +++ b/mobile/openapi/lib/model/o_auth_token_endpoint_auth_method.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// OAuth token endpoint auth method -class OAuthTokenEndpointAuthMethod { - /// Instantiate a new enum with the provided [value]. +enum OAuthTokenEndpointAuthMethod { + clientSecretPost._(r'client_secret_post'), + clientSecretBasic._(r'client_secret_basic'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const OAuthTokenEndpointAuthMethod._(this.value); - /// The underlying value of this enum member. final String value; + static OAuthTokenEndpointAuthMethod? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const post = OAuthTokenEndpointAuthMethod._(r'client_secret_post'); - static const basic = OAuthTokenEndpointAuthMethod._(r'client_secret_basic'); - - /// List of all possible values in this [enum][OAuthTokenEndpointAuthMethod]. - static const values = [ - post, - basic, - ]; - - static OAuthTokenEndpointAuthMethod? fromJson(dynamic value) => OAuthTokenEndpointAuthMethodTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = OAuthTokenEndpointAuthMethod.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [OAuthTokenEndpointAuthMethod] to String, -/// and [decode] dynamic data back to [OAuthTokenEndpointAuthMethod]. -class OAuthTokenEndpointAuthMethodTypeTransformer { - factory OAuthTokenEndpointAuthMethodTypeTransformer() => _instance ??= const OAuthTokenEndpointAuthMethodTypeTransformer._(); - - const OAuthTokenEndpointAuthMethodTypeTransformer._(); - - String encode(OAuthTokenEndpointAuthMethod data) => data.value; - - /// Decodes a [dynamic value][data] to a OAuthTokenEndpointAuthMethod. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - OAuthTokenEndpointAuthMethod? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'client_secret_post': return OAuthTokenEndpointAuthMethod.post; - case r'client_secret_basic': return OAuthTokenEndpointAuthMethod.basic; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [OAuthTokenEndpointAuthMethodTypeTransformer] instance. - static OAuthTokenEndpointAuthMethodTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/ocr_config.dart b/mobile/openapi/lib/model/ocr_config.dart index 2ce5646731..47f30e63d8 100644 --- a/mobile/openapi/lib/model/ocr_config.dart +++ b/mobile/openapi/lib/model/ocr_config.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class OcrConfig { - /// Returns a new [OcrConfig] instance. - OcrConfig({ +final class OcrConfig { + const OcrConfig({ required this.enabled, required this.maxResolution, required this.minDetectionScore, @@ -21,125 +12,76 @@ class OcrConfig { }); /// Whether the task is enabled - bool enabled; + final bool enabled; /// Maximum resolution for OCR processing - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - int maxResolution; + final int maxResolution; /// Minimum confidence score for text detection - /// - /// Minimum value: 0.1 - /// Maximum value: 1 - double minDetectionScore; + final double minDetectionScore; /// Minimum confidence score for text recognition - /// - /// Minimum value: 0.1 - /// Maximum value: 1 - double minRecognitionScore; + final double minRecognitionScore; /// Name of the model to use - String modelName; + final String modelName; - @override - bool operator ==(Object other) => identical(this, other) || other is OcrConfig && - other.enabled == enabled && - other.maxResolution == maxResolution && - other.minDetectionScore == minDetectionScore && - other.minRecognitionScore == minRecognitionScore && - other.modelName == modelName; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (maxResolution.hashCode) + - (minDetectionScore.hashCode) + - (minRecognitionScore.hashCode) + - (modelName.hashCode); - - @override - String toString() => 'OcrConfig[enabled=$enabled, maxResolution=$maxResolution, minDetectionScore=$minDetectionScore, minRecognitionScore=$minRecognitionScore, modelName=$modelName]'; + static OcrConfig? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + enabled: json[r'enabled'] as bool, + maxResolution: json[r'maxResolution'] as int, + minDetectionScore: (json[r'minDetectionScore'] as num).toDouble(), + minRecognitionScore: (json[r'minRecognitionScore'] as num).toDouble(), + modelName: json[r'modelName'] as String, + ); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'maxResolution'] = this.maxResolution; - json[r'minDetectionScore'] = this.minDetectionScore; - json[r'minRecognitionScore'] = this.minRecognitionScore; - json[r'modelName'] = this.modelName; + json[r'enabled'] = enabled; + json[r'maxResolution'] = maxResolution; + json[r'minDetectionScore'] = minDetectionScore; + json[r'minRecognitionScore'] = minRecognitionScore; + json[r'modelName'] = modelName; return json; } - /// Returns a new [OcrConfig] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static OcrConfig? fromJson(dynamic value) { - upgradeDto(value, "OcrConfig"); - if (value is Map) { - final json = value.cast(); - - return OcrConfig( - enabled: mapValueOfType(json, r'enabled')!, - maxResolution: mapValueOfType(json, r'maxResolution')!, - minDetectionScore: (mapValueOfType(json, r'minDetectionScore')!).toDouble(), - minRecognitionScore: (mapValueOfType(json, r'minRecognitionScore')!).toDouble(), - modelName: mapValueOfType(json, r'modelName')!, - ); - } - return null; + OcrConfig copyWith({ + bool? enabled, + int? maxResolution, + double? minDetectionScore, + double? minRecognitionScore, + String? modelName, + }) { + return .new( + enabled: enabled ?? this.enabled, + maxResolution: maxResolution ?? this.maxResolution, + minDetectionScore: minDetectionScore ?? this.minDetectionScore, + minRecognitionScore: minRecognitionScore ?? this.minRecognitionScore, + modelName: modelName ?? this.modelName, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = OcrConfig.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is OcrConfig && + enabled == other.enabled && + maxResolution == other.maxResolution && + minDetectionScore == other.minDetectionScore && + minRecognitionScore == other.minRecognitionScore && + modelName == other.modelName); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = OcrConfig.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, maxResolution, minDetectionScore, minRecognitionScore, modelName]); } - // maps a json object with a list of OcrConfig-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = OcrConfig.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'maxResolution', - 'minDetectionScore', - 'minRecognitionScore', - 'modelName', - }; + @override + String toString() => + 'OcrConfig(enabled=$enabled, maxResolution=$maxResolution, minDetectionScore=$minDetectionScore, minRecognitionScore=$minRecognitionScore, modelName=$modelName)'; } - diff --git a/mobile/openapi/lib/model/on_this_day_dto.dart b/mobile/openapi/lib/model/on_this_day_dto.dart index 77ae96532f..f5e6d050ae 100644 --- a/mobile/openapi/lib/model/on_this_day_dto.dart +++ b/mobile/openapi/lib/model/on_this_day_dto.dart @@ -1,103 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class OnThisDayDto { - /// Returns a new [OnThisDayDto] instance. - OnThisDayDto({ - required this.year, - }); +final class OnThisDayDto { + const OnThisDayDto({required this.year}); /// Year for on this day memory - /// - /// Minimum value: 1000 - /// Maximum value: 9999 - int year; + final int year; - @override - bool operator ==(Object other) => identical(this, other) || other is OnThisDayDto && - other.year == year; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (year.hashCode); - - @override - String toString() => 'OnThisDayDto[year=$year]'; + static OnThisDayDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(year: json[r'year'] as int); + } Map toJson() { final json = {}; - json[r'year'] = this.year; + json[r'year'] = year; return json; } - /// Returns a new [OnThisDayDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static OnThisDayDto? fromJson(dynamic value) { - upgradeDto(value, "OnThisDayDto"); - if (value is Map) { - final json = value.cast(); - - return OnThisDayDto( - year: mapValueOfType(json, r'year')!, - ); - } - return null; + OnThisDayDto copyWith({int? year}) { + return .new(year: year ?? this.year); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = OnThisDayDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is OnThisDayDto && year == other.year); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = OnThisDayDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([year]); } - // maps a json object with a list of OnThisDayDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = OnThisDayDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'year', - }; + @override + String toString() => 'OnThisDayDto(year=$year)'; } - diff --git a/mobile/openapi/lib/model/onboarding_dto.dart b/mobile/openapi/lib/model/onboarding_dto.dart index 8499bc9b9a..8a8fece14c 100644 --- a/mobile/openapi/lib/model/onboarding_dto.dart +++ b/mobile/openapi/lib/model/onboarding_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class OnboardingDto { - /// Returns a new [OnboardingDto] instance. - OnboardingDto({ - required this.isOnboarded, - }); +final class OnboardingDto { + const OnboardingDto({required this.isOnboarded}); /// Is user onboarded - bool isOnboarded; + final bool isOnboarded; - @override - bool operator ==(Object other) => identical(this, other) || other is OnboardingDto && - other.isOnboarded == isOnboarded; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (isOnboarded.hashCode); - - @override - String toString() => 'OnboardingDto[isOnboarded=$isOnboarded]'; + static OnboardingDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(isOnboarded: json[r'isOnboarded'] as bool); + } Map toJson() { final json = {}; - json[r'isOnboarded'] = this.isOnboarded; + json[r'isOnboarded'] = isOnboarded; return json; } - /// Returns a new [OnboardingDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static OnboardingDto? fromJson(dynamic value) { - upgradeDto(value, "OnboardingDto"); - if (value is Map) { - final json = value.cast(); - - return OnboardingDto( - isOnboarded: mapValueOfType(json, r'isOnboarded')!, - ); - } - return null; + OnboardingDto copyWith({bool? isOnboarded}) { + return .new(isOnboarded: isOnboarded ?? this.isOnboarded); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = OnboardingDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is OnboardingDto && isOnboarded == other.isOnboarded); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = OnboardingDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([isOnboarded]); } - // maps a json object with a list of OnboardingDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = OnboardingDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'isOnboarded', - }; + @override + String toString() => 'OnboardingDto(isOnboarded=$isOnboarded)'; } - diff --git a/mobile/openapi/lib/model/onboarding_response_dto.dart b/mobile/openapi/lib/model/onboarding_response_dto.dart index 2b0dbe2b96..804f9bb935 100644 --- a/mobile/openapi/lib/model/onboarding_response_dto.dart +++ b/mobile/openapi/lib/model/onboarding_response_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class OnboardingResponseDto { - /// Returns a new [OnboardingResponseDto] instance. - OnboardingResponseDto({ - required this.isOnboarded, - }); +final class OnboardingResponseDto { + const OnboardingResponseDto({required this.isOnboarded}); /// Is user onboarded - bool isOnboarded; + final bool isOnboarded; - @override - bool operator ==(Object other) => identical(this, other) || other is OnboardingResponseDto && - other.isOnboarded == isOnboarded; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (isOnboarded.hashCode); - - @override - String toString() => 'OnboardingResponseDto[isOnboarded=$isOnboarded]'; + static OnboardingResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(isOnboarded: json[r'isOnboarded'] as bool); + } Map toJson() { final json = {}; - json[r'isOnboarded'] = this.isOnboarded; + json[r'isOnboarded'] = isOnboarded; return json; } - /// Returns a new [OnboardingResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static OnboardingResponseDto? fromJson(dynamic value) { - upgradeDto(value, "OnboardingResponseDto"); - if (value is Map) { - final json = value.cast(); - - return OnboardingResponseDto( - isOnboarded: mapValueOfType(json, r'isOnboarded')!, - ); - } - return null; + OnboardingResponseDto copyWith({bool? isOnboarded}) { + return .new(isOnboarded: isOnboarded ?? this.isOnboarded); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = OnboardingResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is OnboardingResponseDto && isOnboarded == other.isOnboarded); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = OnboardingResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([isOnboarded]); } - // maps a json object with a list of OnboardingResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = OnboardingResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'isOnboarded', - }; + @override + String toString() => 'OnboardingResponseDto(isOnboarded=$isOnboarded)'; } - diff --git a/mobile/openapi/lib/model/partner_create_dto.dart b/mobile/openapi/lib/model/partner_create_dto.dart index 30aa96ff30..20ab2865f6 100644 --- a/mobile/openapi/lib/model/partner_create_dto.dart +++ b/mobile/openapi/lib/model/partner_create_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PartnerCreateDto { - /// Returns a new [PartnerCreateDto] instance. - PartnerCreateDto({ - required this.sharedWithId, - }); +final class PartnerCreateDto { + const PartnerCreateDto({required this.sharedWithId}); /// User ID to share with - String sharedWithId; + final String sharedWithId; - @override - bool operator ==(Object other) => identical(this, other) || other is PartnerCreateDto && - other.sharedWithId == sharedWithId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (sharedWithId.hashCode); - - @override - String toString() => 'PartnerCreateDto[sharedWithId=$sharedWithId]'; + static PartnerCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(sharedWithId: json[r'sharedWithId'] as String); + } Map toJson() { final json = {}; - json[r'sharedWithId'] = this.sharedWithId; + json[r'sharedWithId'] = sharedWithId; return json; } - /// Returns a new [PartnerCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PartnerCreateDto? fromJson(dynamic value) { - upgradeDto(value, "PartnerCreateDto"); - if (value is Map) { - final json = value.cast(); - - return PartnerCreateDto( - sharedWithId: mapValueOfType(json, r'sharedWithId')!, - ); - } - return null; + PartnerCreateDto copyWith({String? sharedWithId}) { + return .new(sharedWithId: sharedWithId ?? this.sharedWithId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PartnerCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is PartnerCreateDto && sharedWithId == other.sharedWithId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PartnerCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([sharedWithId]); } - // maps a json object with a list of PartnerCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PartnerCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'sharedWithId', - }; + @override + String toString() => 'PartnerCreateDto(sharedWithId=$sharedWithId)'; } - diff --git a/mobile/openapi/lib/model/partner_direction.dart b/mobile/openapi/lib/model/partner_direction.dart index c5e3b308ac..2362f56982 100644 --- a/mobile/openapi/lib/model/partner_direction.dart +++ b/mobile/openapi/lib/model/partner_direction.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Partner direction -class PartnerDirection { - /// Instantiate a new enum with the provided [value]. +enum PartnerDirection { + sharedBy._(r'shared-by'), + sharedWith._(r'shared-with'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const PartnerDirection._(this.value); - /// The underlying value of this enum member. final String value; + static PartnerDirection? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const by = PartnerDirection._(r'shared-by'); - static const with_ = PartnerDirection._(r'shared-with'); - - /// List of all possible values in this [enum][PartnerDirection]. - static const values = [ - by, - with_, - ]; - - static PartnerDirection? fromJson(dynamic value) => PartnerDirectionTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PartnerDirection.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [PartnerDirection] to String, -/// and [decode] dynamic data back to [PartnerDirection]. -class PartnerDirectionTypeTransformer { - factory PartnerDirectionTypeTransformer() => _instance ??= const PartnerDirectionTypeTransformer._(); - - const PartnerDirectionTypeTransformer._(); - - String encode(PartnerDirection data) => data.value; - - /// Decodes a [dynamic value][data] to a PartnerDirection. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - PartnerDirection? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'shared-by': return PartnerDirection.by; - case r'shared-with': return PartnerDirection.with_; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [PartnerDirectionTypeTransformer] instance. - static PartnerDirectionTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/partner_response_dto.dart b/mobile/openapi/lib/model/partner_response_dto.dart index f4612cc98a..047b45cb39 100644 --- a/mobile/openapi/lib/model/partner_response_dto.dart +++ b/mobile/openapi/lib/model/partner_response_dto.dart @@ -1,18 +1,10 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PartnerResponseDto { - /// Returns a new [PartnerResponseDto] instance. - PartnerResponseDto({ +/// Partner response +final class PartnerResponseDto { + const PartnerResponseDto({ required this.avatarColor, required this.email, required this.id, @@ -22,141 +14,96 @@ class PartnerResponseDto { required this.profileImagePath, }); - UserAvatarColor avatarColor; + final UserAvatarColor avatarColor; /// User email - String email; + final String email; /// User ID - String id; + final String id; /// Show in timeline - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? inTimeline; + final bool? inTimeline; /// User name - String name; + final String name; /// Profile change date - DateTime profileChangedAt; + final DateTime profileChangedAt; /// Profile image path - String profileImagePath; + final String profileImagePath; - @override - bool operator ==(Object other) => identical(this, other) || other is PartnerResponseDto && - other.avatarColor == avatarColor && - other.email == email && - other.id == id && - other.inTimeline == inTimeline && - other.name == name && - other.profileChangedAt == profileChangedAt && - other.profileImagePath == profileImagePath; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (avatarColor.hashCode) + - (email.hashCode) + - (id.hashCode) + - (inTimeline == null ? 0 : inTimeline!.hashCode) + - (name.hashCode) + - (profileChangedAt.hashCode) + - (profileImagePath.hashCode); - - @override - String toString() => 'PartnerResponseDto[avatarColor=$avatarColor, email=$email, id=$id, inTimeline=$inTimeline, name=$name, profileChangedAt=$profileChangedAt, profileImagePath=$profileImagePath]'; + static PartnerResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + avatarColor: (UserAvatarColor.fromJson(json[r'avatarColor']))!, + email: json[r'email'] as String, + id: json[r'id'] as String, + inTimeline: (json[r'inTimeline'] as bool?), + name: json[r'name'] as String, + profileChangedAt: DateTime.parse(json[r'profileChangedAt'] as String), + profileImagePath: json[r'profileImagePath'] as String, + ); + } Map toJson() { final json = {}; - json[r'avatarColor'] = this.avatarColor; - json[r'email'] = this.email; - json[r'id'] = this.id; - if (this.inTimeline != null) { - json[r'inTimeline'] = this.inTimeline; - } else { - // json[r'inTimeline'] = null; + json[r'avatarColor'] = avatarColor.toJson(); + json[r'email'] = email; + json[r'id'] = id; + if (inTimeline != null) { + json[r'inTimeline'] = inTimeline!; } - json[r'name'] = this.name; - json[r'profileChangedAt'] = this.profileChangedAt.toUtc().toIso8601String(); - json[r'profileImagePath'] = this.profileImagePath; + json[r'name'] = name; + json[r'profileChangedAt'] = profileChangedAt.toUtc().toIso8601String(); + json[r'profileImagePath'] = profileImagePath; return json; } - /// Returns a new [PartnerResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PartnerResponseDto? fromJson(dynamic value) { - upgradeDto(value, "PartnerResponseDto"); - if (value is Map) { - final json = value.cast(); - - return PartnerResponseDto( - avatarColor: UserAvatarColor.fromJson(json[r'avatarColor'])!, - email: mapValueOfType(json, r'email')!, - id: mapValueOfType(json, r'id')!, - inTimeline: mapValueOfType(json, r'inTimeline'), - name: mapValueOfType(json, r'name')!, - profileChangedAt: mapDateTime(json, r'profileChangedAt', r'')!, - profileImagePath: mapValueOfType(json, r'profileImagePath')!, - ); - } - return null; + PartnerResponseDto copyWith({ + UserAvatarColor? avatarColor, + String? email, + String? id, + Object? inTimeline = _undefined, + String? name, + DateTime? profileChangedAt, + String? profileImagePath, + }) { + return .new( + avatarColor: avatarColor ?? this.avatarColor, + email: email ?? this.email, + id: id ?? this.id, + inTimeline: identical(inTimeline, _undefined) ? this.inTimeline : inTimeline as bool?, + name: name ?? this.name, + profileChangedAt: profileChangedAt ?? this.profileChangedAt, + profileImagePath: profileImagePath ?? this.profileImagePath, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PartnerResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PartnerResponseDto && + avatarColor == other.avatarColor && + email == other.email && + id == other.id && + inTimeline == other.inTimeline && + name == other.name && + profileChangedAt == other.profileChangedAt && + profileImagePath == other.profileImagePath); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PartnerResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([avatarColor, email, id, inTimeline, name, profileChangedAt, profileImagePath]); } - // maps a json object with a list of PartnerResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PartnerResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'avatarColor', - 'email', - 'id', - 'name', - 'profileChangedAt', - 'profileImagePath', - }; + @override + String toString() => + 'PartnerResponseDto(avatarColor=$avatarColor, email=$email, id=$id, inTimeline=$inTimeline, name=$name, profileChangedAt=$profileChangedAt, profileImagePath=$profileImagePath)'; } - diff --git a/mobile/openapi/lib/model/partner_update_dto.dart b/mobile/openapi/lib/model/partner_update_dto.dart index db3516e3a1..3e7db8361f 100644 --- a/mobile/openapi/lib/model/partner_update_dto.dart +++ b/mobile/openapi/lib/model/partner_update_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PartnerUpdateDto { - /// Returns a new [PartnerUpdateDto] instance. - PartnerUpdateDto({ - required this.inTimeline, - }); +final class PartnerUpdateDto { + const PartnerUpdateDto({required this.inTimeline}); /// Show partner assets in timeline - bool inTimeline; + final bool inTimeline; - @override - bool operator ==(Object other) => identical(this, other) || other is PartnerUpdateDto && - other.inTimeline == inTimeline; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (inTimeline.hashCode); - - @override - String toString() => 'PartnerUpdateDto[inTimeline=$inTimeline]'; + static PartnerUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(inTimeline: json[r'inTimeline'] as bool); + } Map toJson() { final json = {}; - json[r'inTimeline'] = this.inTimeline; + json[r'inTimeline'] = inTimeline; return json; } - /// Returns a new [PartnerUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PartnerUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "PartnerUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return PartnerUpdateDto( - inTimeline: mapValueOfType(json, r'inTimeline')!, - ); - } - return null; + PartnerUpdateDto copyWith({bool? inTimeline}) { + return .new(inTimeline: inTimeline ?? this.inTimeline); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PartnerUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is PartnerUpdateDto && inTimeline == other.inTimeline); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PartnerUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([inTimeline]); } - // maps a json object with a list of PartnerUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PartnerUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'inTimeline', - }; + @override + String toString() => 'PartnerUpdateDto(inTimeline=$inTimeline)'; } - diff --git a/mobile/openapi/lib/model/people_response.dart b/mobile/openapi/lib/model/people_response.dart index 9d5d8ec18a..b14af1e35f 100644 --- a/mobile/openapi/lib/model/people_response.dart +++ b/mobile/openapi/lib/model/people_response.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PeopleResponse { - /// Returns a new [PeopleResponse] instance. - PeopleResponse({ - required this.enabled, - required this.sidebarWeb, - }); +final class PeopleResponse { + const PeopleResponse({required this.enabled, required this.sidebarWeb}); /// Whether people are enabled - bool enabled; + final bool enabled; /// Whether people appear in web sidebar - bool sidebarWeb; + final bool sidebarWeb; - @override - bool operator ==(Object other) => identical(this, other) || other is PeopleResponse && - other.enabled == enabled && - other.sidebarWeb == sidebarWeb; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (sidebarWeb.hashCode); - - @override - String toString() => 'PeopleResponse[enabled=$enabled, sidebarWeb=$sidebarWeb]'; + static PeopleResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool, sidebarWeb: json[r'sidebarWeb'] as bool); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'sidebarWeb'] = this.sidebarWeb; + json[r'enabled'] = enabled; + json[r'sidebarWeb'] = sidebarWeb; return json; } - /// Returns a new [PeopleResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PeopleResponse? fromJson(dynamic value) { - upgradeDto(value, "PeopleResponse"); - if (value is Map) { - final json = value.cast(); - - return PeopleResponse( - enabled: mapValueOfType(json, r'enabled')!, - sidebarWeb: mapValueOfType(json, r'sidebarWeb')!, - ); - } - return null; + PeopleResponse copyWith({bool? enabled, bool? sidebarWeb}) { + return .new(enabled: enabled ?? this.enabled, sidebarWeb: sidebarWeb ?? this.sidebarWeb); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PeopleResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PeopleResponse && enabled == other.enabled && sidebarWeb == other.sidebarWeb); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PeopleResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, sidebarWeb]); } - // maps a json object with a list of PeopleResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PeopleResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'sidebarWeb', - }; + @override + String toString() => 'PeopleResponse(enabled=$enabled, sidebarWeb=$sidebarWeb)'; } - diff --git a/mobile/openapi/lib/model/people_response_dto.dart b/mobile/openapi/lib/model/people_response_dto.dart index 87edc6b4a7..e7a60a7398 100644 --- a/mobile/openapi/lib/model/people_response_dto.dart +++ b/mobile/openapi/lib/model/people_response_dto.dart @@ -1,141 +1,81 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PeopleResponseDto { - /// Returns a new [PeopleResponseDto] instance. - PeopleResponseDto({ - this.hasNextPage, - required this.hidden, - this.people = const [], - required this.total, - }); +/// People response +final class PeopleResponseDto { + const PeopleResponseDto({this.hasNextPage, required this.hidden, required this.people, required this.total}); /// Whether there are more pages - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? hasNextPage; + /// Available since server v1.110.0. + final bool? hasNextPage; /// Number of hidden people - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int hidden; + final int hidden; - List people; + final List people; /// Total number of people - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int total; + final int total; - @override - bool operator ==(Object other) => identical(this, other) || other is PeopleResponseDto && - other.hasNextPage == hasNextPage && - other.hidden == hidden && - _deepEquality.equals(other.people, people) && - other.total == total; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (hasNextPage == null ? 0 : hasNextPage!.hashCode) + - (hidden.hashCode) + - (people.hashCode) + - (total.hashCode); + static const ApiVersion hasNextPageAddedIn = .new(1, 110, 0); - @override - String toString() => 'PeopleResponseDto[hasNextPage=$hasNextPage, hidden=$hidden, people=$people, total=$total]'; + static const ApiState hasNextPageState = .stable; + + static PeopleResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + hasNextPage: (json[r'hasNextPage'] as bool?), + hidden: json[r'hidden'] as int, + people: ((json[r'people'] as List?)?.map(($e) => (PersonResponseDto.fromJson($e))!).toList(growable: false))!, + total: json[r'total'] as int, + ); + } Map toJson() { final json = {}; - if (this.hasNextPage != null) { - json[r'hasNextPage'] = this.hasNextPage; - } else { - // json[r'hasNextPage'] = null; + if (hasNextPage != null) { + json[r'hasNextPage'] = hasNextPage!; } - json[r'hidden'] = this.hidden; - json[r'people'] = this.people; - json[r'total'] = this.total; + json[r'hidden'] = hidden; + json[r'people'] = people.map(($e) => $e.toJson()).toList(growable: false); + json[r'total'] = total; return json; } - /// Returns a new [PeopleResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PeopleResponseDto? fromJson(dynamic value) { - upgradeDto(value, "PeopleResponseDto"); - if (value is Map) { - final json = value.cast(); - - return PeopleResponseDto( - hasNextPage: mapValueOfType(json, r'hasNextPage'), - hidden: mapValueOfType(json, r'hidden')!, - people: PersonResponseDto.listFromJson(json[r'people']), - total: mapValueOfType(json, r'total')!, - ); - } - return null; + PeopleResponseDto copyWith({ + Object? hasNextPage = _undefined, + int? hidden, + List? people, + int? total, + }) { + return .new( + hasNextPage: identical(hasNextPage, _undefined) ? this.hasNextPage : hasNextPage as bool?, + hidden: hidden ?? this.hidden, + people: people ?? this.people, + total: total ?? this.total, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PeopleResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PeopleResponseDto && + hasNextPage == other.hasNextPage && + hidden == other.hidden && + const DeepCollectionEquality().equals(people, other.people) && + total == other.total); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PeopleResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([hasNextPage, hidden, const DeepCollectionEquality().hash(people), total]); } - // maps a json object with a list of PeopleResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PeopleResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'hidden', - 'people', - 'total', - }; + @override + String toString() => 'PeopleResponseDto(hasNextPage=$hasNextPage, hidden=$hidden, people=$people, total=$total)'; } - diff --git a/mobile/openapi/lib/model/people_update.dart b/mobile/openapi/lib/model/people_update.dart index fe16479bac..90cb051e96 100644 --- a/mobile/openapi/lib/model/people_update.dart +++ b/mobile/openapi/lib/model/people_update.dart @@ -1,127 +1,54 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PeopleUpdate { - /// Returns a new [PeopleUpdate] instance. - PeopleUpdate({ - this.enabled, - this.sidebarWeb, - }); +final class PeopleUpdate { + const PeopleUpdate({this.enabled, this.sidebarWeb}); /// Whether people are enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final bool? enabled; /// Whether people appear in web sidebar - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? sidebarWeb; + final bool? sidebarWeb; - @override - bool operator ==(Object other) => identical(this, other) || other is PeopleUpdate && - other.enabled == enabled && - other.sidebarWeb == sidebarWeb; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled == null ? 0 : enabled!.hashCode) + - (sidebarWeb == null ? 0 : sidebarWeb!.hashCode); - - @override - String toString() => 'PeopleUpdate[enabled=$enabled, sidebarWeb=$sidebarWeb]'; + static PeopleUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: (json[r'enabled'] as bool?), sidebarWeb: (json[r'sidebarWeb'] as bool?)); + } Map toJson() { final json = {}; - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled != null) { + json[r'enabled'] = enabled!; } - if (this.sidebarWeb != null) { - json[r'sidebarWeb'] = this.sidebarWeb; - } else { - // json[r'sidebarWeb'] = null; + if (sidebarWeb != null) { + json[r'sidebarWeb'] = sidebarWeb!; } return json; } - /// Returns a new [PeopleUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PeopleUpdate? fromJson(dynamic value) { - upgradeDto(value, "PeopleUpdate"); - if (value is Map) { - final json = value.cast(); - - return PeopleUpdate( - enabled: mapValueOfType(json, r'enabled'), - sidebarWeb: mapValueOfType(json, r'sidebarWeb'), - ); - } - return null; + PeopleUpdate copyWith({Object? enabled = _undefined, Object? sidebarWeb = _undefined}) { + return .new( + enabled: identical(enabled, _undefined) ? this.enabled : enabled as bool?, + sidebarWeb: identical(sidebarWeb, _undefined) ? this.sidebarWeb : sidebarWeb as bool?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PeopleUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PeopleUpdate && enabled == other.enabled && sidebarWeb == other.sidebarWeb); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PeopleUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, sidebarWeb]); } - // maps a json object with a list of PeopleUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PeopleUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'PeopleUpdate(enabled=$enabled, sidebarWeb=$sidebarWeb)'; } - diff --git a/mobile/openapi/lib/model/people_update_dto.dart b/mobile/openapi/lib/model/people_update_dto.dart index c9ce74d659..c0351eb35d 100644 --- a/mobile/openapi/lib/model/people_update_dto.dart +++ b/mobile/openapi/lib/model/people_update_dto.dart @@ -1,100 +1,43 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PeopleUpdateDto { - /// Returns a new [PeopleUpdateDto] instance. - PeopleUpdateDto({ - this.people = const [], - }); +final class PeopleUpdateDto { + const PeopleUpdateDto({required this.people}); /// People to update - List people; + final List people; - @override - bool operator ==(Object other) => identical(this, other) || other is PeopleUpdateDto && - _deepEquality.equals(other.people, people); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (people.hashCode); - - @override - String toString() => 'PeopleUpdateDto[people=$people]'; + static PeopleUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + people: ((json[r'people'] as List?)?.map(($e) => (PeopleUpdateItem.fromJson($e))!).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'people'] = this.people; + json[r'people'] = people.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [PeopleUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PeopleUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "PeopleUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return PeopleUpdateDto( - people: PeopleUpdateItem.listFromJson(json[r'people']), - ); - } - return null; + PeopleUpdateDto copyWith({List? people}) { + return .new(people: people ?? this.people); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PeopleUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PeopleUpdateDto && const DeepCollectionEquality().equals(people, other.people)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PeopleUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(people)]); } - // maps a json object with a list of PeopleUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PeopleUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'people', - }; + @override + String toString() => 'PeopleUpdateDto(people=$people)'; } - diff --git a/mobile/openapi/lib/model/people_update_item.dart b/mobile/openapi/lib/model/people_update_item.dart index 5e20aeb464..41795d2fb8 100644 --- a/mobile/openapi/lib/model/people_update_item.dart +++ b/mobile/openapi/lib/model/people_update_item.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PeopleUpdateItem { - /// Returns a new [PeopleUpdateItem] instance. - PeopleUpdateItem({ +final class PeopleUpdateItem { + const PeopleUpdateItem({ this.birthDate, this.color, this.featureFaceAssetId, @@ -23,174 +14,108 @@ class PeopleUpdateItem { }); /// Person date of birth - DateTime? birthDate; + final DateTime? birthDate; /// Person color (hex) - String? color; + final String? color; /// Asset ID used for feature face thumbnail - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? featureFaceAssetId; + final String? featureFaceAssetId; /// Person ID - String id; + final String id; /// Mark as favorite - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isFavorite; + final bool? isFavorite; /// Person visibility (hidden) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isHidden; + final bool? isHidden; /// Person name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? name; + final String? name; - @override - bool operator ==(Object other) => identical(this, other) || other is PeopleUpdateItem && - other.birthDate == birthDate && - other.color == color && - other.featureFaceAssetId == featureFaceAssetId && - other.id == id && - other.isFavorite == isFavorite && - other.isHidden == isHidden && - other.name == name; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (birthDate == null ? 0 : birthDate!.hashCode) + - (color == null ? 0 : color!.hashCode) + - (featureFaceAssetId == null ? 0 : featureFaceAssetId!.hashCode) + - (id.hashCode) + - (isFavorite == null ? 0 : isFavorite!.hashCode) + - (isHidden == null ? 0 : isHidden!.hashCode) + - (name == null ? 0 : name!.hashCode); - - @override - String toString() => 'PeopleUpdateItem[birthDate=$birthDate, color=$color, featureFaceAssetId=$featureFaceAssetId, id=$id, isFavorite=$isFavorite, isHidden=$isHidden, name=$name]'; + static PeopleUpdateItem? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + birthDate: (json[r'birthDate'] == null ? null : DateTime.parse(json[r'birthDate'] as String)), + color: (json[r'color'] as String?), + featureFaceAssetId: (json[r'featureFaceAssetId'] as String?), + id: json[r'id'] as String, + isFavorite: (json[r'isFavorite'] as bool?), + isHidden: (json[r'isHidden'] as bool?), + name: (json[r'name'] as String?), + ); + } Map toJson() { final json = {}; - if (this.birthDate != null) { - json[r'birthDate'] = _dateFormatter.format(this.birthDate!.toUtc()); - } else { - // json[r'birthDate'] = null; + if (birthDate != null) { + json[r'birthDate'] = birthDate!.toUtc().toIso8601String(); } - if (this.color != null) { - json[r'color'] = this.color; - } else { - // json[r'color'] = null; + if (color != null) { + json[r'color'] = color!; } - if (this.featureFaceAssetId != null) { - json[r'featureFaceAssetId'] = this.featureFaceAssetId; - } else { - // json[r'featureFaceAssetId'] = null; + if (featureFaceAssetId != null) { + json[r'featureFaceAssetId'] = featureFaceAssetId!; } - json[r'id'] = this.id; - if (this.isFavorite != null) { - json[r'isFavorite'] = this.isFavorite; - } else { - // json[r'isFavorite'] = null; + json[r'id'] = id; + if (isFavorite != null) { + json[r'isFavorite'] = isFavorite!; } - if (this.isHidden != null) { - json[r'isHidden'] = this.isHidden; - } else { - // json[r'isHidden'] = null; + if (isHidden != null) { + json[r'isHidden'] = isHidden!; } - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (name != null) { + json[r'name'] = name!; } return json; } - /// Returns a new [PeopleUpdateItem] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PeopleUpdateItem? fromJson(dynamic value) { - upgradeDto(value, "PeopleUpdateItem"); - if (value is Map) { - final json = value.cast(); - - return PeopleUpdateItem( - birthDate: mapDateTime(json, r'birthDate', r''), - color: mapValueOfType(json, r'color'), - featureFaceAssetId: mapValueOfType(json, r'featureFaceAssetId'), - id: mapValueOfType(json, r'id')!, - isFavorite: mapValueOfType(json, r'isFavorite'), - isHidden: mapValueOfType(json, r'isHidden'), - name: mapValueOfType(json, r'name'), - ); - } - return null; + PeopleUpdateItem copyWith({ + Object? birthDate = _undefined, + Object? color = _undefined, + Object? featureFaceAssetId = _undefined, + String? id, + Object? isFavorite = _undefined, + Object? isHidden = _undefined, + Object? name = _undefined, + }) { + return .new( + birthDate: identical(birthDate, _undefined) ? this.birthDate : birthDate as DateTime?, + color: identical(color, _undefined) ? this.color : color as String?, + featureFaceAssetId: identical(featureFaceAssetId, _undefined) + ? this.featureFaceAssetId + : featureFaceAssetId as String?, + id: id ?? this.id, + isFavorite: identical(isFavorite, _undefined) ? this.isFavorite : isFavorite as bool?, + isHidden: identical(isHidden, _undefined) ? this.isHidden : isHidden as bool?, + name: identical(name, _undefined) ? this.name : name as String?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PeopleUpdateItem.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PeopleUpdateItem && + birthDate == other.birthDate && + color == other.color && + featureFaceAssetId == other.featureFaceAssetId && + id == other.id && + isFavorite == other.isFavorite && + isHidden == other.isHidden && + name == other.name); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PeopleUpdateItem.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([birthDate, color, featureFaceAssetId, id, isFavorite, isHidden, name]); } - // maps a json object with a list of PeopleUpdateItem-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PeopleUpdateItem.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'id', - }; + @override + String toString() => + 'PeopleUpdateItem(birthDate=$birthDate, color=$color, featureFaceAssetId=$featureFaceAssetId, id=$id, isFavorite=$isFavorite, isHidden=$isHidden, name=$name)'; } - diff --git a/mobile/openapi/lib/model/permission.dart b/mobile/openapi/lib/model/permission.dart index 0ac9461027..43db8311e9 100644 --- a/mobile/openapi/lib/model/permission.dart +++ b/mobile/openapi/lib/model/permission.dart @@ -1,544 +1,181 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// List of permissions -class Permission { - /// Instantiate a new enum with the provided [value]. +enum Permission { + all._(r'all'), + activityCreate._(r'activity.create'), + activityRead._(r'activity.read'), + activityUpdate._(r'activity.update'), + activityDelete._(r'activity.delete'), + activityStatistics._(r'activity.statistics'), + apiKeyCreate._(r'apiKey.create'), + apiKeyRead._(r'apiKey.read'), + apiKeyUpdate._(r'apiKey.update'), + apiKeyDelete._(r'apiKey.delete'), + assetRead._(r'asset.read'), + assetUpdate._(r'asset.update'), + assetDelete._(r'asset.delete'), + assetStatistics._(r'asset.statistics'), + assetShare._(r'asset.share'), + assetView._(r'asset.view'), + assetDownload._(r'asset.download'), + assetUpload._(r'asset.upload'), + assetCopy._(r'asset.copy'), + assetDerive._(r'asset.derive'), + assetEditGet._(r'asset.edit.get'), + assetEditCreate._(r'asset.edit.create'), + assetEditDelete._(r'asset.edit.delete'), + albumCreate._(r'album.create'), + albumRead._(r'album.read'), + albumUpdate._(r'album.update'), + albumDelete._(r'album.delete'), + albumStatistics._(r'album.statistics'), + albumShare._(r'album.share'), + albumDownload._(r'album.download'), + albumAssetCreate._(r'albumAsset.create'), + albumAssetDelete._(r'albumAsset.delete'), + albumUserCreate._(r'albumUser.create'), + albumUserUpdate._(r'albumUser.update'), + albumUserDelete._(r'albumUser.delete'), + authChangePassword._(r'auth.changePassword'), + authDeviceDelete._(r'authDevice.delete'), + archiveRead._(r'archive.read'), + backupList._(r'backup.list'), + backupDownload._(r'backup.download'), + backupUpload._(r'backup.upload'), + backupDelete._(r'backup.delete'), + duplicateRead._(r'duplicate.read'), + duplicateDelete._(r'duplicate.delete'), + faceCreate._(r'face.create'), + faceRead._(r'face.read'), + faceUpdate._(r'face.update'), + faceDelete._(r'face.delete'), + folderRead._(r'folder.read'), + jobCreate._(r'job.create'), + jobRead._(r'job.read'), + libraryCreate._(r'library.create'), + libraryRead._(r'library.read'), + libraryUpdate._(r'library.update'), + libraryDelete._(r'library.delete'), + libraryStatistics._(r'library.statistics'), + timelineRead._(r'timeline.read'), + timelineDownload._(r'timeline.download'), + maintenance._(r'maintenance'), + mapRead._(r'map.read'), + mapSearch._(r'map.search'), + memoryCreate._(r'memory.create'), + memoryRead._(r'memory.read'), + memoryUpdate._(r'memory.update'), + memoryDelete._(r'memory.delete'), + memoryStatistics._(r'memory.statistics'), + memoryAssetCreate._(r'memoryAsset.create'), + memoryAssetDelete._(r'memoryAsset.delete'), + notificationCreate._(r'notification.create'), + notificationRead._(r'notification.read'), + notificationUpdate._(r'notification.update'), + notificationDelete._(r'notification.delete'), + partnerCreate._(r'partner.create'), + partnerRead._(r'partner.read'), + partnerUpdate._(r'partner.update'), + partnerDelete._(r'partner.delete'), + personCreate._(r'person.create'), + personRead._(r'person.read'), + personUpdate._(r'person.update'), + personDelete._(r'person.delete'), + personStatistics._(r'person.statistics'), + personMerge._(r'person.merge'), + personReassign._(r'person.reassign'), + pinCodeCreate._(r'pinCode.create'), + pinCodeUpdate._(r'pinCode.update'), + pinCodeDelete._(r'pinCode.delete'), + pluginCreate._(r'plugin.create'), + pluginRead._(r'plugin.read'), + pluginUpdate._(r'plugin.update'), + pluginDelete._(r'plugin.delete'), + serverAbout._(r'server.about'), + serverApkLinks._(r'server.apkLinks'), + serverStorage._(r'server.storage'), + serverStatistics._(r'server.statistics'), + serverVersionCheck._(r'server.versionCheck'), + serverLicenseRead._(r'serverLicense.read'), + serverLicenseUpdate._(r'serverLicense.update'), + serverLicenseDelete._(r'serverLicense.delete'), + sessionCreate._(r'session.create'), + sessionRead._(r'session.read'), + sessionUpdate._(r'session.update'), + sessionDelete._(r'session.delete'), + sessionLock._(r'session.lock'), + sharedLinkCreate._(r'sharedLink.create'), + sharedLinkRead._(r'sharedLink.read'), + sharedLinkUpdate._(r'sharedLink.update'), + sharedLinkDelete._(r'sharedLink.delete'), + stackCreate._(r'stack.create'), + stackRead._(r'stack.read'), + stackUpdate._(r'stack.update'), + stackDelete._(r'stack.delete'), + syncStream._(r'sync.stream'), + syncCheckpointRead._(r'syncCheckpoint.read'), + syncCheckpointUpdate._(r'syncCheckpoint.update'), + syncCheckpointDelete._(r'syncCheckpoint.delete'), + systemConfigRead._(r'systemConfig.read'), + systemConfigUpdate._(r'systemConfig.update'), + systemMetadataRead._(r'systemMetadata.read'), + systemMetadataUpdate._(r'systemMetadata.update'), + tagCreate._(r'tag.create'), + tagRead._(r'tag.read'), + tagUpdate._(r'tag.update'), + tagDelete._(r'tag.delete'), + tagAsset._(r'tag.asset'), + userRead._(r'user.read'), + userUpdate._(r'user.update'), + userLicenseCreate._(r'userLicense.create'), + userLicenseRead._(r'userLicense.read'), + userLicenseUpdate._(r'userLicense.update'), + userLicenseDelete._(r'userLicense.delete'), + userOnboardingRead._(r'userOnboarding.read'), + userOnboardingUpdate._(r'userOnboarding.update'), + userOnboardingDelete._(r'userOnboarding.delete'), + userPreferenceRead._(r'userPreference.read'), + userPreferenceUpdate._(r'userPreference.update'), + userProfileImageCreate._(r'userProfileImage.create'), + userProfileImageRead._(r'userProfileImage.read'), + userProfileImageUpdate._(r'userProfileImage.update'), + userProfileImageDelete._(r'userProfileImage.delete'), + queueRead._(r'queue.read'), + queueUpdate._(r'queue.update'), + queueJobCreate._(r'queueJob.create'), + queueJobRead._(r'queueJob.read'), + queueJobUpdate._(r'queueJob.update'), + queueJobDelete._(r'queueJob.delete'), + workflowCreate._(r'workflow.create'), + workflowRead._(r'workflow.read'), + workflowUpdate._(r'workflow.update'), + workflowDelete._(r'workflow.delete'), + adminUserCreate._(r'adminUser.create'), + adminUserRead._(r'adminUser.read'), + adminUserUpdate._(r'adminUser.update'), + adminUserDelete._(r'adminUser.delete'), + adminSessionRead._(r'adminSession.read'), + adminAuthUnlinkAll._(r'adminAuth.unlinkAll'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const Permission._(this.value); - /// The underlying value of this enum member. final String value; + static Permission? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const all = Permission._(r'all'); - static const activityPeriodCreate = Permission._(r'activity.create'); - static const activityPeriodRead = Permission._(r'activity.read'); - static const activityPeriodUpdate = Permission._(r'activity.update'); - static const activityPeriodDelete = Permission._(r'activity.delete'); - static const activityPeriodStatistics = Permission._(r'activity.statistics'); - static const apiKeyPeriodCreate = Permission._(r'apiKey.create'); - static const apiKeyPeriodRead = Permission._(r'apiKey.read'); - static const apiKeyPeriodUpdate = Permission._(r'apiKey.update'); - static const apiKeyPeriodDelete = Permission._(r'apiKey.delete'); - static const assetPeriodRead = Permission._(r'asset.read'); - static const assetPeriodUpdate = Permission._(r'asset.update'); - static const assetPeriodDelete = Permission._(r'asset.delete'); - static const assetPeriodStatistics = Permission._(r'asset.statistics'); - static const assetPeriodShare = Permission._(r'asset.share'); - static const assetPeriodView = Permission._(r'asset.view'); - static const assetPeriodDownload = Permission._(r'asset.download'); - static const assetPeriodUpload = Permission._(r'asset.upload'); - static const assetPeriodCopy = Permission._(r'asset.copy'); - static const assetPeriodDerive = Permission._(r'asset.derive'); - static const assetPeriodEditPeriodGet = Permission._(r'asset.edit.get'); - static const assetPeriodEditPeriodCreate = Permission._(r'asset.edit.create'); - static const assetPeriodEditPeriodDelete = Permission._(r'asset.edit.delete'); - static const albumPeriodCreate = Permission._(r'album.create'); - static const albumPeriodRead = Permission._(r'album.read'); - static const albumPeriodUpdate = Permission._(r'album.update'); - static const albumPeriodDelete = Permission._(r'album.delete'); - static const albumPeriodStatistics = Permission._(r'album.statistics'); - static const albumPeriodShare = Permission._(r'album.share'); - static const albumPeriodDownload = Permission._(r'album.download'); - static const albumAssetPeriodCreate = Permission._(r'albumAsset.create'); - static const albumAssetPeriodDelete = Permission._(r'albumAsset.delete'); - static const albumUserPeriodCreate = Permission._(r'albumUser.create'); - static const albumUserPeriodUpdate = Permission._(r'albumUser.update'); - static const albumUserPeriodDelete = Permission._(r'albumUser.delete'); - static const authPeriodChangePassword = Permission._(r'auth.changePassword'); - static const authDevicePeriodDelete = Permission._(r'authDevice.delete'); - static const archivePeriodRead = Permission._(r'archive.read'); - static const backupPeriodList = Permission._(r'backup.list'); - static const backupPeriodDownload = Permission._(r'backup.download'); - static const backupPeriodUpload = Permission._(r'backup.upload'); - static const backupPeriodDelete = Permission._(r'backup.delete'); - static const duplicatePeriodRead = Permission._(r'duplicate.read'); - static const duplicatePeriodDelete = Permission._(r'duplicate.delete'); - static const facePeriodCreate = Permission._(r'face.create'); - static const facePeriodRead = Permission._(r'face.read'); - static const facePeriodUpdate = Permission._(r'face.update'); - static const facePeriodDelete = Permission._(r'face.delete'); - static const folderPeriodRead = Permission._(r'folder.read'); - static const jobPeriodCreate = Permission._(r'job.create'); - static const jobPeriodRead = Permission._(r'job.read'); - static const libraryPeriodCreate = Permission._(r'library.create'); - static const libraryPeriodRead = Permission._(r'library.read'); - static const libraryPeriodUpdate = Permission._(r'library.update'); - static const libraryPeriodDelete = Permission._(r'library.delete'); - static const libraryPeriodStatistics = Permission._(r'library.statistics'); - static const timelinePeriodRead = Permission._(r'timeline.read'); - static const timelinePeriodDownload = Permission._(r'timeline.download'); - static const maintenance = Permission._(r'maintenance'); - static const mapPeriodRead = Permission._(r'map.read'); - static const mapPeriodSearch = Permission._(r'map.search'); - static const memoryPeriodCreate = Permission._(r'memory.create'); - static const memoryPeriodRead = Permission._(r'memory.read'); - static const memoryPeriodUpdate = Permission._(r'memory.update'); - static const memoryPeriodDelete = Permission._(r'memory.delete'); - static const memoryPeriodStatistics = Permission._(r'memory.statistics'); - static const memoryAssetPeriodCreate = Permission._(r'memoryAsset.create'); - static const memoryAssetPeriodDelete = Permission._(r'memoryAsset.delete'); - static const notificationPeriodCreate = Permission._(r'notification.create'); - static const notificationPeriodRead = Permission._(r'notification.read'); - static const notificationPeriodUpdate = Permission._(r'notification.update'); - static const notificationPeriodDelete = Permission._(r'notification.delete'); - static const partnerPeriodCreate = Permission._(r'partner.create'); - static const partnerPeriodRead = Permission._(r'partner.read'); - static const partnerPeriodUpdate = Permission._(r'partner.update'); - static const partnerPeriodDelete = Permission._(r'partner.delete'); - static const personPeriodCreate = Permission._(r'person.create'); - static const personPeriodRead = Permission._(r'person.read'); - static const personPeriodUpdate = Permission._(r'person.update'); - static const personPeriodDelete = Permission._(r'person.delete'); - static const personPeriodStatistics = Permission._(r'person.statistics'); - static const personPeriodMerge = Permission._(r'person.merge'); - static const personPeriodReassign = Permission._(r'person.reassign'); - static const pinCodePeriodCreate = Permission._(r'pinCode.create'); - static const pinCodePeriodUpdate = Permission._(r'pinCode.update'); - static const pinCodePeriodDelete = Permission._(r'pinCode.delete'); - static const pluginPeriodCreate = Permission._(r'plugin.create'); - static const pluginPeriodRead = Permission._(r'plugin.read'); - static const pluginPeriodUpdate = Permission._(r'plugin.update'); - static const pluginPeriodDelete = Permission._(r'plugin.delete'); - static const serverPeriodAbout = Permission._(r'server.about'); - static const serverPeriodApkLinks = Permission._(r'server.apkLinks'); - static const serverPeriodStorage = Permission._(r'server.storage'); - static const serverPeriodStatistics = Permission._(r'server.statistics'); - static const serverPeriodVersionCheck = Permission._(r'server.versionCheck'); - static const serverLicensePeriodRead = Permission._(r'serverLicense.read'); - static const serverLicensePeriodUpdate = Permission._(r'serverLicense.update'); - static const serverLicensePeriodDelete = Permission._(r'serverLicense.delete'); - static const sessionPeriodCreate = Permission._(r'session.create'); - static const sessionPeriodRead = Permission._(r'session.read'); - static const sessionPeriodUpdate = Permission._(r'session.update'); - static const sessionPeriodDelete = Permission._(r'session.delete'); - static const sessionPeriodLock = Permission._(r'session.lock'); - static const sharedLinkPeriodCreate = Permission._(r'sharedLink.create'); - static const sharedLinkPeriodRead = Permission._(r'sharedLink.read'); - static const sharedLinkPeriodUpdate = Permission._(r'sharedLink.update'); - static const sharedLinkPeriodDelete = Permission._(r'sharedLink.delete'); - static const stackPeriodCreate = Permission._(r'stack.create'); - static const stackPeriodRead = Permission._(r'stack.read'); - static const stackPeriodUpdate = Permission._(r'stack.update'); - static const stackPeriodDelete = Permission._(r'stack.delete'); - static const syncPeriodStream = Permission._(r'sync.stream'); - static const syncCheckpointPeriodRead = Permission._(r'syncCheckpoint.read'); - static const syncCheckpointPeriodUpdate = Permission._(r'syncCheckpoint.update'); - static const syncCheckpointPeriodDelete = Permission._(r'syncCheckpoint.delete'); - static const systemConfigPeriodRead = Permission._(r'systemConfig.read'); - static const systemConfigPeriodUpdate = Permission._(r'systemConfig.update'); - static const systemMetadataPeriodRead = Permission._(r'systemMetadata.read'); - static const systemMetadataPeriodUpdate = Permission._(r'systemMetadata.update'); - static const tagPeriodCreate = Permission._(r'tag.create'); - static const tagPeriodRead = Permission._(r'tag.read'); - static const tagPeriodUpdate = Permission._(r'tag.update'); - static const tagPeriodDelete = Permission._(r'tag.delete'); - static const tagPeriodAsset = Permission._(r'tag.asset'); - static const userPeriodRead = Permission._(r'user.read'); - static const userPeriodUpdate = Permission._(r'user.update'); - static const userLicensePeriodCreate = Permission._(r'userLicense.create'); - static const userLicensePeriodRead = Permission._(r'userLicense.read'); - static const userLicensePeriodUpdate = Permission._(r'userLicense.update'); - static const userLicensePeriodDelete = Permission._(r'userLicense.delete'); - static const userOnboardingPeriodRead = Permission._(r'userOnboarding.read'); - static const userOnboardingPeriodUpdate = Permission._(r'userOnboarding.update'); - static const userOnboardingPeriodDelete = Permission._(r'userOnboarding.delete'); - static const userPreferencePeriodRead = Permission._(r'userPreference.read'); - static const userPreferencePeriodUpdate = Permission._(r'userPreference.update'); - static const userProfileImagePeriodCreate = Permission._(r'userProfileImage.create'); - static const userProfileImagePeriodRead = Permission._(r'userProfileImage.read'); - static const userProfileImagePeriodUpdate = Permission._(r'userProfileImage.update'); - static const userProfileImagePeriodDelete = Permission._(r'userProfileImage.delete'); - static const queuePeriodRead = Permission._(r'queue.read'); - static const queuePeriodUpdate = Permission._(r'queue.update'); - static const queueJobPeriodCreate = Permission._(r'queueJob.create'); - static const queueJobPeriodRead = Permission._(r'queueJob.read'); - static const queueJobPeriodUpdate = Permission._(r'queueJob.update'); - static const queueJobPeriodDelete = Permission._(r'queueJob.delete'); - static const workflowPeriodCreate = Permission._(r'workflow.create'); - static const workflowPeriodRead = Permission._(r'workflow.read'); - static const workflowPeriodUpdate = Permission._(r'workflow.update'); - static const workflowPeriodDelete = Permission._(r'workflow.delete'); - static const adminUserPeriodCreate = Permission._(r'adminUser.create'); - static const adminUserPeriodRead = Permission._(r'adminUser.read'); - static const adminUserPeriodUpdate = Permission._(r'adminUser.update'); - static const adminUserPeriodDelete = Permission._(r'adminUser.delete'); - static const adminSessionPeriodRead = Permission._(r'adminSession.read'); - static const adminAuthPeriodUnlinkAll = Permission._(r'adminAuth.unlinkAll'); - - /// List of all possible values in this [enum][Permission]. - static const values = [ - all, - activityPeriodCreate, - activityPeriodRead, - activityPeriodUpdate, - activityPeriodDelete, - activityPeriodStatistics, - apiKeyPeriodCreate, - apiKeyPeriodRead, - apiKeyPeriodUpdate, - apiKeyPeriodDelete, - assetPeriodRead, - assetPeriodUpdate, - assetPeriodDelete, - assetPeriodStatistics, - assetPeriodShare, - assetPeriodView, - assetPeriodDownload, - assetPeriodUpload, - assetPeriodCopy, - assetPeriodDerive, - assetPeriodEditPeriodGet, - assetPeriodEditPeriodCreate, - assetPeriodEditPeriodDelete, - albumPeriodCreate, - albumPeriodRead, - albumPeriodUpdate, - albumPeriodDelete, - albumPeriodStatistics, - albumPeriodShare, - albumPeriodDownload, - albumAssetPeriodCreate, - albumAssetPeriodDelete, - albumUserPeriodCreate, - albumUserPeriodUpdate, - albumUserPeriodDelete, - authPeriodChangePassword, - authDevicePeriodDelete, - archivePeriodRead, - backupPeriodList, - backupPeriodDownload, - backupPeriodUpload, - backupPeriodDelete, - duplicatePeriodRead, - duplicatePeriodDelete, - facePeriodCreate, - facePeriodRead, - facePeriodUpdate, - facePeriodDelete, - folderPeriodRead, - jobPeriodCreate, - jobPeriodRead, - libraryPeriodCreate, - libraryPeriodRead, - libraryPeriodUpdate, - libraryPeriodDelete, - libraryPeriodStatistics, - timelinePeriodRead, - timelinePeriodDownload, - maintenance, - mapPeriodRead, - mapPeriodSearch, - memoryPeriodCreate, - memoryPeriodRead, - memoryPeriodUpdate, - memoryPeriodDelete, - memoryPeriodStatistics, - memoryAssetPeriodCreate, - memoryAssetPeriodDelete, - notificationPeriodCreate, - notificationPeriodRead, - notificationPeriodUpdate, - notificationPeriodDelete, - partnerPeriodCreate, - partnerPeriodRead, - partnerPeriodUpdate, - partnerPeriodDelete, - personPeriodCreate, - personPeriodRead, - personPeriodUpdate, - personPeriodDelete, - personPeriodStatistics, - personPeriodMerge, - personPeriodReassign, - pinCodePeriodCreate, - pinCodePeriodUpdate, - pinCodePeriodDelete, - pluginPeriodCreate, - pluginPeriodRead, - pluginPeriodUpdate, - pluginPeriodDelete, - serverPeriodAbout, - serverPeriodApkLinks, - serverPeriodStorage, - serverPeriodStatistics, - serverPeriodVersionCheck, - serverLicensePeriodRead, - serverLicensePeriodUpdate, - serverLicensePeriodDelete, - sessionPeriodCreate, - sessionPeriodRead, - sessionPeriodUpdate, - sessionPeriodDelete, - sessionPeriodLock, - sharedLinkPeriodCreate, - sharedLinkPeriodRead, - sharedLinkPeriodUpdate, - sharedLinkPeriodDelete, - stackPeriodCreate, - stackPeriodRead, - stackPeriodUpdate, - stackPeriodDelete, - syncPeriodStream, - syncCheckpointPeriodRead, - syncCheckpointPeriodUpdate, - syncCheckpointPeriodDelete, - systemConfigPeriodRead, - systemConfigPeriodUpdate, - systemMetadataPeriodRead, - systemMetadataPeriodUpdate, - tagPeriodCreate, - tagPeriodRead, - tagPeriodUpdate, - tagPeriodDelete, - tagPeriodAsset, - userPeriodRead, - userPeriodUpdate, - userLicensePeriodCreate, - userLicensePeriodRead, - userLicensePeriodUpdate, - userLicensePeriodDelete, - userOnboardingPeriodRead, - userOnboardingPeriodUpdate, - userOnboardingPeriodDelete, - userPreferencePeriodRead, - userPreferencePeriodUpdate, - userProfileImagePeriodCreate, - userProfileImagePeriodRead, - userProfileImagePeriodUpdate, - userProfileImagePeriodDelete, - queuePeriodRead, - queuePeriodUpdate, - queueJobPeriodCreate, - queueJobPeriodRead, - queueJobPeriodUpdate, - queueJobPeriodDelete, - workflowPeriodCreate, - workflowPeriodRead, - workflowPeriodUpdate, - workflowPeriodDelete, - adminUserPeriodCreate, - adminUserPeriodRead, - adminUserPeriodUpdate, - adminUserPeriodDelete, - adminSessionPeriodRead, - adminAuthPeriodUnlinkAll, - ]; - - static Permission? fromJson(dynamic value) => PermissionTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = Permission.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [Permission] to String, -/// and [decode] dynamic data back to [Permission]. -class PermissionTypeTransformer { - factory PermissionTypeTransformer() => _instance ??= const PermissionTypeTransformer._(); - - const PermissionTypeTransformer._(); - - String encode(Permission data) => data.value; - - /// Decodes a [dynamic value][data] to a Permission. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - Permission? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'all': return Permission.all; - case r'activity.create': return Permission.activityPeriodCreate; - case r'activity.read': return Permission.activityPeriodRead; - case r'activity.update': return Permission.activityPeriodUpdate; - case r'activity.delete': return Permission.activityPeriodDelete; - case r'activity.statistics': return Permission.activityPeriodStatistics; - case r'apiKey.create': return Permission.apiKeyPeriodCreate; - case r'apiKey.read': return Permission.apiKeyPeriodRead; - case r'apiKey.update': return Permission.apiKeyPeriodUpdate; - case r'apiKey.delete': return Permission.apiKeyPeriodDelete; - case r'asset.read': return Permission.assetPeriodRead; - case r'asset.update': return Permission.assetPeriodUpdate; - case r'asset.delete': return Permission.assetPeriodDelete; - case r'asset.statistics': return Permission.assetPeriodStatistics; - case r'asset.share': return Permission.assetPeriodShare; - case r'asset.view': return Permission.assetPeriodView; - case r'asset.download': return Permission.assetPeriodDownload; - case r'asset.upload': return Permission.assetPeriodUpload; - case r'asset.copy': return Permission.assetPeriodCopy; - case r'asset.derive': return Permission.assetPeriodDerive; - case r'asset.edit.get': return Permission.assetPeriodEditPeriodGet; - case r'asset.edit.create': return Permission.assetPeriodEditPeriodCreate; - case r'asset.edit.delete': return Permission.assetPeriodEditPeriodDelete; - case r'album.create': return Permission.albumPeriodCreate; - case r'album.read': return Permission.albumPeriodRead; - case r'album.update': return Permission.albumPeriodUpdate; - case r'album.delete': return Permission.albumPeriodDelete; - case r'album.statistics': return Permission.albumPeriodStatistics; - case r'album.share': return Permission.albumPeriodShare; - case r'album.download': return Permission.albumPeriodDownload; - case r'albumAsset.create': return Permission.albumAssetPeriodCreate; - case r'albumAsset.delete': return Permission.albumAssetPeriodDelete; - case r'albumUser.create': return Permission.albumUserPeriodCreate; - case r'albumUser.update': return Permission.albumUserPeriodUpdate; - case r'albumUser.delete': return Permission.albumUserPeriodDelete; - case r'auth.changePassword': return Permission.authPeriodChangePassword; - case r'authDevice.delete': return Permission.authDevicePeriodDelete; - case r'archive.read': return Permission.archivePeriodRead; - case r'backup.list': return Permission.backupPeriodList; - case r'backup.download': return Permission.backupPeriodDownload; - case r'backup.upload': return Permission.backupPeriodUpload; - case r'backup.delete': return Permission.backupPeriodDelete; - case r'duplicate.read': return Permission.duplicatePeriodRead; - case r'duplicate.delete': return Permission.duplicatePeriodDelete; - case r'face.create': return Permission.facePeriodCreate; - case r'face.read': return Permission.facePeriodRead; - case r'face.update': return Permission.facePeriodUpdate; - case r'face.delete': return Permission.facePeriodDelete; - case r'folder.read': return Permission.folderPeriodRead; - case r'job.create': return Permission.jobPeriodCreate; - case r'job.read': return Permission.jobPeriodRead; - case r'library.create': return Permission.libraryPeriodCreate; - case r'library.read': return Permission.libraryPeriodRead; - case r'library.update': return Permission.libraryPeriodUpdate; - case r'library.delete': return Permission.libraryPeriodDelete; - case r'library.statistics': return Permission.libraryPeriodStatistics; - case r'timeline.read': return Permission.timelinePeriodRead; - case r'timeline.download': return Permission.timelinePeriodDownload; - case r'maintenance': return Permission.maintenance; - case r'map.read': return Permission.mapPeriodRead; - case r'map.search': return Permission.mapPeriodSearch; - case r'memory.create': return Permission.memoryPeriodCreate; - case r'memory.read': return Permission.memoryPeriodRead; - case r'memory.update': return Permission.memoryPeriodUpdate; - case r'memory.delete': return Permission.memoryPeriodDelete; - case r'memory.statistics': return Permission.memoryPeriodStatistics; - case r'memoryAsset.create': return Permission.memoryAssetPeriodCreate; - case r'memoryAsset.delete': return Permission.memoryAssetPeriodDelete; - case r'notification.create': return Permission.notificationPeriodCreate; - case r'notification.read': return Permission.notificationPeriodRead; - case r'notification.update': return Permission.notificationPeriodUpdate; - case r'notification.delete': return Permission.notificationPeriodDelete; - case r'partner.create': return Permission.partnerPeriodCreate; - case r'partner.read': return Permission.partnerPeriodRead; - case r'partner.update': return Permission.partnerPeriodUpdate; - case r'partner.delete': return Permission.partnerPeriodDelete; - case r'person.create': return Permission.personPeriodCreate; - case r'person.read': return Permission.personPeriodRead; - case r'person.update': return Permission.personPeriodUpdate; - case r'person.delete': return Permission.personPeriodDelete; - case r'person.statistics': return Permission.personPeriodStatistics; - case r'person.merge': return Permission.personPeriodMerge; - case r'person.reassign': return Permission.personPeriodReassign; - case r'pinCode.create': return Permission.pinCodePeriodCreate; - case r'pinCode.update': return Permission.pinCodePeriodUpdate; - case r'pinCode.delete': return Permission.pinCodePeriodDelete; - case r'plugin.create': return Permission.pluginPeriodCreate; - case r'plugin.read': return Permission.pluginPeriodRead; - case r'plugin.update': return Permission.pluginPeriodUpdate; - case r'plugin.delete': return Permission.pluginPeriodDelete; - case r'server.about': return Permission.serverPeriodAbout; - case r'server.apkLinks': return Permission.serverPeriodApkLinks; - case r'server.storage': return Permission.serverPeriodStorage; - case r'server.statistics': return Permission.serverPeriodStatistics; - case r'server.versionCheck': return Permission.serverPeriodVersionCheck; - case r'serverLicense.read': return Permission.serverLicensePeriodRead; - case r'serverLicense.update': return Permission.serverLicensePeriodUpdate; - case r'serverLicense.delete': return Permission.serverLicensePeriodDelete; - case r'session.create': return Permission.sessionPeriodCreate; - case r'session.read': return Permission.sessionPeriodRead; - case r'session.update': return Permission.sessionPeriodUpdate; - case r'session.delete': return Permission.sessionPeriodDelete; - case r'session.lock': return Permission.sessionPeriodLock; - case r'sharedLink.create': return Permission.sharedLinkPeriodCreate; - case r'sharedLink.read': return Permission.sharedLinkPeriodRead; - case r'sharedLink.update': return Permission.sharedLinkPeriodUpdate; - case r'sharedLink.delete': return Permission.sharedLinkPeriodDelete; - case r'stack.create': return Permission.stackPeriodCreate; - case r'stack.read': return Permission.stackPeriodRead; - case r'stack.update': return Permission.stackPeriodUpdate; - case r'stack.delete': return Permission.stackPeriodDelete; - case r'sync.stream': return Permission.syncPeriodStream; - case r'syncCheckpoint.read': return Permission.syncCheckpointPeriodRead; - case r'syncCheckpoint.update': return Permission.syncCheckpointPeriodUpdate; - case r'syncCheckpoint.delete': return Permission.syncCheckpointPeriodDelete; - case r'systemConfig.read': return Permission.systemConfigPeriodRead; - case r'systemConfig.update': return Permission.systemConfigPeriodUpdate; - case r'systemMetadata.read': return Permission.systemMetadataPeriodRead; - case r'systemMetadata.update': return Permission.systemMetadataPeriodUpdate; - case r'tag.create': return Permission.tagPeriodCreate; - case r'tag.read': return Permission.tagPeriodRead; - case r'tag.update': return Permission.tagPeriodUpdate; - case r'tag.delete': return Permission.tagPeriodDelete; - case r'tag.asset': return Permission.tagPeriodAsset; - case r'user.read': return Permission.userPeriodRead; - case r'user.update': return Permission.userPeriodUpdate; - case r'userLicense.create': return Permission.userLicensePeriodCreate; - case r'userLicense.read': return Permission.userLicensePeriodRead; - case r'userLicense.update': return Permission.userLicensePeriodUpdate; - case r'userLicense.delete': return Permission.userLicensePeriodDelete; - case r'userOnboarding.read': return Permission.userOnboardingPeriodRead; - case r'userOnboarding.update': return Permission.userOnboardingPeriodUpdate; - case r'userOnboarding.delete': return Permission.userOnboardingPeriodDelete; - case r'userPreference.read': return Permission.userPreferencePeriodRead; - case r'userPreference.update': return Permission.userPreferencePeriodUpdate; - case r'userProfileImage.create': return Permission.userProfileImagePeriodCreate; - case r'userProfileImage.read': return Permission.userProfileImagePeriodRead; - case r'userProfileImage.update': return Permission.userProfileImagePeriodUpdate; - case r'userProfileImage.delete': return Permission.userProfileImagePeriodDelete; - case r'queue.read': return Permission.queuePeriodRead; - case r'queue.update': return Permission.queuePeriodUpdate; - case r'queueJob.create': return Permission.queueJobPeriodCreate; - case r'queueJob.read': return Permission.queueJobPeriodRead; - case r'queueJob.update': return Permission.queueJobPeriodUpdate; - case r'queueJob.delete': return Permission.queueJobPeriodDelete; - case r'workflow.create': return Permission.workflowPeriodCreate; - case r'workflow.read': return Permission.workflowPeriodRead; - case r'workflow.update': return Permission.workflowPeriodUpdate; - case r'workflow.delete': return Permission.workflowPeriodDelete; - case r'adminUser.create': return Permission.adminUserPeriodCreate; - case r'adminUser.read': return Permission.adminUserPeriodRead; - case r'adminUser.update': return Permission.adminUserPeriodUpdate; - case r'adminUser.delete': return Permission.adminUserPeriodDelete; - case r'adminSession.read': return Permission.adminSessionPeriodRead; - case r'adminAuth.unlinkAll': return Permission.adminAuthPeriodUnlinkAll; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [PermissionTypeTransformer] instance. - static PermissionTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/person_create_dto.dart b/mobile/openapi/lib/model/person_create_dto.dart index f2ba702c2f..833be2ee0e 100644 --- a/mobile/openapi/lib/model/person_create_dto.dart +++ b/mobile/openapi/lib/model/person_create_dto.dart @@ -1,169 +1,101 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PersonCreateDto { - /// Returns a new [PersonCreateDto] instance. - PersonCreateDto({ - this.birthDate, - this.color, - this.isFavorite, - this.isHidden, - this.name, +final class PersonCreateDto { + const PersonCreateDto({ + this.birthDate = const Optional.absent(), + this.color = const Optional.absent(), + this.isFavorite = const Optional.absent(), + this.isHidden = const Optional.absent(), + this.name = const Optional.absent(), }); /// Person date of birth - DateTime? birthDate; + final Optional birthDate; /// Person color (hex) - String? color; + final Optional color; /// Mark as favorite - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isFavorite; + final Optional isFavorite; /// Person visibility (hidden) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isHidden; + final Optional isHidden; /// Person name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? name; + final Optional name; - @override - bool operator ==(Object other) => identical(this, other) || other is PersonCreateDto && - other.birthDate == birthDate && - other.color == color && - other.isFavorite == isFavorite && - other.isHidden == isHidden && - other.name == name; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (birthDate == null ? 0 : birthDate!.hashCode) + - (color == null ? 0 : color!.hashCode) + - (isFavorite == null ? 0 : isFavorite!.hashCode) + - (isHidden == null ? 0 : isHidden!.hashCode) + - (name == null ? 0 : name!.hashCode); - - @override - String toString() => 'PersonCreateDto[birthDate=$birthDate, color=$color, isFavorite=$isFavorite, isHidden=$isHidden, name=$name]'; + static PersonCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + birthDate: json.containsKey(r'birthDate') + ? Optional.present((json[r'birthDate'] == null ? null : DateTime.parse(json[r'birthDate'] as String))) + : const Optional.absent(), + color: json.containsKey(r'color') ? Optional.present((json[r'color'] as String?)) : const Optional.absent(), + isFavorite: json.containsKey(r'isFavorite') + ? Optional.present(json[r'isFavorite'] as bool) + : const Optional.absent(), + isHidden: json.containsKey(r'isHidden') ? Optional.present(json[r'isHidden'] as bool) : const Optional.absent(), + name: json.containsKey(r'name') ? Optional.present(json[r'name'] as String) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.birthDate != null) { - json[r'birthDate'] = _dateFormatter.format(this.birthDate!.toUtc()); - } else { - // json[r'birthDate'] = null; + if (birthDate case Present(:final value)) { + json[r'birthDate'] = value?.toUtc().toIso8601String(); } - if (this.color != null) { - json[r'color'] = this.color; - } else { - // json[r'color'] = null; + if (color case Present(:final value)) { + json[r'color'] = value; } - if (this.isFavorite != null) { - json[r'isFavorite'] = this.isFavorite; - } else { - // json[r'isFavorite'] = null; + if (isFavorite case Present(:final value)) { + json[r'isFavorite'] = value; } - if (this.isHidden != null) { - json[r'isHidden'] = this.isHidden; - } else { - // json[r'isHidden'] = null; + if (isHidden case Present(:final value)) { + json[r'isHidden'] = value; } - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (name case Present(:final value)) { + json[r'name'] = value; } return json; } - /// Returns a new [PersonCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PersonCreateDto? fromJson(dynamic value) { - upgradeDto(value, "PersonCreateDto"); - if (value is Map) { - final json = value.cast(); - - return PersonCreateDto( - birthDate: mapDateTime(json, r'birthDate', r''), - color: mapValueOfType(json, r'color'), - isFavorite: mapValueOfType(json, r'isFavorite'), - isHidden: mapValueOfType(json, r'isHidden'), - name: mapValueOfType(json, r'name'), - ); - } - return null; + PersonCreateDto copyWith({ + Optional? birthDate, + Optional? color, + Optional? isFavorite, + Optional? isHidden, + Optional? name, + }) { + return .new( + birthDate: birthDate ?? this.birthDate, + color: color ?? this.color, + isFavorite: isFavorite ?? this.isFavorite, + isHidden: isHidden ?? this.isHidden, + name: name ?? this.name, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PersonCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PersonCreateDto && + birthDate == other.birthDate && + color == other.color && + isFavorite == other.isFavorite && + isHidden == other.isHidden && + name == other.name); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PersonCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([birthDate, color, isFavorite, isHidden, name]); } - // maps a json object with a list of PersonCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PersonCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'PersonCreateDto(birthDate=$birthDate, color=$color, isFavorite=$isFavorite, isHidden=$isHidden, name=$name)'; } - diff --git a/mobile/openapi/lib/model/person_response_dto.dart b/mobile/openapi/lib/model/person_response_dto.dart index 455dfb98d6..e2f55d192e 100644 --- a/mobile/openapi/lib/model/person_response_dto.dart +++ b/mobile/openapi/lib/model/person_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PersonResponseDto { - /// Returns a new [PersonResponseDto] instance. - PersonResponseDto({ +final class PersonResponseDto { + const PersonResponseDto({ required this.birthDate, this.color, required this.id, @@ -24,171 +15,125 @@ class PersonResponseDto { }); /// Person date of birth - DateTime? birthDate; + final DateTime? birthDate; /// Person color (hex) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? color; + /// Available since server v1.126.0. + final String? color; /// Person ID - String id; + final String id; /// Is favorite - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isFavorite; + /// Available since server v1.126.0. + final bool? isFavorite; /// Is hidden - bool isHidden; + final bool isHidden; /// Person name - String name; + final String name; /// Thumbnail path - String thumbnailPath; + final String thumbnailPath; /// Last update date - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? updatedAt; + /// Available since server v1.107.0. + final DateTime? updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is PersonResponseDto && - other.birthDate == birthDate && - other.color == color && - other.id == id && - other.isFavorite == isFavorite && - other.isHidden == isHidden && - other.name == name && - other.thumbnailPath == thumbnailPath && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (birthDate == null ? 0 : birthDate!.hashCode) + - (color == null ? 0 : color!.hashCode) + - (id.hashCode) + - (isFavorite == null ? 0 : isFavorite!.hashCode) + - (isHidden.hashCode) + - (name.hashCode) + - (thumbnailPath.hashCode) + - (updatedAt == null ? 0 : updatedAt!.hashCode); + static const ApiVersion colorAddedIn = .new(1, 126, 0); - @override - String toString() => 'PersonResponseDto[birthDate=$birthDate, color=$color, id=$id, isFavorite=$isFavorite, isHidden=$isHidden, name=$name, thumbnailPath=$thumbnailPath, updatedAt=$updatedAt]'; + static const ApiState colorState = .stable; + + static const ApiVersion isFavoriteAddedIn = .new(1, 126, 0); + + static const ApiState isFavoriteState = .stable; + + static const ApiVersion updatedAtAddedIn = .new(1, 107, 0); + + static const ApiState updatedAtState = .stable; + + static PersonResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + birthDate: (json[r'birthDate'] == null ? null : DateTime.parse(json[r'birthDate'] as String)), + color: (json[r'color'] as String?), + id: json[r'id'] as String, + isFavorite: (json[r'isFavorite'] as bool?), + isHidden: json[r'isHidden'] as bool, + name: json[r'name'] as String, + thumbnailPath: json[r'thumbnailPath'] as String, + updatedAt: (json[r'updatedAt'] == null ? null : DateTime.parse(json[r'updatedAt'] as String)), + ); + } Map toJson() { final json = {}; - if (this.birthDate != null) { - json[r'birthDate'] = _dateFormatter.format(this.birthDate!.toUtc()); - } else { - // json[r'birthDate'] = null; + if (birthDate != null) { + json[r'birthDate'] = birthDate!.toUtc().toIso8601String(); } - if (this.color != null) { - json[r'color'] = this.color; - } else { - // json[r'color'] = null; + if (color != null) { + json[r'color'] = color!; } - json[r'id'] = this.id; - if (this.isFavorite != null) { - json[r'isFavorite'] = this.isFavorite; - } else { - // json[r'isFavorite'] = null; + json[r'id'] = id; + if (isFavorite != null) { + json[r'isFavorite'] = isFavorite!; } - json[r'isHidden'] = this.isHidden; - json[r'name'] = this.name; - json[r'thumbnailPath'] = this.thumbnailPath; - if (this.updatedAt != null) { - json[r'updatedAt'] = this.updatedAt!.toUtc().toIso8601String(); - } else { - // json[r'updatedAt'] = null; + json[r'isHidden'] = isHidden; + json[r'name'] = name; + json[r'thumbnailPath'] = thumbnailPath; + if (updatedAt != null) { + json[r'updatedAt'] = updatedAt!.toUtc().toIso8601String(); } return json; } - /// Returns a new [PersonResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PersonResponseDto? fromJson(dynamic value) { - upgradeDto(value, "PersonResponseDto"); - if (value is Map) { - final json = value.cast(); - - return PersonResponseDto( - birthDate: mapDateTime(json, r'birthDate', r''), - color: mapValueOfType(json, r'color'), - id: mapValueOfType(json, r'id')!, - isFavorite: mapValueOfType(json, r'isFavorite'), - isHidden: mapValueOfType(json, r'isHidden')!, - name: mapValueOfType(json, r'name')!, - thumbnailPath: mapValueOfType(json, r'thumbnailPath')!, - updatedAt: mapDateTime(json, r'updatedAt', r''), - ); - } - return null; + PersonResponseDto copyWith({ + Object? birthDate = _undefined, + Object? color = _undefined, + String? id, + Object? isFavorite = _undefined, + bool? isHidden, + String? name, + String? thumbnailPath, + Object? updatedAt = _undefined, + }) { + return .new( + birthDate: identical(birthDate, _undefined) ? this.birthDate : birthDate as DateTime?, + color: identical(color, _undefined) ? this.color : color as String?, + id: id ?? this.id, + isFavorite: identical(isFavorite, _undefined) ? this.isFavorite : isFavorite as bool?, + isHidden: isHidden ?? this.isHidden, + name: name ?? this.name, + thumbnailPath: thumbnailPath ?? this.thumbnailPath, + updatedAt: identical(updatedAt, _undefined) ? this.updatedAt : updatedAt as DateTime?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PersonResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PersonResponseDto && + birthDate == other.birthDate && + color == other.color && + id == other.id && + isFavorite == other.isFavorite && + isHidden == other.isHidden && + name == other.name && + thumbnailPath == other.thumbnailPath && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PersonResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([birthDate, color, id, isFavorite, isHidden, name, thumbnailPath, updatedAt]); } - // maps a json object with a list of PersonResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PersonResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'birthDate', - 'id', - 'isHidden', - 'name', - 'thumbnailPath', - }; + @override + String toString() => + 'PersonResponseDto(birthDate=$birthDate, color=$color, id=$id, isFavorite=$isFavorite, isHidden=$isHidden, name=$name, thumbnailPath=$thumbnailPath, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/person_statistics_response_dto.dart b/mobile/openapi/lib/model/person_statistics_response_dto.dart index aeac16cc8a..d2a6145d0b 100644 --- a/mobile/openapi/lib/model/person_statistics_response_dto.dart +++ b/mobile/openapi/lib/model/person_statistics_response_dto.dart @@ -1,103 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PersonStatisticsResponseDto { - /// Returns a new [PersonStatisticsResponseDto] instance. - PersonStatisticsResponseDto({ - required this.assets, - }); +final class PersonStatisticsResponseDto { + const PersonStatisticsResponseDto({required this.assets}); /// Number of assets - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int assets; + final int assets; - @override - bool operator ==(Object other) => identical(this, other) || other is PersonStatisticsResponseDto && - other.assets == assets; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assets.hashCode); - - @override - String toString() => 'PersonStatisticsResponseDto[assets=$assets]'; + static PersonStatisticsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(assets: json[r'assets'] as int); + } Map toJson() { final json = {}; - json[r'assets'] = this.assets; + json[r'assets'] = assets; return json; } - /// Returns a new [PersonStatisticsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PersonStatisticsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "PersonStatisticsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return PersonStatisticsResponseDto( - assets: mapValueOfType(json, r'assets')!, - ); - } - return null; + PersonStatisticsResponseDto copyWith({int? assets}) { + return .new(assets: assets ?? this.assets); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PersonStatisticsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is PersonStatisticsResponseDto && assets == other.assets); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PersonStatisticsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assets]); } - // maps a json object with a list of PersonStatisticsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PersonStatisticsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assets', - }; + @override + String toString() => 'PersonStatisticsResponseDto(assets=$assets)'; } - diff --git a/mobile/openapi/lib/model/person_update_dto.dart b/mobile/openapi/lib/model/person_update_dto.dart index b56940e51d..cd7988b797 100644 --- a/mobile/openapi/lib/model/person_update_dto.dart +++ b/mobile/openapi/lib/model/person_update_dto.dart @@ -1,187 +1,114 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PersonUpdateDto { - /// Returns a new [PersonUpdateDto] instance. - PersonUpdateDto({ - this.birthDate, - this.color, - this.featureFaceAssetId, - this.isFavorite, - this.isHidden, - this.name, +final class PersonUpdateDto { + const PersonUpdateDto({ + this.birthDate = const Optional.absent(), + this.color = const Optional.absent(), + this.featureFaceAssetId = const Optional.absent(), + this.isFavorite = const Optional.absent(), + this.isHidden = const Optional.absent(), + this.name = const Optional.absent(), }); /// Person date of birth - DateTime? birthDate; + final Optional birthDate; /// Person color (hex) - String? color; + final Optional color; /// Asset ID used for feature face thumbnail - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? featureFaceAssetId; + final Optional featureFaceAssetId; /// Mark as favorite - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isFavorite; + final Optional isFavorite; /// Person visibility (hidden) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isHidden; + final Optional isHidden; /// Person name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? name; + final Optional name; - @override - bool operator ==(Object other) => identical(this, other) || other is PersonUpdateDto && - other.birthDate == birthDate && - other.color == color && - other.featureFaceAssetId == featureFaceAssetId && - other.isFavorite == isFavorite && - other.isHidden == isHidden && - other.name == name; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (birthDate == null ? 0 : birthDate!.hashCode) + - (color == null ? 0 : color!.hashCode) + - (featureFaceAssetId == null ? 0 : featureFaceAssetId!.hashCode) + - (isFavorite == null ? 0 : isFavorite!.hashCode) + - (isHidden == null ? 0 : isHidden!.hashCode) + - (name == null ? 0 : name!.hashCode); - - @override - String toString() => 'PersonUpdateDto[birthDate=$birthDate, color=$color, featureFaceAssetId=$featureFaceAssetId, isFavorite=$isFavorite, isHidden=$isHidden, name=$name]'; + static PersonUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + birthDate: json.containsKey(r'birthDate') + ? Optional.present((json[r'birthDate'] == null ? null : DateTime.parse(json[r'birthDate'] as String))) + : const Optional.absent(), + color: json.containsKey(r'color') ? Optional.present((json[r'color'] as String?)) : const Optional.absent(), + featureFaceAssetId: json.containsKey(r'featureFaceAssetId') + ? Optional.present(json[r'featureFaceAssetId'] as String) + : const Optional.absent(), + isFavorite: json.containsKey(r'isFavorite') + ? Optional.present(json[r'isFavorite'] as bool) + : const Optional.absent(), + isHidden: json.containsKey(r'isHidden') ? Optional.present(json[r'isHidden'] as bool) : const Optional.absent(), + name: json.containsKey(r'name') ? Optional.present(json[r'name'] as String) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.birthDate != null) { - json[r'birthDate'] = _dateFormatter.format(this.birthDate!.toUtc()); - } else { - // json[r'birthDate'] = null; + if (birthDate case Present(:final value)) { + json[r'birthDate'] = value?.toUtc().toIso8601String(); } - if (this.color != null) { - json[r'color'] = this.color; - } else { - // json[r'color'] = null; + if (color case Present(:final value)) { + json[r'color'] = value; } - if (this.featureFaceAssetId != null) { - json[r'featureFaceAssetId'] = this.featureFaceAssetId; - } else { - // json[r'featureFaceAssetId'] = null; + if (featureFaceAssetId case Present(:final value)) { + json[r'featureFaceAssetId'] = value; } - if (this.isFavorite != null) { - json[r'isFavorite'] = this.isFavorite; - } else { - // json[r'isFavorite'] = null; + if (isFavorite case Present(:final value)) { + json[r'isFavorite'] = value; } - if (this.isHidden != null) { - json[r'isHidden'] = this.isHidden; - } else { - // json[r'isHidden'] = null; + if (isHidden case Present(:final value)) { + json[r'isHidden'] = value; } - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (name case Present(:final value)) { + json[r'name'] = value; } return json; } - /// Returns a new [PersonUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PersonUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "PersonUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return PersonUpdateDto( - birthDate: mapDateTime(json, r'birthDate', r''), - color: mapValueOfType(json, r'color'), - featureFaceAssetId: mapValueOfType(json, r'featureFaceAssetId'), - isFavorite: mapValueOfType(json, r'isFavorite'), - isHidden: mapValueOfType(json, r'isHidden'), - name: mapValueOfType(json, r'name'), - ); - } - return null; + PersonUpdateDto copyWith({ + Optional? birthDate, + Optional? color, + Optional? featureFaceAssetId, + Optional? isFavorite, + Optional? isHidden, + Optional? name, + }) { + return .new( + birthDate: birthDate ?? this.birthDate, + color: color ?? this.color, + featureFaceAssetId: featureFaceAssetId ?? this.featureFaceAssetId, + isFavorite: isFavorite ?? this.isFavorite, + isHidden: isHidden ?? this.isHidden, + name: name ?? this.name, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PersonUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PersonUpdateDto && + birthDate == other.birthDate && + color == other.color && + featureFaceAssetId == other.featureFaceAssetId && + isFavorite == other.isFavorite && + isHidden == other.isHidden && + name == other.name); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PersonUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([birthDate, color, featureFaceAssetId, isFavorite, isHidden, name]); } - // maps a json object with a list of PersonUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PersonUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'PersonUpdateDto(birthDate=$birthDate, color=$color, featureFaceAssetId=$featureFaceAssetId, isFavorite=$isFavorite, isHidden=$isHidden, name=$name)'; } - diff --git a/mobile/openapi/lib/model/pin_code_change_dto.dart b/mobile/openapi/lib/model/pin_code_change_dto.dart index 068cc9e91b..eeda6d9a30 100644 --- a/mobile/openapi/lib/model/pin_code_change_dto.dart +++ b/mobile/openapi/lib/model/pin_code_change_dto.dart @@ -1,136 +1,68 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PinCodeChangeDto { - /// Returns a new [PinCodeChangeDto] instance. - PinCodeChangeDto({ +final class PinCodeChangeDto { + const PinCodeChangeDto({ required this.newPinCode, - this.password, - this.pinCode, + this.password = const Optional.absent(), + this.pinCode = const Optional.absent(), }); /// New PIN code (4-6 digits) - String newPinCode; + final String newPinCode; /// User password (required if PIN code is not provided) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? password; + final Optional password; /// New PIN code (4-6 digits) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? pinCode; + final Optional pinCode; - @override - bool operator ==(Object other) => identical(this, other) || other is PinCodeChangeDto && - other.newPinCode == newPinCode && - other.password == password && - other.pinCode == pinCode; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (newPinCode.hashCode) + - (password == null ? 0 : password!.hashCode) + - (pinCode == null ? 0 : pinCode!.hashCode); - - @override - String toString() => 'PinCodeChangeDto[newPinCode=$newPinCode, password=$password, pinCode=$pinCode]'; + static PinCodeChangeDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + newPinCode: json[r'newPinCode'] as String, + password: json.containsKey(r'password') ? Optional.present(json[r'password'] as String) : const Optional.absent(), + pinCode: json.containsKey(r'pinCode') ? Optional.present(json[r'pinCode'] as String) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'newPinCode'] = this.newPinCode; - if (this.password != null) { - json[r'password'] = this.password; - } else { - // json[r'password'] = null; + json[r'newPinCode'] = newPinCode; + if (password case Present(:final value)) { + json[r'password'] = value; } - if (this.pinCode != null) { - json[r'pinCode'] = this.pinCode; - } else { - // json[r'pinCode'] = null; + if (pinCode case Present(:final value)) { + json[r'pinCode'] = value; } return json; } - /// Returns a new [PinCodeChangeDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PinCodeChangeDto? fromJson(dynamic value) { - upgradeDto(value, "PinCodeChangeDto"); - if (value is Map) { - final json = value.cast(); - - return PinCodeChangeDto( - newPinCode: mapValueOfType(json, r'newPinCode')!, - password: mapValueOfType(json, r'password'), - pinCode: mapValueOfType(json, r'pinCode'), - ); - } - return null; + PinCodeChangeDto copyWith({String? newPinCode, Optional? password, Optional? pinCode}) { + return .new( + newPinCode: newPinCode ?? this.newPinCode, + password: password ?? this.password, + pinCode: pinCode ?? this.pinCode, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PinCodeChangeDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PinCodeChangeDto && + newPinCode == other.newPinCode && + password == other.password && + pinCode == other.pinCode); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PinCodeChangeDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([newPinCode, password, pinCode]); } - // maps a json object with a list of PinCodeChangeDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PinCodeChangeDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'newPinCode', - }; + @override + String toString() => 'PinCodeChangeDto(newPinCode=$newPinCode, password=$password, pinCode=$pinCode)'; } - diff --git a/mobile/openapi/lib/model/pin_code_reset_dto.dart b/mobile/openapi/lib/model/pin_code_reset_dto.dart index c37be76f18..18afe530e7 100644 --- a/mobile/openapi/lib/model/pin_code_reset_dto.dart +++ b/mobile/openapi/lib/model/pin_code_reset_dto.dart @@ -1,127 +1,52 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PinCodeResetDto { - /// Returns a new [PinCodeResetDto] instance. - PinCodeResetDto({ - this.password, - this.pinCode, - }); +final class PinCodeResetDto { + const PinCodeResetDto({this.password = const Optional.absent(), this.pinCode = const Optional.absent()}); /// User password (required if PIN code is not provided) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? password; + final Optional password; /// New PIN code (4-6 digits) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? pinCode; + final Optional pinCode; - @override - bool operator ==(Object other) => identical(this, other) || other is PinCodeResetDto && - other.password == password && - other.pinCode == pinCode; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (password == null ? 0 : password!.hashCode) + - (pinCode == null ? 0 : pinCode!.hashCode); - - @override - String toString() => 'PinCodeResetDto[password=$password, pinCode=$pinCode]'; + static PinCodeResetDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + password: json.containsKey(r'password') ? Optional.present(json[r'password'] as String) : const Optional.absent(), + pinCode: json.containsKey(r'pinCode') ? Optional.present(json[r'pinCode'] as String) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.password != null) { - json[r'password'] = this.password; - } else { - // json[r'password'] = null; + if (password case Present(:final value)) { + json[r'password'] = value; } - if (this.pinCode != null) { - json[r'pinCode'] = this.pinCode; - } else { - // json[r'pinCode'] = null; + if (pinCode case Present(:final value)) { + json[r'pinCode'] = value; } return json; } - /// Returns a new [PinCodeResetDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PinCodeResetDto? fromJson(dynamic value) { - upgradeDto(value, "PinCodeResetDto"); - if (value is Map) { - final json = value.cast(); - - return PinCodeResetDto( - password: mapValueOfType(json, r'password'), - pinCode: mapValueOfType(json, r'pinCode'), - ); - } - return null; + PinCodeResetDto copyWith({Optional? password, Optional? pinCode}) { + return .new(password: password ?? this.password, pinCode: pinCode ?? this.pinCode); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PinCodeResetDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PinCodeResetDto && password == other.password && pinCode == other.pinCode); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PinCodeResetDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([password, pinCode]); } - // maps a json object with a list of PinCodeResetDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PinCodeResetDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'PinCodeResetDto(password=$password, pinCode=$pinCode)'; } - diff --git a/mobile/openapi/lib/model/pin_code_setup_dto.dart b/mobile/openapi/lib/model/pin_code_setup_dto.dart index e2f08f102b..1700f4462b 100644 --- a/mobile/openapi/lib/model/pin_code_setup_dto.dart +++ b/mobile/openapi/lib/model/pin_code_setup_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PinCodeSetupDto { - /// Returns a new [PinCodeSetupDto] instance. - PinCodeSetupDto({ - required this.pinCode, - }); +final class PinCodeSetupDto { + const PinCodeSetupDto({required this.pinCode}); /// PIN code (4-6 digits) - String pinCode; + final String pinCode; - @override - bool operator ==(Object other) => identical(this, other) || other is PinCodeSetupDto && - other.pinCode == pinCode; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (pinCode.hashCode); - - @override - String toString() => 'PinCodeSetupDto[pinCode=$pinCode]'; + static PinCodeSetupDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(pinCode: json[r'pinCode'] as String); + } Map toJson() { final json = {}; - json[r'pinCode'] = this.pinCode; + json[r'pinCode'] = pinCode; return json; } - /// Returns a new [PinCodeSetupDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PinCodeSetupDto? fromJson(dynamic value) { - upgradeDto(value, "PinCodeSetupDto"); - if (value is Map) { - final json = value.cast(); - - return PinCodeSetupDto( - pinCode: mapValueOfType(json, r'pinCode')!, - ); - } - return null; + PinCodeSetupDto copyWith({String? pinCode}) { + return .new(pinCode: pinCode ?? this.pinCode); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PinCodeSetupDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is PinCodeSetupDto && pinCode == other.pinCode); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PinCodeSetupDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([pinCode]); } - // maps a json object with a list of PinCodeSetupDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PinCodeSetupDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'pinCode', - }; + @override + String toString() => 'PinCodeSetupDto(pinCode=$pinCode)'; } - diff --git a/mobile/openapi/lib/model/places_response_dto.dart b/mobile/openapi/lib/model/places_response_dto.dart index 94aa58eba4..f4a788b244 100644 --- a/mobile/openapi/lib/model/places_response_dto.dart +++ b/mobile/openapi/lib/model/places_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PlacesResponseDto { - /// Returns a new [PlacesResponseDto] instance. - PlacesResponseDto({ +final class PlacesResponseDto { + const PlacesResponseDto({ this.admin1name, this.admin2name, required this.latitude, @@ -21,134 +12,82 @@ class PlacesResponseDto { }); /// Administrative level 1 name (state/province) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? admin1name; + final String? admin1name; /// Administrative level 2 name (county/district) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? admin2name; + final String? admin2name; /// Latitude coordinate - num latitude; + final double latitude; /// Longitude coordinate - num longitude; + final double longitude; /// Place name - String name; + final String name; - @override - bool operator ==(Object other) => identical(this, other) || other is PlacesResponseDto && - other.admin1name == admin1name && - other.admin2name == admin2name && - other.latitude == latitude && - other.longitude == longitude && - other.name == name; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (admin1name == null ? 0 : admin1name!.hashCode) + - (admin2name == null ? 0 : admin2name!.hashCode) + - (latitude.hashCode) + - (longitude.hashCode) + - (name.hashCode); - - @override - String toString() => 'PlacesResponseDto[admin1name=$admin1name, admin2name=$admin2name, latitude=$latitude, longitude=$longitude, name=$name]'; + static PlacesResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + admin1name: (json[r'admin1name'] as String?), + admin2name: (json[r'admin2name'] as String?), + latitude: (json[r'latitude'] as num).toDouble(), + longitude: (json[r'longitude'] as num).toDouble(), + name: json[r'name'] as String, + ); + } Map toJson() { final json = {}; - if (this.admin1name != null) { - json[r'admin1name'] = this.admin1name; - } else { - // json[r'admin1name'] = null; + if (admin1name != null) { + json[r'admin1name'] = admin1name!; } - if (this.admin2name != null) { - json[r'admin2name'] = this.admin2name; - } else { - // json[r'admin2name'] = null; + if (admin2name != null) { + json[r'admin2name'] = admin2name!; } - json[r'latitude'] = this.latitude; - json[r'longitude'] = this.longitude; - json[r'name'] = this.name; + json[r'latitude'] = latitude; + json[r'longitude'] = longitude; + json[r'name'] = name; return json; } - /// Returns a new [PlacesResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PlacesResponseDto? fromJson(dynamic value) { - upgradeDto(value, "PlacesResponseDto"); - if (value is Map) { - final json = value.cast(); - - return PlacesResponseDto( - admin1name: mapValueOfType(json, r'admin1name'), - admin2name: mapValueOfType(json, r'admin2name'), - latitude: num.parse('${json[r'latitude']}'), - longitude: num.parse('${json[r'longitude']}'), - name: mapValueOfType(json, r'name')!, - ); - } - return null; + PlacesResponseDto copyWith({ + Object? admin1name = _undefined, + Object? admin2name = _undefined, + double? latitude, + double? longitude, + String? name, + }) { + return .new( + admin1name: identical(admin1name, _undefined) ? this.admin1name : admin1name as String?, + admin2name: identical(admin2name, _undefined) ? this.admin2name : admin2name as String?, + latitude: latitude ?? this.latitude, + longitude: longitude ?? this.longitude, + name: name ?? this.name, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PlacesResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PlacesResponseDto && + admin1name == other.admin1name && + admin2name == other.admin2name && + latitude == other.latitude && + longitude == other.longitude && + name == other.name); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PlacesResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([admin1name, admin2name, latitude, longitude, name]); } - // maps a json object with a list of PlacesResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PlacesResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'latitude', - 'longitude', - 'name', - }; + @override + String toString() => + 'PlacesResponseDto(admin1name=$admin1name, admin2name=$admin2name, latitude=$latitude, longitude=$longitude, name=$name)'; } - diff --git a/mobile/openapi/lib/model/plugin_method_response_dto.dart b/mobile/openapi/lib/model/plugin_method_response_dto.dart index 2887f4cc16..dd23a69659 100644 --- a/mobile/openapi/lib/model/plugin_method_response_dto.dart +++ b/mobile/openapi/lib/model/plugin_method_response_dto.dart @@ -1,172 +1,125 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PluginMethodResponseDto { - /// Returns a new [PluginMethodResponseDto] instance. - PluginMethodResponseDto({ +final class PluginMethodResponseDto { + const PluginMethodResponseDto({ required this.description, required this.hostFunctions, required this.key, required this.name, this.schema, required this.title, - this.types = const [], - this.uiHints = const [], + required this.types, + required this.uiHints, }); /// Description - String description; + final String description; - bool hostFunctions; + final bool hostFunctions; /// Key - String key; + final String key; /// Name - String name; + final String name; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - Object? schema; + final Map? schema; /// Title - String title; + final String title; /// Workflow types - List types; + final List types; /// Ui hints - List uiHints; + final List uiHints; - @override - bool operator ==(Object other) => identical(this, other) || other is PluginMethodResponseDto && - other.description == description && - other.hostFunctions == hostFunctions && - other.key == key && - other.name == name && - other.schema == schema && - other.title == title && - _deepEquality.equals(other.types, types) && - _deepEquality.equals(other.uiHints, uiHints); + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (description.hashCode) + - (hostFunctions.hashCode) + - (key.hashCode) + - (name.hashCode) + - (schema == null ? 0 : schema!.hashCode) + - (title.hashCode) + - (types.hashCode) + - (uiHints.hashCode); - - @override - String toString() => 'PluginMethodResponseDto[description=$description, hostFunctions=$hostFunctions, key=$key, name=$name, schema=$schema, title=$title, types=$types, uiHints=$uiHints]'; + static PluginMethodResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + description: json[r'description'] as String, + hostFunctions: json[r'hostFunctions'] as bool, + key: json[r'key'] as String, + name: json[r'name'] as String, + schema: (json[r'schema'] as Map?)?.cast(), + title: json[r'title'] as String, + types: ((json[r'types'] as List?)?.map(($e) => (WorkflowType.fromJson($e))!).toList(growable: false))!, + uiHints: ((json[r'uiHints'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'description'] = this.description; - json[r'hostFunctions'] = this.hostFunctions; - json[r'key'] = this.key; - json[r'name'] = this.name; - if (this.schema != null) { - json[r'schema'] = this.schema; - } else { - // json[r'schema'] = null; + json[r'description'] = description; + json[r'hostFunctions'] = hostFunctions; + json[r'key'] = key; + json[r'name'] = name; + if (schema != null) { + json[r'schema'] = schema!; } - json[r'title'] = this.title; - json[r'types'] = this.types; - json[r'uiHints'] = this.uiHints; + json[r'title'] = title; + json[r'types'] = types.map(($e) => $e.toJson()).toList(growable: false); + json[r'uiHints'] = uiHints; return json; } - /// Returns a new [PluginMethodResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PluginMethodResponseDto? fromJson(dynamic value) { - upgradeDto(value, "PluginMethodResponseDto"); - if (value is Map) { - final json = value.cast(); - - return PluginMethodResponseDto( - description: mapValueOfType(json, r'description')!, - hostFunctions: mapValueOfType(json, r'hostFunctions')!, - key: mapValueOfType(json, r'key')!, - name: mapValueOfType(json, r'name')!, - schema: mapValueOfType(json, r'schema'), - title: mapValueOfType(json, r'title')!, - types: WorkflowType.listFromJson(json[r'types']), - uiHints: json[r'uiHints'] is Iterable - ? (json[r'uiHints'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + PluginMethodResponseDto copyWith({ + String? description, + bool? hostFunctions, + String? key, + String? name, + Object? schema = _undefined, + String? title, + List? types, + List? uiHints, + }) { + return .new( + description: description ?? this.description, + hostFunctions: hostFunctions ?? this.hostFunctions, + key: key ?? this.key, + name: name ?? this.name, + schema: identical(schema, _undefined) ? this.schema : schema as Map?, + title: title ?? this.title, + types: types ?? this.types, + uiHints: uiHints ?? this.uiHints, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PluginMethodResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PluginMethodResponseDto && + description == other.description && + hostFunctions == other.hostFunctions && + key == other.key && + name == other.name && + const DeepCollectionEquality().equals(schema, other.schema) && + title == other.title && + const DeepCollectionEquality().equals(types, other.types) && + const DeepCollectionEquality().equals(uiHints, other.uiHints)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PluginMethodResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + description, + hostFunctions, + key, + name, + const DeepCollectionEquality().hash(schema), + title, + const DeepCollectionEquality().hash(types), + const DeepCollectionEquality().hash(uiHints), + ]); } - // maps a json object with a list of PluginMethodResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PluginMethodResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'description', - 'hostFunctions', - 'key', - 'name', - 'title', - 'types', - 'uiHints', - }; + @override + String toString() => + 'PluginMethodResponseDto(description=$description, hostFunctions=$hostFunctions, key=$key, name=$name, schema=$schema, title=$title, types=$types, uiHints=$uiHints)'; } - diff --git a/mobile/openapi/lib/model/plugin_response_dto.dart b/mobile/openapi/lib/model/plugin_response_dto.dart index 1bdb366f9e..3f71ab1b30 100644 --- a/mobile/openapi/lib/model/plugin_response_dto.dart +++ b/mobile/openapi/lib/model/plugin_response_dto.dart @@ -1,23 +1,14 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PluginResponseDto { - /// Returns a new [PluginResponseDto] instance. - PluginResponseDto({ +final class PluginResponseDto { + const PluginResponseDto({ required this.author, required this.createdAt, required this.description, required this.id, - this.methods = const [], + required this.methods, required this.name, required this.title, required this.updatedAt, @@ -25,148 +16,120 @@ class PluginResponseDto { }); /// Plugin author - String author; + final String author; /// Creation date - String createdAt; + final String createdAt; /// Plugin description - String description; + final String description; /// Plugin ID - String id; + final String id; /// Plugin methods - List methods; + final List methods; /// Plugin name - String name; + final String name; /// Plugin title - String title; + final String title; /// Last update date - String updatedAt; + final String updatedAt; /// Plugin version - String version; + final String version; - @override - bool operator ==(Object other) => identical(this, other) || other is PluginResponseDto && - other.author == author && - other.createdAt == createdAt && - other.description == description && - other.id == id && - _deepEquality.equals(other.methods, methods) && - other.name == name && - other.title == title && - other.updatedAt == updatedAt && - other.version == version; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (author.hashCode) + - (createdAt.hashCode) + - (description.hashCode) + - (id.hashCode) + - (methods.hashCode) + - (name.hashCode) + - (title.hashCode) + - (updatedAt.hashCode) + - (version.hashCode); - - @override - String toString() => 'PluginResponseDto[author=$author, createdAt=$createdAt, description=$description, id=$id, methods=$methods, name=$name, title=$title, updatedAt=$updatedAt, version=$version]'; + static PluginResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + author: json[r'author'] as String, + createdAt: json[r'createdAt'] as String, + description: json[r'description'] as String, + id: json[r'id'] as String, + methods: ((json[r'methods'] as List?) + ?.map(($e) => (PluginMethodResponseDto.fromJson($e))!) + .toList(growable: false))!, + name: json[r'name'] as String, + title: json[r'title'] as String, + updatedAt: json[r'updatedAt'] as String, + version: json[r'version'] as String, + ); + } Map toJson() { final json = {}; - json[r'author'] = this.author; - json[r'createdAt'] = this.createdAt; - json[r'description'] = this.description; - json[r'id'] = this.id; - json[r'methods'] = this.methods; - json[r'name'] = this.name; - json[r'title'] = this.title; - json[r'updatedAt'] = this.updatedAt; - json[r'version'] = this.version; + json[r'author'] = author; + json[r'createdAt'] = createdAt; + json[r'description'] = description; + json[r'id'] = id; + json[r'methods'] = methods.map(($e) => $e.toJson()).toList(growable: false); + json[r'name'] = name; + json[r'title'] = title; + json[r'updatedAt'] = updatedAt; + json[r'version'] = version; return json; } - /// Returns a new [PluginResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PluginResponseDto? fromJson(dynamic value) { - upgradeDto(value, "PluginResponseDto"); - if (value is Map) { - final json = value.cast(); - - return PluginResponseDto( - author: mapValueOfType(json, r'author')!, - createdAt: mapValueOfType(json, r'createdAt')!, - description: mapValueOfType(json, r'description')!, - id: mapValueOfType(json, r'id')!, - methods: PluginMethodResponseDto.listFromJson(json[r'methods']), - name: mapValueOfType(json, r'name')!, - title: mapValueOfType(json, r'title')!, - updatedAt: mapValueOfType(json, r'updatedAt')!, - version: mapValueOfType(json, r'version')!, - ); - } - return null; + PluginResponseDto copyWith({ + String? author, + String? createdAt, + String? description, + String? id, + List? methods, + String? name, + String? title, + String? updatedAt, + String? version, + }) { + return .new( + author: author ?? this.author, + createdAt: createdAt ?? this.createdAt, + description: description ?? this.description, + id: id ?? this.id, + methods: methods ?? this.methods, + name: name ?? this.name, + title: title ?? this.title, + updatedAt: updatedAt ?? this.updatedAt, + version: version ?? this.version, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PluginResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PluginResponseDto && + author == other.author && + createdAt == other.createdAt && + description == other.description && + id == other.id && + const DeepCollectionEquality().equals(methods, other.methods) && + name == other.name && + title == other.title && + updatedAt == other.updatedAt && + version == other.version); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PluginResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + author, + createdAt, + description, + id, + const DeepCollectionEquality().hash(methods), + name, + title, + updatedAt, + version, + ]); } - // maps a json object with a list of PluginResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PluginResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'author', - 'createdAt', - 'description', - 'id', - 'methods', - 'name', - 'title', - 'updatedAt', - 'version', - }; + @override + String toString() => + 'PluginResponseDto(author=$author, createdAt=$createdAt, description=$description, id=$id, methods=$methods, name=$name, title=$title, updatedAt=$updatedAt, version=$version)'; } - diff --git a/mobile/openapi/lib/model/plugin_template_response_dto.dart b/mobile/openapi/lib/model/plugin_template_response_dto.dart index 9f54753f49..fcc8f15d22 100644 --- a/mobile/openapi/lib/model/plugin_template_response_dto.dart +++ b/mobile/openapi/lib/model/plugin_template_response_dto.dart @@ -1,146 +1,105 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PluginTemplateResponseDto { - /// Returns a new [PluginTemplateResponseDto] instance. - PluginTemplateResponseDto({ +final class PluginTemplateResponseDto { + const PluginTemplateResponseDto({ required this.description, required this.key, - this.steps = const [], + required this.steps, required this.title, required this.trigger, - this.uiHints = const [], + required this.uiHints, }); /// Template description - String description; + final String description; /// Template key (unique across all templates) - String key; + final String key; /// Workflow steps - List steps; + final List steps; /// Template title - String title; + final String title; - WorkflowTrigger trigger; + /// Workflow trigger + final WorkflowTrigger trigger; - /// Ui hints, for example \"smart-album\" - List uiHints; + /// Ui hints, for example "smart-album" + final List uiHints; - @override - bool operator ==(Object other) => identical(this, other) || other is PluginTemplateResponseDto && - other.description == description && - other.key == key && - _deepEquality.equals(other.steps, steps) && - other.title == title && - other.trigger == trigger && - _deepEquality.equals(other.uiHints, uiHints); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (description.hashCode) + - (key.hashCode) + - (steps.hashCode) + - (title.hashCode) + - (trigger.hashCode) + - (uiHints.hashCode); - - @override - String toString() => 'PluginTemplateResponseDto[description=$description, key=$key, steps=$steps, title=$title, trigger=$trigger, uiHints=$uiHints]'; + static PluginTemplateResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + description: json[r'description'] as String, + key: json[r'key'] as String, + steps: ((json[r'steps'] as List?) + ?.map(($e) => (PluginTemplateStepResponseDto.fromJson($e))!) + .toList(growable: false))!, + title: json[r'title'] as String, + trigger: (WorkflowTrigger.fromJson(json[r'trigger']))!, + uiHints: ((json[r'uiHints'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'description'] = this.description; - json[r'key'] = this.key; - json[r'steps'] = this.steps; - json[r'title'] = this.title; - json[r'trigger'] = this.trigger; - json[r'uiHints'] = this.uiHints; + json[r'description'] = description; + json[r'key'] = key; + json[r'steps'] = steps.map(($e) => $e.toJson()).toList(growable: false); + json[r'title'] = title; + json[r'trigger'] = trigger.toJson(); + json[r'uiHints'] = uiHints; return json; } - /// Returns a new [PluginTemplateResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PluginTemplateResponseDto? fromJson(dynamic value) { - upgradeDto(value, "PluginTemplateResponseDto"); - if (value is Map) { - final json = value.cast(); - - return PluginTemplateResponseDto( - description: mapValueOfType(json, r'description')!, - key: mapValueOfType(json, r'key')!, - steps: PluginTemplateStepResponseDto.listFromJson(json[r'steps']), - title: mapValueOfType(json, r'title')!, - trigger: WorkflowTrigger.fromJson(json[r'trigger'])!, - uiHints: json[r'uiHints'] is Iterable - ? (json[r'uiHints'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + PluginTemplateResponseDto copyWith({ + String? description, + String? key, + List? steps, + String? title, + WorkflowTrigger? trigger, + List? uiHints, + }) { + return .new( + description: description ?? this.description, + key: key ?? this.key, + steps: steps ?? this.steps, + title: title ?? this.title, + trigger: trigger ?? this.trigger, + uiHints: uiHints ?? this.uiHints, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PluginTemplateResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PluginTemplateResponseDto && + description == other.description && + key == other.key && + const DeepCollectionEquality().equals(steps, other.steps) && + title == other.title && + trigger == other.trigger && + const DeepCollectionEquality().equals(uiHints, other.uiHints)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PluginTemplateResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + description, + key, + const DeepCollectionEquality().hash(steps), + title, + trigger, + const DeepCollectionEquality().hash(uiHints), + ]); } - // maps a json object with a list of PluginTemplateResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PluginTemplateResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'description', - 'key', - 'steps', - 'title', - 'trigger', - 'uiHints', - }; + @override + String toString() => + 'PluginTemplateResponseDto(description=$description, key=$key, steps=$steps, title=$title, trigger=$trigger, uiHints=$uiHints)'; } - diff --git a/mobile/openapi/lib/model/plugin_template_step_response_dto.dart b/mobile/openapi/lib/model/plugin_template_step_response_dto.dart index b58884d1cd..bcbe06bd57 100644 --- a/mobile/openapi/lib/model/plugin_template_step_response_dto.dart +++ b/mobile/openapi/lib/model/plugin_template_step_response_dto.dart @@ -1,131 +1,66 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PluginTemplateStepResponseDto { - /// Returns a new [PluginTemplateStepResponseDto] instance. - PluginTemplateStepResponseDto({ - this.config = const {}, - this.enabled, - required this.method, - }); +final class PluginTemplateStepResponseDto { + const PluginTemplateStepResponseDto({required this.config, this.enabled, required this.method}); /// Step configuration - Map? config; + final Map? config; /// Whether the step is enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final bool? enabled; /// Step plugin method - String method; + final String method; - @override - bool operator ==(Object other) => identical(this, other) || other is PluginTemplateStepResponseDto && - _deepEquality.equals(other.config, config) && - other.enabled == enabled && - other.method == method; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (config == null ? 0 : config!.hashCode) + - (enabled == null ? 0 : enabled!.hashCode) + - (method.hashCode); - - @override - String toString() => 'PluginTemplateStepResponseDto[config=$config, enabled=$enabled, method=$method]'; + static PluginTemplateStepResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + config: (json[r'config'] as Map?)?.cast(), + enabled: (json[r'enabled'] as bool?), + method: json[r'method'] as String, + ); + } Map toJson() { final json = {}; - if (this.config != null) { - json[r'config'] = this.config; - } else { - // json[r'config'] = null; + if (config != null) { + json[r'config'] = config!; } - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled != null) { + json[r'enabled'] = enabled!; } - json[r'method'] = this.method; + json[r'method'] = method; return json; } - /// Returns a new [PluginTemplateStepResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PluginTemplateStepResponseDto? fromJson(dynamic value) { - upgradeDto(value, "PluginTemplateStepResponseDto"); - if (value is Map) { - final json = value.cast(); - - return PluginTemplateStepResponseDto( - config: mapCastOfType(json, r'config'), - enabled: mapValueOfType(json, r'enabled'), - method: mapValueOfType(json, r'method')!, - ); - } - return null; + PluginTemplateStepResponseDto copyWith({Object? config = _undefined, Object? enabled = _undefined, String? method}) { + return .new( + config: identical(config, _undefined) ? this.config : config as Map?, + enabled: identical(enabled, _undefined) ? this.enabled : enabled as bool?, + method: method ?? this.method, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PluginTemplateStepResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PluginTemplateStepResponseDto && + const DeepCollectionEquality().equals(config, other.config) && + enabled == other.enabled && + method == other.method); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PluginTemplateStepResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(config), enabled, method]); } - // maps a json object with a list of PluginTemplateStepResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PluginTemplateStepResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'config', - 'method', - }; + @override + String toString() => 'PluginTemplateStepResponseDto(config=$config, enabled=$enabled, method=$method)'; } - diff --git a/mobile/openapi/lib/model/purchase_response.dart b/mobile/openapi/lib/model/purchase_response.dart index e55c286629..992b5bace7 100644 --- a/mobile/openapi/lib/model/purchase_response.dart +++ b/mobile/openapi/lib/model/purchase_response.dart @@ -1,109 +1,53 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PurchaseResponse { - /// Returns a new [PurchaseResponse] instance. - PurchaseResponse({ - required this.hideBuyButtonUntil, - required this.showSupportBadge, - }); +final class PurchaseResponse { + const PurchaseResponse({required this.hideBuyButtonUntil, required this.showSupportBadge}); /// Date until which to hide buy button - String hideBuyButtonUntil; + final String hideBuyButtonUntil; /// Whether to show support badge - bool showSupportBadge; + final bool showSupportBadge; - @override - bool operator ==(Object other) => identical(this, other) || other is PurchaseResponse && - other.hideBuyButtonUntil == hideBuyButtonUntil && - other.showSupportBadge == showSupportBadge; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (hideBuyButtonUntil.hashCode) + - (showSupportBadge.hashCode); - - @override - String toString() => 'PurchaseResponse[hideBuyButtonUntil=$hideBuyButtonUntil, showSupportBadge=$showSupportBadge]'; + static PurchaseResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + hideBuyButtonUntil: json[r'hideBuyButtonUntil'] as String, + showSupportBadge: json[r'showSupportBadge'] as bool, + ); + } Map toJson() { final json = {}; - json[r'hideBuyButtonUntil'] = this.hideBuyButtonUntil; - json[r'showSupportBadge'] = this.showSupportBadge; + json[r'hideBuyButtonUntil'] = hideBuyButtonUntil; + json[r'showSupportBadge'] = showSupportBadge; return json; } - /// Returns a new [PurchaseResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PurchaseResponse? fromJson(dynamic value) { - upgradeDto(value, "PurchaseResponse"); - if (value is Map) { - final json = value.cast(); - - return PurchaseResponse( - hideBuyButtonUntil: mapValueOfType(json, r'hideBuyButtonUntil')!, - showSupportBadge: mapValueOfType(json, r'showSupportBadge')!, - ); - } - return null; + PurchaseResponse copyWith({String? hideBuyButtonUntil, bool? showSupportBadge}) { + return .new( + hideBuyButtonUntil: hideBuyButtonUntil ?? this.hideBuyButtonUntil, + showSupportBadge: showSupportBadge ?? this.showSupportBadge, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PurchaseResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PurchaseResponse && + hideBuyButtonUntil == other.hideBuyButtonUntil && + showSupportBadge == other.showSupportBadge); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PurchaseResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([hideBuyButtonUntil, showSupportBadge]); } - // maps a json object with a list of PurchaseResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PurchaseResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'hideBuyButtonUntil', - 'showSupportBadge', - }; + @override + String toString() => 'PurchaseResponse(hideBuyButtonUntil=$hideBuyButtonUntil, showSupportBadge=$showSupportBadge)'; } - diff --git a/mobile/openapi/lib/model/purchase_update.dart b/mobile/openapi/lib/model/purchase_update.dart index 913faf9bc4..9cbee9f03c 100644 --- a/mobile/openapi/lib/model/purchase_update.dart +++ b/mobile/openapi/lib/model/purchase_update.dart @@ -1,127 +1,61 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class PurchaseUpdate { - /// Returns a new [PurchaseUpdate] instance. - PurchaseUpdate({ - this.hideBuyButtonUntil, - this.showSupportBadge, - }); +final class PurchaseUpdate { + const PurchaseUpdate({this.hideBuyButtonUntil, this.showSupportBadge}); /// Date until which to hide buy button - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? hideBuyButtonUntil; + final String? hideBuyButtonUntil; /// Whether to show support badge - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? showSupportBadge; + final bool? showSupportBadge; - @override - bool operator ==(Object other) => identical(this, other) || other is PurchaseUpdate && - other.hideBuyButtonUntil == hideBuyButtonUntil && - other.showSupportBadge == showSupportBadge; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (hideBuyButtonUntil == null ? 0 : hideBuyButtonUntil!.hashCode) + - (showSupportBadge == null ? 0 : showSupportBadge!.hashCode); - - @override - String toString() => 'PurchaseUpdate[hideBuyButtonUntil=$hideBuyButtonUntil, showSupportBadge=$showSupportBadge]'; + static PurchaseUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + hideBuyButtonUntil: (json[r'hideBuyButtonUntil'] as String?), + showSupportBadge: (json[r'showSupportBadge'] as bool?), + ); + } Map toJson() { final json = {}; - if (this.hideBuyButtonUntil != null) { - json[r'hideBuyButtonUntil'] = this.hideBuyButtonUntil; - } else { - // json[r'hideBuyButtonUntil'] = null; + if (hideBuyButtonUntil != null) { + json[r'hideBuyButtonUntil'] = hideBuyButtonUntil!; } - if (this.showSupportBadge != null) { - json[r'showSupportBadge'] = this.showSupportBadge; - } else { - // json[r'showSupportBadge'] = null; + if (showSupportBadge != null) { + json[r'showSupportBadge'] = showSupportBadge!; } return json; } - /// Returns a new [PurchaseUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static PurchaseUpdate? fromJson(dynamic value) { - upgradeDto(value, "PurchaseUpdate"); - if (value is Map) { - final json = value.cast(); - - return PurchaseUpdate( - hideBuyButtonUntil: mapValueOfType(json, r'hideBuyButtonUntil'), - showSupportBadge: mapValueOfType(json, r'showSupportBadge'), - ); - } - return null; + PurchaseUpdate copyWith({Object? hideBuyButtonUntil = _undefined, Object? showSupportBadge = _undefined}) { + return .new( + hideBuyButtonUntil: identical(hideBuyButtonUntil, _undefined) + ? this.hideBuyButtonUntil + : hideBuyButtonUntil as String?, + showSupportBadge: identical(showSupportBadge, _undefined) ? this.showSupportBadge : showSupportBadge as bool?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = PurchaseUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is PurchaseUpdate && + hideBuyButtonUntil == other.hideBuyButtonUntil && + showSupportBadge == other.showSupportBadge); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = PurchaseUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([hideBuyButtonUntil, showSupportBadge]); } - // maps a json object with a list of PurchaseUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = PurchaseUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'PurchaseUpdate(hideBuyButtonUntil=$hideBuyButtonUntil, showSupportBadge=$showSupportBadge)'; } - diff --git a/mobile/openapi/lib/model/queue_command.dart b/mobile/openapi/lib/model/queue_command.dart index 3cf689a02d..b560737c20 100644 --- a/mobile/openapi/lib/model/queue_command.dart +++ b/mobile/openapi/lib/model/queue_command.dart @@ -1,94 +1,31 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Queue command to execute -class QueueCommand { - /// Instantiate a new enum with the provided [value]. +enum QueueCommand { + start._(r'start'), + pause._(r'pause'), + resume._(r'resume'), + empty._(r'empty'), + clearFailed._(r'clear-failed'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const QueueCommand._(this.value); - /// The underlying value of this enum member. final String value; + static QueueCommand? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const start = QueueCommand._(r'start'); - static const pause = QueueCommand._(r'pause'); - static const resume = QueueCommand._(r'resume'); - static const empty = QueueCommand._(r'empty'); - static const clearFailed = QueueCommand._(r'clear-failed'); - - /// List of all possible values in this [enum][QueueCommand]. - static const values = [ - start, - pause, - resume, - empty, - clearFailed, - ]; - - static QueueCommand? fromJson(dynamic value) => QueueCommandTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueueCommand.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [QueueCommand] to String, -/// and [decode] dynamic data back to [QueueCommand]. -class QueueCommandTypeTransformer { - factory QueueCommandTypeTransformer() => _instance ??= const QueueCommandTypeTransformer._(); - - const QueueCommandTypeTransformer._(); - - String encode(QueueCommand data) => data.value; - - /// Decodes a [dynamic value][data] to a QueueCommand. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - QueueCommand? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'start': return QueueCommand.start; - case r'pause': return QueueCommand.pause; - case r'resume': return QueueCommand.resume; - case r'empty': return QueueCommand.empty; - case r'clear-failed': return QueueCommand.clearFailed; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [QueueCommandTypeTransformer] instance. - static QueueCommandTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/queue_command_dto.dart b/mobile/openapi/lib/model/queue_command_dto.dart index fb68d85583..6b9a37ada1 100644 --- a/mobile/openapi/lib/model/queue_command_dto.dart +++ b/mobile/openapi/lib/model/queue_command_dto.dart @@ -1,117 +1,48 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class QueueCommandDto { - /// Returns a new [QueueCommandDto] instance. - QueueCommandDto({ - required this.command, - this.force, - }); +final class QueueCommandDto { + const QueueCommandDto({required this.command, this.force = const Optional.absent()}); - QueueCommand command; + final QueueCommand command; /// Force the command execution (if applicable) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? force; + final Optional force; - @override - bool operator ==(Object other) => identical(this, other) || other is QueueCommandDto && - other.command == command && - other.force == force; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (command.hashCode) + - (force == null ? 0 : force!.hashCode); - - @override - String toString() => 'QueueCommandDto[command=$command, force=$force]'; + static QueueCommandDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + command: (QueueCommand.fromJson(json[r'command']))!, + force: json.containsKey(r'force') ? Optional.present(json[r'force'] as bool) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'command'] = this.command; - if (this.force != null) { - json[r'force'] = this.force; - } else { - // json[r'force'] = null; + json[r'command'] = command.toJson(); + if (force case Present(:final value)) { + json[r'force'] = value; } return json; } - /// Returns a new [QueueCommandDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static QueueCommandDto? fromJson(dynamic value) { - upgradeDto(value, "QueueCommandDto"); - if (value is Map) { - final json = value.cast(); - - return QueueCommandDto( - command: QueueCommand.fromJson(json[r'command'])!, - force: mapValueOfType(json, r'force'), - ); - } - return null; + QueueCommandDto copyWith({QueueCommand? command, Optional? force}) { + return .new(command: command ?? this.command, force: force ?? this.force); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueueCommandDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is QueueCommandDto && command == other.command && force == other.force); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = QueueCommandDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([command, force]); } - // maps a json object with a list of QueueCommandDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = QueueCommandDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'command', - }; + @override + String toString() => 'QueueCommandDto(command=$command, force=$force)'; } - diff --git a/mobile/openapi/lib/model/queue_delete_dto.dart b/mobile/openapi/lib/model/queue_delete_dto.dart index d319238f92..a4d2e2ca81 100644 --- a/mobile/openapi/lib/model/queue_delete_dto.dart +++ b/mobile/openapi/lib/model/queue_delete_dto.dart @@ -1,109 +1,49 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class QueueDeleteDto { - /// Returns a new [QueueDeleteDto] instance. - QueueDeleteDto({ - this.failed, - }); +final class QueueDeleteDto { + const QueueDeleteDto({this.failed = const Optional.absent()}); /// If true, will also remove failed jobs from the queue. - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? failed; + /// Available since server v2.4.0. + final Optional failed; - @override - bool operator ==(Object other) => identical(this, other) || other is QueueDeleteDto && - other.failed == failed; + static const ApiVersion failedAddedIn = .new(2, 4, 0); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (failed == null ? 0 : failed!.hashCode); + static const ApiState failedState = .alpha; - @override - String toString() => 'QueueDeleteDto[failed=$failed]'; + static QueueDeleteDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + failed: json.containsKey(r'failed') ? Optional.present(json[r'failed'] as bool) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.failed != null) { - json[r'failed'] = this.failed; - } else { - // json[r'failed'] = null; + if (failed case Present(:final value)) { + json[r'failed'] = value; } return json; } - /// Returns a new [QueueDeleteDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static QueueDeleteDto? fromJson(dynamic value) { - upgradeDto(value, "QueueDeleteDto"); - if (value is Map) { - final json = value.cast(); - - return QueueDeleteDto( - failed: mapValueOfType(json, r'failed'), - ); - } - return null; + QueueDeleteDto copyWith({Optional? failed}) { + return .new(failed: failed ?? this.failed); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueueDeleteDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is QueueDeleteDto && failed == other.failed); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = QueueDeleteDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([failed]); } - // maps a json object with a list of QueueDeleteDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = QueueDeleteDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'QueueDeleteDto(failed=$failed)'; } - diff --git a/mobile/openapi/lib/model/queue_job_response_dto.dart b/mobile/openapi/lib/model/queue_job_response_dto.dart index 06d433edad..b2fd5eb656 100644 --- a/mobile/openapi/lib/model/queue_job_response_dto.dart +++ b/mobile/openapi/lib/model/queue_job_response_dto.dart @@ -1,138 +1,70 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class QueueJobResponseDto { - /// Returns a new [QueueJobResponseDto] instance. - QueueJobResponseDto({ - this.data = const {}, - this.id, - required this.name, - required this.timestamp, - }); +final class QueueJobResponseDto { + const QueueJobResponseDto({required this.data, this.id, required this.name, required this.timestamp}); /// Job data payload - Map data; + final Map data; /// Job ID - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? id; + final String? id; - JobName name; + final JobName name; /// Job creation timestamp - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int timestamp; + final int timestamp; - @override - bool operator ==(Object other) => identical(this, other) || other is QueueJobResponseDto && - _deepEquality.equals(other.data, data) && - other.id == id && - other.name == name && - other.timestamp == timestamp; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (data.hashCode) + - (id == null ? 0 : id!.hashCode) + - (name.hashCode) + - (timestamp.hashCode); - - @override - String toString() => 'QueueJobResponseDto[data=$data, id=$id, name=$name, timestamp=$timestamp]'; + static QueueJobResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + data: ((json[r'data'] as Map?)?.cast())!, + id: (json[r'id'] as String?), + name: (JobName.fromJson(json[r'name']))!, + timestamp: json[r'timestamp'] as int, + ); + } Map toJson() { final json = {}; - json[r'data'] = this.data; - if (this.id != null) { - json[r'id'] = this.id; - } else { - // json[r'id'] = null; + json[r'data'] = data; + if (id != null) { + json[r'id'] = id!; } - json[r'name'] = this.name; - json[r'timestamp'] = this.timestamp; + json[r'name'] = name.toJson(); + json[r'timestamp'] = timestamp; return json; } - /// Returns a new [QueueJobResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static QueueJobResponseDto? fromJson(dynamic value) { - upgradeDto(value, "QueueJobResponseDto"); - if (value is Map) { - final json = value.cast(); - - return QueueJobResponseDto( - data: mapCastOfType(json, r'data')!, - id: mapValueOfType(json, r'id'), - name: JobName.fromJson(json[r'name'])!, - timestamp: mapValueOfType(json, r'timestamp')!, - ); - } - return null; + QueueJobResponseDto copyWith({Map? data, Object? id = _undefined, JobName? name, int? timestamp}) { + return .new( + data: data ?? this.data, + id: identical(id, _undefined) ? this.id : id as String?, + name: name ?? this.name, + timestamp: timestamp ?? this.timestamp, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueueJobResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is QueueJobResponseDto && + const DeepCollectionEquality().equals(data, other.data) && + id == other.id && + name == other.name && + timestamp == other.timestamp); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = QueueJobResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(data), id, name, timestamp]); } - // maps a json object with a list of QueueJobResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = QueueJobResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'data', - 'name', - 'timestamp', - }; + @override + String toString() => 'QueueJobResponseDto(data=$data, id=$id, name=$name, timestamp=$timestamp)'; } - diff --git a/mobile/openapi/lib/model/queue_job_status.dart b/mobile/openapi/lib/model/queue_job_status.dart index cbd01b11ed..e4b836777a 100644 --- a/mobile/openapi/lib/model/queue_job_status.dart +++ b/mobile/openapi/lib/model/queue_job_status.dart @@ -1,97 +1,32 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Queue job status -class QueueJobStatus { - /// Instantiate a new enum with the provided [value]. +enum QueueJobStatus { + active._(r'active'), + failed._(r'failed'), + completed._(r'completed'), + delayed._(r'delayed'), + waiting._(r'waiting'), + paused._(r'paused'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const QueueJobStatus._(this.value); - /// The underlying value of this enum member. final String value; + static QueueJobStatus? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const active = QueueJobStatus._(r'active'); - static const failed = QueueJobStatus._(r'failed'); - static const completed = QueueJobStatus._(r'completed'); - static const delayed = QueueJobStatus._(r'delayed'); - static const waiting = QueueJobStatus._(r'waiting'); - static const paused = QueueJobStatus._(r'paused'); - - /// List of all possible values in this [enum][QueueJobStatus]. - static const values = [ - active, - failed, - completed, - delayed, - waiting, - paused, - ]; - - static QueueJobStatus? fromJson(dynamic value) => QueueJobStatusTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueueJobStatus.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [QueueJobStatus] to String, -/// and [decode] dynamic data back to [QueueJobStatus]. -class QueueJobStatusTypeTransformer { - factory QueueJobStatusTypeTransformer() => _instance ??= const QueueJobStatusTypeTransformer._(); - - const QueueJobStatusTypeTransformer._(); - - String encode(QueueJobStatus data) => data.value; - - /// Decodes a [dynamic value][data] to a QueueJobStatus. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - QueueJobStatus? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'active': return QueueJobStatus.active; - case r'failed': return QueueJobStatus.failed; - case r'completed': return QueueJobStatus.completed; - case r'delayed': return QueueJobStatus.delayed; - case r'waiting': return QueueJobStatus.waiting; - case r'paused': return QueueJobStatus.paused; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [QueueJobStatusTypeTransformer] instance. - static QueueJobStatusTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/queue_name.dart b/mobile/openapi/lib/model/queue_name.dart index eb19d8957f..e5e791571e 100644 --- a/mobile/openapi/lib/model/queue_name.dart +++ b/mobile/openapi/lib/model/queue_name.dart @@ -1,133 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Queue name -class QueueName { - /// Instantiate a new enum with the provided [value]. +enum QueueName { + thumbnailGeneration._(r'thumbnailGeneration'), + metadataExtraction._(r'metadataExtraction'), + videoConversion._(r'videoConversion'), + faceDetection._(r'faceDetection'), + facialRecognition._(r'facialRecognition'), + smartSearch._(r'smartSearch'), + duplicateDetection._(r'duplicateDetection'), + backgroundTask._(r'backgroundTask'), + storageTemplateMigration._(r'storageTemplateMigration'), + migration._(r'migration'), + search._(r'search'), + sidecar._(r'sidecar'), + library$._(r'library'), + notifications._(r'notifications'), + backupDatabase._(r'backupDatabase'), + ocr._(r'ocr'), + workflow._(r'workflow'), + editor._(r'editor'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const QueueName._(this.value); - /// The underlying value of this enum member. final String value; + static QueueName? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const thumbnailGeneration = QueueName._(r'thumbnailGeneration'); - static const metadataExtraction = QueueName._(r'metadataExtraction'); - static const videoConversion = QueueName._(r'videoConversion'); - static const faceDetection = QueueName._(r'faceDetection'); - static const facialRecognition = QueueName._(r'facialRecognition'); - static const smartSearch = QueueName._(r'smartSearch'); - static const duplicateDetection = QueueName._(r'duplicateDetection'); - static const backgroundTask = QueueName._(r'backgroundTask'); - static const storageTemplateMigration = QueueName._(r'storageTemplateMigration'); - static const migration = QueueName._(r'migration'); - static const search = QueueName._(r'search'); - static const sidecar = QueueName._(r'sidecar'); - static const library_ = QueueName._(r'library'); - static const notifications = QueueName._(r'notifications'); - static const backupDatabase = QueueName._(r'backupDatabase'); - static const ocr = QueueName._(r'ocr'); - static const workflow = QueueName._(r'workflow'); - static const editor = QueueName._(r'editor'); - - /// List of all possible values in this [enum][QueueName]. - static const values = [ - thumbnailGeneration, - metadataExtraction, - videoConversion, - faceDetection, - facialRecognition, - smartSearch, - duplicateDetection, - backgroundTask, - storageTemplateMigration, - migration, - search, - sidecar, - library_, - notifications, - backupDatabase, - ocr, - workflow, - editor, - ]; - - static QueueName? fromJson(dynamic value) => QueueNameTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueueName.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [QueueName] to String, -/// and [decode] dynamic data back to [QueueName]. -class QueueNameTypeTransformer { - factory QueueNameTypeTransformer() => _instance ??= const QueueNameTypeTransformer._(); - - const QueueNameTypeTransformer._(); - - String encode(QueueName data) => data.value; - - /// Decodes a [dynamic value][data] to a QueueName. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - QueueName? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'thumbnailGeneration': return QueueName.thumbnailGeneration; - case r'metadataExtraction': return QueueName.metadataExtraction; - case r'videoConversion': return QueueName.videoConversion; - case r'faceDetection': return QueueName.faceDetection; - case r'facialRecognition': return QueueName.facialRecognition; - case r'smartSearch': return QueueName.smartSearch; - case r'duplicateDetection': return QueueName.duplicateDetection; - case r'backgroundTask': return QueueName.backgroundTask; - case r'storageTemplateMigration': return QueueName.storageTemplateMigration; - case r'migration': return QueueName.migration; - case r'search': return QueueName.search; - case r'sidecar': return QueueName.sidecar; - case r'library': return QueueName.library_; - case r'notifications': return QueueName.notifications; - case r'backupDatabase': return QueueName.backupDatabase; - case r'ocr': return QueueName.ocr; - case r'workflow': return QueueName.workflow; - case r'editor': return QueueName.editor; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [QueueNameTypeTransformer] instance. - static QueueNameTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/queue_response_dto.dart b/mobile/openapi/lib/model/queue_response_dto.dart index c88f9fc195..d83df86a41 100644 --- a/mobile/openapi/lib/model/queue_response_dto.dart +++ b/mobile/openapi/lib/model/queue_response_dto.dart @@ -1,116 +1,58 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class QueueResponseDto { - /// Returns a new [QueueResponseDto] instance. - QueueResponseDto({ - required this.isPaused, - required this.name, - required this.statistics, - }); +final class QueueResponseDto { + const QueueResponseDto({required this.isPaused, required this.name, required this.statistics}); /// Whether the queue is paused - bool isPaused; + final bool isPaused; - QueueName name; + final QueueName name; - QueueStatisticsDto statistics; + final QueueStatisticsDto statistics; - @override - bool operator ==(Object other) => identical(this, other) || other is QueueResponseDto && - other.isPaused == isPaused && - other.name == name && - other.statistics == statistics; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (isPaused.hashCode) + - (name.hashCode) + - (statistics.hashCode); - - @override - String toString() => 'QueueResponseDto[isPaused=$isPaused, name=$name, statistics=$statistics]'; + static QueueResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + isPaused: json[r'isPaused'] as bool, + name: (QueueName.fromJson(json[r'name']))!, + statistics: (QueueStatisticsDto.fromJson(json[r'statistics']))!, + ); + } Map toJson() { final json = {}; - json[r'isPaused'] = this.isPaused; - json[r'name'] = this.name; - json[r'statistics'] = this.statistics; + json[r'isPaused'] = isPaused; + json[r'name'] = name.toJson(); + json[r'statistics'] = statistics.toJson(); return json; } - /// Returns a new [QueueResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static QueueResponseDto? fromJson(dynamic value) { - upgradeDto(value, "QueueResponseDto"); - if (value is Map) { - final json = value.cast(); - - return QueueResponseDto( - isPaused: mapValueOfType(json, r'isPaused')!, - name: QueueName.fromJson(json[r'name'])!, - statistics: QueueStatisticsDto.fromJson(json[r'statistics'])!, - ); - } - return null; + QueueResponseDto copyWith({bool? isPaused, QueueName? name, QueueStatisticsDto? statistics}) { + return .new( + isPaused: isPaused ?? this.isPaused, + name: name ?? this.name, + statistics: statistics ?? this.statistics, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueueResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is QueueResponseDto && + isPaused == other.isPaused && + name == other.name && + statistics == other.statistics); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = QueueResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([isPaused, name, statistics]); } - // maps a json object with a list of QueueResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = QueueResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'isPaused', - 'name', - 'statistics', - }; + @override + String toString() => 'QueueResponseDto(isPaused=$isPaused, name=$name, statistics=$statistics)'; } - diff --git a/mobile/openapi/lib/model/queue_response_legacy_dto.dart b/mobile/openapi/lib/model/queue_response_legacy_dto.dart index 214b0b31f6..c9e7690dc0 100644 --- a/mobile/openapi/lib/model/queue_response_legacy_dto.dart +++ b/mobile/openapi/lib/model/queue_response_legacy_dto.dart @@ -1,107 +1,46 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class QueueResponseLegacyDto { - /// Returns a new [QueueResponseLegacyDto] instance. - QueueResponseLegacyDto({ - required this.jobCounts, - required this.queueStatus, - }); +final class QueueResponseLegacyDto { + const QueueResponseLegacyDto({required this.jobCounts, required this.queueStatus}); - QueueStatisticsDto jobCounts; + final QueueStatisticsDto jobCounts; - QueueStatusLegacyDto queueStatus; + final QueueStatusLegacyDto queueStatus; - @override - bool operator ==(Object other) => identical(this, other) || other is QueueResponseLegacyDto && - other.jobCounts == jobCounts && - other.queueStatus == queueStatus; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (jobCounts.hashCode) + - (queueStatus.hashCode); - - @override - String toString() => 'QueueResponseLegacyDto[jobCounts=$jobCounts, queueStatus=$queueStatus]'; + static QueueResponseLegacyDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + jobCounts: (QueueStatisticsDto.fromJson(json[r'jobCounts']))!, + queueStatus: (QueueStatusLegacyDto.fromJson(json[r'queueStatus']))!, + ); + } Map toJson() { final json = {}; - json[r'jobCounts'] = this.jobCounts; - json[r'queueStatus'] = this.queueStatus; + json[r'jobCounts'] = jobCounts.toJson(); + json[r'queueStatus'] = queueStatus.toJson(); return json; } - /// Returns a new [QueueResponseLegacyDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static QueueResponseLegacyDto? fromJson(dynamic value) { - upgradeDto(value, "QueueResponseLegacyDto"); - if (value is Map) { - final json = value.cast(); - - return QueueResponseLegacyDto( - jobCounts: QueueStatisticsDto.fromJson(json[r'jobCounts'])!, - queueStatus: QueueStatusLegacyDto.fromJson(json[r'queueStatus'])!, - ); - } - return null; + QueueResponseLegacyDto copyWith({QueueStatisticsDto? jobCounts, QueueStatusLegacyDto? queueStatus}) { + return .new(jobCounts: jobCounts ?? this.jobCounts, queueStatus: queueStatus ?? this.queueStatus); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueueResponseLegacyDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is QueueResponseLegacyDto && jobCounts == other.jobCounts && queueStatus == other.queueStatus); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = QueueResponseLegacyDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([jobCounts, queueStatus]); } - // maps a json object with a list of QueueResponseLegacyDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = QueueResponseLegacyDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'jobCounts', - 'queueStatus', - }; + @override + String toString() => 'QueueResponseLegacyDto(jobCounts=$jobCounts, queueStatus=$queueStatus)'; } - diff --git a/mobile/openapi/lib/model/queue_statistics_dto.dart b/mobile/openapi/lib/model/queue_statistics_dto.dart index 86c75f8e7c..737701b453 100644 --- a/mobile/openapi/lib/model/queue_statistics_dto.dart +++ b/mobile/openapi/lib/model/queue_statistics_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class QueueStatisticsDto { - /// Returns a new [QueueStatisticsDto] instance. - QueueStatisticsDto({ +final class QueueStatisticsDto { + const QueueStatisticsDto({ required this.active, required this.completed, required this.delayed, @@ -22,142 +13,77 @@ class QueueStatisticsDto { }); /// Number of active jobs - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int active; + final int active; /// Number of completed jobs - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int completed; + final int completed; /// Number of delayed jobs - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int delayed; + final int delayed; /// Number of failed jobs - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int failed; + final int failed; /// Number of paused jobs - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int paused; + final int paused; /// Number of waiting jobs - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int waiting; + final int waiting; - @override - bool operator ==(Object other) => identical(this, other) || other is QueueStatisticsDto && - other.active == active && - other.completed == completed && - other.delayed == delayed && - other.failed == failed && - other.paused == paused && - other.waiting == waiting; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (active.hashCode) + - (completed.hashCode) + - (delayed.hashCode) + - (failed.hashCode) + - (paused.hashCode) + - (waiting.hashCode); - - @override - String toString() => 'QueueStatisticsDto[active=$active, completed=$completed, delayed=$delayed, failed=$failed, paused=$paused, waiting=$waiting]'; + static QueueStatisticsDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + active: json[r'active'] as int, + completed: json[r'completed'] as int, + delayed: json[r'delayed'] as int, + failed: json[r'failed'] as int, + paused: json[r'paused'] as int, + waiting: json[r'waiting'] as int, + ); + } Map toJson() { final json = {}; - json[r'active'] = this.active; - json[r'completed'] = this.completed; - json[r'delayed'] = this.delayed; - json[r'failed'] = this.failed; - json[r'paused'] = this.paused; - json[r'waiting'] = this.waiting; + json[r'active'] = active; + json[r'completed'] = completed; + json[r'delayed'] = delayed; + json[r'failed'] = failed; + json[r'paused'] = paused; + json[r'waiting'] = waiting; return json; } - /// Returns a new [QueueStatisticsDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static QueueStatisticsDto? fromJson(dynamic value) { - upgradeDto(value, "QueueStatisticsDto"); - if (value is Map) { - final json = value.cast(); - - return QueueStatisticsDto( - active: mapValueOfType(json, r'active')!, - completed: mapValueOfType(json, r'completed')!, - delayed: mapValueOfType(json, r'delayed')!, - failed: mapValueOfType(json, r'failed')!, - paused: mapValueOfType(json, r'paused')!, - waiting: mapValueOfType(json, r'waiting')!, - ); - } - return null; + QueueStatisticsDto copyWith({int? active, int? completed, int? delayed, int? failed, int? paused, int? waiting}) { + return .new( + active: active ?? this.active, + completed: completed ?? this.completed, + delayed: delayed ?? this.delayed, + failed: failed ?? this.failed, + paused: paused ?? this.paused, + waiting: waiting ?? this.waiting, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueueStatisticsDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is QueueStatisticsDto && + active == other.active && + completed == other.completed && + delayed == other.delayed && + failed == other.failed && + paused == other.paused && + waiting == other.waiting); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = QueueStatisticsDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([active, completed, delayed, failed, paused, waiting]); } - // maps a json object with a list of QueueStatisticsDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = QueueStatisticsDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'active', - 'completed', - 'delayed', - 'failed', - 'paused', - 'waiting', - }; + @override + String toString() => + 'QueueStatisticsDto(active=$active, completed=$completed, delayed=$delayed, failed=$failed, paused=$paused, waiting=$waiting)'; } - diff --git a/mobile/openapi/lib/model/queue_status_legacy_dto.dart b/mobile/openapi/lib/model/queue_status_legacy_dto.dart index de6ce63319..b534011b0b 100644 --- a/mobile/openapi/lib/model/queue_status_legacy_dto.dart +++ b/mobile/openapi/lib/model/queue_status_legacy_dto.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class QueueStatusLegacyDto { - /// Returns a new [QueueStatusLegacyDto] instance. - QueueStatusLegacyDto({ - required this.isActive, - required this.isPaused, - }); +final class QueueStatusLegacyDto { + const QueueStatusLegacyDto({required this.isActive, required this.isPaused}); /// Whether the queue is currently active (has running jobs) - bool isActive; + final bool isActive; /// Whether the queue is paused - bool isPaused; + final bool isPaused; - @override - bool operator ==(Object other) => identical(this, other) || other is QueueStatusLegacyDto && - other.isActive == isActive && - other.isPaused == isPaused; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (isActive.hashCode) + - (isPaused.hashCode); - - @override - String toString() => 'QueueStatusLegacyDto[isActive=$isActive, isPaused=$isPaused]'; + static QueueStatusLegacyDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(isActive: json[r'isActive'] as bool, isPaused: json[r'isPaused'] as bool); + } Map toJson() { final json = {}; - json[r'isActive'] = this.isActive; - json[r'isPaused'] = this.isPaused; + json[r'isActive'] = isActive; + json[r'isPaused'] = isPaused; return json; } - /// Returns a new [QueueStatusLegacyDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static QueueStatusLegacyDto? fromJson(dynamic value) { - upgradeDto(value, "QueueStatusLegacyDto"); - if (value is Map) { - final json = value.cast(); - - return QueueStatusLegacyDto( - isActive: mapValueOfType(json, r'isActive')!, - isPaused: mapValueOfType(json, r'isPaused')!, - ); - } - return null; + QueueStatusLegacyDto copyWith({bool? isActive, bool? isPaused}) { + return .new(isActive: isActive ?? this.isActive, isPaused: isPaused ?? this.isPaused); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueueStatusLegacyDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is QueueStatusLegacyDto && isActive == other.isActive && isPaused == other.isPaused); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = QueueStatusLegacyDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([isActive, isPaused]); } - // maps a json object with a list of QueueStatusLegacyDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = QueueStatusLegacyDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'isActive', - 'isPaused', - }; + @override + String toString() => 'QueueStatusLegacyDto(isActive=$isActive, isPaused=$isPaused)'; } - diff --git a/mobile/openapi/lib/model/queue_update_dto.dart b/mobile/openapi/lib/model/queue_update_dto.dart index 28aafe95f7..460ea2c2d1 100644 --- a/mobile/openapi/lib/model/queue_update_dto.dart +++ b/mobile/openapi/lib/model/queue_update_dto.dart @@ -1,109 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class QueueUpdateDto { - /// Returns a new [QueueUpdateDto] instance. - QueueUpdateDto({ - this.isPaused, - }); +final class QueueUpdateDto { + const QueueUpdateDto({this.isPaused = const Optional.absent()}); /// Whether to pause the queue - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isPaused; + final Optional isPaused; - @override - bool operator ==(Object other) => identical(this, other) || other is QueueUpdateDto && - other.isPaused == isPaused; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (isPaused == null ? 0 : isPaused!.hashCode); - - @override - String toString() => 'QueueUpdateDto[isPaused=$isPaused]'; + static QueueUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + isPaused: json.containsKey(r'isPaused') ? Optional.present(json[r'isPaused'] as bool) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.isPaused != null) { - json[r'isPaused'] = this.isPaused; - } else { - // json[r'isPaused'] = null; + if (isPaused case Present(:final value)) { + json[r'isPaused'] = value; } return json; } - /// Returns a new [QueueUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static QueueUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "QueueUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return QueueUpdateDto( - isPaused: mapValueOfType(json, r'isPaused'), - ); - } - return null; + QueueUpdateDto copyWith({Optional? isPaused}) { + return .new(isPaused: isPaused ?? this.isPaused); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueueUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is QueueUpdateDto && isPaused == other.isPaused); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = QueueUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([isPaused]); } - // maps a json object with a list of QueueUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = QueueUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'QueueUpdateDto(isPaused=$isPaused)'; } - diff --git a/mobile/openapi/lib/model/queues_response_legacy_dto.dart b/mobile/openapi/lib/model/queues_response_legacy_dto.dart index c7bc23cb4d..9773b59c55 100644 --- a/mobile/openapi/lib/model/queues_response_legacy_dto.dart +++ b/mobile/openapi/lib/model/queues_response_legacy_dto.dart @@ -1,25 +1,16 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class QueuesResponseLegacyDto { - /// Returns a new [QueuesResponseLegacyDto] instance. - QueuesResponseLegacyDto({ +final class QueuesResponseLegacyDto { + const QueuesResponseLegacyDto({ required this.backgroundTask, required this.backupDatabase, required this.duplicateDetection, required this.editor, required this.faceDetection, required this.facialRecognition, - required this.library_, + required this.library$, required this.metadataExtraction, required this.migration, required this.notifications, @@ -33,203 +24,182 @@ class QueuesResponseLegacyDto { required this.workflow, }); - QueueResponseLegacyDto backgroundTask; + final QueueResponseLegacyDto backgroundTask; - QueueResponseLegacyDto backupDatabase; + final QueueResponseLegacyDto backupDatabase; - QueueResponseLegacyDto duplicateDetection; + final QueueResponseLegacyDto duplicateDetection; - QueueResponseLegacyDto editor; + final QueueResponseLegacyDto editor; - QueueResponseLegacyDto faceDetection; + final QueueResponseLegacyDto faceDetection; - QueueResponseLegacyDto facialRecognition; + final QueueResponseLegacyDto facialRecognition; - QueueResponseLegacyDto library_; + final QueueResponseLegacyDto library$; - QueueResponseLegacyDto metadataExtraction; + final QueueResponseLegacyDto metadataExtraction; - QueueResponseLegacyDto migration; + final QueueResponseLegacyDto migration; - QueueResponseLegacyDto notifications; + final QueueResponseLegacyDto notifications; - QueueResponseLegacyDto ocr; + final QueueResponseLegacyDto ocr; - QueueResponseLegacyDto search; + final QueueResponseLegacyDto search; - QueueResponseLegacyDto sidecar; + final QueueResponseLegacyDto sidecar; - QueueResponseLegacyDto smartSearch; + final QueueResponseLegacyDto smartSearch; - QueueResponseLegacyDto storageTemplateMigration; + final QueueResponseLegacyDto storageTemplateMigration; - QueueResponseLegacyDto thumbnailGeneration; + final QueueResponseLegacyDto thumbnailGeneration; - QueueResponseLegacyDto videoConversion; + final QueueResponseLegacyDto videoConversion; - QueueResponseLegacyDto workflow; + final QueueResponseLegacyDto workflow; - @override - bool operator ==(Object other) => identical(this, other) || other is QueuesResponseLegacyDto && - other.backgroundTask == backgroundTask && - other.backupDatabase == backupDatabase && - other.duplicateDetection == duplicateDetection && - other.editor == editor && - other.faceDetection == faceDetection && - other.facialRecognition == facialRecognition && - other.library_ == library_ && - other.metadataExtraction == metadataExtraction && - other.migration == migration && - other.notifications == notifications && - other.ocr == ocr && - other.search == search && - other.sidecar == sidecar && - other.smartSearch == smartSearch && - other.storageTemplateMigration == storageTemplateMigration && - other.thumbnailGeneration == thumbnailGeneration && - other.videoConversion == videoConversion && - other.workflow == workflow; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (backgroundTask.hashCode) + - (backupDatabase.hashCode) + - (duplicateDetection.hashCode) + - (editor.hashCode) + - (faceDetection.hashCode) + - (facialRecognition.hashCode) + - (library_.hashCode) + - (metadataExtraction.hashCode) + - (migration.hashCode) + - (notifications.hashCode) + - (ocr.hashCode) + - (search.hashCode) + - (sidecar.hashCode) + - (smartSearch.hashCode) + - (storageTemplateMigration.hashCode) + - (thumbnailGeneration.hashCode) + - (videoConversion.hashCode) + - (workflow.hashCode); - - @override - String toString() => 'QueuesResponseLegacyDto[backgroundTask=$backgroundTask, backupDatabase=$backupDatabase, duplicateDetection=$duplicateDetection, editor=$editor, faceDetection=$faceDetection, facialRecognition=$facialRecognition, library_=$library_, metadataExtraction=$metadataExtraction, migration=$migration, notifications=$notifications, ocr=$ocr, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, storageTemplateMigration=$storageTemplateMigration, thumbnailGeneration=$thumbnailGeneration, videoConversion=$videoConversion, workflow=$workflow]'; + static QueuesResponseLegacyDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + backgroundTask: (QueueResponseLegacyDto.fromJson(json[r'backgroundTask']))!, + backupDatabase: (QueueResponseLegacyDto.fromJson(json[r'backupDatabase']))!, + duplicateDetection: (QueueResponseLegacyDto.fromJson(json[r'duplicateDetection']))!, + editor: (QueueResponseLegacyDto.fromJson(json[r'editor']))!, + faceDetection: (QueueResponseLegacyDto.fromJson(json[r'faceDetection']))!, + facialRecognition: (QueueResponseLegacyDto.fromJson(json[r'facialRecognition']))!, + library$: (QueueResponseLegacyDto.fromJson(json[r'library']))!, + metadataExtraction: (QueueResponseLegacyDto.fromJson(json[r'metadataExtraction']))!, + migration: (QueueResponseLegacyDto.fromJson(json[r'migration']))!, + notifications: (QueueResponseLegacyDto.fromJson(json[r'notifications']))!, + ocr: (QueueResponseLegacyDto.fromJson(json[r'ocr']))!, + search: (QueueResponseLegacyDto.fromJson(json[r'search']))!, + sidecar: (QueueResponseLegacyDto.fromJson(json[r'sidecar']))!, + smartSearch: (QueueResponseLegacyDto.fromJson(json[r'smartSearch']))!, + storageTemplateMigration: (QueueResponseLegacyDto.fromJson(json[r'storageTemplateMigration']))!, + thumbnailGeneration: (QueueResponseLegacyDto.fromJson(json[r'thumbnailGeneration']))!, + videoConversion: (QueueResponseLegacyDto.fromJson(json[r'videoConversion']))!, + workflow: (QueueResponseLegacyDto.fromJson(json[r'workflow']))!, + ); + } Map toJson() { final json = {}; - json[r'backgroundTask'] = this.backgroundTask; - json[r'backupDatabase'] = this.backupDatabase; - json[r'duplicateDetection'] = this.duplicateDetection; - json[r'editor'] = this.editor; - json[r'faceDetection'] = this.faceDetection; - json[r'facialRecognition'] = this.facialRecognition; - json[r'library'] = this.library_; - json[r'metadataExtraction'] = this.metadataExtraction; - json[r'migration'] = this.migration; - json[r'notifications'] = this.notifications; - json[r'ocr'] = this.ocr; - json[r'search'] = this.search; - json[r'sidecar'] = this.sidecar; - json[r'smartSearch'] = this.smartSearch; - json[r'storageTemplateMigration'] = this.storageTemplateMigration; - json[r'thumbnailGeneration'] = this.thumbnailGeneration; - json[r'videoConversion'] = this.videoConversion; - json[r'workflow'] = this.workflow; + json[r'backgroundTask'] = backgroundTask.toJson(); + json[r'backupDatabase'] = backupDatabase.toJson(); + json[r'duplicateDetection'] = duplicateDetection.toJson(); + json[r'editor'] = editor.toJson(); + json[r'faceDetection'] = faceDetection.toJson(); + json[r'facialRecognition'] = facialRecognition.toJson(); + json[r'library'] = library$.toJson(); + json[r'metadataExtraction'] = metadataExtraction.toJson(); + json[r'migration'] = migration.toJson(); + json[r'notifications'] = notifications.toJson(); + json[r'ocr'] = ocr.toJson(); + json[r'search'] = search.toJson(); + json[r'sidecar'] = sidecar.toJson(); + json[r'smartSearch'] = smartSearch.toJson(); + json[r'storageTemplateMigration'] = storageTemplateMigration.toJson(); + json[r'thumbnailGeneration'] = thumbnailGeneration.toJson(); + json[r'videoConversion'] = videoConversion.toJson(); + json[r'workflow'] = workflow.toJson(); return json; } - /// Returns a new [QueuesResponseLegacyDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static QueuesResponseLegacyDto? fromJson(dynamic value) { - upgradeDto(value, "QueuesResponseLegacyDto"); - if (value is Map) { - final json = value.cast(); - - return QueuesResponseLegacyDto( - backgroundTask: QueueResponseLegacyDto.fromJson(json[r'backgroundTask'])!, - backupDatabase: QueueResponseLegacyDto.fromJson(json[r'backupDatabase'])!, - duplicateDetection: QueueResponseLegacyDto.fromJson(json[r'duplicateDetection'])!, - editor: QueueResponseLegacyDto.fromJson(json[r'editor'])!, - faceDetection: QueueResponseLegacyDto.fromJson(json[r'faceDetection'])!, - facialRecognition: QueueResponseLegacyDto.fromJson(json[r'facialRecognition'])!, - library_: QueueResponseLegacyDto.fromJson(json[r'library'])!, - metadataExtraction: QueueResponseLegacyDto.fromJson(json[r'metadataExtraction'])!, - migration: QueueResponseLegacyDto.fromJson(json[r'migration'])!, - notifications: QueueResponseLegacyDto.fromJson(json[r'notifications'])!, - ocr: QueueResponseLegacyDto.fromJson(json[r'ocr'])!, - search: QueueResponseLegacyDto.fromJson(json[r'search'])!, - sidecar: QueueResponseLegacyDto.fromJson(json[r'sidecar'])!, - smartSearch: QueueResponseLegacyDto.fromJson(json[r'smartSearch'])!, - storageTemplateMigration: QueueResponseLegacyDto.fromJson(json[r'storageTemplateMigration'])!, - thumbnailGeneration: QueueResponseLegacyDto.fromJson(json[r'thumbnailGeneration'])!, - videoConversion: QueueResponseLegacyDto.fromJson(json[r'videoConversion'])!, - workflow: QueueResponseLegacyDto.fromJson(json[r'workflow'])!, - ); - } - return null; + QueuesResponseLegacyDto copyWith({ + QueueResponseLegacyDto? backgroundTask, + QueueResponseLegacyDto? backupDatabase, + QueueResponseLegacyDto? duplicateDetection, + QueueResponseLegacyDto? editor, + QueueResponseLegacyDto? faceDetection, + QueueResponseLegacyDto? facialRecognition, + QueueResponseLegacyDto? library$, + QueueResponseLegacyDto? metadataExtraction, + QueueResponseLegacyDto? migration, + QueueResponseLegacyDto? notifications, + QueueResponseLegacyDto? ocr, + QueueResponseLegacyDto? search, + QueueResponseLegacyDto? sidecar, + QueueResponseLegacyDto? smartSearch, + QueueResponseLegacyDto? storageTemplateMigration, + QueueResponseLegacyDto? thumbnailGeneration, + QueueResponseLegacyDto? videoConversion, + QueueResponseLegacyDto? workflow, + }) { + return .new( + backgroundTask: backgroundTask ?? this.backgroundTask, + backupDatabase: backupDatabase ?? this.backupDatabase, + duplicateDetection: duplicateDetection ?? this.duplicateDetection, + editor: editor ?? this.editor, + faceDetection: faceDetection ?? this.faceDetection, + facialRecognition: facialRecognition ?? this.facialRecognition, + library$: library$ ?? this.library$, + metadataExtraction: metadataExtraction ?? this.metadataExtraction, + migration: migration ?? this.migration, + notifications: notifications ?? this.notifications, + ocr: ocr ?? this.ocr, + search: search ?? this.search, + sidecar: sidecar ?? this.sidecar, + smartSearch: smartSearch ?? this.smartSearch, + storageTemplateMigration: storageTemplateMigration ?? this.storageTemplateMigration, + thumbnailGeneration: thumbnailGeneration ?? this.thumbnailGeneration, + videoConversion: videoConversion ?? this.videoConversion, + workflow: workflow ?? this.workflow, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = QueuesResponseLegacyDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is QueuesResponseLegacyDto && + backgroundTask == other.backgroundTask && + backupDatabase == other.backupDatabase && + duplicateDetection == other.duplicateDetection && + editor == other.editor && + faceDetection == other.faceDetection && + facialRecognition == other.facialRecognition && + library$ == other.library$ && + metadataExtraction == other.metadataExtraction && + migration == other.migration && + notifications == other.notifications && + ocr == other.ocr && + search == other.search && + sidecar == other.sidecar && + smartSearch == other.smartSearch && + storageTemplateMigration == other.storageTemplateMigration && + thumbnailGeneration == other.thumbnailGeneration && + videoConversion == other.videoConversion && + workflow == other.workflow); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = QueuesResponseLegacyDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + backgroundTask, + backupDatabase, + duplicateDetection, + editor, + faceDetection, + facialRecognition, + library$, + metadataExtraction, + migration, + notifications, + ocr, + search, + sidecar, + smartSearch, + storageTemplateMigration, + thumbnailGeneration, + videoConversion, + workflow, + ]); } - // maps a json object with a list of QueuesResponseLegacyDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = QueuesResponseLegacyDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'backgroundTask', - 'backupDatabase', - 'duplicateDetection', - 'editor', - 'faceDetection', - 'facialRecognition', - 'library', - 'metadataExtraction', - 'migration', - 'notifications', - 'ocr', - 'search', - 'sidecar', - 'smartSearch', - 'storageTemplateMigration', - 'thumbnailGeneration', - 'videoConversion', - 'workflow', - }; + @override + String toString() => + 'QueuesResponseLegacyDto(backgroundTask=$backgroundTask, backupDatabase=$backupDatabase, duplicateDetection=$duplicateDetection, editor=$editor, faceDetection=$faceDetection, facialRecognition=$facialRecognition, library\$=${library$}, metadataExtraction=$metadataExtraction, migration=$migration, notifications=$notifications, ocr=$ocr, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, storageTemplateMigration=$storageTemplateMigration, thumbnailGeneration=$thumbnailGeneration, videoConversion=$videoConversion, workflow=$workflow)'; } - diff --git a/mobile/openapi/lib/model/random_search_dto.dart b/mobile/openapi/lib/model/random_search_dto.dart index 728072639c..b8eedca690 100644 --- a/mobile/openapi/lib/model/random_search_dto.dart +++ b/mobile/openapi/lib/model/random_search_dto.dart @@ -1,619 +1,474 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class RandomSearchDto { - /// Returns a new [RandomSearchDto] instance. - RandomSearchDto({ - this.albumIds = const [], - this.city, - this.country, - this.createdAfter, - this.createdBefore, - this.isEncoded, - this.isFavorite, - this.isMotion, - this.isNotInAlbum, - this.isOffline, - this.lensModel, - this.libraryId, - this.make, - this.model, - this.ocr, - this.personIds = const [], - this.rating, - this.size, - this.state, - this.tagIds = const [], - this.takenAfter, - this.takenBefore, - this.trashedAfter, - this.trashedBefore, - this.type, - this.updatedAfter, - this.updatedBefore, - this.visibility, - this.withDeleted, - this.withExif, - this.withPeople, - this.withStacked, +final class RandomSearchDto { + const RandomSearchDto({ + this.albumIds = const Optional.absent(), + this.city = const Optional.absent(), + this.country = const Optional.absent(), + this.createdAfter = const Optional.absent(), + this.createdBefore = const Optional.absent(), + this.isEncoded = const Optional.absent(), + this.isFavorite = const Optional.absent(), + this.isMotion = const Optional.absent(), + this.isNotInAlbum = const Optional.absent(), + this.isOffline = const Optional.absent(), + this.lensModel = const Optional.absent(), + this.libraryId = const Optional.absent(), + this.make = const Optional.absent(), + this.model = const Optional.absent(), + this.ocr = const Optional.absent(), + this.personIds = const Optional.absent(), + this.rating = const Optional.absent(), + this.size = const Optional.absent(), + this.state = const Optional.absent(), + this.tagIds = const Optional.absent(), + this.takenAfter = const Optional.absent(), + this.takenBefore = const Optional.absent(), + this.trashedAfter = const Optional.absent(), + this.trashedBefore = const Optional.absent(), + this.type = const Optional.absent(), + this.updatedAfter = const Optional.absent(), + this.updatedBefore = const Optional.absent(), + this.visibility = const Optional.absent(), + this.withDeleted = const Optional.absent(), + this.withExif = const Optional.absent(), + this.withPeople = const Optional.absent(), + this.withStacked = const Optional.absent(), }); /// Filter by album IDs - List albumIds; + final Optional> albumIds; /// Filter by city name - String? city; + final Optional city; /// Filter by country name - String? country; + final Optional country; /// Filter by creation date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? createdAfter; + final Optional createdAfter; /// Filter by creation date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? createdBefore; + final Optional createdBefore; /// Filter by encoded status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isEncoded; + final Optional isEncoded; /// Filter by favorite status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isFavorite; + final Optional isFavorite; /// Filter by motion photo status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isMotion; + final Optional isMotion; /// Filter assets not in any album - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isNotInAlbum; + final Optional isNotInAlbum; /// Filter by offline status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isOffline; + final Optional isOffline; /// Filter by lens model - String? lensModel; + final Optional lensModel; /// Library ID to filter by - String? libraryId; + final Optional libraryId; /// Filter by camera make - String? make; + final Optional make; /// Filter by camera model - String? model; + final Optional model; /// Filter by OCR text content - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? ocr; + final Optional ocr; /// Filter by person IDs - List personIds; + final Optional> personIds; /// Filter by rating [1-5], or null for unrated - /// - /// Minimum value: -1 - /// Maximum value: 5 - int? rating; + /// Available since server v1.0.0. + final Optional rating; /// Number of results to return - /// - /// Minimum value: 1 - /// Maximum value: 1000 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - int? size; + final Optional size; /// Filter by state/province name - String? state; + final Optional state; /// Filter by tag IDs - List? tagIds; + final Optional?> tagIds; /// Filter by taken date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? takenAfter; + final Optional takenAfter; /// Filter by taken date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? takenBefore; + final Optional takenBefore; /// Filter by trash date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? trashedAfter; + final Optional trashedAfter; /// Filter by trash date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? trashedBefore; + final Optional trashedBefore; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetTypeEnum? type; + final Optional type; /// Filter by update date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? updatedAfter; + final Optional updatedAfter; /// Filter by update date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? updatedBefore; + final Optional updatedBefore; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetVisibility? visibility; + final Optional visibility; /// Include deleted assets - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? withDeleted; + final Optional withDeleted; /// Include EXIF data in response - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? withExif; + final Optional withExif; /// Include people data in response - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? withPeople; + final Optional withPeople; /// Include stacked assets - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? withStacked; + final Optional withStacked; - @override - bool operator ==(Object other) => identical(this, other) || other is RandomSearchDto && - _deepEquality.equals(other.albumIds, albumIds) && - other.city == city && - other.country == country && - other.createdAfter == createdAfter && - other.createdBefore == createdBefore && - other.isEncoded == isEncoded && - other.isFavorite == isFavorite && - other.isMotion == isMotion && - other.isNotInAlbum == isNotInAlbum && - other.isOffline == isOffline && - other.lensModel == lensModel && - other.libraryId == libraryId && - other.make == make && - other.model == model && - other.ocr == ocr && - _deepEquality.equals(other.personIds, personIds) && - other.rating == rating && - other.size == size && - other.state == state && - _deepEquality.equals(other.tagIds, tagIds) && - other.takenAfter == takenAfter && - other.takenBefore == takenBefore && - other.trashedAfter == trashedAfter && - other.trashedBefore == trashedBefore && - other.type == type && - other.updatedAfter == updatedAfter && - other.updatedBefore == updatedBefore && - other.visibility == visibility && - other.withDeleted == withDeleted && - other.withExif == withExif && - other.withPeople == withPeople && - other.withStacked == withStacked; + static const ApiVersion ratingAddedIn = .new(1, 0, 0); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumIds.hashCode) + - (city == null ? 0 : city!.hashCode) + - (country == null ? 0 : country!.hashCode) + - (createdAfter == null ? 0 : createdAfter!.hashCode) + - (createdBefore == null ? 0 : createdBefore!.hashCode) + - (isEncoded == null ? 0 : isEncoded!.hashCode) + - (isFavorite == null ? 0 : isFavorite!.hashCode) + - (isMotion == null ? 0 : isMotion!.hashCode) + - (isNotInAlbum == null ? 0 : isNotInAlbum!.hashCode) + - (isOffline == null ? 0 : isOffline!.hashCode) + - (lensModel == null ? 0 : lensModel!.hashCode) + - (libraryId == null ? 0 : libraryId!.hashCode) + - (make == null ? 0 : make!.hashCode) + - (model == null ? 0 : model!.hashCode) + - (ocr == null ? 0 : ocr!.hashCode) + - (personIds.hashCode) + - (rating == null ? 0 : rating!.hashCode) + - (size == null ? 0 : size!.hashCode) + - (state == null ? 0 : state!.hashCode) + - (tagIds == null ? 0 : tagIds!.hashCode) + - (takenAfter == null ? 0 : takenAfter!.hashCode) + - (takenBefore == null ? 0 : takenBefore!.hashCode) + - (trashedAfter == null ? 0 : trashedAfter!.hashCode) + - (trashedBefore == null ? 0 : trashedBefore!.hashCode) + - (type == null ? 0 : type!.hashCode) + - (updatedAfter == null ? 0 : updatedAfter!.hashCode) + - (updatedBefore == null ? 0 : updatedBefore!.hashCode) + - (visibility == null ? 0 : visibility!.hashCode) + - (withDeleted == null ? 0 : withDeleted!.hashCode) + - (withExif == null ? 0 : withExif!.hashCode) + - (withPeople == null ? 0 : withPeople!.hashCode) + - (withStacked == null ? 0 : withStacked!.hashCode); + static const ApiState ratingState = .stable; - @override - String toString() => 'RandomSearchDto[albumIds=$albumIds, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, ocr=$ocr, personIds=$personIds, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, visibility=$visibility, withDeleted=$withDeleted, withExif=$withExif, withPeople=$withPeople, withStacked=$withStacked]'; + static RandomSearchDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumIds: json.containsKey(r'albumIds') + ? Optional.present(((json[r'albumIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + city: json.containsKey(r'city') ? Optional.present((json[r'city'] as String?)) : const Optional.absent(), + country: json.containsKey(r'country') ? Optional.present((json[r'country'] as String?)) : const Optional.absent(), + createdAfter: json.containsKey(r'createdAfter') + ? Optional.present(DateTime.parse(json[r'createdAfter'] as String)) + : const Optional.absent(), + createdBefore: json.containsKey(r'createdBefore') + ? Optional.present(DateTime.parse(json[r'createdBefore'] as String)) + : const Optional.absent(), + isEncoded: json.containsKey(r'isEncoded') + ? Optional.present(json[r'isEncoded'] as bool) + : const Optional.absent(), + isFavorite: json.containsKey(r'isFavorite') + ? Optional.present(json[r'isFavorite'] as bool) + : const Optional.absent(), + isMotion: json.containsKey(r'isMotion') ? Optional.present(json[r'isMotion'] as bool) : const Optional.absent(), + isNotInAlbum: json.containsKey(r'isNotInAlbum') + ? Optional.present(json[r'isNotInAlbum'] as bool) + : const Optional.absent(), + isOffline: json.containsKey(r'isOffline') + ? Optional.present(json[r'isOffline'] as bool) + : const Optional.absent(), + lensModel: json.containsKey(r'lensModel') + ? Optional.present((json[r'lensModel'] as String?)) + : const Optional.absent(), + libraryId: json.containsKey(r'libraryId') + ? Optional.present((json[r'libraryId'] as String?)) + : const Optional.absent(), + make: json.containsKey(r'make') ? Optional.present((json[r'make'] as String?)) : const Optional.absent(), + model: json.containsKey(r'model') ? Optional.present((json[r'model'] as String?)) : const Optional.absent(), + ocr: json.containsKey(r'ocr') ? Optional.present(json[r'ocr'] as String) : const Optional.absent(), + personIds: json.containsKey(r'personIds') + ? Optional.present(((json[r'personIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + rating: json.containsKey(r'rating') ? Optional.present((json[r'rating'] as int?)) : const Optional.absent(), + size: json.containsKey(r'size') ? Optional.present(json[r'size'] as int) : const Optional.absent(), + state: json.containsKey(r'state') ? Optional.present((json[r'state'] as String?)) : const Optional.absent(), + tagIds: json.containsKey(r'tagIds') + ? Optional.present((json[r'tagIds'] as List?)?.map(($e) => $e as String).toList(growable: false)) + : const Optional.absent(), + takenAfter: json.containsKey(r'takenAfter') + ? Optional.present(DateTime.parse(json[r'takenAfter'] as String)) + : const Optional.absent(), + takenBefore: json.containsKey(r'takenBefore') + ? Optional.present(DateTime.parse(json[r'takenBefore'] as String)) + : const Optional.absent(), + trashedAfter: json.containsKey(r'trashedAfter') + ? Optional.present(DateTime.parse(json[r'trashedAfter'] as String)) + : const Optional.absent(), + trashedBefore: json.containsKey(r'trashedBefore') + ? Optional.present(DateTime.parse(json[r'trashedBefore'] as String)) + : const Optional.absent(), + type: json.containsKey(r'type') + ? Optional.present((AssetTypeEnum.fromJson(json[r'type']))!) + : const Optional.absent(), + updatedAfter: json.containsKey(r'updatedAfter') + ? Optional.present(DateTime.parse(json[r'updatedAfter'] as String)) + : const Optional.absent(), + updatedBefore: json.containsKey(r'updatedBefore') + ? Optional.present(DateTime.parse(json[r'updatedBefore'] as String)) + : const Optional.absent(), + visibility: json.containsKey(r'visibility') + ? Optional.present((AssetVisibility.fromJson(json[r'visibility']))!) + : const Optional.absent(), + withDeleted: json.containsKey(r'withDeleted') + ? Optional.present(json[r'withDeleted'] as bool) + : const Optional.absent(), + withExif: json.containsKey(r'withExif') ? Optional.present(json[r'withExif'] as bool) : const Optional.absent(), + withPeople: json.containsKey(r'withPeople') + ? Optional.present(json[r'withPeople'] as bool) + : const Optional.absent(), + withStacked: json.containsKey(r'withStacked') + ? Optional.present(json[r'withStacked'] as bool) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'albumIds'] = this.albumIds; - if (this.city != null) { - json[r'city'] = this.city; - } else { - // json[r'city'] = null; + if (albumIds case Present(:final value)) { + json[r'albumIds'] = value; } - if (this.country != null) { - json[r'country'] = this.country; - } else { - // json[r'country'] = null; + if (city case Present(:final value)) { + json[r'city'] = value; } - if (this.createdAfter != null) { - json[r'createdAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAfter!.millisecondsSinceEpoch - : this.createdAfter!.toUtc().toIso8601String(); - } else { - // json[r'createdAfter'] = null; + if (country case Present(:final value)) { + json[r'country'] = value; } - if (this.createdBefore != null) { - json[r'createdBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdBefore!.millisecondsSinceEpoch - : this.createdBefore!.toUtc().toIso8601String(); - } else { - // json[r'createdBefore'] = null; + if (createdAfter case Present(:final value)) { + json[r'createdAfter'] = value.toUtc().toIso8601String(); } - if (this.isEncoded != null) { - json[r'isEncoded'] = this.isEncoded; - } else { - // json[r'isEncoded'] = null; + if (createdBefore case Present(:final value)) { + json[r'createdBefore'] = value.toUtc().toIso8601String(); } - if (this.isFavorite != null) { - json[r'isFavorite'] = this.isFavorite; - } else { - // json[r'isFavorite'] = null; + if (isEncoded case Present(:final value)) { + json[r'isEncoded'] = value; } - if (this.isMotion != null) { - json[r'isMotion'] = this.isMotion; - } else { - // json[r'isMotion'] = null; + if (isFavorite case Present(:final value)) { + json[r'isFavorite'] = value; } - if (this.isNotInAlbum != null) { - json[r'isNotInAlbum'] = this.isNotInAlbum; - } else { - // json[r'isNotInAlbum'] = null; + if (isMotion case Present(:final value)) { + json[r'isMotion'] = value; } - if (this.isOffline != null) { - json[r'isOffline'] = this.isOffline; - } else { - // json[r'isOffline'] = null; + if (isNotInAlbum case Present(:final value)) { + json[r'isNotInAlbum'] = value; } - if (this.lensModel != null) { - json[r'lensModel'] = this.lensModel; - } else { - // json[r'lensModel'] = null; + if (isOffline case Present(:final value)) { + json[r'isOffline'] = value; } - if (this.libraryId != null) { - json[r'libraryId'] = this.libraryId; - } else { - // json[r'libraryId'] = null; + if (lensModel case Present(:final value)) { + json[r'lensModel'] = value; } - if (this.make != null) { - json[r'make'] = this.make; - } else { - // json[r'make'] = null; + if (libraryId case Present(:final value)) { + json[r'libraryId'] = value; } - if (this.model != null) { - json[r'model'] = this.model; - } else { - // json[r'model'] = null; + if (make case Present(:final value)) { + json[r'make'] = value; } - if (this.ocr != null) { - json[r'ocr'] = this.ocr; - } else { - // json[r'ocr'] = null; + if (model case Present(:final value)) { + json[r'model'] = value; } - json[r'personIds'] = this.personIds; - if (this.rating != null) { - json[r'rating'] = this.rating; - } else { - // json[r'rating'] = null; + if (ocr case Present(:final value)) { + json[r'ocr'] = value; } - if (this.size != null) { - json[r'size'] = this.size; - } else { - // json[r'size'] = null; + if (personIds case Present(:final value)) { + json[r'personIds'] = value; } - if (this.state != null) { - json[r'state'] = this.state; - } else { - // json[r'state'] = null; + if (rating case Present(:final value)) { + json[r'rating'] = value; } - if (this.tagIds != null) { - json[r'tagIds'] = this.tagIds; - } else { - // json[r'tagIds'] = null; + if (size case Present(:final value)) { + json[r'size'] = value; } - if (this.takenAfter != null) { - json[r'takenAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.takenAfter!.millisecondsSinceEpoch - : this.takenAfter!.toUtc().toIso8601String(); - } else { - // json[r'takenAfter'] = null; + if (state case Present(:final value)) { + json[r'state'] = value; } - if (this.takenBefore != null) { - json[r'takenBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.takenBefore!.millisecondsSinceEpoch - : this.takenBefore!.toUtc().toIso8601String(); - } else { - // json[r'takenBefore'] = null; + if (tagIds case Present(:final value)) { + json[r'tagIds'] = value; } - if (this.trashedAfter != null) { - json[r'trashedAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.trashedAfter!.millisecondsSinceEpoch - : this.trashedAfter!.toUtc().toIso8601String(); - } else { - // json[r'trashedAfter'] = null; + if (takenAfter case Present(:final value)) { + json[r'takenAfter'] = value.toUtc().toIso8601String(); } - if (this.trashedBefore != null) { - json[r'trashedBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.trashedBefore!.millisecondsSinceEpoch - : this.trashedBefore!.toUtc().toIso8601String(); - } else { - // json[r'trashedBefore'] = null; + if (takenBefore case Present(:final value)) { + json[r'takenBefore'] = value.toUtc().toIso8601String(); } - if (this.type != null) { - json[r'type'] = this.type; - } else { - // json[r'type'] = null; + if (trashedAfter case Present(:final value)) { + json[r'trashedAfter'] = value.toUtc().toIso8601String(); } - if (this.updatedAfter != null) { - json[r'updatedAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAfter!.millisecondsSinceEpoch - : this.updatedAfter!.toUtc().toIso8601String(); - } else { - // json[r'updatedAfter'] = null; + if (trashedBefore case Present(:final value)) { + json[r'trashedBefore'] = value.toUtc().toIso8601String(); } - if (this.updatedBefore != null) { - json[r'updatedBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedBefore!.millisecondsSinceEpoch - : this.updatedBefore!.toUtc().toIso8601String(); - } else { - // json[r'updatedBefore'] = null; + if (type case Present(:final value)) { + json[r'type'] = value.toJson(); } - if (this.visibility != null) { - json[r'visibility'] = this.visibility; - } else { - // json[r'visibility'] = null; + if (updatedAfter case Present(:final value)) { + json[r'updatedAfter'] = value.toUtc().toIso8601String(); } - if (this.withDeleted != null) { - json[r'withDeleted'] = this.withDeleted; - } else { - // json[r'withDeleted'] = null; + if (updatedBefore case Present(:final value)) { + json[r'updatedBefore'] = value.toUtc().toIso8601String(); } - if (this.withExif != null) { - json[r'withExif'] = this.withExif; - } else { - // json[r'withExif'] = null; + if (visibility case Present(:final value)) { + json[r'visibility'] = value.toJson(); } - if (this.withPeople != null) { - json[r'withPeople'] = this.withPeople; - } else { - // json[r'withPeople'] = null; + if (withDeleted case Present(:final value)) { + json[r'withDeleted'] = value; } - if (this.withStacked != null) { - json[r'withStacked'] = this.withStacked; - } else { - // json[r'withStacked'] = null; + if (withExif case Present(:final value)) { + json[r'withExif'] = value; + } + if (withPeople case Present(:final value)) { + json[r'withPeople'] = value; + } + if (withStacked case Present(:final value)) { + json[r'withStacked'] = value; } return json; } - /// Returns a new [RandomSearchDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static RandomSearchDto? fromJson(dynamic value) { - upgradeDto(value, "RandomSearchDto"); - if (value is Map) { - final json = value.cast(); - - return RandomSearchDto( - albumIds: json[r'albumIds'] is Iterable - ? (json[r'albumIds'] as Iterable).cast().toList(growable: false) - : const [], - city: mapValueOfType(json, r'city'), - country: mapValueOfType(json, r'country'), - createdAfter: mapDateTime(json, r'createdAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - createdBefore: mapDateTime(json, r'createdBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - isEncoded: mapValueOfType(json, r'isEncoded'), - isFavorite: mapValueOfType(json, r'isFavorite'), - isMotion: mapValueOfType(json, r'isMotion'), - isNotInAlbum: mapValueOfType(json, r'isNotInAlbum'), - isOffline: mapValueOfType(json, r'isOffline'), - lensModel: mapValueOfType(json, r'lensModel'), - libraryId: mapValueOfType(json, r'libraryId'), - make: mapValueOfType(json, r'make'), - model: mapValueOfType(json, r'model'), - ocr: mapValueOfType(json, r'ocr'), - personIds: json[r'personIds'] is Iterable - ? (json[r'personIds'] as Iterable).cast().toList(growable: false) - : const [], - rating: mapValueOfType(json, r'rating'), - size: mapValueOfType(json, r'size'), - state: mapValueOfType(json, r'state'), - tagIds: json[r'tagIds'] is Iterable - ? (json[r'tagIds'] as Iterable).cast().toList(growable: false) - : const [], - takenAfter: mapDateTime(json, r'takenAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - takenBefore: mapDateTime(json, r'takenBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - trashedAfter: mapDateTime(json, r'trashedAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - trashedBefore: mapDateTime(json, r'trashedBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - type: AssetTypeEnum.fromJson(json[r'type']), - updatedAfter: mapDateTime(json, r'updatedAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - updatedBefore: mapDateTime(json, r'updatedBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - visibility: AssetVisibility.fromJson(json[r'visibility']), - withDeleted: mapValueOfType(json, r'withDeleted'), - withExif: mapValueOfType(json, r'withExif'), - withPeople: mapValueOfType(json, r'withPeople'), - withStacked: mapValueOfType(json, r'withStacked'), - ); - } - return null; + RandomSearchDto copyWith({ + Optional>? albumIds, + Optional? city, + Optional? country, + Optional? createdAfter, + Optional? createdBefore, + Optional? isEncoded, + Optional? isFavorite, + Optional? isMotion, + Optional? isNotInAlbum, + Optional? isOffline, + Optional? lensModel, + Optional? libraryId, + Optional? make, + Optional? model, + Optional? ocr, + Optional>? personIds, + Optional? rating, + Optional? size, + Optional? state, + Optional?>? tagIds, + Optional? takenAfter, + Optional? takenBefore, + Optional? trashedAfter, + Optional? trashedBefore, + Optional? type, + Optional? updatedAfter, + Optional? updatedBefore, + Optional? visibility, + Optional? withDeleted, + Optional? withExif, + Optional? withPeople, + Optional? withStacked, + }) { + return .new( + albumIds: albumIds ?? this.albumIds, + city: city ?? this.city, + country: country ?? this.country, + createdAfter: createdAfter ?? this.createdAfter, + createdBefore: createdBefore ?? this.createdBefore, + isEncoded: isEncoded ?? this.isEncoded, + isFavorite: isFavorite ?? this.isFavorite, + isMotion: isMotion ?? this.isMotion, + isNotInAlbum: isNotInAlbum ?? this.isNotInAlbum, + isOffline: isOffline ?? this.isOffline, + lensModel: lensModel ?? this.lensModel, + libraryId: libraryId ?? this.libraryId, + make: make ?? this.make, + model: model ?? this.model, + ocr: ocr ?? this.ocr, + personIds: personIds ?? this.personIds, + rating: rating ?? this.rating, + size: size ?? this.size, + state: state ?? this.state, + tagIds: tagIds ?? this.tagIds, + takenAfter: takenAfter ?? this.takenAfter, + takenBefore: takenBefore ?? this.takenBefore, + trashedAfter: trashedAfter ?? this.trashedAfter, + trashedBefore: trashedBefore ?? this.trashedBefore, + type: type ?? this.type, + updatedAfter: updatedAfter ?? this.updatedAfter, + updatedBefore: updatedBefore ?? this.updatedBefore, + visibility: visibility ?? this.visibility, + withDeleted: withDeleted ?? this.withDeleted, + withExif: withExif ?? this.withExif, + withPeople: withPeople ?? this.withPeople, + withStacked: withStacked ?? this.withStacked, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = RandomSearchDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is RandomSearchDto && + albumIds == other.albumIds && + city == other.city && + country == other.country && + createdAfter == other.createdAfter && + createdBefore == other.createdBefore && + isEncoded == other.isEncoded && + isFavorite == other.isFavorite && + isMotion == other.isMotion && + isNotInAlbum == other.isNotInAlbum && + isOffline == other.isOffline && + lensModel == other.lensModel && + libraryId == other.libraryId && + make == other.make && + model == other.model && + ocr == other.ocr && + personIds == other.personIds && + rating == other.rating && + size == other.size && + state == other.state && + tagIds == other.tagIds && + takenAfter == other.takenAfter && + takenBefore == other.takenBefore && + trashedAfter == other.trashedAfter && + trashedBefore == other.trashedBefore && + type == other.type && + updatedAfter == other.updatedAfter && + updatedBefore == other.updatedBefore && + visibility == other.visibility && + withDeleted == other.withDeleted && + withExif == other.withExif && + withPeople == other.withPeople && + withStacked == other.withStacked); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = RandomSearchDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + albumIds, + city, + country, + createdAfter, + createdBefore, + isEncoded, + isFavorite, + isMotion, + isNotInAlbum, + isOffline, + lensModel, + libraryId, + make, + model, + ocr, + personIds, + rating, + size, + state, + tagIds, + takenAfter, + takenBefore, + trashedAfter, + trashedBefore, + type, + updatedAfter, + updatedBefore, + visibility, + withDeleted, + withExif, + withPeople, + withStacked, + ]); } - // maps a json object with a list of RandomSearchDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = RandomSearchDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'RandomSearchDto(albumIds=$albumIds, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, ocr=$ocr, personIds=$personIds, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, visibility=$visibility, withDeleted=$withDeleted, withExif=$withExif, withPeople=$withPeople, withStacked=$withStacked)'; } - diff --git a/mobile/openapi/lib/model/ratings_response.dart b/mobile/openapi/lib/model/ratings_response.dart index 7b067412bf..bd9bca007b 100644 --- a/mobile/openapi/lib/model/ratings_response.dart +++ b/mobile/openapi/lib/model/ratings_response.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class RatingsResponse { - /// Returns a new [RatingsResponse] instance. - RatingsResponse({ - required this.enabled, - }); +final class RatingsResponse { + const RatingsResponse({required this.enabled}); /// Whether ratings are enabled - bool enabled; + final bool enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is RatingsResponse && - other.enabled == enabled; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode); - - @override - String toString() => 'RatingsResponse[enabled=$enabled]'; + static RatingsResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; + json[r'enabled'] = enabled; return json; } - /// Returns a new [RatingsResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static RatingsResponse? fromJson(dynamic value) { - upgradeDto(value, "RatingsResponse"); - if (value is Map) { - final json = value.cast(); - - return RatingsResponse( - enabled: mapValueOfType(json, r'enabled')!, - ); - } - return null; + RatingsResponse copyWith({bool? enabled}) { + return .new(enabled: enabled ?? this.enabled); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = RatingsResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is RatingsResponse && enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = RatingsResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled]); } - // maps a json object with a list of RatingsResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = RatingsResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - }; + @override + String toString() => 'RatingsResponse(enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/ratings_update.dart b/mobile/openapi/lib/model/ratings_update.dart index 8079172e21..7bfda442e1 100644 --- a/mobile/openapi/lib/model/ratings_update.dart +++ b/mobile/openapi/lib/model/ratings_update.dart @@ -1,109 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class RatingsUpdate { - /// Returns a new [RatingsUpdate] instance. - RatingsUpdate({ - this.enabled, - }); +final class RatingsUpdate { + const RatingsUpdate({this.enabled}); /// Whether ratings are enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final bool? enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is RatingsUpdate && - other.enabled == enabled; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled == null ? 0 : enabled!.hashCode); - - @override - String toString() => 'RatingsUpdate[enabled=$enabled]'; + static RatingsUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: (json[r'enabled'] as bool?)); + } Map toJson() { final json = {}; - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled != null) { + json[r'enabled'] = enabled!; } return json; } - /// Returns a new [RatingsUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static RatingsUpdate? fromJson(dynamic value) { - upgradeDto(value, "RatingsUpdate"); - if (value is Map) { - final json = value.cast(); - - return RatingsUpdate( - enabled: mapValueOfType(json, r'enabled'), - ); - } - return null; + RatingsUpdate copyWith({Object? enabled = _undefined}) { + return .new(enabled: identical(enabled, _undefined) ? this.enabled : enabled as bool?); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = RatingsUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is RatingsUpdate && enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = RatingsUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled]); } - // maps a json object with a list of RatingsUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = RatingsUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'RatingsUpdate(enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/reaction_level.dart b/mobile/openapi/lib/model/reaction_level.dart index 6060f4c2b7..9a3cfacdd6 100644 --- a/mobile/openapi/lib/model/reaction_level.dart +++ b/mobile/openapi/lib/model/reaction_level.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Reaction level -class ReactionLevel { - /// Instantiate a new enum with the provided [value]. +enum ReactionLevel { + album._(r'album'), + asset._(r'asset'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const ReactionLevel._(this.value); - /// The underlying value of this enum member. final String value; + static ReactionLevel? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const album = ReactionLevel._(r'album'); - static const asset = ReactionLevel._(r'asset'); - - /// List of all possible values in this [enum][ReactionLevel]. - static const values = [ - album, - asset, - ]; - - static ReactionLevel? fromJson(dynamic value) => ReactionLevelTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ReactionLevel.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [ReactionLevel] to String, -/// and [decode] dynamic data back to [ReactionLevel]. -class ReactionLevelTypeTransformer { - factory ReactionLevelTypeTransformer() => _instance ??= const ReactionLevelTypeTransformer._(); - - const ReactionLevelTypeTransformer._(); - - String encode(ReactionLevel data) => data.value; - - /// Decodes a [dynamic value][data] to a ReactionLevel. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - ReactionLevel? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'album': return ReactionLevel.album; - case r'asset': return ReactionLevel.asset; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [ReactionLevelTypeTransformer] instance. - static ReactionLevelTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/reaction_type.dart b/mobile/openapi/lib/model/reaction_type.dart index c4daccad71..8a70f3aba8 100644 --- a/mobile/openapi/lib/model/reaction_type.dart +++ b/mobile/openapi/lib/model/reaction_type.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Reaction type -class ReactionType { - /// Instantiate a new enum with the provided [value]. +enum ReactionType { + comment._(r'comment'), + like._(r'like'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const ReactionType._(this.value); - /// The underlying value of this enum member. final String value; + static ReactionType? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const comment = ReactionType._(r'comment'); - static const like = ReactionType._(r'like'); - - /// List of all possible values in this [enum][ReactionType]. - static const values = [ - comment, - like, - ]; - - static ReactionType? fromJson(dynamic value) => ReactionTypeTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ReactionType.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [ReactionType] to String, -/// and [decode] dynamic data back to [ReactionType]. -class ReactionTypeTypeTransformer { - factory ReactionTypeTypeTransformer() => _instance ??= const ReactionTypeTypeTransformer._(); - - const ReactionTypeTypeTransformer._(); - - String encode(ReactionType data) => data.value; - - /// Decodes a [dynamic value][data] to a ReactionType. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - ReactionType? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'comment': return ReactionType.comment; - case r'like': return ReactionType.like; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [ReactionTypeTypeTransformer] instance. - static ReactionTypeTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/reverse_geocoding_state_response_dto.dart b/mobile/openapi/lib/model/reverse_geocoding_state_response_dto.dart index 6ad8c1a7b9..f50e2fb53d 100644 --- a/mobile/openapi/lib/model/reverse_geocoding_state_response_dto.dart +++ b/mobile/openapi/lib/model/reverse_geocoding_state_response_dto.dart @@ -1,117 +1,65 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ReverseGeocodingStateResponseDto { - /// Returns a new [ReverseGeocodingStateResponseDto] instance. - ReverseGeocodingStateResponseDto({ - required this.lastImportFileName, - required this.lastUpdate, - }); +final class ReverseGeocodingStateResponseDto { + const ReverseGeocodingStateResponseDto({required this.lastImportFileName, required this.lastUpdate}); /// Last import file name - String? lastImportFileName; + final String? lastImportFileName; /// Last update timestamp - String? lastUpdate; + final String? lastUpdate; - @override - bool operator ==(Object other) => identical(this, other) || other is ReverseGeocodingStateResponseDto && - other.lastImportFileName == lastImportFileName && - other.lastUpdate == lastUpdate; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (lastImportFileName == null ? 0 : lastImportFileName!.hashCode) + - (lastUpdate == null ? 0 : lastUpdate!.hashCode); - - @override - String toString() => 'ReverseGeocodingStateResponseDto[lastImportFileName=$lastImportFileName, lastUpdate=$lastUpdate]'; + static ReverseGeocodingStateResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + lastImportFileName: (json[r'lastImportFileName'] as String?), + lastUpdate: (json[r'lastUpdate'] as String?), + ); + } Map toJson() { final json = {}; - if (this.lastImportFileName != null) { - json[r'lastImportFileName'] = this.lastImportFileName; - } else { - // json[r'lastImportFileName'] = null; + if (lastImportFileName != null) { + json[r'lastImportFileName'] = lastImportFileName!; } - if (this.lastUpdate != null) { - json[r'lastUpdate'] = this.lastUpdate; - } else { - // json[r'lastUpdate'] = null; + if (lastUpdate != null) { + json[r'lastUpdate'] = lastUpdate!; } return json; } - /// Returns a new [ReverseGeocodingStateResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ReverseGeocodingStateResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ReverseGeocodingStateResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ReverseGeocodingStateResponseDto( - lastImportFileName: mapValueOfType(json, r'lastImportFileName'), - lastUpdate: mapValueOfType(json, r'lastUpdate'), - ); - } - return null; + ReverseGeocodingStateResponseDto copyWith({ + Object? lastImportFileName = _undefined, + Object? lastUpdate = _undefined, + }) { + return .new( + lastImportFileName: identical(lastImportFileName, _undefined) + ? this.lastImportFileName + : lastImportFileName as String?, + lastUpdate: identical(lastUpdate, _undefined) ? this.lastUpdate : lastUpdate as String?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ReverseGeocodingStateResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ReverseGeocodingStateResponseDto && + lastImportFileName == other.lastImportFileName && + lastUpdate == other.lastUpdate); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ReverseGeocodingStateResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([lastImportFileName, lastUpdate]); } - // maps a json object with a list of ReverseGeocodingStateResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ReverseGeocodingStateResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'lastImportFileName', - 'lastUpdate', - }; + @override + String toString() => + 'ReverseGeocodingStateResponseDto(lastImportFileName=$lastImportFileName, lastUpdate=$lastUpdate)'; } - diff --git a/mobile/openapi/lib/model/rotate_parameters.dart b/mobile/openapi/lib/model/rotate_parameters.dart index 33609e83e5..0820784450 100644 --- a/mobile/openapi/lib/model/rotate_parameters.dart +++ b/mobile/openapi/lib/model/rotate_parameters.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class RotateParameters { - /// Returns a new [RotateParameters] instance. - RotateParameters({ - required this.angle, - }); +final class RotateParameters { + const RotateParameters({required this.angle}); /// Rotation angle in degrees - num angle; + final double angle; - @override - bool operator ==(Object other) => identical(this, other) || other is RotateParameters && - other.angle == angle; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (angle.hashCode); - - @override - String toString() => 'RotateParameters[angle=$angle]'; + static RotateParameters? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(angle: (json[r'angle'] as num).toDouble()); + } Map toJson() { final json = {}; - json[r'angle'] = this.angle; + json[r'angle'] = angle; return json; } - /// Returns a new [RotateParameters] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static RotateParameters? fromJson(dynamic value) { - upgradeDto(value, "RotateParameters"); - if (value is Map) { - final json = value.cast(); - - return RotateParameters( - angle: num.parse('${json[r'angle']}'), - ); - } - return null; + RotateParameters copyWith({double? angle}) { + return .new(angle: angle ?? this.angle); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = RotateParameters.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is RotateParameters && angle == other.angle); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = RotateParameters.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([angle]); } - // maps a json object with a list of RotateParameters-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = RotateParameters.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'angle', - }; + @override + String toString() => 'RotateParameters(angle=$angle)'; } - diff --git a/mobile/openapi/lib/model/search_album_response_dto.dart b/mobile/openapi/lib/model/search_album_response_dto.dart index c21113ee6d..82dbfccbe2 100644 --- a/mobile/openapi/lib/model/search_album_response_dto.dart +++ b/mobile/openapi/lib/model/search_album_response_dto.dart @@ -1,131 +1,77 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SearchAlbumResponseDto { - /// Returns a new [SearchAlbumResponseDto] instance. - SearchAlbumResponseDto({ - required this.count, - this.facets = const [], - this.items = const [], - required this.total, - }); +final class SearchAlbumResponseDto { + const SearchAlbumResponseDto({required this.count, required this.facets, required this.items, required this.total}); /// Number of albums in this page - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int count; + final int count; - List facets; + final List facets; - List items; + final List items; /// Total number of matching albums - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int total; + final int total; - @override - bool operator ==(Object other) => identical(this, other) || other is SearchAlbumResponseDto && - other.count == count && - _deepEquality.equals(other.facets, facets) && - _deepEquality.equals(other.items, items) && - other.total == total; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (count.hashCode) + - (facets.hashCode) + - (items.hashCode) + - (total.hashCode); - - @override - String toString() => 'SearchAlbumResponseDto[count=$count, facets=$facets, items=$items, total=$total]'; + static SearchAlbumResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + count: json[r'count'] as int, + facets: ((json[r'facets'] as List?) + ?.map(($e) => (SearchFacetResponseDto.fromJson($e))!) + .toList(growable: false))!, + items: ((json[r'items'] as List?)?.map(($e) => (AlbumResponseDto.fromJson($e))!).toList(growable: false))!, + total: json[r'total'] as int, + ); + } Map toJson() { final json = {}; - json[r'count'] = this.count; - json[r'facets'] = this.facets; - json[r'items'] = this.items; - json[r'total'] = this.total; + json[r'count'] = count; + json[r'facets'] = facets.map(($e) => $e.toJson()).toList(growable: false); + json[r'items'] = items.map(($e) => $e.toJson()).toList(growable: false); + json[r'total'] = total; return json; } - /// Returns a new [SearchAlbumResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SearchAlbumResponseDto? fromJson(dynamic value) { - upgradeDto(value, "SearchAlbumResponseDto"); - if (value is Map) { - final json = value.cast(); - - return SearchAlbumResponseDto( - count: mapValueOfType(json, r'count')!, - facets: SearchFacetResponseDto.listFromJson(json[r'facets']), - items: AlbumResponseDto.listFromJson(json[r'items']), - total: mapValueOfType(json, r'total')!, - ); - } - return null; + SearchAlbumResponseDto copyWith({ + int? count, + List? facets, + List? items, + int? total, + }) { + return .new( + count: count ?? this.count, + facets: facets ?? this.facets, + items: items ?? this.items, + total: total ?? this.total, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SearchAlbumResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SearchAlbumResponseDto && + count == other.count && + const DeepCollectionEquality().equals(facets, other.facets) && + const DeepCollectionEquality().equals(items, other.items) && + total == other.total); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SearchAlbumResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + count, + const DeepCollectionEquality().hash(facets), + const DeepCollectionEquality().hash(items), + total, + ]); } - // maps a json object with a list of SearchAlbumResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SearchAlbumResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'count', - 'facets', - 'items', - 'total', - }; + @override + String toString() => 'SearchAlbumResponseDto(count=$count, facets=$facets, items=$items, total=$total)'; } - diff --git a/mobile/openapi/lib/model/search_asset_response_dto.dart b/mobile/openapi/lib/model/search_asset_response_dto.dart index f4ffade26b..5fc614338f 100644 --- a/mobile/openapi/lib/model/search_asset_response_dto.dart +++ b/mobile/openapi/lib/model/search_asset_response_dto.dart @@ -1,144 +1,102 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SearchAssetResponseDto { - /// Returns a new [SearchAssetResponseDto] instance. - SearchAssetResponseDto({ +final class SearchAssetResponseDto { + const SearchAssetResponseDto({ required this.count, - this.facets = const [], - this.items = const [], + required this.facets, + required this.items, required this.nextPage, required this.total, }); /// Number of assets in this page - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int count; + final int count; - List facets; + final List facets; - List items; + final List items; /// Next page token - String? nextPage; + final String? nextPage; /// Total number of matching assets - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int total; + @Deprecated(r'Deprecated by the Immich server API since v3.0.0.') + final int total; - @override - bool operator ==(Object other) => identical(this, other) || other is SearchAssetResponseDto && - other.count == count && - _deepEquality.equals(other.facets, facets) && - _deepEquality.equals(other.items, items) && - other.nextPage == nextPage && - other.total == total; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (count.hashCode) + - (facets.hashCode) + - (items.hashCode) + - (nextPage == null ? 0 : nextPage!.hashCode) + - (total.hashCode); + static const ApiVersion totalDeprecatedIn = .new(3, 0, 0); - @override - String toString() => 'SearchAssetResponseDto[count=$count, facets=$facets, items=$items, nextPage=$nextPage, total=$total]'; + static const ApiState totalState = .deprecated; + + static SearchAssetResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + count: json[r'count'] as int, + facets: ((json[r'facets'] as List?) + ?.map(($e) => (SearchFacetResponseDto.fromJson($e))!) + .toList(growable: false))!, + items: ((json[r'items'] as List?)?.map(($e) => (AssetResponseDto.fromJson($e))!).toList(growable: false))!, + nextPage: (json[r'nextPage'] as String?), + total: json[r'total'] as int, + ); + } Map toJson() { final json = {}; - json[r'count'] = this.count; - json[r'facets'] = this.facets; - json[r'items'] = this.items; - if (this.nextPage != null) { - json[r'nextPage'] = this.nextPage; - } else { - // json[r'nextPage'] = null; + json[r'count'] = count; + json[r'facets'] = facets.map(($e) => $e.toJson()).toList(growable: false); + json[r'items'] = items.map(($e) => $e.toJson()).toList(growable: false); + if (nextPage != null) { + json[r'nextPage'] = nextPage!; } - json[r'total'] = this.total; + json[r'total'] = total; return json; } - /// Returns a new [SearchAssetResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SearchAssetResponseDto? fromJson(dynamic value) { - upgradeDto(value, "SearchAssetResponseDto"); - if (value is Map) { - final json = value.cast(); - - return SearchAssetResponseDto( - count: mapValueOfType(json, r'count')!, - facets: SearchFacetResponseDto.listFromJson(json[r'facets']), - items: AssetResponseDto.listFromJson(json[r'items']), - nextPage: mapValueOfType(json, r'nextPage'), - total: mapValueOfType(json, r'total')!, - ); - } - return null; + SearchAssetResponseDto copyWith({ + int? count, + List? facets, + List? items, + Object? nextPage = _undefined, + int? total, + }) { + return .new( + count: count ?? this.count, + facets: facets ?? this.facets, + items: items ?? this.items, + nextPage: identical(nextPage, _undefined) ? this.nextPage : nextPage as String?, + total: total ?? this.total, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SearchAssetResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SearchAssetResponseDto && + count == other.count && + const DeepCollectionEquality().equals(facets, other.facets) && + const DeepCollectionEquality().equals(items, other.items) && + nextPage == other.nextPage && + total == other.total); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SearchAssetResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + count, + const DeepCollectionEquality().hash(facets), + const DeepCollectionEquality().hash(items), + nextPage, + total, + ]); } - // maps a json object with a list of SearchAssetResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SearchAssetResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'count', - 'facets', - 'items', - 'nextPage', - 'total', - }; + @override + String toString() => + 'SearchAssetResponseDto(count=$count, facets=$facets, items=$items, nextPage=$nextPage, total=$total)'; } - diff --git a/mobile/openapi/lib/model/search_explore_item.dart b/mobile/openapi/lib/model/search_explore_item.dart index 4089011879..c739e490fa 100644 --- a/mobile/openapi/lib/model/search_explore_item.dart +++ b/mobile/openapi/lib/model/search_explore_item.dart @@ -1,108 +1,43 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SearchExploreItem { - /// Returns a new [SearchExploreItem] instance. - SearchExploreItem({ - required this.data, - required this.value, - }); +final class SearchExploreItem { + const SearchExploreItem({required this.data, required this.value}); - AssetResponseDto data; + final AssetResponseDto data; /// Explore value - String value; + final String value; - @override - bool operator ==(Object other) => identical(this, other) || other is SearchExploreItem && - other.data == data && - other.value == value; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (data.hashCode) + - (value.hashCode); - - @override - String toString() => 'SearchExploreItem[data=$data, value=$value]'; + static SearchExploreItem? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(data: (AssetResponseDto.fromJson(json[r'data']))!, value: json[r'value'] as String); + } Map toJson() { final json = {}; - json[r'data'] = this.data; - json[r'value'] = this.value; + json[r'data'] = data.toJson(); + json[r'value'] = value; return json; } - /// Returns a new [SearchExploreItem] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SearchExploreItem? fromJson(dynamic value) { - upgradeDto(value, "SearchExploreItem"); - if (value is Map) { - final json = value.cast(); - - return SearchExploreItem( - data: AssetResponseDto.fromJson(json[r'data'])!, - value: mapValueOfType(json, r'value')!, - ); - } - return null; + SearchExploreItem copyWith({AssetResponseDto? data, String? value}) { + return .new(data: data ?? this.data, value: value ?? this.value); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SearchExploreItem.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SearchExploreItem && data == other.data && value == other.value); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SearchExploreItem.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([data, value]); } - // maps a json object with a list of SearchExploreItem-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SearchExploreItem.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'data', - 'value', - }; + @override + String toString() => 'SearchExploreItem(data=$data, value=$value)'; } - diff --git a/mobile/openapi/lib/model/search_explore_response_dto.dart b/mobile/openapi/lib/model/search_explore_response_dto.dart index 07ce26c9b8..4b5f422f54 100644 --- a/mobile/openapi/lib/model/search_explore_response_dto.dart +++ b/mobile/openapi/lib/model/search_explore_response_dto.dart @@ -1,108 +1,49 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SearchExploreResponseDto { - /// Returns a new [SearchExploreResponseDto] instance. - SearchExploreResponseDto({ - required this.fieldName, - this.items = const [], - }); +final class SearchExploreResponseDto { + const SearchExploreResponseDto({required this.fieldName, required this.items}); /// Explore field name - String fieldName; + final String fieldName; - List items; + final List items; - @override - bool operator ==(Object other) => identical(this, other) || other is SearchExploreResponseDto && - other.fieldName == fieldName && - _deepEquality.equals(other.items, items); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (fieldName.hashCode) + - (items.hashCode); - - @override - String toString() => 'SearchExploreResponseDto[fieldName=$fieldName, items=$items]'; + static SearchExploreResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + fieldName: json[r'fieldName'] as String, + items: ((json[r'items'] as List?)?.map(($e) => (SearchExploreItem.fromJson($e))!).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'fieldName'] = this.fieldName; - json[r'items'] = this.items; + json[r'fieldName'] = fieldName; + json[r'items'] = items.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [SearchExploreResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SearchExploreResponseDto? fromJson(dynamic value) { - upgradeDto(value, "SearchExploreResponseDto"); - if (value is Map) { - final json = value.cast(); - - return SearchExploreResponseDto( - fieldName: mapValueOfType(json, r'fieldName')!, - items: SearchExploreItem.listFromJson(json[r'items']), - ); - } - return null; + SearchExploreResponseDto copyWith({String? fieldName, List? items}) { + return .new(fieldName: fieldName ?? this.fieldName, items: items ?? this.items); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SearchExploreResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SearchExploreResponseDto && + fieldName == other.fieldName && + const DeepCollectionEquality().equals(items, other.items)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SearchExploreResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([fieldName, const DeepCollectionEquality().hash(items)]); } - // maps a json object with a list of SearchExploreResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SearchExploreResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'fieldName', - 'items', - }; + @override + String toString() => 'SearchExploreResponseDto(fieldName=$fieldName, items=$items)'; } - diff --git a/mobile/openapi/lib/model/search_facet_count_response_dto.dart b/mobile/openapi/lib/model/search_facet_count_response_dto.dart index 62adfaa74a..1636ece89d 100644 --- a/mobile/openapi/lib/model/search_facet_count_response_dto.dart +++ b/mobile/openapi/lib/model/search_facet_count_response_dto.dart @@ -1,112 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SearchFacetCountResponseDto { - /// Returns a new [SearchFacetCountResponseDto] instance. - SearchFacetCountResponseDto({ - required this.count, - required this.value, - }); +final class SearchFacetCountResponseDto { + const SearchFacetCountResponseDto({required this.count, required this.value}); /// Number of assets with this facet value - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int count; + final int count; /// Facet value - String value; + final String value; - @override - bool operator ==(Object other) => identical(this, other) || other is SearchFacetCountResponseDto && - other.count == count && - other.value == value; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (count.hashCode) + - (value.hashCode); - - @override - String toString() => 'SearchFacetCountResponseDto[count=$count, value=$value]'; + static SearchFacetCountResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(count: json[r'count'] as int, value: json[r'value'] as String); + } Map toJson() { final json = {}; - json[r'count'] = this.count; - json[r'value'] = this.value; + json[r'count'] = count; + json[r'value'] = value; return json; } - /// Returns a new [SearchFacetCountResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SearchFacetCountResponseDto? fromJson(dynamic value) { - upgradeDto(value, "SearchFacetCountResponseDto"); - if (value is Map) { - final json = value.cast(); - - return SearchFacetCountResponseDto( - count: mapValueOfType(json, r'count')!, - value: mapValueOfType(json, r'value')!, - ); - } - return null; + SearchFacetCountResponseDto copyWith({int? count, String? value}) { + return .new(count: count ?? this.count, value: value ?? this.value); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SearchFacetCountResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SearchFacetCountResponseDto && count == other.count && value == other.value); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SearchFacetCountResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([count, value]); } - // maps a json object with a list of SearchFacetCountResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SearchFacetCountResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'count', - 'value', - }; + @override + String toString() => 'SearchFacetCountResponseDto(count=$count, value=$value)'; } - diff --git a/mobile/openapi/lib/model/search_facet_response_dto.dart b/mobile/openapi/lib/model/search_facet_response_dto.dart index 51124ef1cf..ee2dac194f 100644 --- a/mobile/openapi/lib/model/search_facet_response_dto.dart +++ b/mobile/openapi/lib/model/search_facet_response_dto.dart @@ -1,108 +1,51 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SearchFacetResponseDto { - /// Returns a new [SearchFacetResponseDto] instance. - SearchFacetResponseDto({ - this.counts = const [], - required this.fieldName, - }); +final class SearchFacetResponseDto { + const SearchFacetResponseDto({required this.counts, required this.fieldName}); - List counts; + final List counts; /// Facet field name - String fieldName; + final String fieldName; - @override - bool operator ==(Object other) => identical(this, other) || other is SearchFacetResponseDto && - _deepEquality.equals(other.counts, counts) && - other.fieldName == fieldName; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (counts.hashCode) + - (fieldName.hashCode); - - @override - String toString() => 'SearchFacetResponseDto[counts=$counts, fieldName=$fieldName]'; + static SearchFacetResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + counts: ((json[r'counts'] as List?) + ?.map(($e) => (SearchFacetCountResponseDto.fromJson($e))!) + .toList(growable: false))!, + fieldName: json[r'fieldName'] as String, + ); + } Map toJson() { final json = {}; - json[r'counts'] = this.counts; - json[r'fieldName'] = this.fieldName; + json[r'counts'] = counts.map(($e) => $e.toJson()).toList(growable: false); + json[r'fieldName'] = fieldName; return json; } - /// Returns a new [SearchFacetResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SearchFacetResponseDto? fromJson(dynamic value) { - upgradeDto(value, "SearchFacetResponseDto"); - if (value is Map) { - final json = value.cast(); - - return SearchFacetResponseDto( - counts: SearchFacetCountResponseDto.listFromJson(json[r'counts']), - fieldName: mapValueOfType(json, r'fieldName')!, - ); - } - return null; + SearchFacetResponseDto copyWith({List? counts, String? fieldName}) { + return .new(counts: counts ?? this.counts, fieldName: fieldName ?? this.fieldName); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SearchFacetResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SearchFacetResponseDto && + const DeepCollectionEquality().equals(counts, other.counts) && + fieldName == other.fieldName); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SearchFacetResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(counts), fieldName]); } - // maps a json object with a list of SearchFacetResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SearchFacetResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'counts', - 'fieldName', - }; + @override + String toString() => 'SearchFacetResponseDto(counts=$counts, fieldName=$fieldName)'; } - diff --git a/mobile/openapi/lib/model/search_response_dto.dart b/mobile/openapi/lib/model/search_response_dto.dart index ca742ae35c..48acd51030 100644 --- a/mobile/openapi/lib/model/search_response_dto.dart +++ b/mobile/openapi/lib/model/search_response_dto.dart @@ -1,107 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SearchResponseDto { - /// Returns a new [SearchResponseDto] instance. - SearchResponseDto({ - required this.albums, - required this.assets, - }); +final class SearchResponseDto { + const SearchResponseDto({required this.albums, required this.assets}); - SearchAlbumResponseDto albums; + final SearchAlbumResponseDto albums; - SearchAssetResponseDto assets; + final SearchAssetResponseDto assets; - @override - bool operator ==(Object other) => identical(this, other) || other is SearchResponseDto && - other.albums == albums && - other.assets == assets; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albums.hashCode) + - (assets.hashCode); - - @override - String toString() => 'SearchResponseDto[albums=$albums, assets=$assets]'; + static SearchResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albums: (SearchAlbumResponseDto.fromJson(json[r'albums']))!, + assets: (SearchAssetResponseDto.fromJson(json[r'assets']))!, + ); + } Map toJson() { final json = {}; - json[r'albums'] = this.albums; - json[r'assets'] = this.assets; + json[r'albums'] = albums.toJson(); + json[r'assets'] = assets.toJson(); return json; } - /// Returns a new [SearchResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SearchResponseDto? fromJson(dynamic value) { - upgradeDto(value, "SearchResponseDto"); - if (value is Map) { - final json = value.cast(); - - return SearchResponseDto( - albums: SearchAlbumResponseDto.fromJson(json[r'albums'])!, - assets: SearchAssetResponseDto.fromJson(json[r'assets'])!, - ); - } - return null; + SearchResponseDto copyWith({SearchAlbumResponseDto? albums, SearchAssetResponseDto? assets}) { + return .new(albums: albums ?? this.albums, assets: assets ?? this.assets); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SearchResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SearchResponseDto && albums == other.albums && assets == other.assets); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SearchResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albums, assets]); } - // maps a json object with a list of SearchResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SearchResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albums', - 'assets', - }; + @override + String toString() => 'SearchResponseDto(albums=$albums, assets=$assets)'; } - diff --git a/mobile/openapi/lib/model/search_statistics_response_dto.dart b/mobile/openapi/lib/model/search_statistics_response_dto.dart index c4d893af05..78e7c4a160 100644 --- a/mobile/openapi/lib/model/search_statistics_response_dto.dart +++ b/mobile/openapi/lib/model/search_statistics_response_dto.dart @@ -1,103 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SearchStatisticsResponseDto { - /// Returns a new [SearchStatisticsResponseDto] instance. - SearchStatisticsResponseDto({ - required this.total, - }); +final class SearchStatisticsResponseDto { + const SearchStatisticsResponseDto({required this.total}); /// Total number of matching assets - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int total; + final int total; - @override - bool operator ==(Object other) => identical(this, other) || other is SearchStatisticsResponseDto && - other.total == total; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (total.hashCode); - - @override - String toString() => 'SearchStatisticsResponseDto[total=$total]'; + static SearchStatisticsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(total: json[r'total'] as int); + } Map toJson() { final json = {}; - json[r'total'] = this.total; + json[r'total'] = total; return json; } - /// Returns a new [SearchStatisticsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SearchStatisticsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "SearchStatisticsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return SearchStatisticsResponseDto( - total: mapValueOfType(json, r'total')!, - ); - } - return null; + SearchStatisticsResponseDto copyWith({int? total}) { + return .new(total: total ?? this.total); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SearchStatisticsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SearchStatisticsResponseDto && total == other.total); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SearchStatisticsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([total]); } - // maps a json object with a list of SearchStatisticsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SearchStatisticsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'total', - }; + @override + String toString() => 'SearchStatisticsResponseDto(total=$total)'; } - diff --git a/mobile/openapi/lib/model/search_suggestion_type.dart b/mobile/openapi/lib/model/search_suggestion_type.dart index 6d44b881bd..859b40c21d 100644 --- a/mobile/openapi/lib/model/search_suggestion_type.dart +++ b/mobile/openapi/lib/model/search_suggestion_type.dart @@ -1,97 +1,32 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Suggestion type -class SearchSuggestionType { - /// Instantiate a new enum with the provided [value]. +enum SearchSuggestionType { + country._(r'country'), + state._(r'state'), + city._(r'city'), + cameraMake._(r'camera-make'), + cameraModel._(r'camera-model'), + cameraLensModel._(r'camera-lens-model'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const SearchSuggestionType._(this.value); - /// The underlying value of this enum member. final String value; + static SearchSuggestionType? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const country = SearchSuggestionType._(r'country'); - static const state = SearchSuggestionType._(r'state'); - static const city = SearchSuggestionType._(r'city'); - static const cameraMake = SearchSuggestionType._(r'camera-make'); - static const cameraModel = SearchSuggestionType._(r'camera-model'); - static const cameraLensModel = SearchSuggestionType._(r'camera-lens-model'); - - /// List of all possible values in this [enum][SearchSuggestionType]. - static const values = [ - country, - state, - city, - cameraMake, - cameraModel, - cameraLensModel, - ]; - - static SearchSuggestionType? fromJson(dynamic value) => SearchSuggestionTypeTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SearchSuggestionType.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [SearchSuggestionType] to String, -/// and [decode] dynamic data back to [SearchSuggestionType]. -class SearchSuggestionTypeTypeTransformer { - factory SearchSuggestionTypeTypeTransformer() => _instance ??= const SearchSuggestionTypeTypeTransformer._(); - - const SearchSuggestionTypeTypeTransformer._(); - - String encode(SearchSuggestionType data) => data.value; - - /// Decodes a [dynamic value][data] to a SearchSuggestionType. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - SearchSuggestionType? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'country': return SearchSuggestionType.country; - case r'state': return SearchSuggestionType.state; - case r'city': return SearchSuggestionType.city; - case r'camera-make': return SearchSuggestionType.cameraMake; - case r'camera-model': return SearchSuggestionType.cameraModel; - case r'camera-lens-model': return SearchSuggestionType.cameraLensModel; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [SearchSuggestionTypeTypeTransformer] instance. - static SearchSuggestionTypeTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/server_about_response_dto.dart b/mobile/openapi/lib/model/server_about_response_dto.dart index 1ae53763fe..469ce8ed8e 100644 --- a/mobile/openapi/lib/model/server_about_response_dto.dart +++ b/mobile/openapi/lib/model/server_about_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ServerAboutResponseDto { - /// Returns a new [ServerAboutResponseDto] instance. - ServerAboutResponseDto({ +final class ServerAboutResponseDto { + const ServerAboutResponseDto({ this.build, this.buildImage, this.buildImageUrl, @@ -37,406 +28,272 @@ class ServerAboutResponseDto { }); /// Build identifier - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? build; + final String? build; /// Build image name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? buildImage; + final String? buildImage; /// Build image URL - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? buildImageUrl; + final String? buildImageUrl; /// Build URL - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? buildUrl; + final String? buildUrl; /// ExifTool version - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? exiftool; + final String? exiftool; /// FFmpeg version - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? ffmpeg; + final String? ffmpeg; /// ImageMagick version - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? imagemagick; + final String? imagemagick; /// libvips version - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? libvips; + final String? libvips; /// Whether the server is licensed - bool licensed; + final bool licensed; /// Node.js version - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? nodejs; + final String? nodejs; /// Repository name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? repository; + final String? repository; /// Repository URL - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? repositoryUrl; + final String? repositoryUrl; /// Source commit hash - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? sourceCommit; + final String? sourceCommit; /// Source reference (branch/tag) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? sourceRef; + final String? sourceRef; /// Source URL - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? sourceUrl; + final String? sourceUrl; /// Third-party bug/feature URL - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? thirdPartyBugFeatureUrl; + final String? thirdPartyBugFeatureUrl; /// Third-party documentation URL - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? thirdPartyDocumentationUrl; + final String? thirdPartyDocumentationUrl; /// Third-party source URL - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? thirdPartySourceUrl; + final String? thirdPartySourceUrl; /// Third-party support URL - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? thirdPartySupportUrl; + final String? thirdPartySupportUrl; /// Server version - String version; + final String version; /// URL to version information - String versionUrl; + final String versionUrl; - @override - bool operator ==(Object other) => identical(this, other) || other is ServerAboutResponseDto && - other.build == build && - other.buildImage == buildImage && - other.buildImageUrl == buildImageUrl && - other.buildUrl == buildUrl && - other.exiftool == exiftool && - other.ffmpeg == ffmpeg && - other.imagemagick == imagemagick && - other.libvips == libvips && - other.licensed == licensed && - other.nodejs == nodejs && - other.repository == repository && - other.repositoryUrl == repositoryUrl && - other.sourceCommit == sourceCommit && - other.sourceRef == sourceRef && - other.sourceUrl == sourceUrl && - other.thirdPartyBugFeatureUrl == thirdPartyBugFeatureUrl && - other.thirdPartyDocumentationUrl == thirdPartyDocumentationUrl && - other.thirdPartySourceUrl == thirdPartySourceUrl && - other.thirdPartySupportUrl == thirdPartySupportUrl && - other.version == version && - other.versionUrl == versionUrl; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (build == null ? 0 : build!.hashCode) + - (buildImage == null ? 0 : buildImage!.hashCode) + - (buildImageUrl == null ? 0 : buildImageUrl!.hashCode) + - (buildUrl == null ? 0 : buildUrl!.hashCode) + - (exiftool == null ? 0 : exiftool!.hashCode) + - (ffmpeg == null ? 0 : ffmpeg!.hashCode) + - (imagemagick == null ? 0 : imagemagick!.hashCode) + - (libvips == null ? 0 : libvips!.hashCode) + - (licensed.hashCode) + - (nodejs == null ? 0 : nodejs!.hashCode) + - (repository == null ? 0 : repository!.hashCode) + - (repositoryUrl == null ? 0 : repositoryUrl!.hashCode) + - (sourceCommit == null ? 0 : sourceCommit!.hashCode) + - (sourceRef == null ? 0 : sourceRef!.hashCode) + - (sourceUrl == null ? 0 : sourceUrl!.hashCode) + - (thirdPartyBugFeatureUrl == null ? 0 : thirdPartyBugFeatureUrl!.hashCode) + - (thirdPartyDocumentationUrl == null ? 0 : thirdPartyDocumentationUrl!.hashCode) + - (thirdPartySourceUrl == null ? 0 : thirdPartySourceUrl!.hashCode) + - (thirdPartySupportUrl == null ? 0 : thirdPartySupportUrl!.hashCode) + - (version.hashCode) + - (versionUrl.hashCode); - - @override - String toString() => 'ServerAboutResponseDto[build=$build, buildImage=$buildImage, buildImageUrl=$buildImageUrl, buildUrl=$buildUrl, exiftool=$exiftool, ffmpeg=$ffmpeg, imagemagick=$imagemagick, libvips=$libvips, licensed=$licensed, nodejs=$nodejs, repository=$repository, repositoryUrl=$repositoryUrl, sourceCommit=$sourceCommit, sourceRef=$sourceRef, sourceUrl=$sourceUrl, thirdPartyBugFeatureUrl=$thirdPartyBugFeatureUrl, thirdPartyDocumentationUrl=$thirdPartyDocumentationUrl, thirdPartySourceUrl=$thirdPartySourceUrl, thirdPartySupportUrl=$thirdPartySupportUrl, version=$version, versionUrl=$versionUrl]'; + static ServerAboutResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + build: (json[r'build'] as String?), + buildImage: (json[r'buildImage'] as String?), + buildImageUrl: (json[r'buildImageUrl'] as String?), + buildUrl: (json[r'buildUrl'] as String?), + exiftool: (json[r'exiftool'] as String?), + ffmpeg: (json[r'ffmpeg'] as String?), + imagemagick: (json[r'imagemagick'] as String?), + libvips: (json[r'libvips'] as String?), + licensed: json[r'licensed'] as bool, + nodejs: (json[r'nodejs'] as String?), + repository: (json[r'repository'] as String?), + repositoryUrl: (json[r'repositoryUrl'] as String?), + sourceCommit: (json[r'sourceCommit'] as String?), + sourceRef: (json[r'sourceRef'] as String?), + sourceUrl: (json[r'sourceUrl'] as String?), + thirdPartyBugFeatureUrl: (json[r'thirdPartyBugFeatureUrl'] as String?), + thirdPartyDocumentationUrl: (json[r'thirdPartyDocumentationUrl'] as String?), + thirdPartySourceUrl: (json[r'thirdPartySourceUrl'] as String?), + thirdPartySupportUrl: (json[r'thirdPartySupportUrl'] as String?), + version: json[r'version'] as String, + versionUrl: json[r'versionUrl'] as String, + ); + } Map toJson() { final json = {}; - if (this.build != null) { - json[r'build'] = this.build; - } else { - // json[r'build'] = null; + if (build != null) { + json[r'build'] = build!; } - if (this.buildImage != null) { - json[r'buildImage'] = this.buildImage; - } else { - // json[r'buildImage'] = null; + if (buildImage != null) { + json[r'buildImage'] = buildImage!; } - if (this.buildImageUrl != null) { - json[r'buildImageUrl'] = this.buildImageUrl; - } else { - // json[r'buildImageUrl'] = null; + if (buildImageUrl != null) { + json[r'buildImageUrl'] = buildImageUrl!; } - if (this.buildUrl != null) { - json[r'buildUrl'] = this.buildUrl; - } else { - // json[r'buildUrl'] = null; + if (buildUrl != null) { + json[r'buildUrl'] = buildUrl!; } - if (this.exiftool != null) { - json[r'exiftool'] = this.exiftool; - } else { - // json[r'exiftool'] = null; + if (exiftool != null) { + json[r'exiftool'] = exiftool!; } - if (this.ffmpeg != null) { - json[r'ffmpeg'] = this.ffmpeg; - } else { - // json[r'ffmpeg'] = null; + if (ffmpeg != null) { + json[r'ffmpeg'] = ffmpeg!; } - if (this.imagemagick != null) { - json[r'imagemagick'] = this.imagemagick; - } else { - // json[r'imagemagick'] = null; + if (imagemagick != null) { + json[r'imagemagick'] = imagemagick!; } - if (this.libvips != null) { - json[r'libvips'] = this.libvips; - } else { - // json[r'libvips'] = null; + if (libvips != null) { + json[r'libvips'] = libvips!; } - json[r'licensed'] = this.licensed; - if (this.nodejs != null) { - json[r'nodejs'] = this.nodejs; - } else { - // json[r'nodejs'] = null; + json[r'licensed'] = licensed; + if (nodejs != null) { + json[r'nodejs'] = nodejs!; } - if (this.repository != null) { - json[r'repository'] = this.repository; - } else { - // json[r'repository'] = null; + if (repository != null) { + json[r'repository'] = repository!; } - if (this.repositoryUrl != null) { - json[r'repositoryUrl'] = this.repositoryUrl; - } else { - // json[r'repositoryUrl'] = null; + if (repositoryUrl != null) { + json[r'repositoryUrl'] = repositoryUrl!; } - if (this.sourceCommit != null) { - json[r'sourceCommit'] = this.sourceCommit; - } else { - // json[r'sourceCommit'] = null; + if (sourceCommit != null) { + json[r'sourceCommit'] = sourceCommit!; } - if (this.sourceRef != null) { - json[r'sourceRef'] = this.sourceRef; - } else { - // json[r'sourceRef'] = null; + if (sourceRef != null) { + json[r'sourceRef'] = sourceRef!; } - if (this.sourceUrl != null) { - json[r'sourceUrl'] = this.sourceUrl; - } else { - // json[r'sourceUrl'] = null; + if (sourceUrl != null) { + json[r'sourceUrl'] = sourceUrl!; } - if (this.thirdPartyBugFeatureUrl != null) { - json[r'thirdPartyBugFeatureUrl'] = this.thirdPartyBugFeatureUrl; - } else { - // json[r'thirdPartyBugFeatureUrl'] = null; + if (thirdPartyBugFeatureUrl != null) { + json[r'thirdPartyBugFeatureUrl'] = thirdPartyBugFeatureUrl!; } - if (this.thirdPartyDocumentationUrl != null) { - json[r'thirdPartyDocumentationUrl'] = this.thirdPartyDocumentationUrl; - } else { - // json[r'thirdPartyDocumentationUrl'] = null; + if (thirdPartyDocumentationUrl != null) { + json[r'thirdPartyDocumentationUrl'] = thirdPartyDocumentationUrl!; } - if (this.thirdPartySourceUrl != null) { - json[r'thirdPartySourceUrl'] = this.thirdPartySourceUrl; - } else { - // json[r'thirdPartySourceUrl'] = null; + if (thirdPartySourceUrl != null) { + json[r'thirdPartySourceUrl'] = thirdPartySourceUrl!; } - if (this.thirdPartySupportUrl != null) { - json[r'thirdPartySupportUrl'] = this.thirdPartySupportUrl; - } else { - // json[r'thirdPartySupportUrl'] = null; + if (thirdPartySupportUrl != null) { + json[r'thirdPartySupportUrl'] = thirdPartySupportUrl!; } - json[r'version'] = this.version; - json[r'versionUrl'] = this.versionUrl; + json[r'version'] = version; + json[r'versionUrl'] = versionUrl; return json; } - /// Returns a new [ServerAboutResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ServerAboutResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ServerAboutResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ServerAboutResponseDto( - build: mapValueOfType(json, r'build'), - buildImage: mapValueOfType(json, r'buildImage'), - buildImageUrl: mapValueOfType(json, r'buildImageUrl'), - buildUrl: mapValueOfType(json, r'buildUrl'), - exiftool: mapValueOfType(json, r'exiftool'), - ffmpeg: mapValueOfType(json, r'ffmpeg'), - imagemagick: mapValueOfType(json, r'imagemagick'), - libvips: mapValueOfType(json, r'libvips'), - licensed: mapValueOfType(json, r'licensed')!, - nodejs: mapValueOfType(json, r'nodejs'), - repository: mapValueOfType(json, r'repository'), - repositoryUrl: mapValueOfType(json, r'repositoryUrl'), - sourceCommit: mapValueOfType(json, r'sourceCommit'), - sourceRef: mapValueOfType(json, r'sourceRef'), - sourceUrl: mapValueOfType(json, r'sourceUrl'), - thirdPartyBugFeatureUrl: mapValueOfType(json, r'thirdPartyBugFeatureUrl'), - thirdPartyDocumentationUrl: mapValueOfType(json, r'thirdPartyDocumentationUrl'), - thirdPartySourceUrl: mapValueOfType(json, r'thirdPartySourceUrl'), - thirdPartySupportUrl: mapValueOfType(json, r'thirdPartySupportUrl'), - version: mapValueOfType(json, r'version')!, - versionUrl: mapValueOfType(json, r'versionUrl')!, - ); - } - return null; + ServerAboutResponseDto copyWith({ + Object? build = _undefined, + Object? buildImage = _undefined, + Object? buildImageUrl = _undefined, + Object? buildUrl = _undefined, + Object? exiftool = _undefined, + Object? ffmpeg = _undefined, + Object? imagemagick = _undefined, + Object? libvips = _undefined, + bool? licensed, + Object? nodejs = _undefined, + Object? repository = _undefined, + Object? repositoryUrl = _undefined, + Object? sourceCommit = _undefined, + Object? sourceRef = _undefined, + Object? sourceUrl = _undefined, + Object? thirdPartyBugFeatureUrl = _undefined, + Object? thirdPartyDocumentationUrl = _undefined, + Object? thirdPartySourceUrl = _undefined, + Object? thirdPartySupportUrl = _undefined, + String? version, + String? versionUrl, + }) { + return .new( + build: identical(build, _undefined) ? this.build : build as String?, + buildImage: identical(buildImage, _undefined) ? this.buildImage : buildImage as String?, + buildImageUrl: identical(buildImageUrl, _undefined) ? this.buildImageUrl : buildImageUrl as String?, + buildUrl: identical(buildUrl, _undefined) ? this.buildUrl : buildUrl as String?, + exiftool: identical(exiftool, _undefined) ? this.exiftool : exiftool as String?, + ffmpeg: identical(ffmpeg, _undefined) ? this.ffmpeg : ffmpeg as String?, + imagemagick: identical(imagemagick, _undefined) ? this.imagemagick : imagemagick as String?, + libvips: identical(libvips, _undefined) ? this.libvips : libvips as String?, + licensed: licensed ?? this.licensed, + nodejs: identical(nodejs, _undefined) ? this.nodejs : nodejs as String?, + repository: identical(repository, _undefined) ? this.repository : repository as String?, + repositoryUrl: identical(repositoryUrl, _undefined) ? this.repositoryUrl : repositoryUrl as String?, + sourceCommit: identical(sourceCommit, _undefined) ? this.sourceCommit : sourceCommit as String?, + sourceRef: identical(sourceRef, _undefined) ? this.sourceRef : sourceRef as String?, + sourceUrl: identical(sourceUrl, _undefined) ? this.sourceUrl : sourceUrl as String?, + thirdPartyBugFeatureUrl: identical(thirdPartyBugFeatureUrl, _undefined) + ? this.thirdPartyBugFeatureUrl + : thirdPartyBugFeatureUrl as String?, + thirdPartyDocumentationUrl: identical(thirdPartyDocumentationUrl, _undefined) + ? this.thirdPartyDocumentationUrl + : thirdPartyDocumentationUrl as String?, + thirdPartySourceUrl: identical(thirdPartySourceUrl, _undefined) + ? this.thirdPartySourceUrl + : thirdPartySourceUrl as String?, + thirdPartySupportUrl: identical(thirdPartySupportUrl, _undefined) + ? this.thirdPartySupportUrl + : thirdPartySupportUrl as String?, + version: version ?? this.version, + versionUrl: versionUrl ?? this.versionUrl, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ServerAboutResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ServerAboutResponseDto && + build == other.build && + buildImage == other.buildImage && + buildImageUrl == other.buildImageUrl && + buildUrl == other.buildUrl && + exiftool == other.exiftool && + ffmpeg == other.ffmpeg && + imagemagick == other.imagemagick && + libvips == other.libvips && + licensed == other.licensed && + nodejs == other.nodejs && + repository == other.repository && + repositoryUrl == other.repositoryUrl && + sourceCommit == other.sourceCommit && + sourceRef == other.sourceRef && + sourceUrl == other.sourceUrl && + thirdPartyBugFeatureUrl == other.thirdPartyBugFeatureUrl && + thirdPartyDocumentationUrl == other.thirdPartyDocumentationUrl && + thirdPartySourceUrl == other.thirdPartySourceUrl && + thirdPartySupportUrl == other.thirdPartySupportUrl && + version == other.version && + versionUrl == other.versionUrl); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ServerAboutResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + build, + buildImage, + buildImageUrl, + buildUrl, + exiftool, + ffmpeg, + imagemagick, + libvips, + licensed, + nodejs, + repository, + repositoryUrl, + sourceCommit, + sourceRef, + sourceUrl, + thirdPartyBugFeatureUrl, + thirdPartyDocumentationUrl, + thirdPartySourceUrl, + thirdPartySupportUrl, + version, + versionUrl, + ]); } - // maps a json object with a list of ServerAboutResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ServerAboutResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'licensed', - 'version', - 'versionUrl', - }; + @override + String toString() => + 'ServerAboutResponseDto(build=$build, buildImage=$buildImage, buildImageUrl=$buildImageUrl, buildUrl=$buildUrl, exiftool=$exiftool, ffmpeg=$ffmpeg, imagemagick=$imagemagick, libvips=$libvips, licensed=$licensed, nodejs=$nodejs, repository=$repository, repositoryUrl=$repositoryUrl, sourceCommit=$sourceCommit, sourceRef=$sourceRef, sourceUrl=$sourceUrl, thirdPartyBugFeatureUrl=$thirdPartyBugFeatureUrl, thirdPartyDocumentationUrl=$thirdPartyDocumentationUrl, thirdPartySourceUrl=$thirdPartySourceUrl, thirdPartySupportUrl=$thirdPartySupportUrl, version=$version, versionUrl=$versionUrl)'; } - diff --git a/mobile/openapi/lib/model/server_apk_links_dto.dart b/mobile/openapi/lib/model/server_apk_links_dto.dart index 2227018468..bddb49d150 100644 --- a/mobile/openapi/lib/model/server_apk_links_dto.dart +++ b/mobile/openapi/lib/model/server_apk_links_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ServerApkLinksDto { - /// Returns a new [ServerApkLinksDto] instance. - ServerApkLinksDto({ +final class ServerApkLinksDto { + const ServerApkLinksDto({ required this.arm64v8a, required this.armeabiv7a, required this.universal, @@ -20,108 +11,63 @@ class ServerApkLinksDto { }); /// APK download link for ARM64 v8a architecture - String arm64v8a; + final String arm64v8a; /// APK download link for ARM EABI v7a architecture - String armeabiv7a; + final String armeabiv7a; /// APK download link for universal architecture - String universal; + final String universal; /// APK download link for x86_64 architecture - String x8664; + final String x8664; - @override - bool operator ==(Object other) => identical(this, other) || other is ServerApkLinksDto && - other.arm64v8a == arm64v8a && - other.armeabiv7a == armeabiv7a && - other.universal == universal && - other.x8664 == x8664; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (arm64v8a.hashCode) + - (armeabiv7a.hashCode) + - (universal.hashCode) + - (x8664.hashCode); - - @override - String toString() => 'ServerApkLinksDto[arm64v8a=$arm64v8a, armeabiv7a=$armeabiv7a, universal=$universal, x8664=$x8664]'; + static ServerApkLinksDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + arm64v8a: json[r'arm64v8a'] as String, + armeabiv7a: json[r'armeabiv7a'] as String, + universal: json[r'universal'] as String, + x8664: json[r'x86_64'] as String, + ); + } Map toJson() { final json = {}; - json[r'arm64v8a'] = this.arm64v8a; - json[r'armeabiv7a'] = this.armeabiv7a; - json[r'universal'] = this.universal; - json[r'x86_64'] = this.x8664; + json[r'arm64v8a'] = arm64v8a; + json[r'armeabiv7a'] = armeabiv7a; + json[r'universal'] = universal; + json[r'x86_64'] = x8664; return json; } - /// Returns a new [ServerApkLinksDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ServerApkLinksDto? fromJson(dynamic value) { - upgradeDto(value, "ServerApkLinksDto"); - if (value is Map) { - final json = value.cast(); - - return ServerApkLinksDto( - arm64v8a: mapValueOfType(json, r'arm64v8a')!, - armeabiv7a: mapValueOfType(json, r'armeabiv7a')!, - universal: mapValueOfType(json, r'universal')!, - x8664: mapValueOfType(json, r'x86_64')!, - ); - } - return null; + ServerApkLinksDto copyWith({String? arm64v8a, String? armeabiv7a, String? universal, String? x8664}) { + return .new( + arm64v8a: arm64v8a ?? this.arm64v8a, + armeabiv7a: armeabiv7a ?? this.armeabiv7a, + universal: universal ?? this.universal, + x8664: x8664 ?? this.x8664, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ServerApkLinksDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ServerApkLinksDto && + arm64v8a == other.arm64v8a && + armeabiv7a == other.armeabiv7a && + universal == other.universal && + x8664 == other.x8664); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ServerApkLinksDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([arm64v8a, armeabiv7a, universal, x8664]); } - // maps a json object with a list of ServerApkLinksDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ServerApkLinksDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'arm64v8a', - 'armeabiv7a', - 'universal', - 'x86_64', - }; + @override + String toString() => + 'ServerApkLinksDto(arm64v8a=$arm64v8a, armeabiv7a=$armeabiv7a, universal=$universal, x8664=$x8664)'; } - diff --git a/mobile/openapi/lib/model/server_config_dto.dart b/mobile/openapi/lib/model/server_config_dto.dart index 316edb609f..0c21c7a6f2 100644 --- a/mobile/openapi/lib/model/server_config_dto.dart +++ b/mobile/openapi/lib/model/server_config_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ServerConfigDto { - /// Returns a new [ServerConfigDto] instance. - ServerConfigDto({ +final class ServerConfigDto { + const ServerConfigDto({ required this.externalDomain, required this.isInitialized, required this.isOnboarded, @@ -27,170 +18,136 @@ class ServerConfigDto { }); /// External domain URL - String externalDomain; + final String externalDomain; /// Whether the server has been initialized - bool isInitialized; + final bool isInitialized; /// Whether the admin has completed onboarding - bool isOnboarded; + final bool isOnboarded; /// Login page message - String loginPageMessage; + final String loginPageMessage; /// Whether maintenance mode is active - bool maintenanceMode; + final bool maintenanceMode; /// Map dark style URL - String mapDarkStyleUrl; + final String mapDarkStyleUrl; /// Map light style URL - String mapLightStyleUrl; + final String mapLightStyleUrl; /// OAuth button text - String oauthButtonText; + final String oauthButtonText; /// Whether public user registration is enabled - bool publicUsers; + final bool publicUsers; /// Number of days before trashed assets are permanently deleted - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int trashDays; + final int trashDays; /// Delay in days before deleted users are permanently removed - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int userDeleteDelay; + final int userDeleteDelay; - @override - bool operator ==(Object other) => identical(this, other) || other is ServerConfigDto && - other.externalDomain == externalDomain && - other.isInitialized == isInitialized && - other.isOnboarded == isOnboarded && - other.loginPageMessage == loginPageMessage && - other.maintenanceMode == maintenanceMode && - other.mapDarkStyleUrl == mapDarkStyleUrl && - other.mapLightStyleUrl == mapLightStyleUrl && - other.oauthButtonText == oauthButtonText && - other.publicUsers == publicUsers && - other.trashDays == trashDays && - other.userDeleteDelay == userDeleteDelay; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (externalDomain.hashCode) + - (isInitialized.hashCode) + - (isOnboarded.hashCode) + - (loginPageMessage.hashCode) + - (maintenanceMode.hashCode) + - (mapDarkStyleUrl.hashCode) + - (mapLightStyleUrl.hashCode) + - (oauthButtonText.hashCode) + - (publicUsers.hashCode) + - (trashDays.hashCode) + - (userDeleteDelay.hashCode); - - @override - String toString() => 'ServerConfigDto[externalDomain=$externalDomain, isInitialized=$isInitialized, isOnboarded=$isOnboarded, loginPageMessage=$loginPageMessage, maintenanceMode=$maintenanceMode, mapDarkStyleUrl=$mapDarkStyleUrl, mapLightStyleUrl=$mapLightStyleUrl, oauthButtonText=$oauthButtonText, publicUsers=$publicUsers, trashDays=$trashDays, userDeleteDelay=$userDeleteDelay]'; + static ServerConfigDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + externalDomain: json[r'externalDomain'] as String, + isInitialized: json[r'isInitialized'] as bool, + isOnboarded: json[r'isOnboarded'] as bool, + loginPageMessage: json[r'loginPageMessage'] as String, + maintenanceMode: json[r'maintenanceMode'] as bool, + mapDarkStyleUrl: json[r'mapDarkStyleUrl'] as String, + mapLightStyleUrl: json[r'mapLightStyleUrl'] as String, + oauthButtonText: json[r'oauthButtonText'] as String, + publicUsers: json[r'publicUsers'] as bool, + trashDays: json[r'trashDays'] as int, + userDeleteDelay: json[r'userDeleteDelay'] as int, + ); + } Map toJson() { final json = {}; - json[r'externalDomain'] = this.externalDomain; - json[r'isInitialized'] = this.isInitialized; - json[r'isOnboarded'] = this.isOnboarded; - json[r'loginPageMessage'] = this.loginPageMessage; - json[r'maintenanceMode'] = this.maintenanceMode; - json[r'mapDarkStyleUrl'] = this.mapDarkStyleUrl; - json[r'mapLightStyleUrl'] = this.mapLightStyleUrl; - json[r'oauthButtonText'] = this.oauthButtonText; - json[r'publicUsers'] = this.publicUsers; - json[r'trashDays'] = this.trashDays; - json[r'userDeleteDelay'] = this.userDeleteDelay; + json[r'externalDomain'] = externalDomain; + json[r'isInitialized'] = isInitialized; + json[r'isOnboarded'] = isOnboarded; + json[r'loginPageMessage'] = loginPageMessage; + json[r'maintenanceMode'] = maintenanceMode; + json[r'mapDarkStyleUrl'] = mapDarkStyleUrl; + json[r'mapLightStyleUrl'] = mapLightStyleUrl; + json[r'oauthButtonText'] = oauthButtonText; + json[r'publicUsers'] = publicUsers; + json[r'trashDays'] = trashDays; + json[r'userDeleteDelay'] = userDeleteDelay; return json; } - /// Returns a new [ServerConfigDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ServerConfigDto? fromJson(dynamic value) { - upgradeDto(value, "ServerConfigDto"); - if (value is Map) { - final json = value.cast(); - - return ServerConfigDto( - externalDomain: mapValueOfType(json, r'externalDomain')!, - isInitialized: mapValueOfType(json, r'isInitialized')!, - isOnboarded: mapValueOfType(json, r'isOnboarded')!, - loginPageMessage: mapValueOfType(json, r'loginPageMessage')!, - maintenanceMode: mapValueOfType(json, r'maintenanceMode')!, - mapDarkStyleUrl: mapValueOfType(json, r'mapDarkStyleUrl')!, - mapLightStyleUrl: mapValueOfType(json, r'mapLightStyleUrl')!, - oauthButtonText: mapValueOfType(json, r'oauthButtonText')!, - publicUsers: mapValueOfType(json, r'publicUsers')!, - trashDays: mapValueOfType(json, r'trashDays')!, - userDeleteDelay: mapValueOfType(json, r'userDeleteDelay')!, - ); - } - return null; + ServerConfigDto copyWith({ + String? externalDomain, + bool? isInitialized, + bool? isOnboarded, + String? loginPageMessage, + bool? maintenanceMode, + String? mapDarkStyleUrl, + String? mapLightStyleUrl, + String? oauthButtonText, + bool? publicUsers, + int? trashDays, + int? userDeleteDelay, + }) { + return .new( + externalDomain: externalDomain ?? this.externalDomain, + isInitialized: isInitialized ?? this.isInitialized, + isOnboarded: isOnboarded ?? this.isOnboarded, + loginPageMessage: loginPageMessage ?? this.loginPageMessage, + maintenanceMode: maintenanceMode ?? this.maintenanceMode, + mapDarkStyleUrl: mapDarkStyleUrl ?? this.mapDarkStyleUrl, + mapLightStyleUrl: mapLightStyleUrl ?? this.mapLightStyleUrl, + oauthButtonText: oauthButtonText ?? this.oauthButtonText, + publicUsers: publicUsers ?? this.publicUsers, + trashDays: trashDays ?? this.trashDays, + userDeleteDelay: userDeleteDelay ?? this.userDeleteDelay, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ServerConfigDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ServerConfigDto && + externalDomain == other.externalDomain && + isInitialized == other.isInitialized && + isOnboarded == other.isOnboarded && + loginPageMessage == other.loginPageMessage && + maintenanceMode == other.maintenanceMode && + mapDarkStyleUrl == other.mapDarkStyleUrl && + mapLightStyleUrl == other.mapLightStyleUrl && + oauthButtonText == other.oauthButtonText && + publicUsers == other.publicUsers && + trashDays == other.trashDays && + userDeleteDelay == other.userDeleteDelay); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ServerConfigDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + externalDomain, + isInitialized, + isOnboarded, + loginPageMessage, + maintenanceMode, + mapDarkStyleUrl, + mapLightStyleUrl, + oauthButtonText, + publicUsers, + trashDays, + userDeleteDelay, + ]); } - // maps a json object with a list of ServerConfigDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ServerConfigDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'externalDomain', - 'isInitialized', - 'isOnboarded', - 'loginPageMessage', - 'maintenanceMode', - 'mapDarkStyleUrl', - 'mapLightStyleUrl', - 'oauthButtonText', - 'publicUsers', - 'trashDays', - 'userDeleteDelay', - }; + @override + String toString() => + 'ServerConfigDto(externalDomain=$externalDomain, isInitialized=$isInitialized, isOnboarded=$isOnboarded, loginPageMessage=$loginPageMessage, maintenanceMode=$maintenanceMode, mapDarkStyleUrl=$mapDarkStyleUrl, mapLightStyleUrl=$mapLightStyleUrl, oauthButtonText=$oauthButtonText, publicUsers=$publicUsers, trashDays=$trashDays, userDeleteDelay=$userDeleteDelay)'; } - diff --git a/mobile/openapi/lib/model/server_features_dto.dart b/mobile/openapi/lib/model/server_features_dto.dart index 79494b74eb..3a2f9c5cba 100644 --- a/mobile/openapi/lib/model/server_features_dto.dart +++ b/mobile/openapi/lib/model/server_features_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ServerFeaturesDto { - /// Returns a new [ServerFeaturesDto] instance. - ServerFeaturesDto({ +final class ServerFeaturesDto { + const ServerFeaturesDto({ required this.configFile, required this.duplicateDetection, required this.email, @@ -31,196 +22,172 @@ class ServerFeaturesDto { }); /// Whether config file is available - bool configFile; + final bool configFile; /// Whether duplicate detection is enabled - bool duplicateDetection; + final bool duplicateDetection; /// Whether email notifications are enabled - bool email; + final bool email; /// Whether facial recognition is enabled - bool facialRecognition; + final bool facialRecognition; /// Whether face import is enabled - bool importFaces; + final bool importFaces; /// Whether map feature is enabled - bool map; + final bool map; /// Whether OAuth is enabled - bool oauth; + final bool oauth; /// Whether OAuth auto-launch is enabled - bool oauthAutoLaunch; + final bool oauthAutoLaunch; /// Whether OCR is enabled - bool ocr; + final bool ocr; /// Whether password login is enabled - bool passwordLogin; + final bool passwordLogin; /// Whether reverse geocoding is enabled - bool reverseGeocoding; + final bool reverseGeocoding; /// Whether search is enabled - bool search; + final bool search; /// Whether sidecar files are supported - bool sidecar; + final bool sidecar; /// Whether smart search is enabled - bool smartSearch; + final bool smartSearch; /// Whether trash feature is enabled - bool trash; + final bool trash; - @override - bool operator ==(Object other) => identical(this, other) || other is ServerFeaturesDto && - other.configFile == configFile && - other.duplicateDetection == duplicateDetection && - other.email == email && - other.facialRecognition == facialRecognition && - other.importFaces == importFaces && - other.map == map && - other.oauth == oauth && - other.oauthAutoLaunch == oauthAutoLaunch && - other.ocr == ocr && - other.passwordLogin == passwordLogin && - other.reverseGeocoding == reverseGeocoding && - other.search == search && - other.sidecar == sidecar && - other.smartSearch == smartSearch && - other.trash == trash; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (configFile.hashCode) + - (duplicateDetection.hashCode) + - (email.hashCode) + - (facialRecognition.hashCode) + - (importFaces.hashCode) + - (map.hashCode) + - (oauth.hashCode) + - (oauthAutoLaunch.hashCode) + - (ocr.hashCode) + - (passwordLogin.hashCode) + - (reverseGeocoding.hashCode) + - (search.hashCode) + - (sidecar.hashCode) + - (smartSearch.hashCode) + - (trash.hashCode); - - @override - String toString() => 'ServerFeaturesDto[configFile=$configFile, duplicateDetection=$duplicateDetection, email=$email, facialRecognition=$facialRecognition, importFaces=$importFaces, map=$map, oauth=$oauth, oauthAutoLaunch=$oauthAutoLaunch, ocr=$ocr, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, trash=$trash]'; + static ServerFeaturesDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + configFile: json[r'configFile'] as bool, + duplicateDetection: json[r'duplicateDetection'] as bool, + email: json[r'email'] as bool, + facialRecognition: json[r'facialRecognition'] as bool, + importFaces: json[r'importFaces'] as bool, + map: json[r'map'] as bool, + oauth: json[r'oauth'] as bool, + oauthAutoLaunch: json[r'oauthAutoLaunch'] as bool, + ocr: json[r'ocr'] as bool, + passwordLogin: json[r'passwordLogin'] as bool, + reverseGeocoding: json[r'reverseGeocoding'] as bool, + search: json[r'search'] as bool, + sidecar: json[r'sidecar'] as bool, + smartSearch: json[r'smartSearch'] as bool, + trash: json[r'trash'] as bool, + ); + } Map toJson() { final json = {}; - json[r'configFile'] = this.configFile; - json[r'duplicateDetection'] = this.duplicateDetection; - json[r'email'] = this.email; - json[r'facialRecognition'] = this.facialRecognition; - json[r'importFaces'] = this.importFaces; - json[r'map'] = this.map; - json[r'oauth'] = this.oauth; - json[r'oauthAutoLaunch'] = this.oauthAutoLaunch; - json[r'ocr'] = this.ocr; - json[r'passwordLogin'] = this.passwordLogin; - json[r'reverseGeocoding'] = this.reverseGeocoding; - json[r'search'] = this.search; - json[r'sidecar'] = this.sidecar; - json[r'smartSearch'] = this.smartSearch; - json[r'trash'] = this.trash; + json[r'configFile'] = configFile; + json[r'duplicateDetection'] = duplicateDetection; + json[r'email'] = email; + json[r'facialRecognition'] = facialRecognition; + json[r'importFaces'] = importFaces; + json[r'map'] = map; + json[r'oauth'] = oauth; + json[r'oauthAutoLaunch'] = oauthAutoLaunch; + json[r'ocr'] = ocr; + json[r'passwordLogin'] = passwordLogin; + json[r'reverseGeocoding'] = reverseGeocoding; + json[r'search'] = search; + json[r'sidecar'] = sidecar; + json[r'smartSearch'] = smartSearch; + json[r'trash'] = trash; return json; } - /// Returns a new [ServerFeaturesDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ServerFeaturesDto? fromJson(dynamic value) { - upgradeDto(value, "ServerFeaturesDto"); - if (value is Map) { - final json = value.cast(); - - return ServerFeaturesDto( - configFile: mapValueOfType(json, r'configFile')!, - duplicateDetection: mapValueOfType(json, r'duplicateDetection')!, - email: mapValueOfType(json, r'email')!, - facialRecognition: mapValueOfType(json, r'facialRecognition')!, - importFaces: mapValueOfType(json, r'importFaces')!, - map: mapValueOfType(json, r'map')!, - oauth: mapValueOfType(json, r'oauth')!, - oauthAutoLaunch: mapValueOfType(json, r'oauthAutoLaunch')!, - ocr: mapValueOfType(json, r'ocr')!, - passwordLogin: mapValueOfType(json, r'passwordLogin')!, - reverseGeocoding: mapValueOfType(json, r'reverseGeocoding')!, - search: mapValueOfType(json, r'search')!, - sidecar: mapValueOfType(json, r'sidecar')!, - smartSearch: mapValueOfType(json, r'smartSearch')!, - trash: mapValueOfType(json, r'trash')!, - ); - } - return null; + ServerFeaturesDto copyWith({ + bool? configFile, + bool? duplicateDetection, + bool? email, + bool? facialRecognition, + bool? importFaces, + bool? map, + bool? oauth, + bool? oauthAutoLaunch, + bool? ocr, + bool? passwordLogin, + bool? reverseGeocoding, + bool? search, + bool? sidecar, + bool? smartSearch, + bool? trash, + }) { + return .new( + configFile: configFile ?? this.configFile, + duplicateDetection: duplicateDetection ?? this.duplicateDetection, + email: email ?? this.email, + facialRecognition: facialRecognition ?? this.facialRecognition, + importFaces: importFaces ?? this.importFaces, + map: map ?? this.map, + oauth: oauth ?? this.oauth, + oauthAutoLaunch: oauthAutoLaunch ?? this.oauthAutoLaunch, + ocr: ocr ?? this.ocr, + passwordLogin: passwordLogin ?? this.passwordLogin, + reverseGeocoding: reverseGeocoding ?? this.reverseGeocoding, + search: search ?? this.search, + sidecar: sidecar ?? this.sidecar, + smartSearch: smartSearch ?? this.smartSearch, + trash: trash ?? this.trash, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ServerFeaturesDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ServerFeaturesDto && + configFile == other.configFile && + duplicateDetection == other.duplicateDetection && + email == other.email && + facialRecognition == other.facialRecognition && + importFaces == other.importFaces && + map == other.map && + oauth == other.oauth && + oauthAutoLaunch == other.oauthAutoLaunch && + ocr == other.ocr && + passwordLogin == other.passwordLogin && + reverseGeocoding == other.reverseGeocoding && + search == other.search && + sidecar == other.sidecar && + smartSearch == other.smartSearch && + trash == other.trash); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ServerFeaturesDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + configFile, + duplicateDetection, + email, + facialRecognition, + importFaces, + map, + oauth, + oauthAutoLaunch, + ocr, + passwordLogin, + reverseGeocoding, + search, + sidecar, + smartSearch, + trash, + ]); } - // maps a json object with a list of ServerFeaturesDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ServerFeaturesDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'configFile', - 'duplicateDetection', - 'email', - 'facialRecognition', - 'importFaces', - 'map', - 'oauth', - 'oauthAutoLaunch', - 'ocr', - 'passwordLogin', - 'reverseGeocoding', - 'search', - 'sidecar', - 'smartSearch', - 'trash', - }; + @override + String toString() => + 'ServerFeaturesDto(configFile=$configFile, duplicateDetection=$duplicateDetection, email=$email, facialRecognition=$facialRecognition, importFaces=$importFaces, map=$map, oauth=$oauth, oauthAutoLaunch=$oauthAutoLaunch, ocr=$ocr, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, trash=$trash)'; } - diff --git a/mobile/openapi/lib/model/server_media_types_response_dto.dart b/mobile/openapi/lib/model/server_media_types_response_dto.dart index 6a2aaeb9e1..fd7bbb3e09 100644 --- a/mobile/openapi/lib/model/server_media_types_response_dto.dart +++ b/mobile/openapi/lib/model/server_media_types_response_dto.dart @@ -1,124 +1,60 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ServerMediaTypesResponseDto { - /// Returns a new [ServerMediaTypesResponseDto] instance. - ServerMediaTypesResponseDto({ - this.image = const [], - this.sidecar = const [], - this.video = const [], - }); +final class ServerMediaTypesResponseDto { + const ServerMediaTypesResponseDto({required this.image, required this.sidecar, required this.video}); /// Supported image MIME types - List image; + final List image; /// Supported sidecar MIME types - List sidecar; + final List sidecar; /// Supported video MIME types - List video; + final List video; - @override - bool operator ==(Object other) => identical(this, other) || other is ServerMediaTypesResponseDto && - _deepEquality.equals(other.image, image) && - _deepEquality.equals(other.sidecar, sidecar) && - _deepEquality.equals(other.video, video); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (image.hashCode) + - (sidecar.hashCode) + - (video.hashCode); - - @override - String toString() => 'ServerMediaTypesResponseDto[image=$image, sidecar=$sidecar, video=$video]'; + static ServerMediaTypesResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + image: ((json[r'image'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + sidecar: ((json[r'sidecar'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + video: ((json[r'video'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'image'] = this.image; - json[r'sidecar'] = this.sidecar; - json[r'video'] = this.video; + json[r'image'] = image; + json[r'sidecar'] = sidecar; + json[r'video'] = video; return json; } - /// Returns a new [ServerMediaTypesResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ServerMediaTypesResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ServerMediaTypesResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ServerMediaTypesResponseDto( - image: json[r'image'] is Iterable - ? (json[r'image'] as Iterable).cast().toList(growable: false) - : const [], - sidecar: json[r'sidecar'] is Iterable - ? (json[r'sidecar'] as Iterable).cast().toList(growable: false) - : const [], - video: json[r'video'] is Iterable - ? (json[r'video'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + ServerMediaTypesResponseDto copyWith({List? image, List? sidecar, List? video}) { + return .new(image: image ?? this.image, sidecar: sidecar ?? this.sidecar, video: video ?? this.video); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ServerMediaTypesResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ServerMediaTypesResponseDto && + const DeepCollectionEquality().equals(image, other.image) && + const DeepCollectionEquality().equals(sidecar, other.sidecar) && + const DeepCollectionEquality().equals(video, other.video)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ServerMediaTypesResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + const DeepCollectionEquality().hash(image), + const DeepCollectionEquality().hash(sidecar), + const DeepCollectionEquality().hash(video), + ]); } - // maps a json object with a list of ServerMediaTypesResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ServerMediaTypesResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'image', - 'sidecar', - 'video', - }; + @override + String toString() => 'ServerMediaTypesResponseDto(image=$image, sidecar=$sidecar, video=$video)'; } - diff --git a/mobile/openapi/lib/model/server_ping_response.dart b/mobile/openapi/lib/model/server_ping_response.dart index 621ebfa294..fe960642dd 100644 --- a/mobile/openapi/lib/model/server_ping_response.dart +++ b/mobile/openapi/lib/model/server_ping_response.dart @@ -1,99 +1,39 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ServerPingResponse { - /// Returns a new [ServerPingResponse] instance. - ServerPingResponse({ - required this.res, - }); +final class ServerPingResponse { + const ServerPingResponse({required this.res}); - String res; + final String res; - @override - bool operator ==(Object other) => identical(this, other) || other is ServerPingResponse && - other.res == res; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (res.hashCode); - - @override - String toString() => 'ServerPingResponse[res=$res]'; + static ServerPingResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(res: json[r'res'] as String); + } Map toJson() { final json = {}; - json[r'res'] = this.res; + json[r'res'] = res; return json; } - /// Returns a new [ServerPingResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ServerPingResponse? fromJson(dynamic value) { - upgradeDto(value, "ServerPingResponse"); - if (value is Map) { - final json = value.cast(); - - return ServerPingResponse( - res: mapValueOfType(json, r'res')!, - ); - } - return null; + ServerPingResponse copyWith({String? res}) { + return .new(res: res ?? this.res); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ServerPingResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is ServerPingResponse && res == other.res); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ServerPingResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([res]); } - // maps a json object with a list of ServerPingResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ServerPingResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'res', - }; + @override + String toString() => 'ServerPingResponse(res=$res)'; } - diff --git a/mobile/openapi/lib/model/server_stats_response_dto.dart b/mobile/openapi/lib/model/server_stats_response_dto.dart index 605bd74f41..49858a42a3 100644 --- a/mobile/openapi/lib/model/server_stats_response_dto.dart +++ b/mobile/openapi/lib/model/server_stats_response_dto.dart @@ -1,160 +1,105 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ServerStatsResponseDto { - /// Returns a new [ServerStatsResponseDto] instance. - ServerStatsResponseDto({ +final class ServerStatsResponseDto { + const ServerStatsResponseDto({ required this.photos, required this.usage, - this.usageByUser = const [], + required this.usageByUser, required this.usagePhotos, required this.usageVideos, required this.videos, }); /// Total number of photos - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int photos; + final int photos; /// Total storage usage in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int usage; + final int usage; /// Array of usage for each user - List usageByUser; + final List usageByUser; /// Storage usage for photos in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int usagePhotos; + final int usagePhotos; /// Storage usage for videos in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int usageVideos; + final int usageVideos; /// Total number of videos - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int videos; + final int videos; - @override - bool operator ==(Object other) => identical(this, other) || other is ServerStatsResponseDto && - other.photos == photos && - other.usage == usage && - _deepEquality.equals(other.usageByUser, usageByUser) && - other.usagePhotos == usagePhotos && - other.usageVideos == usageVideos && - other.videos == videos; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (photos.hashCode) + - (usage.hashCode) + - (usageByUser.hashCode) + - (usagePhotos.hashCode) + - (usageVideos.hashCode) + - (videos.hashCode); - - @override - String toString() => 'ServerStatsResponseDto[photos=$photos, usage=$usage, usageByUser=$usageByUser, usagePhotos=$usagePhotos, usageVideos=$usageVideos, videos=$videos]'; + static ServerStatsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + photos: json[r'photos'] as int, + usage: json[r'usage'] as int, + usageByUser: ((json[r'usageByUser'] as List?) + ?.map(($e) => (UsageByUserDto.fromJson($e))!) + .toList(growable: false))!, + usagePhotos: json[r'usagePhotos'] as int, + usageVideos: json[r'usageVideos'] as int, + videos: json[r'videos'] as int, + ); + } Map toJson() { final json = {}; - json[r'photos'] = this.photos; - json[r'usage'] = this.usage; - json[r'usageByUser'] = this.usageByUser; - json[r'usagePhotos'] = this.usagePhotos; - json[r'usageVideos'] = this.usageVideos; - json[r'videos'] = this.videos; + json[r'photos'] = photos; + json[r'usage'] = usage; + json[r'usageByUser'] = usageByUser.map(($e) => $e.toJson()).toList(growable: false); + json[r'usagePhotos'] = usagePhotos; + json[r'usageVideos'] = usageVideos; + json[r'videos'] = videos; return json; } - /// Returns a new [ServerStatsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ServerStatsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ServerStatsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ServerStatsResponseDto( - photos: mapValueOfType(json, r'photos')!, - usage: mapValueOfType(json, r'usage')!, - usageByUser: UsageByUserDto.listFromJson(json[r'usageByUser']), - usagePhotos: mapValueOfType(json, r'usagePhotos')!, - usageVideos: mapValueOfType(json, r'usageVideos')!, - videos: mapValueOfType(json, r'videos')!, - ); - } - return null; + ServerStatsResponseDto copyWith({ + int? photos, + int? usage, + List? usageByUser, + int? usagePhotos, + int? usageVideos, + int? videos, + }) { + return .new( + photos: photos ?? this.photos, + usage: usage ?? this.usage, + usageByUser: usageByUser ?? this.usageByUser, + usagePhotos: usagePhotos ?? this.usagePhotos, + usageVideos: usageVideos ?? this.usageVideos, + videos: videos ?? this.videos, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ServerStatsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ServerStatsResponseDto && + photos == other.photos && + usage == other.usage && + const DeepCollectionEquality().equals(usageByUser, other.usageByUser) && + usagePhotos == other.usagePhotos && + usageVideos == other.usageVideos && + videos == other.videos); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ServerStatsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + photos, + usage, + const DeepCollectionEquality().hash(usageByUser), + usagePhotos, + usageVideos, + videos, + ]); } - // maps a json object with a list of ServerStatsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ServerStatsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'photos', - 'usage', - 'usageByUser', - 'usagePhotos', - 'usageVideos', - 'videos', - }; + @override + String toString() => + 'ServerStatsResponseDto(photos=$photos, usage=$usage, usageByUser=$usageByUser, usagePhotos=$usagePhotos, usageVideos=$usageVideos, videos=$videos)'; } - diff --git a/mobile/openapi/lib/model/server_storage_response_dto.dart b/mobile/openapi/lib/model/server_storage_response_dto.dart index 4a66d54e37..82b1d8e97c 100644 --- a/mobile/openapi/lib/model/server_storage_response_dto.dart +++ b/mobile/openapi/lib/model/server_storage_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ServerStorageResponseDto { - /// Returns a new [ServerStorageResponseDto] instance. - ServerStorageResponseDto({ +final class ServerStorageResponseDto { + const ServerStorageResponseDto({ required this.diskAvailable, required this.diskAvailableRaw, required this.diskSize, @@ -23,141 +14,100 @@ class ServerStorageResponseDto { }); /// Available disk space (human-readable format) - String diskAvailable; + final String diskAvailable; /// Available disk space in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int diskAvailableRaw; + final int diskAvailableRaw; /// Total disk size (human-readable format) - String diskSize; + final String diskSize; /// Total disk size in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int diskSizeRaw; + final int diskSizeRaw; /// Disk usage percentage (0-100) - double diskUsagePercentage; + final double diskUsagePercentage; /// Used disk space (human-readable format) - String diskUse; + final String diskUse; /// Used disk space in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int diskUseRaw; + final int diskUseRaw; - @override - bool operator ==(Object other) => identical(this, other) || other is ServerStorageResponseDto && - other.diskAvailable == diskAvailable && - other.diskAvailableRaw == diskAvailableRaw && - other.diskSize == diskSize && - other.diskSizeRaw == diskSizeRaw && - other.diskUsagePercentage == diskUsagePercentage && - other.diskUse == diskUse && - other.diskUseRaw == diskUseRaw; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (diskAvailable.hashCode) + - (diskAvailableRaw.hashCode) + - (diskSize.hashCode) + - (diskSizeRaw.hashCode) + - (diskUsagePercentage.hashCode) + - (diskUse.hashCode) + - (diskUseRaw.hashCode); - - @override - String toString() => 'ServerStorageResponseDto[diskAvailable=$diskAvailable, diskAvailableRaw=$diskAvailableRaw, diskSize=$diskSize, diskSizeRaw=$diskSizeRaw, diskUsagePercentage=$diskUsagePercentage, diskUse=$diskUse, diskUseRaw=$diskUseRaw]'; + static ServerStorageResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + diskAvailable: json[r'diskAvailable'] as String, + diskAvailableRaw: json[r'diskAvailableRaw'] as int, + diskSize: json[r'diskSize'] as String, + diskSizeRaw: json[r'diskSizeRaw'] as int, + diskUsagePercentage: (json[r'diskUsagePercentage'] as num).toDouble(), + diskUse: json[r'diskUse'] as String, + diskUseRaw: json[r'diskUseRaw'] as int, + ); + } Map toJson() { final json = {}; - json[r'diskAvailable'] = this.diskAvailable; - json[r'diskAvailableRaw'] = this.diskAvailableRaw; - json[r'diskSize'] = this.diskSize; - json[r'diskSizeRaw'] = this.diskSizeRaw; - json[r'diskUsagePercentage'] = this.diskUsagePercentage; - json[r'diskUse'] = this.diskUse; - json[r'diskUseRaw'] = this.diskUseRaw; + json[r'diskAvailable'] = diskAvailable; + json[r'diskAvailableRaw'] = diskAvailableRaw; + json[r'diskSize'] = diskSize; + json[r'diskSizeRaw'] = diskSizeRaw; + json[r'diskUsagePercentage'] = diskUsagePercentage; + json[r'diskUse'] = diskUse; + json[r'diskUseRaw'] = diskUseRaw; return json; } - /// Returns a new [ServerStorageResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ServerStorageResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ServerStorageResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ServerStorageResponseDto( - diskAvailable: mapValueOfType(json, r'diskAvailable')!, - diskAvailableRaw: mapValueOfType(json, r'diskAvailableRaw')!, - diskSize: mapValueOfType(json, r'diskSize')!, - diskSizeRaw: mapValueOfType(json, r'diskSizeRaw')!, - diskUsagePercentage: (mapValueOfType(json, r'diskUsagePercentage')!).toDouble(), - diskUse: mapValueOfType(json, r'diskUse')!, - diskUseRaw: mapValueOfType(json, r'diskUseRaw')!, - ); - } - return null; + ServerStorageResponseDto copyWith({ + String? diskAvailable, + int? diskAvailableRaw, + String? diskSize, + int? diskSizeRaw, + double? diskUsagePercentage, + String? diskUse, + int? diskUseRaw, + }) { + return .new( + diskAvailable: diskAvailable ?? this.diskAvailable, + diskAvailableRaw: diskAvailableRaw ?? this.diskAvailableRaw, + diskSize: diskSize ?? this.diskSize, + diskSizeRaw: diskSizeRaw ?? this.diskSizeRaw, + diskUsagePercentage: diskUsagePercentage ?? this.diskUsagePercentage, + diskUse: diskUse ?? this.diskUse, + diskUseRaw: diskUseRaw ?? this.diskUseRaw, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ServerStorageResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ServerStorageResponseDto && + diskAvailable == other.diskAvailable && + diskAvailableRaw == other.diskAvailableRaw && + diskSize == other.diskSize && + diskSizeRaw == other.diskSizeRaw && + diskUsagePercentage == other.diskUsagePercentage && + diskUse == other.diskUse && + diskUseRaw == other.diskUseRaw); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ServerStorageResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + diskAvailable, + diskAvailableRaw, + diskSize, + diskSizeRaw, + diskUsagePercentage, + diskUse, + diskUseRaw, + ]); } - // maps a json object with a list of ServerStorageResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ServerStorageResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'diskAvailable', - 'diskAvailableRaw', - 'diskSize', - 'diskSizeRaw', - 'diskUsagePercentage', - 'diskUse', - 'diskUseRaw', - }; + @override + String toString() => + 'ServerStorageResponseDto(diskAvailable=$diskAvailable, diskAvailableRaw=$diskAvailableRaw, diskSize=$diskSize, diskSizeRaw=$diskSizeRaw, diskUsagePercentage=$diskUsagePercentage, diskUse=$diskUse, diskUseRaw=$diskUseRaw)'; } - diff --git a/mobile/openapi/lib/model/server_version_history_response_dto.dart b/mobile/openapi/lib/model/server_version_history_response_dto.dart index ae5e060cff..0eb3845bf8 100644 --- a/mobile/openapi/lib/model/server_version_history_response_dto.dart +++ b/mobile/openapi/lib/model/server_version_history_response_dto.dart @@ -1,120 +1,56 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ServerVersionHistoryResponseDto { - /// Returns a new [ServerVersionHistoryResponseDto] instance. - ServerVersionHistoryResponseDto({ - required this.createdAt, - required this.id, - required this.version, - }); +final class ServerVersionHistoryResponseDto { + const ServerVersionHistoryResponseDto({required this.createdAt, required this.id, required this.version}); /// When this version was first seen - DateTime createdAt; + final DateTime createdAt; /// Version history entry ID - String id; + final String id; /// Version string - String version; + final String version; - @override - bool operator ==(Object other) => identical(this, other) || other is ServerVersionHistoryResponseDto && - other.createdAt == createdAt && - other.id == id && - other.version == version; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (createdAt.hashCode) + - (id.hashCode) + - (version.hashCode); - - @override - String toString() => 'ServerVersionHistoryResponseDto[createdAt=$createdAt, id=$id, version=$version]'; + static ServerVersionHistoryResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + createdAt: DateTime.parse(json[r'createdAt'] as String), + id: json[r'id'] as String, + version: json[r'version'] as String, + ); + } Map toJson() { final json = {}; - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - json[r'id'] = this.id; - json[r'version'] = this.version; + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + json[r'id'] = id; + json[r'version'] = version; return json; } - /// Returns a new [ServerVersionHistoryResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ServerVersionHistoryResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ServerVersionHistoryResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ServerVersionHistoryResponseDto( - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - id: mapValueOfType(json, r'id')!, - version: mapValueOfType(json, r'version')!, - ); - } - return null; + ServerVersionHistoryResponseDto copyWith({DateTime? createdAt, String? id, String? version}) { + return .new(createdAt: createdAt ?? this.createdAt, id: id ?? this.id, version: version ?? this.version); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ServerVersionHistoryResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ServerVersionHistoryResponseDto && + createdAt == other.createdAt && + id == other.id && + version == other.version); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ServerVersionHistoryResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([createdAt, id, version]); } - // maps a json object with a list of ServerVersionHistoryResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ServerVersionHistoryResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'createdAt', - 'id', - 'version', - }; + @override + String toString() => 'ServerVersionHistoryResponseDto(createdAt=$createdAt, id=$id, version=$version)'; } - diff --git a/mobile/openapi/lib/model/server_version_response_dto.dart b/mobile/openapi/lib/model/server_version_response_dto.dart index 60161a7458..a82407fb75 100644 --- a/mobile/openapi/lib/model/server_version_response_dto.dart +++ b/mobile/openapi/lib/model/server_version_response_dto.dart @@ -1,127 +1,49 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ServerVersionResponseDto { - /// Returns a new [ServerVersionResponseDto] instance. - ServerVersionResponseDto({ - required this.major, - required this.minor, - required this.patch_, - }); +final class ServerVersionResponseDto { + const ServerVersionResponseDto({required this.major, required this.minor, required this.patch}); /// Major version number - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int major; + final int major; /// Minor version number - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int minor; + final int minor; /// Patch version number - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int patch_; + final int patch; - @override - bool operator ==(Object other) => identical(this, other) || other is ServerVersionResponseDto && - other.major == major && - other.minor == minor && - other.patch_ == patch_; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (major.hashCode) + - (minor.hashCode) + - (patch_.hashCode); - - @override - String toString() => 'ServerVersionResponseDto[major=$major, minor=$minor, patch_=$patch_]'; + static ServerVersionResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(major: json[r'major'] as int, minor: json[r'minor'] as int, patch: json[r'patch'] as int); + } Map toJson() { final json = {}; - json[r'major'] = this.major; - json[r'minor'] = this.minor; - json[r'patch'] = this.patch_; + json[r'major'] = major; + json[r'minor'] = minor; + json[r'patch'] = patch; return json; } - /// Returns a new [ServerVersionResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ServerVersionResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ServerVersionResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ServerVersionResponseDto( - major: mapValueOfType(json, r'major')!, - minor: mapValueOfType(json, r'minor')!, - patch_: mapValueOfType(json, r'patch')!, - ); - } - return null; + ServerVersionResponseDto copyWith({int? major, int? minor, int? patch}) { + return .new(major: major ?? this.major, minor: minor ?? this.minor, patch: patch ?? this.patch); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ServerVersionResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ServerVersionResponseDto && major == other.major && minor == other.minor && patch == other.patch); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ServerVersionResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([major, minor, patch]); } - // maps a json object with a list of ServerVersionResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ServerVersionResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'major', - 'minor', - 'patch', - }; + @override + String toString() => 'ServerVersionResponseDto(major=$major, minor=$minor, patch=$patch)'; } - diff --git a/mobile/openapi/lib/model/session_create_dto.dart b/mobile/openapi/lib/model/session_create_dto.dart index 37c07955cd..64807e2c95 100644 --- a/mobile/openapi/lib/model/session_create_dto.dart +++ b/mobile/openapi/lib/model/session_create_dto.dart @@ -1,148 +1,72 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SessionCreateDto { - /// Returns a new [SessionCreateDto] instance. - SessionCreateDto({ - this.deviceOS, - this.deviceType, - this.duration, +final class SessionCreateDto { + const SessionCreateDto({ + this.deviceOs = const Optional.absent(), + this.deviceType = const Optional.absent(), + this.duration = const Optional.absent(), }); /// Device OS - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? deviceOS; + final Optional deviceOs; /// Device type - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? deviceType; + final Optional deviceType; /// Session duration in seconds - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - int? duration; + final Optional duration; - @override - bool operator ==(Object other) => identical(this, other) || other is SessionCreateDto && - other.deviceOS == deviceOS && - other.deviceType == deviceType && - other.duration == duration; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (deviceOS == null ? 0 : deviceOS!.hashCode) + - (deviceType == null ? 0 : deviceType!.hashCode) + - (duration == null ? 0 : duration!.hashCode); - - @override - String toString() => 'SessionCreateDto[deviceOS=$deviceOS, deviceType=$deviceType, duration=$duration]'; + static SessionCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + deviceOs: json.containsKey(r'deviceOS') ? Optional.present(json[r'deviceOS'] as String) : const Optional.absent(), + deviceType: json.containsKey(r'deviceType') + ? Optional.present(json[r'deviceType'] as String) + : const Optional.absent(), + duration: json.containsKey(r'duration') ? Optional.present(json[r'duration'] as int) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.deviceOS != null) { - json[r'deviceOS'] = this.deviceOS; - } else { - // json[r'deviceOS'] = null; + if (deviceOs case Present(:final value)) { + json[r'deviceOS'] = value; } - if (this.deviceType != null) { - json[r'deviceType'] = this.deviceType; - } else { - // json[r'deviceType'] = null; + if (deviceType case Present(:final value)) { + json[r'deviceType'] = value; } - if (this.duration != null) { - json[r'duration'] = this.duration; - } else { - // json[r'duration'] = null; + if (duration case Present(:final value)) { + json[r'duration'] = value; } return json; } - /// Returns a new [SessionCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SessionCreateDto? fromJson(dynamic value) { - upgradeDto(value, "SessionCreateDto"); - if (value is Map) { - final json = value.cast(); - - return SessionCreateDto( - deviceOS: mapValueOfType(json, r'deviceOS'), - deviceType: mapValueOfType(json, r'deviceType'), - duration: mapValueOfType(json, r'duration'), - ); - } - return null; + SessionCreateDto copyWith({Optional? deviceOs, Optional? deviceType, Optional? duration}) { + return .new( + deviceOs: deviceOs ?? this.deviceOs, + deviceType: deviceType ?? this.deviceType, + duration: duration ?? this.duration, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SessionCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SessionCreateDto && + deviceOs == other.deviceOs && + deviceType == other.deviceType && + duration == other.duration); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SessionCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([deviceOs, deviceType, duration]); } - // maps a json object with a list of SessionCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SessionCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'SessionCreateDto(deviceOs=$deviceOs, deviceType=$deviceType, duration=$duration)'; } - diff --git a/mobile/openapi/lib/model/session_create_response_dto.dart b/mobile/openapi/lib/model/session_create_response_dto.dart index f35232b0e8..737c1ee0ee 100644 --- a/mobile/openapi/lib/model/session_create_response_dto.dart +++ b/mobile/openapi/lib/model/session_create_response_dto.dart @@ -1,22 +1,13 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SessionCreateResponseDto { - /// Returns a new [SessionCreateResponseDto] instance. - SessionCreateResponseDto({ +final class SessionCreateResponseDto { + const SessionCreateResponseDto({ required this.appVersion, required this.createdAt, required this.current, - required this.deviceOS, + required this.deviceOs, required this.deviceType, this.expiresAt, required this.id, @@ -26,169 +17,133 @@ class SessionCreateResponseDto { }); /// App version - String? appVersion; + final String? appVersion; /// Creation date - String createdAt; + final String createdAt; /// Is current session - bool current; + final bool current; /// Device OS - String deviceOS; + final String deviceOs; /// Device type - String deviceType; + final String deviceType; /// Expiration date - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? expiresAt; + final String? expiresAt; /// Session ID - String id; + final String id; /// Is pending sync reset - bool isPendingSyncReset; + final bool isPendingSyncReset; /// Session token - String token; + final String token; /// Last update date - String updatedAt; + final String updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is SessionCreateResponseDto && - other.appVersion == appVersion && - other.createdAt == createdAt && - other.current == current && - other.deviceOS == deviceOS && - other.deviceType == deviceType && - other.expiresAt == expiresAt && - other.id == id && - other.isPendingSyncReset == isPendingSyncReset && - other.token == token && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (appVersion == null ? 0 : appVersion!.hashCode) + - (createdAt.hashCode) + - (current.hashCode) + - (deviceOS.hashCode) + - (deviceType.hashCode) + - (expiresAt == null ? 0 : expiresAt!.hashCode) + - (id.hashCode) + - (isPendingSyncReset.hashCode) + - (token.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'SessionCreateResponseDto[appVersion=$appVersion, createdAt=$createdAt, current=$current, deviceOS=$deviceOS, deviceType=$deviceType, expiresAt=$expiresAt, id=$id, isPendingSyncReset=$isPendingSyncReset, token=$token, updatedAt=$updatedAt]'; + static SessionCreateResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + appVersion: (json[r'appVersion'] as String?), + createdAt: json[r'createdAt'] as String, + current: json[r'current'] as bool, + deviceOs: json[r'deviceOS'] as String, + deviceType: json[r'deviceType'] as String, + expiresAt: (json[r'expiresAt'] as String?), + id: json[r'id'] as String, + isPendingSyncReset: json[r'isPendingSyncReset'] as bool, + token: json[r'token'] as String, + updatedAt: json[r'updatedAt'] as String, + ); + } Map toJson() { final json = {}; - if (this.appVersion != null) { - json[r'appVersion'] = this.appVersion; - } else { - // json[r'appVersion'] = null; + if (appVersion != null) { + json[r'appVersion'] = appVersion!; } - json[r'createdAt'] = this.createdAt; - json[r'current'] = this.current; - json[r'deviceOS'] = this.deviceOS; - json[r'deviceType'] = this.deviceType; - if (this.expiresAt != null) { - json[r'expiresAt'] = this.expiresAt; - } else { - // json[r'expiresAt'] = null; + json[r'createdAt'] = createdAt; + json[r'current'] = current; + json[r'deviceOS'] = deviceOs; + json[r'deviceType'] = deviceType; + if (expiresAt != null) { + json[r'expiresAt'] = expiresAt!; } - json[r'id'] = this.id; - json[r'isPendingSyncReset'] = this.isPendingSyncReset; - json[r'token'] = this.token; - json[r'updatedAt'] = this.updatedAt; + json[r'id'] = id; + json[r'isPendingSyncReset'] = isPendingSyncReset; + json[r'token'] = token; + json[r'updatedAt'] = updatedAt; return json; } - /// Returns a new [SessionCreateResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SessionCreateResponseDto? fromJson(dynamic value) { - upgradeDto(value, "SessionCreateResponseDto"); - if (value is Map) { - final json = value.cast(); - - return SessionCreateResponseDto( - appVersion: mapValueOfType(json, r'appVersion'), - createdAt: mapValueOfType(json, r'createdAt')!, - current: mapValueOfType(json, r'current')!, - deviceOS: mapValueOfType(json, r'deviceOS')!, - deviceType: mapValueOfType(json, r'deviceType')!, - expiresAt: mapValueOfType(json, r'expiresAt'), - id: mapValueOfType(json, r'id')!, - isPendingSyncReset: mapValueOfType(json, r'isPendingSyncReset')!, - token: mapValueOfType(json, r'token')!, - updatedAt: mapValueOfType(json, r'updatedAt')!, - ); - } - return null; + SessionCreateResponseDto copyWith({ + Object? appVersion = _undefined, + String? createdAt, + bool? current, + String? deviceOs, + String? deviceType, + Object? expiresAt = _undefined, + String? id, + bool? isPendingSyncReset, + String? token, + String? updatedAt, + }) { + return .new( + appVersion: identical(appVersion, _undefined) ? this.appVersion : appVersion as String?, + createdAt: createdAt ?? this.createdAt, + current: current ?? this.current, + deviceOs: deviceOs ?? this.deviceOs, + deviceType: deviceType ?? this.deviceType, + expiresAt: identical(expiresAt, _undefined) ? this.expiresAt : expiresAt as String?, + id: id ?? this.id, + isPendingSyncReset: isPendingSyncReset ?? this.isPendingSyncReset, + token: token ?? this.token, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SessionCreateResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SessionCreateResponseDto && + appVersion == other.appVersion && + createdAt == other.createdAt && + current == other.current && + deviceOs == other.deviceOs && + deviceType == other.deviceType && + expiresAt == other.expiresAt && + id == other.id && + isPendingSyncReset == other.isPendingSyncReset && + token == other.token && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SessionCreateResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + appVersion, + createdAt, + current, + deviceOs, + deviceType, + expiresAt, + id, + isPendingSyncReset, + token, + updatedAt, + ]); } - // maps a json object with a list of SessionCreateResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SessionCreateResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'appVersion', - 'createdAt', - 'current', - 'deviceOS', - 'deviceType', - 'id', - 'isPendingSyncReset', - 'token', - 'updatedAt', - }; + @override + String toString() => + 'SessionCreateResponseDto(appVersion=$appVersion, createdAt=$createdAt, current=$current, deviceOs=$deviceOs, deviceType=$deviceType, expiresAt=$expiresAt, id=$id, isPendingSyncReset=$isPendingSyncReset, token=$token, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/session_response_dto.dart b/mobile/openapi/lib/model/session_response_dto.dart index ed84160827..abc7d8cd0a 100644 --- a/mobile/openapi/lib/model/session_response_dto.dart +++ b/mobile/openapi/lib/model/session_response_dto.dart @@ -1,22 +1,13 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SessionResponseDto { - /// Returns a new [SessionResponseDto] instance. - SessionResponseDto({ +final class SessionResponseDto { + const SessionResponseDto({ required this.appVersion, required this.createdAt, required this.current, - required this.deviceOS, + required this.deviceOs, required this.deviceType, this.expiresAt, required this.id, @@ -25,161 +16,124 @@ class SessionResponseDto { }); /// App version - String? appVersion; + final String? appVersion; /// Creation date - String createdAt; + final String createdAt; /// Is current session - bool current; + final bool current; /// Device OS - String deviceOS; + final String deviceOs; /// Device type - String deviceType; + final String deviceType; /// Expiration date - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? expiresAt; + final String? expiresAt; /// Session ID - String id; + final String id; /// Is pending sync reset - bool isPendingSyncReset; + final bool isPendingSyncReset; /// Last update date - String updatedAt; + final String updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is SessionResponseDto && - other.appVersion == appVersion && - other.createdAt == createdAt && - other.current == current && - other.deviceOS == deviceOS && - other.deviceType == deviceType && - other.expiresAt == expiresAt && - other.id == id && - other.isPendingSyncReset == isPendingSyncReset && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (appVersion == null ? 0 : appVersion!.hashCode) + - (createdAt.hashCode) + - (current.hashCode) + - (deviceOS.hashCode) + - (deviceType.hashCode) + - (expiresAt == null ? 0 : expiresAt!.hashCode) + - (id.hashCode) + - (isPendingSyncReset.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'SessionResponseDto[appVersion=$appVersion, createdAt=$createdAt, current=$current, deviceOS=$deviceOS, deviceType=$deviceType, expiresAt=$expiresAt, id=$id, isPendingSyncReset=$isPendingSyncReset, updatedAt=$updatedAt]'; + static SessionResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + appVersion: (json[r'appVersion'] as String?), + createdAt: json[r'createdAt'] as String, + current: json[r'current'] as bool, + deviceOs: json[r'deviceOS'] as String, + deviceType: json[r'deviceType'] as String, + expiresAt: (json[r'expiresAt'] as String?), + id: json[r'id'] as String, + isPendingSyncReset: json[r'isPendingSyncReset'] as bool, + updatedAt: json[r'updatedAt'] as String, + ); + } Map toJson() { final json = {}; - if (this.appVersion != null) { - json[r'appVersion'] = this.appVersion; - } else { - // json[r'appVersion'] = null; + if (appVersion != null) { + json[r'appVersion'] = appVersion!; } - json[r'createdAt'] = this.createdAt; - json[r'current'] = this.current; - json[r'deviceOS'] = this.deviceOS; - json[r'deviceType'] = this.deviceType; - if (this.expiresAt != null) { - json[r'expiresAt'] = this.expiresAt; - } else { - // json[r'expiresAt'] = null; + json[r'createdAt'] = createdAt; + json[r'current'] = current; + json[r'deviceOS'] = deviceOs; + json[r'deviceType'] = deviceType; + if (expiresAt != null) { + json[r'expiresAt'] = expiresAt!; } - json[r'id'] = this.id; - json[r'isPendingSyncReset'] = this.isPendingSyncReset; - json[r'updatedAt'] = this.updatedAt; + json[r'id'] = id; + json[r'isPendingSyncReset'] = isPendingSyncReset; + json[r'updatedAt'] = updatedAt; return json; } - /// Returns a new [SessionResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SessionResponseDto? fromJson(dynamic value) { - upgradeDto(value, "SessionResponseDto"); - if (value is Map) { - final json = value.cast(); - - return SessionResponseDto( - appVersion: mapValueOfType(json, r'appVersion'), - createdAt: mapValueOfType(json, r'createdAt')!, - current: mapValueOfType(json, r'current')!, - deviceOS: mapValueOfType(json, r'deviceOS')!, - deviceType: mapValueOfType(json, r'deviceType')!, - expiresAt: mapValueOfType(json, r'expiresAt'), - id: mapValueOfType(json, r'id')!, - isPendingSyncReset: mapValueOfType(json, r'isPendingSyncReset')!, - updatedAt: mapValueOfType(json, r'updatedAt')!, - ); - } - return null; + SessionResponseDto copyWith({ + Object? appVersion = _undefined, + String? createdAt, + bool? current, + String? deviceOs, + String? deviceType, + Object? expiresAt = _undefined, + String? id, + bool? isPendingSyncReset, + String? updatedAt, + }) { + return .new( + appVersion: identical(appVersion, _undefined) ? this.appVersion : appVersion as String?, + createdAt: createdAt ?? this.createdAt, + current: current ?? this.current, + deviceOs: deviceOs ?? this.deviceOs, + deviceType: deviceType ?? this.deviceType, + expiresAt: identical(expiresAt, _undefined) ? this.expiresAt : expiresAt as String?, + id: id ?? this.id, + isPendingSyncReset: isPendingSyncReset ?? this.isPendingSyncReset, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SessionResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SessionResponseDto && + appVersion == other.appVersion && + createdAt == other.createdAt && + current == other.current && + deviceOs == other.deviceOs && + deviceType == other.deviceType && + expiresAt == other.expiresAt && + id == other.id && + isPendingSyncReset == other.isPendingSyncReset && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SessionResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + appVersion, + createdAt, + current, + deviceOs, + deviceType, + expiresAt, + id, + isPendingSyncReset, + updatedAt, + ]); } - // maps a json object with a list of SessionResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SessionResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'appVersion', - 'createdAt', - 'current', - 'deviceOS', - 'deviceType', - 'id', - 'isPendingSyncReset', - 'updatedAt', - }; + @override + String toString() => + 'SessionResponseDto(appVersion=$appVersion, createdAt=$createdAt, current=$current, deviceOs=$deviceOs, deviceType=$deviceType, expiresAt=$expiresAt, id=$id, isPendingSyncReset=$isPendingSyncReset, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/session_unlock_dto.dart b/mobile/openapi/lib/model/session_unlock_dto.dart index 48ee75fb05..8a46ec2e32 100644 --- a/mobile/openapi/lib/model/session_unlock_dto.dart +++ b/mobile/openapi/lib/model/session_unlock_dto.dart @@ -1,127 +1,52 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SessionUnlockDto { - /// Returns a new [SessionUnlockDto] instance. - SessionUnlockDto({ - this.password, - this.pinCode, - }); +final class SessionUnlockDto { + const SessionUnlockDto({this.password = const Optional.absent(), this.pinCode = const Optional.absent()}); /// User password (required if PIN code is not provided) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? password; + final Optional password; /// New PIN code (4-6 digits) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? pinCode; + final Optional pinCode; - @override - bool operator ==(Object other) => identical(this, other) || other is SessionUnlockDto && - other.password == password && - other.pinCode == pinCode; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (password == null ? 0 : password!.hashCode) + - (pinCode == null ? 0 : pinCode!.hashCode); - - @override - String toString() => 'SessionUnlockDto[password=$password, pinCode=$pinCode]'; + static SessionUnlockDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + password: json.containsKey(r'password') ? Optional.present(json[r'password'] as String) : const Optional.absent(), + pinCode: json.containsKey(r'pinCode') ? Optional.present(json[r'pinCode'] as String) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.password != null) { - json[r'password'] = this.password; - } else { - // json[r'password'] = null; + if (password case Present(:final value)) { + json[r'password'] = value; } - if (this.pinCode != null) { - json[r'pinCode'] = this.pinCode; - } else { - // json[r'pinCode'] = null; + if (pinCode case Present(:final value)) { + json[r'pinCode'] = value; } return json; } - /// Returns a new [SessionUnlockDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SessionUnlockDto? fromJson(dynamic value) { - upgradeDto(value, "SessionUnlockDto"); - if (value is Map) { - final json = value.cast(); - - return SessionUnlockDto( - password: mapValueOfType(json, r'password'), - pinCode: mapValueOfType(json, r'pinCode'), - ); - } - return null; + SessionUnlockDto copyWith({Optional? password, Optional? pinCode}) { + return .new(password: password ?? this.password, pinCode: pinCode ?? this.pinCode); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SessionUnlockDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SessionUnlockDto && password == other.password && pinCode == other.pinCode); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SessionUnlockDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([password, pinCode]); } - // maps a json object with a list of SessionUnlockDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SessionUnlockDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'SessionUnlockDto(password=$password, pinCode=$pinCode)'; } - diff --git a/mobile/openapi/lib/model/session_update_dto.dart b/mobile/openapi/lib/model/session_update_dto.dart index 3ab430deaa..43c0686d91 100644 --- a/mobile/openapi/lib/model/session_update_dto.dart +++ b/mobile/openapi/lib/model/session_update_dto.dart @@ -1,109 +1,46 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SessionUpdateDto { - /// Returns a new [SessionUpdateDto] instance. - SessionUpdateDto({ - this.isPendingSyncReset, - }); +final class SessionUpdateDto { + const SessionUpdateDto({this.isPendingSyncReset = const Optional.absent()}); /// Reset pending sync state - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isPendingSyncReset; + final Optional isPendingSyncReset; - @override - bool operator ==(Object other) => identical(this, other) || other is SessionUpdateDto && - other.isPendingSyncReset == isPendingSyncReset; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (isPendingSyncReset == null ? 0 : isPendingSyncReset!.hashCode); - - @override - String toString() => 'SessionUpdateDto[isPendingSyncReset=$isPendingSyncReset]'; + static SessionUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + isPendingSyncReset: json.containsKey(r'isPendingSyncReset') + ? Optional.present(json[r'isPendingSyncReset'] as bool) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.isPendingSyncReset != null) { - json[r'isPendingSyncReset'] = this.isPendingSyncReset; - } else { - // json[r'isPendingSyncReset'] = null; + if (isPendingSyncReset case Present(:final value)) { + json[r'isPendingSyncReset'] = value; } return json; } - /// Returns a new [SessionUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SessionUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "SessionUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return SessionUpdateDto( - isPendingSyncReset: mapValueOfType(json, r'isPendingSyncReset'), - ); - } - return null; + SessionUpdateDto copyWith({Optional? isPendingSyncReset}) { + return .new(isPendingSyncReset: isPendingSyncReset ?? this.isPendingSyncReset); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SessionUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SessionUpdateDto && isPendingSyncReset == other.isPendingSyncReset); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SessionUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([isPendingSyncReset]); } - // maps a json object with a list of SessionUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SessionUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'SessionUpdateDto(isPendingSyncReset=$isPendingSyncReset)'; } - diff --git a/mobile/openapi/lib/model/set_maintenance_mode_dto.dart b/mobile/openapi/lib/model/set_maintenance_mode_dto.dart index e7c9dc0d63..67b6a4a620 100644 --- a/mobile/openapi/lib/model/set_maintenance_mode_dto.dart +++ b/mobile/openapi/lib/model/set_maintenance_mode_dto.dart @@ -1,117 +1,56 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SetMaintenanceModeDto { - /// Returns a new [SetMaintenanceModeDto] instance. - SetMaintenanceModeDto({ - required this.action, - this.restoreBackupFilename, - }); +final class SetMaintenanceModeDto { + const SetMaintenanceModeDto({required this.action, this.restoreBackupFilename = const Optional.absent()}); - MaintenanceAction action; + final MaintenanceAction action; /// Restore backup filename - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? restoreBackupFilename; + final Optional restoreBackupFilename; - @override - bool operator ==(Object other) => identical(this, other) || other is SetMaintenanceModeDto && - other.action == action && - other.restoreBackupFilename == restoreBackupFilename; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (action.hashCode) + - (restoreBackupFilename == null ? 0 : restoreBackupFilename!.hashCode); - - @override - String toString() => 'SetMaintenanceModeDto[action=$action, restoreBackupFilename=$restoreBackupFilename]'; + static SetMaintenanceModeDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + action: (MaintenanceAction.fromJson(json[r'action']))!, + restoreBackupFilename: json.containsKey(r'restoreBackupFilename') + ? Optional.present(json[r'restoreBackupFilename'] as String) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'action'] = this.action; - if (this.restoreBackupFilename != null) { - json[r'restoreBackupFilename'] = this.restoreBackupFilename; - } else { - // json[r'restoreBackupFilename'] = null; + json[r'action'] = action.toJson(); + if (restoreBackupFilename case Present(:final value)) { + json[r'restoreBackupFilename'] = value; } return json; } - /// Returns a new [SetMaintenanceModeDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SetMaintenanceModeDto? fromJson(dynamic value) { - upgradeDto(value, "SetMaintenanceModeDto"); - if (value is Map) { - final json = value.cast(); - - return SetMaintenanceModeDto( - action: MaintenanceAction.fromJson(json[r'action'])!, - restoreBackupFilename: mapValueOfType(json, r'restoreBackupFilename'), - ); - } - return null; + SetMaintenanceModeDto copyWith({MaintenanceAction? action, Optional? restoreBackupFilename}) { + return .new( + action: action ?? this.action, + restoreBackupFilename: restoreBackupFilename ?? this.restoreBackupFilename, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SetMaintenanceModeDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SetMaintenanceModeDto && + action == other.action && + restoreBackupFilename == other.restoreBackupFilename); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SetMaintenanceModeDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([action, restoreBackupFilename]); } - // maps a json object with a list of SetMaintenanceModeDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SetMaintenanceModeDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'action', - }; + @override + String toString() => 'SetMaintenanceModeDto(action=$action, restoreBackupFilename=$restoreBackupFilename)'; } - diff --git a/mobile/openapi/lib/model/shared_link_create_dto.dart b/mobile/openapi/lib/model/shared_link_create_dto.dart index a32714d556..29e3fba80b 100644 --- a/mobile/openapi/lib/model/shared_link_create_dto.dart +++ b/mobile/openapi/lib/model/shared_link_create_dto.dart @@ -1,211 +1,174 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SharedLinkCreateDto { - /// Returns a new [SharedLinkCreateDto] instance. - SharedLinkCreateDto({ - this.albumId, - this.allowDownload = true, - this.allowUpload, - this.assetIds = const [], - this.description, - this.expiresAt, - this.password, - this.showMetadata = true, - this.slug, +final class SharedLinkCreateDto { + const SharedLinkCreateDto({ + this.albumId = const Optional.absent(), + this.allowDownload = const Optional.absent(), + this.allowUpload = const Optional.absent(), + this.assetIds = const Optional.absent(), + this.description = const Optional.absent(), + this.expiresAt = const Optional.absent(), + this.password = const Optional.absent(), + this.showMetadata = const Optional.absent(), + this.slug = const Optional.absent(), required this.type, }); /// Album ID (for album sharing) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? albumId; + final Optional albumId; /// Allow downloads - bool allowDownload; + final Optional allowDownload; /// Allow uploads - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? allowUpload; + final Optional allowUpload; /// Asset IDs (for individual assets) - List assetIds; + final Optional> assetIds; /// Link description - String? description; + final Optional description; /// Expiration date - DateTime? expiresAt; + final Optional expiresAt; /// Link password - String? password; + final Optional password; /// Show metadata - bool showMetadata; + final Optional showMetadata; /// Custom URL slug - String? slug; + final Optional slug; - SharedLinkType type; + final SharedLinkType type; - @override - bool operator ==(Object other) => identical(this, other) || other is SharedLinkCreateDto && - other.albumId == albumId && - other.allowDownload == allowDownload && - other.allowUpload == allowUpload && - _deepEquality.equals(other.assetIds, assetIds) && - other.description == description && - other.expiresAt == expiresAt && - other.password == password && - other.showMetadata == showMetadata && - other.slug == slug && - other.type == type; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumId == null ? 0 : albumId!.hashCode) + - (allowDownload.hashCode) + - (allowUpload == null ? 0 : allowUpload!.hashCode) + - (assetIds.hashCode) + - (description == null ? 0 : description!.hashCode) + - (expiresAt == null ? 0 : expiresAt!.hashCode) + - (password == null ? 0 : password!.hashCode) + - (showMetadata.hashCode) + - (slug == null ? 0 : slug!.hashCode) + - (type.hashCode); - - @override - String toString() => 'SharedLinkCreateDto[albumId=$albumId, allowDownload=$allowDownload, allowUpload=$allowUpload, assetIds=$assetIds, description=$description, expiresAt=$expiresAt, password=$password, showMetadata=$showMetadata, slug=$slug, type=$type]'; + static SharedLinkCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumId: json.containsKey(r'albumId') ? Optional.present(json[r'albumId'] as String) : const Optional.absent(), + allowDownload: json.containsKey(r'allowDownload') + ? Optional.present(json[r'allowDownload'] as bool) + : const Optional.absent(), + allowUpload: json.containsKey(r'allowUpload') + ? Optional.present(json[r'allowUpload'] as bool) + : const Optional.absent(), + assetIds: json.containsKey(r'assetIds') + ? Optional.present(((json[r'assetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + description: json.containsKey(r'description') + ? Optional.present((json[r'description'] as String?)) + : const Optional.absent(), + expiresAt: json.containsKey(r'expiresAt') + ? Optional.present((json[r'expiresAt'] == null ? null : DateTime.parse(json[r'expiresAt'] as String))) + : const Optional.absent(), + password: json.containsKey(r'password') + ? Optional.present((json[r'password'] as String?)) + : const Optional.absent(), + showMetadata: json.containsKey(r'showMetadata') + ? Optional.present(json[r'showMetadata'] as bool) + : const Optional.absent(), + slug: json.containsKey(r'slug') ? Optional.present((json[r'slug'] as String?)) : const Optional.absent(), + type: (SharedLinkType.fromJson(json[r'type']))!, + ); + } Map toJson() { final json = {}; - if (this.albumId != null) { - json[r'albumId'] = this.albumId; - } else { - // json[r'albumId'] = null; + if (albumId case Present(:final value)) { + json[r'albumId'] = value; } - json[r'allowDownload'] = this.allowDownload; - if (this.allowUpload != null) { - json[r'allowUpload'] = this.allowUpload; - } else { - // json[r'allowUpload'] = null; + if (allowDownload case Present(:final value)) { + json[r'allowDownload'] = value; } - json[r'assetIds'] = this.assetIds; - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (allowUpload case Present(:final value)) { + json[r'allowUpload'] = value; } - if (this.expiresAt != null) { - json[r'expiresAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.expiresAt!.millisecondsSinceEpoch - : this.expiresAt!.toUtc().toIso8601String(); - } else { - // json[r'expiresAt'] = null; + if (assetIds case Present(:final value)) { + json[r'assetIds'] = value; } - if (this.password != null) { - json[r'password'] = this.password; - } else { - // json[r'password'] = null; + if (description case Present(:final value)) { + json[r'description'] = value; } - json[r'showMetadata'] = this.showMetadata; - if (this.slug != null) { - json[r'slug'] = this.slug; - } else { - // json[r'slug'] = null; + if (expiresAt case Present(:final value)) { + json[r'expiresAt'] = value?.toUtc().toIso8601String(); } - json[r'type'] = this.type; + if (password case Present(:final value)) { + json[r'password'] = value; + } + if (showMetadata case Present(:final value)) { + json[r'showMetadata'] = value; + } + if (slug case Present(:final value)) { + json[r'slug'] = value; + } + json[r'type'] = type.toJson(); return json; } - /// Returns a new [SharedLinkCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SharedLinkCreateDto? fromJson(dynamic value) { - upgradeDto(value, "SharedLinkCreateDto"); - if (value is Map) { - final json = value.cast(); - - return SharedLinkCreateDto( - albumId: mapValueOfType(json, r'albumId'), - allowDownload: mapValueOfType(json, r'allowDownload') ?? true, - allowUpload: mapValueOfType(json, r'allowUpload'), - assetIds: json[r'assetIds'] is Iterable - ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) - : const [], - description: mapValueOfType(json, r'description'), - expiresAt: mapDateTime(json, r'expiresAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - password: mapValueOfType(json, r'password'), - showMetadata: mapValueOfType(json, r'showMetadata') ?? true, - slug: mapValueOfType(json, r'slug'), - type: SharedLinkType.fromJson(json[r'type'])!, - ); - } - return null; + SharedLinkCreateDto copyWith({ + Optional? albumId, + Optional? allowDownload, + Optional? allowUpload, + Optional>? assetIds, + Optional? description, + Optional? expiresAt, + Optional? password, + Optional? showMetadata, + Optional? slug, + SharedLinkType? type, + }) { + return .new( + albumId: albumId ?? this.albumId, + allowDownload: allowDownload ?? this.allowDownload, + allowUpload: allowUpload ?? this.allowUpload, + assetIds: assetIds ?? this.assetIds, + description: description ?? this.description, + expiresAt: expiresAt ?? this.expiresAt, + password: password ?? this.password, + showMetadata: showMetadata ?? this.showMetadata, + slug: slug ?? this.slug, + type: type ?? this.type, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SharedLinkCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SharedLinkCreateDto && + albumId == other.albumId && + allowDownload == other.allowDownload && + allowUpload == other.allowUpload && + assetIds == other.assetIds && + description == other.description && + expiresAt == other.expiresAt && + password == other.password && + showMetadata == other.showMetadata && + slug == other.slug && + type == other.type); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SharedLinkCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + albumId, + allowDownload, + allowUpload, + assetIds, + description, + expiresAt, + password, + showMetadata, + slug, + type, + ]); } - // maps a json object with a list of SharedLinkCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SharedLinkCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'type', - }; + @override + String toString() => + 'SharedLinkCreateDto(albumId=$albumId, allowDownload=$allowDownload, allowUpload=$allowUpload, assetIds=$assetIds, description=$description, expiresAt=$expiresAt, password=$password, showMetadata=$showMetadata, slug=$slug, type=$type)'; } - diff --git a/mobile/openapi/lib/model/shared_link_edit_dto.dart b/mobile/openapi/lib/model/shared_link_edit_dto.dart index 11d6cdd52e..26d452d606 100644 --- a/mobile/openapi/lib/model/shared_link_edit_dto.dart +++ b/mobile/openapi/lib/model/shared_link_edit_dto.dart @@ -1,213 +1,153 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SharedLinkEditDto { - /// Returns a new [SharedLinkEditDto] instance. - SharedLinkEditDto({ - this.allowDownload, - this.allowUpload, - this.changeExpiryTime, - this.description, - this.expiresAt, - this.password, - this.showMetadata, - this.slug, +final class SharedLinkEditDto { + const SharedLinkEditDto({ + this.allowDownload = const Optional.absent(), + this.allowUpload = const Optional.absent(), + this.changeExpiryTime = const Optional.absent(), + this.description = const Optional.absent(), + this.expiresAt = const Optional.absent(), + this.password = const Optional.absent(), + this.showMetadata = const Optional.absent(), + this.slug = const Optional.absent(), }); /// Allow downloads - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? allowDownload; + final Optional allowDownload; /// Allow uploads - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? allowUpload; + final Optional allowUpload; /// Whether to change the expiry time. Few clients cannot send null to set the expiryTime to never. Setting this flag and not sending expiryAt is considered as null instead. Clients that can send null values can ignore this. - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? changeExpiryTime; + final Optional changeExpiryTime; /// Link description - String? description; + final Optional description; /// Expiration date - DateTime? expiresAt; + final Optional expiresAt; /// Link password - String? password; + final Optional password; /// Show metadata - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? showMetadata; + final Optional showMetadata; /// Custom URL slug - String? slug; + final Optional slug; - @override - bool operator ==(Object other) => identical(this, other) || other is SharedLinkEditDto && - other.allowDownload == allowDownload && - other.allowUpload == allowUpload && - other.changeExpiryTime == changeExpiryTime && - other.description == description && - other.expiresAt == expiresAt && - other.password == password && - other.showMetadata == showMetadata && - other.slug == slug; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (allowDownload == null ? 0 : allowDownload!.hashCode) + - (allowUpload == null ? 0 : allowUpload!.hashCode) + - (changeExpiryTime == null ? 0 : changeExpiryTime!.hashCode) + - (description == null ? 0 : description!.hashCode) + - (expiresAt == null ? 0 : expiresAt!.hashCode) + - (password == null ? 0 : password!.hashCode) + - (showMetadata == null ? 0 : showMetadata!.hashCode) + - (slug == null ? 0 : slug!.hashCode); - - @override - String toString() => 'SharedLinkEditDto[allowDownload=$allowDownload, allowUpload=$allowUpload, changeExpiryTime=$changeExpiryTime, description=$description, expiresAt=$expiresAt, password=$password, showMetadata=$showMetadata, slug=$slug]'; + static SharedLinkEditDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + allowDownload: json.containsKey(r'allowDownload') + ? Optional.present(json[r'allowDownload'] as bool) + : const Optional.absent(), + allowUpload: json.containsKey(r'allowUpload') + ? Optional.present(json[r'allowUpload'] as bool) + : const Optional.absent(), + changeExpiryTime: json.containsKey(r'changeExpiryTime') + ? Optional.present(json[r'changeExpiryTime'] as bool) + : const Optional.absent(), + description: json.containsKey(r'description') + ? Optional.present((json[r'description'] as String?)) + : const Optional.absent(), + expiresAt: json.containsKey(r'expiresAt') + ? Optional.present((json[r'expiresAt'] == null ? null : DateTime.parse(json[r'expiresAt'] as String))) + : const Optional.absent(), + password: json.containsKey(r'password') + ? Optional.present((json[r'password'] as String?)) + : const Optional.absent(), + showMetadata: json.containsKey(r'showMetadata') + ? Optional.present(json[r'showMetadata'] as bool) + : const Optional.absent(), + slug: json.containsKey(r'slug') ? Optional.present((json[r'slug'] as String?)) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.allowDownload != null) { - json[r'allowDownload'] = this.allowDownload; - } else { - // json[r'allowDownload'] = null; + if (allowDownload case Present(:final value)) { + json[r'allowDownload'] = value; } - if (this.allowUpload != null) { - json[r'allowUpload'] = this.allowUpload; - } else { - // json[r'allowUpload'] = null; + if (allowUpload case Present(:final value)) { + json[r'allowUpload'] = value; } - if (this.changeExpiryTime != null) { - json[r'changeExpiryTime'] = this.changeExpiryTime; - } else { - // json[r'changeExpiryTime'] = null; + if (changeExpiryTime case Present(:final value)) { + json[r'changeExpiryTime'] = value; } - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (description case Present(:final value)) { + json[r'description'] = value; } - if (this.expiresAt != null) { - json[r'expiresAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.expiresAt!.millisecondsSinceEpoch - : this.expiresAt!.toUtc().toIso8601String(); - } else { - // json[r'expiresAt'] = null; + if (expiresAt case Present(:final value)) { + json[r'expiresAt'] = value?.toUtc().toIso8601String(); } - if (this.password != null) { - json[r'password'] = this.password; - } else { - // json[r'password'] = null; + if (password case Present(:final value)) { + json[r'password'] = value; } - if (this.showMetadata != null) { - json[r'showMetadata'] = this.showMetadata; - } else { - // json[r'showMetadata'] = null; + if (showMetadata case Present(:final value)) { + json[r'showMetadata'] = value; } - if (this.slug != null) { - json[r'slug'] = this.slug; - } else { - // json[r'slug'] = null; + if (slug case Present(:final value)) { + json[r'slug'] = value; } return json; } - /// Returns a new [SharedLinkEditDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SharedLinkEditDto? fromJson(dynamic value) { - upgradeDto(value, "SharedLinkEditDto"); - if (value is Map) { - final json = value.cast(); - - return SharedLinkEditDto( - allowDownload: mapValueOfType(json, r'allowDownload'), - allowUpload: mapValueOfType(json, r'allowUpload'), - changeExpiryTime: mapValueOfType(json, r'changeExpiryTime'), - description: mapValueOfType(json, r'description'), - expiresAt: mapDateTime(json, r'expiresAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - password: mapValueOfType(json, r'password'), - showMetadata: mapValueOfType(json, r'showMetadata'), - slug: mapValueOfType(json, r'slug'), - ); - } - return null; + SharedLinkEditDto copyWith({ + Optional? allowDownload, + Optional? allowUpload, + Optional? changeExpiryTime, + Optional? description, + Optional? expiresAt, + Optional? password, + Optional? showMetadata, + Optional? slug, + }) { + return .new( + allowDownload: allowDownload ?? this.allowDownload, + allowUpload: allowUpload ?? this.allowUpload, + changeExpiryTime: changeExpiryTime ?? this.changeExpiryTime, + description: description ?? this.description, + expiresAt: expiresAt ?? this.expiresAt, + password: password ?? this.password, + showMetadata: showMetadata ?? this.showMetadata, + slug: slug ?? this.slug, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SharedLinkEditDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SharedLinkEditDto && + allowDownload == other.allowDownload && + allowUpload == other.allowUpload && + changeExpiryTime == other.changeExpiryTime && + description == other.description && + expiresAt == other.expiresAt && + password == other.password && + showMetadata == other.showMetadata && + slug == other.slug); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SharedLinkEditDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + allowDownload, + allowUpload, + changeExpiryTime, + description, + expiresAt, + password, + showMetadata, + slug, + ]); } - // maps a json object with a list of SharedLinkEditDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SharedLinkEditDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'SharedLinkEditDto(allowDownload=$allowDownload, allowUpload=$allowUpload, changeExpiryTime=$changeExpiryTime, description=$description, expiresAt=$expiresAt, password=$password, showMetadata=$showMetadata, slug=$slug)'; } - diff --git a/mobile/openapi/lib/model/shared_link_login_dto.dart b/mobile/openapi/lib/model/shared_link_login_dto.dart index 1ab1bc9349..56c32bf941 100644 --- a/mobile/openapi/lib/model/shared_link_login_dto.dart +++ b/mobile/openapi/lib/model/shared_link_login_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SharedLinkLoginDto { - /// Returns a new [SharedLinkLoginDto] instance. - SharedLinkLoginDto({ - required this.password, - }); +final class SharedLinkLoginDto { + const SharedLinkLoginDto({required this.password}); /// Shared link password - String password; + final String password; - @override - bool operator ==(Object other) => identical(this, other) || other is SharedLinkLoginDto && - other.password == password; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (password.hashCode); - - @override - String toString() => 'SharedLinkLoginDto[password=$password]'; + static SharedLinkLoginDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(password: json[r'password'] as String); + } Map toJson() { final json = {}; - json[r'password'] = this.password; + json[r'password'] = password; return json; } - /// Returns a new [SharedLinkLoginDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SharedLinkLoginDto? fromJson(dynamic value) { - upgradeDto(value, "SharedLinkLoginDto"); - if (value is Map) { - final json = value.cast(); - - return SharedLinkLoginDto( - password: mapValueOfType(json, r'password')!, - ); - } - return null; + SharedLinkLoginDto copyWith({String? password}) { + return .new(password: password ?? this.password); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SharedLinkLoginDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SharedLinkLoginDto && password == other.password); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SharedLinkLoginDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([password]); } - // maps a json object with a list of SharedLinkLoginDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SharedLinkLoginDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'password', - }; + @override + String toString() => 'SharedLinkLoginDto(password=$password)'; } - diff --git a/mobile/openapi/lib/model/shared_link_response_dto.dart b/mobile/openapi/lib/model/shared_link_response_dto.dart index bad0966ca2..5b1b81c622 100644 --- a/mobile/openapi/lib/model/shared_link_response_dto.dart +++ b/mobile/openapi/lib/model/shared_link_response_dto.dart @@ -1,22 +1,14 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SharedLinkResponseDto { - /// Returns a new [SharedLinkResponseDto] instance. - SharedLinkResponseDto({ +/// Shared link response +final class SharedLinkResponseDto { + const SharedLinkResponseDto({ this.album, required this.allowDownload, required this.allowUpload, - this.assets = const [], + required this.assets, required this.createdAt, required this.description, required this.expiresAt, @@ -29,215 +21,173 @@ class SharedLinkResponseDto { required this.userId, }); - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AlbumResponseDto? album; + final AlbumResponseDto? album; /// Allow downloads - bool allowDownload; + final bool allowDownload; /// Allow uploads - bool allowUpload; + final bool allowUpload; - List assets; + final List assets; /// Creation date - DateTime createdAt; + final DateTime createdAt; /// Link description - String? description; + final String? description; /// Expiration date - DateTime? expiresAt; + final DateTime? expiresAt; /// Shared link ID - String id; + final String id; /// Encryption key (base64url) - String key; + final String key; /// Has password - String? password; + final String? password; /// Show metadata - bool showMetadata; + final bool showMetadata; /// Custom URL slug - String? slug; + final String? slug; - SharedLinkType type; + final SharedLinkType type; /// Owner user ID - String userId; + final String userId; - @override - bool operator ==(Object other) => identical(this, other) || other is SharedLinkResponseDto && - other.album == album && - other.allowDownload == allowDownload && - other.allowUpload == allowUpload && - _deepEquality.equals(other.assets, assets) && - other.createdAt == createdAt && - other.description == description && - other.expiresAt == expiresAt && - other.id == id && - other.key == key && - other.password == password && - other.showMetadata == showMetadata && - other.slug == slug && - other.type == type && - other.userId == userId; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (album == null ? 0 : album!.hashCode) + - (allowDownload.hashCode) + - (allowUpload.hashCode) + - (assets.hashCode) + - (createdAt.hashCode) + - (description == null ? 0 : description!.hashCode) + - (expiresAt == null ? 0 : expiresAt!.hashCode) + - (id.hashCode) + - (key.hashCode) + - (password == null ? 0 : password!.hashCode) + - (showMetadata.hashCode) + - (slug == null ? 0 : slug!.hashCode) + - (type.hashCode) + - (userId.hashCode); - - @override - String toString() => 'SharedLinkResponseDto[album=$album, allowDownload=$allowDownload, allowUpload=$allowUpload, assets=$assets, createdAt=$createdAt, description=$description, expiresAt=$expiresAt, id=$id, key=$key, password=$password, showMetadata=$showMetadata, slug=$slug, type=$type, userId=$userId]'; + static SharedLinkResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + album: AlbumResponseDto.fromJson(json[r'album']), + allowDownload: json[r'allowDownload'] as bool, + allowUpload: json[r'allowUpload'] as bool, + assets: ((json[r'assets'] as List?)?.map(($e) => (AssetResponseDto.fromJson($e))!).toList(growable: false))!, + createdAt: DateTime.parse(json[r'createdAt'] as String), + description: (json[r'description'] as String?), + expiresAt: (json[r'expiresAt'] == null ? null : DateTime.parse(json[r'expiresAt'] as String)), + id: json[r'id'] as String, + key: json[r'key'] as String, + password: (json[r'password'] as String?), + showMetadata: json[r'showMetadata'] as bool, + slug: (json[r'slug'] as String?), + type: (SharedLinkType.fromJson(json[r'type']))!, + userId: json[r'userId'] as String, + ); + } Map toJson() { final json = {}; - if (this.album != null) { - json[r'album'] = this.album; - } else { - // json[r'album'] = null; + if (album != null) { + json[r'album'] = album!.toJson(); } - json[r'allowDownload'] = this.allowDownload; - json[r'allowUpload'] = this.allowUpload; - json[r'assets'] = this.assets; - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + json[r'allowDownload'] = allowDownload; + json[r'allowUpload'] = allowUpload; + json[r'assets'] = assets.map(($e) => $e.toJson()).toList(growable: false); + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + if (description != null) { + json[r'description'] = description!; } - if (this.expiresAt != null) { - json[r'expiresAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.expiresAt!.millisecondsSinceEpoch - : this.expiresAt!.toUtc().toIso8601String(); - } else { - // json[r'expiresAt'] = null; + if (expiresAt != null) { + json[r'expiresAt'] = expiresAt!.toUtc().toIso8601String(); } - json[r'id'] = this.id; - json[r'key'] = this.key; - if (this.password != null) { - json[r'password'] = this.password; - } else { - // json[r'password'] = null; + json[r'id'] = id; + json[r'key'] = key; + if (password != null) { + json[r'password'] = password!; } - json[r'showMetadata'] = this.showMetadata; - if (this.slug != null) { - json[r'slug'] = this.slug; - } else { - // json[r'slug'] = null; + json[r'showMetadata'] = showMetadata; + if (slug != null) { + json[r'slug'] = slug!; } - json[r'type'] = this.type; - json[r'userId'] = this.userId; + json[r'type'] = type.toJson(); + json[r'userId'] = userId; return json; } - /// Returns a new [SharedLinkResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SharedLinkResponseDto? fromJson(dynamic value) { - upgradeDto(value, "SharedLinkResponseDto"); - if (value is Map) { - final json = value.cast(); - - return SharedLinkResponseDto( - album: AlbumResponseDto.fromJson(json[r'album']), - allowDownload: mapValueOfType(json, r'allowDownload')!, - allowUpload: mapValueOfType(json, r'allowUpload')!, - assets: AssetResponseDto.listFromJson(json[r'assets']), - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - description: mapValueOfType(json, r'description'), - expiresAt: mapDateTime(json, r'expiresAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - id: mapValueOfType(json, r'id')!, - key: mapValueOfType(json, r'key')!, - password: mapValueOfType(json, r'password'), - showMetadata: mapValueOfType(json, r'showMetadata')!, - slug: mapValueOfType(json, r'slug'), - type: SharedLinkType.fromJson(json[r'type'])!, - userId: mapValueOfType(json, r'userId')!, - ); - } - return null; + SharedLinkResponseDto copyWith({ + Object? album = _undefined, + bool? allowDownload, + bool? allowUpload, + List? assets, + DateTime? createdAt, + Object? description = _undefined, + Object? expiresAt = _undefined, + String? id, + String? key, + Object? password = _undefined, + bool? showMetadata, + Object? slug = _undefined, + SharedLinkType? type, + String? userId, + }) { + return .new( + album: identical(album, _undefined) ? this.album : album as AlbumResponseDto?, + allowDownload: allowDownload ?? this.allowDownload, + allowUpload: allowUpload ?? this.allowUpload, + assets: assets ?? this.assets, + createdAt: createdAt ?? this.createdAt, + description: identical(description, _undefined) ? this.description : description as String?, + expiresAt: identical(expiresAt, _undefined) ? this.expiresAt : expiresAt as DateTime?, + id: id ?? this.id, + key: key ?? this.key, + password: identical(password, _undefined) ? this.password : password as String?, + showMetadata: showMetadata ?? this.showMetadata, + slug: identical(slug, _undefined) ? this.slug : slug as String?, + type: type ?? this.type, + userId: userId ?? this.userId, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SharedLinkResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SharedLinkResponseDto && + album == other.album && + allowDownload == other.allowDownload && + allowUpload == other.allowUpload && + const DeepCollectionEquality().equals(assets, other.assets) && + createdAt == other.createdAt && + description == other.description && + expiresAt == other.expiresAt && + id == other.id && + key == other.key && + password == other.password && + showMetadata == other.showMetadata && + slug == other.slug && + type == other.type && + userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SharedLinkResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + album, + allowDownload, + allowUpload, + const DeepCollectionEquality().hash(assets), + createdAt, + description, + expiresAt, + id, + key, + password, + showMetadata, + slug, + type, + userId, + ]); } - // maps a json object with a list of SharedLinkResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SharedLinkResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'allowDownload', - 'allowUpload', - 'assets', - 'createdAt', - 'description', - 'expiresAt', - 'id', - 'key', - 'password', - 'showMetadata', - 'slug', - 'type', - 'userId', - }; + @override + String toString() => + 'SharedLinkResponseDto(album=$album, allowDownload=$allowDownload, allowUpload=$allowUpload, assets=$assets, createdAt=$createdAt, description=$description, expiresAt=$expiresAt, id=$id, key=$key, password=$password, showMetadata=$showMetadata, slug=$slug, type=$type, userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/shared_link_type.dart b/mobile/openapi/lib/model/shared_link_type.dart index 6a17a9c763..7d0d577732 100644 --- a/mobile/openapi/lib/model/shared_link_type.dart +++ b/mobile/openapi/lib/model/shared_link_type.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Shared link type -class SharedLinkType { - /// Instantiate a new enum with the provided [value]. +enum SharedLinkType { + album._(r'ALBUM'), + individual._(r'INDIVIDUAL'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const SharedLinkType._(this.value); - /// The underlying value of this enum member. final String value; + static SharedLinkType? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const ALBUM = SharedLinkType._(r'ALBUM'); - static const INDIVIDUAL = SharedLinkType._(r'INDIVIDUAL'); - - /// List of all possible values in this [enum][SharedLinkType]. - static const values = [ - ALBUM, - INDIVIDUAL, - ]; - - static SharedLinkType? fromJson(dynamic value) => SharedLinkTypeTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SharedLinkType.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [SharedLinkType] to String, -/// and [decode] dynamic data back to [SharedLinkType]. -class SharedLinkTypeTypeTransformer { - factory SharedLinkTypeTypeTransformer() => _instance ??= const SharedLinkTypeTypeTransformer._(); - - const SharedLinkTypeTypeTransformer._(); - - String encode(SharedLinkType data) => data.value; - - /// Decodes a [dynamic value][data] to a SharedLinkType. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - SharedLinkType? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'ALBUM': return SharedLinkType.ALBUM; - case r'INDIVIDUAL': return SharedLinkType.INDIVIDUAL; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [SharedLinkTypeTypeTransformer] instance. - static SharedLinkTypeTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/shared_links_response.dart b/mobile/openapi/lib/model/shared_links_response.dart index 2b32a57540..fb63fc2a5e 100644 --- a/mobile/openapi/lib/model/shared_links_response.dart +++ b/mobile/openapi/lib/model/shared_links_response.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SharedLinksResponse { - /// Returns a new [SharedLinksResponse] instance. - SharedLinksResponse({ - required this.enabled, - required this.sidebarWeb, - }); +final class SharedLinksResponse { + const SharedLinksResponse({required this.enabled, required this.sidebarWeb}); /// Whether shared links are enabled - bool enabled; + final bool enabled; /// Whether shared links appear in web sidebar - bool sidebarWeb; + final bool sidebarWeb; - @override - bool operator ==(Object other) => identical(this, other) || other is SharedLinksResponse && - other.enabled == enabled && - other.sidebarWeb == sidebarWeb; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (sidebarWeb.hashCode); - - @override - String toString() => 'SharedLinksResponse[enabled=$enabled, sidebarWeb=$sidebarWeb]'; + static SharedLinksResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool, sidebarWeb: json[r'sidebarWeb'] as bool); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'sidebarWeb'] = this.sidebarWeb; + json[r'enabled'] = enabled; + json[r'sidebarWeb'] = sidebarWeb; return json; } - /// Returns a new [SharedLinksResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SharedLinksResponse? fromJson(dynamic value) { - upgradeDto(value, "SharedLinksResponse"); - if (value is Map) { - final json = value.cast(); - - return SharedLinksResponse( - enabled: mapValueOfType(json, r'enabled')!, - sidebarWeb: mapValueOfType(json, r'sidebarWeb')!, - ); - } - return null; + SharedLinksResponse copyWith({bool? enabled, bool? sidebarWeb}) { + return .new(enabled: enabled ?? this.enabled, sidebarWeb: sidebarWeb ?? this.sidebarWeb); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SharedLinksResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SharedLinksResponse && enabled == other.enabled && sidebarWeb == other.sidebarWeb); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SharedLinksResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, sidebarWeb]); } - // maps a json object with a list of SharedLinksResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SharedLinksResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'sidebarWeb', - }; + @override + String toString() => 'SharedLinksResponse(enabled=$enabled, sidebarWeb=$sidebarWeb)'; } - diff --git a/mobile/openapi/lib/model/shared_links_update.dart b/mobile/openapi/lib/model/shared_links_update.dart index 8e792b4f49..739a8aad07 100644 --- a/mobile/openapi/lib/model/shared_links_update.dart +++ b/mobile/openapi/lib/model/shared_links_update.dart @@ -1,127 +1,54 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SharedLinksUpdate { - /// Returns a new [SharedLinksUpdate] instance. - SharedLinksUpdate({ - this.enabled, - this.sidebarWeb, - }); +final class SharedLinksUpdate { + const SharedLinksUpdate({this.enabled, this.sidebarWeb}); /// Whether shared links are enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final bool? enabled; /// Whether shared links appear in web sidebar - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? sidebarWeb; + final bool? sidebarWeb; - @override - bool operator ==(Object other) => identical(this, other) || other is SharedLinksUpdate && - other.enabled == enabled && - other.sidebarWeb == sidebarWeb; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled == null ? 0 : enabled!.hashCode) + - (sidebarWeb == null ? 0 : sidebarWeb!.hashCode); - - @override - String toString() => 'SharedLinksUpdate[enabled=$enabled, sidebarWeb=$sidebarWeb]'; + static SharedLinksUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: (json[r'enabled'] as bool?), sidebarWeb: (json[r'sidebarWeb'] as bool?)); + } Map toJson() { final json = {}; - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled != null) { + json[r'enabled'] = enabled!; } - if (this.sidebarWeb != null) { - json[r'sidebarWeb'] = this.sidebarWeb; - } else { - // json[r'sidebarWeb'] = null; + if (sidebarWeb != null) { + json[r'sidebarWeb'] = sidebarWeb!; } return json; } - /// Returns a new [SharedLinksUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SharedLinksUpdate? fromJson(dynamic value) { - upgradeDto(value, "SharedLinksUpdate"); - if (value is Map) { - final json = value.cast(); - - return SharedLinksUpdate( - enabled: mapValueOfType(json, r'enabled'), - sidebarWeb: mapValueOfType(json, r'sidebarWeb'), - ); - } - return null; + SharedLinksUpdate copyWith({Object? enabled = _undefined, Object? sidebarWeb = _undefined}) { + return .new( + enabled: identical(enabled, _undefined) ? this.enabled : enabled as bool?, + sidebarWeb: identical(sidebarWeb, _undefined) ? this.sidebarWeb : sidebarWeb as bool?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SharedLinksUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SharedLinksUpdate && enabled == other.enabled && sidebarWeb == other.sidebarWeb); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SharedLinksUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, sidebarWeb]); } - // maps a json object with a list of SharedLinksUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SharedLinksUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'SharedLinksUpdate(enabled=$enabled, sidebarWeb=$sidebarWeb)'; } - diff --git a/mobile/openapi/lib/model/sign_up_dto.dart b/mobile/openapi/lib/model/sign_up_dto.dart index 54c8fa07d2..7cd2165492 100644 --- a/mobile/openapi/lib/model/sign_up_dto.dart +++ b/mobile/openapi/lib/model/sign_up_dto.dart @@ -1,118 +1,49 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SignUpDto { - /// Returns a new [SignUpDto] instance. - SignUpDto({ - required this.email, - required this.name, - required this.password, - }); +final class SignUpDto { + const SignUpDto({required this.email, required this.name, required this.password}); /// User email - String email; + final String email; /// User name - String name; + final String name; /// User password - String password; + final String password; - @override - bool operator ==(Object other) => identical(this, other) || other is SignUpDto && - other.email == email && - other.name == name && - other.password == password; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (email.hashCode) + - (name.hashCode) + - (password.hashCode); - - @override - String toString() => 'SignUpDto[email=$email, name=$name, password=$password]'; + static SignUpDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(email: json[r'email'] as String, name: json[r'name'] as String, password: json[r'password'] as String); + } Map toJson() { final json = {}; - json[r'email'] = this.email; - json[r'name'] = this.name; - json[r'password'] = this.password; + json[r'email'] = email; + json[r'name'] = name; + json[r'password'] = password; return json; } - /// Returns a new [SignUpDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SignUpDto? fromJson(dynamic value) { - upgradeDto(value, "SignUpDto"); - if (value is Map) { - final json = value.cast(); - - return SignUpDto( - email: mapValueOfType(json, r'email')!, - name: mapValueOfType(json, r'name')!, - password: mapValueOfType(json, r'password')!, - ); - } - return null; + SignUpDto copyWith({String? email, String? name, String? password}) { + return .new(email: email ?? this.email, name: name ?? this.name, password: password ?? this.password); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SignUpDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SignUpDto && email == other.email && name == other.name && password == other.password); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SignUpDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([email, name, password]); } - // maps a json object with a list of SignUpDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SignUpDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'email', - 'name', - 'password', - }; + @override + String toString() => 'SignUpDto(email=$email, name=$name, password=$password)'; } - diff --git a/mobile/openapi/lib/model/smart_search_dto.dart b/mobile/openapi/lib/model/smart_search_dto.dart index 9bbb4a25f0..cd36c760d2 100644 --- a/mobile/openapi/lib/model/smart_search_dto.dart +++ b/mobile/openapi/lib/model/smart_search_dto.dart @@ -1,658 +1,496 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SmartSearchDto { - /// Returns a new [SmartSearchDto] instance. - SmartSearchDto({ - this.albumIds = const [], - this.city, - this.country, - this.createdAfter, - this.createdBefore, - this.isEncoded, - this.isFavorite, - this.isMotion, - this.isNotInAlbum, - this.isOffline, - this.language, - this.lensModel, - this.libraryId, - this.make, - this.model, - this.ocr, - this.page, - this.personIds = const [], - this.query, - this.queryAssetId, - this.rating, - this.size, - this.state, - this.tagIds = const [], - this.takenAfter, - this.takenBefore, - this.trashedAfter, - this.trashedBefore, - this.type, - this.updatedAfter, - this.updatedBefore, - this.visibility, - this.withDeleted, - this.withExif, +final class SmartSearchDto { + const SmartSearchDto({ + this.albumIds = const Optional.absent(), + this.city = const Optional.absent(), + this.country = const Optional.absent(), + this.createdAfter = const Optional.absent(), + this.createdBefore = const Optional.absent(), + this.isEncoded = const Optional.absent(), + this.isFavorite = const Optional.absent(), + this.isMotion = const Optional.absent(), + this.isNotInAlbum = const Optional.absent(), + this.isOffline = const Optional.absent(), + this.language = const Optional.absent(), + this.lensModel = const Optional.absent(), + this.libraryId = const Optional.absent(), + this.make = const Optional.absent(), + this.model = const Optional.absent(), + this.ocr = const Optional.absent(), + this.page = const Optional.absent(), + this.personIds = const Optional.absent(), + this.query = const Optional.absent(), + this.queryAssetId = const Optional.absent(), + this.rating = const Optional.absent(), + this.size = const Optional.absent(), + this.state = const Optional.absent(), + this.tagIds = const Optional.absent(), + this.takenAfter = const Optional.absent(), + this.takenBefore = const Optional.absent(), + this.trashedAfter = const Optional.absent(), + this.trashedBefore = const Optional.absent(), + this.type = const Optional.absent(), + this.updatedAfter = const Optional.absent(), + this.updatedBefore = const Optional.absent(), + this.visibility = const Optional.absent(), + this.withDeleted = const Optional.absent(), + this.withExif = const Optional.absent(), }); /// Filter by album IDs - List albumIds; + final Optional> albumIds; /// Filter by city name - String? city; + final Optional city; /// Filter by country name - String? country; + final Optional country; /// Filter by creation date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? createdAfter; + final Optional createdAfter; /// Filter by creation date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? createdBefore; + final Optional createdBefore; /// Filter by encoded status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isEncoded; + final Optional isEncoded; /// Filter by favorite status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isFavorite; + final Optional isFavorite; /// Filter by motion photo status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isMotion; + final Optional isMotion; /// Filter assets not in any album - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isNotInAlbum; + final Optional isNotInAlbum; /// Filter by offline status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isOffline; + final Optional isOffline; /// Search language code - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? language; + final Optional language; /// Filter by lens model - String? lensModel; + final Optional lensModel; /// Library ID to filter by - String? libraryId; + final Optional libraryId; /// Filter by camera make - String? make; + final Optional make; /// Filter by camera model - String? model; + final Optional model; /// Filter by OCR text content - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? ocr; + final Optional ocr; /// Page number - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - int? page; + final Optional page; /// Filter by person IDs - List personIds; + final Optional> personIds; /// Natural language search query - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? query; + final Optional query; /// Asset ID to use as search reference - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? queryAssetId; + final Optional queryAssetId; /// Filter by rating [1-5], or null for unrated - /// - /// Minimum value: -1 - /// Maximum value: 5 - int? rating; + /// Available since server v1.0.0. + final Optional rating; /// Number of results to return - /// - /// Minimum value: 1 - /// Maximum value: 1000 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - int? size; + final Optional size; /// Filter by state/province name - String? state; + final Optional state; /// Filter by tag IDs - List? tagIds; + final Optional?> tagIds; /// Filter by taken date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? takenAfter; + final Optional takenAfter; /// Filter by taken date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? takenBefore; + final Optional takenBefore; /// Filter by trash date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? trashedAfter; + final Optional trashedAfter; /// Filter by trash date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? trashedBefore; + final Optional trashedBefore; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetTypeEnum? type; + final Optional type; /// Filter by update date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? updatedAfter; + final Optional updatedAfter; /// Filter by update date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? updatedBefore; + final Optional updatedBefore; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetVisibility? visibility; + final Optional visibility; /// Include deleted assets - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? withDeleted; + final Optional withDeleted; /// Include EXIF data in response - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? withExif; + final Optional withExif; - @override - bool operator ==(Object other) => identical(this, other) || other is SmartSearchDto && - _deepEquality.equals(other.albumIds, albumIds) && - other.city == city && - other.country == country && - other.createdAfter == createdAfter && - other.createdBefore == createdBefore && - other.isEncoded == isEncoded && - other.isFavorite == isFavorite && - other.isMotion == isMotion && - other.isNotInAlbum == isNotInAlbum && - other.isOffline == isOffline && - other.language == language && - other.lensModel == lensModel && - other.libraryId == libraryId && - other.make == make && - other.model == model && - other.ocr == ocr && - other.page == page && - _deepEquality.equals(other.personIds, personIds) && - other.query == query && - other.queryAssetId == queryAssetId && - other.rating == rating && - other.size == size && - other.state == state && - _deepEquality.equals(other.tagIds, tagIds) && - other.takenAfter == takenAfter && - other.takenBefore == takenBefore && - other.trashedAfter == trashedAfter && - other.trashedBefore == trashedBefore && - other.type == type && - other.updatedAfter == updatedAfter && - other.updatedBefore == updatedBefore && - other.visibility == visibility && - other.withDeleted == withDeleted && - other.withExif == withExif; + static const ApiVersion ratingAddedIn = .new(1, 0, 0); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumIds.hashCode) + - (city == null ? 0 : city!.hashCode) + - (country == null ? 0 : country!.hashCode) + - (createdAfter == null ? 0 : createdAfter!.hashCode) + - (createdBefore == null ? 0 : createdBefore!.hashCode) + - (isEncoded == null ? 0 : isEncoded!.hashCode) + - (isFavorite == null ? 0 : isFavorite!.hashCode) + - (isMotion == null ? 0 : isMotion!.hashCode) + - (isNotInAlbum == null ? 0 : isNotInAlbum!.hashCode) + - (isOffline == null ? 0 : isOffline!.hashCode) + - (language == null ? 0 : language!.hashCode) + - (lensModel == null ? 0 : lensModel!.hashCode) + - (libraryId == null ? 0 : libraryId!.hashCode) + - (make == null ? 0 : make!.hashCode) + - (model == null ? 0 : model!.hashCode) + - (ocr == null ? 0 : ocr!.hashCode) + - (page == null ? 0 : page!.hashCode) + - (personIds.hashCode) + - (query == null ? 0 : query!.hashCode) + - (queryAssetId == null ? 0 : queryAssetId!.hashCode) + - (rating == null ? 0 : rating!.hashCode) + - (size == null ? 0 : size!.hashCode) + - (state == null ? 0 : state!.hashCode) + - (tagIds == null ? 0 : tagIds!.hashCode) + - (takenAfter == null ? 0 : takenAfter!.hashCode) + - (takenBefore == null ? 0 : takenBefore!.hashCode) + - (trashedAfter == null ? 0 : trashedAfter!.hashCode) + - (trashedBefore == null ? 0 : trashedBefore!.hashCode) + - (type == null ? 0 : type!.hashCode) + - (updatedAfter == null ? 0 : updatedAfter!.hashCode) + - (updatedBefore == null ? 0 : updatedBefore!.hashCode) + - (visibility == null ? 0 : visibility!.hashCode) + - (withDeleted == null ? 0 : withDeleted!.hashCode) + - (withExif == null ? 0 : withExif!.hashCode); + static const ApiState ratingState = .stable; - @override - String toString() => 'SmartSearchDto[albumIds=$albumIds, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, language=$language, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, ocr=$ocr, page=$page, personIds=$personIds, query=$query, queryAssetId=$queryAssetId, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, visibility=$visibility, withDeleted=$withDeleted, withExif=$withExif]'; + static SmartSearchDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumIds: json.containsKey(r'albumIds') + ? Optional.present(((json[r'albumIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + city: json.containsKey(r'city') ? Optional.present((json[r'city'] as String?)) : const Optional.absent(), + country: json.containsKey(r'country') ? Optional.present((json[r'country'] as String?)) : const Optional.absent(), + createdAfter: json.containsKey(r'createdAfter') + ? Optional.present(DateTime.parse(json[r'createdAfter'] as String)) + : const Optional.absent(), + createdBefore: json.containsKey(r'createdBefore') + ? Optional.present(DateTime.parse(json[r'createdBefore'] as String)) + : const Optional.absent(), + isEncoded: json.containsKey(r'isEncoded') + ? Optional.present(json[r'isEncoded'] as bool) + : const Optional.absent(), + isFavorite: json.containsKey(r'isFavorite') + ? Optional.present(json[r'isFavorite'] as bool) + : const Optional.absent(), + isMotion: json.containsKey(r'isMotion') ? Optional.present(json[r'isMotion'] as bool) : const Optional.absent(), + isNotInAlbum: json.containsKey(r'isNotInAlbum') + ? Optional.present(json[r'isNotInAlbum'] as bool) + : const Optional.absent(), + isOffline: json.containsKey(r'isOffline') + ? Optional.present(json[r'isOffline'] as bool) + : const Optional.absent(), + language: json.containsKey(r'language') ? Optional.present(json[r'language'] as String) : const Optional.absent(), + lensModel: json.containsKey(r'lensModel') + ? Optional.present((json[r'lensModel'] as String?)) + : const Optional.absent(), + libraryId: json.containsKey(r'libraryId') + ? Optional.present((json[r'libraryId'] as String?)) + : const Optional.absent(), + make: json.containsKey(r'make') ? Optional.present((json[r'make'] as String?)) : const Optional.absent(), + model: json.containsKey(r'model') ? Optional.present((json[r'model'] as String?)) : const Optional.absent(), + ocr: json.containsKey(r'ocr') ? Optional.present(json[r'ocr'] as String) : const Optional.absent(), + page: json.containsKey(r'page') ? Optional.present(json[r'page'] as int) : const Optional.absent(), + personIds: json.containsKey(r'personIds') + ? Optional.present(((json[r'personIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + query: json.containsKey(r'query') ? Optional.present(json[r'query'] as String) : const Optional.absent(), + queryAssetId: json.containsKey(r'queryAssetId') + ? Optional.present(json[r'queryAssetId'] as String) + : const Optional.absent(), + rating: json.containsKey(r'rating') ? Optional.present((json[r'rating'] as int?)) : const Optional.absent(), + size: json.containsKey(r'size') ? Optional.present(json[r'size'] as int) : const Optional.absent(), + state: json.containsKey(r'state') ? Optional.present((json[r'state'] as String?)) : const Optional.absent(), + tagIds: json.containsKey(r'tagIds') + ? Optional.present((json[r'tagIds'] as List?)?.map(($e) => $e as String).toList(growable: false)) + : const Optional.absent(), + takenAfter: json.containsKey(r'takenAfter') + ? Optional.present(DateTime.parse(json[r'takenAfter'] as String)) + : const Optional.absent(), + takenBefore: json.containsKey(r'takenBefore') + ? Optional.present(DateTime.parse(json[r'takenBefore'] as String)) + : const Optional.absent(), + trashedAfter: json.containsKey(r'trashedAfter') + ? Optional.present(DateTime.parse(json[r'trashedAfter'] as String)) + : const Optional.absent(), + trashedBefore: json.containsKey(r'trashedBefore') + ? Optional.present(DateTime.parse(json[r'trashedBefore'] as String)) + : const Optional.absent(), + type: json.containsKey(r'type') + ? Optional.present((AssetTypeEnum.fromJson(json[r'type']))!) + : const Optional.absent(), + updatedAfter: json.containsKey(r'updatedAfter') + ? Optional.present(DateTime.parse(json[r'updatedAfter'] as String)) + : const Optional.absent(), + updatedBefore: json.containsKey(r'updatedBefore') + ? Optional.present(DateTime.parse(json[r'updatedBefore'] as String)) + : const Optional.absent(), + visibility: json.containsKey(r'visibility') + ? Optional.present((AssetVisibility.fromJson(json[r'visibility']))!) + : const Optional.absent(), + withDeleted: json.containsKey(r'withDeleted') + ? Optional.present(json[r'withDeleted'] as bool) + : const Optional.absent(), + withExif: json.containsKey(r'withExif') ? Optional.present(json[r'withExif'] as bool) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'albumIds'] = this.albumIds; - if (this.city != null) { - json[r'city'] = this.city; - } else { - // json[r'city'] = null; + if (albumIds case Present(:final value)) { + json[r'albumIds'] = value; } - if (this.country != null) { - json[r'country'] = this.country; - } else { - // json[r'country'] = null; + if (city case Present(:final value)) { + json[r'city'] = value; } - if (this.createdAfter != null) { - json[r'createdAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAfter!.millisecondsSinceEpoch - : this.createdAfter!.toUtc().toIso8601String(); - } else { - // json[r'createdAfter'] = null; + if (country case Present(:final value)) { + json[r'country'] = value; } - if (this.createdBefore != null) { - json[r'createdBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdBefore!.millisecondsSinceEpoch - : this.createdBefore!.toUtc().toIso8601String(); - } else { - // json[r'createdBefore'] = null; + if (createdAfter case Present(:final value)) { + json[r'createdAfter'] = value.toUtc().toIso8601String(); } - if (this.isEncoded != null) { - json[r'isEncoded'] = this.isEncoded; - } else { - // json[r'isEncoded'] = null; + if (createdBefore case Present(:final value)) { + json[r'createdBefore'] = value.toUtc().toIso8601String(); } - if (this.isFavorite != null) { - json[r'isFavorite'] = this.isFavorite; - } else { - // json[r'isFavorite'] = null; + if (isEncoded case Present(:final value)) { + json[r'isEncoded'] = value; } - if (this.isMotion != null) { - json[r'isMotion'] = this.isMotion; - } else { - // json[r'isMotion'] = null; + if (isFavorite case Present(:final value)) { + json[r'isFavorite'] = value; } - if (this.isNotInAlbum != null) { - json[r'isNotInAlbum'] = this.isNotInAlbum; - } else { - // json[r'isNotInAlbum'] = null; + if (isMotion case Present(:final value)) { + json[r'isMotion'] = value; } - if (this.isOffline != null) { - json[r'isOffline'] = this.isOffline; - } else { - // json[r'isOffline'] = null; + if (isNotInAlbum case Present(:final value)) { + json[r'isNotInAlbum'] = value; } - if (this.language != null) { - json[r'language'] = this.language; - } else { - // json[r'language'] = null; + if (isOffline case Present(:final value)) { + json[r'isOffline'] = value; } - if (this.lensModel != null) { - json[r'lensModel'] = this.lensModel; - } else { - // json[r'lensModel'] = null; + if (language case Present(:final value)) { + json[r'language'] = value; } - if (this.libraryId != null) { - json[r'libraryId'] = this.libraryId; - } else { - // json[r'libraryId'] = null; + if (lensModel case Present(:final value)) { + json[r'lensModel'] = value; } - if (this.make != null) { - json[r'make'] = this.make; - } else { - // json[r'make'] = null; + if (libraryId case Present(:final value)) { + json[r'libraryId'] = value; } - if (this.model != null) { - json[r'model'] = this.model; - } else { - // json[r'model'] = null; + if (make case Present(:final value)) { + json[r'make'] = value; } - if (this.ocr != null) { - json[r'ocr'] = this.ocr; - } else { - // json[r'ocr'] = null; + if (model case Present(:final value)) { + json[r'model'] = value; } - if (this.page != null) { - json[r'page'] = this.page; - } else { - // json[r'page'] = null; + if (ocr case Present(:final value)) { + json[r'ocr'] = value; } - json[r'personIds'] = this.personIds; - if (this.query != null) { - json[r'query'] = this.query; - } else { - // json[r'query'] = null; + if (page case Present(:final value)) { + json[r'page'] = value; } - if (this.queryAssetId != null) { - json[r'queryAssetId'] = this.queryAssetId; - } else { - // json[r'queryAssetId'] = null; + if (personIds case Present(:final value)) { + json[r'personIds'] = value; } - if (this.rating != null) { - json[r'rating'] = this.rating; - } else { - // json[r'rating'] = null; + if (query case Present(:final value)) { + json[r'query'] = value; } - if (this.size != null) { - json[r'size'] = this.size; - } else { - // json[r'size'] = null; + if (queryAssetId case Present(:final value)) { + json[r'queryAssetId'] = value; } - if (this.state != null) { - json[r'state'] = this.state; - } else { - // json[r'state'] = null; + if (rating case Present(:final value)) { + json[r'rating'] = value; } - if (this.tagIds != null) { - json[r'tagIds'] = this.tagIds; - } else { - // json[r'tagIds'] = null; + if (size case Present(:final value)) { + json[r'size'] = value; } - if (this.takenAfter != null) { - json[r'takenAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.takenAfter!.millisecondsSinceEpoch - : this.takenAfter!.toUtc().toIso8601String(); - } else { - // json[r'takenAfter'] = null; + if (state case Present(:final value)) { + json[r'state'] = value; } - if (this.takenBefore != null) { - json[r'takenBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.takenBefore!.millisecondsSinceEpoch - : this.takenBefore!.toUtc().toIso8601String(); - } else { - // json[r'takenBefore'] = null; + if (tagIds case Present(:final value)) { + json[r'tagIds'] = value; } - if (this.trashedAfter != null) { - json[r'trashedAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.trashedAfter!.millisecondsSinceEpoch - : this.trashedAfter!.toUtc().toIso8601String(); - } else { - // json[r'trashedAfter'] = null; + if (takenAfter case Present(:final value)) { + json[r'takenAfter'] = value.toUtc().toIso8601String(); } - if (this.trashedBefore != null) { - json[r'trashedBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.trashedBefore!.millisecondsSinceEpoch - : this.trashedBefore!.toUtc().toIso8601String(); - } else { - // json[r'trashedBefore'] = null; + if (takenBefore case Present(:final value)) { + json[r'takenBefore'] = value.toUtc().toIso8601String(); } - if (this.type != null) { - json[r'type'] = this.type; - } else { - // json[r'type'] = null; + if (trashedAfter case Present(:final value)) { + json[r'trashedAfter'] = value.toUtc().toIso8601String(); } - if (this.updatedAfter != null) { - json[r'updatedAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAfter!.millisecondsSinceEpoch - : this.updatedAfter!.toUtc().toIso8601String(); - } else { - // json[r'updatedAfter'] = null; + if (trashedBefore case Present(:final value)) { + json[r'trashedBefore'] = value.toUtc().toIso8601String(); } - if (this.updatedBefore != null) { - json[r'updatedBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedBefore!.millisecondsSinceEpoch - : this.updatedBefore!.toUtc().toIso8601String(); - } else { - // json[r'updatedBefore'] = null; + if (type case Present(:final value)) { + json[r'type'] = value.toJson(); } - if (this.visibility != null) { - json[r'visibility'] = this.visibility; - } else { - // json[r'visibility'] = null; + if (updatedAfter case Present(:final value)) { + json[r'updatedAfter'] = value.toUtc().toIso8601String(); } - if (this.withDeleted != null) { - json[r'withDeleted'] = this.withDeleted; - } else { - // json[r'withDeleted'] = null; + if (updatedBefore case Present(:final value)) { + json[r'updatedBefore'] = value.toUtc().toIso8601String(); } - if (this.withExif != null) { - json[r'withExif'] = this.withExif; - } else { - // json[r'withExif'] = null; + if (visibility case Present(:final value)) { + json[r'visibility'] = value.toJson(); + } + if (withDeleted case Present(:final value)) { + json[r'withDeleted'] = value; + } + if (withExif case Present(:final value)) { + json[r'withExif'] = value; } return json; } - /// Returns a new [SmartSearchDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SmartSearchDto? fromJson(dynamic value) { - upgradeDto(value, "SmartSearchDto"); - if (value is Map) { - final json = value.cast(); - - return SmartSearchDto( - albumIds: json[r'albumIds'] is Iterable - ? (json[r'albumIds'] as Iterable).cast().toList(growable: false) - : const [], - city: mapValueOfType(json, r'city'), - country: mapValueOfType(json, r'country'), - createdAfter: mapDateTime(json, r'createdAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - createdBefore: mapDateTime(json, r'createdBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - isEncoded: mapValueOfType(json, r'isEncoded'), - isFavorite: mapValueOfType(json, r'isFavorite'), - isMotion: mapValueOfType(json, r'isMotion'), - isNotInAlbum: mapValueOfType(json, r'isNotInAlbum'), - isOffline: mapValueOfType(json, r'isOffline'), - language: mapValueOfType(json, r'language'), - lensModel: mapValueOfType(json, r'lensModel'), - libraryId: mapValueOfType(json, r'libraryId'), - make: mapValueOfType(json, r'make'), - model: mapValueOfType(json, r'model'), - ocr: mapValueOfType(json, r'ocr'), - page: mapValueOfType(json, r'page'), - personIds: json[r'personIds'] is Iterable - ? (json[r'personIds'] as Iterable).cast().toList(growable: false) - : const [], - query: mapValueOfType(json, r'query'), - queryAssetId: mapValueOfType(json, r'queryAssetId'), - rating: mapValueOfType(json, r'rating'), - size: mapValueOfType(json, r'size'), - state: mapValueOfType(json, r'state'), - tagIds: json[r'tagIds'] is Iterable - ? (json[r'tagIds'] as Iterable).cast().toList(growable: false) - : const [], - takenAfter: mapDateTime(json, r'takenAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - takenBefore: mapDateTime(json, r'takenBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - trashedAfter: mapDateTime(json, r'trashedAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - trashedBefore: mapDateTime(json, r'trashedBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - type: AssetTypeEnum.fromJson(json[r'type']), - updatedAfter: mapDateTime(json, r'updatedAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - updatedBefore: mapDateTime(json, r'updatedBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - visibility: AssetVisibility.fromJson(json[r'visibility']), - withDeleted: mapValueOfType(json, r'withDeleted'), - withExif: mapValueOfType(json, r'withExif'), - ); - } - return null; + SmartSearchDto copyWith({ + Optional>? albumIds, + Optional? city, + Optional? country, + Optional? createdAfter, + Optional? createdBefore, + Optional? isEncoded, + Optional? isFavorite, + Optional? isMotion, + Optional? isNotInAlbum, + Optional? isOffline, + Optional? language, + Optional? lensModel, + Optional? libraryId, + Optional? make, + Optional? model, + Optional? ocr, + Optional? page, + Optional>? personIds, + Optional? query, + Optional? queryAssetId, + Optional? rating, + Optional? size, + Optional? state, + Optional?>? tagIds, + Optional? takenAfter, + Optional? takenBefore, + Optional? trashedAfter, + Optional? trashedBefore, + Optional? type, + Optional? updatedAfter, + Optional? updatedBefore, + Optional? visibility, + Optional? withDeleted, + Optional? withExif, + }) { + return .new( + albumIds: albumIds ?? this.albumIds, + city: city ?? this.city, + country: country ?? this.country, + createdAfter: createdAfter ?? this.createdAfter, + createdBefore: createdBefore ?? this.createdBefore, + isEncoded: isEncoded ?? this.isEncoded, + isFavorite: isFavorite ?? this.isFavorite, + isMotion: isMotion ?? this.isMotion, + isNotInAlbum: isNotInAlbum ?? this.isNotInAlbum, + isOffline: isOffline ?? this.isOffline, + language: language ?? this.language, + lensModel: lensModel ?? this.lensModel, + libraryId: libraryId ?? this.libraryId, + make: make ?? this.make, + model: model ?? this.model, + ocr: ocr ?? this.ocr, + page: page ?? this.page, + personIds: personIds ?? this.personIds, + query: query ?? this.query, + queryAssetId: queryAssetId ?? this.queryAssetId, + rating: rating ?? this.rating, + size: size ?? this.size, + state: state ?? this.state, + tagIds: tagIds ?? this.tagIds, + takenAfter: takenAfter ?? this.takenAfter, + takenBefore: takenBefore ?? this.takenBefore, + trashedAfter: trashedAfter ?? this.trashedAfter, + trashedBefore: trashedBefore ?? this.trashedBefore, + type: type ?? this.type, + updatedAfter: updatedAfter ?? this.updatedAfter, + updatedBefore: updatedBefore ?? this.updatedBefore, + visibility: visibility ?? this.visibility, + withDeleted: withDeleted ?? this.withDeleted, + withExif: withExif ?? this.withExif, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SmartSearchDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SmartSearchDto && + albumIds == other.albumIds && + city == other.city && + country == other.country && + createdAfter == other.createdAfter && + createdBefore == other.createdBefore && + isEncoded == other.isEncoded && + isFavorite == other.isFavorite && + isMotion == other.isMotion && + isNotInAlbum == other.isNotInAlbum && + isOffline == other.isOffline && + language == other.language && + lensModel == other.lensModel && + libraryId == other.libraryId && + make == other.make && + model == other.model && + ocr == other.ocr && + page == other.page && + personIds == other.personIds && + query == other.query && + queryAssetId == other.queryAssetId && + rating == other.rating && + size == other.size && + state == other.state && + tagIds == other.tagIds && + takenAfter == other.takenAfter && + takenBefore == other.takenBefore && + trashedAfter == other.trashedAfter && + trashedBefore == other.trashedBefore && + type == other.type && + updatedAfter == other.updatedAfter && + updatedBefore == other.updatedBefore && + visibility == other.visibility && + withDeleted == other.withDeleted && + withExif == other.withExif); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SmartSearchDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + albumIds, + city, + country, + createdAfter, + createdBefore, + isEncoded, + isFavorite, + isMotion, + isNotInAlbum, + isOffline, + language, + lensModel, + libraryId, + make, + model, + ocr, + page, + personIds, + query, + queryAssetId, + rating, + size, + state, + tagIds, + takenAfter, + takenBefore, + trashedAfter, + trashedBefore, + type, + updatedAfter, + updatedBefore, + visibility, + withDeleted, + withExif, + ]); } - // maps a json object with a list of SmartSearchDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SmartSearchDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'SmartSearchDto(albumIds=$albumIds, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, language=$language, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, ocr=$ocr, page=$page, personIds=$personIds, query=$query, queryAssetId=$queryAssetId, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, visibility=$visibility, withDeleted=$withDeleted, withExif=$withExif)'; } - diff --git a/mobile/openapi/lib/model/source_type.dart b/mobile/openapi/lib/model/source_type.dart index ed164172a3..a9c083e5ea 100644 --- a/mobile/openapi/lib/model/source_type.dart +++ b/mobile/openapi/lib/model/source_type.dart @@ -1,88 +1,29 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Face detection source type -class SourceType { - /// Instantiate a new enum with the provided [value]. +enum SourceType { + machineLearning._(r'machine-learning'), + exif._(r'exif'), + manual._(r'manual'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const SourceType._(this.value); - /// The underlying value of this enum member. final String value; + static SourceType? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const machineLearning = SourceType._(r'machine-learning'); - static const exif = SourceType._(r'exif'); - static const manual = SourceType._(r'manual'); - - /// List of all possible values in this [enum][SourceType]. - static const values = [ - machineLearning, - exif, - manual, - ]; - - static SourceType? fromJson(dynamic value) => SourceTypeTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SourceType.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [SourceType] to String, -/// and [decode] dynamic data back to [SourceType]. -class SourceTypeTypeTransformer { - factory SourceTypeTypeTransformer() => _instance ??= const SourceTypeTypeTransformer._(); - - const SourceTypeTypeTransformer._(); - - String encode(SourceType data) => data.value; - - /// Decodes a [dynamic value][data] to a SourceType. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - SourceType? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'machine-learning': return SourceType.machineLearning; - case r'exif': return SourceType.exif; - case r'manual': return SourceType.manual; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [SourceTypeTypeTransformer] instance. - static SourceTypeTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/stack_create_dto.dart b/mobile/openapi/lib/model/stack_create_dto.dart index 6b08c83401..529e963cd3 100644 --- a/mobile/openapi/lib/model/stack_create_dto.dart +++ b/mobile/openapi/lib/model/stack_create_dto.dart @@ -1,102 +1,41 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class StackCreateDto { - /// Returns a new [StackCreateDto] instance. - StackCreateDto({ - this.assetIds = const [], - }); +final class StackCreateDto { + const StackCreateDto({required this.assetIds}); /// Asset IDs (first becomes primary, min 2) - List assetIds; + final List assetIds; - @override - bool operator ==(Object other) => identical(this, other) || other is StackCreateDto && - _deepEquality.equals(other.assetIds, assetIds); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetIds.hashCode); - - @override - String toString() => 'StackCreateDto[assetIds=$assetIds]'; + static StackCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(assetIds: ((json[r'assetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!); + } Map toJson() { final json = {}; - json[r'assetIds'] = this.assetIds; + json[r'assetIds'] = assetIds; return json; } - /// Returns a new [StackCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static StackCreateDto? fromJson(dynamic value) { - upgradeDto(value, "StackCreateDto"); - if (value is Map) { - final json = value.cast(); - - return StackCreateDto( - assetIds: json[r'assetIds'] is Iterable - ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + StackCreateDto copyWith({List? assetIds}) { + return .new(assetIds: assetIds ?? this.assetIds); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = StackCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is StackCreateDto && const DeepCollectionEquality().equals(assetIds, other.assetIds)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = StackCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(assetIds)]); } - // maps a json object with a list of StackCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = StackCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetIds', - }; + @override + String toString() => 'StackCreateDto(assetIds=$assetIds)'; } - diff --git a/mobile/openapi/lib/model/stack_response_dto.dart b/mobile/openapi/lib/model/stack_response_dto.dart index 326f83a03d..03e313c79d 100644 --- a/mobile/openapi/lib/model/stack_response_dto.dart +++ b/mobile/openapi/lib/model/stack_response_dto.dart @@ -1,117 +1,60 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class StackResponseDto { - /// Returns a new [StackResponseDto] instance. - StackResponseDto({ - this.assets = const [], - required this.id, - required this.primaryAssetId, - }); +/// Stack response +final class StackResponseDto { + const StackResponseDto({required this.assets, required this.id, required this.primaryAssetId}); - List assets; + final List assets; /// Stack ID - String id; + final String id; /// Primary asset ID - String primaryAssetId; + final String primaryAssetId; - @override - bool operator ==(Object other) => identical(this, other) || other is StackResponseDto && - _deepEquality.equals(other.assets, assets) && - other.id == id && - other.primaryAssetId == primaryAssetId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assets.hashCode) + - (id.hashCode) + - (primaryAssetId.hashCode); - - @override - String toString() => 'StackResponseDto[assets=$assets, id=$id, primaryAssetId=$primaryAssetId]'; + static StackResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assets: ((json[r'assets'] as List?)?.map(($e) => (AssetResponseDto.fromJson($e))!).toList(growable: false))!, + id: json[r'id'] as String, + primaryAssetId: json[r'primaryAssetId'] as String, + ); + } Map toJson() { final json = {}; - json[r'assets'] = this.assets; - json[r'id'] = this.id; - json[r'primaryAssetId'] = this.primaryAssetId; + json[r'assets'] = assets.map(($e) => $e.toJson()).toList(growable: false); + json[r'id'] = id; + json[r'primaryAssetId'] = primaryAssetId; return json; } - /// Returns a new [StackResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static StackResponseDto? fromJson(dynamic value) { - upgradeDto(value, "StackResponseDto"); - if (value is Map) { - final json = value.cast(); - - return StackResponseDto( - assets: AssetResponseDto.listFromJson(json[r'assets']), - id: mapValueOfType(json, r'id')!, - primaryAssetId: mapValueOfType(json, r'primaryAssetId')!, - ); - } - return null; + StackResponseDto copyWith({List? assets, String? id, String? primaryAssetId}) { + return .new( + assets: assets ?? this.assets, + id: id ?? this.id, + primaryAssetId: primaryAssetId ?? this.primaryAssetId, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = StackResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is StackResponseDto && + const DeepCollectionEquality().equals(assets, other.assets) && + id == other.id && + primaryAssetId == other.primaryAssetId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = StackResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(assets), id, primaryAssetId]); } - // maps a json object with a list of StackResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = StackResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assets', - 'id', - 'primaryAssetId', - }; + @override + String toString() => 'StackResponseDto(assets=$assets, id=$id, primaryAssetId=$primaryAssetId)'; } - diff --git a/mobile/openapi/lib/model/stack_update_dto.dart b/mobile/openapi/lib/model/stack_update_dto.dart index e81c204f97..10cbb71937 100644 --- a/mobile/openapi/lib/model/stack_update_dto.dart +++ b/mobile/openapi/lib/model/stack_update_dto.dart @@ -1,109 +1,46 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class StackUpdateDto { - /// Returns a new [StackUpdateDto] instance. - StackUpdateDto({ - this.primaryAssetId, - }); +final class StackUpdateDto { + const StackUpdateDto({this.primaryAssetId = const Optional.absent()}); /// Primary asset ID - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? primaryAssetId; + final Optional primaryAssetId; - @override - bool operator ==(Object other) => identical(this, other) || other is StackUpdateDto && - other.primaryAssetId == primaryAssetId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (primaryAssetId == null ? 0 : primaryAssetId!.hashCode); - - @override - String toString() => 'StackUpdateDto[primaryAssetId=$primaryAssetId]'; + static StackUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + primaryAssetId: json.containsKey(r'primaryAssetId') + ? Optional.present(json[r'primaryAssetId'] as String) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.primaryAssetId != null) { - json[r'primaryAssetId'] = this.primaryAssetId; - } else { - // json[r'primaryAssetId'] = null; + if (primaryAssetId case Present(:final value)) { + json[r'primaryAssetId'] = value; } return json; } - /// Returns a new [StackUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static StackUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "StackUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return StackUpdateDto( - primaryAssetId: mapValueOfType(json, r'primaryAssetId'), - ); - } - return null; + StackUpdateDto copyWith({Optional? primaryAssetId}) { + return .new(primaryAssetId: primaryAssetId ?? this.primaryAssetId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = StackUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is StackUpdateDto && primaryAssetId == other.primaryAssetId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = StackUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([primaryAssetId]); } - // maps a json object with a list of StackUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = StackUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'StackUpdateDto(primaryAssetId=$primaryAssetId)'; } - diff --git a/mobile/openapi/lib/model/statistics_search_dto.dart b/mobile/openapi/lib/model/statistics_search_dto.dart index f276e3717b..f8e21aa4fc 100644 --- a/mobile/openapi/lib/model/statistics_search_dto.dart +++ b/mobile/openapi/lib/model/statistics_search_dto.dart @@ -1,544 +1,422 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class StatisticsSearchDto { - /// Returns a new [StatisticsSearchDto] instance. - StatisticsSearchDto({ - this.albumIds = const [], - this.city, - this.country, - this.createdAfter, - this.createdBefore, - this.description, - this.isEncoded, - this.isFavorite, - this.isMotion, - this.isNotInAlbum, - this.isOffline, - this.lensModel, - this.libraryId, - this.make, - this.model, - this.ocr, - this.personIds = const [], - this.rating, - this.state, - this.tagIds = const [], - this.takenAfter, - this.takenBefore, - this.trashedAfter, - this.trashedBefore, - this.type, - this.updatedAfter, - this.updatedBefore, - this.visibility, +final class StatisticsSearchDto { + const StatisticsSearchDto({ + this.albumIds = const Optional.absent(), + this.city = const Optional.absent(), + this.country = const Optional.absent(), + this.createdAfter = const Optional.absent(), + this.createdBefore = const Optional.absent(), + this.description = const Optional.absent(), + this.isEncoded = const Optional.absent(), + this.isFavorite = const Optional.absent(), + this.isMotion = const Optional.absent(), + this.isNotInAlbum = const Optional.absent(), + this.isOffline = const Optional.absent(), + this.lensModel = const Optional.absent(), + this.libraryId = const Optional.absent(), + this.make = const Optional.absent(), + this.model = const Optional.absent(), + this.ocr = const Optional.absent(), + this.personIds = const Optional.absent(), + this.rating = const Optional.absent(), + this.state = const Optional.absent(), + this.tagIds = const Optional.absent(), + this.takenAfter = const Optional.absent(), + this.takenBefore = const Optional.absent(), + this.trashedAfter = const Optional.absent(), + this.trashedBefore = const Optional.absent(), + this.type = const Optional.absent(), + this.updatedAfter = const Optional.absent(), + this.updatedBefore = const Optional.absent(), + this.visibility = const Optional.absent(), }); /// Filter by album IDs - List albumIds; + final Optional> albumIds; /// Filter by city name - String? city; + final Optional city; /// Filter by country name - String? country; + final Optional country; /// Filter by creation date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? createdAfter; + final Optional createdAfter; /// Filter by creation date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? createdBefore; + final Optional createdBefore; /// Filter by description text - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? description; + final Optional description; /// Filter by encoded status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isEncoded; + final Optional isEncoded; /// Filter by favorite status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isFavorite; + final Optional isFavorite; /// Filter by motion photo status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isMotion; + final Optional isMotion; /// Filter assets not in any album - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isNotInAlbum; + final Optional isNotInAlbum; /// Filter by offline status - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isOffline; + final Optional isOffline; /// Filter by lens model - String? lensModel; + final Optional lensModel; /// Library ID to filter by - String? libraryId; + final Optional libraryId; /// Filter by camera make - String? make; + final Optional make; /// Filter by camera model - String? model; + final Optional model; /// Filter by OCR text content - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? ocr; + final Optional ocr; /// Filter by person IDs - List personIds; + final Optional> personIds; /// Filter by rating [1-5], or null for unrated - /// - /// Minimum value: -1 - /// Maximum value: 5 - int? rating; + /// Available since server v1.0.0. + final Optional rating; /// Filter by state/province name - String? state; + final Optional state; /// Filter by tag IDs - List? tagIds; + final Optional?> tagIds; /// Filter by taken date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? takenAfter; + final Optional takenAfter; /// Filter by taken date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? takenBefore; + final Optional takenBefore; /// Filter by trash date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? trashedAfter; + final Optional trashedAfter; /// Filter by trash date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? trashedBefore; + final Optional trashedBefore; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetTypeEnum? type; + final Optional type; /// Filter by update date (after) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? updatedAfter; + final Optional updatedAfter; /// Filter by update date (before) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DateTime? updatedBefore; + final Optional updatedBefore; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetVisibility? visibility; + final Optional visibility; - @override - bool operator ==(Object other) => identical(this, other) || other is StatisticsSearchDto && - _deepEquality.equals(other.albumIds, albumIds) && - other.city == city && - other.country == country && - other.createdAfter == createdAfter && - other.createdBefore == createdBefore && - other.description == description && - other.isEncoded == isEncoded && - other.isFavorite == isFavorite && - other.isMotion == isMotion && - other.isNotInAlbum == isNotInAlbum && - other.isOffline == isOffline && - other.lensModel == lensModel && - other.libraryId == libraryId && - other.make == make && - other.model == model && - other.ocr == ocr && - _deepEquality.equals(other.personIds, personIds) && - other.rating == rating && - other.state == state && - _deepEquality.equals(other.tagIds, tagIds) && - other.takenAfter == takenAfter && - other.takenBefore == takenBefore && - other.trashedAfter == trashedAfter && - other.trashedBefore == trashedBefore && - other.type == type && - other.updatedAfter == updatedAfter && - other.updatedBefore == updatedBefore && - other.visibility == visibility; + static const ApiVersion ratingAddedIn = .new(1, 0, 0); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumIds.hashCode) + - (city == null ? 0 : city!.hashCode) + - (country == null ? 0 : country!.hashCode) + - (createdAfter == null ? 0 : createdAfter!.hashCode) + - (createdBefore == null ? 0 : createdBefore!.hashCode) + - (description == null ? 0 : description!.hashCode) + - (isEncoded == null ? 0 : isEncoded!.hashCode) + - (isFavorite == null ? 0 : isFavorite!.hashCode) + - (isMotion == null ? 0 : isMotion!.hashCode) + - (isNotInAlbum == null ? 0 : isNotInAlbum!.hashCode) + - (isOffline == null ? 0 : isOffline!.hashCode) + - (lensModel == null ? 0 : lensModel!.hashCode) + - (libraryId == null ? 0 : libraryId!.hashCode) + - (make == null ? 0 : make!.hashCode) + - (model == null ? 0 : model!.hashCode) + - (ocr == null ? 0 : ocr!.hashCode) + - (personIds.hashCode) + - (rating == null ? 0 : rating!.hashCode) + - (state == null ? 0 : state!.hashCode) + - (tagIds == null ? 0 : tagIds!.hashCode) + - (takenAfter == null ? 0 : takenAfter!.hashCode) + - (takenBefore == null ? 0 : takenBefore!.hashCode) + - (trashedAfter == null ? 0 : trashedAfter!.hashCode) + - (trashedBefore == null ? 0 : trashedBefore!.hashCode) + - (type == null ? 0 : type!.hashCode) + - (updatedAfter == null ? 0 : updatedAfter!.hashCode) + - (updatedBefore == null ? 0 : updatedBefore!.hashCode) + - (visibility == null ? 0 : visibility!.hashCode); + static const ApiState ratingState = .stable; - @override - String toString() => 'StatisticsSearchDto[albumIds=$albumIds, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, description=$description, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, ocr=$ocr, personIds=$personIds, rating=$rating, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, visibility=$visibility]'; + static StatisticsSearchDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumIds: json.containsKey(r'albumIds') + ? Optional.present(((json[r'albumIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + city: json.containsKey(r'city') ? Optional.present((json[r'city'] as String?)) : const Optional.absent(), + country: json.containsKey(r'country') ? Optional.present((json[r'country'] as String?)) : const Optional.absent(), + createdAfter: json.containsKey(r'createdAfter') + ? Optional.present(DateTime.parse(json[r'createdAfter'] as String)) + : const Optional.absent(), + createdBefore: json.containsKey(r'createdBefore') + ? Optional.present(DateTime.parse(json[r'createdBefore'] as String)) + : const Optional.absent(), + description: json.containsKey(r'description') + ? Optional.present(json[r'description'] as String) + : const Optional.absent(), + isEncoded: json.containsKey(r'isEncoded') + ? Optional.present(json[r'isEncoded'] as bool) + : const Optional.absent(), + isFavorite: json.containsKey(r'isFavorite') + ? Optional.present(json[r'isFavorite'] as bool) + : const Optional.absent(), + isMotion: json.containsKey(r'isMotion') ? Optional.present(json[r'isMotion'] as bool) : const Optional.absent(), + isNotInAlbum: json.containsKey(r'isNotInAlbum') + ? Optional.present(json[r'isNotInAlbum'] as bool) + : const Optional.absent(), + isOffline: json.containsKey(r'isOffline') + ? Optional.present(json[r'isOffline'] as bool) + : const Optional.absent(), + lensModel: json.containsKey(r'lensModel') + ? Optional.present((json[r'lensModel'] as String?)) + : const Optional.absent(), + libraryId: json.containsKey(r'libraryId') + ? Optional.present((json[r'libraryId'] as String?)) + : const Optional.absent(), + make: json.containsKey(r'make') ? Optional.present((json[r'make'] as String?)) : const Optional.absent(), + model: json.containsKey(r'model') ? Optional.present((json[r'model'] as String?)) : const Optional.absent(), + ocr: json.containsKey(r'ocr') ? Optional.present(json[r'ocr'] as String) : const Optional.absent(), + personIds: json.containsKey(r'personIds') + ? Optional.present(((json[r'personIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + rating: json.containsKey(r'rating') ? Optional.present((json[r'rating'] as int?)) : const Optional.absent(), + state: json.containsKey(r'state') ? Optional.present((json[r'state'] as String?)) : const Optional.absent(), + tagIds: json.containsKey(r'tagIds') + ? Optional.present((json[r'tagIds'] as List?)?.map(($e) => $e as String).toList(growable: false)) + : const Optional.absent(), + takenAfter: json.containsKey(r'takenAfter') + ? Optional.present(DateTime.parse(json[r'takenAfter'] as String)) + : const Optional.absent(), + takenBefore: json.containsKey(r'takenBefore') + ? Optional.present(DateTime.parse(json[r'takenBefore'] as String)) + : const Optional.absent(), + trashedAfter: json.containsKey(r'trashedAfter') + ? Optional.present(DateTime.parse(json[r'trashedAfter'] as String)) + : const Optional.absent(), + trashedBefore: json.containsKey(r'trashedBefore') + ? Optional.present(DateTime.parse(json[r'trashedBefore'] as String)) + : const Optional.absent(), + type: json.containsKey(r'type') + ? Optional.present((AssetTypeEnum.fromJson(json[r'type']))!) + : const Optional.absent(), + updatedAfter: json.containsKey(r'updatedAfter') + ? Optional.present(DateTime.parse(json[r'updatedAfter'] as String)) + : const Optional.absent(), + updatedBefore: json.containsKey(r'updatedBefore') + ? Optional.present(DateTime.parse(json[r'updatedBefore'] as String)) + : const Optional.absent(), + visibility: json.containsKey(r'visibility') + ? Optional.present((AssetVisibility.fromJson(json[r'visibility']))!) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'albumIds'] = this.albumIds; - if (this.city != null) { - json[r'city'] = this.city; - } else { - // json[r'city'] = null; + if (albumIds case Present(:final value)) { + json[r'albumIds'] = value; } - if (this.country != null) { - json[r'country'] = this.country; - } else { - // json[r'country'] = null; + if (city case Present(:final value)) { + json[r'city'] = value; } - if (this.createdAfter != null) { - json[r'createdAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAfter!.millisecondsSinceEpoch - : this.createdAfter!.toUtc().toIso8601String(); - } else { - // json[r'createdAfter'] = null; + if (country case Present(:final value)) { + json[r'country'] = value; } - if (this.createdBefore != null) { - json[r'createdBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdBefore!.millisecondsSinceEpoch - : this.createdBefore!.toUtc().toIso8601String(); - } else { - // json[r'createdBefore'] = null; + if (createdAfter case Present(:final value)) { + json[r'createdAfter'] = value.toUtc().toIso8601String(); } - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (createdBefore case Present(:final value)) { + json[r'createdBefore'] = value.toUtc().toIso8601String(); } - if (this.isEncoded != null) { - json[r'isEncoded'] = this.isEncoded; - } else { - // json[r'isEncoded'] = null; + if (description case Present(:final value)) { + json[r'description'] = value; } - if (this.isFavorite != null) { - json[r'isFavorite'] = this.isFavorite; - } else { - // json[r'isFavorite'] = null; + if (isEncoded case Present(:final value)) { + json[r'isEncoded'] = value; } - if (this.isMotion != null) { - json[r'isMotion'] = this.isMotion; - } else { - // json[r'isMotion'] = null; + if (isFavorite case Present(:final value)) { + json[r'isFavorite'] = value; } - if (this.isNotInAlbum != null) { - json[r'isNotInAlbum'] = this.isNotInAlbum; - } else { - // json[r'isNotInAlbum'] = null; + if (isMotion case Present(:final value)) { + json[r'isMotion'] = value; } - if (this.isOffline != null) { - json[r'isOffline'] = this.isOffline; - } else { - // json[r'isOffline'] = null; + if (isNotInAlbum case Present(:final value)) { + json[r'isNotInAlbum'] = value; } - if (this.lensModel != null) { - json[r'lensModel'] = this.lensModel; - } else { - // json[r'lensModel'] = null; + if (isOffline case Present(:final value)) { + json[r'isOffline'] = value; } - if (this.libraryId != null) { - json[r'libraryId'] = this.libraryId; - } else { - // json[r'libraryId'] = null; + if (lensModel case Present(:final value)) { + json[r'lensModel'] = value; } - if (this.make != null) { - json[r'make'] = this.make; - } else { - // json[r'make'] = null; + if (libraryId case Present(:final value)) { + json[r'libraryId'] = value; } - if (this.model != null) { - json[r'model'] = this.model; - } else { - // json[r'model'] = null; + if (make case Present(:final value)) { + json[r'make'] = value; } - if (this.ocr != null) { - json[r'ocr'] = this.ocr; - } else { - // json[r'ocr'] = null; + if (model case Present(:final value)) { + json[r'model'] = value; } - json[r'personIds'] = this.personIds; - if (this.rating != null) { - json[r'rating'] = this.rating; - } else { - // json[r'rating'] = null; + if (ocr case Present(:final value)) { + json[r'ocr'] = value; } - if (this.state != null) { - json[r'state'] = this.state; - } else { - // json[r'state'] = null; + if (personIds case Present(:final value)) { + json[r'personIds'] = value; } - if (this.tagIds != null) { - json[r'tagIds'] = this.tagIds; - } else { - // json[r'tagIds'] = null; + if (rating case Present(:final value)) { + json[r'rating'] = value; } - if (this.takenAfter != null) { - json[r'takenAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.takenAfter!.millisecondsSinceEpoch - : this.takenAfter!.toUtc().toIso8601String(); - } else { - // json[r'takenAfter'] = null; + if (state case Present(:final value)) { + json[r'state'] = value; } - if (this.takenBefore != null) { - json[r'takenBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.takenBefore!.millisecondsSinceEpoch - : this.takenBefore!.toUtc().toIso8601String(); - } else { - // json[r'takenBefore'] = null; + if (tagIds case Present(:final value)) { + json[r'tagIds'] = value; } - if (this.trashedAfter != null) { - json[r'trashedAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.trashedAfter!.millisecondsSinceEpoch - : this.trashedAfter!.toUtc().toIso8601String(); - } else { - // json[r'trashedAfter'] = null; + if (takenAfter case Present(:final value)) { + json[r'takenAfter'] = value.toUtc().toIso8601String(); } - if (this.trashedBefore != null) { - json[r'trashedBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.trashedBefore!.millisecondsSinceEpoch - : this.trashedBefore!.toUtc().toIso8601String(); - } else { - // json[r'trashedBefore'] = null; + if (takenBefore case Present(:final value)) { + json[r'takenBefore'] = value.toUtc().toIso8601String(); } - if (this.type != null) { - json[r'type'] = this.type; - } else { - // json[r'type'] = null; + if (trashedAfter case Present(:final value)) { + json[r'trashedAfter'] = value.toUtc().toIso8601String(); } - if (this.updatedAfter != null) { - json[r'updatedAfter'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAfter!.millisecondsSinceEpoch - : this.updatedAfter!.toUtc().toIso8601String(); - } else { - // json[r'updatedAfter'] = null; + if (trashedBefore case Present(:final value)) { + json[r'trashedBefore'] = value.toUtc().toIso8601String(); } - if (this.updatedBefore != null) { - json[r'updatedBefore'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedBefore!.millisecondsSinceEpoch - : this.updatedBefore!.toUtc().toIso8601String(); - } else { - // json[r'updatedBefore'] = null; + if (type case Present(:final value)) { + json[r'type'] = value.toJson(); } - if (this.visibility != null) { - json[r'visibility'] = this.visibility; - } else { - // json[r'visibility'] = null; + if (updatedAfter case Present(:final value)) { + json[r'updatedAfter'] = value.toUtc().toIso8601String(); + } + if (updatedBefore case Present(:final value)) { + json[r'updatedBefore'] = value.toUtc().toIso8601String(); + } + if (visibility case Present(:final value)) { + json[r'visibility'] = value.toJson(); } return json; } - /// Returns a new [StatisticsSearchDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static StatisticsSearchDto? fromJson(dynamic value) { - upgradeDto(value, "StatisticsSearchDto"); - if (value is Map) { - final json = value.cast(); - - return StatisticsSearchDto( - albumIds: json[r'albumIds'] is Iterable - ? (json[r'albumIds'] as Iterable).cast().toList(growable: false) - : const [], - city: mapValueOfType(json, r'city'), - country: mapValueOfType(json, r'country'), - createdAfter: mapDateTime(json, r'createdAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - createdBefore: mapDateTime(json, r'createdBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - description: mapValueOfType(json, r'description'), - isEncoded: mapValueOfType(json, r'isEncoded'), - isFavorite: mapValueOfType(json, r'isFavorite'), - isMotion: mapValueOfType(json, r'isMotion'), - isNotInAlbum: mapValueOfType(json, r'isNotInAlbum'), - isOffline: mapValueOfType(json, r'isOffline'), - lensModel: mapValueOfType(json, r'lensModel'), - libraryId: mapValueOfType(json, r'libraryId'), - make: mapValueOfType(json, r'make'), - model: mapValueOfType(json, r'model'), - ocr: mapValueOfType(json, r'ocr'), - personIds: json[r'personIds'] is Iterable - ? (json[r'personIds'] as Iterable).cast().toList(growable: false) - : const [], - rating: mapValueOfType(json, r'rating'), - state: mapValueOfType(json, r'state'), - tagIds: json[r'tagIds'] is Iterable - ? (json[r'tagIds'] as Iterable).cast().toList(growable: false) - : const [], - takenAfter: mapDateTime(json, r'takenAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - takenBefore: mapDateTime(json, r'takenBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - trashedAfter: mapDateTime(json, r'trashedAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - trashedBefore: mapDateTime(json, r'trashedBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - type: AssetTypeEnum.fromJson(json[r'type']), - updatedAfter: mapDateTime(json, r'updatedAfter', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - updatedBefore: mapDateTime(json, r'updatedBefore', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - visibility: AssetVisibility.fromJson(json[r'visibility']), - ); - } - return null; + StatisticsSearchDto copyWith({ + Optional>? albumIds, + Optional? city, + Optional? country, + Optional? createdAfter, + Optional? createdBefore, + Optional? description, + Optional? isEncoded, + Optional? isFavorite, + Optional? isMotion, + Optional? isNotInAlbum, + Optional? isOffline, + Optional? lensModel, + Optional? libraryId, + Optional? make, + Optional? model, + Optional? ocr, + Optional>? personIds, + Optional? rating, + Optional? state, + Optional?>? tagIds, + Optional? takenAfter, + Optional? takenBefore, + Optional? trashedAfter, + Optional? trashedBefore, + Optional? type, + Optional? updatedAfter, + Optional? updatedBefore, + Optional? visibility, + }) { + return .new( + albumIds: albumIds ?? this.albumIds, + city: city ?? this.city, + country: country ?? this.country, + createdAfter: createdAfter ?? this.createdAfter, + createdBefore: createdBefore ?? this.createdBefore, + description: description ?? this.description, + isEncoded: isEncoded ?? this.isEncoded, + isFavorite: isFavorite ?? this.isFavorite, + isMotion: isMotion ?? this.isMotion, + isNotInAlbum: isNotInAlbum ?? this.isNotInAlbum, + isOffline: isOffline ?? this.isOffline, + lensModel: lensModel ?? this.lensModel, + libraryId: libraryId ?? this.libraryId, + make: make ?? this.make, + model: model ?? this.model, + ocr: ocr ?? this.ocr, + personIds: personIds ?? this.personIds, + rating: rating ?? this.rating, + state: state ?? this.state, + tagIds: tagIds ?? this.tagIds, + takenAfter: takenAfter ?? this.takenAfter, + takenBefore: takenBefore ?? this.takenBefore, + trashedAfter: trashedAfter ?? this.trashedAfter, + trashedBefore: trashedBefore ?? this.trashedBefore, + type: type ?? this.type, + updatedAfter: updatedAfter ?? this.updatedAfter, + updatedBefore: updatedBefore ?? this.updatedBefore, + visibility: visibility ?? this.visibility, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = StatisticsSearchDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is StatisticsSearchDto && + albumIds == other.albumIds && + city == other.city && + country == other.country && + createdAfter == other.createdAfter && + createdBefore == other.createdBefore && + description == other.description && + isEncoded == other.isEncoded && + isFavorite == other.isFavorite && + isMotion == other.isMotion && + isNotInAlbum == other.isNotInAlbum && + isOffline == other.isOffline && + lensModel == other.lensModel && + libraryId == other.libraryId && + make == other.make && + model == other.model && + ocr == other.ocr && + personIds == other.personIds && + rating == other.rating && + state == other.state && + tagIds == other.tagIds && + takenAfter == other.takenAfter && + takenBefore == other.takenBefore && + trashedAfter == other.trashedAfter && + trashedBefore == other.trashedBefore && + type == other.type && + updatedAfter == other.updatedAfter && + updatedBefore == other.updatedBefore && + visibility == other.visibility); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = StatisticsSearchDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + albumIds, + city, + country, + createdAfter, + createdBefore, + description, + isEncoded, + isFavorite, + isMotion, + isNotInAlbum, + isOffline, + lensModel, + libraryId, + make, + model, + ocr, + personIds, + rating, + state, + tagIds, + takenAfter, + takenBefore, + trashedAfter, + trashedBefore, + type, + updatedAfter, + updatedBefore, + visibility, + ]); } - // maps a json object with a list of StatisticsSearchDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = StatisticsSearchDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'StatisticsSearchDto(albumIds=$albumIds, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, description=$description, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, ocr=$ocr, personIds=$personIds, rating=$rating, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, visibility=$visibility)'; } - diff --git a/mobile/openapi/lib/model/storage_folder.dart b/mobile/openapi/lib/model/storage_folder.dart index 8579d48f28..db8bb17c01 100644 --- a/mobile/openapi/lib/model/storage_folder.dart +++ b/mobile/openapi/lib/model/storage_folder.dart @@ -1,97 +1,32 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Storage folder -class StorageFolder { - /// Instantiate a new enum with the provided [value]. +enum StorageFolder { + encodedVideo._(r'encoded-video'), + library$._(r'library'), + upload._(r'upload'), + profile._(r'profile'), + thumbs._(r'thumbs'), + backups._(r'backups'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const StorageFolder._(this.value); - /// The underlying value of this enum member. final String value; + static StorageFolder? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const encodedVideo = StorageFolder._(r'encoded-video'); - static const library_ = StorageFolder._(r'library'); - static const upload = StorageFolder._(r'upload'); - static const profile = StorageFolder._(r'profile'); - static const thumbs = StorageFolder._(r'thumbs'); - static const backups = StorageFolder._(r'backups'); - - /// List of all possible values in this [enum][StorageFolder]. - static const values = [ - encodedVideo, - library_, - upload, - profile, - thumbs, - backups, - ]; - - static StorageFolder? fromJson(dynamic value) => StorageFolderTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = StorageFolder.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [StorageFolder] to String, -/// and [decode] dynamic data back to [StorageFolder]. -class StorageFolderTypeTransformer { - factory StorageFolderTypeTransformer() => _instance ??= const StorageFolderTypeTransformer._(); - - const StorageFolderTypeTransformer._(); - - String encode(StorageFolder data) => data.value; - - /// Decodes a [dynamic value][data] to a StorageFolder. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - StorageFolder? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'encoded-video': return StorageFolder.encodedVideo; - case r'library': return StorageFolder.library_; - case r'upload': return StorageFolder.upload; - case r'profile': return StorageFolder.profile; - case r'thumbs': return StorageFolder.thumbs; - case r'backups': return StorageFolder.backups; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [StorageFolderTypeTransformer] instance. - static StorageFolderTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/sync_ack_delete_dto.dart b/mobile/openapi/lib/model/sync_ack_delete_dto.dart index b72ae8c5a6..642a2e229d 100644 --- a/mobile/openapi/lib/model/sync_ack_delete_dto.dart +++ b/mobile/openapi/lib/model/sync_ack_delete_dto.dart @@ -1,99 +1,48 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAckDeleteDto { - /// Returns a new [SyncAckDeleteDto] instance. - SyncAckDeleteDto({ - this.types = const [], - }); +final class SyncAckDeleteDto { + const SyncAckDeleteDto({this.types = const Optional.absent()}); /// Sync entity types to delete acks for - List types; + final Optional> types; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAckDeleteDto && - _deepEquality.equals(other.types, types); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (types.hashCode); - - @override - String toString() => 'SyncAckDeleteDto[types=$types]'; + static SyncAckDeleteDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + types: json.containsKey(r'types') + ? Optional.present( + ((json[r'types'] as List?)?.map(($e) => (SyncEntityType.fromJson($e))!).toList(growable: false))!, + ) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'types'] = this.types; + if (types case Present(:final value)) { + json[r'types'] = value.map(($e) => $e.toJson()).toList(growable: false); + } return json; } - /// Returns a new [SyncAckDeleteDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAckDeleteDto? fromJson(dynamic value) { - upgradeDto(value, "SyncAckDeleteDto"); - if (value is Map) { - final json = value.cast(); - - return SyncAckDeleteDto( - types: SyncEntityType.listFromJson(json[r'types']), - ); - } - return null; + SyncAckDeleteDto copyWith({Optional>? types}) { + return .new(types: types ?? this.types); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAckDeleteDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncAckDeleteDto && types == other.types); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAckDeleteDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([types]); } - // maps a json object with a list of SyncAckDeleteDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAckDeleteDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'SyncAckDeleteDto(types=$types)'; } - diff --git a/mobile/openapi/lib/model/sync_ack_dto.dart b/mobile/openapi/lib/model/sync_ack_dto.dart index fa7e20a832..5ead392660 100644 --- a/mobile/openapi/lib/model/sync_ack_dto.dart +++ b/mobile/openapi/lib/model/sync_ack_dto.dart @@ -1,108 +1,43 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAckDto { - /// Returns a new [SyncAckDto] instance. - SyncAckDto({ - required this.ack, - required this.type, - }); +final class SyncAckDto { + const SyncAckDto({required this.ack, required this.type}); /// Acknowledgment ID - String ack; + final String ack; - SyncEntityType type; + final SyncEntityType type; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAckDto && - other.ack == ack && - other.type == type; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (ack.hashCode) + - (type.hashCode); - - @override - String toString() => 'SyncAckDto[ack=$ack, type=$type]'; + static SyncAckDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(ack: json[r'ack'] as String, type: (SyncEntityType.fromJson(json[r'type']))!); + } Map toJson() { final json = {}; - json[r'ack'] = this.ack; - json[r'type'] = this.type; + json[r'ack'] = ack; + json[r'type'] = type.toJson(); return json; } - /// Returns a new [SyncAckDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAckDto? fromJson(dynamic value) { - upgradeDto(value, "SyncAckDto"); - if (value is Map) { - final json = value.cast(); - - return SyncAckDto( - ack: mapValueOfType(json, r'ack')!, - type: SyncEntityType.fromJson(json[r'type'])!, - ); - } - return null; + SyncAckDto copyWith({String? ack, SyncEntityType? type}) { + return .new(ack: ack ?? this.ack, type: type ?? this.type); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAckDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncAckDto && ack == other.ack && type == other.type); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAckDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ack, type]); } - // maps a json object with a list of SyncAckDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAckDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'ack', - 'type', - }; + @override + String toString() => 'SyncAckDto(ack=$ack, type=$type)'; } - diff --git a/mobile/openapi/lib/model/sync_ack_set_dto.dart b/mobile/openapi/lib/model/sync_ack_set_dto.dart index 531a9dc763..33c643b78e 100644 --- a/mobile/openapi/lib/model/sync_ack_set_dto.dart +++ b/mobile/openapi/lib/model/sync_ack_set_dto.dart @@ -1,102 +1,41 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAckSetDto { - /// Returns a new [SyncAckSetDto] instance. - SyncAckSetDto({ - this.acks = const [], - }); +final class SyncAckSetDto { + const SyncAckSetDto({required this.acks}); /// Acknowledgment IDs (max 1000) - List acks; + final List acks; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAckSetDto && - _deepEquality.equals(other.acks, acks); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (acks.hashCode); - - @override - String toString() => 'SyncAckSetDto[acks=$acks]'; + static SyncAckSetDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(acks: ((json[r'acks'] as List?)?.map(($e) => $e as String).toList(growable: false))!); + } Map toJson() { final json = {}; - json[r'acks'] = this.acks; + json[r'acks'] = acks; return json; } - /// Returns a new [SyncAckSetDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAckSetDto? fromJson(dynamic value) { - upgradeDto(value, "SyncAckSetDto"); - if (value is Map) { - final json = value.cast(); - - return SyncAckSetDto( - acks: json[r'acks'] is Iterable - ? (json[r'acks'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + SyncAckSetDto copyWith({List? acks}) { + return .new(acks: acks ?? this.acks); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAckSetDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAckSetDto && const DeepCollectionEquality().equals(acks, other.acks)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAckSetDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(acks)]); } - // maps a json object with a list of SyncAckSetDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAckSetDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'acks', - }; + @override + String toString() => 'SyncAckSetDto(acks=$acks)'; } - diff --git a/mobile/openapi/lib/model/sync_ack_v1.dart b/mobile/openapi/lib/model/sync_ack_v1.dart new file mode 100644 index 0000000000..821d85466a --- /dev/null +++ b/mobile/openapi/lib/model/sync_ack_v1.dart @@ -0,0 +1,36 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +part of openapi.api; + +final class SyncAckV1 { + const SyncAckV1(); + + static SyncAckV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(); + } + + Map toJson() { + final json = {}; + return json; + } + + SyncAckV1 copyWith() { + return .new(); + } + + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncAckV1); + } + + @override + int get hashCode { + return runtimeType.hashCode; + } + + @override + String toString() => 'SyncAckV1()'; +} diff --git a/mobile/openapi/lib/model/sync_album_delete_v1.dart b/mobile/openapi/lib/model/sync_album_delete_v1.dart index a6fdf5c68c..067f631058 100644 --- a/mobile/openapi/lib/model/sync_album_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_album_delete_v1.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAlbumDeleteV1 { - /// Returns a new [SyncAlbumDeleteV1] instance. - SyncAlbumDeleteV1({ - required this.albumId, - }); +final class SyncAlbumDeleteV1 { + const SyncAlbumDeleteV1({required this.albumId}); /// Album ID - String albumId; + final String albumId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAlbumDeleteV1 && - other.albumId == albumId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumId.hashCode); - - @override - String toString() => 'SyncAlbumDeleteV1[albumId=$albumId]'; + static SyncAlbumDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(albumId: json[r'albumId'] as String); + } Map toJson() { final json = {}; - json[r'albumId'] = this.albumId; + json[r'albumId'] = albumId; return json; } - /// Returns a new [SyncAlbumDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAlbumDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAlbumDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAlbumDeleteV1( - albumId: mapValueOfType(json, r'albumId')!, - ); - } - return null; + SyncAlbumDeleteV1 copyWith({String? albumId}) { + return .new(albumId: albumId ?? this.albumId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAlbumDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncAlbumDeleteV1 && albumId == other.albumId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAlbumDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumId]); } - // maps a json object with a list of SyncAlbumDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAlbumDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumId', - }; + @override + String toString() => 'SyncAlbumDeleteV1(albumId=$albumId)'; } - diff --git a/mobile/openapi/lib/model/sync_album_to_asset_delete_v1.dart b/mobile/openapi/lib/model/sync_album_to_asset_delete_v1.dart index 08952b90ed..d1c76cb7f6 100644 --- a/mobile/openapi/lib/model/sync_album_to_asset_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_album_to_asset_delete_v1.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAlbumToAssetDeleteV1 { - /// Returns a new [SyncAlbumToAssetDeleteV1] instance. - SyncAlbumToAssetDeleteV1({ - required this.albumId, - required this.assetId, - }); +final class SyncAlbumToAssetDeleteV1 { + const SyncAlbumToAssetDeleteV1({required this.albumId, required this.assetId}); /// Album ID - String albumId; + final String albumId; /// Asset ID - String assetId; + final String assetId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAlbumToAssetDeleteV1 && - other.albumId == albumId && - other.assetId == assetId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumId.hashCode) + - (assetId.hashCode); - - @override - String toString() => 'SyncAlbumToAssetDeleteV1[albumId=$albumId, assetId=$assetId]'; + static SyncAlbumToAssetDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(albumId: json[r'albumId'] as String, assetId: json[r'assetId'] as String); + } Map toJson() { final json = {}; - json[r'albumId'] = this.albumId; - json[r'assetId'] = this.assetId; + json[r'albumId'] = albumId; + json[r'assetId'] = assetId; return json; } - /// Returns a new [SyncAlbumToAssetDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAlbumToAssetDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAlbumToAssetDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAlbumToAssetDeleteV1( - albumId: mapValueOfType(json, r'albumId')!, - assetId: mapValueOfType(json, r'assetId')!, - ); - } - return null; + SyncAlbumToAssetDeleteV1 copyWith({String? albumId, String? assetId}) { + return .new(albumId: albumId ?? this.albumId, assetId: assetId ?? this.assetId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAlbumToAssetDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAlbumToAssetDeleteV1 && albumId == other.albumId && assetId == other.assetId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAlbumToAssetDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumId, assetId]); } - // maps a json object with a list of SyncAlbumToAssetDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAlbumToAssetDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumId', - 'assetId', - }; + @override + String toString() => 'SyncAlbumToAssetDeleteV1(albumId=$albumId, assetId=$assetId)'; } - diff --git a/mobile/openapi/lib/model/sync_album_to_asset_v1.dart b/mobile/openapi/lib/model/sync_album_to_asset_v1.dart index 5f38b35088..7137dda90f 100644 --- a/mobile/openapi/lib/model/sync_album_to_asset_v1.dart +++ b/mobile/openapi/lib/model/sync_album_to_asset_v1.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAlbumToAssetV1 { - /// Returns a new [SyncAlbumToAssetV1] instance. - SyncAlbumToAssetV1({ - required this.albumId, - required this.assetId, - }); +final class SyncAlbumToAssetV1 { + const SyncAlbumToAssetV1({required this.albumId, required this.assetId}); /// Album ID - String albumId; + final String albumId; /// Asset ID - String assetId; + final String assetId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAlbumToAssetV1 && - other.albumId == albumId && - other.assetId == assetId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumId.hashCode) + - (assetId.hashCode); - - @override - String toString() => 'SyncAlbumToAssetV1[albumId=$albumId, assetId=$assetId]'; + static SyncAlbumToAssetV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(albumId: json[r'albumId'] as String, assetId: json[r'assetId'] as String); + } Map toJson() { final json = {}; - json[r'albumId'] = this.albumId; - json[r'assetId'] = this.assetId; + json[r'albumId'] = albumId; + json[r'assetId'] = assetId; return json; } - /// Returns a new [SyncAlbumToAssetV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAlbumToAssetV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAlbumToAssetV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAlbumToAssetV1( - albumId: mapValueOfType(json, r'albumId')!, - assetId: mapValueOfType(json, r'assetId')!, - ); - } - return null; + SyncAlbumToAssetV1 copyWith({String? albumId, String? assetId}) { + return .new(albumId: albumId ?? this.albumId, assetId: assetId ?? this.assetId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAlbumToAssetV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAlbumToAssetV1 && albumId == other.albumId && assetId == other.assetId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAlbumToAssetV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumId, assetId]); } - // maps a json object with a list of SyncAlbumToAssetV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAlbumToAssetV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumId', - 'assetId', - }; + @override + String toString() => 'SyncAlbumToAssetV1(albumId=$albumId, assetId=$assetId)'; } - diff --git a/mobile/openapi/lib/model/sync_album_user_delete_v1.dart b/mobile/openapi/lib/model/sync_album_user_delete_v1.dart index 526bcc6b6e..47889cdeb4 100644 --- a/mobile/openapi/lib/model/sync_album_user_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_album_user_delete_v1.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAlbumUserDeleteV1 { - /// Returns a new [SyncAlbumUserDeleteV1] instance. - SyncAlbumUserDeleteV1({ - required this.albumId, - required this.userId, - }); +final class SyncAlbumUserDeleteV1 { + const SyncAlbumUserDeleteV1({required this.albumId, required this.userId}); /// Album ID - String albumId; + final String albumId; /// User ID - String userId; + final String userId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAlbumUserDeleteV1 && - other.albumId == albumId && - other.userId == userId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumId.hashCode) + - (userId.hashCode); - - @override - String toString() => 'SyncAlbumUserDeleteV1[albumId=$albumId, userId=$userId]'; + static SyncAlbumUserDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(albumId: json[r'albumId'] as String, userId: json[r'userId'] as String); + } Map toJson() { final json = {}; - json[r'albumId'] = this.albumId; - json[r'userId'] = this.userId; + json[r'albumId'] = albumId; + json[r'userId'] = userId; return json; } - /// Returns a new [SyncAlbumUserDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAlbumUserDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAlbumUserDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAlbumUserDeleteV1( - albumId: mapValueOfType(json, r'albumId')!, - userId: mapValueOfType(json, r'userId')!, - ); - } - return null; + SyncAlbumUserDeleteV1 copyWith({String? albumId, String? userId}) { + return .new(albumId: albumId ?? this.albumId, userId: userId ?? this.userId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAlbumUserDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAlbumUserDeleteV1 && albumId == other.albumId && userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAlbumUserDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumId, userId]); } - // maps a json object with a list of SyncAlbumUserDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAlbumUserDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumId', - 'userId', - }; + @override + String toString() => 'SyncAlbumUserDeleteV1(albumId=$albumId, userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/sync_album_user_v1.dart b/mobile/openapi/lib/model/sync_album_user_v1.dart index 1efe7da029..e49beb172f 100644 --- a/mobile/openapi/lib/model/sync_album_user_v1.dart +++ b/mobile/openapi/lib/model/sync_album_user_v1.dart @@ -1,117 +1,52 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAlbumUserV1 { - /// Returns a new [SyncAlbumUserV1] instance. - SyncAlbumUserV1({ - required this.albumId, - required this.role, - required this.userId, - }); +final class SyncAlbumUserV1 { + const SyncAlbumUserV1({required this.albumId, required this.role, required this.userId}); /// Album ID - String albumId; + final String albumId; - AlbumUserRole role; + final AlbumUserRole role; /// User ID - String userId; + final String userId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAlbumUserV1 && - other.albumId == albumId && - other.role == role && - other.userId == userId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumId.hashCode) + - (role.hashCode) + - (userId.hashCode); - - @override - String toString() => 'SyncAlbumUserV1[albumId=$albumId, role=$role, userId=$userId]'; + static SyncAlbumUserV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumId: json[r'albumId'] as String, + role: (AlbumUserRole.fromJson(json[r'role']))!, + userId: json[r'userId'] as String, + ); + } Map toJson() { final json = {}; - json[r'albumId'] = this.albumId; - json[r'role'] = this.role; - json[r'userId'] = this.userId; + json[r'albumId'] = albumId; + json[r'role'] = role.toJson(); + json[r'userId'] = userId; return json; } - /// Returns a new [SyncAlbumUserV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAlbumUserV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAlbumUserV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAlbumUserV1( - albumId: mapValueOfType(json, r'albumId')!, - role: AlbumUserRole.fromJson(json[r'role'])!, - userId: mapValueOfType(json, r'userId')!, - ); - } - return null; + SyncAlbumUserV1 copyWith({String? albumId, AlbumUserRole? role, String? userId}) { + return .new(albumId: albumId ?? this.albumId, role: role ?? this.role, userId: userId ?? this.userId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAlbumUserV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAlbumUserV1 && albumId == other.albumId && role == other.role && userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAlbumUserV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumId, role, userId]); } - // maps a json object with a list of SyncAlbumUserV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAlbumUserV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumId', - 'role', - 'userId', - }; + @override + String toString() => 'SyncAlbumUserV1(albumId=$albumId, role=$role, userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/sync_album_v1.dart b/mobile/openapi/lib/model/sync_album_v1.dart index 17b2bda02b..5d282cd054 100644 --- a/mobile/openapi/lib/model/sync_album_v1.dart +++ b/mobile/openapi/lib/model/sync_album_v1.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAlbumV1 { - /// Returns a new [SyncAlbumV1] instance. - SyncAlbumV1({ +final class SyncAlbumV1 { + const SyncAlbumV1({ required this.createdAt, required this.description, required this.id, @@ -25,155 +16,121 @@ class SyncAlbumV1 { }); /// Created at - DateTime createdAt; + final DateTime createdAt; /// Album description - String description; + final String description; /// Album ID - String id; + final String id; /// Is activity enabled - bool isActivityEnabled; + final bool isActivityEnabled; /// Album name - String name; + final String name; - AssetOrder order; + final AssetOrder order; /// Owner ID - String ownerId; + final String ownerId; /// Thumbnail asset ID - String? thumbnailAssetId; + final String? thumbnailAssetId; /// Updated at - DateTime updatedAt; + final DateTime updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAlbumV1 && - other.createdAt == createdAt && - other.description == description && - other.id == id && - other.isActivityEnabled == isActivityEnabled && - other.name == name && - other.order == order && - other.ownerId == ownerId && - other.thumbnailAssetId == thumbnailAssetId && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (createdAt.hashCode) + - (description.hashCode) + - (id.hashCode) + - (isActivityEnabled.hashCode) + - (name.hashCode) + - (order.hashCode) + - (ownerId.hashCode) + - (thumbnailAssetId == null ? 0 : thumbnailAssetId!.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'SyncAlbumV1[createdAt=$createdAt, description=$description, id=$id, isActivityEnabled=$isActivityEnabled, name=$name, order=$order, ownerId=$ownerId, thumbnailAssetId=$thumbnailAssetId, updatedAt=$updatedAt]'; + static SyncAlbumV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + createdAt: DateTime.parse(json[r'createdAt'] as String), + description: json[r'description'] as String, + id: json[r'id'] as String, + isActivityEnabled: json[r'isActivityEnabled'] as bool, + name: json[r'name'] as String, + order: (AssetOrder.fromJson(json[r'order']))!, + ownerId: json[r'ownerId'] as String, + thumbnailAssetId: (json[r'thumbnailAssetId'] as String?), + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + ); + } Map toJson() { final json = {}; - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - json[r'description'] = this.description; - json[r'id'] = this.id; - json[r'isActivityEnabled'] = this.isActivityEnabled; - json[r'name'] = this.name; - json[r'order'] = this.order; - json[r'ownerId'] = this.ownerId; - if (this.thumbnailAssetId != null) { - json[r'thumbnailAssetId'] = this.thumbnailAssetId; - } else { - // json[r'thumbnailAssetId'] = null; + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + json[r'description'] = description; + json[r'id'] = id; + json[r'isActivityEnabled'] = isActivityEnabled; + json[r'name'] = name; + json[r'order'] = order.toJson(); + json[r'ownerId'] = ownerId; + if (thumbnailAssetId != null) { + json[r'thumbnailAssetId'] = thumbnailAssetId!; } - json[r'updatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAt.millisecondsSinceEpoch - : this.updatedAt.toUtc().toIso8601String(); + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); return json; } - /// Returns a new [SyncAlbumV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAlbumV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAlbumV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAlbumV1( - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - description: mapValueOfType(json, r'description')!, - id: mapValueOfType(json, r'id')!, - isActivityEnabled: mapValueOfType(json, r'isActivityEnabled')!, - name: mapValueOfType(json, r'name')!, - order: AssetOrder.fromJson(json[r'order'])!, - ownerId: mapValueOfType(json, r'ownerId')!, - thumbnailAssetId: mapValueOfType(json, r'thumbnailAssetId'), - updatedAt: mapDateTime(json, r'updatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ); - } - return null; + SyncAlbumV1 copyWith({ + DateTime? createdAt, + String? description, + String? id, + bool? isActivityEnabled, + String? name, + AssetOrder? order, + String? ownerId, + Object? thumbnailAssetId = _undefined, + DateTime? updatedAt, + }) { + return .new( + createdAt: createdAt ?? this.createdAt, + description: description ?? this.description, + id: id ?? this.id, + isActivityEnabled: isActivityEnabled ?? this.isActivityEnabled, + name: name ?? this.name, + order: order ?? this.order, + ownerId: ownerId ?? this.ownerId, + thumbnailAssetId: identical(thumbnailAssetId, _undefined) ? this.thumbnailAssetId : thumbnailAssetId as String?, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAlbumV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAlbumV1 && + createdAt == other.createdAt && + description == other.description && + id == other.id && + isActivityEnabled == other.isActivityEnabled && + name == other.name && + order == other.order && + ownerId == other.ownerId && + thumbnailAssetId == other.thumbnailAssetId && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAlbumV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + createdAt, + description, + id, + isActivityEnabled, + name, + order, + ownerId, + thumbnailAssetId, + updatedAt, + ]); } - // maps a json object with a list of SyncAlbumV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAlbumV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'createdAt', - 'description', - 'id', - 'isActivityEnabled', - 'name', - 'order', - 'ownerId', - 'thumbnailAssetId', - 'updatedAt', - }; + @override + String toString() => + 'SyncAlbumV1(createdAt=$createdAt, description=$description, id=$id, isActivityEnabled=$isActivityEnabled, name=$name, order=$order, ownerId=$ownerId, thumbnailAssetId=$thumbnailAssetId, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/sync_album_v2.dart b/mobile/openapi/lib/model/sync_album_v2.dart index 67c65a190b..ea0bde6908 100644 --- a/mobile/openapi/lib/model/sync_album_v2.dart +++ b/mobile/openapi/lib/model/sync_album_v2.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAlbumV2 { - /// Returns a new [SyncAlbumV2] instance. - SyncAlbumV2({ +final class SyncAlbumV2 { + const SyncAlbumV2({ required this.createdAt, required this.description, required this.id, @@ -24,147 +15,103 @@ class SyncAlbumV2 { }); /// Created at - DateTime createdAt; + final DateTime createdAt; /// Album description - String description; + final String description; /// Album ID - String id; + final String id; /// Is activity enabled - bool isActivityEnabled; + final bool isActivityEnabled; /// Album name - String name; + final String name; - AssetOrder order; + final AssetOrder order; /// Thumbnail asset ID - String? thumbnailAssetId; + final String? thumbnailAssetId; /// Updated at - DateTime updatedAt; + final DateTime updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAlbumV2 && - other.createdAt == createdAt && - other.description == description && - other.id == id && - other.isActivityEnabled == isActivityEnabled && - other.name == name && - other.order == order && - other.thumbnailAssetId == thumbnailAssetId && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (createdAt.hashCode) + - (description.hashCode) + - (id.hashCode) + - (isActivityEnabled.hashCode) + - (name.hashCode) + - (order.hashCode) + - (thumbnailAssetId == null ? 0 : thumbnailAssetId!.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'SyncAlbumV2[createdAt=$createdAt, description=$description, id=$id, isActivityEnabled=$isActivityEnabled, name=$name, order=$order, thumbnailAssetId=$thumbnailAssetId, updatedAt=$updatedAt]'; + static SyncAlbumV2? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + createdAt: DateTime.parse(json[r'createdAt'] as String), + description: json[r'description'] as String, + id: json[r'id'] as String, + isActivityEnabled: json[r'isActivityEnabled'] as bool, + name: json[r'name'] as String, + order: (AssetOrder.fromJson(json[r'order']))!, + thumbnailAssetId: (json[r'thumbnailAssetId'] as String?), + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + ); + } Map toJson() { final json = {}; - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - json[r'description'] = this.description; - json[r'id'] = this.id; - json[r'isActivityEnabled'] = this.isActivityEnabled; - json[r'name'] = this.name; - json[r'order'] = this.order; - if (this.thumbnailAssetId != null) { - json[r'thumbnailAssetId'] = this.thumbnailAssetId; - } else { - // json[r'thumbnailAssetId'] = null; + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + json[r'description'] = description; + json[r'id'] = id; + json[r'isActivityEnabled'] = isActivityEnabled; + json[r'name'] = name; + json[r'order'] = order.toJson(); + if (thumbnailAssetId != null) { + json[r'thumbnailAssetId'] = thumbnailAssetId!; } - json[r'updatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAt.millisecondsSinceEpoch - : this.updatedAt.toUtc().toIso8601String(); + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); return json; } - /// Returns a new [SyncAlbumV2] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAlbumV2? fromJson(dynamic value) { - upgradeDto(value, "SyncAlbumV2"); - if (value is Map) { - final json = value.cast(); - - return SyncAlbumV2( - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - description: mapValueOfType(json, r'description')!, - id: mapValueOfType(json, r'id')!, - isActivityEnabled: mapValueOfType(json, r'isActivityEnabled')!, - name: mapValueOfType(json, r'name')!, - order: AssetOrder.fromJson(json[r'order'])!, - thumbnailAssetId: mapValueOfType(json, r'thumbnailAssetId'), - updatedAt: mapDateTime(json, r'updatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ); - } - return null; + SyncAlbumV2 copyWith({ + DateTime? createdAt, + String? description, + String? id, + bool? isActivityEnabled, + String? name, + AssetOrder? order, + Object? thumbnailAssetId = _undefined, + DateTime? updatedAt, + }) { + return .new( + createdAt: createdAt ?? this.createdAt, + description: description ?? this.description, + id: id ?? this.id, + isActivityEnabled: isActivityEnabled ?? this.isActivityEnabled, + name: name ?? this.name, + order: order ?? this.order, + thumbnailAssetId: identical(thumbnailAssetId, _undefined) ? this.thumbnailAssetId : thumbnailAssetId as String?, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAlbumV2.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAlbumV2 && + createdAt == other.createdAt && + description == other.description && + id == other.id && + isActivityEnabled == other.isActivityEnabled && + name == other.name && + order == other.order && + thumbnailAssetId == other.thumbnailAssetId && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAlbumV2.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([createdAt, description, id, isActivityEnabled, name, order, thumbnailAssetId, updatedAt]); } - // maps a json object with a list of SyncAlbumV2-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAlbumV2.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'createdAt', - 'description', - 'id', - 'isActivityEnabled', - 'name', - 'order', - 'thumbnailAssetId', - 'updatedAt', - }; + @override + String toString() => + 'SyncAlbumV2(createdAt=$createdAt, description=$description, id=$id, isActivityEnabled=$isActivityEnabled, name=$name, order=$order, thumbnailAssetId=$thumbnailAssetId, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/sync_asset_delete_v1.dart b/mobile/openapi/lib/model/sync_asset_delete_v1.dart index 1d5a947774..daadc5d3bb 100644 --- a/mobile/openapi/lib/model/sync_asset_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_asset_delete_v1.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAssetDeleteV1 { - /// Returns a new [SyncAssetDeleteV1] instance. - SyncAssetDeleteV1({ - required this.assetId, - }); +final class SyncAssetDeleteV1 { + const SyncAssetDeleteV1({required this.assetId}); /// Asset ID - String assetId; + final String assetId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAssetDeleteV1 && - other.assetId == assetId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode); - - @override - String toString() => 'SyncAssetDeleteV1[assetId=$assetId]'; + static SyncAssetDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(assetId: json[r'assetId'] as String); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; + json[r'assetId'] = assetId; return json; } - /// Returns a new [SyncAssetDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAssetDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAssetDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAssetDeleteV1( - assetId: mapValueOfType(json, r'assetId')!, - ); - } - return null; + SyncAssetDeleteV1 copyWith({String? assetId}) { + return .new(assetId: assetId ?? this.assetId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAssetDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncAssetDeleteV1 && assetId == other.assetId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAssetDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId]); } - // maps a json object with a list of SyncAssetDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAssetDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - }; + @override + String toString() => 'SyncAssetDeleteV1(assetId=$assetId)'; } - diff --git a/mobile/openapi/lib/model/sync_asset_edit_delete_v1.dart b/mobile/openapi/lib/model/sync_asset_edit_delete_v1.dart index e0c98bfef3..a0683aba4a 100644 --- a/mobile/openapi/lib/model/sync_asset_edit_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_asset_edit_delete_v1.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAssetEditDeleteV1 { - /// Returns a new [SyncAssetEditDeleteV1] instance. - SyncAssetEditDeleteV1({ - required this.editId, - }); +final class SyncAssetEditDeleteV1 { + const SyncAssetEditDeleteV1({required this.editId}); /// Edit ID - String editId; + final String editId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAssetEditDeleteV1 && - other.editId == editId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (editId.hashCode); - - @override - String toString() => 'SyncAssetEditDeleteV1[editId=$editId]'; + static SyncAssetEditDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(editId: json[r'editId'] as String); + } Map toJson() { final json = {}; - json[r'editId'] = this.editId; + json[r'editId'] = editId; return json; } - /// Returns a new [SyncAssetEditDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAssetEditDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAssetEditDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAssetEditDeleteV1( - editId: mapValueOfType(json, r'editId')!, - ); - } - return null; + SyncAssetEditDeleteV1 copyWith({String? editId}) { + return .new(editId: editId ?? this.editId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAssetEditDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncAssetEditDeleteV1 && editId == other.editId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAssetEditDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([editId]); } - // maps a json object with a list of SyncAssetEditDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAssetEditDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'editId', - }; + @override + String toString() => 'SyncAssetEditDeleteV1(editId=$editId)'; } - diff --git a/mobile/openapi/lib/model/sync_asset_edit_v1.dart b/mobile/openapi/lib/model/sync_asset_edit_v1.dart index 8acfad5f6a..7053ab3b48 100644 --- a/mobile/openapi/lib/model/sync_asset_edit_v1.dart +++ b/mobile/openapi/lib/model/sync_asset_edit_v1.dart @@ -1,138 +1,86 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAssetEditV1 { - /// Returns a new [SyncAssetEditV1] instance. - SyncAssetEditV1({ +final class SyncAssetEditV1 { + const SyncAssetEditV1({ required this.action, required this.assetId, required this.id, - this.parameters = const {}, + required this.parameters, required this.sequence, }); - AssetEditAction action; + final AssetEditAction action; /// Asset ID - String assetId; + final String assetId; /// Edit ID - String id; + final String id; /// Edit parameters - Map parameters; + final Map parameters; /// Edit sequence - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int sequence; + final int sequence; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAssetEditV1 && - other.action == action && - other.assetId == assetId && - other.id == id && - _deepEquality.equals(other.parameters, parameters) && - other.sequence == sequence; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (action.hashCode) + - (assetId.hashCode) + - (id.hashCode) + - (parameters.hashCode) + - (sequence.hashCode); - - @override - String toString() => 'SyncAssetEditV1[action=$action, assetId=$assetId, id=$id, parameters=$parameters, sequence=$sequence]'; + static SyncAssetEditV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + action: (AssetEditAction.fromJson(json[r'action']))!, + assetId: json[r'assetId'] as String, + id: json[r'id'] as String, + parameters: ((json[r'parameters'] as Map?)?.cast())!, + sequence: json[r'sequence'] as int, + ); + } Map toJson() { final json = {}; - json[r'action'] = this.action; - json[r'assetId'] = this.assetId; - json[r'id'] = this.id; - json[r'parameters'] = this.parameters; - json[r'sequence'] = this.sequence; + json[r'action'] = action.toJson(); + json[r'assetId'] = assetId; + json[r'id'] = id; + json[r'parameters'] = parameters; + json[r'sequence'] = sequence; return json; } - /// Returns a new [SyncAssetEditV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAssetEditV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAssetEditV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAssetEditV1( - action: AssetEditAction.fromJson(json[r'action'])!, - assetId: mapValueOfType(json, r'assetId')!, - id: mapValueOfType(json, r'id')!, - parameters: mapCastOfType(json, r'parameters')!, - sequence: mapValueOfType(json, r'sequence')!, - ); - } - return null; + SyncAssetEditV1 copyWith({ + AssetEditAction? action, + String? assetId, + String? id, + Map? parameters, + int? sequence, + }) { + return .new( + action: action ?? this.action, + assetId: assetId ?? this.assetId, + id: id ?? this.id, + parameters: parameters ?? this.parameters, + sequence: sequence ?? this.sequence, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAssetEditV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAssetEditV1 && + action == other.action && + assetId == other.assetId && + id == other.id && + const DeepCollectionEquality().equals(parameters, other.parameters) && + sequence == other.sequence); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAssetEditV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([action, assetId, id, const DeepCollectionEquality().hash(parameters), sequence]); } - // maps a json object with a list of SyncAssetEditV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAssetEditV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'action', - 'assetId', - 'id', - 'parameters', - 'sequence', - }; + @override + String toString() => + 'SyncAssetEditV1(action=$action, assetId=$assetId, id=$id, parameters=$parameters, sequence=$sequence)'; } - diff --git a/mobile/openapi/lib/model/sync_asset_exif_v1.dart b/mobile/openapi/lib/model/sync_asset_exif_v1.dart index caaeed7fb3..737c9ef668 100644 --- a/mobile/openapi/lib/model/sync_asset_exif_v1.dart +++ b/mobile/openapi/lib/model/sync_asset_exif_v1.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAssetExifV1 { - /// Returns a new [SyncAssetExifV1] instance. - SyncAssetExifV1({ +final class SyncAssetExifV1 { + const SyncAssetExifV1({ required this.assetId, required this.city, required this.country, @@ -41,391 +32,316 @@ class SyncAssetExifV1 { }); /// Asset ID - String assetId; + final String assetId; /// City - String? city; + final String? city; /// Country - String? country; + final String? country; /// Date time original - DateTime? dateTimeOriginal; + final DateTime? dateTimeOriginal; /// Description - String? description; + final String? description; /// Exif image height - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? exifImageHeight; + final int? exifImageHeight; /// Exif image width - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? exifImageWidth; + final int? exifImageWidth; /// Exposure time - String? exposureTime; + final String? exposureTime; /// F number - double? fNumber; + final double? fNumber; /// File size in byte - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? fileSizeInByte; + final int? fileSizeInByte; /// Focal length - double? focalLength; + final double? focalLength; /// FPS - double? fps; + final double? fps; /// ISO - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? iso; + final int? iso; /// Latitude - double? latitude; + final double? latitude; /// Lens model - String? lensModel; + final String? lensModel; /// Longitude - double? longitude; + final double? longitude; /// Make - String? make; + final String? make; /// Model - String? model; + final String? model; /// Modify date - DateTime? modifyDate; + final DateTime? modifyDate; /// Orientation - String? orientation; + final String? orientation; /// Profile description - String? profileDescription; + final String? profileDescription; /// Projection type - String? projectionType; + final String? projectionType; /// Rating - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? rating; + final int? rating; /// State - String? state; + final String? state; /// Time zone - String? timeZone; + final String? timeZone; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAssetExifV1 && - other.assetId == assetId && - other.city == city && - other.country == country && - other.dateTimeOriginal == dateTimeOriginal && - other.description == description && - other.exifImageHeight == exifImageHeight && - other.exifImageWidth == exifImageWidth && - other.exposureTime == exposureTime && - other.fNumber == fNumber && - other.fileSizeInByte == fileSizeInByte && - other.focalLength == focalLength && - other.fps == fps && - other.iso == iso && - other.latitude == latitude && - other.lensModel == lensModel && - other.longitude == longitude && - other.make == make && - other.model == model && - other.modifyDate == modifyDate && - other.orientation == orientation && - other.profileDescription == profileDescription && - other.projectionType == projectionType && - other.rating == rating && - other.state == state && - other.timeZone == timeZone; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (city == null ? 0 : city!.hashCode) + - (country == null ? 0 : country!.hashCode) + - (dateTimeOriginal == null ? 0 : dateTimeOriginal!.hashCode) + - (description == null ? 0 : description!.hashCode) + - (exifImageHeight == null ? 0 : exifImageHeight!.hashCode) + - (exifImageWidth == null ? 0 : exifImageWidth!.hashCode) + - (exposureTime == null ? 0 : exposureTime!.hashCode) + - (fNumber == null ? 0 : fNumber!.hashCode) + - (fileSizeInByte == null ? 0 : fileSizeInByte!.hashCode) + - (focalLength == null ? 0 : focalLength!.hashCode) + - (fps == null ? 0 : fps!.hashCode) + - (iso == null ? 0 : iso!.hashCode) + - (latitude == null ? 0 : latitude!.hashCode) + - (lensModel == null ? 0 : lensModel!.hashCode) + - (longitude == null ? 0 : longitude!.hashCode) + - (make == null ? 0 : make!.hashCode) + - (model == null ? 0 : model!.hashCode) + - (modifyDate == null ? 0 : modifyDate!.hashCode) + - (orientation == null ? 0 : orientation!.hashCode) + - (profileDescription == null ? 0 : profileDescription!.hashCode) + - (projectionType == null ? 0 : projectionType!.hashCode) + - (rating == null ? 0 : rating!.hashCode) + - (state == null ? 0 : state!.hashCode) + - (timeZone == null ? 0 : timeZone!.hashCode); - - @override - String toString() => 'SyncAssetExifV1[assetId=$assetId, city=$city, country=$country, dateTimeOriginal=$dateTimeOriginal, description=$description, exifImageHeight=$exifImageHeight, exifImageWidth=$exifImageWidth, exposureTime=$exposureTime, fNumber=$fNumber, fileSizeInByte=$fileSizeInByte, focalLength=$focalLength, fps=$fps, iso=$iso, latitude=$latitude, lensModel=$lensModel, longitude=$longitude, make=$make, model=$model, modifyDate=$modifyDate, orientation=$orientation, profileDescription=$profileDescription, projectionType=$projectionType, rating=$rating, state=$state, timeZone=$timeZone]'; + static SyncAssetExifV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetId: json[r'assetId'] as String, + city: (json[r'city'] as String?), + country: (json[r'country'] as String?), + dateTimeOriginal: (json[r'dateTimeOriginal'] == null + ? null + : DateTime.parse(json[r'dateTimeOriginal'] as String)), + description: (json[r'description'] as String?), + exifImageHeight: (json[r'exifImageHeight'] as int?), + exifImageWidth: (json[r'exifImageWidth'] as int?), + exposureTime: (json[r'exposureTime'] as String?), + fNumber: (json[r'fNumber'] as num?)?.toDouble(), + fileSizeInByte: (json[r'fileSizeInByte'] as int?), + focalLength: (json[r'focalLength'] as num?)?.toDouble(), + fps: (json[r'fps'] as num?)?.toDouble(), + iso: (json[r'iso'] as int?), + latitude: (json[r'latitude'] as num?)?.toDouble(), + lensModel: (json[r'lensModel'] as String?), + longitude: (json[r'longitude'] as num?)?.toDouble(), + make: (json[r'make'] as String?), + model: (json[r'model'] as String?), + modifyDate: (json[r'modifyDate'] == null ? null : DateTime.parse(json[r'modifyDate'] as String)), + orientation: (json[r'orientation'] as String?), + profileDescription: (json[r'profileDescription'] as String?), + projectionType: (json[r'projectionType'] as String?), + rating: (json[r'rating'] as int?), + state: (json[r'state'] as String?), + timeZone: (json[r'timeZone'] as String?), + ); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - if (this.city != null) { - json[r'city'] = this.city; - } else { - // json[r'city'] = null; + json[r'assetId'] = assetId; + if (city != null) { + json[r'city'] = city!; } - if (this.country != null) { - json[r'country'] = this.country; - } else { - // json[r'country'] = null; + if (country != null) { + json[r'country'] = country!; } - if (this.dateTimeOriginal != null) { - json[r'dateTimeOriginal'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.dateTimeOriginal!.millisecondsSinceEpoch - : this.dateTimeOriginal!.toUtc().toIso8601String(); - } else { - // json[r'dateTimeOriginal'] = null; + if (dateTimeOriginal != null) { + json[r'dateTimeOriginal'] = dateTimeOriginal!.toUtc().toIso8601String(); } - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (description != null) { + json[r'description'] = description!; } - if (this.exifImageHeight != null) { - json[r'exifImageHeight'] = this.exifImageHeight; - } else { - // json[r'exifImageHeight'] = null; + if (exifImageHeight != null) { + json[r'exifImageHeight'] = exifImageHeight!; } - if (this.exifImageWidth != null) { - json[r'exifImageWidth'] = this.exifImageWidth; - } else { - // json[r'exifImageWidth'] = null; + if (exifImageWidth != null) { + json[r'exifImageWidth'] = exifImageWidth!; } - if (this.exposureTime != null) { - json[r'exposureTime'] = this.exposureTime; - } else { - // json[r'exposureTime'] = null; + if (exposureTime != null) { + json[r'exposureTime'] = exposureTime!; } - if (this.fNumber != null) { - json[r'fNumber'] = this.fNumber; - } else { - // json[r'fNumber'] = null; + if (fNumber != null) { + json[r'fNumber'] = fNumber!; } - if (this.fileSizeInByte != null) { - json[r'fileSizeInByte'] = this.fileSizeInByte; - } else { - // json[r'fileSizeInByte'] = null; + if (fileSizeInByte != null) { + json[r'fileSizeInByte'] = fileSizeInByte!; } - if (this.focalLength != null) { - json[r'focalLength'] = this.focalLength; - } else { - // json[r'focalLength'] = null; + if (focalLength != null) { + json[r'focalLength'] = focalLength!; } - if (this.fps != null) { - json[r'fps'] = this.fps; - } else { - // json[r'fps'] = null; + if (fps != null) { + json[r'fps'] = fps!; } - if (this.iso != null) { - json[r'iso'] = this.iso; - } else { - // json[r'iso'] = null; + if (iso != null) { + json[r'iso'] = iso!; } - if (this.latitude != null) { - json[r'latitude'] = this.latitude; - } else { - // json[r'latitude'] = null; + if (latitude != null) { + json[r'latitude'] = latitude!; } - if (this.lensModel != null) { - json[r'lensModel'] = this.lensModel; - } else { - // json[r'lensModel'] = null; + if (lensModel != null) { + json[r'lensModel'] = lensModel!; } - if (this.longitude != null) { - json[r'longitude'] = this.longitude; - } else { - // json[r'longitude'] = null; + if (longitude != null) { + json[r'longitude'] = longitude!; } - if (this.make != null) { - json[r'make'] = this.make; - } else { - // json[r'make'] = null; + if (make != null) { + json[r'make'] = make!; } - if (this.model != null) { - json[r'model'] = this.model; - } else { - // json[r'model'] = null; + if (model != null) { + json[r'model'] = model!; } - if (this.modifyDate != null) { - json[r'modifyDate'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.modifyDate!.millisecondsSinceEpoch - : this.modifyDate!.toUtc().toIso8601String(); - } else { - // json[r'modifyDate'] = null; + if (modifyDate != null) { + json[r'modifyDate'] = modifyDate!.toUtc().toIso8601String(); } - if (this.orientation != null) { - json[r'orientation'] = this.orientation; - } else { - // json[r'orientation'] = null; + if (orientation != null) { + json[r'orientation'] = orientation!; } - if (this.profileDescription != null) { - json[r'profileDescription'] = this.profileDescription; - } else { - // json[r'profileDescription'] = null; + if (profileDescription != null) { + json[r'profileDescription'] = profileDescription!; } - if (this.projectionType != null) { - json[r'projectionType'] = this.projectionType; - } else { - // json[r'projectionType'] = null; + if (projectionType != null) { + json[r'projectionType'] = projectionType!; } - if (this.rating != null) { - json[r'rating'] = this.rating; - } else { - // json[r'rating'] = null; + if (rating != null) { + json[r'rating'] = rating!; } - if (this.state != null) { - json[r'state'] = this.state; - } else { - // json[r'state'] = null; + if (state != null) { + json[r'state'] = state!; } - if (this.timeZone != null) { - json[r'timeZone'] = this.timeZone; - } else { - // json[r'timeZone'] = null; + if (timeZone != null) { + json[r'timeZone'] = timeZone!; } return json; } - /// Returns a new [SyncAssetExifV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAssetExifV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAssetExifV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAssetExifV1( - assetId: mapValueOfType(json, r'assetId')!, - city: mapValueOfType(json, r'city'), - country: mapValueOfType(json, r'country'), - dateTimeOriginal: mapDateTime(json, r'dateTimeOriginal', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - description: mapValueOfType(json, r'description'), - exifImageHeight: mapValueOfType(json, r'exifImageHeight'), - exifImageWidth: mapValueOfType(json, r'exifImageWidth'), - exposureTime: mapValueOfType(json, r'exposureTime'), - fNumber: (mapValueOfType(json, r'fNumber'))?.toDouble(), - fileSizeInByte: mapValueOfType(json, r'fileSizeInByte'), - focalLength: (mapValueOfType(json, r'focalLength'))?.toDouble(), - fps: (mapValueOfType(json, r'fps'))?.toDouble(), - iso: mapValueOfType(json, r'iso'), - latitude: (mapValueOfType(json, r'latitude'))?.toDouble(), - lensModel: mapValueOfType(json, r'lensModel'), - longitude: (mapValueOfType(json, r'longitude'))?.toDouble(), - make: mapValueOfType(json, r'make'), - model: mapValueOfType(json, r'model'), - modifyDate: mapDateTime(json, r'modifyDate', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - orientation: mapValueOfType(json, r'orientation'), - profileDescription: mapValueOfType(json, r'profileDescription'), - projectionType: mapValueOfType(json, r'projectionType'), - rating: mapValueOfType(json, r'rating'), - state: mapValueOfType(json, r'state'), - timeZone: mapValueOfType(json, r'timeZone'), - ); - } - return null; + SyncAssetExifV1 copyWith({ + String? assetId, + Object? city = _undefined, + Object? country = _undefined, + Object? dateTimeOriginal = _undefined, + Object? description = _undefined, + Object? exifImageHeight = _undefined, + Object? exifImageWidth = _undefined, + Object? exposureTime = _undefined, + Object? fNumber = _undefined, + Object? fileSizeInByte = _undefined, + Object? focalLength = _undefined, + Object? fps = _undefined, + Object? iso = _undefined, + Object? latitude = _undefined, + Object? lensModel = _undefined, + Object? longitude = _undefined, + Object? make = _undefined, + Object? model = _undefined, + Object? modifyDate = _undefined, + Object? orientation = _undefined, + Object? profileDescription = _undefined, + Object? projectionType = _undefined, + Object? rating = _undefined, + Object? state = _undefined, + Object? timeZone = _undefined, + }) { + return .new( + assetId: assetId ?? this.assetId, + city: identical(city, _undefined) ? this.city : city as String?, + country: identical(country, _undefined) ? this.country : country as String?, + dateTimeOriginal: identical(dateTimeOriginal, _undefined) ? this.dateTimeOriginal : dateTimeOriginal as DateTime?, + description: identical(description, _undefined) ? this.description : description as String?, + exifImageHeight: identical(exifImageHeight, _undefined) ? this.exifImageHeight : exifImageHeight as int?, + exifImageWidth: identical(exifImageWidth, _undefined) ? this.exifImageWidth : exifImageWidth as int?, + exposureTime: identical(exposureTime, _undefined) ? this.exposureTime : exposureTime as String?, + fNumber: identical(fNumber, _undefined) ? this.fNumber : fNumber as double?, + fileSizeInByte: identical(fileSizeInByte, _undefined) ? this.fileSizeInByte : fileSizeInByte as int?, + focalLength: identical(focalLength, _undefined) ? this.focalLength : focalLength as double?, + fps: identical(fps, _undefined) ? this.fps : fps as double?, + iso: identical(iso, _undefined) ? this.iso : iso as int?, + latitude: identical(latitude, _undefined) ? this.latitude : latitude as double?, + lensModel: identical(lensModel, _undefined) ? this.lensModel : lensModel as String?, + longitude: identical(longitude, _undefined) ? this.longitude : longitude as double?, + make: identical(make, _undefined) ? this.make : make as String?, + model: identical(model, _undefined) ? this.model : model as String?, + modifyDate: identical(modifyDate, _undefined) ? this.modifyDate : modifyDate as DateTime?, + orientation: identical(orientation, _undefined) ? this.orientation : orientation as String?, + profileDescription: identical(profileDescription, _undefined) + ? this.profileDescription + : profileDescription as String?, + projectionType: identical(projectionType, _undefined) ? this.projectionType : projectionType as String?, + rating: identical(rating, _undefined) ? this.rating : rating as int?, + state: identical(state, _undefined) ? this.state : state as String?, + timeZone: identical(timeZone, _undefined) ? this.timeZone : timeZone as String?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAssetExifV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAssetExifV1 && + assetId == other.assetId && + city == other.city && + country == other.country && + dateTimeOriginal == other.dateTimeOriginal && + description == other.description && + exifImageHeight == other.exifImageHeight && + exifImageWidth == other.exifImageWidth && + exposureTime == other.exposureTime && + fNumber == other.fNumber && + fileSizeInByte == other.fileSizeInByte && + focalLength == other.focalLength && + fps == other.fps && + iso == other.iso && + latitude == other.latitude && + lensModel == other.lensModel && + longitude == other.longitude && + make == other.make && + model == other.model && + modifyDate == other.modifyDate && + orientation == other.orientation && + profileDescription == other.profileDescription && + projectionType == other.projectionType && + rating == other.rating && + state == other.state && + timeZone == other.timeZone); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAssetExifV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + assetId, + city, + country, + dateTimeOriginal, + description, + exifImageHeight, + exifImageWidth, + exposureTime, + fNumber, + fileSizeInByte, + focalLength, + fps, + iso, + latitude, + lensModel, + longitude, + make, + model, + modifyDate, + orientation, + profileDescription, + projectionType, + rating, + state, + timeZone, + ]); } - // maps a json object with a list of SyncAssetExifV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAssetExifV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'city', - 'country', - 'dateTimeOriginal', - 'description', - 'exifImageHeight', - 'exifImageWidth', - 'exposureTime', - 'fNumber', - 'fileSizeInByte', - 'focalLength', - 'fps', - 'iso', - 'latitude', - 'lensModel', - 'longitude', - 'make', - 'model', - 'modifyDate', - 'orientation', - 'profileDescription', - 'projectionType', - 'rating', - 'state', - 'timeZone', - }; + @override + String toString() => + 'SyncAssetExifV1(assetId=$assetId, city=$city, country=$country, dateTimeOriginal=$dateTimeOriginal, description=$description, exifImageHeight=$exifImageHeight, exifImageWidth=$exifImageWidth, exposureTime=$exposureTime, fNumber=$fNumber, fileSizeInByte=$fileSizeInByte, focalLength=$focalLength, fps=$fps, iso=$iso, latitude=$latitude, lensModel=$lensModel, longitude=$longitude, make=$make, model=$model, modifyDate=$modifyDate, orientation=$orientation, profileDescription=$profileDescription, projectionType=$projectionType, rating=$rating, state=$state, timeZone=$timeZone)'; } - diff --git a/mobile/openapi/lib/model/sync_asset_face_delete_v1.dart b/mobile/openapi/lib/model/sync_asset_face_delete_v1.dart index 9cfb8814a7..62aca2c2ab 100644 --- a/mobile/openapi/lib/model/sync_asset_face_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_asset_face_delete_v1.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAssetFaceDeleteV1 { - /// Returns a new [SyncAssetFaceDeleteV1] instance. - SyncAssetFaceDeleteV1({ - required this.assetFaceId, - }); +final class SyncAssetFaceDeleteV1 { + const SyncAssetFaceDeleteV1({required this.assetFaceId}); /// Asset face ID - String assetFaceId; + final String assetFaceId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAssetFaceDeleteV1 && - other.assetFaceId == assetFaceId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetFaceId.hashCode); - - @override - String toString() => 'SyncAssetFaceDeleteV1[assetFaceId=$assetFaceId]'; + static SyncAssetFaceDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(assetFaceId: json[r'assetFaceId'] as String); + } Map toJson() { final json = {}; - json[r'assetFaceId'] = this.assetFaceId; + json[r'assetFaceId'] = assetFaceId; return json; } - /// Returns a new [SyncAssetFaceDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAssetFaceDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAssetFaceDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAssetFaceDeleteV1( - assetFaceId: mapValueOfType(json, r'assetFaceId')!, - ); - } - return null; + SyncAssetFaceDeleteV1 copyWith({String? assetFaceId}) { + return .new(assetFaceId: assetFaceId ?? this.assetFaceId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAssetFaceDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncAssetFaceDeleteV1 && assetFaceId == other.assetFaceId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAssetFaceDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetFaceId]); } - // maps a json object with a list of SyncAssetFaceDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAssetFaceDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetFaceId', - }; + @override + String toString() => 'SyncAssetFaceDeleteV1(assetFaceId=$assetFaceId)'; } - diff --git a/mobile/openapi/lib/model/sync_asset_face_v1.dart b/mobile/openapi/lib/model/sync_asset_face_v1.dart index c3f74ff2cd..b3ef331e7f 100644 --- a/mobile/openapi/lib/model/sync_asset_face_v1.dart +++ b/mobile/openapi/lib/model/sync_asset_face_v1.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAssetFaceV1 { - /// Returns a new [SyncAssetFaceV1] instance. - SyncAssetFaceV1({ +final class SyncAssetFaceV1 { + const SyncAssetFaceV1({ required this.assetId, required this.boundingBoxX1, required this.boundingBoxX2, @@ -26,178 +17,131 @@ class SyncAssetFaceV1 { }); /// Asset ID - String assetId; + final String assetId; /// Bounding box X1 - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxX1; + final int boundingBoxX1; /// Bounding box X2 - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxX2; + final int boundingBoxX2; /// Bounding box Y1 - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxY1; + final int boundingBoxY1; /// Bounding box Y2 - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxY2; + final int boundingBoxY2; /// Asset face ID - String id; + final String id; /// Image height - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int imageHeight; + final int imageHeight; /// Image width - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int imageWidth; + final int imageWidth; /// Person ID - String? personId; + final String? personId; /// Source type - String sourceType; + final String sourceType; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAssetFaceV1 && - other.assetId == assetId && - other.boundingBoxX1 == boundingBoxX1 && - other.boundingBoxX2 == boundingBoxX2 && - other.boundingBoxY1 == boundingBoxY1 && - other.boundingBoxY2 == boundingBoxY2 && - other.id == id && - other.imageHeight == imageHeight && - other.imageWidth == imageWidth && - other.personId == personId && - other.sourceType == sourceType; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (boundingBoxX1.hashCode) + - (boundingBoxX2.hashCode) + - (boundingBoxY1.hashCode) + - (boundingBoxY2.hashCode) + - (id.hashCode) + - (imageHeight.hashCode) + - (imageWidth.hashCode) + - (personId == null ? 0 : personId!.hashCode) + - (sourceType.hashCode); - - @override - String toString() => 'SyncAssetFaceV1[assetId=$assetId, boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, personId=$personId, sourceType=$sourceType]'; + static SyncAssetFaceV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetId: json[r'assetId'] as String, + boundingBoxX1: json[r'boundingBoxX1'] as int, + boundingBoxX2: json[r'boundingBoxX2'] as int, + boundingBoxY1: json[r'boundingBoxY1'] as int, + boundingBoxY2: json[r'boundingBoxY2'] as int, + id: json[r'id'] as String, + imageHeight: json[r'imageHeight'] as int, + imageWidth: json[r'imageWidth'] as int, + personId: (json[r'personId'] as String?), + sourceType: json[r'sourceType'] as String, + ); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'boundingBoxX1'] = this.boundingBoxX1; - json[r'boundingBoxX2'] = this.boundingBoxX2; - json[r'boundingBoxY1'] = this.boundingBoxY1; - json[r'boundingBoxY2'] = this.boundingBoxY2; - json[r'id'] = this.id; - json[r'imageHeight'] = this.imageHeight; - json[r'imageWidth'] = this.imageWidth; - if (this.personId != null) { - json[r'personId'] = this.personId; - } else { - // json[r'personId'] = null; + json[r'assetId'] = assetId; + json[r'boundingBoxX1'] = boundingBoxX1; + json[r'boundingBoxX2'] = boundingBoxX2; + json[r'boundingBoxY1'] = boundingBoxY1; + json[r'boundingBoxY2'] = boundingBoxY2; + json[r'id'] = id; + json[r'imageHeight'] = imageHeight; + json[r'imageWidth'] = imageWidth; + if (personId != null) { + json[r'personId'] = personId!; } - json[r'sourceType'] = this.sourceType; + json[r'sourceType'] = sourceType; return json; } - /// Returns a new [SyncAssetFaceV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAssetFaceV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAssetFaceV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAssetFaceV1( - assetId: mapValueOfType(json, r'assetId')!, - boundingBoxX1: mapValueOfType(json, r'boundingBoxX1')!, - boundingBoxX2: mapValueOfType(json, r'boundingBoxX2')!, - boundingBoxY1: mapValueOfType(json, r'boundingBoxY1')!, - boundingBoxY2: mapValueOfType(json, r'boundingBoxY2')!, - id: mapValueOfType(json, r'id')!, - imageHeight: mapValueOfType(json, r'imageHeight')!, - imageWidth: mapValueOfType(json, r'imageWidth')!, - personId: mapValueOfType(json, r'personId'), - sourceType: mapValueOfType(json, r'sourceType')!, - ); - } - return null; + SyncAssetFaceV1 copyWith({ + String? assetId, + int? boundingBoxX1, + int? boundingBoxX2, + int? boundingBoxY1, + int? boundingBoxY2, + String? id, + int? imageHeight, + int? imageWidth, + Object? personId = _undefined, + String? sourceType, + }) { + return .new( + assetId: assetId ?? this.assetId, + boundingBoxX1: boundingBoxX1 ?? this.boundingBoxX1, + boundingBoxX2: boundingBoxX2 ?? this.boundingBoxX2, + boundingBoxY1: boundingBoxY1 ?? this.boundingBoxY1, + boundingBoxY2: boundingBoxY2 ?? this.boundingBoxY2, + id: id ?? this.id, + imageHeight: imageHeight ?? this.imageHeight, + imageWidth: imageWidth ?? this.imageWidth, + personId: identical(personId, _undefined) ? this.personId : personId as String?, + sourceType: sourceType ?? this.sourceType, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAssetFaceV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAssetFaceV1 && + assetId == other.assetId && + boundingBoxX1 == other.boundingBoxX1 && + boundingBoxX2 == other.boundingBoxX2 && + boundingBoxY1 == other.boundingBoxY1 && + boundingBoxY2 == other.boundingBoxY2 && + id == other.id && + imageHeight == other.imageHeight && + imageWidth == other.imageWidth && + personId == other.personId && + sourceType == other.sourceType); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAssetFaceV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + assetId, + boundingBoxX1, + boundingBoxX2, + boundingBoxY1, + boundingBoxY2, + id, + imageHeight, + imageWidth, + personId, + sourceType, + ]); } - // maps a json object with a list of SyncAssetFaceV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAssetFaceV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'boundingBoxX1', - 'boundingBoxX2', - 'boundingBoxY1', - 'boundingBoxY2', - 'id', - 'imageHeight', - 'imageWidth', - 'personId', - 'sourceType', - }; + @override + String toString() => + 'SyncAssetFaceV1(assetId=$assetId, boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, personId=$personId, sourceType=$sourceType)'; } - diff --git a/mobile/openapi/lib/model/sync_asset_face_v2.dart b/mobile/openapi/lib/model/sync_asset_face_v2.dart index aeefc2ece9..1e16777551 100644 --- a/mobile/openapi/lib/model/sync_asset_face_v2.dart +++ b/mobile/openapi/lib/model/sync_asset_face_v2.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAssetFaceV2 { - /// Returns a new [SyncAssetFaceV2] instance. - SyncAssetFaceV2({ +final class SyncAssetFaceV2 { + const SyncAssetFaceV2({ required this.assetId, required this.boundingBoxX1, required this.boundingBoxX2, @@ -28,200 +19,151 @@ class SyncAssetFaceV2 { }); /// Asset ID - String assetId; + final String assetId; /// Bounding box X1 - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxX1; + final int boundingBoxX1; /// Bounding box X2 - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxX2; + final int boundingBoxX2; /// Bounding box Y1 - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxY1; + final int boundingBoxY1; /// Bounding box Y2 - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int boundingBoxY2; + final int boundingBoxY2; /// Face deleted at - DateTime? deletedAt; + final DateTime? deletedAt; /// Asset face ID - String id; + final String id; /// Image height - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int imageHeight; + final int imageHeight; /// Image width - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int imageWidth; + final int imageWidth; /// Is the face visible in the asset - bool isVisible; + final bool isVisible; /// Person ID - String? personId; + final String? personId; /// Source type - String sourceType; + final String sourceType; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAssetFaceV2 && - other.assetId == assetId && - other.boundingBoxX1 == boundingBoxX1 && - other.boundingBoxX2 == boundingBoxX2 && - other.boundingBoxY1 == boundingBoxY1 && - other.boundingBoxY2 == boundingBoxY2 && - other.deletedAt == deletedAt && - other.id == id && - other.imageHeight == imageHeight && - other.imageWidth == imageWidth && - other.isVisible == isVisible && - other.personId == personId && - other.sourceType == sourceType; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (boundingBoxX1.hashCode) + - (boundingBoxX2.hashCode) + - (boundingBoxY1.hashCode) + - (boundingBoxY2.hashCode) + - (deletedAt == null ? 0 : deletedAt!.hashCode) + - (id.hashCode) + - (imageHeight.hashCode) + - (imageWidth.hashCode) + - (isVisible.hashCode) + - (personId == null ? 0 : personId!.hashCode) + - (sourceType.hashCode); - - @override - String toString() => 'SyncAssetFaceV2[assetId=$assetId, boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, deletedAt=$deletedAt, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, isVisible=$isVisible, personId=$personId, sourceType=$sourceType]'; + static SyncAssetFaceV2? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetId: json[r'assetId'] as String, + boundingBoxX1: json[r'boundingBoxX1'] as int, + boundingBoxX2: json[r'boundingBoxX2'] as int, + boundingBoxY1: json[r'boundingBoxY1'] as int, + boundingBoxY2: json[r'boundingBoxY2'] as int, + deletedAt: (json[r'deletedAt'] == null ? null : DateTime.parse(json[r'deletedAt'] as String)), + id: json[r'id'] as String, + imageHeight: json[r'imageHeight'] as int, + imageWidth: json[r'imageWidth'] as int, + isVisible: json[r'isVisible'] as bool, + personId: (json[r'personId'] as String?), + sourceType: json[r'sourceType'] as String, + ); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'boundingBoxX1'] = this.boundingBoxX1; - json[r'boundingBoxX2'] = this.boundingBoxX2; - json[r'boundingBoxY1'] = this.boundingBoxY1; - json[r'boundingBoxY2'] = this.boundingBoxY2; - if (this.deletedAt != null) { - json[r'deletedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.deletedAt!.millisecondsSinceEpoch - : this.deletedAt!.toUtc().toIso8601String(); - } else { - // json[r'deletedAt'] = null; + json[r'assetId'] = assetId; + json[r'boundingBoxX1'] = boundingBoxX1; + json[r'boundingBoxX2'] = boundingBoxX2; + json[r'boundingBoxY1'] = boundingBoxY1; + json[r'boundingBoxY2'] = boundingBoxY2; + if (deletedAt != null) { + json[r'deletedAt'] = deletedAt!.toUtc().toIso8601String(); } - json[r'id'] = this.id; - json[r'imageHeight'] = this.imageHeight; - json[r'imageWidth'] = this.imageWidth; - json[r'isVisible'] = this.isVisible; - if (this.personId != null) { - json[r'personId'] = this.personId; - } else { - // json[r'personId'] = null; + json[r'id'] = id; + json[r'imageHeight'] = imageHeight; + json[r'imageWidth'] = imageWidth; + json[r'isVisible'] = isVisible; + if (personId != null) { + json[r'personId'] = personId!; } - json[r'sourceType'] = this.sourceType; + json[r'sourceType'] = sourceType; return json; } - /// Returns a new [SyncAssetFaceV2] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAssetFaceV2? fromJson(dynamic value) { - upgradeDto(value, "SyncAssetFaceV2"); - if (value is Map) { - final json = value.cast(); - - return SyncAssetFaceV2( - assetId: mapValueOfType(json, r'assetId')!, - boundingBoxX1: mapValueOfType(json, r'boundingBoxX1')!, - boundingBoxX2: mapValueOfType(json, r'boundingBoxX2')!, - boundingBoxY1: mapValueOfType(json, r'boundingBoxY1')!, - boundingBoxY2: mapValueOfType(json, r'boundingBoxY2')!, - deletedAt: mapDateTime(json, r'deletedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - id: mapValueOfType(json, r'id')!, - imageHeight: mapValueOfType(json, r'imageHeight')!, - imageWidth: mapValueOfType(json, r'imageWidth')!, - isVisible: mapValueOfType(json, r'isVisible')!, - personId: mapValueOfType(json, r'personId'), - sourceType: mapValueOfType(json, r'sourceType')!, - ); - } - return null; + SyncAssetFaceV2 copyWith({ + String? assetId, + int? boundingBoxX1, + int? boundingBoxX2, + int? boundingBoxY1, + int? boundingBoxY2, + Object? deletedAt = _undefined, + String? id, + int? imageHeight, + int? imageWidth, + bool? isVisible, + Object? personId = _undefined, + String? sourceType, + }) { + return .new( + assetId: assetId ?? this.assetId, + boundingBoxX1: boundingBoxX1 ?? this.boundingBoxX1, + boundingBoxX2: boundingBoxX2 ?? this.boundingBoxX2, + boundingBoxY1: boundingBoxY1 ?? this.boundingBoxY1, + boundingBoxY2: boundingBoxY2 ?? this.boundingBoxY2, + deletedAt: identical(deletedAt, _undefined) ? this.deletedAt : deletedAt as DateTime?, + id: id ?? this.id, + imageHeight: imageHeight ?? this.imageHeight, + imageWidth: imageWidth ?? this.imageWidth, + isVisible: isVisible ?? this.isVisible, + personId: identical(personId, _undefined) ? this.personId : personId as String?, + sourceType: sourceType ?? this.sourceType, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAssetFaceV2.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAssetFaceV2 && + assetId == other.assetId && + boundingBoxX1 == other.boundingBoxX1 && + boundingBoxX2 == other.boundingBoxX2 && + boundingBoxY1 == other.boundingBoxY1 && + boundingBoxY2 == other.boundingBoxY2 && + deletedAt == other.deletedAt && + id == other.id && + imageHeight == other.imageHeight && + imageWidth == other.imageWidth && + isVisible == other.isVisible && + personId == other.personId && + sourceType == other.sourceType); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAssetFaceV2.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + assetId, + boundingBoxX1, + boundingBoxX2, + boundingBoxY1, + boundingBoxY2, + deletedAt, + id, + imageHeight, + imageWidth, + isVisible, + personId, + sourceType, + ]); } - // maps a json object with a list of SyncAssetFaceV2-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAssetFaceV2.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'boundingBoxX1', - 'boundingBoxX2', - 'boundingBoxY1', - 'boundingBoxY2', - 'deletedAt', - 'id', - 'imageHeight', - 'imageWidth', - 'isVisible', - 'personId', - 'sourceType', - }; + @override + String toString() => + 'SyncAssetFaceV2(assetId=$assetId, boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, deletedAt=$deletedAt, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, isVisible=$isVisible, personId=$personId, sourceType=$sourceType)'; } - diff --git a/mobile/openapi/lib/model/sync_asset_metadata_delete_v1.dart b/mobile/openapi/lib/model/sync_asset_metadata_delete_v1.dart index 326555ef13..bbb7d0742f 100644 --- a/mobile/openapi/lib/model/sync_asset_metadata_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_asset_metadata_delete_v1.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAssetMetadataDeleteV1 { - /// Returns a new [SyncAssetMetadataDeleteV1] instance. - SyncAssetMetadataDeleteV1({ - required this.assetId, - required this.key, - }); +final class SyncAssetMetadataDeleteV1 { + const SyncAssetMetadataDeleteV1({required this.assetId, required this.key}); /// Asset ID - String assetId; + final String assetId; /// Key - String key; + final String key; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAssetMetadataDeleteV1 && - other.assetId == assetId && - other.key == key; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (key.hashCode); - - @override - String toString() => 'SyncAssetMetadataDeleteV1[assetId=$assetId, key=$key]'; + static SyncAssetMetadataDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(assetId: json[r'assetId'] as String, key: json[r'key'] as String); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'key'] = this.key; + json[r'assetId'] = assetId; + json[r'key'] = key; return json; } - /// Returns a new [SyncAssetMetadataDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAssetMetadataDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAssetMetadataDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAssetMetadataDeleteV1( - assetId: mapValueOfType(json, r'assetId')!, - key: mapValueOfType(json, r'key')!, - ); - } - return null; + SyncAssetMetadataDeleteV1 copyWith({String? assetId, String? key}) { + return .new(assetId: assetId ?? this.assetId, key: key ?? this.key); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAssetMetadataDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAssetMetadataDeleteV1 && assetId == other.assetId && key == other.key); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAssetMetadataDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, key]); } - // maps a json object with a list of SyncAssetMetadataDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAssetMetadataDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'key', - }; + @override + String toString() => 'SyncAssetMetadataDeleteV1(assetId=$assetId, key=$key)'; } - diff --git a/mobile/openapi/lib/model/sync_asset_metadata_v1.dart b/mobile/openapi/lib/model/sync_asset_metadata_v1.dart index 08d7eae49b..af3fcb5494 100644 --- a/mobile/openapi/lib/model/sync_asset_metadata_v1.dart +++ b/mobile/openapi/lib/model/sync_asset_metadata_v1.dart @@ -1,118 +1,56 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAssetMetadataV1 { - /// Returns a new [SyncAssetMetadataV1] instance. - SyncAssetMetadataV1({ - required this.assetId, - required this.key, - this.value = const {}, - }); +final class SyncAssetMetadataV1 { + const SyncAssetMetadataV1({required this.assetId, required this.key, required this.value}); /// Asset ID - String assetId; + final String assetId; /// Key - String key; + final String key; /// Value - Map value; + final Map value; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAssetMetadataV1 && - other.assetId == assetId && - other.key == key && - _deepEquality.equals(other.value, value); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (key.hashCode) + - (value.hashCode); - - @override - String toString() => 'SyncAssetMetadataV1[assetId=$assetId, key=$key, value=$value]'; + static SyncAssetMetadataV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetId: json[r'assetId'] as String, + key: json[r'key'] as String, + value: ((json[r'value'] as Map?)?.cast())!, + ); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'key'] = this.key; - json[r'value'] = this.value; + json[r'assetId'] = assetId; + json[r'key'] = key; + json[r'value'] = value; return json; } - /// Returns a new [SyncAssetMetadataV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAssetMetadataV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAssetMetadataV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAssetMetadataV1( - assetId: mapValueOfType(json, r'assetId')!, - key: mapValueOfType(json, r'key')!, - value: mapCastOfType(json, r'value')!, - ); - } - return null; + SyncAssetMetadataV1 copyWith({String? assetId, String? key, Map? value}) { + return .new(assetId: assetId ?? this.assetId, key: key ?? this.key, value: value ?? this.value); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAssetMetadataV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAssetMetadataV1 && + assetId == other.assetId && + key == other.key && + const DeepCollectionEquality().equals(value, other.value)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAssetMetadataV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, key, const DeepCollectionEquality().hash(value)]); } - // maps a json object with a list of SyncAssetMetadataV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAssetMetadataV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'key', - 'value', - }; + @override + String toString() => 'SyncAssetMetadataV1(assetId=$assetId, key=$key, value=$value)'; } - diff --git a/mobile/openapi/lib/model/sync_asset_v1.dart b/mobile/openapi/lib/model/sync_asset_v1.dart index 9a7a3a1f16..a59b6f1e27 100644 --- a/mobile/openapi/lib/model/sync_asset_v1.dart +++ b/mobile/openapi/lib/model/sync_asset_v1.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAssetV1 { - /// Returns a new [SyncAssetV1] instance. - SyncAssetV1({ +final class SyncAssetV1 { + const SyncAssetV1({ required this.checksum, required this.createdAt, required this.deletedAt, @@ -36,298 +27,241 @@ class SyncAssetV1 { }); /// Checksum - String checksum; + final String checksum; /// Uploaded to Immich at - DateTime? createdAt; + final DateTime? createdAt; /// Deleted at - DateTime? deletedAt; + final DateTime? deletedAt; /// Duration - String? duration; + final String? duration; /// File created at - DateTime? fileCreatedAt; + final DateTime? fileCreatedAt; /// File modified at - DateTime? fileModifiedAt; + final DateTime? fileModifiedAt; /// Asset height - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? height; + final int? height; /// Asset ID - String id; + final String id; /// Is edited - bool isEdited; + final bool isEdited; /// Is favorite - bool isFavorite; + final bool isFavorite; /// Library ID - String? libraryId; + final String? libraryId; /// Live photo video ID - String? livePhotoVideoId; + final String? livePhotoVideoId; /// Local date time - DateTime? localDateTime; + final DateTime? localDateTime; /// Original file name - String originalFileName; + final String originalFileName; /// Owner ID - String ownerId; + final String ownerId; /// Stack ID - String? stackId; + final String? stackId; /// Thumbhash - String? thumbhash; + final String? thumbhash; - AssetTypeEnum type; + final AssetTypeEnum type; - AssetVisibility visibility; + final AssetVisibility visibility; /// Asset width - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? width; + final int? width; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAssetV1 && - other.checksum == checksum && - other.createdAt == createdAt && - other.deletedAt == deletedAt && - other.duration == duration && - other.fileCreatedAt == fileCreatedAt && - other.fileModifiedAt == fileModifiedAt && - other.height == height && - other.id == id && - other.isEdited == isEdited && - other.isFavorite == isFavorite && - other.libraryId == libraryId && - other.livePhotoVideoId == livePhotoVideoId && - other.localDateTime == localDateTime && - other.originalFileName == originalFileName && - other.ownerId == ownerId && - other.stackId == stackId && - other.thumbhash == thumbhash && - other.type == type && - other.visibility == visibility && - other.width == width; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (checksum.hashCode) + - (createdAt == null ? 0 : createdAt!.hashCode) + - (deletedAt == null ? 0 : deletedAt!.hashCode) + - (duration == null ? 0 : duration!.hashCode) + - (fileCreatedAt == null ? 0 : fileCreatedAt!.hashCode) + - (fileModifiedAt == null ? 0 : fileModifiedAt!.hashCode) + - (height == null ? 0 : height!.hashCode) + - (id.hashCode) + - (isEdited.hashCode) + - (isFavorite.hashCode) + - (libraryId == null ? 0 : libraryId!.hashCode) + - (livePhotoVideoId == null ? 0 : livePhotoVideoId!.hashCode) + - (localDateTime == null ? 0 : localDateTime!.hashCode) + - (originalFileName.hashCode) + - (ownerId.hashCode) + - (stackId == null ? 0 : stackId!.hashCode) + - (thumbhash == null ? 0 : thumbhash!.hashCode) + - (type.hashCode) + - (visibility.hashCode) + - (width == null ? 0 : width!.hashCode); - - @override - String toString() => 'SyncAssetV1[checksum=$checksum, createdAt=$createdAt, deletedAt=$deletedAt, duration=$duration, fileCreatedAt=$fileCreatedAt, fileModifiedAt=$fileModifiedAt, height=$height, id=$id, isEdited=$isEdited, isFavorite=$isFavorite, libraryId=$libraryId, livePhotoVideoId=$livePhotoVideoId, localDateTime=$localDateTime, originalFileName=$originalFileName, ownerId=$ownerId, stackId=$stackId, thumbhash=$thumbhash, type=$type, visibility=$visibility, width=$width]'; + static SyncAssetV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + checksum: json[r'checksum'] as String, + createdAt: (json[r'createdAt'] == null ? null : DateTime.parse(json[r'createdAt'] as String)), + deletedAt: (json[r'deletedAt'] == null ? null : DateTime.parse(json[r'deletedAt'] as String)), + duration: (json[r'duration'] as String?), + fileCreatedAt: (json[r'fileCreatedAt'] == null ? null : DateTime.parse(json[r'fileCreatedAt'] as String)), + fileModifiedAt: (json[r'fileModifiedAt'] == null ? null : DateTime.parse(json[r'fileModifiedAt'] as String)), + height: (json[r'height'] as int?), + id: json[r'id'] as String, + isEdited: json[r'isEdited'] as bool, + isFavorite: json[r'isFavorite'] as bool, + libraryId: (json[r'libraryId'] as String?), + livePhotoVideoId: (json[r'livePhotoVideoId'] as String?), + localDateTime: (json[r'localDateTime'] == null ? null : DateTime.parse(json[r'localDateTime'] as String)), + originalFileName: json[r'originalFileName'] as String, + ownerId: json[r'ownerId'] as String, + stackId: (json[r'stackId'] as String?), + thumbhash: (json[r'thumbhash'] as String?), + type: (AssetTypeEnum.fromJson(json[r'type']))!, + visibility: (AssetVisibility.fromJson(json[r'visibility']))!, + width: (json[r'width'] as int?), + ); + } Map toJson() { final json = {}; - json[r'checksum'] = this.checksum; - if (this.createdAt != null) { - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt!.millisecondsSinceEpoch - : this.createdAt!.toUtc().toIso8601String(); - } else { - // json[r'createdAt'] = null; + json[r'checksum'] = checksum; + if (createdAt != null) { + json[r'createdAt'] = createdAt!.toUtc().toIso8601String(); } - if (this.deletedAt != null) { - json[r'deletedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.deletedAt!.millisecondsSinceEpoch - : this.deletedAt!.toUtc().toIso8601String(); - } else { - // json[r'deletedAt'] = null; + if (deletedAt != null) { + json[r'deletedAt'] = deletedAt!.toUtc().toIso8601String(); } - if (this.duration != null) { - json[r'duration'] = this.duration; - } else { - // json[r'duration'] = null; + if (duration != null) { + json[r'duration'] = duration!; } - if (this.fileCreatedAt != null) { - json[r'fileCreatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.fileCreatedAt!.millisecondsSinceEpoch - : this.fileCreatedAt!.toUtc().toIso8601String(); - } else { - // json[r'fileCreatedAt'] = null; + if (fileCreatedAt != null) { + json[r'fileCreatedAt'] = fileCreatedAt!.toUtc().toIso8601String(); } - if (this.fileModifiedAt != null) { - json[r'fileModifiedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.fileModifiedAt!.millisecondsSinceEpoch - : this.fileModifiedAt!.toUtc().toIso8601String(); - } else { - // json[r'fileModifiedAt'] = null; + if (fileModifiedAt != null) { + json[r'fileModifiedAt'] = fileModifiedAt!.toUtc().toIso8601String(); } - if (this.height != null) { - json[r'height'] = this.height; - } else { - // json[r'height'] = null; + if (height != null) { + json[r'height'] = height!; } - json[r'id'] = this.id; - json[r'isEdited'] = this.isEdited; - json[r'isFavorite'] = this.isFavorite; - if (this.libraryId != null) { - json[r'libraryId'] = this.libraryId; - } else { - // json[r'libraryId'] = null; + json[r'id'] = id; + json[r'isEdited'] = isEdited; + json[r'isFavorite'] = isFavorite; + if (libraryId != null) { + json[r'libraryId'] = libraryId!; } - if (this.livePhotoVideoId != null) { - json[r'livePhotoVideoId'] = this.livePhotoVideoId; - } else { - // json[r'livePhotoVideoId'] = null; + if (livePhotoVideoId != null) { + json[r'livePhotoVideoId'] = livePhotoVideoId!; } - if (this.localDateTime != null) { - json[r'localDateTime'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.localDateTime!.millisecondsSinceEpoch - : this.localDateTime!.toUtc().toIso8601String(); - } else { - // json[r'localDateTime'] = null; + if (localDateTime != null) { + json[r'localDateTime'] = localDateTime!.toUtc().toIso8601String(); } - json[r'originalFileName'] = this.originalFileName; - json[r'ownerId'] = this.ownerId; - if (this.stackId != null) { - json[r'stackId'] = this.stackId; - } else { - // json[r'stackId'] = null; + json[r'originalFileName'] = originalFileName; + json[r'ownerId'] = ownerId; + if (stackId != null) { + json[r'stackId'] = stackId!; } - if (this.thumbhash != null) { - json[r'thumbhash'] = this.thumbhash; - } else { - // json[r'thumbhash'] = null; + if (thumbhash != null) { + json[r'thumbhash'] = thumbhash!; } - json[r'type'] = this.type; - json[r'visibility'] = this.visibility; - if (this.width != null) { - json[r'width'] = this.width; - } else { - // json[r'width'] = null; + json[r'type'] = type.toJson(); + json[r'visibility'] = visibility.toJson(); + if (width != null) { + json[r'width'] = width!; } return json; } - /// Returns a new [SyncAssetV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAssetV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAssetV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAssetV1( - checksum: mapValueOfType(json, r'checksum')!, - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - deletedAt: mapDateTime(json, r'deletedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - duration: mapValueOfType(json, r'duration'), - fileCreatedAt: mapDateTime(json, r'fileCreatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - fileModifiedAt: mapDateTime(json, r'fileModifiedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - height: mapValueOfType(json, r'height'), - id: mapValueOfType(json, r'id')!, - isEdited: mapValueOfType(json, r'isEdited')!, - isFavorite: mapValueOfType(json, r'isFavorite')!, - libraryId: mapValueOfType(json, r'libraryId'), - livePhotoVideoId: mapValueOfType(json, r'livePhotoVideoId'), - localDateTime: mapDateTime(json, r'localDateTime', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - originalFileName: mapValueOfType(json, r'originalFileName')!, - ownerId: mapValueOfType(json, r'ownerId')!, - stackId: mapValueOfType(json, r'stackId'), - thumbhash: mapValueOfType(json, r'thumbhash'), - type: AssetTypeEnum.fromJson(json[r'type'])!, - visibility: AssetVisibility.fromJson(json[r'visibility'])!, - width: mapValueOfType(json, r'width'), - ); - } - return null; + SyncAssetV1 copyWith({ + String? checksum, + Object? createdAt = _undefined, + Object? deletedAt = _undefined, + Object? duration = _undefined, + Object? fileCreatedAt = _undefined, + Object? fileModifiedAt = _undefined, + Object? height = _undefined, + String? id, + bool? isEdited, + bool? isFavorite, + Object? libraryId = _undefined, + Object? livePhotoVideoId = _undefined, + Object? localDateTime = _undefined, + String? originalFileName, + String? ownerId, + Object? stackId = _undefined, + Object? thumbhash = _undefined, + AssetTypeEnum? type, + AssetVisibility? visibility, + Object? width = _undefined, + }) { + return .new( + checksum: checksum ?? this.checksum, + createdAt: identical(createdAt, _undefined) ? this.createdAt : createdAt as DateTime?, + deletedAt: identical(deletedAt, _undefined) ? this.deletedAt : deletedAt as DateTime?, + duration: identical(duration, _undefined) ? this.duration : duration as String?, + fileCreatedAt: identical(fileCreatedAt, _undefined) ? this.fileCreatedAt : fileCreatedAt as DateTime?, + fileModifiedAt: identical(fileModifiedAt, _undefined) ? this.fileModifiedAt : fileModifiedAt as DateTime?, + height: identical(height, _undefined) ? this.height : height as int?, + id: id ?? this.id, + isEdited: isEdited ?? this.isEdited, + isFavorite: isFavorite ?? this.isFavorite, + libraryId: identical(libraryId, _undefined) ? this.libraryId : libraryId as String?, + livePhotoVideoId: identical(livePhotoVideoId, _undefined) ? this.livePhotoVideoId : livePhotoVideoId as String?, + localDateTime: identical(localDateTime, _undefined) ? this.localDateTime : localDateTime as DateTime?, + originalFileName: originalFileName ?? this.originalFileName, + ownerId: ownerId ?? this.ownerId, + stackId: identical(stackId, _undefined) ? this.stackId : stackId as String?, + thumbhash: identical(thumbhash, _undefined) ? this.thumbhash : thumbhash as String?, + type: type ?? this.type, + visibility: visibility ?? this.visibility, + width: identical(width, _undefined) ? this.width : width as int?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAssetV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAssetV1 && + checksum == other.checksum && + createdAt == other.createdAt && + deletedAt == other.deletedAt && + duration == other.duration && + fileCreatedAt == other.fileCreatedAt && + fileModifiedAt == other.fileModifiedAt && + height == other.height && + id == other.id && + isEdited == other.isEdited && + isFavorite == other.isFavorite && + libraryId == other.libraryId && + livePhotoVideoId == other.livePhotoVideoId && + localDateTime == other.localDateTime && + originalFileName == other.originalFileName && + ownerId == other.ownerId && + stackId == other.stackId && + thumbhash == other.thumbhash && + type == other.type && + visibility == other.visibility && + width == other.width); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAssetV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + checksum, + createdAt, + deletedAt, + duration, + fileCreatedAt, + fileModifiedAt, + height, + id, + isEdited, + isFavorite, + libraryId, + livePhotoVideoId, + localDateTime, + originalFileName, + ownerId, + stackId, + thumbhash, + type, + visibility, + width, + ]); } - // maps a json object with a list of SyncAssetV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAssetV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'checksum', - 'createdAt', - 'deletedAt', - 'duration', - 'fileCreatedAt', - 'fileModifiedAt', - 'height', - 'id', - 'isEdited', - 'isFavorite', - 'libraryId', - 'livePhotoVideoId', - 'localDateTime', - 'originalFileName', - 'ownerId', - 'stackId', - 'thumbhash', - 'type', - 'visibility', - 'width', - }; + @override + String toString() => + 'SyncAssetV1(checksum=$checksum, createdAt=$createdAt, deletedAt=$deletedAt, duration=$duration, fileCreatedAt=$fileCreatedAt, fileModifiedAt=$fileModifiedAt, height=$height, id=$id, isEdited=$isEdited, isFavorite=$isFavorite, libraryId=$libraryId, livePhotoVideoId=$livePhotoVideoId, localDateTime=$localDateTime, originalFileName=$originalFileName, ownerId=$ownerId, stackId=$stackId, thumbhash=$thumbhash, type=$type, visibility=$visibility, width=$width)'; } - diff --git a/mobile/openapi/lib/model/sync_asset_v2.dart b/mobile/openapi/lib/model/sync_asset_v2.dart index 7d1dfa298e..fd00375a19 100644 --- a/mobile/openapi/lib/model/sync_asset_v2.dart +++ b/mobile/openapi/lib/model/sync_asset_v2.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAssetV2 { - /// Returns a new [SyncAssetV2] instance. - SyncAssetV2({ +final class SyncAssetV2 { + const SyncAssetV2({ required this.checksum, required this.createdAt, required this.deletedAt, @@ -36,301 +27,241 @@ class SyncAssetV2 { }); /// Checksum - String checksum; + final String checksum; /// Uploaded to Immich at - DateTime? createdAt; + final DateTime? createdAt; /// Deleted at - DateTime? deletedAt; + final DateTime? deletedAt; /// Duration - /// - /// Minimum value: 0 - /// Maximum value: 2147483647 - int? duration; + final int? duration; /// File created at - DateTime? fileCreatedAt; + final DateTime? fileCreatedAt; /// File modified at - DateTime? fileModifiedAt; + final DateTime? fileModifiedAt; /// Asset height - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? height; + final int? height; /// Asset ID - String id; + final String id; /// Is edited - bool isEdited; + final bool isEdited; /// Is favorite - bool isFavorite; + final bool isFavorite; /// Library ID - String? libraryId; + final String? libraryId; /// Live photo video ID - String? livePhotoVideoId; + final String? livePhotoVideoId; /// Local date time - DateTime? localDateTime; + final DateTime? localDateTime; /// Original file name - String originalFileName; + final String originalFileName; /// Owner ID - String ownerId; + final String ownerId; /// Stack ID - String? stackId; + final String? stackId; /// Thumbhash - String? thumbhash; + final String? thumbhash; - AssetTypeEnum type; + final AssetTypeEnum type; - AssetVisibility visibility; + final AssetVisibility visibility; /// Asset width - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? width; + final int? width; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAssetV2 && - other.checksum == checksum && - other.createdAt == createdAt && - other.deletedAt == deletedAt && - other.duration == duration && - other.fileCreatedAt == fileCreatedAt && - other.fileModifiedAt == fileModifiedAt && - other.height == height && - other.id == id && - other.isEdited == isEdited && - other.isFavorite == isFavorite && - other.libraryId == libraryId && - other.livePhotoVideoId == livePhotoVideoId && - other.localDateTime == localDateTime && - other.originalFileName == originalFileName && - other.ownerId == ownerId && - other.stackId == stackId && - other.thumbhash == thumbhash && - other.type == type && - other.visibility == visibility && - other.width == width; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (checksum.hashCode) + - (createdAt == null ? 0 : createdAt!.hashCode) + - (deletedAt == null ? 0 : deletedAt!.hashCode) + - (duration == null ? 0 : duration!.hashCode) + - (fileCreatedAt == null ? 0 : fileCreatedAt!.hashCode) + - (fileModifiedAt == null ? 0 : fileModifiedAt!.hashCode) + - (height == null ? 0 : height!.hashCode) + - (id.hashCode) + - (isEdited.hashCode) + - (isFavorite.hashCode) + - (libraryId == null ? 0 : libraryId!.hashCode) + - (livePhotoVideoId == null ? 0 : livePhotoVideoId!.hashCode) + - (localDateTime == null ? 0 : localDateTime!.hashCode) + - (originalFileName.hashCode) + - (ownerId.hashCode) + - (stackId == null ? 0 : stackId!.hashCode) + - (thumbhash == null ? 0 : thumbhash!.hashCode) + - (type.hashCode) + - (visibility.hashCode) + - (width == null ? 0 : width!.hashCode); - - @override - String toString() => 'SyncAssetV2[checksum=$checksum, createdAt=$createdAt, deletedAt=$deletedAt, duration=$duration, fileCreatedAt=$fileCreatedAt, fileModifiedAt=$fileModifiedAt, height=$height, id=$id, isEdited=$isEdited, isFavorite=$isFavorite, libraryId=$libraryId, livePhotoVideoId=$livePhotoVideoId, localDateTime=$localDateTime, originalFileName=$originalFileName, ownerId=$ownerId, stackId=$stackId, thumbhash=$thumbhash, type=$type, visibility=$visibility, width=$width]'; + static SyncAssetV2? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + checksum: json[r'checksum'] as String, + createdAt: (json[r'createdAt'] == null ? null : DateTime.parse(json[r'createdAt'] as String)), + deletedAt: (json[r'deletedAt'] == null ? null : DateTime.parse(json[r'deletedAt'] as String)), + duration: (json[r'duration'] as int?), + fileCreatedAt: (json[r'fileCreatedAt'] == null ? null : DateTime.parse(json[r'fileCreatedAt'] as String)), + fileModifiedAt: (json[r'fileModifiedAt'] == null ? null : DateTime.parse(json[r'fileModifiedAt'] as String)), + height: (json[r'height'] as int?), + id: json[r'id'] as String, + isEdited: json[r'isEdited'] as bool, + isFavorite: json[r'isFavorite'] as bool, + libraryId: (json[r'libraryId'] as String?), + livePhotoVideoId: (json[r'livePhotoVideoId'] as String?), + localDateTime: (json[r'localDateTime'] == null ? null : DateTime.parse(json[r'localDateTime'] as String)), + originalFileName: json[r'originalFileName'] as String, + ownerId: json[r'ownerId'] as String, + stackId: (json[r'stackId'] as String?), + thumbhash: (json[r'thumbhash'] as String?), + type: (AssetTypeEnum.fromJson(json[r'type']))!, + visibility: (AssetVisibility.fromJson(json[r'visibility']))!, + width: (json[r'width'] as int?), + ); + } Map toJson() { final json = {}; - json[r'checksum'] = this.checksum; - if (this.createdAt != null) { - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt!.millisecondsSinceEpoch - : this.createdAt!.toUtc().toIso8601String(); - } else { - // json[r'createdAt'] = null; + json[r'checksum'] = checksum; + if (createdAt != null) { + json[r'createdAt'] = createdAt!.toUtc().toIso8601String(); } - if (this.deletedAt != null) { - json[r'deletedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.deletedAt!.millisecondsSinceEpoch - : this.deletedAt!.toUtc().toIso8601String(); - } else { - // json[r'deletedAt'] = null; + if (deletedAt != null) { + json[r'deletedAt'] = deletedAt!.toUtc().toIso8601String(); } - if (this.duration != null) { - json[r'duration'] = this.duration; - } else { - // json[r'duration'] = null; + if (duration != null) { + json[r'duration'] = duration!; } - if (this.fileCreatedAt != null) { - json[r'fileCreatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.fileCreatedAt!.millisecondsSinceEpoch - : this.fileCreatedAt!.toUtc().toIso8601String(); - } else { - // json[r'fileCreatedAt'] = null; + if (fileCreatedAt != null) { + json[r'fileCreatedAt'] = fileCreatedAt!.toUtc().toIso8601String(); } - if (this.fileModifiedAt != null) { - json[r'fileModifiedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.fileModifiedAt!.millisecondsSinceEpoch - : this.fileModifiedAt!.toUtc().toIso8601String(); - } else { - // json[r'fileModifiedAt'] = null; + if (fileModifiedAt != null) { + json[r'fileModifiedAt'] = fileModifiedAt!.toUtc().toIso8601String(); } - if (this.height != null) { - json[r'height'] = this.height; - } else { - // json[r'height'] = null; + if (height != null) { + json[r'height'] = height!; } - json[r'id'] = this.id; - json[r'isEdited'] = this.isEdited; - json[r'isFavorite'] = this.isFavorite; - if (this.libraryId != null) { - json[r'libraryId'] = this.libraryId; - } else { - // json[r'libraryId'] = null; + json[r'id'] = id; + json[r'isEdited'] = isEdited; + json[r'isFavorite'] = isFavorite; + if (libraryId != null) { + json[r'libraryId'] = libraryId!; } - if (this.livePhotoVideoId != null) { - json[r'livePhotoVideoId'] = this.livePhotoVideoId; - } else { - // json[r'livePhotoVideoId'] = null; + if (livePhotoVideoId != null) { + json[r'livePhotoVideoId'] = livePhotoVideoId!; } - if (this.localDateTime != null) { - json[r'localDateTime'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.localDateTime!.millisecondsSinceEpoch - : this.localDateTime!.toUtc().toIso8601String(); - } else { - // json[r'localDateTime'] = null; + if (localDateTime != null) { + json[r'localDateTime'] = localDateTime!.toUtc().toIso8601String(); } - json[r'originalFileName'] = this.originalFileName; - json[r'ownerId'] = this.ownerId; - if (this.stackId != null) { - json[r'stackId'] = this.stackId; - } else { - // json[r'stackId'] = null; + json[r'originalFileName'] = originalFileName; + json[r'ownerId'] = ownerId; + if (stackId != null) { + json[r'stackId'] = stackId!; } - if (this.thumbhash != null) { - json[r'thumbhash'] = this.thumbhash; - } else { - // json[r'thumbhash'] = null; + if (thumbhash != null) { + json[r'thumbhash'] = thumbhash!; } - json[r'type'] = this.type; - json[r'visibility'] = this.visibility; - if (this.width != null) { - json[r'width'] = this.width; - } else { - // json[r'width'] = null; + json[r'type'] = type.toJson(); + json[r'visibility'] = visibility.toJson(); + if (width != null) { + json[r'width'] = width!; } return json; } - /// Returns a new [SyncAssetV2] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAssetV2? fromJson(dynamic value) { - upgradeDto(value, "SyncAssetV2"); - if (value is Map) { - final json = value.cast(); - - return SyncAssetV2( - checksum: mapValueOfType(json, r'checksum')!, - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - deletedAt: mapDateTime(json, r'deletedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - duration: mapValueOfType(json, r'duration'), - fileCreatedAt: mapDateTime(json, r'fileCreatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - fileModifiedAt: mapDateTime(json, r'fileModifiedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - height: mapValueOfType(json, r'height'), - id: mapValueOfType(json, r'id')!, - isEdited: mapValueOfType(json, r'isEdited')!, - isFavorite: mapValueOfType(json, r'isFavorite')!, - libraryId: mapValueOfType(json, r'libraryId'), - livePhotoVideoId: mapValueOfType(json, r'livePhotoVideoId'), - localDateTime: mapDateTime(json, r'localDateTime', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - originalFileName: mapValueOfType(json, r'originalFileName')!, - ownerId: mapValueOfType(json, r'ownerId')!, - stackId: mapValueOfType(json, r'stackId'), - thumbhash: mapValueOfType(json, r'thumbhash'), - type: AssetTypeEnum.fromJson(json[r'type'])!, - visibility: AssetVisibility.fromJson(json[r'visibility'])!, - width: mapValueOfType(json, r'width'), - ); - } - return null; + SyncAssetV2 copyWith({ + String? checksum, + Object? createdAt = _undefined, + Object? deletedAt = _undefined, + Object? duration = _undefined, + Object? fileCreatedAt = _undefined, + Object? fileModifiedAt = _undefined, + Object? height = _undefined, + String? id, + bool? isEdited, + bool? isFavorite, + Object? libraryId = _undefined, + Object? livePhotoVideoId = _undefined, + Object? localDateTime = _undefined, + String? originalFileName, + String? ownerId, + Object? stackId = _undefined, + Object? thumbhash = _undefined, + AssetTypeEnum? type, + AssetVisibility? visibility, + Object? width = _undefined, + }) { + return .new( + checksum: checksum ?? this.checksum, + createdAt: identical(createdAt, _undefined) ? this.createdAt : createdAt as DateTime?, + deletedAt: identical(deletedAt, _undefined) ? this.deletedAt : deletedAt as DateTime?, + duration: identical(duration, _undefined) ? this.duration : duration as int?, + fileCreatedAt: identical(fileCreatedAt, _undefined) ? this.fileCreatedAt : fileCreatedAt as DateTime?, + fileModifiedAt: identical(fileModifiedAt, _undefined) ? this.fileModifiedAt : fileModifiedAt as DateTime?, + height: identical(height, _undefined) ? this.height : height as int?, + id: id ?? this.id, + isEdited: isEdited ?? this.isEdited, + isFavorite: isFavorite ?? this.isFavorite, + libraryId: identical(libraryId, _undefined) ? this.libraryId : libraryId as String?, + livePhotoVideoId: identical(livePhotoVideoId, _undefined) ? this.livePhotoVideoId : livePhotoVideoId as String?, + localDateTime: identical(localDateTime, _undefined) ? this.localDateTime : localDateTime as DateTime?, + originalFileName: originalFileName ?? this.originalFileName, + ownerId: ownerId ?? this.ownerId, + stackId: identical(stackId, _undefined) ? this.stackId : stackId as String?, + thumbhash: identical(thumbhash, _undefined) ? this.thumbhash : thumbhash as String?, + type: type ?? this.type, + visibility: visibility ?? this.visibility, + width: identical(width, _undefined) ? this.width : width as int?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAssetV2.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAssetV2 && + checksum == other.checksum && + createdAt == other.createdAt && + deletedAt == other.deletedAt && + duration == other.duration && + fileCreatedAt == other.fileCreatedAt && + fileModifiedAt == other.fileModifiedAt && + height == other.height && + id == other.id && + isEdited == other.isEdited && + isFavorite == other.isFavorite && + libraryId == other.libraryId && + livePhotoVideoId == other.livePhotoVideoId && + localDateTime == other.localDateTime && + originalFileName == other.originalFileName && + ownerId == other.ownerId && + stackId == other.stackId && + thumbhash == other.thumbhash && + type == other.type && + visibility == other.visibility && + width == other.width); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAssetV2.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + checksum, + createdAt, + deletedAt, + duration, + fileCreatedAt, + fileModifiedAt, + height, + id, + isEdited, + isFavorite, + libraryId, + livePhotoVideoId, + localDateTime, + originalFileName, + ownerId, + stackId, + thumbhash, + type, + visibility, + width, + ]); } - // maps a json object with a list of SyncAssetV2-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAssetV2.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'checksum', - 'createdAt', - 'deletedAt', - 'duration', - 'fileCreatedAt', - 'fileModifiedAt', - 'height', - 'id', - 'isEdited', - 'isFavorite', - 'libraryId', - 'livePhotoVideoId', - 'localDateTime', - 'originalFileName', - 'ownerId', - 'stackId', - 'thumbhash', - 'type', - 'visibility', - 'width', - }; + @override + String toString() => + 'SyncAssetV2(checksum=$checksum, createdAt=$createdAt, deletedAt=$deletedAt, duration=$duration, fileCreatedAt=$fileCreatedAt, fileModifiedAt=$fileModifiedAt, height=$height, id=$id, isEdited=$isEdited, isFavorite=$isFavorite, libraryId=$libraryId, livePhotoVideoId=$livePhotoVideoId, localDateTime=$localDateTime, originalFileName=$originalFileName, ownerId=$ownerId, stackId=$stackId, thumbhash=$thumbhash, type=$type, visibility=$visibility, width=$width)'; } - diff --git a/mobile/openapi/lib/model/sync_auth_user_v1.dart b/mobile/openapi/lib/model/sync_auth_user_v1.dart index c64d82bfbd..03fc248106 100644 --- a/mobile/openapi/lib/model/sync_auth_user_v1.dart +++ b/mobile/openapi/lib/model/sync_auth_user_v1.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncAuthUserV1 { - /// Returns a new [SyncAuthUserV1] instance. - SyncAuthUserV1({ +final class SyncAuthUserV1 { + const SyncAuthUserV1({ this.avatarColor, required this.deletedAt, required this.email, @@ -28,209 +19,166 @@ class SyncAuthUserV1 { required this.storageLabel, }); - UserAvatarColor? avatarColor; + final UserAvatarColor? avatarColor; /// User deleted at - DateTime? deletedAt; + final DateTime? deletedAt; /// User email - String email; + final String email; /// User has profile image - bool hasProfileImage; + final bool hasProfileImage; /// User ID - String id; + final String id; /// User is admin - bool isAdmin; + final bool isAdmin; /// User name - String name; + final String name; /// User OAuth ID - String oauthId; + final String oauthId; /// User pin code - String? pinCode; + final String? pinCode; /// User profile changed at - DateTime profileChangedAt; + final DateTime profileChangedAt; /// Quota size in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? quotaSizeInBytes; + final int? quotaSizeInBytes; /// Quota usage in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int quotaUsageInBytes; + final int quotaUsageInBytes; /// User storage label - String? storageLabel; + final String? storageLabel; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncAuthUserV1 && - other.avatarColor == avatarColor && - other.deletedAt == deletedAt && - other.email == email && - other.hasProfileImage == hasProfileImage && - other.id == id && - other.isAdmin == isAdmin && - other.name == name && - other.oauthId == oauthId && - other.pinCode == pinCode && - other.profileChangedAt == profileChangedAt && - other.quotaSizeInBytes == quotaSizeInBytes && - other.quotaUsageInBytes == quotaUsageInBytes && - other.storageLabel == storageLabel; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (avatarColor == null ? 0 : avatarColor!.hashCode) + - (deletedAt == null ? 0 : deletedAt!.hashCode) + - (email.hashCode) + - (hasProfileImage.hashCode) + - (id.hashCode) + - (isAdmin.hashCode) + - (name.hashCode) + - (oauthId.hashCode) + - (pinCode == null ? 0 : pinCode!.hashCode) + - (profileChangedAt.hashCode) + - (quotaSizeInBytes == null ? 0 : quotaSizeInBytes!.hashCode) + - (quotaUsageInBytes.hashCode) + - (storageLabel == null ? 0 : storageLabel!.hashCode); - - @override - String toString() => 'SyncAuthUserV1[avatarColor=$avatarColor, deletedAt=$deletedAt, email=$email, hasProfileImage=$hasProfileImage, id=$id, isAdmin=$isAdmin, name=$name, oauthId=$oauthId, pinCode=$pinCode, profileChangedAt=$profileChangedAt, quotaSizeInBytes=$quotaSizeInBytes, quotaUsageInBytes=$quotaUsageInBytes, storageLabel=$storageLabel]'; + static SyncAuthUserV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + avatarColor: UserAvatarColor.fromJson(json[r'avatarColor']), + deletedAt: (json[r'deletedAt'] == null ? null : DateTime.parse(json[r'deletedAt'] as String)), + email: json[r'email'] as String, + hasProfileImage: json[r'hasProfileImage'] as bool, + id: json[r'id'] as String, + isAdmin: json[r'isAdmin'] as bool, + name: json[r'name'] as String, + oauthId: json[r'oauthId'] as String, + pinCode: (json[r'pinCode'] as String?), + profileChangedAt: DateTime.parse(json[r'profileChangedAt'] as String), + quotaSizeInBytes: (json[r'quotaSizeInBytes'] as int?), + quotaUsageInBytes: json[r'quotaUsageInBytes'] as int, + storageLabel: (json[r'storageLabel'] as String?), + ); + } Map toJson() { final json = {}; - if (this.avatarColor != null) { - json[r'avatarColor'] = this.avatarColor; - } else { - // json[r'avatarColor'] = null; + if (avatarColor != null) { + json[r'avatarColor'] = avatarColor!.toJson(); } - if (this.deletedAt != null) { - json[r'deletedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.deletedAt!.millisecondsSinceEpoch - : this.deletedAt!.toUtc().toIso8601String(); - } else { - // json[r'deletedAt'] = null; + if (deletedAt != null) { + json[r'deletedAt'] = deletedAt!.toUtc().toIso8601String(); } - json[r'email'] = this.email; - json[r'hasProfileImage'] = this.hasProfileImage; - json[r'id'] = this.id; - json[r'isAdmin'] = this.isAdmin; - json[r'name'] = this.name; - json[r'oauthId'] = this.oauthId; - if (this.pinCode != null) { - json[r'pinCode'] = this.pinCode; - } else { - // json[r'pinCode'] = null; + json[r'email'] = email; + json[r'hasProfileImage'] = hasProfileImage; + json[r'id'] = id; + json[r'isAdmin'] = isAdmin; + json[r'name'] = name; + json[r'oauthId'] = oauthId; + if (pinCode != null) { + json[r'pinCode'] = pinCode!; } - json[r'profileChangedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.profileChangedAt.millisecondsSinceEpoch - : this.profileChangedAt.toUtc().toIso8601String(); - if (this.quotaSizeInBytes != null) { - json[r'quotaSizeInBytes'] = this.quotaSizeInBytes; - } else { - // json[r'quotaSizeInBytes'] = null; + json[r'profileChangedAt'] = profileChangedAt.toUtc().toIso8601String(); + if (quotaSizeInBytes != null) { + json[r'quotaSizeInBytes'] = quotaSizeInBytes!; } - json[r'quotaUsageInBytes'] = this.quotaUsageInBytes; - if (this.storageLabel != null) { - json[r'storageLabel'] = this.storageLabel; - } else { - // json[r'storageLabel'] = null; + json[r'quotaUsageInBytes'] = quotaUsageInBytes; + if (storageLabel != null) { + json[r'storageLabel'] = storageLabel!; } return json; } - /// Returns a new [SyncAuthUserV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncAuthUserV1? fromJson(dynamic value) { - upgradeDto(value, "SyncAuthUserV1"); - if (value is Map) { - final json = value.cast(); - - return SyncAuthUserV1( - avatarColor: UserAvatarColor.fromJson(json[r'avatarColor']), - deletedAt: mapDateTime(json, r'deletedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - email: mapValueOfType(json, r'email')!, - hasProfileImage: mapValueOfType(json, r'hasProfileImage')!, - id: mapValueOfType(json, r'id')!, - isAdmin: mapValueOfType(json, r'isAdmin')!, - name: mapValueOfType(json, r'name')!, - oauthId: mapValueOfType(json, r'oauthId')!, - pinCode: mapValueOfType(json, r'pinCode'), - profileChangedAt: mapDateTime(json, r'profileChangedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - quotaSizeInBytes: mapValueOfType(json, r'quotaSizeInBytes'), - quotaUsageInBytes: mapValueOfType(json, r'quotaUsageInBytes')!, - storageLabel: mapValueOfType(json, r'storageLabel'), - ); - } - return null; + SyncAuthUserV1 copyWith({ + Object? avatarColor = _undefined, + Object? deletedAt = _undefined, + String? email, + bool? hasProfileImage, + String? id, + bool? isAdmin, + String? name, + String? oauthId, + Object? pinCode = _undefined, + DateTime? profileChangedAt, + Object? quotaSizeInBytes = _undefined, + int? quotaUsageInBytes, + Object? storageLabel = _undefined, + }) { + return .new( + avatarColor: identical(avatarColor, _undefined) ? this.avatarColor : avatarColor as UserAvatarColor?, + deletedAt: identical(deletedAt, _undefined) ? this.deletedAt : deletedAt as DateTime?, + email: email ?? this.email, + hasProfileImage: hasProfileImage ?? this.hasProfileImage, + id: id ?? this.id, + isAdmin: isAdmin ?? this.isAdmin, + name: name ?? this.name, + oauthId: oauthId ?? this.oauthId, + pinCode: identical(pinCode, _undefined) ? this.pinCode : pinCode as String?, + profileChangedAt: profileChangedAt ?? this.profileChangedAt, + quotaSizeInBytes: identical(quotaSizeInBytes, _undefined) ? this.quotaSizeInBytes : quotaSizeInBytes as int?, + quotaUsageInBytes: quotaUsageInBytes ?? this.quotaUsageInBytes, + storageLabel: identical(storageLabel, _undefined) ? this.storageLabel : storageLabel as String?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncAuthUserV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncAuthUserV1 && + avatarColor == other.avatarColor && + deletedAt == other.deletedAt && + email == other.email && + hasProfileImage == other.hasProfileImage && + id == other.id && + isAdmin == other.isAdmin && + name == other.name && + oauthId == other.oauthId && + pinCode == other.pinCode && + profileChangedAt == other.profileChangedAt && + quotaSizeInBytes == other.quotaSizeInBytes && + quotaUsageInBytes == other.quotaUsageInBytes && + storageLabel == other.storageLabel); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncAuthUserV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + avatarColor, + deletedAt, + email, + hasProfileImage, + id, + isAdmin, + name, + oauthId, + pinCode, + profileChangedAt, + quotaSizeInBytes, + quotaUsageInBytes, + storageLabel, + ]); } - // maps a json object with a list of SyncAuthUserV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncAuthUserV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'deletedAt', - 'email', - 'hasProfileImage', - 'id', - 'isAdmin', - 'name', - 'oauthId', - 'pinCode', - 'profileChangedAt', - 'quotaSizeInBytes', - 'quotaUsageInBytes', - 'storageLabel', - }; + @override + String toString() => + 'SyncAuthUserV1(avatarColor=$avatarColor, deletedAt=$deletedAt, email=$email, hasProfileImage=$hasProfileImage, id=$id, isAdmin=$isAdmin, name=$name, oauthId=$oauthId, pinCode=$pinCode, profileChangedAt=$profileChangedAt, quotaSizeInBytes=$quotaSizeInBytes, quotaUsageInBytes=$quotaUsageInBytes, storageLabel=$storageLabel)'; } - diff --git a/mobile/openapi/lib/model/sync_complete_v1.dart b/mobile/openapi/lib/model/sync_complete_v1.dart new file mode 100644 index 0000000000..b6ea36e550 --- /dev/null +++ b/mobile/openapi/lib/model/sync_complete_v1.dart @@ -0,0 +1,36 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +part of openapi.api; + +final class SyncCompleteV1 { + const SyncCompleteV1(); + + static SyncCompleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(); + } + + Map toJson() { + final json = {}; + return json; + } + + SyncCompleteV1 copyWith() { + return .new(); + } + + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncCompleteV1); + } + + @override + int get hashCode { + return runtimeType.hashCode; + } + + @override + String toString() => 'SyncCompleteV1()'; +} diff --git a/mobile/openapi/lib/model/sync_entity_type.dart b/mobile/openapi/lib/model/sync_entity_type.dart index 124cfdc8c4..7d19809c2f 100644 --- a/mobile/openapi/lib/model/sync_entity_type.dart +++ b/mobile/openapi/lib/model/sync_entity_type.dart @@ -1,250 +1,83 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Sync entity type -class SyncEntityType { - /// Instantiate a new enum with the provided [value]. +enum SyncEntityType { + authUserV1._(r'AuthUserV1'), + userV1._(r'UserV1'), + userDeleteV1._(r'UserDeleteV1'), + assetV1._(r'AssetV1'), + assetV2._(r'AssetV2'), + assetDeleteV1._(r'AssetDeleteV1'), + assetExifV1._(r'AssetExifV1'), + assetEditV1._(r'AssetEditV1'), + assetEditDeleteV1._(r'AssetEditDeleteV1'), + assetMetadataV1._(r'AssetMetadataV1'), + assetMetadataDeleteV1._(r'AssetMetadataDeleteV1'), + partnerV1._(r'PartnerV1'), + partnerDeleteV1._(r'PartnerDeleteV1'), + partnerAssetV1._(r'PartnerAssetV1'), + partnerAssetV2._(r'PartnerAssetV2'), + partnerAssetBackfillV1._(r'PartnerAssetBackfillV1'), + partnerAssetBackfillV2._(r'PartnerAssetBackfillV2'), + partnerAssetDeleteV1._(r'PartnerAssetDeleteV1'), + partnerAssetExifV1._(r'PartnerAssetExifV1'), + partnerAssetExifBackfillV1._(r'PartnerAssetExifBackfillV1'), + partnerStackBackfillV1._(r'PartnerStackBackfillV1'), + partnerStackDeleteV1._(r'PartnerStackDeleteV1'), + partnerStackV1._(r'PartnerStackV1'), + albumV1._(r'AlbumV1'), + albumV2._(r'AlbumV2'), + albumDeleteV1._(r'AlbumDeleteV1'), + albumUserV1._(r'AlbumUserV1'), + albumUserBackfillV1._(r'AlbumUserBackfillV1'), + albumUserDeleteV1._(r'AlbumUserDeleteV1'), + albumAssetCreateV1._(r'AlbumAssetCreateV1'), + albumAssetCreateV2._(r'AlbumAssetCreateV2'), + albumAssetUpdateV1._(r'AlbumAssetUpdateV1'), + albumAssetUpdateV2._(r'AlbumAssetUpdateV2'), + albumAssetBackfillV1._(r'AlbumAssetBackfillV1'), + albumAssetBackfillV2._(r'AlbumAssetBackfillV2'), + albumAssetExifCreateV1._(r'AlbumAssetExifCreateV1'), + albumAssetExifUpdateV1._(r'AlbumAssetExifUpdateV1'), + albumAssetExifBackfillV1._(r'AlbumAssetExifBackfillV1'), + albumToAssetV1._(r'AlbumToAssetV1'), + albumToAssetDeleteV1._(r'AlbumToAssetDeleteV1'), + albumToAssetBackfillV1._(r'AlbumToAssetBackfillV1'), + memoryV1._(r'MemoryV1'), + memoryDeleteV1._(r'MemoryDeleteV1'), + memoryToAssetV1._(r'MemoryToAssetV1'), + memoryToAssetDeleteV1._(r'MemoryToAssetDeleteV1'), + stackV1._(r'StackV1'), + stackDeleteV1._(r'StackDeleteV1'), + personV1._(r'PersonV1'), + personDeleteV1._(r'PersonDeleteV1'), + assetFaceV1._(r'AssetFaceV1'), + assetFaceV2._(r'AssetFaceV2'), + assetFaceDeleteV1._(r'AssetFaceDeleteV1'), + userMetadataV1._(r'UserMetadataV1'), + userMetadataDeleteV1._(r'UserMetadataDeleteV1'), + syncAckV1._(r'SyncAckV1'), + syncResetV1._(r'SyncResetV1'), + syncCompleteV1._(r'SyncCompleteV1'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const SyncEntityType._(this.value); - /// The underlying value of this enum member. final String value; + static SyncEntityType? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const authUserV1 = SyncEntityType._(r'AuthUserV1'); - static const userV1 = SyncEntityType._(r'UserV1'); - static const userDeleteV1 = SyncEntityType._(r'UserDeleteV1'); - static const assetV1 = SyncEntityType._(r'AssetV1'); - static const assetV2 = SyncEntityType._(r'AssetV2'); - static const assetDeleteV1 = SyncEntityType._(r'AssetDeleteV1'); - static const assetExifV1 = SyncEntityType._(r'AssetExifV1'); - static const assetEditV1 = SyncEntityType._(r'AssetEditV1'); - static const assetEditDeleteV1 = SyncEntityType._(r'AssetEditDeleteV1'); - static const assetMetadataV1 = SyncEntityType._(r'AssetMetadataV1'); - static const assetMetadataDeleteV1 = SyncEntityType._(r'AssetMetadataDeleteV1'); - static const partnerV1 = SyncEntityType._(r'PartnerV1'); - static const partnerDeleteV1 = SyncEntityType._(r'PartnerDeleteV1'); - static const partnerAssetV1 = SyncEntityType._(r'PartnerAssetV1'); - static const partnerAssetV2 = SyncEntityType._(r'PartnerAssetV2'); - static const partnerAssetBackfillV1 = SyncEntityType._(r'PartnerAssetBackfillV1'); - static const partnerAssetBackfillV2 = SyncEntityType._(r'PartnerAssetBackfillV2'); - static const partnerAssetDeleteV1 = SyncEntityType._(r'PartnerAssetDeleteV1'); - static const partnerAssetExifV1 = SyncEntityType._(r'PartnerAssetExifV1'); - static const partnerAssetExifBackfillV1 = SyncEntityType._(r'PartnerAssetExifBackfillV1'); - static const partnerStackBackfillV1 = SyncEntityType._(r'PartnerStackBackfillV1'); - static const partnerStackDeleteV1 = SyncEntityType._(r'PartnerStackDeleteV1'); - static const partnerStackV1 = SyncEntityType._(r'PartnerStackV1'); - static const albumV1 = SyncEntityType._(r'AlbumV1'); - static const albumV2 = SyncEntityType._(r'AlbumV2'); - static const albumDeleteV1 = SyncEntityType._(r'AlbumDeleteV1'); - static const albumUserV1 = SyncEntityType._(r'AlbumUserV1'); - static const albumUserBackfillV1 = SyncEntityType._(r'AlbumUserBackfillV1'); - static const albumUserDeleteV1 = SyncEntityType._(r'AlbumUserDeleteV1'); - static const albumAssetCreateV1 = SyncEntityType._(r'AlbumAssetCreateV1'); - static const albumAssetCreateV2 = SyncEntityType._(r'AlbumAssetCreateV2'); - static const albumAssetUpdateV1 = SyncEntityType._(r'AlbumAssetUpdateV1'); - static const albumAssetUpdateV2 = SyncEntityType._(r'AlbumAssetUpdateV2'); - static const albumAssetBackfillV1 = SyncEntityType._(r'AlbumAssetBackfillV1'); - static const albumAssetBackfillV2 = SyncEntityType._(r'AlbumAssetBackfillV2'); - static const albumAssetExifCreateV1 = SyncEntityType._(r'AlbumAssetExifCreateV1'); - static const albumAssetExifUpdateV1 = SyncEntityType._(r'AlbumAssetExifUpdateV1'); - static const albumAssetExifBackfillV1 = SyncEntityType._(r'AlbumAssetExifBackfillV1'); - static const albumToAssetV1 = SyncEntityType._(r'AlbumToAssetV1'); - static const albumToAssetDeleteV1 = SyncEntityType._(r'AlbumToAssetDeleteV1'); - static const albumToAssetBackfillV1 = SyncEntityType._(r'AlbumToAssetBackfillV1'); - static const memoryV1 = SyncEntityType._(r'MemoryV1'); - static const memoryDeleteV1 = SyncEntityType._(r'MemoryDeleteV1'); - static const memoryToAssetV1 = SyncEntityType._(r'MemoryToAssetV1'); - static const memoryToAssetDeleteV1 = SyncEntityType._(r'MemoryToAssetDeleteV1'); - static const stackV1 = SyncEntityType._(r'StackV1'); - static const stackDeleteV1 = SyncEntityType._(r'StackDeleteV1'); - static const personV1 = SyncEntityType._(r'PersonV1'); - static const personDeleteV1 = SyncEntityType._(r'PersonDeleteV1'); - static const assetFaceV1 = SyncEntityType._(r'AssetFaceV1'); - static const assetFaceV2 = SyncEntityType._(r'AssetFaceV2'); - static const assetFaceDeleteV1 = SyncEntityType._(r'AssetFaceDeleteV1'); - static const userMetadataV1 = SyncEntityType._(r'UserMetadataV1'); - static const userMetadataDeleteV1 = SyncEntityType._(r'UserMetadataDeleteV1'); - static const syncAckV1 = SyncEntityType._(r'SyncAckV1'); - static const syncResetV1 = SyncEntityType._(r'SyncResetV1'); - static const syncCompleteV1 = SyncEntityType._(r'SyncCompleteV1'); - - /// List of all possible values in this [enum][SyncEntityType]. - static const values = [ - authUserV1, - userV1, - userDeleteV1, - assetV1, - assetV2, - assetDeleteV1, - assetExifV1, - assetEditV1, - assetEditDeleteV1, - assetMetadataV1, - assetMetadataDeleteV1, - partnerV1, - partnerDeleteV1, - partnerAssetV1, - partnerAssetV2, - partnerAssetBackfillV1, - partnerAssetBackfillV2, - partnerAssetDeleteV1, - partnerAssetExifV1, - partnerAssetExifBackfillV1, - partnerStackBackfillV1, - partnerStackDeleteV1, - partnerStackV1, - albumV1, - albumV2, - albumDeleteV1, - albumUserV1, - albumUserBackfillV1, - albumUserDeleteV1, - albumAssetCreateV1, - albumAssetCreateV2, - albumAssetUpdateV1, - albumAssetUpdateV2, - albumAssetBackfillV1, - albumAssetBackfillV2, - albumAssetExifCreateV1, - albumAssetExifUpdateV1, - albumAssetExifBackfillV1, - albumToAssetV1, - albumToAssetDeleteV1, - albumToAssetBackfillV1, - memoryV1, - memoryDeleteV1, - memoryToAssetV1, - memoryToAssetDeleteV1, - stackV1, - stackDeleteV1, - personV1, - personDeleteV1, - assetFaceV1, - assetFaceV2, - assetFaceDeleteV1, - userMetadataV1, - userMetadataDeleteV1, - syncAckV1, - syncResetV1, - syncCompleteV1, - ]; - - static SyncEntityType? fromJson(dynamic value) => SyncEntityTypeTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncEntityType.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [SyncEntityType] to String, -/// and [decode] dynamic data back to [SyncEntityType]. -class SyncEntityTypeTypeTransformer { - factory SyncEntityTypeTypeTransformer() => _instance ??= const SyncEntityTypeTypeTransformer._(); - - const SyncEntityTypeTypeTransformer._(); - - String encode(SyncEntityType data) => data.value; - - /// Decodes a [dynamic value][data] to a SyncEntityType. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - SyncEntityType? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'AuthUserV1': return SyncEntityType.authUserV1; - case r'UserV1': return SyncEntityType.userV1; - case r'UserDeleteV1': return SyncEntityType.userDeleteV1; - case r'AssetV1': return SyncEntityType.assetV1; - case r'AssetV2': return SyncEntityType.assetV2; - case r'AssetDeleteV1': return SyncEntityType.assetDeleteV1; - case r'AssetExifV1': return SyncEntityType.assetExifV1; - case r'AssetEditV1': return SyncEntityType.assetEditV1; - case r'AssetEditDeleteV1': return SyncEntityType.assetEditDeleteV1; - case r'AssetMetadataV1': return SyncEntityType.assetMetadataV1; - case r'AssetMetadataDeleteV1': return SyncEntityType.assetMetadataDeleteV1; - case r'PartnerV1': return SyncEntityType.partnerV1; - case r'PartnerDeleteV1': return SyncEntityType.partnerDeleteV1; - case r'PartnerAssetV1': return SyncEntityType.partnerAssetV1; - case r'PartnerAssetV2': return SyncEntityType.partnerAssetV2; - case r'PartnerAssetBackfillV1': return SyncEntityType.partnerAssetBackfillV1; - case r'PartnerAssetBackfillV2': return SyncEntityType.partnerAssetBackfillV2; - case r'PartnerAssetDeleteV1': return SyncEntityType.partnerAssetDeleteV1; - case r'PartnerAssetExifV1': return SyncEntityType.partnerAssetExifV1; - case r'PartnerAssetExifBackfillV1': return SyncEntityType.partnerAssetExifBackfillV1; - case r'PartnerStackBackfillV1': return SyncEntityType.partnerStackBackfillV1; - case r'PartnerStackDeleteV1': return SyncEntityType.partnerStackDeleteV1; - case r'PartnerStackV1': return SyncEntityType.partnerStackV1; - case r'AlbumV1': return SyncEntityType.albumV1; - case r'AlbumV2': return SyncEntityType.albumV2; - case r'AlbumDeleteV1': return SyncEntityType.albumDeleteV1; - case r'AlbumUserV1': return SyncEntityType.albumUserV1; - case r'AlbumUserBackfillV1': return SyncEntityType.albumUserBackfillV1; - case r'AlbumUserDeleteV1': return SyncEntityType.albumUserDeleteV1; - case r'AlbumAssetCreateV1': return SyncEntityType.albumAssetCreateV1; - case r'AlbumAssetCreateV2': return SyncEntityType.albumAssetCreateV2; - case r'AlbumAssetUpdateV1': return SyncEntityType.albumAssetUpdateV1; - case r'AlbumAssetUpdateV2': return SyncEntityType.albumAssetUpdateV2; - case r'AlbumAssetBackfillV1': return SyncEntityType.albumAssetBackfillV1; - case r'AlbumAssetBackfillV2': return SyncEntityType.albumAssetBackfillV2; - case r'AlbumAssetExifCreateV1': return SyncEntityType.albumAssetExifCreateV1; - case r'AlbumAssetExifUpdateV1': return SyncEntityType.albumAssetExifUpdateV1; - case r'AlbumAssetExifBackfillV1': return SyncEntityType.albumAssetExifBackfillV1; - case r'AlbumToAssetV1': return SyncEntityType.albumToAssetV1; - case r'AlbumToAssetDeleteV1': return SyncEntityType.albumToAssetDeleteV1; - case r'AlbumToAssetBackfillV1': return SyncEntityType.albumToAssetBackfillV1; - case r'MemoryV1': return SyncEntityType.memoryV1; - case r'MemoryDeleteV1': return SyncEntityType.memoryDeleteV1; - case r'MemoryToAssetV1': return SyncEntityType.memoryToAssetV1; - case r'MemoryToAssetDeleteV1': return SyncEntityType.memoryToAssetDeleteV1; - case r'StackV1': return SyncEntityType.stackV1; - case r'StackDeleteV1': return SyncEntityType.stackDeleteV1; - case r'PersonV1': return SyncEntityType.personV1; - case r'PersonDeleteV1': return SyncEntityType.personDeleteV1; - case r'AssetFaceV1': return SyncEntityType.assetFaceV1; - case r'AssetFaceV2': return SyncEntityType.assetFaceV2; - case r'AssetFaceDeleteV1': return SyncEntityType.assetFaceDeleteV1; - case r'UserMetadataV1': return SyncEntityType.userMetadataV1; - case r'UserMetadataDeleteV1': return SyncEntityType.userMetadataDeleteV1; - case r'SyncAckV1': return SyncEntityType.syncAckV1; - case r'SyncResetV1': return SyncEntityType.syncResetV1; - case r'SyncCompleteV1': return SyncEntityType.syncCompleteV1; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [SyncEntityTypeTypeTransformer] instance. - static SyncEntityTypeTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/sync_memory_asset_delete_v1.dart b/mobile/openapi/lib/model/sync_memory_asset_delete_v1.dart index c37682d02d..a801b68fe2 100644 --- a/mobile/openapi/lib/model/sync_memory_asset_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_memory_asset_delete_v1.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncMemoryAssetDeleteV1 { - /// Returns a new [SyncMemoryAssetDeleteV1] instance. - SyncMemoryAssetDeleteV1({ - required this.assetId, - required this.memoryId, - }); +final class SyncMemoryAssetDeleteV1 { + const SyncMemoryAssetDeleteV1({required this.assetId, required this.memoryId}); /// Asset ID - String assetId; + final String assetId; /// Memory ID - String memoryId; + final String memoryId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncMemoryAssetDeleteV1 && - other.assetId == assetId && - other.memoryId == memoryId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (memoryId.hashCode); - - @override - String toString() => 'SyncMemoryAssetDeleteV1[assetId=$assetId, memoryId=$memoryId]'; + static SyncMemoryAssetDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(assetId: json[r'assetId'] as String, memoryId: json[r'memoryId'] as String); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'memoryId'] = this.memoryId; + json[r'assetId'] = assetId; + json[r'memoryId'] = memoryId; return json; } - /// Returns a new [SyncMemoryAssetDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncMemoryAssetDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncMemoryAssetDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncMemoryAssetDeleteV1( - assetId: mapValueOfType(json, r'assetId')!, - memoryId: mapValueOfType(json, r'memoryId')!, - ); - } - return null; + SyncMemoryAssetDeleteV1 copyWith({String? assetId, String? memoryId}) { + return .new(assetId: assetId ?? this.assetId, memoryId: memoryId ?? this.memoryId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncMemoryAssetDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncMemoryAssetDeleteV1 && assetId == other.assetId && memoryId == other.memoryId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncMemoryAssetDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, memoryId]); } - // maps a json object with a list of SyncMemoryAssetDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncMemoryAssetDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'memoryId', - }; + @override + String toString() => 'SyncMemoryAssetDeleteV1(assetId=$assetId, memoryId=$memoryId)'; } - diff --git a/mobile/openapi/lib/model/sync_memory_asset_v1.dart b/mobile/openapi/lib/model/sync_memory_asset_v1.dart index 2cfab98afd..c9ad3ef10a 100644 --- a/mobile/openapi/lib/model/sync_memory_asset_v1.dart +++ b/mobile/openapi/lib/model/sync_memory_asset_v1.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncMemoryAssetV1 { - /// Returns a new [SyncMemoryAssetV1] instance. - SyncMemoryAssetV1({ - required this.assetId, - required this.memoryId, - }); +final class SyncMemoryAssetV1 { + const SyncMemoryAssetV1({required this.assetId, required this.memoryId}); /// Asset ID - String assetId; + final String assetId; /// Memory ID - String memoryId; + final String memoryId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncMemoryAssetV1 && - other.assetId == assetId && - other.memoryId == memoryId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetId.hashCode) + - (memoryId.hashCode); - - @override - String toString() => 'SyncMemoryAssetV1[assetId=$assetId, memoryId=$memoryId]'; + static SyncMemoryAssetV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(assetId: json[r'assetId'] as String, memoryId: json[r'memoryId'] as String); + } Map toJson() { final json = {}; - json[r'assetId'] = this.assetId; - json[r'memoryId'] = this.memoryId; + json[r'assetId'] = assetId; + json[r'memoryId'] = memoryId; return json; } - /// Returns a new [SyncMemoryAssetV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncMemoryAssetV1? fromJson(dynamic value) { - upgradeDto(value, "SyncMemoryAssetV1"); - if (value is Map) { - final json = value.cast(); - - return SyncMemoryAssetV1( - assetId: mapValueOfType(json, r'assetId')!, - memoryId: mapValueOfType(json, r'memoryId')!, - ); - } - return null; + SyncMemoryAssetV1 copyWith({String? assetId, String? memoryId}) { + return .new(assetId: assetId ?? this.assetId, memoryId: memoryId ?? this.memoryId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncMemoryAssetV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncMemoryAssetV1 && assetId == other.assetId && memoryId == other.memoryId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncMemoryAssetV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([assetId, memoryId]); } - // maps a json object with a list of SyncMemoryAssetV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncMemoryAssetV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetId', - 'memoryId', - }; + @override + String toString() => 'SyncMemoryAssetV1(assetId=$assetId, memoryId=$memoryId)'; } - diff --git a/mobile/openapi/lib/model/sync_memory_delete_v1.dart b/mobile/openapi/lib/model/sync_memory_delete_v1.dart index d5f63ec8fa..890bfe5a94 100644 --- a/mobile/openapi/lib/model/sync_memory_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_memory_delete_v1.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncMemoryDeleteV1 { - /// Returns a new [SyncMemoryDeleteV1] instance. - SyncMemoryDeleteV1({ - required this.memoryId, - }); +final class SyncMemoryDeleteV1 { + const SyncMemoryDeleteV1({required this.memoryId}); /// Memory ID - String memoryId; + final String memoryId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncMemoryDeleteV1 && - other.memoryId == memoryId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (memoryId.hashCode); - - @override - String toString() => 'SyncMemoryDeleteV1[memoryId=$memoryId]'; + static SyncMemoryDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(memoryId: json[r'memoryId'] as String); + } Map toJson() { final json = {}; - json[r'memoryId'] = this.memoryId; + json[r'memoryId'] = memoryId; return json; } - /// Returns a new [SyncMemoryDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncMemoryDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncMemoryDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncMemoryDeleteV1( - memoryId: mapValueOfType(json, r'memoryId')!, - ); - } - return null; + SyncMemoryDeleteV1 copyWith({String? memoryId}) { + return .new(memoryId: memoryId ?? this.memoryId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncMemoryDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncMemoryDeleteV1 && memoryId == other.memoryId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncMemoryDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([memoryId]); } - // maps a json object with a list of SyncMemoryDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncMemoryDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'memoryId', - }; + @override + String toString() => 'SyncMemoryDeleteV1(memoryId=$memoryId)'; } - diff --git a/mobile/openapi/lib/model/sync_memory_v1.dart b/mobile/openapi/lib/model/sync_memory_v1.dart index 855340f4d7..567e550794 100644 --- a/mobile/openapi/lib/model/sync_memory_v1.dart +++ b/mobile/openapi/lib/model/sync_memory_v1.dart @@ -1,20 +1,11 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncMemoryV1 { - /// Returns a new [SyncMemoryV1] instance. - SyncMemoryV1({ +final class SyncMemoryV1 { + const SyncMemoryV1({ required this.createdAt, - this.data = const {}, + required this.data, required this.deletedAt, required this.hideAt, required this.id, @@ -28,201 +19,154 @@ class SyncMemoryV1 { }); /// Created at - DateTime createdAt; + final DateTime createdAt; /// Data - Map data; + final Map data; /// Deleted at - DateTime? deletedAt; + final DateTime? deletedAt; /// Hide at - DateTime? hideAt; + final DateTime? hideAt; /// Memory ID - String id; + final String id; /// Is saved - bool isSaved; + final bool isSaved; /// Memory at - DateTime memoryAt; + final DateTime memoryAt; /// Owner ID - String ownerId; + final String ownerId; /// Seen at - DateTime? seenAt; + final DateTime? seenAt; /// Show at - DateTime? showAt; + final DateTime? showAt; - MemoryType type; + final MemoryType type; /// Updated at - DateTime updatedAt; + final DateTime updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncMemoryV1 && - other.createdAt == createdAt && - _deepEquality.equals(other.data, data) && - other.deletedAt == deletedAt && - other.hideAt == hideAt && - other.id == id && - other.isSaved == isSaved && - other.memoryAt == memoryAt && - other.ownerId == ownerId && - other.seenAt == seenAt && - other.showAt == showAt && - other.type == type && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (createdAt.hashCode) + - (data.hashCode) + - (deletedAt == null ? 0 : deletedAt!.hashCode) + - (hideAt == null ? 0 : hideAt!.hashCode) + - (id.hashCode) + - (isSaved.hashCode) + - (memoryAt.hashCode) + - (ownerId.hashCode) + - (seenAt == null ? 0 : seenAt!.hashCode) + - (showAt == null ? 0 : showAt!.hashCode) + - (type.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'SyncMemoryV1[createdAt=$createdAt, data=$data, deletedAt=$deletedAt, hideAt=$hideAt, id=$id, isSaved=$isSaved, memoryAt=$memoryAt, ownerId=$ownerId, seenAt=$seenAt, showAt=$showAt, type=$type, updatedAt=$updatedAt]'; + static SyncMemoryV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + createdAt: DateTime.parse(json[r'createdAt'] as String), + data: ((json[r'data'] as Map?)?.cast())!, + deletedAt: (json[r'deletedAt'] == null ? null : DateTime.parse(json[r'deletedAt'] as String)), + hideAt: (json[r'hideAt'] == null ? null : DateTime.parse(json[r'hideAt'] as String)), + id: json[r'id'] as String, + isSaved: json[r'isSaved'] as bool, + memoryAt: DateTime.parse(json[r'memoryAt'] as String), + ownerId: json[r'ownerId'] as String, + seenAt: (json[r'seenAt'] == null ? null : DateTime.parse(json[r'seenAt'] as String)), + showAt: (json[r'showAt'] == null ? null : DateTime.parse(json[r'showAt'] as String)), + type: (MemoryType.fromJson(json[r'type']))!, + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + ); + } Map toJson() { final json = {}; - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - json[r'data'] = this.data; - if (this.deletedAt != null) { - json[r'deletedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.deletedAt!.millisecondsSinceEpoch - : this.deletedAt!.toUtc().toIso8601String(); - } else { - // json[r'deletedAt'] = null; + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + json[r'data'] = data; + if (deletedAt != null) { + json[r'deletedAt'] = deletedAt!.toUtc().toIso8601String(); } - if (this.hideAt != null) { - json[r'hideAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.hideAt!.millisecondsSinceEpoch - : this.hideAt!.toUtc().toIso8601String(); - } else { - // json[r'hideAt'] = null; + if (hideAt != null) { + json[r'hideAt'] = hideAt!.toUtc().toIso8601String(); } - json[r'id'] = this.id; - json[r'isSaved'] = this.isSaved; - json[r'memoryAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.memoryAt.millisecondsSinceEpoch - : this.memoryAt.toUtc().toIso8601String(); - json[r'ownerId'] = this.ownerId; - if (this.seenAt != null) { - json[r'seenAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.seenAt!.millisecondsSinceEpoch - : this.seenAt!.toUtc().toIso8601String(); - } else { - // json[r'seenAt'] = null; + json[r'id'] = id; + json[r'isSaved'] = isSaved; + json[r'memoryAt'] = memoryAt.toUtc().toIso8601String(); + json[r'ownerId'] = ownerId; + if (seenAt != null) { + json[r'seenAt'] = seenAt!.toUtc().toIso8601String(); } - if (this.showAt != null) { - json[r'showAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.showAt!.millisecondsSinceEpoch - : this.showAt!.toUtc().toIso8601String(); - } else { - // json[r'showAt'] = null; + if (showAt != null) { + json[r'showAt'] = showAt!.toUtc().toIso8601String(); } - json[r'type'] = this.type; - json[r'updatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAt.millisecondsSinceEpoch - : this.updatedAt.toUtc().toIso8601String(); + json[r'type'] = type.toJson(); + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); return json; } - /// Returns a new [SyncMemoryV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncMemoryV1? fromJson(dynamic value) { - upgradeDto(value, "SyncMemoryV1"); - if (value is Map) { - final json = value.cast(); - - return SyncMemoryV1( - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - data: mapCastOfType(json, r'data')!, - deletedAt: mapDateTime(json, r'deletedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - hideAt: mapDateTime(json, r'hideAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - id: mapValueOfType(json, r'id')!, - isSaved: mapValueOfType(json, r'isSaved')!, - memoryAt: mapDateTime(json, r'memoryAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ownerId: mapValueOfType(json, r'ownerId')!, - seenAt: mapDateTime(json, r'seenAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - showAt: mapDateTime(json, r'showAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - type: MemoryType.fromJson(json[r'type'])!, - updatedAt: mapDateTime(json, r'updatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ); - } - return null; + SyncMemoryV1 copyWith({ + DateTime? createdAt, + Map? data, + Object? deletedAt = _undefined, + Object? hideAt = _undefined, + String? id, + bool? isSaved, + DateTime? memoryAt, + String? ownerId, + Object? seenAt = _undefined, + Object? showAt = _undefined, + MemoryType? type, + DateTime? updatedAt, + }) { + return .new( + createdAt: createdAt ?? this.createdAt, + data: data ?? this.data, + deletedAt: identical(deletedAt, _undefined) ? this.deletedAt : deletedAt as DateTime?, + hideAt: identical(hideAt, _undefined) ? this.hideAt : hideAt as DateTime?, + id: id ?? this.id, + isSaved: isSaved ?? this.isSaved, + memoryAt: memoryAt ?? this.memoryAt, + ownerId: ownerId ?? this.ownerId, + seenAt: identical(seenAt, _undefined) ? this.seenAt : seenAt as DateTime?, + showAt: identical(showAt, _undefined) ? this.showAt : showAt as DateTime?, + type: type ?? this.type, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncMemoryV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncMemoryV1 && + createdAt == other.createdAt && + const DeepCollectionEquality().equals(data, other.data) && + deletedAt == other.deletedAt && + hideAt == other.hideAt && + id == other.id && + isSaved == other.isSaved && + memoryAt == other.memoryAt && + ownerId == other.ownerId && + seenAt == other.seenAt && + showAt == other.showAt && + type == other.type && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncMemoryV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + createdAt, + const DeepCollectionEquality().hash(data), + deletedAt, + hideAt, + id, + isSaved, + memoryAt, + ownerId, + seenAt, + showAt, + type, + updatedAt, + ]); } - // maps a json object with a list of SyncMemoryV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncMemoryV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'createdAt', - 'data', - 'deletedAt', - 'hideAt', - 'id', - 'isSaved', - 'memoryAt', - 'ownerId', - 'seenAt', - 'showAt', - 'type', - 'updatedAt', - }; + @override + String toString() => + 'SyncMemoryV1(createdAt=$createdAt, data=$data, deletedAt=$deletedAt, hideAt=$hideAt, id=$id, isSaved=$isSaved, memoryAt=$memoryAt, ownerId=$ownerId, seenAt=$seenAt, showAt=$showAt, type=$type, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/sync_partner_delete_v1.dart b/mobile/openapi/lib/model/sync_partner_delete_v1.dart index 64dfb4eb98..19d0e2a93a 100644 --- a/mobile/openapi/lib/model/sync_partner_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_partner_delete_v1.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncPartnerDeleteV1 { - /// Returns a new [SyncPartnerDeleteV1] instance. - SyncPartnerDeleteV1({ - required this.sharedById, - required this.sharedWithId, - }); +final class SyncPartnerDeleteV1 { + const SyncPartnerDeleteV1({required this.sharedById, required this.sharedWithId}); /// Shared by ID - String sharedById; + final String sharedById; /// Shared with ID - String sharedWithId; + final String sharedWithId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncPartnerDeleteV1 && - other.sharedById == sharedById && - other.sharedWithId == sharedWithId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (sharedById.hashCode) + - (sharedWithId.hashCode); - - @override - String toString() => 'SyncPartnerDeleteV1[sharedById=$sharedById, sharedWithId=$sharedWithId]'; + static SyncPartnerDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(sharedById: json[r'sharedById'] as String, sharedWithId: json[r'sharedWithId'] as String); + } Map toJson() { final json = {}; - json[r'sharedById'] = this.sharedById; - json[r'sharedWithId'] = this.sharedWithId; + json[r'sharedById'] = sharedById; + json[r'sharedWithId'] = sharedWithId; return json; } - /// Returns a new [SyncPartnerDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncPartnerDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncPartnerDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncPartnerDeleteV1( - sharedById: mapValueOfType(json, r'sharedById')!, - sharedWithId: mapValueOfType(json, r'sharedWithId')!, - ); - } - return null; + SyncPartnerDeleteV1 copyWith({String? sharedById, String? sharedWithId}) { + return .new(sharedById: sharedById ?? this.sharedById, sharedWithId: sharedWithId ?? this.sharedWithId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncPartnerDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncPartnerDeleteV1 && sharedById == other.sharedById && sharedWithId == other.sharedWithId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncPartnerDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([sharedById, sharedWithId]); } - // maps a json object with a list of SyncPartnerDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncPartnerDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'sharedById', - 'sharedWithId', - }; + @override + String toString() => 'SyncPartnerDeleteV1(sharedById=$sharedById, sharedWithId=$sharedWithId)'; } - diff --git a/mobile/openapi/lib/model/sync_partner_v1.dart b/mobile/openapi/lib/model/sync_partner_v1.dart index 9f9c3d14c1..39f58d51d0 100644 --- a/mobile/openapi/lib/model/sync_partner_v1.dart +++ b/mobile/openapi/lib/model/sync_partner_v1.dart @@ -1,118 +1,60 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncPartnerV1 { - /// Returns a new [SyncPartnerV1] instance. - SyncPartnerV1({ - required this.inTimeline, - required this.sharedById, - required this.sharedWithId, - }); +final class SyncPartnerV1 { + const SyncPartnerV1({required this.inTimeline, required this.sharedById, required this.sharedWithId}); /// In timeline - bool inTimeline; + final bool inTimeline; /// Shared by ID - String sharedById; + final String sharedById; /// Shared with ID - String sharedWithId; + final String sharedWithId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncPartnerV1 && - other.inTimeline == inTimeline && - other.sharedById == sharedById && - other.sharedWithId == sharedWithId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (inTimeline.hashCode) + - (sharedById.hashCode) + - (sharedWithId.hashCode); - - @override - String toString() => 'SyncPartnerV1[inTimeline=$inTimeline, sharedById=$sharedById, sharedWithId=$sharedWithId]'; + static SyncPartnerV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + inTimeline: json[r'inTimeline'] as bool, + sharedById: json[r'sharedById'] as String, + sharedWithId: json[r'sharedWithId'] as String, + ); + } Map toJson() { final json = {}; - json[r'inTimeline'] = this.inTimeline; - json[r'sharedById'] = this.sharedById; - json[r'sharedWithId'] = this.sharedWithId; + json[r'inTimeline'] = inTimeline; + json[r'sharedById'] = sharedById; + json[r'sharedWithId'] = sharedWithId; return json; } - /// Returns a new [SyncPartnerV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncPartnerV1? fromJson(dynamic value) { - upgradeDto(value, "SyncPartnerV1"); - if (value is Map) { - final json = value.cast(); - - return SyncPartnerV1( - inTimeline: mapValueOfType(json, r'inTimeline')!, - sharedById: mapValueOfType(json, r'sharedById')!, - sharedWithId: mapValueOfType(json, r'sharedWithId')!, - ); - } - return null; + SyncPartnerV1 copyWith({bool? inTimeline, String? sharedById, String? sharedWithId}) { + return .new( + inTimeline: inTimeline ?? this.inTimeline, + sharedById: sharedById ?? this.sharedById, + sharedWithId: sharedWithId ?? this.sharedWithId, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncPartnerV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncPartnerV1 && + inTimeline == other.inTimeline && + sharedById == other.sharedById && + sharedWithId == other.sharedWithId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncPartnerV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([inTimeline, sharedById, sharedWithId]); } - // maps a json object with a list of SyncPartnerV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncPartnerV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'inTimeline', - 'sharedById', - 'sharedWithId', - }; + @override + String toString() => 'SyncPartnerV1(inTimeline=$inTimeline, sharedById=$sharedById, sharedWithId=$sharedWithId)'; } - diff --git a/mobile/openapi/lib/model/sync_person_delete_v1.dart b/mobile/openapi/lib/model/sync_person_delete_v1.dart index 526bc26187..94e231dcef 100644 --- a/mobile/openapi/lib/model/sync_person_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_person_delete_v1.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncPersonDeleteV1 { - /// Returns a new [SyncPersonDeleteV1] instance. - SyncPersonDeleteV1({ - required this.personId, - }); +final class SyncPersonDeleteV1 { + const SyncPersonDeleteV1({required this.personId}); /// Person ID - String personId; + final String personId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncPersonDeleteV1 && - other.personId == personId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (personId.hashCode); - - @override - String toString() => 'SyncPersonDeleteV1[personId=$personId]'; + static SyncPersonDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(personId: json[r'personId'] as String); + } Map toJson() { final json = {}; - json[r'personId'] = this.personId; + json[r'personId'] = personId; return json; } - /// Returns a new [SyncPersonDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncPersonDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncPersonDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncPersonDeleteV1( - personId: mapValueOfType(json, r'personId')!, - ); - } - return null; + SyncPersonDeleteV1 copyWith({String? personId}) { + return .new(personId: personId ?? this.personId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncPersonDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncPersonDeleteV1 && personId == other.personId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncPersonDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([personId]); } - // maps a json object with a list of SyncPersonDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncPersonDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'personId', - }; + @override + String toString() => 'SyncPersonDeleteV1(personId=$personId)'; } - diff --git a/mobile/openapi/lib/model/sync_person_v1.dart b/mobile/openapi/lib/model/sync_person_v1.dart index 1bd6f4a160..2b7cb36005 100644 --- a/mobile/openapi/lib/model/sync_person_v1.dart +++ b/mobile/openapi/lib/model/sync_person_v1.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncPersonV1 { - /// Returns a new [SyncPersonV1] instance. - SyncPersonV1({ +final class SyncPersonV1 { + const SyncPersonV1({ required this.birthDate, required this.color, required this.createdAt, @@ -26,174 +17,135 @@ class SyncPersonV1 { }); /// Birth date - DateTime? birthDate; + final DateTime? birthDate; /// Color - String? color; + final String? color; /// Created at - DateTime createdAt; + final DateTime createdAt; /// Face asset ID - String? faceAssetId; + final String? faceAssetId; /// Person ID - String id; + final String id; /// Is favorite - bool isFavorite; + final bool isFavorite; /// Is hidden - bool isHidden; + final bool isHidden; /// Person name - String name; + final String name; /// Owner ID - String ownerId; + final String ownerId; /// Updated at - DateTime updatedAt; + final DateTime updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncPersonV1 && - other.birthDate == birthDate && - other.color == color && - other.createdAt == createdAt && - other.faceAssetId == faceAssetId && - other.id == id && - other.isFavorite == isFavorite && - other.isHidden == isHidden && - other.name == name && - other.ownerId == ownerId && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (birthDate == null ? 0 : birthDate!.hashCode) + - (color == null ? 0 : color!.hashCode) + - (createdAt.hashCode) + - (faceAssetId == null ? 0 : faceAssetId!.hashCode) + - (id.hashCode) + - (isFavorite.hashCode) + - (isHidden.hashCode) + - (name.hashCode) + - (ownerId.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'SyncPersonV1[birthDate=$birthDate, color=$color, createdAt=$createdAt, faceAssetId=$faceAssetId, id=$id, isFavorite=$isFavorite, isHidden=$isHidden, name=$name, ownerId=$ownerId, updatedAt=$updatedAt]'; + static SyncPersonV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + birthDate: (json[r'birthDate'] == null ? null : DateTime.parse(json[r'birthDate'] as String)), + color: (json[r'color'] as String?), + createdAt: DateTime.parse(json[r'createdAt'] as String), + faceAssetId: (json[r'faceAssetId'] as String?), + id: json[r'id'] as String, + isFavorite: json[r'isFavorite'] as bool, + isHidden: json[r'isHidden'] as bool, + name: json[r'name'] as String, + ownerId: json[r'ownerId'] as String, + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + ); + } Map toJson() { final json = {}; - if (this.birthDate != null) { - json[r'birthDate'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.birthDate!.millisecondsSinceEpoch - : this.birthDate!.toUtc().toIso8601String(); - } else { - // json[r'birthDate'] = null; + if (birthDate != null) { + json[r'birthDate'] = birthDate!.toUtc().toIso8601String(); } - if (this.color != null) { - json[r'color'] = this.color; - } else { - // json[r'color'] = null; + if (color != null) { + json[r'color'] = color!; } - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - if (this.faceAssetId != null) { - json[r'faceAssetId'] = this.faceAssetId; - } else { - // json[r'faceAssetId'] = null; + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + if (faceAssetId != null) { + json[r'faceAssetId'] = faceAssetId!; } - json[r'id'] = this.id; - json[r'isFavorite'] = this.isFavorite; - json[r'isHidden'] = this.isHidden; - json[r'name'] = this.name; - json[r'ownerId'] = this.ownerId; - json[r'updatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAt.millisecondsSinceEpoch - : this.updatedAt.toUtc().toIso8601String(); + json[r'id'] = id; + json[r'isFavorite'] = isFavorite; + json[r'isHidden'] = isHidden; + json[r'name'] = name; + json[r'ownerId'] = ownerId; + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); return json; } - /// Returns a new [SyncPersonV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncPersonV1? fromJson(dynamic value) { - upgradeDto(value, "SyncPersonV1"); - if (value is Map) { - final json = value.cast(); - - return SyncPersonV1( - birthDate: mapDateTime(json, r'birthDate', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - color: mapValueOfType(json, r'color'), - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - faceAssetId: mapValueOfType(json, r'faceAssetId'), - id: mapValueOfType(json, r'id')!, - isFavorite: mapValueOfType(json, r'isFavorite')!, - isHidden: mapValueOfType(json, r'isHidden')!, - name: mapValueOfType(json, r'name')!, - ownerId: mapValueOfType(json, r'ownerId')!, - updatedAt: mapDateTime(json, r'updatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ); - } - return null; + SyncPersonV1 copyWith({ + Object? birthDate = _undefined, + Object? color = _undefined, + DateTime? createdAt, + Object? faceAssetId = _undefined, + String? id, + bool? isFavorite, + bool? isHidden, + String? name, + String? ownerId, + DateTime? updatedAt, + }) { + return .new( + birthDate: identical(birthDate, _undefined) ? this.birthDate : birthDate as DateTime?, + color: identical(color, _undefined) ? this.color : color as String?, + createdAt: createdAt ?? this.createdAt, + faceAssetId: identical(faceAssetId, _undefined) ? this.faceAssetId : faceAssetId as String?, + id: id ?? this.id, + isFavorite: isFavorite ?? this.isFavorite, + isHidden: isHidden ?? this.isHidden, + name: name ?? this.name, + ownerId: ownerId ?? this.ownerId, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncPersonV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncPersonV1 && + birthDate == other.birthDate && + color == other.color && + createdAt == other.createdAt && + faceAssetId == other.faceAssetId && + id == other.id && + isFavorite == other.isFavorite && + isHidden == other.isHidden && + name == other.name && + ownerId == other.ownerId && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncPersonV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + birthDate, + color, + createdAt, + faceAssetId, + id, + isFavorite, + isHidden, + name, + ownerId, + updatedAt, + ]); } - // maps a json object with a list of SyncPersonV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncPersonV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'birthDate', - 'color', - 'createdAt', - 'faceAssetId', - 'id', - 'isFavorite', - 'isHidden', - 'name', - 'ownerId', - 'updatedAt', - }; + @override + String toString() => + 'SyncPersonV1(birthDate=$birthDate, color=$color, createdAt=$createdAt, faceAssetId=$faceAssetId, id=$id, isFavorite=$isFavorite, isHidden=$isHidden, name=$name, ownerId=$ownerId, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/sync_request_type.dart b/mobile/openapi/lib/model/sync_request_type.dart index 2c17cc6aef..b9e4c68bdd 100644 --- a/mobile/openapi/lib/model/sync_request_type.dart +++ b/mobile/openapi/lib/model/sync_request_type.dart @@ -1,157 +1,52 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Sync request type -class SyncRequestType { - /// Instantiate a new enum with the provided [value]. +enum SyncRequestType { + albumsV1._(r'AlbumsV1'), + albumsV2._(r'AlbumsV2'), + albumUsersV1._(r'AlbumUsersV1'), + albumToAssetsV1._(r'AlbumToAssetsV1'), + albumAssetsV1._(r'AlbumAssetsV1'), + albumAssetsV2._(r'AlbumAssetsV2'), + albumAssetExifsV1._(r'AlbumAssetExifsV1'), + assetsV1._(r'AssetsV1'), + assetsV2._(r'AssetsV2'), + assetExifsV1._(r'AssetExifsV1'), + assetEditsV1._(r'AssetEditsV1'), + assetMetadataV1._(r'AssetMetadataV1'), + authUsersV1._(r'AuthUsersV1'), + memoriesV1._(r'MemoriesV1'), + memoryToAssetsV1._(r'MemoryToAssetsV1'), + partnersV1._(r'PartnersV1'), + partnerAssetsV1._(r'PartnerAssetsV1'), + partnerAssetsV2._(r'PartnerAssetsV2'), + partnerAssetExifsV1._(r'PartnerAssetExifsV1'), + partnerStacksV1._(r'PartnerStacksV1'), + stacksV1._(r'StacksV1'), + usersV1._(r'UsersV1'), + peopleV1._(r'PeopleV1'), + assetFacesV1._(r'AssetFacesV1'), + assetFacesV2._(r'AssetFacesV2'), + userMetadataV1._(r'UserMetadataV1'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const SyncRequestType._(this.value); - /// The underlying value of this enum member. final String value; + static SyncRequestType? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const albumsV1 = SyncRequestType._(r'AlbumsV1'); - static const albumsV2 = SyncRequestType._(r'AlbumsV2'); - static const albumUsersV1 = SyncRequestType._(r'AlbumUsersV1'); - static const albumToAssetsV1 = SyncRequestType._(r'AlbumToAssetsV1'); - static const albumAssetsV1 = SyncRequestType._(r'AlbumAssetsV1'); - static const albumAssetsV2 = SyncRequestType._(r'AlbumAssetsV2'); - static const albumAssetExifsV1 = SyncRequestType._(r'AlbumAssetExifsV1'); - static const assetsV1 = SyncRequestType._(r'AssetsV1'); - static const assetsV2 = SyncRequestType._(r'AssetsV2'); - static const assetExifsV1 = SyncRequestType._(r'AssetExifsV1'); - static const assetEditsV1 = SyncRequestType._(r'AssetEditsV1'); - static const assetMetadataV1 = SyncRequestType._(r'AssetMetadataV1'); - static const authUsersV1 = SyncRequestType._(r'AuthUsersV1'); - static const memoriesV1 = SyncRequestType._(r'MemoriesV1'); - static const memoryToAssetsV1 = SyncRequestType._(r'MemoryToAssetsV1'); - static const partnersV1 = SyncRequestType._(r'PartnersV1'); - static const partnerAssetsV1 = SyncRequestType._(r'PartnerAssetsV1'); - static const partnerAssetsV2 = SyncRequestType._(r'PartnerAssetsV2'); - static const partnerAssetExifsV1 = SyncRequestType._(r'PartnerAssetExifsV1'); - static const partnerStacksV1 = SyncRequestType._(r'PartnerStacksV1'); - static const stacksV1 = SyncRequestType._(r'StacksV1'); - static const usersV1 = SyncRequestType._(r'UsersV1'); - static const peopleV1 = SyncRequestType._(r'PeopleV1'); - static const assetFacesV1 = SyncRequestType._(r'AssetFacesV1'); - static const assetFacesV2 = SyncRequestType._(r'AssetFacesV2'); - static const userMetadataV1 = SyncRequestType._(r'UserMetadataV1'); - - /// List of all possible values in this [enum][SyncRequestType]. - static const values = [ - albumsV1, - albumsV2, - albumUsersV1, - albumToAssetsV1, - albumAssetsV1, - albumAssetsV2, - albumAssetExifsV1, - assetsV1, - assetsV2, - assetExifsV1, - assetEditsV1, - assetMetadataV1, - authUsersV1, - memoriesV1, - memoryToAssetsV1, - partnersV1, - partnerAssetsV1, - partnerAssetsV2, - partnerAssetExifsV1, - partnerStacksV1, - stacksV1, - usersV1, - peopleV1, - assetFacesV1, - assetFacesV2, - userMetadataV1, - ]; - - static SyncRequestType? fromJson(dynamic value) => SyncRequestTypeTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncRequestType.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [SyncRequestType] to String, -/// and [decode] dynamic data back to [SyncRequestType]. -class SyncRequestTypeTypeTransformer { - factory SyncRequestTypeTypeTransformer() => _instance ??= const SyncRequestTypeTypeTransformer._(); - - const SyncRequestTypeTypeTransformer._(); - - String encode(SyncRequestType data) => data.value; - - /// Decodes a [dynamic value][data] to a SyncRequestType. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - SyncRequestType? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'AlbumsV1': return SyncRequestType.albumsV1; - case r'AlbumsV2': return SyncRequestType.albumsV2; - case r'AlbumUsersV1': return SyncRequestType.albumUsersV1; - case r'AlbumToAssetsV1': return SyncRequestType.albumToAssetsV1; - case r'AlbumAssetsV1': return SyncRequestType.albumAssetsV1; - case r'AlbumAssetsV2': return SyncRequestType.albumAssetsV2; - case r'AlbumAssetExifsV1': return SyncRequestType.albumAssetExifsV1; - case r'AssetsV1': return SyncRequestType.assetsV1; - case r'AssetsV2': return SyncRequestType.assetsV2; - case r'AssetExifsV1': return SyncRequestType.assetExifsV1; - case r'AssetEditsV1': return SyncRequestType.assetEditsV1; - case r'AssetMetadataV1': return SyncRequestType.assetMetadataV1; - case r'AuthUsersV1': return SyncRequestType.authUsersV1; - case r'MemoriesV1': return SyncRequestType.memoriesV1; - case r'MemoryToAssetsV1': return SyncRequestType.memoryToAssetsV1; - case r'PartnersV1': return SyncRequestType.partnersV1; - case r'PartnerAssetsV1': return SyncRequestType.partnerAssetsV1; - case r'PartnerAssetsV2': return SyncRequestType.partnerAssetsV2; - case r'PartnerAssetExifsV1': return SyncRequestType.partnerAssetExifsV1; - case r'PartnerStacksV1': return SyncRequestType.partnerStacksV1; - case r'StacksV1': return SyncRequestType.stacksV1; - case r'UsersV1': return SyncRequestType.usersV1; - case r'PeopleV1': return SyncRequestType.peopleV1; - case r'AssetFacesV1': return SyncRequestType.assetFacesV1; - case r'AssetFacesV2': return SyncRequestType.assetFacesV2; - case r'UserMetadataV1': return SyncRequestType.userMetadataV1; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [SyncRequestTypeTypeTransformer] instance. - static SyncRequestTypeTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/sync_reset_v1.dart b/mobile/openapi/lib/model/sync_reset_v1.dart new file mode 100644 index 0000000000..2029c4ed6e --- /dev/null +++ b/mobile/openapi/lib/model/sync_reset_v1.dart @@ -0,0 +1,36 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +part of openapi.api; + +final class SyncResetV1 { + const SyncResetV1(); + + static SyncResetV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(); + } + + Map toJson() { + final json = {}; + return json; + } + + SyncResetV1 copyWith() { + return .new(); + } + + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncResetV1); + } + + @override + int get hashCode { + return runtimeType.hashCode; + } + + @override + String toString() => 'SyncResetV1()'; +} diff --git a/mobile/openapi/lib/model/sync_stack_delete_v1.dart b/mobile/openapi/lib/model/sync_stack_delete_v1.dart index 2a7398291a..429aa840dd 100644 --- a/mobile/openapi/lib/model/sync_stack_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_stack_delete_v1.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncStackDeleteV1 { - /// Returns a new [SyncStackDeleteV1] instance. - SyncStackDeleteV1({ - required this.stackId, - }); +final class SyncStackDeleteV1 { + const SyncStackDeleteV1({required this.stackId}); /// Stack ID - String stackId; + final String stackId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncStackDeleteV1 && - other.stackId == stackId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (stackId.hashCode); - - @override - String toString() => 'SyncStackDeleteV1[stackId=$stackId]'; + static SyncStackDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(stackId: json[r'stackId'] as String); + } Map toJson() { final json = {}; - json[r'stackId'] = this.stackId; + json[r'stackId'] = stackId; return json; } - /// Returns a new [SyncStackDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncStackDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncStackDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncStackDeleteV1( - stackId: mapValueOfType(json, r'stackId')!, - ); - } - return null; + SyncStackDeleteV1 copyWith({String? stackId}) { + return .new(stackId: stackId ?? this.stackId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncStackDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncStackDeleteV1 && stackId == other.stackId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncStackDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([stackId]); } - // maps a json object with a list of SyncStackDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncStackDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'stackId', - }; + @override + String toString() => 'SyncStackDeleteV1(stackId=$stackId)'; } - diff --git a/mobile/openapi/lib/model/sync_stack_v1.dart b/mobile/openapi/lib/model/sync_stack_v1.dart index 3e79a55134..196fbc683b 100644 --- a/mobile/openapi/lib/model/sync_stack_v1.dart +++ b/mobile/openapi/lib/model/sync_stack_v1.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncStackV1 { - /// Returns a new [SyncStackV1] instance. - SyncStackV1({ +final class SyncStackV1 { + const SyncStackV1({ required this.createdAt, required this.id, required this.ownerId, @@ -21,120 +12,76 @@ class SyncStackV1 { }); /// Created at - DateTime createdAt; + final DateTime createdAt; /// Stack ID - String id; + final String id; /// Owner ID - String ownerId; + final String ownerId; /// Primary asset ID - String primaryAssetId; + final String primaryAssetId; /// Updated at - DateTime updatedAt; + final DateTime updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncStackV1 && - other.createdAt == createdAt && - other.id == id && - other.ownerId == ownerId && - other.primaryAssetId == primaryAssetId && - other.updatedAt == updatedAt; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (createdAt.hashCode) + - (id.hashCode) + - (ownerId.hashCode) + - (primaryAssetId.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'SyncStackV1[createdAt=$createdAt, id=$id, ownerId=$ownerId, primaryAssetId=$primaryAssetId, updatedAt=$updatedAt]'; + static SyncStackV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + createdAt: DateTime.parse(json[r'createdAt'] as String), + id: json[r'id'] as String, + ownerId: json[r'ownerId'] as String, + primaryAssetId: json[r'primaryAssetId'] as String, + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + ); + } Map toJson() { final json = {}; - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - json[r'id'] = this.id; - json[r'ownerId'] = this.ownerId; - json[r'primaryAssetId'] = this.primaryAssetId; - json[r'updatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAt.millisecondsSinceEpoch - : this.updatedAt.toUtc().toIso8601String(); + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + json[r'id'] = id; + json[r'ownerId'] = ownerId; + json[r'primaryAssetId'] = primaryAssetId; + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); return json; } - /// Returns a new [SyncStackV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncStackV1? fromJson(dynamic value) { - upgradeDto(value, "SyncStackV1"); - if (value is Map) { - final json = value.cast(); - - return SyncStackV1( - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - id: mapValueOfType(json, r'id')!, - ownerId: mapValueOfType(json, r'ownerId')!, - primaryAssetId: mapValueOfType(json, r'primaryAssetId')!, - updatedAt: mapDateTime(json, r'updatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ); - } - return null; + SyncStackV1 copyWith({ + DateTime? createdAt, + String? id, + String? ownerId, + String? primaryAssetId, + DateTime? updatedAt, + }) { + return .new( + createdAt: createdAt ?? this.createdAt, + id: id ?? this.id, + ownerId: ownerId ?? this.ownerId, + primaryAssetId: primaryAssetId ?? this.primaryAssetId, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncStackV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncStackV1 && + createdAt == other.createdAt && + id == other.id && + ownerId == other.ownerId && + primaryAssetId == other.primaryAssetId && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncStackV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([createdAt, id, ownerId, primaryAssetId, updatedAt]); } - // maps a json object with a list of SyncStackV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncStackV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'createdAt', - 'id', - 'ownerId', - 'primaryAssetId', - 'updatedAt', - }; + @override + String toString() => + 'SyncStackV1(createdAt=$createdAt, id=$id, ownerId=$ownerId, primaryAssetId=$primaryAssetId, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/sync_stream_dto.dart b/mobile/openapi/lib/model/sync_stream_dto.dart index 932477cb15..61cd369961 100644 --- a/mobile/openapi/lib/model/sync_stream_dto.dart +++ b/mobile/openapi/lib/model/sync_stream_dto.dart @@ -1,118 +1,50 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncStreamDto { - /// Returns a new [SyncStreamDto] instance. - SyncStreamDto({ - this.reset, - this.types = const [], - }); +final class SyncStreamDto { + const SyncStreamDto({this.reset = const Optional.absent(), required this.types}); /// Reset sync state - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? reset; + final Optional reset; /// Sync request types - List types; + final List types; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncStreamDto && - other.reset == reset && - _deepEquality.equals(other.types, types); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (reset == null ? 0 : reset!.hashCode) + - (types.hashCode); - - @override - String toString() => 'SyncStreamDto[reset=$reset, types=$types]'; + static SyncStreamDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + reset: json.containsKey(r'reset') ? Optional.present(json[r'reset'] as bool) : const Optional.absent(), + types: ((json[r'types'] as List?)?.map(($e) => (SyncRequestType.fromJson($e))!).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - if (this.reset != null) { - json[r'reset'] = this.reset; - } else { - // json[r'reset'] = null; + if (reset case Present(:final value)) { + json[r'reset'] = value; } - json[r'types'] = this.types; + json[r'types'] = types.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [SyncStreamDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncStreamDto? fromJson(dynamic value) { - upgradeDto(value, "SyncStreamDto"); - if (value is Map) { - final json = value.cast(); - - return SyncStreamDto( - reset: mapValueOfType(json, r'reset'), - types: SyncRequestType.listFromJson(json[r'types']), - ); - } - return null; + SyncStreamDto copyWith({Optional? reset, List? types}) { + return .new(reset: reset ?? this.reset, types: types ?? this.types); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncStreamDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncStreamDto && reset == other.reset && const DeepCollectionEquality().equals(types, other.types)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncStreamDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([reset, const DeepCollectionEquality().hash(types)]); } - // maps a json object with a list of SyncStreamDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncStreamDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'types', - }; + @override + String toString() => 'SyncStreamDto(reset=$reset, types=$types)'; } - diff --git a/mobile/openapi/lib/model/sync_user_delete_v1.dart b/mobile/openapi/lib/model/sync_user_delete_v1.dart index bbbdc147dd..67dffc8eed 100644 --- a/mobile/openapi/lib/model/sync_user_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_user_delete_v1.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncUserDeleteV1 { - /// Returns a new [SyncUserDeleteV1] instance. - SyncUserDeleteV1({ - required this.userId, - }); +final class SyncUserDeleteV1 { + const SyncUserDeleteV1({required this.userId}); /// User ID - String userId; + final String userId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncUserDeleteV1 && - other.userId == userId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (userId.hashCode); - - @override - String toString() => 'SyncUserDeleteV1[userId=$userId]'; + static SyncUserDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(userId: json[r'userId'] as String); + } Map toJson() { final json = {}; - json[r'userId'] = this.userId; + json[r'userId'] = userId; return json; } - /// Returns a new [SyncUserDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncUserDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncUserDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncUserDeleteV1( - userId: mapValueOfType(json, r'userId')!, - ); - } - return null; + SyncUserDeleteV1 copyWith({String? userId}) { + return .new(userId: userId ?? this.userId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncUserDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncUserDeleteV1 && userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncUserDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([userId]); } - // maps a json object with a list of SyncUserDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncUserDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'userId', - }; + @override + String toString() => 'SyncUserDeleteV1(userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/sync_user_metadata_delete_v1.dart b/mobile/openapi/lib/model/sync_user_metadata_delete_v1.dart index 67976108e1..440473b94b 100644 --- a/mobile/openapi/lib/model/sync_user_metadata_delete_v1.dart +++ b/mobile/openapi/lib/model/sync_user_metadata_delete_v1.dart @@ -1,108 +1,43 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncUserMetadataDeleteV1 { - /// Returns a new [SyncUserMetadataDeleteV1] instance. - SyncUserMetadataDeleteV1({ - required this.key, - required this.userId, - }); +final class SyncUserMetadataDeleteV1 { + const SyncUserMetadataDeleteV1({required this.key, required this.userId}); - UserMetadataKey key; + final UserMetadataKey key; /// User ID - String userId; + final String userId; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncUserMetadataDeleteV1 && - other.key == key && - other.userId == userId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (key.hashCode) + - (userId.hashCode); - - @override - String toString() => 'SyncUserMetadataDeleteV1[key=$key, userId=$userId]'; + static SyncUserMetadataDeleteV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(key: (UserMetadataKey.fromJson(json[r'key']))!, userId: json[r'userId'] as String); + } Map toJson() { final json = {}; - json[r'key'] = this.key; - json[r'userId'] = this.userId; + json[r'key'] = key.toJson(); + json[r'userId'] = userId; return json; } - /// Returns a new [SyncUserMetadataDeleteV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncUserMetadataDeleteV1? fromJson(dynamic value) { - upgradeDto(value, "SyncUserMetadataDeleteV1"); - if (value is Map) { - final json = value.cast(); - - return SyncUserMetadataDeleteV1( - key: UserMetadataKey.fromJson(json[r'key'])!, - userId: mapValueOfType(json, r'userId')!, - ); - } - return null; + SyncUserMetadataDeleteV1 copyWith({UserMetadataKey? key, String? userId}) { + return .new(key: key ?? this.key, userId: userId ?? this.userId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncUserMetadataDeleteV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SyncUserMetadataDeleteV1 && key == other.key && userId == other.userId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncUserMetadataDeleteV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([key, userId]); } - // maps a json object with a list of SyncUserMetadataDeleteV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncUserMetadataDeleteV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'key', - 'userId', - }; + @override + String toString() => 'SyncUserMetadataDeleteV1(key=$key, userId=$userId)'; } - diff --git a/mobile/openapi/lib/model/sync_user_metadata_v1.dart b/mobile/openapi/lib/model/sync_user_metadata_v1.dart index ddde7c0513..52bb8b192d 100644 --- a/mobile/openapi/lib/model/sync_user_metadata_v1.dart +++ b/mobile/openapi/lib/model/sync_user_metadata_v1.dart @@ -1,117 +1,55 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncUserMetadataV1 { - /// Returns a new [SyncUserMetadataV1] instance. - SyncUserMetadataV1({ - required this.key, - required this.userId, - this.value = const {}, - }); +final class SyncUserMetadataV1 { + const SyncUserMetadataV1({required this.key, required this.userId, required this.value}); - UserMetadataKey key; + final UserMetadataKey key; /// User ID - String userId; + final String userId; /// User metadata value - Map value; + final Map value; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncUserMetadataV1 && - other.key == key && - other.userId == userId && - _deepEquality.equals(other.value, value); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (key.hashCode) + - (userId.hashCode) + - (value.hashCode); - - @override - String toString() => 'SyncUserMetadataV1[key=$key, userId=$userId, value=$value]'; + static SyncUserMetadataV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + key: (UserMetadataKey.fromJson(json[r'key']))!, + userId: json[r'userId'] as String, + value: ((json[r'value'] as Map?)?.cast())!, + ); + } Map toJson() { final json = {}; - json[r'key'] = this.key; - json[r'userId'] = this.userId; - json[r'value'] = this.value; + json[r'key'] = key.toJson(); + json[r'userId'] = userId; + json[r'value'] = value; return json; } - /// Returns a new [SyncUserMetadataV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncUserMetadataV1? fromJson(dynamic value) { - upgradeDto(value, "SyncUserMetadataV1"); - if (value is Map) { - final json = value.cast(); - - return SyncUserMetadataV1( - key: UserMetadataKey.fromJson(json[r'key'])!, - userId: mapValueOfType(json, r'userId')!, - value: mapCastOfType(json, r'value')!, - ); - } - return null; + SyncUserMetadataV1 copyWith({UserMetadataKey? key, String? userId, Map? value}) { + return .new(key: key ?? this.key, userId: userId ?? this.userId, value: value ?? this.value); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncUserMetadataV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncUserMetadataV1 && + key == other.key && + userId == other.userId && + const DeepCollectionEquality().equals(value, other.value)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncUserMetadataV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([key, userId, const DeepCollectionEquality().hash(value)]); } - // maps a json object with a list of SyncUserMetadataV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncUserMetadataV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'key', - 'userId', - 'value', - }; + @override + String toString() => 'SyncUserMetadataV1(key=$key, userId=$userId, value=$value)'; } - diff --git a/mobile/openapi/lib/model/sync_user_v1.dart b/mobile/openapi/lib/model/sync_user_v1.dart index 0a81593547..1ffbf8ee29 100644 --- a/mobile/openapi/lib/model/sync_user_v1.dart +++ b/mobile/openapi/lib/model/sync_user_v1.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SyncUserV1 { - /// Returns a new [SyncUserV1] instance. - SyncUserV1({ +final class SyncUserV1 { + const SyncUserV1({ this.avatarColor, required this.deletedAt, required this.email, @@ -22,143 +13,98 @@ class SyncUserV1 { required this.profileChangedAt, }); - UserAvatarColor? avatarColor; + final UserAvatarColor? avatarColor; /// User deleted at - DateTime? deletedAt; + final DateTime? deletedAt; /// User email - String email; + final String email; /// User has profile image - bool hasProfileImage; + final bool hasProfileImage; /// User ID - String id; + final String id; /// User name - String name; + final String name; /// User profile changed at - DateTime profileChangedAt; + final DateTime profileChangedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is SyncUserV1 && - other.avatarColor == avatarColor && - other.deletedAt == deletedAt && - other.email == email && - other.hasProfileImage == hasProfileImage && - other.id == id && - other.name == name && - other.profileChangedAt == profileChangedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (avatarColor == null ? 0 : avatarColor!.hashCode) + - (deletedAt == null ? 0 : deletedAt!.hashCode) + - (email.hashCode) + - (hasProfileImage.hashCode) + - (id.hashCode) + - (name.hashCode) + - (profileChangedAt.hashCode); - - @override - String toString() => 'SyncUserV1[avatarColor=$avatarColor, deletedAt=$deletedAt, email=$email, hasProfileImage=$hasProfileImage, id=$id, name=$name, profileChangedAt=$profileChangedAt]'; + static SyncUserV1? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + avatarColor: UserAvatarColor.fromJson(json[r'avatarColor']), + deletedAt: (json[r'deletedAt'] == null ? null : DateTime.parse(json[r'deletedAt'] as String)), + email: json[r'email'] as String, + hasProfileImage: json[r'hasProfileImage'] as bool, + id: json[r'id'] as String, + name: json[r'name'] as String, + profileChangedAt: DateTime.parse(json[r'profileChangedAt'] as String), + ); + } Map toJson() { final json = {}; - if (this.avatarColor != null) { - json[r'avatarColor'] = this.avatarColor; - } else { - // json[r'avatarColor'] = null; + if (avatarColor != null) { + json[r'avatarColor'] = avatarColor!.toJson(); } - if (this.deletedAt != null) { - json[r'deletedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.deletedAt!.millisecondsSinceEpoch - : this.deletedAt!.toUtc().toIso8601String(); - } else { - // json[r'deletedAt'] = null; + if (deletedAt != null) { + json[r'deletedAt'] = deletedAt!.toUtc().toIso8601String(); } - json[r'email'] = this.email; - json[r'hasProfileImage'] = this.hasProfileImage; - json[r'id'] = this.id; - json[r'name'] = this.name; - json[r'profileChangedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.profileChangedAt.millisecondsSinceEpoch - : this.profileChangedAt.toUtc().toIso8601String(); + json[r'email'] = email; + json[r'hasProfileImage'] = hasProfileImage; + json[r'id'] = id; + json[r'name'] = name; + json[r'profileChangedAt'] = profileChangedAt.toUtc().toIso8601String(); return json; } - /// Returns a new [SyncUserV1] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SyncUserV1? fromJson(dynamic value) { - upgradeDto(value, "SyncUserV1"); - if (value is Map) { - final json = value.cast(); - - return SyncUserV1( - avatarColor: UserAvatarColor.fromJson(json[r'avatarColor']), - deletedAt: mapDateTime(json, r'deletedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - email: mapValueOfType(json, r'email')!, - hasProfileImage: mapValueOfType(json, r'hasProfileImage')!, - id: mapValueOfType(json, r'id')!, - name: mapValueOfType(json, r'name')!, - profileChangedAt: mapDateTime(json, r'profileChangedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ); - } - return null; + SyncUserV1 copyWith({ + Object? avatarColor = _undefined, + Object? deletedAt = _undefined, + String? email, + bool? hasProfileImage, + String? id, + String? name, + DateTime? profileChangedAt, + }) { + return .new( + avatarColor: identical(avatarColor, _undefined) ? this.avatarColor : avatarColor as UserAvatarColor?, + deletedAt: identical(deletedAt, _undefined) ? this.deletedAt : deletedAt as DateTime?, + email: email ?? this.email, + hasProfileImage: hasProfileImage ?? this.hasProfileImage, + id: id ?? this.id, + name: name ?? this.name, + profileChangedAt: profileChangedAt ?? this.profileChangedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SyncUserV1.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SyncUserV1 && + avatarColor == other.avatarColor && + deletedAt == other.deletedAt && + email == other.email && + hasProfileImage == other.hasProfileImage && + id == other.id && + name == other.name && + profileChangedAt == other.profileChangedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SyncUserV1.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([avatarColor, deletedAt, email, hasProfileImage, id, name, profileChangedAt]); } - // maps a json object with a list of SyncUserV1-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SyncUserV1.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'deletedAt', - 'email', - 'hasProfileImage', - 'id', - 'name', - 'profileChangedAt', - }; + @override + String toString() => + 'SyncUserV1(avatarColor=$avatarColor, deletedAt=$deletedAt, email=$email, hasProfileImage=$hasProfileImage, id=$id, name=$name, profileChangedAt=$profileChangedAt)'; } - diff --git a/mobile/openapi/lib/model/system_config_backups_dto.dart b/mobile/openapi/lib/model/system_config_backups_dto.dart index 82cd6e59eb..48367c4200 100644 --- a/mobile/openapi/lib/model/system_config_backups_dto.dart +++ b/mobile/openapi/lib/model/system_config_backups_dto.dart @@ -1,99 +1,39 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigBackupsDto { - /// Returns a new [SystemConfigBackupsDto] instance. - SystemConfigBackupsDto({ - required this.database, - }); +final class SystemConfigBackupsDto { + const SystemConfigBackupsDto({required this.database}); - DatabaseBackupConfig database; + final DatabaseBackupConfig database; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigBackupsDto && - other.database == database; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (database.hashCode); - - @override - String toString() => 'SystemConfigBackupsDto[database=$database]'; + static SystemConfigBackupsDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(database: (DatabaseBackupConfig.fromJson(json[r'database']))!); + } Map toJson() { final json = {}; - json[r'database'] = this.database; + json[r'database'] = database.toJson(); return json; } - /// Returns a new [SystemConfigBackupsDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigBackupsDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigBackupsDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigBackupsDto( - database: DatabaseBackupConfig.fromJson(json[r'database'])!, - ); - } - return null; + SystemConfigBackupsDto copyWith({DatabaseBackupConfig? database}) { + return .new(database: database ?? this.database); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigBackupsDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigBackupsDto && database == other.database); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigBackupsDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([database]); } - // maps a json object with a list of SystemConfigBackupsDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigBackupsDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'database', - }; + @override + String toString() => 'SystemConfigBackupsDto(database=$database)'; } - diff --git a/mobile/openapi/lib/model/system_config_dto.dart b/mobile/openapi/lib/model/system_config_dto.dart index 38dbb30f0c..a9c86f175c 100644 --- a/mobile/openapi/lib/model/system_config_dto.dart +++ b/mobile/openapi/lib/model/system_config_dto.dart @@ -1,23 +1,15 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigDto { - /// Returns a new [SystemConfigDto] instance. - SystemConfigDto({ +/// System configuration +final class SystemConfigDto { + const SystemConfigDto({ required this.backup, required this.ffmpeg, required this.image, required this.job, - required this.library_, + required this.library$, required this.logging, required this.machineLearning, required this.map, @@ -36,224 +28,206 @@ class SystemConfigDto { required this.user, }); - SystemConfigBackupsDto backup; + final SystemConfigBackupsDto backup; - SystemConfigFFmpegDto ffmpeg; + final SystemConfigFFmpegDto ffmpeg; - SystemConfigImageDto image; + final SystemConfigImageDto image; - SystemConfigJobDto job; + final SystemConfigJobDto job; - SystemConfigLibraryDto library_; + final SystemConfigLibraryDto library$; - SystemConfigLoggingDto logging; + final SystemConfigLoggingDto logging; - SystemConfigMachineLearningDto machineLearning; + final SystemConfigMachineLearningDto machineLearning; - SystemConfigMapDto map; + final SystemConfigMapDto map; - SystemConfigMetadataDto metadata; + final SystemConfigMetadataDto metadata; - SystemConfigNewVersionCheckDto newVersionCheck; + final SystemConfigNewVersionCheckDto newVersionCheck; - SystemConfigNightlyTasksDto nightlyTasks; + final SystemConfigNightlyTasksDto nightlyTasks; - SystemConfigNotificationsDto notifications; + final SystemConfigNotificationsDto notifications; - SystemConfigOAuthDto oauth; + final SystemConfigOAuthDto oauth; - SystemConfigPasswordLoginDto passwordLogin; + final SystemConfigPasswordLoginDto passwordLogin; - SystemConfigReverseGeocodingDto reverseGeocoding; + final SystemConfigReverseGeocodingDto reverseGeocoding; - SystemConfigServerDto server; + final SystemConfigServerDto server; - SystemConfigStorageTemplateDto storageTemplate; + final SystemConfigStorageTemplateDto storageTemplate; - SystemConfigTemplatesDto templates; + final SystemConfigTemplatesDto templates; - SystemConfigThemeDto theme; + final SystemConfigThemeDto theme; - SystemConfigTrashDto trash; + final SystemConfigTrashDto trash; - SystemConfigUserDto user; + final SystemConfigUserDto user; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigDto && - other.backup == backup && - other.ffmpeg == ffmpeg && - other.image == image && - other.job == job && - other.library_ == library_ && - other.logging == logging && - other.machineLearning == machineLearning && - other.map == map && - other.metadata == metadata && - other.newVersionCheck == newVersionCheck && - other.nightlyTasks == nightlyTasks && - other.notifications == notifications && - other.oauth == oauth && - other.passwordLogin == passwordLogin && - other.reverseGeocoding == reverseGeocoding && - other.server == server && - other.storageTemplate == storageTemplate && - other.templates == templates && - other.theme == theme && - other.trash == trash && - other.user == user; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (backup.hashCode) + - (ffmpeg.hashCode) + - (image.hashCode) + - (job.hashCode) + - (library_.hashCode) + - (logging.hashCode) + - (machineLearning.hashCode) + - (map.hashCode) + - (metadata.hashCode) + - (newVersionCheck.hashCode) + - (nightlyTasks.hashCode) + - (notifications.hashCode) + - (oauth.hashCode) + - (passwordLogin.hashCode) + - (reverseGeocoding.hashCode) + - (server.hashCode) + - (storageTemplate.hashCode) + - (templates.hashCode) + - (theme.hashCode) + - (trash.hashCode) + - (user.hashCode); - - @override - String toString() => 'SystemConfigDto[backup=$backup, ffmpeg=$ffmpeg, image=$image, job=$job, library_=$library_, logging=$logging, machineLearning=$machineLearning, map=$map, metadata=$metadata, newVersionCheck=$newVersionCheck, nightlyTasks=$nightlyTasks, notifications=$notifications, oauth=$oauth, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, server=$server, storageTemplate=$storageTemplate, templates=$templates, theme=$theme, trash=$trash, user=$user]'; + static SystemConfigDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + backup: (SystemConfigBackupsDto.fromJson(json[r'backup']))!, + ffmpeg: (SystemConfigFFmpegDto.fromJson(json[r'ffmpeg']))!, + image: (SystemConfigImageDto.fromJson(json[r'image']))!, + job: (SystemConfigJobDto.fromJson(json[r'job']))!, + library$: (SystemConfigLibraryDto.fromJson(json[r'library']))!, + logging: (SystemConfigLoggingDto.fromJson(json[r'logging']))!, + machineLearning: (SystemConfigMachineLearningDto.fromJson(json[r'machineLearning']))!, + map: (SystemConfigMapDto.fromJson(json[r'map']))!, + metadata: (SystemConfigMetadataDto.fromJson(json[r'metadata']))!, + newVersionCheck: (SystemConfigNewVersionCheckDto.fromJson(json[r'newVersionCheck']))!, + nightlyTasks: (SystemConfigNightlyTasksDto.fromJson(json[r'nightlyTasks']))!, + notifications: (SystemConfigNotificationsDto.fromJson(json[r'notifications']))!, + oauth: (SystemConfigOAuthDto.fromJson(json[r'oauth']))!, + passwordLogin: (SystemConfigPasswordLoginDto.fromJson(json[r'passwordLogin']))!, + reverseGeocoding: (SystemConfigReverseGeocodingDto.fromJson(json[r'reverseGeocoding']))!, + server: (SystemConfigServerDto.fromJson(json[r'server']))!, + storageTemplate: (SystemConfigStorageTemplateDto.fromJson(json[r'storageTemplate']))!, + templates: (SystemConfigTemplatesDto.fromJson(json[r'templates']))!, + theme: (SystemConfigThemeDto.fromJson(json[r'theme']))!, + trash: (SystemConfigTrashDto.fromJson(json[r'trash']))!, + user: (SystemConfigUserDto.fromJson(json[r'user']))!, + ); + } Map toJson() { final json = {}; - json[r'backup'] = this.backup; - json[r'ffmpeg'] = this.ffmpeg; - json[r'image'] = this.image; - json[r'job'] = this.job; - json[r'library'] = this.library_; - json[r'logging'] = this.logging; - json[r'machineLearning'] = this.machineLearning; - json[r'map'] = this.map; - json[r'metadata'] = this.metadata; - json[r'newVersionCheck'] = this.newVersionCheck; - json[r'nightlyTasks'] = this.nightlyTasks; - json[r'notifications'] = this.notifications; - json[r'oauth'] = this.oauth; - json[r'passwordLogin'] = this.passwordLogin; - json[r'reverseGeocoding'] = this.reverseGeocoding; - json[r'server'] = this.server; - json[r'storageTemplate'] = this.storageTemplate; - json[r'templates'] = this.templates; - json[r'theme'] = this.theme; - json[r'trash'] = this.trash; - json[r'user'] = this.user; + json[r'backup'] = backup.toJson(); + json[r'ffmpeg'] = ffmpeg.toJson(); + json[r'image'] = image.toJson(); + json[r'job'] = job.toJson(); + json[r'library'] = library$.toJson(); + json[r'logging'] = logging.toJson(); + json[r'machineLearning'] = machineLearning.toJson(); + json[r'map'] = map.toJson(); + json[r'metadata'] = metadata.toJson(); + json[r'newVersionCheck'] = newVersionCheck.toJson(); + json[r'nightlyTasks'] = nightlyTasks.toJson(); + json[r'notifications'] = notifications.toJson(); + json[r'oauth'] = oauth.toJson(); + json[r'passwordLogin'] = passwordLogin.toJson(); + json[r'reverseGeocoding'] = reverseGeocoding.toJson(); + json[r'server'] = server.toJson(); + json[r'storageTemplate'] = storageTemplate.toJson(); + json[r'templates'] = templates.toJson(); + json[r'theme'] = theme.toJson(); + json[r'trash'] = trash.toJson(); + json[r'user'] = user.toJson(); return json; } - /// Returns a new [SystemConfigDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigDto( - backup: SystemConfigBackupsDto.fromJson(json[r'backup'])!, - ffmpeg: SystemConfigFFmpegDto.fromJson(json[r'ffmpeg'])!, - image: SystemConfigImageDto.fromJson(json[r'image'])!, - job: SystemConfigJobDto.fromJson(json[r'job'])!, - library_: SystemConfigLibraryDto.fromJson(json[r'library'])!, - logging: SystemConfigLoggingDto.fromJson(json[r'logging'])!, - machineLearning: SystemConfigMachineLearningDto.fromJson(json[r'machineLearning'])!, - map: SystemConfigMapDto.fromJson(json[r'map'])!, - metadata: SystemConfigMetadataDto.fromJson(json[r'metadata'])!, - newVersionCheck: SystemConfigNewVersionCheckDto.fromJson(json[r'newVersionCheck'])!, - nightlyTasks: SystemConfigNightlyTasksDto.fromJson(json[r'nightlyTasks'])!, - notifications: SystemConfigNotificationsDto.fromJson(json[r'notifications'])!, - oauth: SystemConfigOAuthDto.fromJson(json[r'oauth'])!, - passwordLogin: SystemConfigPasswordLoginDto.fromJson(json[r'passwordLogin'])!, - reverseGeocoding: SystemConfigReverseGeocodingDto.fromJson(json[r'reverseGeocoding'])!, - server: SystemConfigServerDto.fromJson(json[r'server'])!, - storageTemplate: SystemConfigStorageTemplateDto.fromJson(json[r'storageTemplate'])!, - templates: SystemConfigTemplatesDto.fromJson(json[r'templates'])!, - theme: SystemConfigThemeDto.fromJson(json[r'theme'])!, - trash: SystemConfigTrashDto.fromJson(json[r'trash'])!, - user: SystemConfigUserDto.fromJson(json[r'user'])!, - ); - } - return null; + SystemConfigDto copyWith({ + SystemConfigBackupsDto? backup, + SystemConfigFFmpegDto? ffmpeg, + SystemConfigImageDto? image, + SystemConfigJobDto? job, + SystemConfigLibraryDto? library$, + SystemConfigLoggingDto? logging, + SystemConfigMachineLearningDto? machineLearning, + SystemConfigMapDto? map, + SystemConfigMetadataDto? metadata, + SystemConfigNewVersionCheckDto? newVersionCheck, + SystemConfigNightlyTasksDto? nightlyTasks, + SystemConfigNotificationsDto? notifications, + SystemConfigOAuthDto? oauth, + SystemConfigPasswordLoginDto? passwordLogin, + SystemConfigReverseGeocodingDto? reverseGeocoding, + SystemConfigServerDto? server, + SystemConfigStorageTemplateDto? storageTemplate, + SystemConfigTemplatesDto? templates, + SystemConfigThemeDto? theme, + SystemConfigTrashDto? trash, + SystemConfigUserDto? user, + }) { + return .new( + backup: backup ?? this.backup, + ffmpeg: ffmpeg ?? this.ffmpeg, + image: image ?? this.image, + job: job ?? this.job, + library$: library$ ?? this.library$, + logging: logging ?? this.logging, + machineLearning: machineLearning ?? this.machineLearning, + map: map ?? this.map, + metadata: metadata ?? this.metadata, + newVersionCheck: newVersionCheck ?? this.newVersionCheck, + nightlyTasks: nightlyTasks ?? this.nightlyTasks, + notifications: notifications ?? this.notifications, + oauth: oauth ?? this.oauth, + passwordLogin: passwordLogin ?? this.passwordLogin, + reverseGeocoding: reverseGeocoding ?? this.reverseGeocoding, + server: server ?? this.server, + storageTemplate: storageTemplate ?? this.storageTemplate, + templates: templates ?? this.templates, + theme: theme ?? this.theme, + trash: trash ?? this.trash, + user: user ?? this.user, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigDto && + backup == other.backup && + ffmpeg == other.ffmpeg && + image == other.image && + job == other.job && + library$ == other.library$ && + logging == other.logging && + machineLearning == other.machineLearning && + map == other.map && + metadata == other.metadata && + newVersionCheck == other.newVersionCheck && + nightlyTasks == other.nightlyTasks && + notifications == other.notifications && + oauth == other.oauth && + passwordLogin == other.passwordLogin && + reverseGeocoding == other.reverseGeocoding && + server == other.server && + storageTemplate == other.storageTemplate && + templates == other.templates && + theme == other.theme && + trash == other.trash && + user == other.user); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + backup, + ffmpeg, + image, + job, + library$, + logging, + machineLearning, + map, + metadata, + newVersionCheck, + nightlyTasks, + notifications, + oauth, + passwordLogin, + reverseGeocoding, + server, + storageTemplate, + templates, + theme, + trash, + user, + ]); } - // maps a json object with a list of SystemConfigDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'backup', - 'ffmpeg', - 'image', - 'job', - 'library', - 'logging', - 'machineLearning', - 'map', - 'metadata', - 'newVersionCheck', - 'nightlyTasks', - 'notifications', - 'oauth', - 'passwordLogin', - 'reverseGeocoding', - 'server', - 'storageTemplate', - 'templates', - 'theme', - 'trash', - 'user', - }; + @override + String toString() => + 'SystemConfigDto(backup=$backup, ffmpeg=$ffmpeg, image=$image, job=$job, library\$=${library$}, logging=$logging, machineLearning=$machineLearning, map=$map, metadata=$metadata, newVersionCheck=$newVersionCheck, nightlyTasks=$nightlyTasks, notifications=$notifications, oauth=$oauth, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, server=$server, storageTemplate=$storageTemplate, templates=$templates, theme=$theme, trash=$trash, user=$user)'; } - diff --git a/mobile/openapi/lib/model/system_config_f_fmpeg_dto.dart b/mobile/openapi/lib/model/system_config_f_fmpeg_dto.dart index ecf2e5da4a..d2be208aeb 100644 --- a/mobile/openapi/lib/model/system_config_f_fmpeg_dto.dart +++ b/mobile/openapi/lib/model/system_config_f_fmpeg_dto.dart @@ -1,23 +1,14 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigFFmpegDto { - /// Returns a new [SystemConfigFFmpegDto] instance. - SystemConfigFFmpegDto({ +final class SystemConfigFFmpegDto { + const SystemConfigFFmpegDto({ required this.accel, required this.accelDecode, - this.acceptedAudioCodecs = const [], - this.acceptedContainers = const [], - this.acceptedVideoCodecs = const [], + required this.acceptedAudioCodecs, + required this.acceptedContainers, + required this.acceptedVideoCodecs, required this.bframes, required this.cqMode, required this.crf, @@ -29,261 +20,234 @@ class SystemConfigFFmpegDto { required this.targetAudioCodec, required this.targetResolution, required this.targetVideoCodec, - required this.temporalAQ, + required this.temporalAq, required this.threads, required this.tonemap, required this.transcode, required this.twoPass, }); - TranscodeHWAccel accel; + final TranscodeHwAccel accel; /// Accelerated decode - bool accelDecode; + final bool accelDecode; /// Accepted audio codecs - List acceptedAudioCodecs; + final List acceptedAudioCodecs; /// Accepted containers - List acceptedContainers; + final List acceptedContainers; /// Accepted video codecs - List acceptedVideoCodecs; + final List acceptedVideoCodecs; /// B-frames - /// - /// Minimum value: -1 - /// Maximum value: 16 - int bframes; + final int bframes; - CQMode cqMode; + final CqMode cqMode; /// CRF - /// - /// Minimum value: 0 - /// Maximum value: 51 - int crf; + final int crf; /// GOP size - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int gopSize; + final int gopSize; /// Max bitrate - String maxBitrate; + final String maxBitrate; /// Preferred hardware device - String preferredHwDevice; + final String preferredHwDevice; /// Preset - String preset; + final String preset; /// References - /// - /// Minimum value: 0 - /// Maximum value: 6 - int refs; + final int refs; - AudioCodec targetAudioCodec; + final AudioCodec targetAudioCodec; /// Target resolution - String targetResolution; + final String targetResolution; - VideoCodec targetVideoCodec; + final VideoCodec targetVideoCodec; /// Temporal AQ - bool temporalAQ; + final bool temporalAq; /// Threads - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int threads; + final int threads; - ToneMapping tonemap; + final ToneMapping tonemap; - TranscodePolicy transcode; + final TranscodePolicy transcode; /// Two pass - bool twoPass; + final bool twoPass; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigFFmpegDto && - other.accel == accel && - other.accelDecode == accelDecode && - _deepEquality.equals(other.acceptedAudioCodecs, acceptedAudioCodecs) && - _deepEquality.equals(other.acceptedContainers, acceptedContainers) && - _deepEquality.equals(other.acceptedVideoCodecs, acceptedVideoCodecs) && - other.bframes == bframes && - other.cqMode == cqMode && - other.crf == crf && - other.gopSize == gopSize && - other.maxBitrate == maxBitrate && - other.preferredHwDevice == preferredHwDevice && - other.preset == preset && - other.refs == refs && - other.targetAudioCodec == targetAudioCodec && - other.targetResolution == targetResolution && - other.targetVideoCodec == targetVideoCodec && - other.temporalAQ == temporalAQ && - other.threads == threads && - other.tonemap == tonemap && - other.transcode == transcode && - other.twoPass == twoPass; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (accel.hashCode) + - (accelDecode.hashCode) + - (acceptedAudioCodecs.hashCode) + - (acceptedContainers.hashCode) + - (acceptedVideoCodecs.hashCode) + - (bframes.hashCode) + - (cqMode.hashCode) + - (crf.hashCode) + - (gopSize.hashCode) + - (maxBitrate.hashCode) + - (preferredHwDevice.hashCode) + - (preset.hashCode) + - (refs.hashCode) + - (targetAudioCodec.hashCode) + - (targetResolution.hashCode) + - (targetVideoCodec.hashCode) + - (temporalAQ.hashCode) + - (threads.hashCode) + - (tonemap.hashCode) + - (transcode.hashCode) + - (twoPass.hashCode); - - @override - String toString() => 'SystemConfigFFmpegDto[accel=$accel, accelDecode=$accelDecode, acceptedAudioCodecs=$acceptedAudioCodecs, acceptedContainers=$acceptedContainers, acceptedVideoCodecs=$acceptedVideoCodecs, bframes=$bframes, cqMode=$cqMode, crf=$crf, gopSize=$gopSize, maxBitrate=$maxBitrate, preferredHwDevice=$preferredHwDevice, preset=$preset, refs=$refs, targetAudioCodec=$targetAudioCodec, targetResolution=$targetResolution, targetVideoCodec=$targetVideoCodec, temporalAQ=$temporalAQ, threads=$threads, tonemap=$tonemap, transcode=$transcode, twoPass=$twoPass]'; + static SystemConfigFFmpegDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + accel: (TranscodeHwAccel.fromJson(json[r'accel']))!, + accelDecode: json[r'accelDecode'] as bool, + acceptedAudioCodecs: ((json[r'acceptedAudioCodecs'] as List?) + ?.map(($e) => (AudioCodec.fromJson($e))!) + .toList(growable: false))!, + acceptedContainers: ((json[r'acceptedContainers'] as List?) + ?.map(($e) => (VideoContainer.fromJson($e))!) + .toList(growable: false))!, + acceptedVideoCodecs: ((json[r'acceptedVideoCodecs'] as List?) + ?.map(($e) => (VideoCodec.fromJson($e))!) + .toList(growable: false))!, + bframes: json[r'bframes'] as int, + cqMode: (CqMode.fromJson(json[r'cqMode']))!, + crf: json[r'crf'] as int, + gopSize: json[r'gopSize'] as int, + maxBitrate: json[r'maxBitrate'] as String, + preferredHwDevice: json[r'preferredHwDevice'] as String, + preset: json[r'preset'] as String, + refs: json[r'refs'] as int, + targetAudioCodec: (AudioCodec.fromJson(json[r'targetAudioCodec']))!, + targetResolution: json[r'targetResolution'] as String, + targetVideoCodec: (VideoCodec.fromJson(json[r'targetVideoCodec']))!, + temporalAq: json[r'temporalAQ'] as bool, + threads: json[r'threads'] as int, + tonemap: (ToneMapping.fromJson(json[r'tonemap']))!, + transcode: (TranscodePolicy.fromJson(json[r'transcode']))!, + twoPass: json[r'twoPass'] as bool, + ); + } Map toJson() { final json = {}; - json[r'accel'] = this.accel; - json[r'accelDecode'] = this.accelDecode; - json[r'acceptedAudioCodecs'] = this.acceptedAudioCodecs; - json[r'acceptedContainers'] = this.acceptedContainers; - json[r'acceptedVideoCodecs'] = this.acceptedVideoCodecs; - json[r'bframes'] = this.bframes; - json[r'cqMode'] = this.cqMode; - json[r'crf'] = this.crf; - json[r'gopSize'] = this.gopSize; - json[r'maxBitrate'] = this.maxBitrate; - json[r'preferredHwDevice'] = this.preferredHwDevice; - json[r'preset'] = this.preset; - json[r'refs'] = this.refs; - json[r'targetAudioCodec'] = this.targetAudioCodec; - json[r'targetResolution'] = this.targetResolution; - json[r'targetVideoCodec'] = this.targetVideoCodec; - json[r'temporalAQ'] = this.temporalAQ; - json[r'threads'] = this.threads; - json[r'tonemap'] = this.tonemap; - json[r'transcode'] = this.transcode; - json[r'twoPass'] = this.twoPass; + json[r'accel'] = accel.toJson(); + json[r'accelDecode'] = accelDecode; + json[r'acceptedAudioCodecs'] = acceptedAudioCodecs.map(($e) => $e.toJson()).toList(growable: false); + json[r'acceptedContainers'] = acceptedContainers.map(($e) => $e.toJson()).toList(growable: false); + json[r'acceptedVideoCodecs'] = acceptedVideoCodecs.map(($e) => $e.toJson()).toList(growable: false); + json[r'bframes'] = bframes; + json[r'cqMode'] = cqMode.toJson(); + json[r'crf'] = crf; + json[r'gopSize'] = gopSize; + json[r'maxBitrate'] = maxBitrate; + json[r'preferredHwDevice'] = preferredHwDevice; + json[r'preset'] = preset; + json[r'refs'] = refs; + json[r'targetAudioCodec'] = targetAudioCodec.toJson(); + json[r'targetResolution'] = targetResolution; + json[r'targetVideoCodec'] = targetVideoCodec.toJson(); + json[r'temporalAQ'] = temporalAq; + json[r'threads'] = threads; + json[r'tonemap'] = tonemap.toJson(); + json[r'transcode'] = transcode.toJson(); + json[r'twoPass'] = twoPass; return json; } - /// Returns a new [SystemConfigFFmpegDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigFFmpegDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigFFmpegDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigFFmpegDto( - accel: TranscodeHWAccel.fromJson(json[r'accel'])!, - accelDecode: mapValueOfType(json, r'accelDecode')!, - acceptedAudioCodecs: AudioCodec.listFromJson(json[r'acceptedAudioCodecs']), - acceptedContainers: VideoContainer.listFromJson(json[r'acceptedContainers']), - acceptedVideoCodecs: VideoCodec.listFromJson(json[r'acceptedVideoCodecs']), - bframes: mapValueOfType(json, r'bframes')!, - cqMode: CQMode.fromJson(json[r'cqMode'])!, - crf: mapValueOfType(json, r'crf')!, - gopSize: mapValueOfType(json, r'gopSize')!, - maxBitrate: mapValueOfType(json, r'maxBitrate')!, - preferredHwDevice: mapValueOfType(json, r'preferredHwDevice')!, - preset: mapValueOfType(json, r'preset')!, - refs: mapValueOfType(json, r'refs')!, - targetAudioCodec: AudioCodec.fromJson(json[r'targetAudioCodec'])!, - targetResolution: mapValueOfType(json, r'targetResolution')!, - targetVideoCodec: VideoCodec.fromJson(json[r'targetVideoCodec'])!, - temporalAQ: mapValueOfType(json, r'temporalAQ')!, - threads: mapValueOfType(json, r'threads')!, - tonemap: ToneMapping.fromJson(json[r'tonemap'])!, - transcode: TranscodePolicy.fromJson(json[r'transcode'])!, - twoPass: mapValueOfType(json, r'twoPass')!, - ); - } - return null; + SystemConfigFFmpegDto copyWith({ + TranscodeHwAccel? accel, + bool? accelDecode, + List? acceptedAudioCodecs, + List? acceptedContainers, + List? acceptedVideoCodecs, + int? bframes, + CqMode? cqMode, + int? crf, + int? gopSize, + String? maxBitrate, + String? preferredHwDevice, + String? preset, + int? refs, + AudioCodec? targetAudioCodec, + String? targetResolution, + VideoCodec? targetVideoCodec, + bool? temporalAq, + int? threads, + ToneMapping? tonemap, + TranscodePolicy? transcode, + bool? twoPass, + }) { + return .new( + accel: accel ?? this.accel, + accelDecode: accelDecode ?? this.accelDecode, + acceptedAudioCodecs: acceptedAudioCodecs ?? this.acceptedAudioCodecs, + acceptedContainers: acceptedContainers ?? this.acceptedContainers, + acceptedVideoCodecs: acceptedVideoCodecs ?? this.acceptedVideoCodecs, + bframes: bframes ?? this.bframes, + cqMode: cqMode ?? this.cqMode, + crf: crf ?? this.crf, + gopSize: gopSize ?? this.gopSize, + maxBitrate: maxBitrate ?? this.maxBitrate, + preferredHwDevice: preferredHwDevice ?? this.preferredHwDevice, + preset: preset ?? this.preset, + refs: refs ?? this.refs, + targetAudioCodec: targetAudioCodec ?? this.targetAudioCodec, + targetResolution: targetResolution ?? this.targetResolution, + targetVideoCodec: targetVideoCodec ?? this.targetVideoCodec, + temporalAq: temporalAq ?? this.temporalAq, + threads: threads ?? this.threads, + tonemap: tonemap ?? this.tonemap, + transcode: transcode ?? this.transcode, + twoPass: twoPass ?? this.twoPass, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigFFmpegDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigFFmpegDto && + accel == other.accel && + accelDecode == other.accelDecode && + const DeepCollectionEquality().equals(acceptedAudioCodecs, other.acceptedAudioCodecs) && + const DeepCollectionEquality().equals(acceptedContainers, other.acceptedContainers) && + const DeepCollectionEquality().equals(acceptedVideoCodecs, other.acceptedVideoCodecs) && + bframes == other.bframes && + cqMode == other.cqMode && + crf == other.crf && + gopSize == other.gopSize && + maxBitrate == other.maxBitrate && + preferredHwDevice == other.preferredHwDevice && + preset == other.preset && + refs == other.refs && + targetAudioCodec == other.targetAudioCodec && + targetResolution == other.targetResolution && + targetVideoCodec == other.targetVideoCodec && + temporalAq == other.temporalAq && + threads == other.threads && + tonemap == other.tonemap && + transcode == other.transcode && + twoPass == other.twoPass); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigFFmpegDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + accel, + accelDecode, + const DeepCollectionEquality().hash(acceptedAudioCodecs), + const DeepCollectionEquality().hash(acceptedContainers), + const DeepCollectionEquality().hash(acceptedVideoCodecs), + bframes, + cqMode, + crf, + gopSize, + maxBitrate, + preferredHwDevice, + preset, + refs, + targetAudioCodec, + targetResolution, + targetVideoCodec, + temporalAq, + threads, + tonemap, + transcode, + twoPass, + ]); } - // maps a json object with a list of SystemConfigFFmpegDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigFFmpegDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'accel', - 'accelDecode', - 'acceptedAudioCodecs', - 'acceptedContainers', - 'acceptedVideoCodecs', - 'bframes', - 'cqMode', - 'crf', - 'gopSize', - 'maxBitrate', - 'preferredHwDevice', - 'preset', - 'refs', - 'targetAudioCodec', - 'targetResolution', - 'targetVideoCodec', - 'temporalAQ', - 'threads', - 'tonemap', - 'transcode', - 'twoPass', - }; + @override + String toString() => + 'SystemConfigFFmpegDto(accel=$accel, accelDecode=$accelDecode, acceptedAudioCodecs=$acceptedAudioCodecs, acceptedContainers=$acceptedContainers, acceptedVideoCodecs=$acceptedVideoCodecs, bframes=$bframes, cqMode=$cqMode, crf=$crf, gopSize=$gopSize, maxBitrate=$maxBitrate, preferredHwDevice=$preferredHwDevice, preset=$preset, refs=$refs, targetAudioCodec=$targetAudioCodec, targetResolution=$targetResolution, targetVideoCodec=$targetVideoCodec, temporalAq=$temporalAq, threads=$threads, tonemap=$tonemap, transcode=$transcode, twoPass=$twoPass)'; } - diff --git a/mobile/openapi/lib/model/system_config_faces_dto.dart b/mobile/openapi/lib/model/system_config_faces_dto.dart index f57303c310..01bd5cb3e0 100644 --- a/mobile/openapi/lib/model/system_config_faces_dto.dart +++ b/mobile/openapi/lib/model/system_config_faces_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigFacesDto { - /// Returns a new [SystemConfigFacesDto] instance. - SystemConfigFacesDto({ - required this.import_, - }); +final class SystemConfigFacesDto { + const SystemConfigFacesDto({required this.import$}); /// Import - bool import_; + final bool import$; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigFacesDto && - other.import_ == import_; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (import_.hashCode); - - @override - String toString() => 'SystemConfigFacesDto[import_=$import_]'; + static SystemConfigFacesDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(import$: json[r'import'] as bool); + } Map toJson() { final json = {}; - json[r'import'] = this.import_; + json[r'import'] = import$; return json; } - /// Returns a new [SystemConfigFacesDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigFacesDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigFacesDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigFacesDto( - import_: mapValueOfType(json, r'import')!, - ); - } - return null; + SystemConfigFacesDto copyWith({bool? import$}) { + return .new(import$: import$ ?? this.import$); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigFacesDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigFacesDto && import$ == other.import$); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigFacesDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([import$]); } - // maps a json object with a list of SystemConfigFacesDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigFacesDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'import', - }; + @override + String toString() => 'SystemConfigFacesDto(import\$=${import$})'; } - diff --git a/mobile/openapi/lib/model/system_config_generated_fullsize_image_dto.dart b/mobile/openapi/lib/model/system_config_generated_fullsize_image_dto.dart index d78f8fadd5..ba183fb7e1 100644 --- a/mobile/openapi/lib/model/system_config_generated_fullsize_image_dto.dart +++ b/mobile/openapi/lib/model/system_config_generated_fullsize_image_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigGeneratedFullsizeImageDto { - /// Returns a new [SystemConfigGeneratedFullsizeImageDto] instance. - SystemConfigGeneratedFullsizeImageDto({ +final class SystemConfigGeneratedFullsizeImageDto { + const SystemConfigGeneratedFullsizeImageDto({ required this.enabled, required this.format, this.progressive, @@ -20,119 +11,71 @@ class SystemConfigGeneratedFullsizeImageDto { }); /// Enabled - bool enabled; + final bool enabled; - ImageFormat format; + final ImageFormat format; /// Progressive - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? progressive; + final bool? progressive; /// Quality - /// - /// Minimum value: 1 - /// Maximum value: 100 - int quality; + final int quality; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigGeneratedFullsizeImageDto && - other.enabled == enabled && - other.format == format && - other.progressive == progressive && - other.quality == quality; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (format.hashCode) + - (progressive == null ? 0 : progressive!.hashCode) + - (quality.hashCode); - - @override - String toString() => 'SystemConfigGeneratedFullsizeImageDto[enabled=$enabled, format=$format, progressive=$progressive, quality=$quality]'; + static SystemConfigGeneratedFullsizeImageDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + enabled: json[r'enabled'] as bool, + format: (ImageFormat.fromJson(json[r'format']))!, + progressive: (json[r'progressive'] as bool?), + quality: json[r'quality'] as int, + ); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'format'] = this.format; - if (this.progressive != null) { - json[r'progressive'] = this.progressive; - } else { - // json[r'progressive'] = null; + json[r'enabled'] = enabled; + json[r'format'] = format.toJson(); + if (progressive != null) { + json[r'progressive'] = progressive!; } - json[r'quality'] = this.quality; + json[r'quality'] = quality; return json; } - /// Returns a new [SystemConfigGeneratedFullsizeImageDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigGeneratedFullsizeImageDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigGeneratedFullsizeImageDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigGeneratedFullsizeImageDto( - enabled: mapValueOfType(json, r'enabled')!, - format: ImageFormat.fromJson(json[r'format'])!, - progressive: mapValueOfType(json, r'progressive'), - quality: mapValueOfType(json, r'quality')!, - ); - } - return null; + SystemConfigGeneratedFullsizeImageDto copyWith({ + bool? enabled, + ImageFormat? format, + Object? progressive = _undefined, + int? quality, + }) { + return .new( + enabled: enabled ?? this.enabled, + format: format ?? this.format, + progressive: identical(progressive, _undefined) ? this.progressive : progressive as bool?, + quality: quality ?? this.quality, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigGeneratedFullsizeImageDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigGeneratedFullsizeImageDto && + enabled == other.enabled && + format == other.format && + progressive == other.progressive && + quality == other.quality); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigGeneratedFullsizeImageDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, format, progressive, quality]); } - // maps a json object with a list of SystemConfigGeneratedFullsizeImageDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigGeneratedFullsizeImageDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'format', - 'quality', - }; + @override + String toString() => + 'SystemConfigGeneratedFullsizeImageDto(enabled=$enabled, format=$format, progressive=$progressive, quality=$quality)'; } - diff --git a/mobile/openapi/lib/model/system_config_generated_image_dto.dart b/mobile/openapi/lib/model/system_config_generated_image_dto.dart index 2571c0cab0..4a7d7c155c 100644 --- a/mobile/openapi/lib/model/system_config_generated_image_dto.dart +++ b/mobile/openapi/lib/model/system_config_generated_image_dto.dart @@ -1,141 +1,81 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigGeneratedImageDto { - /// Returns a new [SystemConfigGeneratedImageDto] instance. - SystemConfigGeneratedImageDto({ +final class SystemConfigGeneratedImageDto { + const SystemConfigGeneratedImageDto({ required this.format, this.progressive, required this.quality, required this.size, }); - ImageFormat format; + final ImageFormat format; /// Progressive - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? progressive; + final bool? progressive; /// Quality - /// - /// Minimum value: 1 - /// Maximum value: 100 - int quality; + final int quality; /// Size - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - int size; + final int size; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigGeneratedImageDto && - other.format == format && - other.progressive == progressive && - other.quality == quality && - other.size == size; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (format.hashCode) + - (progressive == null ? 0 : progressive!.hashCode) + - (quality.hashCode) + - (size.hashCode); - - @override - String toString() => 'SystemConfigGeneratedImageDto[format=$format, progressive=$progressive, quality=$quality, size=$size]'; + static SystemConfigGeneratedImageDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + format: (ImageFormat.fromJson(json[r'format']))!, + progressive: (json[r'progressive'] as bool?), + quality: json[r'quality'] as int, + size: json[r'size'] as int, + ); + } Map toJson() { final json = {}; - json[r'format'] = this.format; - if (this.progressive != null) { - json[r'progressive'] = this.progressive; - } else { - // json[r'progressive'] = null; + json[r'format'] = format.toJson(); + if (progressive != null) { + json[r'progressive'] = progressive!; } - json[r'quality'] = this.quality; - json[r'size'] = this.size; + json[r'quality'] = quality; + json[r'size'] = size; return json; } - /// Returns a new [SystemConfigGeneratedImageDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigGeneratedImageDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigGeneratedImageDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigGeneratedImageDto( - format: ImageFormat.fromJson(json[r'format'])!, - progressive: mapValueOfType(json, r'progressive'), - quality: mapValueOfType(json, r'quality')!, - size: mapValueOfType(json, r'size')!, - ); - } - return null; + SystemConfigGeneratedImageDto copyWith({ + ImageFormat? format, + Object? progressive = _undefined, + int? quality, + int? size, + }) { + return .new( + format: format ?? this.format, + progressive: identical(progressive, _undefined) ? this.progressive : progressive as bool?, + quality: quality ?? this.quality, + size: size ?? this.size, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigGeneratedImageDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigGeneratedImageDto && + format == other.format && + progressive == other.progressive && + quality == other.quality && + size == other.size); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigGeneratedImageDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([format, progressive, quality, size]); } - // maps a json object with a list of SystemConfigGeneratedImageDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigGeneratedImageDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'format', - 'quality', - 'size', - }; + @override + String toString() => + 'SystemConfigGeneratedImageDto(format=$format, progressive=$progressive, quality=$quality, size=$size)'; } - diff --git a/mobile/openapi/lib/model/system_config_image_dto.dart b/mobile/openapi/lib/model/system_config_image_dto.dart index 668b740872..44c68be400 100644 --- a/mobile/openapi/lib/model/system_config_image_dto.dart +++ b/mobile/openapi/lib/model/system_config_image_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigImageDto { - /// Returns a new [SystemConfigImageDto] instance. - SystemConfigImageDto({ +final class SystemConfigImageDto { + const SystemConfigImageDto({ required this.colorspace, required this.extractEmbedded, required this.fullsize, @@ -20,113 +11,73 @@ class SystemConfigImageDto { required this.thumbnail, }); - Colorspace colorspace; + final Colorspace colorspace; /// Extract embedded - bool extractEmbedded; + final bool extractEmbedded; - SystemConfigGeneratedFullsizeImageDto fullsize; + final SystemConfigGeneratedFullsizeImageDto fullsize; - SystemConfigGeneratedImageDto preview; + final SystemConfigGeneratedImageDto preview; - SystemConfigGeneratedImageDto thumbnail; + final SystemConfigGeneratedImageDto thumbnail; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigImageDto && - other.colorspace == colorspace && - other.extractEmbedded == extractEmbedded && - other.fullsize == fullsize && - other.preview == preview && - other.thumbnail == thumbnail; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (colorspace.hashCode) + - (extractEmbedded.hashCode) + - (fullsize.hashCode) + - (preview.hashCode) + - (thumbnail.hashCode); - - @override - String toString() => 'SystemConfigImageDto[colorspace=$colorspace, extractEmbedded=$extractEmbedded, fullsize=$fullsize, preview=$preview, thumbnail=$thumbnail]'; + static SystemConfigImageDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + colorspace: (Colorspace.fromJson(json[r'colorspace']))!, + extractEmbedded: json[r'extractEmbedded'] as bool, + fullsize: (SystemConfigGeneratedFullsizeImageDto.fromJson(json[r'fullsize']))!, + preview: (SystemConfigGeneratedImageDto.fromJson(json[r'preview']))!, + thumbnail: (SystemConfigGeneratedImageDto.fromJson(json[r'thumbnail']))!, + ); + } Map toJson() { final json = {}; - json[r'colorspace'] = this.colorspace; - json[r'extractEmbedded'] = this.extractEmbedded; - json[r'fullsize'] = this.fullsize; - json[r'preview'] = this.preview; - json[r'thumbnail'] = this.thumbnail; + json[r'colorspace'] = colorspace.toJson(); + json[r'extractEmbedded'] = extractEmbedded; + json[r'fullsize'] = fullsize.toJson(); + json[r'preview'] = preview.toJson(); + json[r'thumbnail'] = thumbnail.toJson(); return json; } - /// Returns a new [SystemConfigImageDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigImageDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigImageDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigImageDto( - colorspace: Colorspace.fromJson(json[r'colorspace'])!, - extractEmbedded: mapValueOfType(json, r'extractEmbedded')!, - fullsize: SystemConfigGeneratedFullsizeImageDto.fromJson(json[r'fullsize'])!, - preview: SystemConfigGeneratedImageDto.fromJson(json[r'preview'])!, - thumbnail: SystemConfigGeneratedImageDto.fromJson(json[r'thumbnail'])!, - ); - } - return null; + SystemConfigImageDto copyWith({ + Colorspace? colorspace, + bool? extractEmbedded, + SystemConfigGeneratedFullsizeImageDto? fullsize, + SystemConfigGeneratedImageDto? preview, + SystemConfigGeneratedImageDto? thumbnail, + }) { + return .new( + colorspace: colorspace ?? this.colorspace, + extractEmbedded: extractEmbedded ?? this.extractEmbedded, + fullsize: fullsize ?? this.fullsize, + preview: preview ?? this.preview, + thumbnail: thumbnail ?? this.thumbnail, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigImageDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigImageDto && + colorspace == other.colorspace && + extractEmbedded == other.extractEmbedded && + fullsize == other.fullsize && + preview == other.preview && + thumbnail == other.thumbnail); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigImageDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([colorspace, extractEmbedded, fullsize, preview, thumbnail]); } - // maps a json object with a list of SystemConfigImageDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigImageDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'colorspace', - 'extractEmbedded', - 'fullsize', - 'preview', - 'thumbnail', - }; + @override + String toString() => + 'SystemConfigImageDto(colorspace=$colorspace, extractEmbedded=$extractEmbedded, fullsize=$fullsize, preview=$preview, thumbnail=$thumbnail)'; } - diff --git a/mobile/openapi/lib/model/system_config_job_dto.dart b/mobile/openapi/lib/model/system_config_job_dto.dart index d54db6809f..dd55707063 100644 --- a/mobile/openapi/lib/model/system_config_job_dto.dart +++ b/mobile/openapi/lib/model/system_config_job_dto.dart @@ -1,22 +1,13 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigJobDto { - /// Returns a new [SystemConfigJobDto] instance. - SystemConfigJobDto({ +final class SystemConfigJobDto { + const SystemConfigJobDto({ required this.backgroundTask, required this.editor, required this.faceDetection, - required this.library_, + required this.library$, required this.metadataExtraction, required this.migration, required this.notifications, @@ -29,175 +20,150 @@ class SystemConfigJobDto { required this.workflow, }); - JobSettingsDto backgroundTask; + final JobSettingsDto backgroundTask; - JobSettingsDto editor; + final JobSettingsDto editor; - JobSettingsDto faceDetection; + final JobSettingsDto faceDetection; - JobSettingsDto library_; + final JobSettingsDto library$; - JobSettingsDto metadataExtraction; + final JobSettingsDto metadataExtraction; - JobSettingsDto migration; + final JobSettingsDto migration; - JobSettingsDto notifications; + final JobSettingsDto notifications; - JobSettingsDto ocr; + final JobSettingsDto ocr; - JobSettingsDto search; + final JobSettingsDto search; - JobSettingsDto sidecar; + final JobSettingsDto sidecar; - JobSettingsDto smartSearch; + final JobSettingsDto smartSearch; - JobSettingsDto thumbnailGeneration; + final JobSettingsDto thumbnailGeneration; - JobSettingsDto videoConversion; + final JobSettingsDto videoConversion; - JobSettingsDto workflow; + final JobSettingsDto workflow; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigJobDto && - other.backgroundTask == backgroundTask && - other.editor == editor && - other.faceDetection == faceDetection && - other.library_ == library_ && - other.metadataExtraction == metadataExtraction && - other.migration == migration && - other.notifications == notifications && - other.ocr == ocr && - other.search == search && - other.sidecar == sidecar && - other.smartSearch == smartSearch && - other.thumbnailGeneration == thumbnailGeneration && - other.videoConversion == videoConversion && - other.workflow == workflow; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (backgroundTask.hashCode) + - (editor.hashCode) + - (faceDetection.hashCode) + - (library_.hashCode) + - (metadataExtraction.hashCode) + - (migration.hashCode) + - (notifications.hashCode) + - (ocr.hashCode) + - (search.hashCode) + - (sidecar.hashCode) + - (smartSearch.hashCode) + - (thumbnailGeneration.hashCode) + - (videoConversion.hashCode) + - (workflow.hashCode); - - @override - String toString() => 'SystemConfigJobDto[backgroundTask=$backgroundTask, editor=$editor, faceDetection=$faceDetection, library_=$library_, metadataExtraction=$metadataExtraction, migration=$migration, notifications=$notifications, ocr=$ocr, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, thumbnailGeneration=$thumbnailGeneration, videoConversion=$videoConversion, workflow=$workflow]'; + static SystemConfigJobDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + backgroundTask: (JobSettingsDto.fromJson(json[r'backgroundTask']))!, + editor: (JobSettingsDto.fromJson(json[r'editor']))!, + faceDetection: (JobSettingsDto.fromJson(json[r'faceDetection']))!, + library$: (JobSettingsDto.fromJson(json[r'library']))!, + metadataExtraction: (JobSettingsDto.fromJson(json[r'metadataExtraction']))!, + migration: (JobSettingsDto.fromJson(json[r'migration']))!, + notifications: (JobSettingsDto.fromJson(json[r'notifications']))!, + ocr: (JobSettingsDto.fromJson(json[r'ocr']))!, + search: (JobSettingsDto.fromJson(json[r'search']))!, + sidecar: (JobSettingsDto.fromJson(json[r'sidecar']))!, + smartSearch: (JobSettingsDto.fromJson(json[r'smartSearch']))!, + thumbnailGeneration: (JobSettingsDto.fromJson(json[r'thumbnailGeneration']))!, + videoConversion: (JobSettingsDto.fromJson(json[r'videoConversion']))!, + workflow: (JobSettingsDto.fromJson(json[r'workflow']))!, + ); + } Map toJson() { final json = {}; - json[r'backgroundTask'] = this.backgroundTask; - json[r'editor'] = this.editor; - json[r'faceDetection'] = this.faceDetection; - json[r'library'] = this.library_; - json[r'metadataExtraction'] = this.metadataExtraction; - json[r'migration'] = this.migration; - json[r'notifications'] = this.notifications; - json[r'ocr'] = this.ocr; - json[r'search'] = this.search; - json[r'sidecar'] = this.sidecar; - json[r'smartSearch'] = this.smartSearch; - json[r'thumbnailGeneration'] = this.thumbnailGeneration; - json[r'videoConversion'] = this.videoConversion; - json[r'workflow'] = this.workflow; + json[r'backgroundTask'] = backgroundTask.toJson(); + json[r'editor'] = editor.toJson(); + json[r'faceDetection'] = faceDetection.toJson(); + json[r'library'] = library$.toJson(); + json[r'metadataExtraction'] = metadataExtraction.toJson(); + json[r'migration'] = migration.toJson(); + json[r'notifications'] = notifications.toJson(); + json[r'ocr'] = ocr.toJson(); + json[r'search'] = search.toJson(); + json[r'sidecar'] = sidecar.toJson(); + json[r'smartSearch'] = smartSearch.toJson(); + json[r'thumbnailGeneration'] = thumbnailGeneration.toJson(); + json[r'videoConversion'] = videoConversion.toJson(); + json[r'workflow'] = workflow.toJson(); return json; } - /// Returns a new [SystemConfigJobDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigJobDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigJobDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigJobDto( - backgroundTask: JobSettingsDto.fromJson(json[r'backgroundTask'])!, - editor: JobSettingsDto.fromJson(json[r'editor'])!, - faceDetection: JobSettingsDto.fromJson(json[r'faceDetection'])!, - library_: JobSettingsDto.fromJson(json[r'library'])!, - metadataExtraction: JobSettingsDto.fromJson(json[r'metadataExtraction'])!, - migration: JobSettingsDto.fromJson(json[r'migration'])!, - notifications: JobSettingsDto.fromJson(json[r'notifications'])!, - ocr: JobSettingsDto.fromJson(json[r'ocr'])!, - search: JobSettingsDto.fromJson(json[r'search'])!, - sidecar: JobSettingsDto.fromJson(json[r'sidecar'])!, - smartSearch: JobSettingsDto.fromJson(json[r'smartSearch'])!, - thumbnailGeneration: JobSettingsDto.fromJson(json[r'thumbnailGeneration'])!, - videoConversion: JobSettingsDto.fromJson(json[r'videoConversion'])!, - workflow: JobSettingsDto.fromJson(json[r'workflow'])!, - ); - } - return null; + SystemConfigJobDto copyWith({ + JobSettingsDto? backgroundTask, + JobSettingsDto? editor, + JobSettingsDto? faceDetection, + JobSettingsDto? library$, + JobSettingsDto? metadataExtraction, + JobSettingsDto? migration, + JobSettingsDto? notifications, + JobSettingsDto? ocr, + JobSettingsDto? search, + JobSettingsDto? sidecar, + JobSettingsDto? smartSearch, + JobSettingsDto? thumbnailGeneration, + JobSettingsDto? videoConversion, + JobSettingsDto? workflow, + }) { + return .new( + backgroundTask: backgroundTask ?? this.backgroundTask, + editor: editor ?? this.editor, + faceDetection: faceDetection ?? this.faceDetection, + library$: library$ ?? this.library$, + metadataExtraction: metadataExtraction ?? this.metadataExtraction, + migration: migration ?? this.migration, + notifications: notifications ?? this.notifications, + ocr: ocr ?? this.ocr, + search: search ?? this.search, + sidecar: sidecar ?? this.sidecar, + smartSearch: smartSearch ?? this.smartSearch, + thumbnailGeneration: thumbnailGeneration ?? this.thumbnailGeneration, + videoConversion: videoConversion ?? this.videoConversion, + workflow: workflow ?? this.workflow, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigJobDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigJobDto && + backgroundTask == other.backgroundTask && + editor == other.editor && + faceDetection == other.faceDetection && + library$ == other.library$ && + metadataExtraction == other.metadataExtraction && + migration == other.migration && + notifications == other.notifications && + ocr == other.ocr && + search == other.search && + sidecar == other.sidecar && + smartSearch == other.smartSearch && + thumbnailGeneration == other.thumbnailGeneration && + videoConversion == other.videoConversion && + workflow == other.workflow); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigJobDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + backgroundTask, + editor, + faceDetection, + library$, + metadataExtraction, + migration, + notifications, + ocr, + search, + sidecar, + smartSearch, + thumbnailGeneration, + videoConversion, + workflow, + ]); } - // maps a json object with a list of SystemConfigJobDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigJobDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'backgroundTask', - 'editor', - 'faceDetection', - 'library', - 'metadataExtraction', - 'migration', - 'notifications', - 'ocr', - 'search', - 'sidecar', - 'smartSearch', - 'thumbnailGeneration', - 'videoConversion', - 'workflow', - }; + @override + String toString() => + 'SystemConfigJobDto(backgroundTask=$backgroundTask, editor=$editor, faceDetection=$faceDetection, library\$=${library$}, metadataExtraction=$metadataExtraction, migration=$migration, notifications=$notifications, ocr=$ocr, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, thumbnailGeneration=$thumbnailGeneration, videoConversion=$videoConversion, workflow=$workflow)'; } - diff --git a/mobile/openapi/lib/model/system_config_library_dto.dart b/mobile/openapi/lib/model/system_config_library_dto.dart index e728b0bf20..0166adc327 100644 --- a/mobile/openapi/lib/model/system_config_library_dto.dart +++ b/mobile/openapi/lib/model/system_config_library_dto.dart @@ -1,107 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigLibraryDto { - /// Returns a new [SystemConfigLibraryDto] instance. - SystemConfigLibraryDto({ - required this.scan, - required this.watch, - }); +final class SystemConfigLibraryDto { + const SystemConfigLibraryDto({required this.scan, required this.watch}); - SystemConfigLibraryScanDto scan; + final SystemConfigLibraryScanDto scan; - SystemConfigLibraryWatchDto watch; + final SystemConfigLibraryWatchDto watch; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigLibraryDto && - other.scan == scan && - other.watch == watch; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (scan.hashCode) + - (watch.hashCode); - - @override - String toString() => 'SystemConfigLibraryDto[scan=$scan, watch=$watch]'; + static SystemConfigLibraryDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + scan: (SystemConfigLibraryScanDto.fromJson(json[r'scan']))!, + watch: (SystemConfigLibraryWatchDto.fromJson(json[r'watch']))!, + ); + } Map toJson() { final json = {}; - json[r'scan'] = this.scan; - json[r'watch'] = this.watch; + json[r'scan'] = scan.toJson(); + json[r'watch'] = watch.toJson(); return json; } - /// Returns a new [SystemConfigLibraryDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigLibraryDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigLibraryDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigLibraryDto( - scan: SystemConfigLibraryScanDto.fromJson(json[r'scan'])!, - watch: SystemConfigLibraryWatchDto.fromJson(json[r'watch'])!, - ); - } - return null; + SystemConfigLibraryDto copyWith({SystemConfigLibraryScanDto? scan, SystemConfigLibraryWatchDto? watch}) { + return .new(scan: scan ?? this.scan, watch: watch ?? this.watch); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigLibraryDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigLibraryDto && scan == other.scan && watch == other.watch); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigLibraryDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([scan, watch]); } - // maps a json object with a list of SystemConfigLibraryDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigLibraryDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'scan', - 'watch', - }; + @override + String toString() => 'SystemConfigLibraryDto(scan=$scan, watch=$watch)'; } - diff --git a/mobile/openapi/lib/model/system_config_library_scan_dto.dart b/mobile/openapi/lib/model/system_config_library_scan_dto.dart index 003000d2ec..78351847d8 100644 --- a/mobile/openapi/lib/model/system_config_library_scan_dto.dart +++ b/mobile/openapi/lib/model/system_config_library_scan_dto.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigLibraryScanDto { - /// Returns a new [SystemConfigLibraryScanDto] instance. - SystemConfigLibraryScanDto({ - required this.cronExpression, - required this.enabled, - }); +final class SystemConfigLibraryScanDto { + const SystemConfigLibraryScanDto({required this.cronExpression, required this.enabled}); /// Cron expression - String cronExpression; + final String cronExpression; /// Enabled - bool enabled; + final bool enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigLibraryScanDto && - other.cronExpression == cronExpression && - other.enabled == enabled; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (cronExpression.hashCode) + - (enabled.hashCode); - - @override - String toString() => 'SystemConfigLibraryScanDto[cronExpression=$cronExpression, enabled=$enabled]'; + static SystemConfigLibraryScanDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(cronExpression: json[r'cronExpression'] as String, enabled: json[r'enabled'] as bool); + } Map toJson() { final json = {}; - json[r'cronExpression'] = this.cronExpression; - json[r'enabled'] = this.enabled; + json[r'cronExpression'] = cronExpression; + json[r'enabled'] = enabled; return json; } - /// Returns a new [SystemConfigLibraryScanDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigLibraryScanDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigLibraryScanDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigLibraryScanDto( - cronExpression: mapValueOfType(json, r'cronExpression')!, - enabled: mapValueOfType(json, r'enabled')!, - ); - } - return null; + SystemConfigLibraryScanDto copyWith({String? cronExpression, bool? enabled}) { + return .new(cronExpression: cronExpression ?? this.cronExpression, enabled: enabled ?? this.enabled); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigLibraryScanDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigLibraryScanDto && cronExpression == other.cronExpression && enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigLibraryScanDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([cronExpression, enabled]); } - // maps a json object with a list of SystemConfigLibraryScanDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigLibraryScanDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'cronExpression', - 'enabled', - }; + @override + String toString() => 'SystemConfigLibraryScanDto(cronExpression=$cronExpression, enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/system_config_library_watch_dto.dart b/mobile/openapi/lib/model/system_config_library_watch_dto.dart index b4f171bd25..f8c6b1199a 100644 --- a/mobile/openapi/lib/model/system_config_library_watch_dto.dart +++ b/mobile/openapi/lib/model/system_config_library_watch_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigLibraryWatchDto { - /// Returns a new [SystemConfigLibraryWatchDto] instance. - SystemConfigLibraryWatchDto({ - required this.enabled, - }); +final class SystemConfigLibraryWatchDto { + const SystemConfigLibraryWatchDto({required this.enabled}); /// Enabled - bool enabled; + final bool enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigLibraryWatchDto && - other.enabled == enabled; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode); - - @override - String toString() => 'SystemConfigLibraryWatchDto[enabled=$enabled]'; + static SystemConfigLibraryWatchDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; + json[r'enabled'] = enabled; return json; } - /// Returns a new [SystemConfigLibraryWatchDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigLibraryWatchDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigLibraryWatchDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigLibraryWatchDto( - enabled: mapValueOfType(json, r'enabled')!, - ); - } - return null; + SystemConfigLibraryWatchDto copyWith({bool? enabled}) { + return .new(enabled: enabled ?? this.enabled); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigLibraryWatchDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigLibraryWatchDto && enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigLibraryWatchDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled]); } - // maps a json object with a list of SystemConfigLibraryWatchDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigLibraryWatchDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - }; + @override + String toString() => 'SystemConfigLibraryWatchDto(enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/system_config_logging_dto.dart b/mobile/openapi/lib/model/system_config_logging_dto.dart index 54278893db..3314c57156 100644 --- a/mobile/openapi/lib/model/system_config_logging_dto.dart +++ b/mobile/openapi/lib/model/system_config_logging_dto.dart @@ -1,108 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigLoggingDto { - /// Returns a new [SystemConfigLoggingDto] instance. - SystemConfigLoggingDto({ - required this.enabled, - required this.level, - }); +final class SystemConfigLoggingDto { + const SystemConfigLoggingDto({required this.enabled, required this.level}); /// Enabled - bool enabled; + final bool enabled; - LogLevel level; + final LogLevel level; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigLoggingDto && - other.enabled == enabled && - other.level == level; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (level.hashCode); - - @override - String toString() => 'SystemConfigLoggingDto[enabled=$enabled, level=$level]'; + static SystemConfigLoggingDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool, level: (LogLevel.fromJson(json[r'level']))!); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'level'] = this.level; + json[r'enabled'] = enabled; + json[r'level'] = level.toJson(); return json; } - /// Returns a new [SystemConfigLoggingDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigLoggingDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigLoggingDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigLoggingDto( - enabled: mapValueOfType(json, r'enabled')!, - level: LogLevel.fromJson(json[r'level'])!, - ); - } - return null; + SystemConfigLoggingDto copyWith({bool? enabled, LogLevel? level}) { + return .new(enabled: enabled ?? this.enabled, level: level ?? this.level); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigLoggingDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigLoggingDto && enabled == other.enabled && level == other.level); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigLoggingDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, level]); } - // maps a json object with a list of SystemConfigLoggingDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigLoggingDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'level', - }; + @override + String toString() => 'SystemConfigLoggingDto(enabled=$enabled, level=$level)'; } - diff --git a/mobile/openapi/lib/model/system_config_machine_learning_dto.dart b/mobile/openapi/lib/model/system_config_machine_learning_dto.dart index 6162e72b8f..1b43cb6d28 100644 --- a/mobile/openapi/lib/model/system_config_machine_learning_dto.dart +++ b/mobile/openapi/lib/model/system_config_machine_learning_dto.dart @@ -1,151 +1,108 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigMachineLearningDto { - /// Returns a new [SystemConfigMachineLearningDto] instance. - SystemConfigMachineLearningDto({ +final class SystemConfigMachineLearningDto { + const SystemConfigMachineLearningDto({ required this.availabilityChecks, required this.clip, required this.duplicateDetection, required this.enabled, required this.facialRecognition, required this.ocr, - this.urls = const [], + required this.urls, }); - MachineLearningAvailabilityChecksDto availabilityChecks; + final MachineLearningAvailabilityChecksDto availabilityChecks; - CLIPConfig clip; + final ClipConfig clip; - DuplicateDetectionConfig duplicateDetection; + final DuplicateDetectionConfig duplicateDetection; /// Enabled - bool enabled; + final bool enabled; - FacialRecognitionConfig facialRecognition; + final FacialRecognitionConfig facialRecognition; - OcrConfig ocr; + final OcrConfig ocr; /// ML service URLs - List urls; + final List urls; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigMachineLearningDto && - other.availabilityChecks == availabilityChecks && - other.clip == clip && - other.duplicateDetection == duplicateDetection && - other.enabled == enabled && - other.facialRecognition == facialRecognition && - other.ocr == ocr && - _deepEquality.equals(other.urls, urls); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (availabilityChecks.hashCode) + - (clip.hashCode) + - (duplicateDetection.hashCode) + - (enabled.hashCode) + - (facialRecognition.hashCode) + - (ocr.hashCode) + - (urls.hashCode); - - @override - String toString() => 'SystemConfigMachineLearningDto[availabilityChecks=$availabilityChecks, clip=$clip, duplicateDetection=$duplicateDetection, enabled=$enabled, facialRecognition=$facialRecognition, ocr=$ocr, urls=$urls]'; + static SystemConfigMachineLearningDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + availabilityChecks: (MachineLearningAvailabilityChecksDto.fromJson(json[r'availabilityChecks']))!, + clip: (ClipConfig.fromJson(json[r'clip']))!, + duplicateDetection: (DuplicateDetectionConfig.fromJson(json[r'duplicateDetection']))!, + enabled: json[r'enabled'] as bool, + facialRecognition: (FacialRecognitionConfig.fromJson(json[r'facialRecognition']))!, + ocr: (OcrConfig.fromJson(json[r'ocr']))!, + urls: ((json[r'urls'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'availabilityChecks'] = this.availabilityChecks; - json[r'clip'] = this.clip; - json[r'duplicateDetection'] = this.duplicateDetection; - json[r'enabled'] = this.enabled; - json[r'facialRecognition'] = this.facialRecognition; - json[r'ocr'] = this.ocr; - json[r'urls'] = this.urls; + json[r'availabilityChecks'] = availabilityChecks.toJson(); + json[r'clip'] = clip.toJson(); + json[r'duplicateDetection'] = duplicateDetection.toJson(); + json[r'enabled'] = enabled; + json[r'facialRecognition'] = facialRecognition.toJson(); + json[r'ocr'] = ocr.toJson(); + json[r'urls'] = urls; return json; } - /// Returns a new [SystemConfigMachineLearningDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigMachineLearningDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigMachineLearningDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigMachineLearningDto( - availabilityChecks: MachineLearningAvailabilityChecksDto.fromJson(json[r'availabilityChecks'])!, - clip: CLIPConfig.fromJson(json[r'clip'])!, - duplicateDetection: DuplicateDetectionConfig.fromJson(json[r'duplicateDetection'])!, - enabled: mapValueOfType(json, r'enabled')!, - facialRecognition: FacialRecognitionConfig.fromJson(json[r'facialRecognition'])!, - ocr: OcrConfig.fromJson(json[r'ocr'])!, - urls: json[r'urls'] is Iterable - ? (json[r'urls'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + SystemConfigMachineLearningDto copyWith({ + MachineLearningAvailabilityChecksDto? availabilityChecks, + ClipConfig? clip, + DuplicateDetectionConfig? duplicateDetection, + bool? enabled, + FacialRecognitionConfig? facialRecognition, + OcrConfig? ocr, + List? urls, + }) { + return .new( + availabilityChecks: availabilityChecks ?? this.availabilityChecks, + clip: clip ?? this.clip, + duplicateDetection: duplicateDetection ?? this.duplicateDetection, + enabled: enabled ?? this.enabled, + facialRecognition: facialRecognition ?? this.facialRecognition, + ocr: ocr ?? this.ocr, + urls: urls ?? this.urls, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigMachineLearningDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigMachineLearningDto && + availabilityChecks == other.availabilityChecks && + clip == other.clip && + duplicateDetection == other.duplicateDetection && + enabled == other.enabled && + facialRecognition == other.facialRecognition && + ocr == other.ocr && + const DeepCollectionEquality().equals(urls, other.urls)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigMachineLearningDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + availabilityChecks, + clip, + duplicateDetection, + enabled, + facialRecognition, + ocr, + const DeepCollectionEquality().hash(urls), + ]); } - // maps a json object with a list of SystemConfigMachineLearningDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigMachineLearningDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'availabilityChecks', - 'clip', - 'duplicateDetection', - 'enabled', - 'facialRecognition', - 'ocr', - 'urls', - }; + @override + String toString() => + 'SystemConfigMachineLearningDto(availabilityChecks=$availabilityChecks, clip=$clip, duplicateDetection=$duplicateDetection, enabled=$enabled, facialRecognition=$facialRecognition, ocr=$ocr, urls=$urls)'; } - diff --git a/mobile/openapi/lib/model/system_config_map_dto.dart b/mobile/openapi/lib/model/system_config_map_dto.dart index 7a2fbb516b..2a95783d06 100644 --- a/mobile/openapi/lib/model/system_config_map_dto.dart +++ b/mobile/openapi/lib/model/system_config_map_dto.dart @@ -1,118 +1,60 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigMapDto { - /// Returns a new [SystemConfigMapDto] instance. - SystemConfigMapDto({ - required this.darkStyle, - required this.enabled, - required this.lightStyle, - }); +final class SystemConfigMapDto { + const SystemConfigMapDto({required this.darkStyle, required this.enabled, required this.lightStyle}); /// Dark map style URL - String darkStyle; + final String darkStyle; /// Enabled - bool enabled; + final bool enabled; /// Light map style URL - String lightStyle; + final String lightStyle; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigMapDto && - other.darkStyle == darkStyle && - other.enabled == enabled && - other.lightStyle == lightStyle; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (darkStyle.hashCode) + - (enabled.hashCode) + - (lightStyle.hashCode); - - @override - String toString() => 'SystemConfigMapDto[darkStyle=$darkStyle, enabled=$enabled, lightStyle=$lightStyle]'; + static SystemConfigMapDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + darkStyle: json[r'darkStyle'] as String, + enabled: json[r'enabled'] as bool, + lightStyle: json[r'lightStyle'] as String, + ); + } Map toJson() { final json = {}; - json[r'darkStyle'] = this.darkStyle; - json[r'enabled'] = this.enabled; - json[r'lightStyle'] = this.lightStyle; + json[r'darkStyle'] = darkStyle; + json[r'enabled'] = enabled; + json[r'lightStyle'] = lightStyle; return json; } - /// Returns a new [SystemConfigMapDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigMapDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigMapDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigMapDto( - darkStyle: mapValueOfType(json, r'darkStyle')!, - enabled: mapValueOfType(json, r'enabled')!, - lightStyle: mapValueOfType(json, r'lightStyle')!, - ); - } - return null; + SystemConfigMapDto copyWith({String? darkStyle, bool? enabled, String? lightStyle}) { + return .new( + darkStyle: darkStyle ?? this.darkStyle, + enabled: enabled ?? this.enabled, + lightStyle: lightStyle ?? this.lightStyle, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigMapDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigMapDto && + darkStyle == other.darkStyle && + enabled == other.enabled && + lightStyle == other.lightStyle); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigMapDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([darkStyle, enabled, lightStyle]); } - // maps a json object with a list of SystemConfigMapDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigMapDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'darkStyle', - 'enabled', - 'lightStyle', - }; + @override + String toString() => 'SystemConfigMapDto(darkStyle=$darkStyle, enabled=$enabled, lightStyle=$lightStyle)'; } - diff --git a/mobile/openapi/lib/model/system_config_metadata_dto.dart b/mobile/openapi/lib/model/system_config_metadata_dto.dart index 3c32fc551d..a230cd8d70 100644 --- a/mobile/openapi/lib/model/system_config_metadata_dto.dart +++ b/mobile/openapi/lib/model/system_config_metadata_dto.dart @@ -1,99 +1,39 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigMetadataDto { - /// Returns a new [SystemConfigMetadataDto] instance. - SystemConfigMetadataDto({ - required this.faces, - }); +final class SystemConfigMetadataDto { + const SystemConfigMetadataDto({required this.faces}); - SystemConfigFacesDto faces; + final SystemConfigFacesDto faces; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigMetadataDto && - other.faces == faces; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (faces.hashCode); - - @override - String toString() => 'SystemConfigMetadataDto[faces=$faces]'; + static SystemConfigMetadataDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(faces: (SystemConfigFacesDto.fromJson(json[r'faces']))!); + } Map toJson() { final json = {}; - json[r'faces'] = this.faces; + json[r'faces'] = faces.toJson(); return json; } - /// Returns a new [SystemConfigMetadataDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigMetadataDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigMetadataDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigMetadataDto( - faces: SystemConfigFacesDto.fromJson(json[r'faces'])!, - ); - } - return null; + SystemConfigMetadataDto copyWith({SystemConfigFacesDto? faces}) { + return .new(faces: faces ?? this.faces); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigMetadataDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigMetadataDto && faces == other.faces); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigMetadataDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([faces]); } - // maps a json object with a list of SystemConfigMetadataDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigMetadataDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'faces', - }; + @override + String toString() => 'SystemConfigMetadataDto(faces=$faces)'; } - diff --git a/mobile/openapi/lib/model/system_config_new_version_check_dto.dart b/mobile/openapi/lib/model/system_config_new_version_check_dto.dart index ec2b400dfd..17bdd1a263 100644 --- a/mobile/openapi/lib/model/system_config_new_version_check_dto.dart +++ b/mobile/openapi/lib/model/system_config_new_version_check_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigNewVersionCheckDto { - /// Returns a new [SystemConfigNewVersionCheckDto] instance. - SystemConfigNewVersionCheckDto({ - required this.enabled, - }); +final class SystemConfigNewVersionCheckDto { + const SystemConfigNewVersionCheckDto({required this.enabled}); /// Enabled - bool enabled; + final bool enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigNewVersionCheckDto && - other.enabled == enabled; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode); - - @override - String toString() => 'SystemConfigNewVersionCheckDto[enabled=$enabled]'; + static SystemConfigNewVersionCheckDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; + json[r'enabled'] = enabled; return json; } - /// Returns a new [SystemConfigNewVersionCheckDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigNewVersionCheckDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigNewVersionCheckDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigNewVersionCheckDto( - enabled: mapValueOfType(json, r'enabled')!, - ); - } - return null; + SystemConfigNewVersionCheckDto copyWith({bool? enabled}) { + return .new(enabled: enabled ?? this.enabled); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigNewVersionCheckDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigNewVersionCheckDto && enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigNewVersionCheckDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled]); } - // maps a json object with a list of SystemConfigNewVersionCheckDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigNewVersionCheckDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - }; + @override + String toString() => 'SystemConfigNewVersionCheckDto(enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/system_config_nightly_tasks_dto.dart b/mobile/openapi/lib/model/system_config_nightly_tasks_dto.dart index 0db417427f..1594b28472 100644 --- a/mobile/openapi/lib/model/system_config_nightly_tasks_dto.dart +++ b/mobile/openapi/lib/model/system_config_nightly_tasks_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigNightlyTasksDto { - /// Returns a new [SystemConfigNightlyTasksDto] instance. - SystemConfigNightlyTasksDto({ +final class SystemConfigNightlyTasksDto { + const SystemConfigNightlyTasksDto({ required this.clusterNewFaces, required this.databaseCleanup, required this.generateMemories, @@ -22,124 +13,91 @@ class SystemConfigNightlyTasksDto { }); /// Cluster new faces - bool clusterNewFaces; + final bool clusterNewFaces; /// Database cleanup - bool databaseCleanup; + final bool databaseCleanup; /// Generate memories - bool generateMemories; + final bool generateMemories; /// Missing thumbnails - bool missingThumbnails; + final bool missingThumbnails; /// Start time - String startTime; + final String startTime; /// Sync quota usage - bool syncQuotaUsage; + final bool syncQuotaUsage; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigNightlyTasksDto && - other.clusterNewFaces == clusterNewFaces && - other.databaseCleanup == databaseCleanup && - other.generateMemories == generateMemories && - other.missingThumbnails == missingThumbnails && - other.startTime == startTime && - other.syncQuotaUsage == syncQuotaUsage; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (clusterNewFaces.hashCode) + - (databaseCleanup.hashCode) + - (generateMemories.hashCode) + - (missingThumbnails.hashCode) + - (startTime.hashCode) + - (syncQuotaUsage.hashCode); - - @override - String toString() => 'SystemConfigNightlyTasksDto[clusterNewFaces=$clusterNewFaces, databaseCleanup=$databaseCleanup, generateMemories=$generateMemories, missingThumbnails=$missingThumbnails, startTime=$startTime, syncQuotaUsage=$syncQuotaUsage]'; + static SystemConfigNightlyTasksDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + clusterNewFaces: json[r'clusterNewFaces'] as bool, + databaseCleanup: json[r'databaseCleanup'] as bool, + generateMemories: json[r'generateMemories'] as bool, + missingThumbnails: json[r'missingThumbnails'] as bool, + startTime: json[r'startTime'] as String, + syncQuotaUsage: json[r'syncQuotaUsage'] as bool, + ); + } Map toJson() { final json = {}; - json[r'clusterNewFaces'] = this.clusterNewFaces; - json[r'databaseCleanup'] = this.databaseCleanup; - json[r'generateMemories'] = this.generateMemories; - json[r'missingThumbnails'] = this.missingThumbnails; - json[r'startTime'] = this.startTime; - json[r'syncQuotaUsage'] = this.syncQuotaUsage; + json[r'clusterNewFaces'] = clusterNewFaces; + json[r'databaseCleanup'] = databaseCleanup; + json[r'generateMemories'] = generateMemories; + json[r'missingThumbnails'] = missingThumbnails; + json[r'startTime'] = startTime; + json[r'syncQuotaUsage'] = syncQuotaUsage; return json; } - /// Returns a new [SystemConfigNightlyTasksDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigNightlyTasksDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigNightlyTasksDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigNightlyTasksDto( - clusterNewFaces: mapValueOfType(json, r'clusterNewFaces')!, - databaseCleanup: mapValueOfType(json, r'databaseCleanup')!, - generateMemories: mapValueOfType(json, r'generateMemories')!, - missingThumbnails: mapValueOfType(json, r'missingThumbnails')!, - startTime: mapValueOfType(json, r'startTime')!, - syncQuotaUsage: mapValueOfType(json, r'syncQuotaUsage')!, - ); - } - return null; + SystemConfigNightlyTasksDto copyWith({ + bool? clusterNewFaces, + bool? databaseCleanup, + bool? generateMemories, + bool? missingThumbnails, + String? startTime, + bool? syncQuotaUsage, + }) { + return .new( + clusterNewFaces: clusterNewFaces ?? this.clusterNewFaces, + databaseCleanup: databaseCleanup ?? this.databaseCleanup, + generateMemories: generateMemories ?? this.generateMemories, + missingThumbnails: missingThumbnails ?? this.missingThumbnails, + startTime: startTime ?? this.startTime, + syncQuotaUsage: syncQuotaUsage ?? this.syncQuotaUsage, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigNightlyTasksDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigNightlyTasksDto && + clusterNewFaces == other.clusterNewFaces && + databaseCleanup == other.databaseCleanup && + generateMemories == other.generateMemories && + missingThumbnails == other.missingThumbnails && + startTime == other.startTime && + syncQuotaUsage == other.syncQuotaUsage); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigNightlyTasksDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + clusterNewFaces, + databaseCleanup, + generateMemories, + missingThumbnails, + startTime, + syncQuotaUsage, + ]); } - // maps a json object with a list of SystemConfigNightlyTasksDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigNightlyTasksDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'clusterNewFaces', - 'databaseCleanup', - 'generateMemories', - 'missingThumbnails', - 'startTime', - 'syncQuotaUsage', - }; + @override + String toString() => + 'SystemConfigNightlyTasksDto(clusterNewFaces=$clusterNewFaces, databaseCleanup=$databaseCleanup, generateMemories=$generateMemories, missingThumbnails=$missingThumbnails, startTime=$startTime, syncQuotaUsage=$syncQuotaUsage)'; } - diff --git a/mobile/openapi/lib/model/system_config_notifications_dto.dart b/mobile/openapi/lib/model/system_config_notifications_dto.dart index 35d3d31833..4b3c528d96 100644 --- a/mobile/openapi/lib/model/system_config_notifications_dto.dart +++ b/mobile/openapi/lib/model/system_config_notifications_dto.dart @@ -1,99 +1,39 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigNotificationsDto { - /// Returns a new [SystemConfigNotificationsDto] instance. - SystemConfigNotificationsDto({ - required this.smtp, - }); +final class SystemConfigNotificationsDto { + const SystemConfigNotificationsDto({required this.smtp}); - SystemConfigSmtpDto smtp; + final SystemConfigSmtpDto smtp; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigNotificationsDto && - other.smtp == smtp; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (smtp.hashCode); - - @override - String toString() => 'SystemConfigNotificationsDto[smtp=$smtp]'; + static SystemConfigNotificationsDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(smtp: (SystemConfigSmtpDto.fromJson(json[r'smtp']))!); + } Map toJson() { final json = {}; - json[r'smtp'] = this.smtp; + json[r'smtp'] = smtp.toJson(); return json; } - /// Returns a new [SystemConfigNotificationsDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigNotificationsDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigNotificationsDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigNotificationsDto( - smtp: SystemConfigSmtpDto.fromJson(json[r'smtp'])!, - ); - } - return null; + SystemConfigNotificationsDto copyWith({SystemConfigSmtpDto? smtp}) { + return .new(smtp: smtp ?? this.smtp); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigNotificationsDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigNotificationsDto && smtp == other.smtp); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigNotificationsDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([smtp]); } - // maps a json object with a list of SystemConfigNotificationsDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigNotificationsDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'smtp', - }; + @override + String toString() => 'SystemConfigNotificationsDto(smtp=$smtp)'; } - diff --git a/mobile/openapi/lib/model/system_config_o_auth_dto.dart b/mobile/openapi/lib/model/system_config_o_auth_dto.dart index c65de03391..0b1fe830a3 100644 --- a/mobile/openapi/lib/model/system_config_o_auth_dto.dart +++ b/mobile/openapi/lib/model/system_config_o_auth_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigOAuthDto { - /// Returns a new [SystemConfigOAuthDto] instance. - SystemConfigOAuthDto({ +final class SystemConfigOAuthDto { + const SystemConfigOAuthDto({ required this.allowInsecureRequests, required this.autoLaunch, required this.autoRegister, @@ -37,253 +28,231 @@ class SystemConfigOAuthDto { }); /// Allow insecure requests - bool allowInsecureRequests; + final bool allowInsecureRequests; /// Auto launch - bool autoLaunch; + final bool autoLaunch; /// Auto register - bool autoRegister; + final bool autoRegister; /// Button text - String buttonText; + final String buttonText; /// Client ID - String clientId; + final String clientId; /// Client secret - String clientSecret; + final String clientSecret; /// Default storage quota - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int? defaultStorageQuota; + final int? defaultStorageQuota; /// Enabled - bool enabled; + final bool enabled; /// End session endpoint - String endSessionEndpoint; + final String endSessionEndpoint; /// Issuer URL - String issuerUrl; + final String issuerUrl; /// Mobile override enabled - bool mobileOverrideEnabled; + final bool mobileOverrideEnabled; /// Mobile redirect URI (set to empty string to disable) - String mobileRedirectUri; + final String mobileRedirectUri; /// Profile signing algorithm - String profileSigningAlgorithm; + final String profileSigningAlgorithm; /// OAuth prompt parameter (e.g. select_account, login, consent) - String prompt; + final String prompt; /// Role claim - String roleClaim; + final String roleClaim; /// Scope - String scope; + final String scope; /// Signing algorithm - String signingAlgorithm; + final String signingAlgorithm; /// Storage label claim - String storageLabelClaim; + final String storageLabelClaim; /// Storage quota claim - String storageQuotaClaim; + final String storageQuotaClaim; /// Timeout - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - int timeout; + final int timeout; - OAuthTokenEndpointAuthMethod tokenEndpointAuthMethod; + final OAuthTokenEndpointAuthMethod tokenEndpointAuthMethod; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigOAuthDto && - other.allowInsecureRequests == allowInsecureRequests && - other.autoLaunch == autoLaunch && - other.autoRegister == autoRegister && - other.buttonText == buttonText && - other.clientId == clientId && - other.clientSecret == clientSecret && - other.defaultStorageQuota == defaultStorageQuota && - other.enabled == enabled && - other.endSessionEndpoint == endSessionEndpoint && - other.issuerUrl == issuerUrl && - other.mobileOverrideEnabled == mobileOverrideEnabled && - other.mobileRedirectUri == mobileRedirectUri && - other.profileSigningAlgorithm == profileSigningAlgorithm && - other.prompt == prompt && - other.roleClaim == roleClaim && - other.scope == scope && - other.signingAlgorithm == signingAlgorithm && - other.storageLabelClaim == storageLabelClaim && - other.storageQuotaClaim == storageQuotaClaim && - other.timeout == timeout && - other.tokenEndpointAuthMethod == tokenEndpointAuthMethod; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (allowInsecureRequests.hashCode) + - (autoLaunch.hashCode) + - (autoRegister.hashCode) + - (buttonText.hashCode) + - (clientId.hashCode) + - (clientSecret.hashCode) + - (defaultStorageQuota == null ? 0 : defaultStorageQuota!.hashCode) + - (enabled.hashCode) + - (endSessionEndpoint.hashCode) + - (issuerUrl.hashCode) + - (mobileOverrideEnabled.hashCode) + - (mobileRedirectUri.hashCode) + - (profileSigningAlgorithm.hashCode) + - (prompt.hashCode) + - (roleClaim.hashCode) + - (scope.hashCode) + - (signingAlgorithm.hashCode) + - (storageLabelClaim.hashCode) + - (storageQuotaClaim.hashCode) + - (timeout.hashCode) + - (tokenEndpointAuthMethod.hashCode); - - @override - String toString() => 'SystemConfigOAuthDto[allowInsecureRequests=$allowInsecureRequests, autoLaunch=$autoLaunch, autoRegister=$autoRegister, buttonText=$buttonText, clientId=$clientId, clientSecret=$clientSecret, defaultStorageQuota=$defaultStorageQuota, enabled=$enabled, endSessionEndpoint=$endSessionEndpoint, issuerUrl=$issuerUrl, mobileOverrideEnabled=$mobileOverrideEnabled, mobileRedirectUri=$mobileRedirectUri, profileSigningAlgorithm=$profileSigningAlgorithm, prompt=$prompt, roleClaim=$roleClaim, scope=$scope, signingAlgorithm=$signingAlgorithm, storageLabelClaim=$storageLabelClaim, storageQuotaClaim=$storageQuotaClaim, timeout=$timeout, tokenEndpointAuthMethod=$tokenEndpointAuthMethod]'; + static SystemConfigOAuthDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + allowInsecureRequests: json[r'allowInsecureRequests'] as bool, + autoLaunch: json[r'autoLaunch'] as bool, + autoRegister: json[r'autoRegister'] as bool, + buttonText: json[r'buttonText'] as String, + clientId: json[r'clientId'] as String, + clientSecret: json[r'clientSecret'] as String, + defaultStorageQuota: (json[r'defaultStorageQuota'] as int?), + enabled: json[r'enabled'] as bool, + endSessionEndpoint: json[r'endSessionEndpoint'] as String, + issuerUrl: json[r'issuerUrl'] as String, + mobileOverrideEnabled: json[r'mobileOverrideEnabled'] as bool, + mobileRedirectUri: json[r'mobileRedirectUri'] as String, + profileSigningAlgorithm: json[r'profileSigningAlgorithm'] as String, + prompt: json[r'prompt'] as String, + roleClaim: json[r'roleClaim'] as String, + scope: json[r'scope'] as String, + signingAlgorithm: json[r'signingAlgorithm'] as String, + storageLabelClaim: json[r'storageLabelClaim'] as String, + storageQuotaClaim: json[r'storageQuotaClaim'] as String, + timeout: json[r'timeout'] as int, + tokenEndpointAuthMethod: (OAuthTokenEndpointAuthMethod.fromJson(json[r'tokenEndpointAuthMethod']))!, + ); + } Map toJson() { final json = {}; - json[r'allowInsecureRequests'] = this.allowInsecureRequests; - json[r'autoLaunch'] = this.autoLaunch; - json[r'autoRegister'] = this.autoRegister; - json[r'buttonText'] = this.buttonText; - json[r'clientId'] = this.clientId; - json[r'clientSecret'] = this.clientSecret; - if (this.defaultStorageQuota != null) { - json[r'defaultStorageQuota'] = this.defaultStorageQuota; - } else { - // json[r'defaultStorageQuota'] = null; + json[r'allowInsecureRequests'] = allowInsecureRequests; + json[r'autoLaunch'] = autoLaunch; + json[r'autoRegister'] = autoRegister; + json[r'buttonText'] = buttonText; + json[r'clientId'] = clientId; + json[r'clientSecret'] = clientSecret; + if (defaultStorageQuota != null) { + json[r'defaultStorageQuota'] = defaultStorageQuota!; } - json[r'enabled'] = this.enabled; - json[r'endSessionEndpoint'] = this.endSessionEndpoint; - json[r'issuerUrl'] = this.issuerUrl; - json[r'mobileOverrideEnabled'] = this.mobileOverrideEnabled; - json[r'mobileRedirectUri'] = this.mobileRedirectUri; - json[r'profileSigningAlgorithm'] = this.profileSigningAlgorithm; - json[r'prompt'] = this.prompt; - json[r'roleClaim'] = this.roleClaim; - json[r'scope'] = this.scope; - json[r'signingAlgorithm'] = this.signingAlgorithm; - json[r'storageLabelClaim'] = this.storageLabelClaim; - json[r'storageQuotaClaim'] = this.storageQuotaClaim; - json[r'timeout'] = this.timeout; - json[r'tokenEndpointAuthMethod'] = this.tokenEndpointAuthMethod; + json[r'enabled'] = enabled; + json[r'endSessionEndpoint'] = endSessionEndpoint; + json[r'issuerUrl'] = issuerUrl; + json[r'mobileOverrideEnabled'] = mobileOverrideEnabled; + json[r'mobileRedirectUri'] = mobileRedirectUri; + json[r'profileSigningAlgorithm'] = profileSigningAlgorithm; + json[r'prompt'] = prompt; + json[r'roleClaim'] = roleClaim; + json[r'scope'] = scope; + json[r'signingAlgorithm'] = signingAlgorithm; + json[r'storageLabelClaim'] = storageLabelClaim; + json[r'storageQuotaClaim'] = storageQuotaClaim; + json[r'timeout'] = timeout; + json[r'tokenEndpointAuthMethod'] = tokenEndpointAuthMethod.toJson(); return json; } - /// Returns a new [SystemConfigOAuthDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigOAuthDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigOAuthDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigOAuthDto( - allowInsecureRequests: mapValueOfType(json, r'allowInsecureRequests')!, - autoLaunch: mapValueOfType(json, r'autoLaunch')!, - autoRegister: mapValueOfType(json, r'autoRegister')!, - buttonText: mapValueOfType(json, r'buttonText')!, - clientId: mapValueOfType(json, r'clientId')!, - clientSecret: mapValueOfType(json, r'clientSecret')!, - defaultStorageQuota: mapValueOfType(json, r'defaultStorageQuota'), - enabled: mapValueOfType(json, r'enabled')!, - endSessionEndpoint: mapValueOfType(json, r'endSessionEndpoint')!, - issuerUrl: mapValueOfType(json, r'issuerUrl')!, - mobileOverrideEnabled: mapValueOfType(json, r'mobileOverrideEnabled')!, - mobileRedirectUri: mapValueOfType(json, r'mobileRedirectUri')!, - profileSigningAlgorithm: mapValueOfType(json, r'profileSigningAlgorithm')!, - prompt: mapValueOfType(json, r'prompt')!, - roleClaim: mapValueOfType(json, r'roleClaim')!, - scope: mapValueOfType(json, r'scope')!, - signingAlgorithm: mapValueOfType(json, r'signingAlgorithm')!, - storageLabelClaim: mapValueOfType(json, r'storageLabelClaim')!, - storageQuotaClaim: mapValueOfType(json, r'storageQuotaClaim')!, - timeout: mapValueOfType(json, r'timeout')!, - tokenEndpointAuthMethod: OAuthTokenEndpointAuthMethod.fromJson(json[r'tokenEndpointAuthMethod'])!, - ); - } - return null; + SystemConfigOAuthDto copyWith({ + bool? allowInsecureRequests, + bool? autoLaunch, + bool? autoRegister, + String? buttonText, + String? clientId, + String? clientSecret, + Object? defaultStorageQuota = _undefined, + bool? enabled, + String? endSessionEndpoint, + String? issuerUrl, + bool? mobileOverrideEnabled, + String? mobileRedirectUri, + String? profileSigningAlgorithm, + String? prompt, + String? roleClaim, + String? scope, + String? signingAlgorithm, + String? storageLabelClaim, + String? storageQuotaClaim, + int? timeout, + OAuthTokenEndpointAuthMethod? tokenEndpointAuthMethod, + }) { + return .new( + allowInsecureRequests: allowInsecureRequests ?? this.allowInsecureRequests, + autoLaunch: autoLaunch ?? this.autoLaunch, + autoRegister: autoRegister ?? this.autoRegister, + buttonText: buttonText ?? this.buttonText, + clientId: clientId ?? this.clientId, + clientSecret: clientSecret ?? this.clientSecret, + defaultStorageQuota: identical(defaultStorageQuota, _undefined) + ? this.defaultStorageQuota + : defaultStorageQuota as int?, + enabled: enabled ?? this.enabled, + endSessionEndpoint: endSessionEndpoint ?? this.endSessionEndpoint, + issuerUrl: issuerUrl ?? this.issuerUrl, + mobileOverrideEnabled: mobileOverrideEnabled ?? this.mobileOverrideEnabled, + mobileRedirectUri: mobileRedirectUri ?? this.mobileRedirectUri, + profileSigningAlgorithm: profileSigningAlgorithm ?? this.profileSigningAlgorithm, + prompt: prompt ?? this.prompt, + roleClaim: roleClaim ?? this.roleClaim, + scope: scope ?? this.scope, + signingAlgorithm: signingAlgorithm ?? this.signingAlgorithm, + storageLabelClaim: storageLabelClaim ?? this.storageLabelClaim, + storageQuotaClaim: storageQuotaClaim ?? this.storageQuotaClaim, + timeout: timeout ?? this.timeout, + tokenEndpointAuthMethod: tokenEndpointAuthMethod ?? this.tokenEndpointAuthMethod, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigOAuthDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigOAuthDto && + allowInsecureRequests == other.allowInsecureRequests && + autoLaunch == other.autoLaunch && + autoRegister == other.autoRegister && + buttonText == other.buttonText && + clientId == other.clientId && + clientSecret == other.clientSecret && + defaultStorageQuota == other.defaultStorageQuota && + enabled == other.enabled && + endSessionEndpoint == other.endSessionEndpoint && + issuerUrl == other.issuerUrl && + mobileOverrideEnabled == other.mobileOverrideEnabled && + mobileRedirectUri == other.mobileRedirectUri && + profileSigningAlgorithm == other.profileSigningAlgorithm && + prompt == other.prompt && + roleClaim == other.roleClaim && + scope == other.scope && + signingAlgorithm == other.signingAlgorithm && + storageLabelClaim == other.storageLabelClaim && + storageQuotaClaim == other.storageQuotaClaim && + timeout == other.timeout && + tokenEndpointAuthMethod == other.tokenEndpointAuthMethod); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigOAuthDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + allowInsecureRequests, + autoLaunch, + autoRegister, + buttonText, + clientId, + clientSecret, + defaultStorageQuota, + enabled, + endSessionEndpoint, + issuerUrl, + mobileOverrideEnabled, + mobileRedirectUri, + profileSigningAlgorithm, + prompt, + roleClaim, + scope, + signingAlgorithm, + storageLabelClaim, + storageQuotaClaim, + timeout, + tokenEndpointAuthMethod, + ]); } - // maps a json object with a list of SystemConfigOAuthDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigOAuthDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'allowInsecureRequests', - 'autoLaunch', - 'autoRegister', - 'buttonText', - 'clientId', - 'clientSecret', - 'defaultStorageQuota', - 'enabled', - 'endSessionEndpoint', - 'issuerUrl', - 'mobileOverrideEnabled', - 'mobileRedirectUri', - 'profileSigningAlgorithm', - 'prompt', - 'roleClaim', - 'scope', - 'signingAlgorithm', - 'storageLabelClaim', - 'storageQuotaClaim', - 'timeout', - 'tokenEndpointAuthMethod', - }; + @override + String toString() => + 'SystemConfigOAuthDto(allowInsecureRequests=$allowInsecureRequests, autoLaunch=$autoLaunch, autoRegister=$autoRegister, buttonText=$buttonText, clientId=$clientId, clientSecret=$clientSecret, defaultStorageQuota=$defaultStorageQuota, enabled=$enabled, endSessionEndpoint=$endSessionEndpoint, issuerUrl=$issuerUrl, mobileOverrideEnabled=$mobileOverrideEnabled, mobileRedirectUri=$mobileRedirectUri, profileSigningAlgorithm=$profileSigningAlgorithm, prompt=$prompt, roleClaim=$roleClaim, scope=$scope, signingAlgorithm=$signingAlgorithm, storageLabelClaim=$storageLabelClaim, storageQuotaClaim=$storageQuotaClaim, timeout=$timeout, tokenEndpointAuthMethod=$tokenEndpointAuthMethod)'; } - diff --git a/mobile/openapi/lib/model/system_config_password_login_dto.dart b/mobile/openapi/lib/model/system_config_password_login_dto.dart index 1328a6acaa..864b54e07b 100644 --- a/mobile/openapi/lib/model/system_config_password_login_dto.dart +++ b/mobile/openapi/lib/model/system_config_password_login_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigPasswordLoginDto { - /// Returns a new [SystemConfigPasswordLoginDto] instance. - SystemConfigPasswordLoginDto({ - required this.enabled, - }); +final class SystemConfigPasswordLoginDto { + const SystemConfigPasswordLoginDto({required this.enabled}); /// Enabled - bool enabled; + final bool enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigPasswordLoginDto && - other.enabled == enabled; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode); - - @override - String toString() => 'SystemConfigPasswordLoginDto[enabled=$enabled]'; + static SystemConfigPasswordLoginDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; + json[r'enabled'] = enabled; return json; } - /// Returns a new [SystemConfigPasswordLoginDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigPasswordLoginDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigPasswordLoginDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigPasswordLoginDto( - enabled: mapValueOfType(json, r'enabled')!, - ); - } - return null; + SystemConfigPasswordLoginDto copyWith({bool? enabled}) { + return .new(enabled: enabled ?? this.enabled); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigPasswordLoginDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigPasswordLoginDto && enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigPasswordLoginDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled]); } - // maps a json object with a list of SystemConfigPasswordLoginDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigPasswordLoginDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - }; + @override + String toString() => 'SystemConfigPasswordLoginDto(enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/system_config_reverse_geocoding_dto.dart b/mobile/openapi/lib/model/system_config_reverse_geocoding_dto.dart index 0374e19be1..5f70ddf1c3 100644 --- a/mobile/openapi/lib/model/system_config_reverse_geocoding_dto.dart +++ b/mobile/openapi/lib/model/system_config_reverse_geocoding_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigReverseGeocodingDto { - /// Returns a new [SystemConfigReverseGeocodingDto] instance. - SystemConfigReverseGeocodingDto({ - required this.enabled, - }); +final class SystemConfigReverseGeocodingDto { + const SystemConfigReverseGeocodingDto({required this.enabled}); /// Enabled - bool enabled; + final bool enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigReverseGeocodingDto && - other.enabled == enabled; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode); - - @override - String toString() => 'SystemConfigReverseGeocodingDto[enabled=$enabled]'; + static SystemConfigReverseGeocodingDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; + json[r'enabled'] = enabled; return json; } - /// Returns a new [SystemConfigReverseGeocodingDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigReverseGeocodingDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigReverseGeocodingDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigReverseGeocodingDto( - enabled: mapValueOfType(json, r'enabled')!, - ); - } - return null; + SystemConfigReverseGeocodingDto copyWith({bool? enabled}) { + return .new(enabled: enabled ?? this.enabled); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigReverseGeocodingDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigReverseGeocodingDto && enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigReverseGeocodingDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled]); } - // maps a json object with a list of SystemConfigReverseGeocodingDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigReverseGeocodingDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - }; + @override + String toString() => 'SystemConfigReverseGeocodingDto(enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/system_config_server_dto.dart b/mobile/openapi/lib/model/system_config_server_dto.dart index 200f75f7c6..7a45a7b93a 100644 --- a/mobile/openapi/lib/model/system_config_server_dto.dart +++ b/mobile/openapi/lib/model/system_config_server_dto.dart @@ -1,118 +1,65 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigServerDto { - /// Returns a new [SystemConfigServerDto] instance. - SystemConfigServerDto({ +final class SystemConfigServerDto { + const SystemConfigServerDto({ required this.externalDomain, required this.loginPageMessage, required this.publicUsers, }); /// External domain - String externalDomain; + final String externalDomain; /// Login page message - String loginPageMessage; + final String loginPageMessage; /// Public users - bool publicUsers; + final bool publicUsers; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigServerDto && - other.externalDomain == externalDomain && - other.loginPageMessage == loginPageMessage && - other.publicUsers == publicUsers; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (externalDomain.hashCode) + - (loginPageMessage.hashCode) + - (publicUsers.hashCode); - - @override - String toString() => 'SystemConfigServerDto[externalDomain=$externalDomain, loginPageMessage=$loginPageMessage, publicUsers=$publicUsers]'; + static SystemConfigServerDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + externalDomain: json[r'externalDomain'] as String, + loginPageMessage: json[r'loginPageMessage'] as String, + publicUsers: json[r'publicUsers'] as bool, + ); + } Map toJson() { final json = {}; - json[r'externalDomain'] = this.externalDomain; - json[r'loginPageMessage'] = this.loginPageMessage; - json[r'publicUsers'] = this.publicUsers; + json[r'externalDomain'] = externalDomain; + json[r'loginPageMessage'] = loginPageMessage; + json[r'publicUsers'] = publicUsers; return json; } - /// Returns a new [SystemConfigServerDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigServerDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigServerDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigServerDto( - externalDomain: mapValueOfType(json, r'externalDomain')!, - loginPageMessage: mapValueOfType(json, r'loginPageMessage')!, - publicUsers: mapValueOfType(json, r'publicUsers')!, - ); - } - return null; + SystemConfigServerDto copyWith({String? externalDomain, String? loginPageMessage, bool? publicUsers}) { + return .new( + externalDomain: externalDomain ?? this.externalDomain, + loginPageMessage: loginPageMessage ?? this.loginPageMessage, + publicUsers: publicUsers ?? this.publicUsers, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigServerDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigServerDto && + externalDomain == other.externalDomain && + loginPageMessage == other.loginPageMessage && + publicUsers == other.publicUsers); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigServerDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([externalDomain, loginPageMessage, publicUsers]); } - // maps a json object with a list of SystemConfigServerDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigServerDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'externalDomain', - 'loginPageMessage', - 'publicUsers', - }; + @override + String toString() => + 'SystemConfigServerDto(externalDomain=$externalDomain, loginPageMessage=$loginPageMessage, publicUsers=$publicUsers)'; } - diff --git a/mobile/openapi/lib/model/system_config_smtp_dto.dart b/mobile/openapi/lib/model/system_config_smtp_dto.dart index a3d14cda63..3f71256d0d 100644 --- a/mobile/openapi/lib/model/system_config_smtp_dto.dart +++ b/mobile/openapi/lib/model/system_config_smtp_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigSmtpDto { - /// Returns a new [SystemConfigSmtpDto] instance. - SystemConfigSmtpDto({ +final class SystemConfigSmtpDto { + const SystemConfigSmtpDto({ required this.enabled, required this.from, required this.replyTo, @@ -20,107 +11,66 @@ class SystemConfigSmtpDto { }); /// Whether SMTP email notifications are enabled - bool enabled; + final bool enabled; /// Email address to send from - String from; + final String from; /// Email address for replies - String replyTo; + final String replyTo; - SystemConfigSmtpTransportDto transport; + final SystemConfigSmtpTransportDto transport; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigSmtpDto && - other.enabled == enabled && - other.from == from && - other.replyTo == replyTo && - other.transport == transport; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (from.hashCode) + - (replyTo.hashCode) + - (transport.hashCode); - - @override - String toString() => 'SystemConfigSmtpDto[enabled=$enabled, from=$from, replyTo=$replyTo, transport=$transport]'; + static SystemConfigSmtpDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + enabled: json[r'enabled'] as bool, + from: json[r'from'] as String, + replyTo: json[r'replyTo'] as String, + transport: (SystemConfigSmtpTransportDto.fromJson(json[r'transport']))!, + ); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'from'] = this.from; - json[r'replyTo'] = this.replyTo; - json[r'transport'] = this.transport; + json[r'enabled'] = enabled; + json[r'from'] = from; + json[r'replyTo'] = replyTo; + json[r'transport'] = transport.toJson(); return json; } - /// Returns a new [SystemConfigSmtpDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigSmtpDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigSmtpDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigSmtpDto( - enabled: mapValueOfType(json, r'enabled')!, - from: mapValueOfType(json, r'from')!, - replyTo: mapValueOfType(json, r'replyTo')!, - transport: SystemConfigSmtpTransportDto.fromJson(json[r'transport'])!, - ); - } - return null; + SystemConfigSmtpDto copyWith({ + bool? enabled, + String? from, + String? replyTo, + SystemConfigSmtpTransportDto? transport, + }) { + return .new( + enabled: enabled ?? this.enabled, + from: from ?? this.from, + replyTo: replyTo ?? this.replyTo, + transport: transport ?? this.transport, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigSmtpDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigSmtpDto && + enabled == other.enabled && + from == other.from && + replyTo == other.replyTo && + transport == other.transport); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigSmtpDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, from, replyTo, transport]); } - // maps a json object with a list of SystemConfigSmtpDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigSmtpDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'from', - 'replyTo', - 'transport', - }; + @override + String toString() => 'SystemConfigSmtpDto(enabled=$enabled, from=$from, replyTo=$replyTo, transport=$transport)'; } - diff --git a/mobile/openapi/lib/model/system_config_smtp_transport_dto.dart b/mobile/openapi/lib/model/system_config_smtp_transport_dto.dart index 266e3f3c86..c985ad2f03 100644 --- a/mobile/openapi/lib/model/system_config_smtp_transport_dto.dart +++ b/mobile/openapi/lib/model/system_config_smtp_transport_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigSmtpTransportDto { - /// Returns a new [SystemConfigSmtpTransportDto] instance. - SystemConfigSmtpTransportDto({ +final class SystemConfigSmtpTransportDto { + const SystemConfigSmtpTransportDto({ required this.host, required this.ignoreCert, required this.password, @@ -22,127 +13,84 @@ class SystemConfigSmtpTransportDto { }); /// SMTP server hostname - String host; + final String host; /// Whether to ignore SSL certificate errors - bool ignoreCert; + final bool ignoreCert; /// SMTP password - String password; + final String password; /// SMTP server port - /// - /// Minimum value: 0 - /// Maximum value: 65535 - int port; + final int port; /// Whether to use secure connection (TLS/SSL) - bool secure; + final bool secure; /// SMTP username - String username; + final String username; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigSmtpTransportDto && - other.host == host && - other.ignoreCert == ignoreCert && - other.password == password && - other.port == port && - other.secure == secure && - other.username == username; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (host.hashCode) + - (ignoreCert.hashCode) + - (password.hashCode) + - (port.hashCode) + - (secure.hashCode) + - (username.hashCode); - - @override - String toString() => 'SystemConfigSmtpTransportDto[host=$host, ignoreCert=$ignoreCert, password=$password, port=$port, secure=$secure, username=$username]'; + static SystemConfigSmtpTransportDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + host: json[r'host'] as String, + ignoreCert: json[r'ignoreCert'] as bool, + password: json[r'password'] as String, + port: json[r'port'] as int, + secure: json[r'secure'] as bool, + username: json[r'username'] as String, + ); + } Map toJson() { final json = {}; - json[r'host'] = this.host; - json[r'ignoreCert'] = this.ignoreCert; - json[r'password'] = this.password; - json[r'port'] = this.port; - json[r'secure'] = this.secure; - json[r'username'] = this.username; + json[r'host'] = host; + json[r'ignoreCert'] = ignoreCert; + json[r'password'] = password; + json[r'port'] = port; + json[r'secure'] = secure; + json[r'username'] = username; return json; } - /// Returns a new [SystemConfigSmtpTransportDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigSmtpTransportDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigSmtpTransportDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigSmtpTransportDto( - host: mapValueOfType(json, r'host')!, - ignoreCert: mapValueOfType(json, r'ignoreCert')!, - password: mapValueOfType(json, r'password')!, - port: mapValueOfType(json, r'port')!, - secure: mapValueOfType(json, r'secure')!, - username: mapValueOfType(json, r'username')!, - ); - } - return null; + SystemConfigSmtpTransportDto copyWith({ + String? host, + bool? ignoreCert, + String? password, + int? port, + bool? secure, + String? username, + }) { + return .new( + host: host ?? this.host, + ignoreCert: ignoreCert ?? this.ignoreCert, + password: password ?? this.password, + port: port ?? this.port, + secure: secure ?? this.secure, + username: username ?? this.username, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigSmtpTransportDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigSmtpTransportDto && + host == other.host && + ignoreCert == other.ignoreCert && + password == other.password && + port == other.port && + secure == other.secure && + username == other.username); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigSmtpTransportDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([host, ignoreCert, password, port, secure, username]); } - // maps a json object with a list of SystemConfigSmtpTransportDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigSmtpTransportDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'host', - 'ignoreCert', - 'password', - 'port', - 'secure', - 'username', - }; + @override + String toString() => + 'SystemConfigSmtpTransportDto(host=$host, ignoreCert=$ignoreCert, password=$password, port=$port, secure=$secure, username=$username)'; } - diff --git a/mobile/openapi/lib/model/system_config_storage_template_dto.dart b/mobile/openapi/lib/model/system_config_storage_template_dto.dart index f9f37e48ad..42c84685f0 100644 --- a/mobile/openapi/lib/model/system_config_storage_template_dto.dart +++ b/mobile/openapi/lib/model/system_config_storage_template_dto.dart @@ -1,118 +1,65 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigStorageTemplateDto { - /// Returns a new [SystemConfigStorageTemplateDto] instance. - SystemConfigStorageTemplateDto({ +final class SystemConfigStorageTemplateDto { + const SystemConfigStorageTemplateDto({ required this.enabled, required this.hashVerificationEnabled, required this.template, }); /// Enabled - bool enabled; + final bool enabled; /// Hash verification enabled - bool hashVerificationEnabled; + final bool hashVerificationEnabled; /// Template - String template; + final String template; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigStorageTemplateDto && - other.enabled == enabled && - other.hashVerificationEnabled == hashVerificationEnabled && - other.template == template; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (hashVerificationEnabled.hashCode) + - (template.hashCode); - - @override - String toString() => 'SystemConfigStorageTemplateDto[enabled=$enabled, hashVerificationEnabled=$hashVerificationEnabled, template=$template]'; + static SystemConfigStorageTemplateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + enabled: json[r'enabled'] as bool, + hashVerificationEnabled: json[r'hashVerificationEnabled'] as bool, + template: json[r'template'] as String, + ); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'hashVerificationEnabled'] = this.hashVerificationEnabled; - json[r'template'] = this.template; + json[r'enabled'] = enabled; + json[r'hashVerificationEnabled'] = hashVerificationEnabled; + json[r'template'] = template; return json; } - /// Returns a new [SystemConfigStorageTemplateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigStorageTemplateDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigStorageTemplateDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigStorageTemplateDto( - enabled: mapValueOfType(json, r'enabled')!, - hashVerificationEnabled: mapValueOfType(json, r'hashVerificationEnabled')!, - template: mapValueOfType(json, r'template')!, - ); - } - return null; + SystemConfigStorageTemplateDto copyWith({bool? enabled, bool? hashVerificationEnabled, String? template}) { + return .new( + enabled: enabled ?? this.enabled, + hashVerificationEnabled: hashVerificationEnabled ?? this.hashVerificationEnabled, + template: template ?? this.template, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigStorageTemplateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigStorageTemplateDto && + enabled == other.enabled && + hashVerificationEnabled == other.hashVerificationEnabled && + template == other.template); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigStorageTemplateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, hashVerificationEnabled, template]); } - // maps a json object with a list of SystemConfigStorageTemplateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigStorageTemplateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'hashVerificationEnabled', - 'template', - }; + @override + String toString() => + 'SystemConfigStorageTemplateDto(enabled=$enabled, hashVerificationEnabled=$hashVerificationEnabled, template=$template)'; } - diff --git a/mobile/openapi/lib/model/system_config_template_emails_dto.dart b/mobile/openapi/lib/model/system_config_template_emails_dto.dart index d29ca1fac3..d683ce0a6e 100644 --- a/mobile/openapi/lib/model/system_config_template_emails_dto.dart +++ b/mobile/openapi/lib/model/system_config_template_emails_dto.dart @@ -1,118 +1,69 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigTemplateEmailsDto { - /// Returns a new [SystemConfigTemplateEmailsDto] instance. - SystemConfigTemplateEmailsDto({ +final class SystemConfigTemplateEmailsDto { + const SystemConfigTemplateEmailsDto({ required this.albumInviteTemplate, required this.albumUpdateTemplate, required this.welcomeTemplate, }); /// Album invite template - String albumInviteTemplate; + final String albumInviteTemplate; /// Album update template - String albumUpdateTemplate; + final String albumUpdateTemplate; /// Welcome template - String welcomeTemplate; + final String welcomeTemplate; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigTemplateEmailsDto && - other.albumInviteTemplate == albumInviteTemplate && - other.albumUpdateTemplate == albumUpdateTemplate && - other.welcomeTemplate == welcomeTemplate; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumInviteTemplate.hashCode) + - (albumUpdateTemplate.hashCode) + - (welcomeTemplate.hashCode); - - @override - String toString() => 'SystemConfigTemplateEmailsDto[albumInviteTemplate=$albumInviteTemplate, albumUpdateTemplate=$albumUpdateTemplate, welcomeTemplate=$welcomeTemplate]'; + static SystemConfigTemplateEmailsDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumInviteTemplate: json[r'albumInviteTemplate'] as String, + albumUpdateTemplate: json[r'albumUpdateTemplate'] as String, + welcomeTemplate: json[r'welcomeTemplate'] as String, + ); + } Map toJson() { final json = {}; - json[r'albumInviteTemplate'] = this.albumInviteTemplate; - json[r'albumUpdateTemplate'] = this.albumUpdateTemplate; - json[r'welcomeTemplate'] = this.welcomeTemplate; + json[r'albumInviteTemplate'] = albumInviteTemplate; + json[r'albumUpdateTemplate'] = albumUpdateTemplate; + json[r'welcomeTemplate'] = welcomeTemplate; return json; } - /// Returns a new [SystemConfigTemplateEmailsDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigTemplateEmailsDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigTemplateEmailsDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigTemplateEmailsDto( - albumInviteTemplate: mapValueOfType(json, r'albumInviteTemplate')!, - albumUpdateTemplate: mapValueOfType(json, r'albumUpdateTemplate')!, - welcomeTemplate: mapValueOfType(json, r'welcomeTemplate')!, - ); - } - return null; + SystemConfigTemplateEmailsDto copyWith({ + String? albumInviteTemplate, + String? albumUpdateTemplate, + String? welcomeTemplate, + }) { + return .new( + albumInviteTemplate: albumInviteTemplate ?? this.albumInviteTemplate, + albumUpdateTemplate: albumUpdateTemplate ?? this.albumUpdateTemplate, + welcomeTemplate: welcomeTemplate ?? this.welcomeTemplate, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigTemplateEmailsDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigTemplateEmailsDto && + albumInviteTemplate == other.albumInviteTemplate && + albumUpdateTemplate == other.albumUpdateTemplate && + welcomeTemplate == other.welcomeTemplate); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigTemplateEmailsDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumInviteTemplate, albumUpdateTemplate, welcomeTemplate]); } - // maps a json object with a list of SystemConfigTemplateEmailsDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigTemplateEmailsDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albumInviteTemplate', - 'albumUpdateTemplate', - 'welcomeTemplate', - }; + @override + String toString() => + 'SystemConfigTemplateEmailsDto(albumInviteTemplate=$albumInviteTemplate, albumUpdateTemplate=$albumUpdateTemplate, welcomeTemplate=$welcomeTemplate)'; } - diff --git a/mobile/openapi/lib/model/system_config_template_storage_option_dto.dart b/mobile/openapi/lib/model/system_config_template_storage_option_dto.dart index 6f81513039..75a7676917 100644 --- a/mobile/openapi/lib/model/system_config_template_storage_option_dto.dart +++ b/mobile/openapi/lib/model/system_config_template_storage_option_dto.dart @@ -1,179 +1,123 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigTemplateStorageOptionDto { - /// Returns a new [SystemConfigTemplateStorageOptionDto] instance. - SystemConfigTemplateStorageOptionDto({ - this.dayOptions = const [], - this.hourOptions = const [], - this.minuteOptions = const [], - this.monthOptions = const [], - this.presetOptions = const [], - this.secondOptions = const [], - this.weekOptions = const [], - this.yearOptions = const [], +final class SystemConfigTemplateStorageOptionDto { + const SystemConfigTemplateStorageOptionDto({ + required this.dayOptions, + required this.hourOptions, + required this.minuteOptions, + required this.monthOptions, + required this.presetOptions, + required this.secondOptions, + required this.weekOptions, + required this.yearOptions, }); /// Available day format options for storage template - List dayOptions; + final List dayOptions; /// Available hour format options for storage template - List hourOptions; + final List hourOptions; /// Available minute format options for storage template - List minuteOptions; + final List minuteOptions; /// Available month format options for storage template - List monthOptions; + final List monthOptions; /// Available preset template options - List presetOptions; + final List presetOptions; /// Available second format options for storage template - List secondOptions; + final List secondOptions; /// Available week format options for storage template - List weekOptions; + final List weekOptions; /// Available year format options for storage template - List yearOptions; + final List yearOptions; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigTemplateStorageOptionDto && - _deepEquality.equals(other.dayOptions, dayOptions) && - _deepEquality.equals(other.hourOptions, hourOptions) && - _deepEquality.equals(other.minuteOptions, minuteOptions) && - _deepEquality.equals(other.monthOptions, monthOptions) && - _deepEquality.equals(other.presetOptions, presetOptions) && - _deepEquality.equals(other.secondOptions, secondOptions) && - _deepEquality.equals(other.weekOptions, weekOptions) && - _deepEquality.equals(other.yearOptions, yearOptions); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (dayOptions.hashCode) + - (hourOptions.hashCode) + - (minuteOptions.hashCode) + - (monthOptions.hashCode) + - (presetOptions.hashCode) + - (secondOptions.hashCode) + - (weekOptions.hashCode) + - (yearOptions.hashCode); - - @override - String toString() => 'SystemConfigTemplateStorageOptionDto[dayOptions=$dayOptions, hourOptions=$hourOptions, minuteOptions=$minuteOptions, monthOptions=$monthOptions, presetOptions=$presetOptions, secondOptions=$secondOptions, weekOptions=$weekOptions, yearOptions=$yearOptions]'; + static SystemConfigTemplateStorageOptionDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + dayOptions: ((json[r'dayOptions'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + hourOptions: ((json[r'hourOptions'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + minuteOptions: ((json[r'minuteOptions'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + monthOptions: ((json[r'monthOptions'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + presetOptions: ((json[r'presetOptions'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + secondOptions: ((json[r'secondOptions'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + weekOptions: ((json[r'weekOptions'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + yearOptions: ((json[r'yearOptions'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'dayOptions'] = this.dayOptions; - json[r'hourOptions'] = this.hourOptions; - json[r'minuteOptions'] = this.minuteOptions; - json[r'monthOptions'] = this.monthOptions; - json[r'presetOptions'] = this.presetOptions; - json[r'secondOptions'] = this.secondOptions; - json[r'weekOptions'] = this.weekOptions; - json[r'yearOptions'] = this.yearOptions; + json[r'dayOptions'] = dayOptions; + json[r'hourOptions'] = hourOptions; + json[r'minuteOptions'] = minuteOptions; + json[r'monthOptions'] = monthOptions; + json[r'presetOptions'] = presetOptions; + json[r'secondOptions'] = secondOptions; + json[r'weekOptions'] = weekOptions; + json[r'yearOptions'] = yearOptions; return json; } - /// Returns a new [SystemConfigTemplateStorageOptionDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigTemplateStorageOptionDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigTemplateStorageOptionDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigTemplateStorageOptionDto( - dayOptions: json[r'dayOptions'] is Iterable - ? (json[r'dayOptions'] as Iterable).cast().toList(growable: false) - : const [], - hourOptions: json[r'hourOptions'] is Iterable - ? (json[r'hourOptions'] as Iterable).cast().toList(growable: false) - : const [], - minuteOptions: json[r'minuteOptions'] is Iterable - ? (json[r'minuteOptions'] as Iterable).cast().toList(growable: false) - : const [], - monthOptions: json[r'monthOptions'] is Iterable - ? (json[r'monthOptions'] as Iterable).cast().toList(growable: false) - : const [], - presetOptions: json[r'presetOptions'] is Iterable - ? (json[r'presetOptions'] as Iterable).cast().toList(growable: false) - : const [], - secondOptions: json[r'secondOptions'] is Iterable - ? (json[r'secondOptions'] as Iterable).cast().toList(growable: false) - : const [], - weekOptions: json[r'weekOptions'] is Iterable - ? (json[r'weekOptions'] as Iterable).cast().toList(growable: false) - : const [], - yearOptions: json[r'yearOptions'] is Iterable - ? (json[r'yearOptions'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + SystemConfigTemplateStorageOptionDto copyWith({ + List? dayOptions, + List? hourOptions, + List? minuteOptions, + List? monthOptions, + List? presetOptions, + List? secondOptions, + List? weekOptions, + List? yearOptions, + }) { + return .new( + dayOptions: dayOptions ?? this.dayOptions, + hourOptions: hourOptions ?? this.hourOptions, + minuteOptions: minuteOptions ?? this.minuteOptions, + monthOptions: monthOptions ?? this.monthOptions, + presetOptions: presetOptions ?? this.presetOptions, + secondOptions: secondOptions ?? this.secondOptions, + weekOptions: weekOptions ?? this.weekOptions, + yearOptions: yearOptions ?? this.yearOptions, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigTemplateStorageOptionDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is SystemConfigTemplateStorageOptionDto && + const DeepCollectionEquality().equals(dayOptions, other.dayOptions) && + const DeepCollectionEquality().equals(hourOptions, other.hourOptions) && + const DeepCollectionEquality().equals(minuteOptions, other.minuteOptions) && + const DeepCollectionEquality().equals(monthOptions, other.monthOptions) && + const DeepCollectionEquality().equals(presetOptions, other.presetOptions) && + const DeepCollectionEquality().equals(secondOptions, other.secondOptions) && + const DeepCollectionEquality().equals(weekOptions, other.weekOptions) && + const DeepCollectionEquality().equals(yearOptions, other.yearOptions)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigTemplateStorageOptionDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + const DeepCollectionEquality().hash(dayOptions), + const DeepCollectionEquality().hash(hourOptions), + const DeepCollectionEquality().hash(minuteOptions), + const DeepCollectionEquality().hash(monthOptions), + const DeepCollectionEquality().hash(presetOptions), + const DeepCollectionEquality().hash(secondOptions), + const DeepCollectionEquality().hash(weekOptions), + const DeepCollectionEquality().hash(yearOptions), + ]); } - // maps a json object with a list of SystemConfigTemplateStorageOptionDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigTemplateStorageOptionDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'dayOptions', - 'hourOptions', - 'minuteOptions', - 'monthOptions', - 'presetOptions', - 'secondOptions', - 'weekOptions', - 'yearOptions', - }; + @override + String toString() => + 'SystemConfigTemplateStorageOptionDto(dayOptions=$dayOptions, hourOptions=$hourOptions, minuteOptions=$minuteOptions, monthOptions=$monthOptions, presetOptions=$presetOptions, secondOptions=$secondOptions, weekOptions=$weekOptions, yearOptions=$yearOptions)'; } - diff --git a/mobile/openapi/lib/model/system_config_templates_dto.dart b/mobile/openapi/lib/model/system_config_templates_dto.dart index a5e8834978..4239fb47bc 100644 --- a/mobile/openapi/lib/model/system_config_templates_dto.dart +++ b/mobile/openapi/lib/model/system_config_templates_dto.dart @@ -1,99 +1,39 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigTemplatesDto { - /// Returns a new [SystemConfigTemplatesDto] instance. - SystemConfigTemplatesDto({ - required this.email, - }); +final class SystemConfigTemplatesDto { + const SystemConfigTemplatesDto({required this.email}); - SystemConfigTemplateEmailsDto email; + final SystemConfigTemplateEmailsDto email; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigTemplatesDto && - other.email == email; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (email.hashCode); - - @override - String toString() => 'SystemConfigTemplatesDto[email=$email]'; + static SystemConfigTemplatesDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(email: (SystemConfigTemplateEmailsDto.fromJson(json[r'email']))!); + } Map toJson() { final json = {}; - json[r'email'] = this.email; + json[r'email'] = email.toJson(); return json; } - /// Returns a new [SystemConfigTemplatesDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigTemplatesDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigTemplatesDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigTemplatesDto( - email: SystemConfigTemplateEmailsDto.fromJson(json[r'email'])!, - ); - } - return null; + SystemConfigTemplatesDto copyWith({SystemConfigTemplateEmailsDto? email}) { + return .new(email: email ?? this.email); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigTemplatesDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigTemplatesDto && email == other.email); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigTemplatesDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([email]); } - // maps a json object with a list of SystemConfigTemplatesDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigTemplatesDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'email', - }; + @override + String toString() => 'SystemConfigTemplatesDto(email=$email)'; } - diff --git a/mobile/openapi/lib/model/system_config_theme_dto.dart b/mobile/openapi/lib/model/system_config_theme_dto.dart index fca38f71fb..2ecbe796da 100644 --- a/mobile/openapi/lib/model/system_config_theme_dto.dart +++ b/mobile/openapi/lib/model/system_config_theme_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigThemeDto { - /// Returns a new [SystemConfigThemeDto] instance. - SystemConfigThemeDto({ - required this.customCss, - }); +final class SystemConfigThemeDto { + const SystemConfigThemeDto({required this.customCss}); /// Custom CSS for theming - String customCss; + final String customCss; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigThemeDto && - other.customCss == customCss; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (customCss.hashCode); - - @override - String toString() => 'SystemConfigThemeDto[customCss=$customCss]'; + static SystemConfigThemeDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(customCss: json[r'customCss'] as String); + } Map toJson() { final json = {}; - json[r'customCss'] = this.customCss; + json[r'customCss'] = customCss; return json; } - /// Returns a new [SystemConfigThemeDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigThemeDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigThemeDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigThemeDto( - customCss: mapValueOfType(json, r'customCss')!, - ); - } - return null; + SystemConfigThemeDto copyWith({String? customCss}) { + return .new(customCss: customCss ?? this.customCss); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigThemeDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigThemeDto && customCss == other.customCss); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigThemeDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([customCss]); } - // maps a json object with a list of SystemConfigThemeDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigThemeDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'customCss', - }; + @override + String toString() => 'SystemConfigThemeDto(customCss=$customCss)'; } - diff --git a/mobile/openapi/lib/model/system_config_trash_dto.dart b/mobile/openapi/lib/model/system_config_trash_dto.dart index 790710751f..9c2f26b4d4 100644 --- a/mobile/openapi/lib/model/system_config_trash_dto.dart +++ b/mobile/openapi/lib/model/system_config_trash_dto.dart @@ -1,112 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigTrashDto { - /// Returns a new [SystemConfigTrashDto] instance. - SystemConfigTrashDto({ - required this.days, - required this.enabled, - }); +final class SystemConfigTrashDto { + const SystemConfigTrashDto({required this.days, required this.enabled}); /// Days - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int days; + final int days; /// Enabled - bool enabled; + final bool enabled; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigTrashDto && - other.days == days && - other.enabled == enabled; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (days.hashCode) + - (enabled.hashCode); - - @override - String toString() => 'SystemConfigTrashDto[days=$days, enabled=$enabled]'; + static SystemConfigTrashDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(days: json[r'days'] as int, enabled: json[r'enabled'] as bool); + } Map toJson() { final json = {}; - json[r'days'] = this.days; - json[r'enabled'] = this.enabled; + json[r'days'] = days; + json[r'enabled'] = enabled; return json; } - /// Returns a new [SystemConfigTrashDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigTrashDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigTrashDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigTrashDto( - days: mapValueOfType(json, r'days')!, - enabled: mapValueOfType(json, r'enabled')!, - ); - } - return null; + SystemConfigTrashDto copyWith({int? days, bool? enabled}) { + return .new(days: days ?? this.days, enabled: enabled ?? this.enabled); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigTrashDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigTrashDto && days == other.days && enabled == other.enabled); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigTrashDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([days, enabled]); } - // maps a json object with a list of SystemConfigTrashDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigTrashDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'days', - 'enabled', - }; + @override + String toString() => 'SystemConfigTrashDto(days=$days, enabled=$enabled)'; } - diff --git a/mobile/openapi/lib/model/system_config_user_dto.dart b/mobile/openapi/lib/model/system_config_user_dto.dart index dc553e7369..c5bdb6c5e9 100644 --- a/mobile/openapi/lib/model/system_config_user_dto.dart +++ b/mobile/openapi/lib/model/system_config_user_dto.dart @@ -1,103 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class SystemConfigUserDto { - /// Returns a new [SystemConfigUserDto] instance. - SystemConfigUserDto({ - required this.deleteDelay, - }); +final class SystemConfigUserDto { + const SystemConfigUserDto({required this.deleteDelay}); /// Delete delay - /// - /// Minimum value: 1 - /// Maximum value: 9007199254740991 - int deleteDelay; + final int deleteDelay; - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigUserDto && - other.deleteDelay == deleteDelay; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (deleteDelay.hashCode); - - @override - String toString() => 'SystemConfigUserDto[deleteDelay=$deleteDelay]'; + static SystemConfigUserDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(deleteDelay: json[r'deleteDelay'] as int); + } Map toJson() { final json = {}; - json[r'deleteDelay'] = this.deleteDelay; + json[r'deleteDelay'] = deleteDelay; return json; } - /// Returns a new [SystemConfigUserDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigUserDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigUserDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigUserDto( - deleteDelay: mapValueOfType(json, r'deleteDelay')!, - ); - } - return null; + SystemConfigUserDto copyWith({int? deleteDelay}) { + return .new(deleteDelay: deleteDelay ?? this.deleteDelay); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigUserDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is SystemConfigUserDto && deleteDelay == other.deleteDelay); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = SystemConfigUserDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([deleteDelay]); } - // maps a json object with a list of SystemConfigUserDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = SystemConfigUserDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'deleteDelay', - }; + @override + String toString() => 'SystemConfigUserDto(deleteDelay=$deleteDelay)'; } - diff --git a/mobile/openapi/lib/model/tag_bulk_assets_dto.dart b/mobile/openapi/lib/model/tag_bulk_assets_dto.dart index 16abc3bcdc..9973843c36 100644 --- a/mobile/openapi/lib/model/tag_bulk_assets_dto.dart +++ b/mobile/openapi/lib/model/tag_bulk_assets_dto.dart @@ -1,113 +1,50 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TagBulkAssetsDto { - /// Returns a new [TagBulkAssetsDto] instance. - TagBulkAssetsDto({ - this.assetIds = const [], - this.tagIds = const [], - }); +final class TagBulkAssetsDto { + const TagBulkAssetsDto({required this.assetIds, required this.tagIds}); /// Asset IDs - List assetIds; + final List assetIds; /// Tag IDs - List tagIds; + final List tagIds; - @override - bool operator ==(Object other) => identical(this, other) || other is TagBulkAssetsDto && - _deepEquality.equals(other.assetIds, assetIds) && - _deepEquality.equals(other.tagIds, tagIds); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetIds.hashCode) + - (tagIds.hashCode); - - @override - String toString() => 'TagBulkAssetsDto[assetIds=$assetIds, tagIds=$tagIds]'; + static TagBulkAssetsDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + assetIds: ((json[r'assetIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + tagIds: ((json[r'tagIds'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'assetIds'] = this.assetIds; - json[r'tagIds'] = this.tagIds; + json[r'assetIds'] = assetIds; + json[r'tagIds'] = tagIds; return json; } - /// Returns a new [TagBulkAssetsDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TagBulkAssetsDto? fromJson(dynamic value) { - upgradeDto(value, "TagBulkAssetsDto"); - if (value is Map) { - final json = value.cast(); - - return TagBulkAssetsDto( - assetIds: json[r'assetIds'] is Iterable - ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) - : const [], - tagIds: json[r'tagIds'] is Iterable - ? (json[r'tagIds'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + TagBulkAssetsDto copyWith({List? assetIds, List? tagIds}) { + return .new(assetIds: assetIds ?? this.assetIds, tagIds: tagIds ?? this.tagIds); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TagBulkAssetsDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is TagBulkAssetsDto && + const DeepCollectionEquality().equals(assetIds, other.assetIds) && + const DeepCollectionEquality().equals(tagIds, other.tagIds)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TagBulkAssetsDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(assetIds), const DeepCollectionEquality().hash(tagIds)]); } - // maps a json object with a list of TagBulkAssetsDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TagBulkAssetsDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetIds', - 'tagIds', - }; + @override + String toString() => 'TagBulkAssetsDto(assetIds=$assetIds, tagIds=$tagIds)'; } - diff --git a/mobile/openapi/lib/model/tag_bulk_assets_response_dto.dart b/mobile/openapi/lib/model/tag_bulk_assets_response_dto.dart index 4d689f01a1..1601522eb6 100644 --- a/mobile/openapi/lib/model/tag_bulk_assets_response_dto.dart +++ b/mobile/openapi/lib/model/tag_bulk_assets_response_dto.dart @@ -1,103 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TagBulkAssetsResponseDto { - /// Returns a new [TagBulkAssetsResponseDto] instance. - TagBulkAssetsResponseDto({ - required this.count, - }); +final class TagBulkAssetsResponseDto { + const TagBulkAssetsResponseDto({required this.count}); /// Number of assets tagged - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int count; + final int count; - @override - bool operator ==(Object other) => identical(this, other) || other is TagBulkAssetsResponseDto && - other.count == count; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (count.hashCode); - - @override - String toString() => 'TagBulkAssetsResponseDto[count=$count]'; + static TagBulkAssetsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(count: json[r'count'] as int); + } Map toJson() { final json = {}; - json[r'count'] = this.count; + json[r'count'] = count; return json; } - /// Returns a new [TagBulkAssetsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TagBulkAssetsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "TagBulkAssetsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return TagBulkAssetsResponseDto( - count: mapValueOfType(json, r'count')!, - ); - } - return null; + TagBulkAssetsResponseDto copyWith({int? count}) { + return .new(count: count ?? this.count); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TagBulkAssetsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is TagBulkAssetsResponseDto && count == other.count); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TagBulkAssetsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([count]); } - // maps a json object with a list of TagBulkAssetsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TagBulkAssetsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'count', - }; + @override + String toString() => 'TagBulkAssetsResponseDto(count=$count)'; } - diff --git a/mobile/openapi/lib/model/tag_create_dto.dart b/mobile/openapi/lib/model/tag_create_dto.dart index e05b29f1ed..c5f4bc7b58 100644 --- a/mobile/openapi/lib/model/tag_create_dto.dart +++ b/mobile/openapi/lib/model/tag_create_dto.dart @@ -1,124 +1,63 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TagCreateDto { - /// Returns a new [TagCreateDto] instance. - TagCreateDto({ - this.color, +final class TagCreateDto { + const TagCreateDto({ + this.color = const Optional.absent(), required this.name, - this.parentId, + this.parentId = const Optional.absent(), }); /// Tag color (hex) - String? color; + final Optional color; /// Tag name - String name; + final String name; /// Parent tag ID - String? parentId; + final Optional parentId; - @override - bool operator ==(Object other) => identical(this, other) || other is TagCreateDto && - other.color == color && - other.name == name && - other.parentId == parentId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (color == null ? 0 : color!.hashCode) + - (name.hashCode) + - (parentId == null ? 0 : parentId!.hashCode); - - @override - String toString() => 'TagCreateDto[color=$color, name=$name, parentId=$parentId]'; + static TagCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + color: json.containsKey(r'color') ? Optional.present((json[r'color'] as String?)) : const Optional.absent(), + name: json[r'name'] as String, + parentId: json.containsKey(r'parentId') + ? Optional.present((json[r'parentId'] as String?)) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.color != null) { - json[r'color'] = this.color; - } else { - // json[r'color'] = null; + if (color case Present(:final value)) { + json[r'color'] = value; } - json[r'name'] = this.name; - if (this.parentId != null) { - json[r'parentId'] = this.parentId; - } else { - // json[r'parentId'] = null; + json[r'name'] = name; + if (parentId case Present(:final value)) { + json[r'parentId'] = value; } return json; } - /// Returns a new [TagCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TagCreateDto? fromJson(dynamic value) { - upgradeDto(value, "TagCreateDto"); - if (value is Map) { - final json = value.cast(); - - return TagCreateDto( - color: mapValueOfType(json, r'color'), - name: mapValueOfType(json, r'name')!, - parentId: mapValueOfType(json, r'parentId'), - ); - } - return null; + TagCreateDto copyWith({Optional? color, String? name, Optional? parentId}) { + return .new(color: color ?? this.color, name: name ?? this.name, parentId: parentId ?? this.parentId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TagCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is TagCreateDto && color == other.color && name == other.name && parentId == other.parentId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TagCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([color, name, parentId]); } - // maps a json object with a list of TagCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TagCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'name', - }; + @override + String toString() => 'TagCreateDto(color=$color, name=$name, parentId=$parentId)'; } - diff --git a/mobile/openapi/lib/model/tag_response_dto.dart b/mobile/openapi/lib/model/tag_response_dto.dart index 9a71912153..ae50b2d7b7 100644 --- a/mobile/openapi/lib/model/tag_response_dto.dart +++ b/mobile/openapi/lib/model/tag_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TagResponseDto { - /// Returns a new [TagResponseDto] instance. - TagResponseDto({ +final class TagResponseDto { + const TagResponseDto({ this.color, required this.createdAt, required this.id, @@ -23,150 +14,98 @@ class TagResponseDto { }); /// Tag color (hex) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? color; + final String? color; /// Creation date - DateTime createdAt; + final DateTime createdAt; /// Tag ID - String id; + final String id; /// Tag name - String name; + final String name; /// Parent tag ID - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? parentId; + final String? parentId; /// Last update date - DateTime updatedAt; + final DateTime updatedAt; /// Tag value (full path) - String value; + final String value; - @override - bool operator ==(Object other) => identical(this, other) || other is TagResponseDto && - other.color == color && - other.createdAt == createdAt && - other.id == id && - other.name == name && - other.parentId == parentId && - other.updatedAt == updatedAt && - other.value == value; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (color == null ? 0 : color!.hashCode) + - (createdAt.hashCode) + - (id.hashCode) + - (name.hashCode) + - (parentId == null ? 0 : parentId!.hashCode) + - (updatedAt.hashCode) + - (value.hashCode); - - @override - String toString() => 'TagResponseDto[color=$color, createdAt=$createdAt, id=$id, name=$name, parentId=$parentId, updatedAt=$updatedAt, value=$value]'; + static TagResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + color: (json[r'color'] as String?), + createdAt: DateTime.parse(json[r'createdAt'] as String), + id: json[r'id'] as String, + name: json[r'name'] as String, + parentId: (json[r'parentId'] as String?), + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + value: json[r'value'] as String, + ); + } Map toJson() { final json = {}; - if (this.color != null) { - json[r'color'] = this.color; - } else { - // json[r'color'] = null; + if (color != null) { + json[r'color'] = color!; } - json[r'createdAt'] = this.createdAt.toUtc().toIso8601String(); - json[r'id'] = this.id; - json[r'name'] = this.name; - if (this.parentId != null) { - json[r'parentId'] = this.parentId; - } else { - // json[r'parentId'] = null; + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + json[r'id'] = id; + json[r'name'] = name; + if (parentId != null) { + json[r'parentId'] = parentId!; } - json[r'updatedAt'] = this.updatedAt.toUtc().toIso8601String(); - json[r'value'] = this.value; + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); + json[r'value'] = value; return json; } - /// Returns a new [TagResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TagResponseDto? fromJson(dynamic value) { - upgradeDto(value, "TagResponseDto"); - if (value is Map) { - final json = value.cast(); - - return TagResponseDto( - color: mapValueOfType(json, r'color'), - createdAt: mapDateTime(json, r'createdAt', r'')!, - id: mapValueOfType(json, r'id')!, - name: mapValueOfType(json, r'name')!, - parentId: mapValueOfType(json, r'parentId'), - updatedAt: mapDateTime(json, r'updatedAt', r'')!, - value: mapValueOfType(json, r'value')!, - ); - } - return null; + TagResponseDto copyWith({ + Object? color = _undefined, + DateTime? createdAt, + String? id, + String? name, + Object? parentId = _undefined, + DateTime? updatedAt, + String? value, + }) { + return .new( + color: identical(color, _undefined) ? this.color : color as String?, + createdAt: createdAt ?? this.createdAt, + id: id ?? this.id, + name: name ?? this.name, + parentId: identical(parentId, _undefined) ? this.parentId : parentId as String?, + updatedAt: updatedAt ?? this.updatedAt, + value: value ?? this.value, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TagResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is TagResponseDto && + color == other.color && + createdAt == other.createdAt && + id == other.id && + name == other.name && + parentId == other.parentId && + updatedAt == other.updatedAt && + value == other.value); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TagResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([color, createdAt, id, name, parentId, updatedAt, value]); } - // maps a json object with a list of TagResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TagResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'createdAt', - 'id', - 'name', - 'updatedAt', - 'value', - }; + @override + String toString() => + 'TagResponseDto(color=$color, createdAt=$createdAt, id=$id, name=$name, parentId=$parentId, updatedAt=$updatedAt, value=$value)'; } - diff --git a/mobile/openapi/lib/model/tag_update_dto.dart b/mobile/openapi/lib/model/tag_update_dto.dart index 98cb6af523..a26ecf0ec7 100644 --- a/mobile/openapi/lib/model/tag_update_dto.dart +++ b/mobile/openapi/lib/model/tag_update_dto.dart @@ -1,103 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TagUpdateDto { - /// Returns a new [TagUpdateDto] instance. - TagUpdateDto({ - this.color, - }); +final class TagUpdateDto { + const TagUpdateDto({this.color = const Optional.absent()}); /// Tag color (hex) - String? color; + final Optional color; - @override - bool operator ==(Object other) => identical(this, other) || other is TagUpdateDto && - other.color == color; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (color == null ? 0 : color!.hashCode); - - @override - String toString() => 'TagUpdateDto[color=$color]'; + static TagUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + color: json.containsKey(r'color') ? Optional.present((json[r'color'] as String?)) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.color != null) { - json[r'color'] = this.color; - } else { - // json[r'color'] = null; + if (color case Present(:final value)) { + json[r'color'] = value; } return json; } - /// Returns a new [TagUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TagUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "TagUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return TagUpdateDto( - color: mapValueOfType(json, r'color'), - ); - } - return null; + TagUpdateDto copyWith({Optional? color}) { + return .new(color: color ?? this.color); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TagUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is TagUpdateDto && color == other.color); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TagUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([color]); } - // maps a json object with a list of TagUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TagUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'TagUpdateDto(color=$color)'; } - diff --git a/mobile/openapi/lib/model/tag_upsert_dto.dart b/mobile/openapi/lib/model/tag_upsert_dto.dart index 3581ef1e8f..ef2e11a8a2 100644 --- a/mobile/openapi/lib/model/tag_upsert_dto.dart +++ b/mobile/openapi/lib/model/tag_upsert_dto.dart @@ -1,102 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TagUpsertDto { - /// Returns a new [TagUpsertDto] instance. - TagUpsertDto({ - this.tags = const [], - }); +final class TagUpsertDto { + const TagUpsertDto({required this.tags}); /// Tag names to upsert - List tags; + final List tags; - @override - bool operator ==(Object other) => identical(this, other) || other is TagUpsertDto && - _deepEquality.equals(other.tags, tags); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (tags.hashCode); - - @override - String toString() => 'TagUpsertDto[tags=$tags]'; + static TagUpsertDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(tags: ((json[r'tags'] as List?)?.map(($e) => $e as String).toList(growable: false))!); + } Map toJson() { final json = {}; - json[r'tags'] = this.tags; + json[r'tags'] = tags; return json; } - /// Returns a new [TagUpsertDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TagUpsertDto? fromJson(dynamic value) { - upgradeDto(value, "TagUpsertDto"); - if (value is Map) { - final json = value.cast(); - - return TagUpsertDto( - tags: json[r'tags'] is Iterable - ? (json[r'tags'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + TagUpsertDto copyWith({List? tags}) { + return .new(tags: tags ?? this.tags); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TagUpsertDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is TagUpsertDto && const DeepCollectionEquality().equals(tags, other.tags)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TagUpsertDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(tags)]); } - // maps a json object with a list of TagUpsertDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TagUpsertDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'tags', - }; + @override + String toString() => 'TagUpsertDto(tags=$tags)'; } - diff --git a/mobile/openapi/lib/model/tags_response.dart b/mobile/openapi/lib/model/tags_response.dart index 8a3ac17474..5003a3c301 100644 --- a/mobile/openapi/lib/model/tags_response.dart +++ b/mobile/openapi/lib/model/tags_response.dart @@ -1,109 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TagsResponse { - /// Returns a new [TagsResponse] instance. - TagsResponse({ - required this.enabled, - required this.sidebarWeb, - }); +final class TagsResponse { + const TagsResponse({required this.enabled, required this.sidebarWeb}); /// Whether tags are enabled - bool enabled; + final bool enabled; /// Whether tags appear in web sidebar - bool sidebarWeb; + final bool sidebarWeb; - @override - bool operator ==(Object other) => identical(this, other) || other is TagsResponse && - other.enabled == enabled && - other.sidebarWeb == sidebarWeb; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (sidebarWeb.hashCode); - - @override - String toString() => 'TagsResponse[enabled=$enabled, sidebarWeb=$sidebarWeb]'; + static TagsResponse? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: json[r'enabled'] as bool, sidebarWeb: json[r'sidebarWeb'] as bool); + } Map toJson() { final json = {}; - json[r'enabled'] = this.enabled; - json[r'sidebarWeb'] = this.sidebarWeb; + json[r'enabled'] = enabled; + json[r'sidebarWeb'] = sidebarWeb; return json; } - /// Returns a new [TagsResponse] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TagsResponse? fromJson(dynamic value) { - upgradeDto(value, "TagsResponse"); - if (value is Map) { - final json = value.cast(); - - return TagsResponse( - enabled: mapValueOfType(json, r'enabled')!, - sidebarWeb: mapValueOfType(json, r'sidebarWeb')!, - ); - } - return null; + TagsResponse copyWith({bool? enabled, bool? sidebarWeb}) { + return .new(enabled: enabled ?? this.enabled, sidebarWeb: sidebarWeb ?? this.sidebarWeb); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TagsResponse.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is TagsResponse && enabled == other.enabled && sidebarWeb == other.sidebarWeb); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TagsResponse.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, sidebarWeb]); } - // maps a json object with a list of TagsResponse-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TagsResponse.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'sidebarWeb', - }; + @override + String toString() => 'TagsResponse(enabled=$enabled, sidebarWeb=$sidebarWeb)'; } - diff --git a/mobile/openapi/lib/model/tags_update.dart b/mobile/openapi/lib/model/tags_update.dart index e42357e3d4..5dbc505feb 100644 --- a/mobile/openapi/lib/model/tags_update.dart +++ b/mobile/openapi/lib/model/tags_update.dart @@ -1,127 +1,54 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TagsUpdate { - /// Returns a new [TagsUpdate] instance. - TagsUpdate({ - this.enabled, - this.sidebarWeb, - }); +final class TagsUpdate { + const TagsUpdate({this.enabled, this.sidebarWeb}); /// Whether tags are enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final bool? enabled; /// Whether tags appear in web sidebar - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? sidebarWeb; + final bool? sidebarWeb; - @override - bool operator ==(Object other) => identical(this, other) || other is TagsUpdate && - other.enabled == enabled && - other.sidebarWeb == sidebarWeb; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled == null ? 0 : enabled!.hashCode) + - (sidebarWeb == null ? 0 : sidebarWeb!.hashCode); - - @override - String toString() => 'TagsUpdate[enabled=$enabled, sidebarWeb=$sidebarWeb]'; + static TagsUpdate? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(enabled: (json[r'enabled'] as bool?), sidebarWeb: (json[r'sidebarWeb'] as bool?)); + } Map toJson() { final json = {}; - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled != null) { + json[r'enabled'] = enabled!; } - if (this.sidebarWeb != null) { - json[r'sidebarWeb'] = this.sidebarWeb; - } else { - // json[r'sidebarWeb'] = null; + if (sidebarWeb != null) { + json[r'sidebarWeb'] = sidebarWeb!; } return json; } - /// Returns a new [TagsUpdate] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TagsUpdate? fromJson(dynamic value) { - upgradeDto(value, "TagsUpdate"); - if (value is Map) { - final json = value.cast(); - - return TagsUpdate( - enabled: mapValueOfType(json, r'enabled'), - sidebarWeb: mapValueOfType(json, r'sidebarWeb'), - ); - } - return null; + TagsUpdate copyWith({Object? enabled = _undefined, Object? sidebarWeb = _undefined}) { + return .new( + enabled: identical(enabled, _undefined) ? this.enabled : enabled as bool?, + sidebarWeb: identical(sidebarWeb, _undefined) ? this.sidebarWeb : sidebarWeb as bool?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TagsUpdate.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is TagsUpdate && enabled == other.enabled && sidebarWeb == other.sidebarWeb); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TagsUpdate.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([enabled, sidebarWeb]); } - // maps a json object with a list of TagsUpdate-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TagsUpdate.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'TagsUpdate(enabled=$enabled, sidebarWeb=$sidebarWeb)'; } - diff --git a/mobile/openapi/lib/model/template_dto.dart b/mobile/openapi/lib/model/template_dto.dart index b1eab848ed..b5b2e886c9 100644 --- a/mobile/openapi/lib/model/template_dto.dart +++ b/mobile/openapi/lib/model/template_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TemplateDto { - /// Returns a new [TemplateDto] instance. - TemplateDto({ - required this.template, - }); +final class TemplateDto { + const TemplateDto({required this.template}); /// Template name - String template; + final String template; - @override - bool operator ==(Object other) => identical(this, other) || other is TemplateDto && - other.template == template; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (template.hashCode); - - @override - String toString() => 'TemplateDto[template=$template]'; + static TemplateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(template: json[r'template'] as String); + } Map toJson() { final json = {}; - json[r'template'] = this.template; + json[r'template'] = template; return json; } - /// Returns a new [TemplateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TemplateDto? fromJson(dynamic value) { - upgradeDto(value, "TemplateDto"); - if (value is Map) { - final json = value.cast(); - - return TemplateDto( - template: mapValueOfType(json, r'template')!, - ); - } - return null; + TemplateDto copyWith({String? template}) { + return .new(template: template ?? this.template); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TemplateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is TemplateDto && template == other.template); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TemplateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([template]); } - // maps a json object with a list of TemplateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TemplateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'template', - }; + @override + String toString() => 'TemplateDto(template=$template)'; } - diff --git a/mobile/openapi/lib/model/template_response_dto.dart b/mobile/openapi/lib/model/template_response_dto.dart index f19c1eae7d..fd358d0a72 100644 --- a/mobile/openapi/lib/model/template_response_dto.dart +++ b/mobile/openapi/lib/model/template_response_dto.dart @@ -1,109 +1,44 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TemplateResponseDto { - /// Returns a new [TemplateResponseDto] instance. - TemplateResponseDto({ - required this.html, - required this.name, - }); +final class TemplateResponseDto { + const TemplateResponseDto({required this.html, required this.name}); /// Template HTML content - String html; + final String html; /// Template name - String name; + final String name; - @override - bool operator ==(Object other) => identical(this, other) || other is TemplateResponseDto && - other.html == html && - other.name == name; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (html.hashCode) + - (name.hashCode); - - @override - String toString() => 'TemplateResponseDto[html=$html, name=$name]'; + static TemplateResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(html: json[r'html'] as String, name: json[r'name'] as String); + } Map toJson() { final json = {}; - json[r'html'] = this.html; - json[r'name'] = this.name; + json[r'html'] = html; + json[r'name'] = name; return json; } - /// Returns a new [TemplateResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TemplateResponseDto? fromJson(dynamic value) { - upgradeDto(value, "TemplateResponseDto"); - if (value is Map) { - final json = value.cast(); - - return TemplateResponseDto( - html: mapValueOfType(json, r'html')!, - name: mapValueOfType(json, r'name')!, - ); - } - return null; + TemplateResponseDto copyWith({String? html, String? name}) { + return .new(html: html ?? this.html, name: name ?? this.name); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TemplateResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is TemplateResponseDto && html == other.html && name == other.name); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TemplateResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([html, name]); } - // maps a json object with a list of TemplateResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TemplateResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'html', - 'name', - }; + @override + String toString() => 'TemplateResponseDto(html=$html, name=$name)'; } - diff --git a/mobile/openapi/lib/model/test_email_response_dto.dart b/mobile/openapi/lib/model/test_email_response_dto.dart index e14783f3c4..bc286d44cf 100644 --- a/mobile/openapi/lib/model/test_email_response_dto.dart +++ b/mobile/openapi/lib/model/test_email_response_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TestEmailResponseDto { - /// Returns a new [TestEmailResponseDto] instance. - TestEmailResponseDto({ - required this.messageId, - }); +final class TestEmailResponseDto { + const TestEmailResponseDto({required this.messageId}); /// Email message ID - String messageId; + final String messageId; - @override - bool operator ==(Object other) => identical(this, other) || other is TestEmailResponseDto && - other.messageId == messageId; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (messageId.hashCode); - - @override - String toString() => 'TestEmailResponseDto[messageId=$messageId]'; + static TestEmailResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(messageId: json[r'messageId'] as String); + } Map toJson() { final json = {}; - json[r'messageId'] = this.messageId; + json[r'messageId'] = messageId; return json; } - /// Returns a new [TestEmailResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TestEmailResponseDto? fromJson(dynamic value) { - upgradeDto(value, "TestEmailResponseDto"); - if (value is Map) { - final json = value.cast(); - - return TestEmailResponseDto( - messageId: mapValueOfType(json, r'messageId')!, - ); - } - return null; + TestEmailResponseDto copyWith({String? messageId}) { + return .new(messageId: messageId ?? this.messageId); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TestEmailResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is TestEmailResponseDto && messageId == other.messageId); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TestEmailResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([messageId]); } - // maps a json object with a list of TestEmailResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TestEmailResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'messageId', - }; + @override + String toString() => 'TestEmailResponseDto(messageId=$messageId)'; } - diff --git a/mobile/openapi/lib/model/time_bucket_asset_response_dto.dart b/mobile/openapi/lib/model/time_bucket_asset_response_dto.dart index 32e08a9ea0..9c3ed761d5 100644 --- a/mobile/openapi/lib/model/time_bucket_asset_response_dto.dart +++ b/mobile/openapi/lib/model/time_bucket_asset_response_dto.dart @@ -1,295 +1,251 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TimeBucketAssetResponseDto { - /// Returns a new [TimeBucketAssetResponseDto] instance. - TimeBucketAssetResponseDto({ - this.city = const [], - this.country = const [], - this.createdAt = const [], - this.duration = const [], - this.fileCreatedAt = const [], - this.id = const [], - this.isFavorite = const [], - this.isImage = const [], - this.isTrashed = const [], - this.latitude = const [], - this.livePhotoVideoId = const [], - this.localOffsetHours = const [], - this.longitude = const [], - this.ownerId = const [], - this.projectionType = const [], - this.ratio = const [], - this.stack = const [], - this.thumbhash = const [], - this.visibility = const [], +final class TimeBucketAssetResponseDto { + const TimeBucketAssetResponseDto({ + this.city, + this.country, + required this.createdAt, + required this.duration, + required this.fileCreatedAt, + required this.id, + required this.isFavorite, + required this.isImage, + required this.isTrashed, + this.latitude, + required this.livePhotoVideoId, + required this.localOffsetHours, + this.longitude, + required this.ownerId, + required this.projectionType, + required this.ratio, + this.stack, + required this.thumbhash, + required this.visibility, }); /// Array of city names extracted from EXIF GPS data - List city; + final List? city; /// Array of country names extracted from EXIF GPS data - List country; + final List? country; /// Array of UTC timestamps when each asset was originally uploaded to Immich - List createdAt; + final List createdAt; /// Array of video/gif durations in milliseconds (null for static images) - List duration; + final List duration; /// Array of file creation timestamps in UTC - List fileCreatedAt; + final List fileCreatedAt; /// Array of asset IDs in the time bucket - List id; + final List id; /// Array indicating whether each asset is favorited - List isFavorite; + final List isFavorite; /// Array indicating whether each asset is an image (false for videos) - List isImage; + final List isImage; /// Array indicating whether each asset is in the trash - List isTrashed; + final List isTrashed; /// Array of latitude coordinates extracted from EXIF GPS data - List latitude; + final List? latitude; /// Array of live photo video asset IDs (null for non-live photos) - List livePhotoVideoId; + final List livePhotoVideoId; /// Array of UTC offset hours at the time each photo was taken. Positive values are east of UTC, negative values are west of UTC. Values may be fractional (e.g., 5.5 for +05:30, -9.75 for -09:45). Applying this offset to 'fileCreatedAt' will give you the time the photo was taken from the photographer's perspective. - List localOffsetHours; + final List localOffsetHours; /// Array of longitude coordinates extracted from EXIF GPS data - List longitude; + final List? longitude; /// Array of owner IDs for each asset - List ownerId; + final List ownerId; - /// Array of projection types for 360° content (e.g., \"EQUIRECTANGULAR\", \"CUBEFACE\", \"CYLINDRICAL\") - List projectionType; + /// Array of projection types for 360° content (e.g., "EQUIRECTANGULAR", "CUBEFACE", "CYLINDRICAL") + final List projectionType; /// Array of aspect ratios (width/height) for each asset - List ratio; + final List ratio; /// Array of stack information as [stackId, assetCount] tuples (null for non-stacked assets) - List?> stack; + final List?>? stack; /// Array of BlurHash strings for generating asset previews (base64 encoded) - List thumbhash; + final List thumbhash; /// Array of visibility statuses for each asset (e.g., ARCHIVE, TIMELINE, HIDDEN, LOCKED) - List visibility; + final List visibility; - @override - bool operator ==(Object other) => identical(this, other) || other is TimeBucketAssetResponseDto && - _deepEquality.equals(other.city, city) && - _deepEquality.equals(other.country, country) && - _deepEquality.equals(other.createdAt, createdAt) && - _deepEquality.equals(other.duration, duration) && - _deepEquality.equals(other.fileCreatedAt, fileCreatedAt) && - _deepEquality.equals(other.id, id) && - _deepEquality.equals(other.isFavorite, isFavorite) && - _deepEquality.equals(other.isImage, isImage) && - _deepEquality.equals(other.isTrashed, isTrashed) && - _deepEquality.equals(other.latitude, latitude) && - _deepEquality.equals(other.livePhotoVideoId, livePhotoVideoId) && - _deepEquality.equals(other.localOffsetHours, localOffsetHours) && - _deepEquality.equals(other.longitude, longitude) && - _deepEquality.equals(other.ownerId, ownerId) && - _deepEquality.equals(other.projectionType, projectionType) && - _deepEquality.equals(other.ratio, ratio) && - _deepEquality.equals(other.stack, stack) && - _deepEquality.equals(other.thumbhash, thumbhash) && - _deepEquality.equals(other.visibility, visibility); + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (city.hashCode) + - (country.hashCode) + - (createdAt.hashCode) + - (duration.hashCode) + - (fileCreatedAt.hashCode) + - (id.hashCode) + - (isFavorite.hashCode) + - (isImage.hashCode) + - (isTrashed.hashCode) + - (latitude.hashCode) + - (livePhotoVideoId.hashCode) + - (localOffsetHours.hashCode) + - (longitude.hashCode) + - (ownerId.hashCode) + - (projectionType.hashCode) + - (ratio.hashCode) + - (stack.hashCode) + - (thumbhash.hashCode) + - (visibility.hashCode); - - @override - String toString() => 'TimeBucketAssetResponseDto[city=$city, country=$country, createdAt=$createdAt, duration=$duration, fileCreatedAt=$fileCreatedAt, id=$id, isFavorite=$isFavorite, isImage=$isImage, isTrashed=$isTrashed, latitude=$latitude, livePhotoVideoId=$livePhotoVideoId, localOffsetHours=$localOffsetHours, longitude=$longitude, ownerId=$ownerId, projectionType=$projectionType, ratio=$ratio, stack=$stack, thumbhash=$thumbhash, visibility=$visibility]'; + static TimeBucketAssetResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + city: (json[r'city'] as List?)?.map(($e) => ($e as String?)).toList(growable: false), + country: (json[r'country'] as List?)?.map(($e) => ($e as String?)).toList(growable: false), + createdAt: ((json[r'createdAt'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + duration: ((json[r'duration'] as List?)?.map(($e) => ($e as int?)).toList(growable: false))!, + fileCreatedAt: ((json[r'fileCreatedAt'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + id: ((json[r'id'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + isFavorite: ((json[r'isFavorite'] as List?)?.map(($e) => $e as bool).toList(growable: false))!, + isImage: ((json[r'isImage'] as List?)?.map(($e) => $e as bool).toList(growable: false))!, + isTrashed: ((json[r'isTrashed'] as List?)?.map(($e) => $e as bool).toList(growable: false))!, + latitude: (json[r'latitude'] as List?)?.map(($e) => ($e as num?)?.toDouble()).toList(growable: false), + livePhotoVideoId: ((json[r'livePhotoVideoId'] as List?)?.map(($e) => ($e as String?)).toList(growable: false))!, + localOffsetHours: ((json[r'localOffsetHours'] as List?) + ?.map(($e) => ($e as num).toDouble()) + .toList(growable: false))!, + longitude: (json[r'longitude'] as List?)?.map(($e) => ($e as num?)?.toDouble()).toList(growable: false), + ownerId: ((json[r'ownerId'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + projectionType: ((json[r'projectionType'] as List?)?.map(($e) => ($e as String?)).toList(growable: false))!, + ratio: ((json[r'ratio'] as List?)?.map(($e) => ($e as num).toDouble()).toList(growable: false))!, + stack: (json[r'stack'] as List?) + ?.map(($e) => ($e as List?)?.map(($e) => $e as String).toList(growable: false)) + .toList(growable: false), + thumbhash: ((json[r'thumbhash'] as List?)?.map(($e) => ($e as String?)).toList(growable: false))!, + visibility: ((json[r'visibility'] as List?) + ?.map(($e) => (AssetVisibility.fromJson($e))!) + .toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'city'] = this.city; - json[r'country'] = this.country; - json[r'createdAt'] = this.createdAt; - json[r'duration'] = this.duration; - json[r'fileCreatedAt'] = this.fileCreatedAt; - json[r'id'] = this.id; - json[r'isFavorite'] = this.isFavorite; - json[r'isImage'] = this.isImage; - json[r'isTrashed'] = this.isTrashed; - json[r'latitude'] = this.latitude; - json[r'livePhotoVideoId'] = this.livePhotoVideoId; - json[r'localOffsetHours'] = this.localOffsetHours; - json[r'longitude'] = this.longitude; - json[r'ownerId'] = this.ownerId; - json[r'projectionType'] = this.projectionType; - json[r'ratio'] = this.ratio; - json[r'stack'] = this.stack; - json[r'thumbhash'] = this.thumbhash; - json[r'visibility'] = this.visibility; + if (city != null) { + json[r'city'] = city!; + } + if (country != null) { + json[r'country'] = country!; + } + json[r'createdAt'] = createdAt; + json[r'duration'] = duration; + json[r'fileCreatedAt'] = fileCreatedAt; + json[r'id'] = id; + json[r'isFavorite'] = isFavorite; + json[r'isImage'] = isImage; + json[r'isTrashed'] = isTrashed; + if (latitude != null) { + json[r'latitude'] = latitude!; + } + json[r'livePhotoVideoId'] = livePhotoVideoId; + json[r'localOffsetHours'] = localOffsetHours; + if (longitude != null) { + json[r'longitude'] = longitude!; + } + json[r'ownerId'] = ownerId; + json[r'projectionType'] = projectionType; + json[r'ratio'] = ratio; + if (stack != null) { + json[r'stack'] = stack!; + } + json[r'thumbhash'] = thumbhash; + json[r'visibility'] = visibility.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [TimeBucketAssetResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TimeBucketAssetResponseDto? fromJson(dynamic value) { - upgradeDto(value, "TimeBucketAssetResponseDto"); - if (value is Map) { - final json = value.cast(); - - return TimeBucketAssetResponseDto( - city: json[r'city'] is Iterable - ? (json[r'city'] as Iterable).cast().toList(growable: false) - : const [], - country: json[r'country'] is Iterable - ? (json[r'country'] as Iterable).cast().toList(growable: false) - : const [], - createdAt: json[r'createdAt'] is Iterable - ? (json[r'createdAt'] as Iterable).cast().toList(growable: false) - : const [], - duration: json[r'duration'] is Iterable - ? (json[r'duration'] as Iterable).cast().toList(growable: false) - : const [], - fileCreatedAt: json[r'fileCreatedAt'] is Iterable - ? (json[r'fileCreatedAt'] as Iterable).cast().toList(growable: false) - : const [], - id: json[r'id'] is Iterable - ? (json[r'id'] as Iterable).cast().toList(growable: false) - : const [], - isFavorite: json[r'isFavorite'] is Iterable - ? (json[r'isFavorite'] as Iterable).cast().toList(growable: false) - : const [], - isImage: json[r'isImage'] is Iterable - ? (json[r'isImage'] as Iterable).cast().toList(growable: false) - : const [], - isTrashed: json[r'isTrashed'] is Iterable - ? (json[r'isTrashed'] as Iterable).cast().toList(growable: false) - : const [], - latitude: json[r'latitude'] is Iterable - ? (json[r'latitude'] as Iterable).cast().toList(growable: false) - : const [], - livePhotoVideoId: json[r'livePhotoVideoId'] is Iterable - ? (json[r'livePhotoVideoId'] as Iterable).cast().toList(growable: false) - : const [], - localOffsetHours: json[r'localOffsetHours'] is Iterable - ? (json[r'localOffsetHours'] as Iterable).cast().toList(growable: false) - : const [], - longitude: json[r'longitude'] is Iterable - ? (json[r'longitude'] as Iterable).cast().toList(growable: false) - : const [], - ownerId: json[r'ownerId'] is Iterable - ? (json[r'ownerId'] as Iterable).cast().toList(growable: false) - : const [], - projectionType: json[r'projectionType'] is Iterable - ? (json[r'projectionType'] as Iterable).cast().toList(growable: false) - : const [], - ratio: json[r'ratio'] is Iterable - ? (json[r'ratio'] as Iterable).cast().toList(growable: false) - : const [], - stack: json[r'stack'] is List - ? (json[r'stack'] as List).map((e) => - e == null ? null : (e as List).cast() - ).toList() - : const [], - thumbhash: json[r'thumbhash'] is Iterable - ? (json[r'thumbhash'] as Iterable).cast().toList(growable: false) - : const [], - visibility: AssetVisibility.listFromJson(json[r'visibility']), - ); - } - return null; + TimeBucketAssetResponseDto copyWith({ + Object? city = _undefined, + Object? country = _undefined, + List? createdAt, + List? duration, + List? fileCreatedAt, + List? id, + List? isFavorite, + List? isImage, + List? isTrashed, + Object? latitude = _undefined, + List? livePhotoVideoId, + List? localOffsetHours, + Object? longitude = _undefined, + List? ownerId, + List? projectionType, + List? ratio, + Object? stack = _undefined, + List? thumbhash, + List? visibility, + }) { + return .new( + city: identical(city, _undefined) ? this.city : city as List?, + country: identical(country, _undefined) ? this.country : country as List?, + createdAt: createdAt ?? this.createdAt, + duration: duration ?? this.duration, + fileCreatedAt: fileCreatedAt ?? this.fileCreatedAt, + id: id ?? this.id, + isFavorite: isFavorite ?? this.isFavorite, + isImage: isImage ?? this.isImage, + isTrashed: isTrashed ?? this.isTrashed, + latitude: identical(latitude, _undefined) ? this.latitude : latitude as List?, + livePhotoVideoId: livePhotoVideoId ?? this.livePhotoVideoId, + localOffsetHours: localOffsetHours ?? this.localOffsetHours, + longitude: identical(longitude, _undefined) ? this.longitude : longitude as List?, + ownerId: ownerId ?? this.ownerId, + projectionType: projectionType ?? this.projectionType, + ratio: ratio ?? this.ratio, + stack: identical(stack, _undefined) ? this.stack : stack as List?>?, + thumbhash: thumbhash ?? this.thumbhash, + visibility: visibility ?? this.visibility, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TimeBucketAssetResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is TimeBucketAssetResponseDto && + const DeepCollectionEquality().equals(city, other.city) && + const DeepCollectionEquality().equals(country, other.country) && + const DeepCollectionEquality().equals(createdAt, other.createdAt) && + const DeepCollectionEquality().equals(duration, other.duration) && + const DeepCollectionEquality().equals(fileCreatedAt, other.fileCreatedAt) && + const DeepCollectionEquality().equals(id, other.id) && + const DeepCollectionEquality().equals(isFavorite, other.isFavorite) && + const DeepCollectionEquality().equals(isImage, other.isImage) && + const DeepCollectionEquality().equals(isTrashed, other.isTrashed) && + const DeepCollectionEquality().equals(latitude, other.latitude) && + const DeepCollectionEquality().equals(livePhotoVideoId, other.livePhotoVideoId) && + const DeepCollectionEquality().equals(localOffsetHours, other.localOffsetHours) && + const DeepCollectionEquality().equals(longitude, other.longitude) && + const DeepCollectionEquality().equals(ownerId, other.ownerId) && + const DeepCollectionEquality().equals(projectionType, other.projectionType) && + const DeepCollectionEquality().equals(ratio, other.ratio) && + const DeepCollectionEquality().equals(stack, other.stack) && + const DeepCollectionEquality().equals(thumbhash, other.thumbhash) && + const DeepCollectionEquality().equals(visibility, other.visibility)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TimeBucketAssetResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + const DeepCollectionEquality().hash(city), + const DeepCollectionEquality().hash(country), + const DeepCollectionEquality().hash(createdAt), + const DeepCollectionEquality().hash(duration), + const DeepCollectionEquality().hash(fileCreatedAt), + const DeepCollectionEquality().hash(id), + const DeepCollectionEquality().hash(isFavorite), + const DeepCollectionEquality().hash(isImage), + const DeepCollectionEquality().hash(isTrashed), + const DeepCollectionEquality().hash(latitude), + const DeepCollectionEquality().hash(livePhotoVideoId), + const DeepCollectionEquality().hash(localOffsetHours), + const DeepCollectionEquality().hash(longitude), + const DeepCollectionEquality().hash(ownerId), + const DeepCollectionEquality().hash(projectionType), + const DeepCollectionEquality().hash(ratio), + const DeepCollectionEquality().hash(stack), + const DeepCollectionEquality().hash(thumbhash), + const DeepCollectionEquality().hash(visibility), + ]); } - // maps a json object with a list of TimeBucketAssetResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TimeBucketAssetResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'createdAt', - 'duration', - 'fileCreatedAt', - 'id', - 'isFavorite', - 'isImage', - 'isTrashed', - 'livePhotoVideoId', - 'localOffsetHours', - 'ownerId', - 'projectionType', - 'ratio', - 'thumbhash', - 'visibility', - }; + @override + String toString() => + 'TimeBucketAssetResponseDto(city=$city, country=$country, createdAt=$createdAt, duration=$duration, fileCreatedAt=$fileCreatedAt, id=$id, isFavorite=$isFavorite, isImage=$isImage, isTrashed=$isTrashed, latitude=$latitude, livePhotoVideoId=$livePhotoVideoId, localOffsetHours=$localOffsetHours, longitude=$longitude, ownerId=$ownerId, projectionType=$projectionType, ratio=$ratio, stack=$stack, thumbhash=$thumbhash, visibility=$visibility)'; } - diff --git a/mobile/openapi/lib/model/time_buckets_response_dto.dart b/mobile/openapi/lib/model/time_buckets_response_dto.dart index 8b8da1d37a..c81b943989 100644 --- a/mobile/openapi/lib/model/time_buckets_response_dto.dart +++ b/mobile/openapi/lib/model/time_buckets_response_dto.dart @@ -1,112 +1,45 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TimeBucketsResponseDto { - /// Returns a new [TimeBucketsResponseDto] instance. - TimeBucketsResponseDto({ - required this.count, - required this.timeBucket, - }); +final class TimeBucketsResponseDto { + const TimeBucketsResponseDto({required this.count, required this.timeBucket}); /// Number of assets in this time bucket - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int count; + final int count; /// Time bucket identifier in YYYY-MM-DD format representing the start of the time period - String timeBucket; + final String timeBucket; - @override - bool operator ==(Object other) => identical(this, other) || other is TimeBucketsResponseDto && - other.count == count && - other.timeBucket == timeBucket; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (count.hashCode) + - (timeBucket.hashCode); - - @override - String toString() => 'TimeBucketsResponseDto[count=$count, timeBucket=$timeBucket]'; + static TimeBucketsResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(count: json[r'count'] as int, timeBucket: json[r'timeBucket'] as String); + } Map toJson() { final json = {}; - json[r'count'] = this.count; - json[r'timeBucket'] = this.timeBucket; + json[r'count'] = count; + json[r'timeBucket'] = timeBucket; return json; } - /// Returns a new [TimeBucketsResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TimeBucketsResponseDto? fromJson(dynamic value) { - upgradeDto(value, "TimeBucketsResponseDto"); - if (value is Map) { - final json = value.cast(); - - return TimeBucketsResponseDto( - count: mapValueOfType(json, r'count')!, - timeBucket: mapValueOfType(json, r'timeBucket')!, - ); - } - return null; + TimeBucketsResponseDto copyWith({int? count, String? timeBucket}) { + return .new(count: count ?? this.count, timeBucket: timeBucket ?? this.timeBucket); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TimeBucketsResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is TimeBucketsResponseDto && count == other.count && timeBucket == other.timeBucket); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TimeBucketsResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([count, timeBucket]); } - // maps a json object with a list of TimeBucketsResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TimeBucketsResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'count', - 'timeBucket', - }; + @override + String toString() => 'TimeBucketsResponseDto(count=$count, timeBucket=$timeBucket)'; } - diff --git a/mobile/openapi/lib/model/tone_mapping.dart b/mobile/openapi/lib/model/tone_mapping.dart index a1db2f5c9c..984aea50bb 100644 --- a/mobile/openapi/lib/model/tone_mapping.dart +++ b/mobile/openapi/lib/model/tone_mapping.dart @@ -1,91 +1,30 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Tone mapping -class ToneMapping { - /// Instantiate a new enum with the provided [value]. +enum ToneMapping { + hable._(r'hable'), + mobius._(r'mobius'), + reinhard._(r'reinhard'), + disabled._(r'disabled'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const ToneMapping._(this.value); - /// The underlying value of this enum member. final String value; + static ToneMapping? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const hable = ToneMapping._(r'hable'); - static const mobius = ToneMapping._(r'mobius'); - static const reinhard = ToneMapping._(r'reinhard'); - static const disabled = ToneMapping._(r'disabled'); - - /// List of all possible values in this [enum][ToneMapping]. - static const values = [ - hable, - mobius, - reinhard, - disabled, - ]; - - static ToneMapping? fromJson(dynamic value) => ToneMappingTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ToneMapping.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [ToneMapping] to String, -/// and [decode] dynamic data back to [ToneMapping]. -class ToneMappingTypeTransformer { - factory ToneMappingTypeTransformer() => _instance ??= const ToneMappingTypeTransformer._(); - - const ToneMappingTypeTransformer._(); - - String encode(ToneMapping data) => data.value; - - /// Decodes a [dynamic value][data] to a ToneMapping. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - ToneMapping? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'hable': return ToneMapping.hable; - case r'mobius': return ToneMapping.mobius; - case r'reinhard': return ToneMapping.reinhard; - case r'disabled': return ToneMapping.disabled; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [ToneMappingTypeTransformer] instance. - static ToneMappingTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/transcode_hw_accel.dart b/mobile/openapi/lib/model/transcode_hw_accel.dart index 22d20de320..bc0a7bb2be 100644 --- a/mobile/openapi/lib/model/transcode_hw_accel.dart +++ b/mobile/openapi/lib/model/transcode_hw_accel.dart @@ -1,94 +1,31 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Transcode hardware acceleration -class TranscodeHWAccel { - /// Instantiate a new enum with the provided [value]. - const TranscodeHWAccel._(this.value); +enum TranscodeHwAccel { + nvenc._(r'nvenc'), + qsv._(r'qsv'), + vaapi._(r'vaapi'), + rkmpp._(r'rkmpp'), + disabled._(r'disabled'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + + const TranscodeHwAccel._(this.value); - /// The underlying value of this enum member. final String value; + static TranscodeHwAccel? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const nvenc = TranscodeHWAccel._(r'nvenc'); - static const qsv = TranscodeHWAccel._(r'qsv'); - static const vaapi = TranscodeHWAccel._(r'vaapi'); - static const rkmpp = TranscodeHWAccel._(r'rkmpp'); - static const disabled = TranscodeHWAccel._(r'disabled'); - - /// List of all possible values in this [enum][TranscodeHWAccel]. - static const values = [ - nvenc, - qsv, - vaapi, - rkmpp, - disabled, - ]; - - static TranscodeHWAccel? fromJson(dynamic value) => TranscodeHWAccelTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TranscodeHWAccel.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [TranscodeHWAccel] to String, -/// and [decode] dynamic data back to [TranscodeHWAccel]. -class TranscodeHWAccelTypeTransformer { - factory TranscodeHWAccelTypeTransformer() => _instance ??= const TranscodeHWAccelTypeTransformer._(); - - const TranscodeHWAccelTypeTransformer._(); - - String encode(TranscodeHWAccel data) => data.value; - - /// Decodes a [dynamic value][data] to a TranscodeHWAccel. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - TranscodeHWAccel? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'nvenc': return TranscodeHWAccel.nvenc; - case r'qsv': return TranscodeHWAccel.qsv; - case r'vaapi': return TranscodeHWAccel.vaapi; - case r'rkmpp': return TranscodeHWAccel.rkmpp; - case r'disabled': return TranscodeHWAccel.disabled; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [TranscodeHWAccelTypeTransformer] instance. - static TranscodeHWAccelTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/transcode_policy.dart b/mobile/openapi/lib/model/transcode_policy.dart index ab3a876a93..95575b555c 100644 --- a/mobile/openapi/lib/model/transcode_policy.dart +++ b/mobile/openapi/lib/model/transcode_policy.dart @@ -1,94 +1,31 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Transcode policy -class TranscodePolicy { - /// Instantiate a new enum with the provided [value]. +enum TranscodePolicy { + all._(r'all'), + optimal._(r'optimal'), + bitrate._(r'bitrate'), + required._(r'required'), + disabled._(r'disabled'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const TranscodePolicy._(this.value); - /// The underlying value of this enum member. final String value; + static TranscodePolicy? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const all = TranscodePolicy._(r'all'); - static const optimal = TranscodePolicy._(r'optimal'); - static const bitrate = TranscodePolicy._(r'bitrate'); - static const required_ = TranscodePolicy._(r'required'); - static const disabled = TranscodePolicy._(r'disabled'); - - /// List of all possible values in this [enum][TranscodePolicy]. - static const values = [ - all, - optimal, - bitrate, - required_, - disabled, - ]; - - static TranscodePolicy? fromJson(dynamic value) => TranscodePolicyTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TranscodePolicy.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [TranscodePolicy] to String, -/// and [decode] dynamic data back to [TranscodePolicy]. -class TranscodePolicyTypeTransformer { - factory TranscodePolicyTypeTransformer() => _instance ??= const TranscodePolicyTypeTransformer._(); - - const TranscodePolicyTypeTransformer._(); - - String encode(TranscodePolicy data) => data.value; - - /// Decodes a [dynamic value][data] to a TranscodePolicy. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - TranscodePolicy? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'all': return TranscodePolicy.all; - case r'optimal': return TranscodePolicy.optimal; - case r'bitrate': return TranscodePolicy.bitrate; - case r'required': return TranscodePolicy.required_; - case r'disabled': return TranscodePolicy.disabled; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [TranscodePolicyTypeTransformer] instance. - static TranscodePolicyTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/trash_response_dto.dart b/mobile/openapi/lib/model/trash_response_dto.dart index 7b43d9ceb7..c8c79dd666 100644 --- a/mobile/openapi/lib/model/trash_response_dto.dart +++ b/mobile/openapi/lib/model/trash_response_dto.dart @@ -1,103 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class TrashResponseDto { - /// Returns a new [TrashResponseDto] instance. - TrashResponseDto({ - required this.count, - }); +final class TrashResponseDto { + const TrashResponseDto({required this.count}); /// Number of items in trash - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int count; + final int count; - @override - bool operator ==(Object other) => identical(this, other) || other is TrashResponseDto && - other.count == count; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (count.hashCode); - - @override - String toString() => 'TrashResponseDto[count=$count]'; + static TrashResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(count: json[r'count'] as int); + } Map toJson() { final json = {}; - json[r'count'] = this.count; + json[r'count'] = count; return json; } - /// Returns a new [TrashResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static TrashResponseDto? fromJson(dynamic value) { - upgradeDto(value, "TrashResponseDto"); - if (value is Map) { - final json = value.cast(); - - return TrashResponseDto( - count: mapValueOfType(json, r'count')!, - ); - } - return null; + TrashResponseDto copyWith({int? count}) { + return .new(count: count ?? this.count); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = TrashResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is TrashResponseDto && count == other.count); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = TrashResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([count]); } - // maps a json object with a list of TrashResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = TrashResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'count', - }; + @override + String toString() => 'TrashResponseDto(count=$count)'; } - diff --git a/mobile/openapi/lib/model/update_album_dto.dart b/mobile/openapi/lib/model/update_album_dto.dart index ae4a5c1f87..139cc7c814 100644 --- a/mobile/openapi/lib/model/update_album_dto.dart +++ b/mobile/openapi/lib/model/update_album_dto.dart @@ -1,180 +1,106 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UpdateAlbumDto { - /// Returns a new [UpdateAlbumDto] instance. - UpdateAlbumDto({ - this.albumName, - this.albumThumbnailAssetId, - this.description, - this.isActivityEnabled, - this.order, +final class UpdateAlbumDto { + const UpdateAlbumDto({ + this.albumName = const Optional.absent(), + this.albumThumbnailAssetId = const Optional.absent(), + this.description = const Optional.absent(), + this.isActivityEnabled = const Optional.absent(), + this.order = const Optional.absent(), }); /// Album name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? albumName; + final Optional albumName; /// Album thumbnail asset ID - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? albumThumbnailAssetId; + final Optional albumThumbnailAssetId; /// Album description - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? description; + final Optional description; /// Enable activity feed - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isActivityEnabled; + final Optional isActivityEnabled; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetOrder? order; + final Optional order; - @override - bool operator ==(Object other) => identical(this, other) || other is UpdateAlbumDto && - other.albumName == albumName && - other.albumThumbnailAssetId == albumThumbnailAssetId && - other.description == description && - other.isActivityEnabled == isActivityEnabled && - other.order == order; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albumName == null ? 0 : albumName!.hashCode) + - (albumThumbnailAssetId == null ? 0 : albumThumbnailAssetId!.hashCode) + - (description == null ? 0 : description!.hashCode) + - (isActivityEnabled == null ? 0 : isActivityEnabled!.hashCode) + - (order == null ? 0 : order!.hashCode); - - @override - String toString() => 'UpdateAlbumDto[albumName=$albumName, albumThumbnailAssetId=$albumThumbnailAssetId, description=$description, isActivityEnabled=$isActivityEnabled, order=$order]'; + static UpdateAlbumDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albumName: json.containsKey(r'albumName') + ? Optional.present(json[r'albumName'] as String) + : const Optional.absent(), + albumThumbnailAssetId: json.containsKey(r'albumThumbnailAssetId') + ? Optional.present(json[r'albumThumbnailAssetId'] as String) + : const Optional.absent(), + description: json.containsKey(r'description') + ? Optional.present(json[r'description'] as String) + : const Optional.absent(), + isActivityEnabled: json.containsKey(r'isActivityEnabled') + ? Optional.present(json[r'isActivityEnabled'] as bool) + : const Optional.absent(), + order: json.containsKey(r'order') + ? Optional.present((AssetOrder.fromJson(json[r'order']))!) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.albumName != null) { - json[r'albumName'] = this.albumName; - } else { - // json[r'albumName'] = null; + if (albumName case Present(:final value)) { + json[r'albumName'] = value; } - if (this.albumThumbnailAssetId != null) { - json[r'albumThumbnailAssetId'] = this.albumThumbnailAssetId; - } else { - // json[r'albumThumbnailAssetId'] = null; + if (albumThumbnailAssetId case Present(:final value)) { + json[r'albumThumbnailAssetId'] = value; } - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (description case Present(:final value)) { + json[r'description'] = value; } - if (this.isActivityEnabled != null) { - json[r'isActivityEnabled'] = this.isActivityEnabled; - } else { - // json[r'isActivityEnabled'] = null; + if (isActivityEnabled case Present(:final value)) { + json[r'isActivityEnabled'] = value; } - if (this.order != null) { - json[r'order'] = this.order; - } else { - // json[r'order'] = null; + if (order case Present(:final value)) { + json[r'order'] = value.toJson(); } return json; } - /// Returns a new [UpdateAlbumDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UpdateAlbumDto? fromJson(dynamic value) { - upgradeDto(value, "UpdateAlbumDto"); - if (value is Map) { - final json = value.cast(); - - return UpdateAlbumDto( - albumName: mapValueOfType(json, r'albumName'), - albumThumbnailAssetId: mapValueOfType(json, r'albumThumbnailAssetId'), - description: mapValueOfType(json, r'description'), - isActivityEnabled: mapValueOfType(json, r'isActivityEnabled'), - order: AssetOrder.fromJson(json[r'order']), - ); - } - return null; + UpdateAlbumDto copyWith({ + Optional? albumName, + Optional? albumThumbnailAssetId, + Optional? description, + Optional? isActivityEnabled, + Optional? order, + }) { + return .new( + albumName: albumName ?? this.albumName, + albumThumbnailAssetId: albumThumbnailAssetId ?? this.albumThumbnailAssetId, + description: description ?? this.description, + isActivityEnabled: isActivityEnabled ?? this.isActivityEnabled, + order: order ?? this.order, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UpdateAlbumDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UpdateAlbumDto && + albumName == other.albumName && + albumThumbnailAssetId == other.albumThumbnailAssetId && + description == other.description && + isActivityEnabled == other.isActivityEnabled && + order == other.order); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UpdateAlbumDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([albumName, albumThumbnailAssetId, description, isActivityEnabled, order]); } - // maps a json object with a list of UpdateAlbumDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UpdateAlbumDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'UpdateAlbumDto(albumName=$albumName, albumThumbnailAssetId=$albumThumbnailAssetId, description=$description, isActivityEnabled=$isActivityEnabled, order=$order)'; } - diff --git a/mobile/openapi/lib/model/update_album_user_dto.dart b/mobile/openapi/lib/model/update_album_user_dto.dart index 43218cae6e..1088d034a3 100644 --- a/mobile/openapi/lib/model/update_album_user_dto.dart +++ b/mobile/openapi/lib/model/update_album_user_dto.dart @@ -1,99 +1,39 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UpdateAlbumUserDto { - /// Returns a new [UpdateAlbumUserDto] instance. - UpdateAlbumUserDto({ - required this.role, - }); +final class UpdateAlbumUserDto { + const UpdateAlbumUserDto({required this.role}); - AlbumUserRole role; + final AlbumUserRole role; - @override - bool operator ==(Object other) => identical(this, other) || other is UpdateAlbumUserDto && - other.role == role; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (role.hashCode); - - @override - String toString() => 'UpdateAlbumUserDto[role=$role]'; + static UpdateAlbumUserDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(role: (AlbumUserRole.fromJson(json[r'role']))!); + } Map toJson() { final json = {}; - json[r'role'] = this.role; + json[r'role'] = role.toJson(); return json; } - /// Returns a new [UpdateAlbumUserDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UpdateAlbumUserDto? fromJson(dynamic value) { - upgradeDto(value, "UpdateAlbumUserDto"); - if (value is Map) { - final json = value.cast(); - - return UpdateAlbumUserDto( - role: AlbumUserRole.fromJson(json[r'role'])!, - ); - } - return null; + UpdateAlbumUserDto copyWith({AlbumUserRole? role}) { + return .new(role: role ?? this.role); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UpdateAlbumUserDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is UpdateAlbumUserDto && role == other.role); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UpdateAlbumUserDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([role]); } - // maps a json object with a list of UpdateAlbumUserDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UpdateAlbumUserDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'role', - }; + @override + String toString() => 'UpdateAlbumUserDto(role=$role)'; } - diff --git a/mobile/openapi/lib/model/update_asset_dto.dart b/mobile/openapi/lib/model/update_asset_dto.dart index 2c4c3352ea..ad5ef427c7 100644 --- a/mobile/openapi/lib/model/update_asset_dto.dart +++ b/mobile/openapi/lib/model/update_asset_dto.dart @@ -1,231 +1,157 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UpdateAssetDto { - /// Returns a new [UpdateAssetDto] instance. - UpdateAssetDto({ - this.dateTimeOriginal, - this.description, - this.isFavorite, - this.latitude, - this.livePhotoVideoId, - this.longitude, - this.rating, - this.visibility, +final class UpdateAssetDto { + const UpdateAssetDto({ + this.dateTimeOriginal = const Optional.absent(), + this.description = const Optional.absent(), + this.isFavorite = const Optional.absent(), + this.latitude = const Optional.absent(), + this.livePhotoVideoId = const Optional.absent(), + this.longitude = const Optional.absent(), + this.rating = const Optional.absent(), + this.visibility = const Optional.absent(), }); /// Original date and time - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? dateTimeOriginal; + final Optional dateTimeOriginal; /// Asset description - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? description; + final Optional description; /// Mark as favorite - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isFavorite; + final Optional isFavorite; /// Latitude coordinate - /// - /// Minimum value: -90 - /// Maximum value: 90 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - num? latitude; + final Optional latitude; /// Live photo video ID - String? livePhotoVideoId; + final Optional livePhotoVideoId; /// Longitude coordinate - /// - /// Minimum value: -180 - /// Maximum value: 180 - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - num? longitude; + final Optional longitude; /// Rating in range [1-5], or null for unrated - /// - /// Minimum value: -1 - /// Maximum value: 5 - int? rating; + /// Available since server v1.0.0. + final Optional rating; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AssetVisibility? visibility; + final Optional visibility; - @override - bool operator ==(Object other) => identical(this, other) || other is UpdateAssetDto && - other.dateTimeOriginal == dateTimeOriginal && - other.description == description && - other.isFavorite == isFavorite && - other.latitude == latitude && - other.livePhotoVideoId == livePhotoVideoId && - other.longitude == longitude && - other.rating == rating && - other.visibility == visibility; + static const ApiVersion ratingAddedIn = .new(1, 0, 0); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (dateTimeOriginal == null ? 0 : dateTimeOriginal!.hashCode) + - (description == null ? 0 : description!.hashCode) + - (isFavorite == null ? 0 : isFavorite!.hashCode) + - (latitude == null ? 0 : latitude!.hashCode) + - (livePhotoVideoId == null ? 0 : livePhotoVideoId!.hashCode) + - (longitude == null ? 0 : longitude!.hashCode) + - (rating == null ? 0 : rating!.hashCode) + - (visibility == null ? 0 : visibility!.hashCode); + static const ApiState ratingState = .stable; - @override - String toString() => 'UpdateAssetDto[dateTimeOriginal=$dateTimeOriginal, description=$description, isFavorite=$isFavorite, latitude=$latitude, livePhotoVideoId=$livePhotoVideoId, longitude=$longitude, rating=$rating, visibility=$visibility]'; + static UpdateAssetDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + dateTimeOriginal: json.containsKey(r'dateTimeOriginal') + ? Optional.present(json[r'dateTimeOriginal'] as String) + : const Optional.absent(), + description: json.containsKey(r'description') + ? Optional.present(json[r'description'] as String) + : const Optional.absent(), + isFavorite: json.containsKey(r'isFavorite') + ? Optional.present(json[r'isFavorite'] as bool) + : const Optional.absent(), + latitude: json.containsKey(r'latitude') + ? Optional.present((json[r'latitude'] as num).toDouble()) + : const Optional.absent(), + livePhotoVideoId: json.containsKey(r'livePhotoVideoId') + ? Optional.present((json[r'livePhotoVideoId'] as String?)) + : const Optional.absent(), + longitude: json.containsKey(r'longitude') + ? Optional.present((json[r'longitude'] as num).toDouble()) + : const Optional.absent(), + rating: json.containsKey(r'rating') ? Optional.present((json[r'rating'] as int?)) : const Optional.absent(), + visibility: json.containsKey(r'visibility') + ? Optional.present((AssetVisibility.fromJson(json[r'visibility']))!) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.dateTimeOriginal != null) { - json[r'dateTimeOriginal'] = this.dateTimeOriginal; - } else { - // json[r'dateTimeOriginal'] = null; + if (dateTimeOriginal case Present(:final value)) { + json[r'dateTimeOriginal'] = value; } - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (description case Present(:final value)) { + json[r'description'] = value; } - if (this.isFavorite != null) { - json[r'isFavorite'] = this.isFavorite; - } else { - // json[r'isFavorite'] = null; + if (isFavorite case Present(:final value)) { + json[r'isFavorite'] = value; } - if (this.latitude != null) { - json[r'latitude'] = this.latitude; - } else { - // json[r'latitude'] = null; + if (latitude case Present(:final value)) { + json[r'latitude'] = value; } - if (this.livePhotoVideoId != null) { - json[r'livePhotoVideoId'] = this.livePhotoVideoId; - } else { - // json[r'livePhotoVideoId'] = null; + if (livePhotoVideoId case Present(:final value)) { + json[r'livePhotoVideoId'] = value; } - if (this.longitude != null) { - json[r'longitude'] = this.longitude; - } else { - // json[r'longitude'] = null; + if (longitude case Present(:final value)) { + json[r'longitude'] = value; } - if (this.rating != null) { - json[r'rating'] = this.rating; - } else { - // json[r'rating'] = null; + if (rating case Present(:final value)) { + json[r'rating'] = value; } - if (this.visibility != null) { - json[r'visibility'] = this.visibility; - } else { - // json[r'visibility'] = null; + if (visibility case Present(:final value)) { + json[r'visibility'] = value.toJson(); } return json; } - /// Returns a new [UpdateAssetDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UpdateAssetDto? fromJson(dynamic value) { - upgradeDto(value, "UpdateAssetDto"); - if (value is Map) { - final json = value.cast(); - - return UpdateAssetDto( - dateTimeOriginal: mapValueOfType(json, r'dateTimeOriginal'), - description: mapValueOfType(json, r'description'), - isFavorite: mapValueOfType(json, r'isFavorite'), - latitude: num.parse('${json[r'latitude']}'), - livePhotoVideoId: mapValueOfType(json, r'livePhotoVideoId'), - longitude: num.parse('${json[r'longitude']}'), - rating: mapValueOfType(json, r'rating'), - visibility: AssetVisibility.fromJson(json[r'visibility']), - ); - } - return null; + UpdateAssetDto copyWith({ + Optional? dateTimeOriginal, + Optional? description, + Optional? isFavorite, + Optional? latitude, + Optional? livePhotoVideoId, + Optional? longitude, + Optional? rating, + Optional? visibility, + }) { + return .new( + dateTimeOriginal: dateTimeOriginal ?? this.dateTimeOriginal, + description: description ?? this.description, + isFavorite: isFavorite ?? this.isFavorite, + latitude: latitude ?? this.latitude, + livePhotoVideoId: livePhotoVideoId ?? this.livePhotoVideoId, + longitude: longitude ?? this.longitude, + rating: rating ?? this.rating, + visibility: visibility ?? this.visibility, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UpdateAssetDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UpdateAssetDto && + dateTimeOriginal == other.dateTimeOriginal && + description == other.description && + isFavorite == other.isFavorite && + latitude == other.latitude && + livePhotoVideoId == other.livePhotoVideoId && + longitude == other.longitude && + rating == other.rating && + visibility == other.visibility); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UpdateAssetDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + dateTimeOriginal, + description, + isFavorite, + latitude, + livePhotoVideoId, + longitude, + rating, + visibility, + ]); } - // maps a json object with a list of UpdateAssetDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UpdateAssetDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'UpdateAssetDto(dateTimeOriginal=$dateTimeOriginal, description=$description, isFavorite=$isFavorite, latitude=$latitude, livePhotoVideoId=$livePhotoVideoId, longitude=$longitude, rating=$rating, visibility=$visibility)'; } - diff --git a/mobile/openapi/lib/model/update_library_dto.dart b/mobile/openapi/lib/model/update_library_dto.dart index 276d43ecd9..fcb2c9b4e9 100644 --- a/mobile/openapi/lib/model/update_library_dto.dart +++ b/mobile/openapi/lib/model/update_library_dto.dart @@ -1,129 +1,80 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UpdateLibraryDto { - /// Returns a new [UpdateLibraryDto] instance. - UpdateLibraryDto({ - this.exclusionPatterns = const [], - this.importPaths = const [], - this.name, +final class UpdateLibraryDto { + const UpdateLibraryDto({ + this.exclusionPatterns = const Optional.absent(), + this.importPaths = const Optional.absent(), + this.name = const Optional.absent(), }); /// Exclusion patterns (max 128) - List exclusionPatterns; + final Optional> exclusionPatterns; /// Import paths (max 128) - List importPaths; + final Optional> importPaths; /// Library name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? name; + final Optional name; - @override - bool operator ==(Object other) => identical(this, other) || other is UpdateLibraryDto && - _deepEquality.equals(other.exclusionPatterns, exclusionPatterns) && - _deepEquality.equals(other.importPaths, importPaths) && - other.name == name; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (exclusionPatterns.hashCode) + - (importPaths.hashCode) + - (name == null ? 0 : name!.hashCode); - - @override - String toString() => 'UpdateLibraryDto[exclusionPatterns=$exclusionPatterns, importPaths=$importPaths, name=$name]'; + static UpdateLibraryDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + exclusionPatterns: json.containsKey(r'exclusionPatterns') + ? Optional.present( + ((json[r'exclusionPatterns'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ) + : const Optional.absent(), + importPaths: json.containsKey(r'importPaths') + ? Optional.present(((json[r'importPaths'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + name: json.containsKey(r'name') ? Optional.present(json[r'name'] as String) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'exclusionPatterns'] = this.exclusionPatterns; - json[r'importPaths'] = this.importPaths; - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (exclusionPatterns case Present(:final value)) { + json[r'exclusionPatterns'] = value; + } + if (importPaths case Present(:final value)) { + json[r'importPaths'] = value; + } + if (name case Present(:final value)) { + json[r'name'] = value; } return json; } - /// Returns a new [UpdateLibraryDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UpdateLibraryDto? fromJson(dynamic value) { - upgradeDto(value, "UpdateLibraryDto"); - if (value is Map) { - final json = value.cast(); - - return UpdateLibraryDto( - exclusionPatterns: json[r'exclusionPatterns'] is Iterable - ? (json[r'exclusionPatterns'] as Iterable).cast().toList(growable: false) - : const [], - importPaths: json[r'importPaths'] is Iterable - ? (json[r'importPaths'] as Iterable).cast().toList(growable: false) - : const [], - name: mapValueOfType(json, r'name'), - ); - } - return null; + UpdateLibraryDto copyWith({ + Optional>? exclusionPatterns, + Optional>? importPaths, + Optional? name, + }) { + return .new( + exclusionPatterns: exclusionPatterns ?? this.exclusionPatterns, + importPaths: importPaths ?? this.importPaths, + name: name ?? this.name, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UpdateLibraryDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UpdateLibraryDto && + exclusionPatterns == other.exclusionPatterns && + importPaths == other.importPaths && + name == other.name); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UpdateLibraryDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([exclusionPatterns, importPaths, name]); } - // maps a json object with a list of UpdateLibraryDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UpdateLibraryDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'UpdateLibraryDto(exclusionPatterns=$exclusionPatterns, importPaths=$importPaths, name=$name)'; } - diff --git a/mobile/openapi/lib/model/usage_by_user_dto.dart b/mobile/openapi/lib/model/usage_by_user_dto.dart index 462b82c3e0..69640c4463 100644 --- a/mobile/openapi/lib/model/usage_by_user_dto.dart +++ b/mobile/openapi/lib/model/usage_by_user_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UsageByUserDto { - /// Returns a new [UsageByUserDto] instance. - UsageByUserDto({ +final class UsageByUserDto { + const UsageByUserDto({ required this.photos, required this.quotaSizeInBytes, required this.usage, @@ -24,162 +15,104 @@ class UsageByUserDto { }); /// Number of photos - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int photos; + final int photos; /// User quota size in bytes (null if unlimited) - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int? quotaSizeInBytes; + final int? quotaSizeInBytes; /// Total storage usage in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int usage; + final int usage; /// Storage usage for photos in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int usagePhotos; + final int usagePhotos; /// Storage usage for videos in bytes - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int usageVideos; + final int usageVideos; /// User ID - String userId; + final String userId; /// User name - String userName; + final String userName; /// Number of videos - /// - /// Minimum value: -9007199254740991 - /// Maximum value: 9007199254740991 - int videos; + final int videos; - @override - bool operator ==(Object other) => identical(this, other) || other is UsageByUserDto && - other.photos == photos && - other.quotaSizeInBytes == quotaSizeInBytes && - other.usage == usage && - other.usagePhotos == usagePhotos && - other.usageVideos == usageVideos && - other.userId == userId && - other.userName == userName && - other.videos == videos; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (photos.hashCode) + - (quotaSizeInBytes == null ? 0 : quotaSizeInBytes!.hashCode) + - (usage.hashCode) + - (usagePhotos.hashCode) + - (usageVideos.hashCode) + - (userId.hashCode) + - (userName.hashCode) + - (videos.hashCode); - - @override - String toString() => 'UsageByUserDto[photos=$photos, quotaSizeInBytes=$quotaSizeInBytes, usage=$usage, usagePhotos=$usagePhotos, usageVideos=$usageVideos, userId=$userId, userName=$userName, videos=$videos]'; + static UsageByUserDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + photos: json[r'photos'] as int, + quotaSizeInBytes: (json[r'quotaSizeInBytes'] as int?), + usage: json[r'usage'] as int, + usagePhotos: json[r'usagePhotos'] as int, + usageVideos: json[r'usageVideos'] as int, + userId: json[r'userId'] as String, + userName: json[r'userName'] as String, + videos: json[r'videos'] as int, + ); + } Map toJson() { final json = {}; - json[r'photos'] = this.photos; - if (this.quotaSizeInBytes != null) { - json[r'quotaSizeInBytes'] = this.quotaSizeInBytes; - } else { - // json[r'quotaSizeInBytes'] = null; + json[r'photos'] = photos; + if (quotaSizeInBytes != null) { + json[r'quotaSizeInBytes'] = quotaSizeInBytes!; } - json[r'usage'] = this.usage; - json[r'usagePhotos'] = this.usagePhotos; - json[r'usageVideos'] = this.usageVideos; - json[r'userId'] = this.userId; - json[r'userName'] = this.userName; - json[r'videos'] = this.videos; + json[r'usage'] = usage; + json[r'usagePhotos'] = usagePhotos; + json[r'usageVideos'] = usageVideos; + json[r'userId'] = userId; + json[r'userName'] = userName; + json[r'videos'] = videos; return json; } - /// Returns a new [UsageByUserDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UsageByUserDto? fromJson(dynamic value) { - upgradeDto(value, "UsageByUserDto"); - if (value is Map) { - final json = value.cast(); - - return UsageByUserDto( - photos: mapValueOfType(json, r'photos')!, - quotaSizeInBytes: mapValueOfType(json, r'quotaSizeInBytes'), - usage: mapValueOfType(json, r'usage')!, - usagePhotos: mapValueOfType(json, r'usagePhotos')!, - usageVideos: mapValueOfType(json, r'usageVideos')!, - userId: mapValueOfType(json, r'userId')!, - userName: mapValueOfType(json, r'userName')!, - videos: mapValueOfType(json, r'videos')!, - ); - } - return null; + UsageByUserDto copyWith({ + int? photos, + Object? quotaSizeInBytes = _undefined, + int? usage, + int? usagePhotos, + int? usageVideos, + String? userId, + String? userName, + int? videos, + }) { + return .new( + photos: photos ?? this.photos, + quotaSizeInBytes: identical(quotaSizeInBytes, _undefined) ? this.quotaSizeInBytes : quotaSizeInBytes as int?, + usage: usage ?? this.usage, + usagePhotos: usagePhotos ?? this.usagePhotos, + usageVideos: usageVideos ?? this.usageVideos, + userId: userId ?? this.userId, + userName: userName ?? this.userName, + videos: videos ?? this.videos, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UsageByUserDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UsageByUserDto && + photos == other.photos && + quotaSizeInBytes == other.quotaSizeInBytes && + usage == other.usage && + usagePhotos == other.usagePhotos && + usageVideos == other.usageVideos && + userId == other.userId && + userName == other.userName && + videos == other.videos); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UsageByUserDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([photos, quotaSizeInBytes, usage, usagePhotos, usageVideos, userId, userName, videos]); } - // maps a json object with a list of UsageByUserDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UsageByUserDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'photos', - 'quotaSizeInBytes', - 'usage', - 'usagePhotos', - 'usageVideos', - 'userId', - 'userName', - 'videos', - }; + @override + String toString() => + 'UsageByUserDto(photos=$photos, quotaSizeInBytes=$quotaSizeInBytes, usage=$usage, usagePhotos=$usagePhotos, usageVideos=$usageVideos, userId=$userId, userName=$userName, videos=$videos)'; } - diff --git a/mobile/openapi/lib/model/user_admin_create_dto.dart b/mobile/openapi/lib/model/user_admin_create_dto.dart index 54da0b0566..04733a9c99 100644 --- a/mobile/openapi/lib/model/user_admin_create_dto.dart +++ b/mobile/openapi/lib/model/user_admin_create_dto.dart @@ -1,222 +1,164 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UserAdminCreateDto { - /// Returns a new [UserAdminCreateDto] instance. - UserAdminCreateDto({ - this.avatarColor, +final class UserAdminCreateDto { + const UserAdminCreateDto({ + this.avatarColor = const Optional.absent(), required this.email, - this.isAdmin, + this.isAdmin = const Optional.absent(), required this.name, - this.notify, + this.notify = const Optional.absent(), required this.password, - this.pinCode, - this.quotaSizeInBytes, - this.shouldChangePassword, - this.storageLabel, + this.pinCode = const Optional.absent(), + this.quotaSizeInBytes = const Optional.absent(), + this.shouldChangePassword = const Optional.absent(), + this.storageLabel = const Optional.absent(), }); - UserAvatarColor? avatarColor; + final Optional avatarColor; /// User email - String email; + final String email; /// Grant admin privileges - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isAdmin; + final Optional isAdmin; /// User name - String name; + final String name; /// Send notification email - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? notify; + final Optional notify; /// User password - String password; + final String password; /// PIN code - String? pinCode; + final Optional pinCode; /// Storage quota in bytes - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int? quotaSizeInBytes; + final Optional quotaSizeInBytes; /// Require password change on next login - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? shouldChangePassword; + final Optional shouldChangePassword; /// Storage label - String? storageLabel; + final Optional storageLabel; - @override - bool operator ==(Object other) => identical(this, other) || other is UserAdminCreateDto && - other.avatarColor == avatarColor && - other.email == email && - other.isAdmin == isAdmin && - other.name == name && - other.notify == notify && - other.password == password && - other.pinCode == pinCode && - other.quotaSizeInBytes == quotaSizeInBytes && - other.shouldChangePassword == shouldChangePassword && - other.storageLabel == storageLabel; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (avatarColor == null ? 0 : avatarColor!.hashCode) + - (email.hashCode) + - (isAdmin == null ? 0 : isAdmin!.hashCode) + - (name.hashCode) + - (notify == null ? 0 : notify!.hashCode) + - (password.hashCode) + - (pinCode == null ? 0 : pinCode!.hashCode) + - (quotaSizeInBytes == null ? 0 : quotaSizeInBytes!.hashCode) + - (shouldChangePassword == null ? 0 : shouldChangePassword!.hashCode) + - (storageLabel == null ? 0 : storageLabel!.hashCode); - - @override - String toString() => 'UserAdminCreateDto[avatarColor=$avatarColor, email=$email, isAdmin=$isAdmin, name=$name, notify=$notify, password=$password, pinCode=$pinCode, quotaSizeInBytes=$quotaSizeInBytes, shouldChangePassword=$shouldChangePassword, storageLabel=$storageLabel]'; + static UserAdminCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + avatarColor: json.containsKey(r'avatarColor') + ? Optional.present(UserAvatarColor.fromJson(json[r'avatarColor'])) + : const Optional.absent(), + email: json[r'email'] as String, + isAdmin: json.containsKey(r'isAdmin') ? Optional.present(json[r'isAdmin'] as bool) : const Optional.absent(), + name: json[r'name'] as String, + notify: json.containsKey(r'notify') ? Optional.present(json[r'notify'] as bool) : const Optional.absent(), + password: json[r'password'] as String, + pinCode: json.containsKey(r'pinCode') ? Optional.present((json[r'pinCode'] as String?)) : const Optional.absent(), + quotaSizeInBytes: json.containsKey(r'quotaSizeInBytes') + ? Optional.present((json[r'quotaSizeInBytes'] as int?)) + : const Optional.absent(), + shouldChangePassword: json.containsKey(r'shouldChangePassword') + ? Optional.present(json[r'shouldChangePassword'] as bool) + : const Optional.absent(), + storageLabel: json.containsKey(r'storageLabel') + ? Optional.present((json[r'storageLabel'] as String?)) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.avatarColor != null) { - json[r'avatarColor'] = this.avatarColor; - } else { - // json[r'avatarColor'] = null; + if (avatarColor case Present(:final value)) { + json[r'avatarColor'] = value?.toJson(); } - json[r'email'] = this.email; - if (this.isAdmin != null) { - json[r'isAdmin'] = this.isAdmin; - } else { - // json[r'isAdmin'] = null; + json[r'email'] = email; + if (isAdmin case Present(:final value)) { + json[r'isAdmin'] = value; } - json[r'name'] = this.name; - if (this.notify != null) { - json[r'notify'] = this.notify; - } else { - // json[r'notify'] = null; + json[r'name'] = name; + if (notify case Present(:final value)) { + json[r'notify'] = value; } - json[r'password'] = this.password; - if (this.pinCode != null) { - json[r'pinCode'] = this.pinCode; - } else { - // json[r'pinCode'] = null; + json[r'password'] = password; + if (pinCode case Present(:final value)) { + json[r'pinCode'] = value; } - if (this.quotaSizeInBytes != null) { - json[r'quotaSizeInBytes'] = this.quotaSizeInBytes; - } else { - // json[r'quotaSizeInBytes'] = null; + if (quotaSizeInBytes case Present(:final value)) { + json[r'quotaSizeInBytes'] = value; } - if (this.shouldChangePassword != null) { - json[r'shouldChangePassword'] = this.shouldChangePassword; - } else { - // json[r'shouldChangePassword'] = null; + if (shouldChangePassword case Present(:final value)) { + json[r'shouldChangePassword'] = value; } - if (this.storageLabel != null) { - json[r'storageLabel'] = this.storageLabel; - } else { - // json[r'storageLabel'] = null; + if (storageLabel case Present(:final value)) { + json[r'storageLabel'] = value; } return json; } - /// Returns a new [UserAdminCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UserAdminCreateDto? fromJson(dynamic value) { - upgradeDto(value, "UserAdminCreateDto"); - if (value is Map) { - final json = value.cast(); - - return UserAdminCreateDto( - avatarColor: UserAvatarColor.fromJson(json[r'avatarColor']), - email: mapValueOfType(json, r'email')!, - isAdmin: mapValueOfType(json, r'isAdmin'), - name: mapValueOfType(json, r'name')!, - notify: mapValueOfType(json, r'notify'), - password: mapValueOfType(json, r'password')!, - pinCode: mapValueOfType(json, r'pinCode'), - quotaSizeInBytes: mapValueOfType(json, r'quotaSizeInBytes'), - shouldChangePassword: mapValueOfType(json, r'shouldChangePassword'), - storageLabel: mapValueOfType(json, r'storageLabel'), - ); - } - return null; + UserAdminCreateDto copyWith({ + Optional? avatarColor, + String? email, + Optional? isAdmin, + String? name, + Optional? notify, + String? password, + Optional? pinCode, + Optional? quotaSizeInBytes, + Optional? shouldChangePassword, + Optional? storageLabel, + }) { + return .new( + avatarColor: avatarColor ?? this.avatarColor, + email: email ?? this.email, + isAdmin: isAdmin ?? this.isAdmin, + name: name ?? this.name, + notify: notify ?? this.notify, + password: password ?? this.password, + pinCode: pinCode ?? this.pinCode, + quotaSizeInBytes: quotaSizeInBytes ?? this.quotaSizeInBytes, + shouldChangePassword: shouldChangePassword ?? this.shouldChangePassword, + storageLabel: storageLabel ?? this.storageLabel, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserAdminCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UserAdminCreateDto && + avatarColor == other.avatarColor && + email == other.email && + isAdmin == other.isAdmin && + name == other.name && + notify == other.notify && + password == other.password && + pinCode == other.pinCode && + quotaSizeInBytes == other.quotaSizeInBytes && + shouldChangePassword == other.shouldChangePassword && + storageLabel == other.storageLabel); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UserAdminCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + avatarColor, + email, + isAdmin, + name, + notify, + password, + pinCode, + quotaSizeInBytes, + shouldChangePassword, + storageLabel, + ]); } - // maps a json object with a list of UserAdminCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UserAdminCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'email', - 'name', - 'password', - }; + @override + String toString() => + 'UserAdminCreateDto(avatarColor=$avatarColor, email=$email, isAdmin=$isAdmin, name=$name, notify=$notify, password=$password, pinCode=$pinCode, quotaSizeInBytes=$quotaSizeInBytes, shouldChangePassword=$shouldChangePassword, storageLabel=$storageLabel)'; } - diff --git a/mobile/openapi/lib/model/user_admin_delete_dto.dart b/mobile/openapi/lib/model/user_admin_delete_dto.dart index 6be70f37b7..aa03e422c3 100644 --- a/mobile/openapi/lib/model/user_admin_delete_dto.dart +++ b/mobile/openapi/lib/model/user_admin_delete_dto.dart @@ -1,109 +1,42 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UserAdminDeleteDto { - /// Returns a new [UserAdminDeleteDto] instance. - UserAdminDeleteDto({ - this.force, - }); +final class UserAdminDeleteDto { + const UserAdminDeleteDto({this.force = const Optional.absent()}); /// Force delete even if user has assets - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? force; + final Optional force; - @override - bool operator ==(Object other) => identical(this, other) || other is UserAdminDeleteDto && - other.force == force; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (force == null ? 0 : force!.hashCode); - - @override - String toString() => 'UserAdminDeleteDto[force=$force]'; + static UserAdminDeleteDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(force: json.containsKey(r'force') ? Optional.present(json[r'force'] as bool) : const Optional.absent()); + } Map toJson() { final json = {}; - if (this.force != null) { - json[r'force'] = this.force; - } else { - // json[r'force'] = null; + if (force case Present(:final value)) { + json[r'force'] = value; } return json; } - /// Returns a new [UserAdminDeleteDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UserAdminDeleteDto? fromJson(dynamic value) { - upgradeDto(value, "UserAdminDeleteDto"); - if (value is Map) { - final json = value.cast(); - - return UserAdminDeleteDto( - force: mapValueOfType(json, r'force'), - ); - } - return null; + UserAdminDeleteDto copyWith({Optional? force}) { + return .new(force: force ?? this.force); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserAdminDeleteDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is UserAdminDeleteDto && force == other.force); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UserAdminDeleteDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([force]); } - // maps a json object with a list of UserAdminDeleteDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UserAdminDeleteDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'UserAdminDeleteDto(force=$force)'; } - diff --git a/mobile/openapi/lib/model/user_admin_response_dto.dart b/mobile/openapi/lib/model/user_admin_response_dto.dart index 09f8cedce4..bfbccb4296 100644 --- a/mobile/openapi/lib/model/user_admin_response_dto.dart +++ b/mobile/openapi/lib/model/user_admin_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UserAdminResponseDto { - /// Returns a new [UserAdminResponseDto] instance. - UserAdminResponseDto({ +final class UserAdminResponseDto { + const UserAdminResponseDto({ required this.avatarColor, required this.createdAt, required this.deletedAt, @@ -32,242 +23,200 @@ class UserAdminResponseDto { required this.updatedAt, }); - UserAvatarColor avatarColor; + final UserAvatarColor avatarColor; /// Creation date - DateTime createdAt; + final DateTime createdAt; /// Deletion date - DateTime? deletedAt; + final DateTime? deletedAt; /// User email - String email; + final String email; /// User ID - String id; + final String id; /// Is admin user - bool isAdmin; + final bool isAdmin; - UserLicense? license; + final UserLicense? license; /// User name - String name; + final String name; /// OAuth ID - String oauthId; + final String oauthId; /// Profile change date - DateTime profileChangedAt; + final DateTime profileChangedAt; /// Profile image path - String profileImagePath; + final String profileImagePath; /// Storage quota in bytes - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int? quotaSizeInBytes; + final int? quotaSizeInBytes; /// Storage usage in bytes - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int? quotaUsageInBytes; + final int? quotaUsageInBytes; /// Require password change on next login - bool shouldChangePassword; + final bool shouldChangePassword; - UserStatus status; + final UserStatus status; /// Storage label - String? storageLabel; + final String? storageLabel; /// Last update date - DateTime updatedAt; + final DateTime updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is UserAdminResponseDto && - other.avatarColor == avatarColor && - other.createdAt == createdAt && - other.deletedAt == deletedAt && - other.email == email && - other.id == id && - other.isAdmin == isAdmin && - other.license == license && - other.name == name && - other.oauthId == oauthId && - other.profileChangedAt == profileChangedAt && - other.profileImagePath == profileImagePath && - other.quotaSizeInBytes == quotaSizeInBytes && - other.quotaUsageInBytes == quotaUsageInBytes && - other.shouldChangePassword == shouldChangePassword && - other.status == status && - other.storageLabel == storageLabel && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (avatarColor.hashCode) + - (createdAt.hashCode) + - (deletedAt == null ? 0 : deletedAt!.hashCode) + - (email.hashCode) + - (id.hashCode) + - (isAdmin.hashCode) + - (license == null ? 0 : license!.hashCode) + - (name.hashCode) + - (oauthId.hashCode) + - (profileChangedAt.hashCode) + - (profileImagePath.hashCode) + - (quotaSizeInBytes == null ? 0 : quotaSizeInBytes!.hashCode) + - (quotaUsageInBytes == null ? 0 : quotaUsageInBytes!.hashCode) + - (shouldChangePassword.hashCode) + - (status.hashCode) + - (storageLabel == null ? 0 : storageLabel!.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'UserAdminResponseDto[avatarColor=$avatarColor, createdAt=$createdAt, deletedAt=$deletedAt, email=$email, id=$id, isAdmin=$isAdmin, license=$license, name=$name, oauthId=$oauthId, profileChangedAt=$profileChangedAt, profileImagePath=$profileImagePath, quotaSizeInBytes=$quotaSizeInBytes, quotaUsageInBytes=$quotaUsageInBytes, shouldChangePassword=$shouldChangePassword, status=$status, storageLabel=$storageLabel, updatedAt=$updatedAt]'; + static UserAdminResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + avatarColor: (UserAvatarColor.fromJson(json[r'avatarColor']))!, + createdAt: DateTime.parse(json[r'createdAt'] as String), + deletedAt: (json[r'deletedAt'] == null ? null : DateTime.parse(json[r'deletedAt'] as String)), + email: json[r'email'] as String, + id: json[r'id'] as String, + isAdmin: json[r'isAdmin'] as bool, + license: UserLicense.fromJson(json[r'license']), + name: json[r'name'] as String, + oauthId: json[r'oauthId'] as String, + profileChangedAt: DateTime.parse(json[r'profileChangedAt'] as String), + profileImagePath: json[r'profileImagePath'] as String, + quotaSizeInBytes: (json[r'quotaSizeInBytes'] as int?), + quotaUsageInBytes: (json[r'quotaUsageInBytes'] as int?), + shouldChangePassword: json[r'shouldChangePassword'] as bool, + status: (UserStatus.fromJson(json[r'status']))!, + storageLabel: (json[r'storageLabel'] as String?), + updatedAt: DateTime.parse(json[r'updatedAt'] as String), + ); + } Map toJson() { final json = {}; - json[r'avatarColor'] = this.avatarColor; - json[r'createdAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.createdAt.millisecondsSinceEpoch - : this.createdAt.toUtc().toIso8601String(); - if (this.deletedAt != null) { - json[r'deletedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.deletedAt!.millisecondsSinceEpoch - : this.deletedAt!.toUtc().toIso8601String(); - } else { - // json[r'deletedAt'] = null; + json[r'avatarColor'] = avatarColor.toJson(); + json[r'createdAt'] = createdAt.toUtc().toIso8601String(); + if (deletedAt != null) { + json[r'deletedAt'] = deletedAt!.toUtc().toIso8601String(); } - json[r'email'] = this.email; - json[r'id'] = this.id; - json[r'isAdmin'] = this.isAdmin; - if (this.license != null) { - json[r'license'] = this.license; - } else { - // json[r'license'] = null; + json[r'email'] = email; + json[r'id'] = id; + json[r'isAdmin'] = isAdmin; + if (license != null) { + json[r'license'] = license!.toJson(); } - json[r'name'] = this.name; - json[r'oauthId'] = this.oauthId; - json[r'profileChangedAt'] = this.profileChangedAt.toUtc().toIso8601String(); - json[r'profileImagePath'] = this.profileImagePath; - if (this.quotaSizeInBytes != null) { - json[r'quotaSizeInBytes'] = this.quotaSizeInBytes; - } else { - // json[r'quotaSizeInBytes'] = null; + json[r'name'] = name; + json[r'oauthId'] = oauthId; + json[r'profileChangedAt'] = profileChangedAt.toUtc().toIso8601String(); + json[r'profileImagePath'] = profileImagePath; + if (quotaSizeInBytes != null) { + json[r'quotaSizeInBytes'] = quotaSizeInBytes!; } - if (this.quotaUsageInBytes != null) { - json[r'quotaUsageInBytes'] = this.quotaUsageInBytes; - } else { - // json[r'quotaUsageInBytes'] = null; + if (quotaUsageInBytes != null) { + json[r'quotaUsageInBytes'] = quotaUsageInBytes!; } - json[r'shouldChangePassword'] = this.shouldChangePassword; - json[r'status'] = this.status; - if (this.storageLabel != null) { - json[r'storageLabel'] = this.storageLabel; - } else { - // json[r'storageLabel'] = null; + json[r'shouldChangePassword'] = shouldChangePassword; + json[r'status'] = status.toJson(); + if (storageLabel != null) { + json[r'storageLabel'] = storageLabel!; } - json[r'updatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.updatedAt.millisecondsSinceEpoch - : this.updatedAt.toUtc().toIso8601String(); + json[r'updatedAt'] = updatedAt.toUtc().toIso8601String(); return json; } - /// Returns a new [UserAdminResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UserAdminResponseDto? fromJson(dynamic value) { - upgradeDto(value, "UserAdminResponseDto"); - if (value is Map) { - final json = value.cast(); - - return UserAdminResponseDto( - avatarColor: UserAvatarColor.fromJson(json[r'avatarColor'])!, - createdAt: mapDateTime(json, r'createdAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - deletedAt: mapDateTime(json, r'deletedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/'), - email: mapValueOfType(json, r'email')!, - id: mapValueOfType(json, r'id')!, - isAdmin: mapValueOfType(json, r'isAdmin')!, - license: UserLicense.fromJson(json[r'license']), - name: mapValueOfType(json, r'name')!, - oauthId: mapValueOfType(json, r'oauthId')!, - profileChangedAt: mapDateTime(json, r'profileChangedAt', r'')!, - profileImagePath: mapValueOfType(json, r'profileImagePath')!, - quotaSizeInBytes: mapValueOfType(json, r'quotaSizeInBytes'), - quotaUsageInBytes: mapValueOfType(json, r'quotaUsageInBytes'), - shouldChangePassword: mapValueOfType(json, r'shouldChangePassword')!, - status: UserStatus.fromJson(json[r'status'])!, - storageLabel: mapValueOfType(json, r'storageLabel'), - updatedAt: mapDateTime(json, r'updatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - ); - } - return null; + UserAdminResponseDto copyWith({ + UserAvatarColor? avatarColor, + DateTime? createdAt, + Object? deletedAt = _undefined, + String? email, + String? id, + bool? isAdmin, + Object? license = _undefined, + String? name, + String? oauthId, + DateTime? profileChangedAt, + String? profileImagePath, + Object? quotaSizeInBytes = _undefined, + Object? quotaUsageInBytes = _undefined, + bool? shouldChangePassword, + UserStatus? status, + Object? storageLabel = _undefined, + DateTime? updatedAt, + }) { + return .new( + avatarColor: avatarColor ?? this.avatarColor, + createdAt: createdAt ?? this.createdAt, + deletedAt: identical(deletedAt, _undefined) ? this.deletedAt : deletedAt as DateTime?, + email: email ?? this.email, + id: id ?? this.id, + isAdmin: isAdmin ?? this.isAdmin, + license: identical(license, _undefined) ? this.license : license as UserLicense?, + name: name ?? this.name, + oauthId: oauthId ?? this.oauthId, + profileChangedAt: profileChangedAt ?? this.profileChangedAt, + profileImagePath: profileImagePath ?? this.profileImagePath, + quotaSizeInBytes: identical(quotaSizeInBytes, _undefined) ? this.quotaSizeInBytes : quotaSizeInBytes as int?, + quotaUsageInBytes: identical(quotaUsageInBytes, _undefined) ? this.quotaUsageInBytes : quotaUsageInBytes as int?, + shouldChangePassword: shouldChangePassword ?? this.shouldChangePassword, + status: status ?? this.status, + storageLabel: identical(storageLabel, _undefined) ? this.storageLabel : storageLabel as String?, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserAdminResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UserAdminResponseDto && + avatarColor == other.avatarColor && + createdAt == other.createdAt && + deletedAt == other.deletedAt && + email == other.email && + id == other.id && + isAdmin == other.isAdmin && + license == other.license && + name == other.name && + oauthId == other.oauthId && + profileChangedAt == other.profileChangedAt && + profileImagePath == other.profileImagePath && + quotaSizeInBytes == other.quotaSizeInBytes && + quotaUsageInBytes == other.quotaUsageInBytes && + shouldChangePassword == other.shouldChangePassword && + status == other.status && + storageLabel == other.storageLabel && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UserAdminResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + avatarColor, + createdAt, + deletedAt, + email, + id, + isAdmin, + license, + name, + oauthId, + profileChangedAt, + profileImagePath, + quotaSizeInBytes, + quotaUsageInBytes, + shouldChangePassword, + status, + storageLabel, + updatedAt, + ]); } - // maps a json object with a list of UserAdminResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UserAdminResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'avatarColor', - 'createdAt', - 'deletedAt', - 'email', - 'id', - 'isAdmin', - 'license', - 'name', - 'oauthId', - 'profileChangedAt', - 'profileImagePath', - 'quotaSizeInBytes', - 'quotaUsageInBytes', - 'shouldChangePassword', - 'status', - 'storageLabel', - 'updatedAt', - }; + @override + String toString() => + 'UserAdminResponseDto(avatarColor=$avatarColor, createdAt=$createdAt, deletedAt=$deletedAt, email=$email, id=$id, isAdmin=$isAdmin, license=$license, name=$name, oauthId=$oauthId, profileChangedAt=$profileChangedAt, profileImagePath=$profileImagePath, quotaSizeInBytes=$quotaSizeInBytes, quotaUsageInBytes=$quotaUsageInBytes, shouldChangePassword=$shouldChangePassword, status=$status, storageLabel=$storageLabel, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/user_admin_update_dto.dart b/mobile/openapi/lib/model/user_admin_update_dto.dart index 0c33a46139..da66c36429 100644 --- a/mobile/openapi/lib/model/user_admin_update_dto.dart +++ b/mobile/openapi/lib/model/user_admin_update_dto.dart @@ -1,231 +1,158 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UserAdminUpdateDto { - /// Returns a new [UserAdminUpdateDto] instance. - UserAdminUpdateDto({ - this.avatarColor, - this.email, - this.isAdmin, - this.name, - this.password, - this.pinCode, - this.quotaSizeInBytes, - this.shouldChangePassword, - this.storageLabel, +final class UserAdminUpdateDto { + const UserAdminUpdateDto({ + this.avatarColor = const Optional.absent(), + this.email = const Optional.absent(), + this.isAdmin = const Optional.absent(), + this.name = const Optional.absent(), + this.password = const Optional.absent(), + this.pinCode = const Optional.absent(), + this.quotaSizeInBytes = const Optional.absent(), + this.shouldChangePassword = const Optional.absent(), + this.storageLabel = const Optional.absent(), }); - UserAvatarColor? avatarColor; + final Optional avatarColor; /// User email - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? email; + final Optional email; /// Grant admin privileges - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isAdmin; + final Optional isAdmin; /// User name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? name; + final Optional name; /// User password - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? password; + final Optional password; /// PIN code - String? pinCode; + final Optional pinCode; /// Storage quota in bytes - /// - /// Minimum value: 0 - /// Maximum value: 9007199254740991 - int? quotaSizeInBytes; + final Optional quotaSizeInBytes; /// Require password change on next login - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? shouldChangePassword; + final Optional shouldChangePassword; /// Storage label - String? storageLabel; + final Optional storageLabel; - @override - bool operator ==(Object other) => identical(this, other) || other is UserAdminUpdateDto && - other.avatarColor == avatarColor && - other.email == email && - other.isAdmin == isAdmin && - other.name == name && - other.password == password && - other.pinCode == pinCode && - other.quotaSizeInBytes == quotaSizeInBytes && - other.shouldChangePassword == shouldChangePassword && - other.storageLabel == storageLabel; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (avatarColor == null ? 0 : avatarColor!.hashCode) + - (email == null ? 0 : email!.hashCode) + - (isAdmin == null ? 0 : isAdmin!.hashCode) + - (name == null ? 0 : name!.hashCode) + - (password == null ? 0 : password!.hashCode) + - (pinCode == null ? 0 : pinCode!.hashCode) + - (quotaSizeInBytes == null ? 0 : quotaSizeInBytes!.hashCode) + - (shouldChangePassword == null ? 0 : shouldChangePassword!.hashCode) + - (storageLabel == null ? 0 : storageLabel!.hashCode); - - @override - String toString() => 'UserAdminUpdateDto[avatarColor=$avatarColor, email=$email, isAdmin=$isAdmin, name=$name, password=$password, pinCode=$pinCode, quotaSizeInBytes=$quotaSizeInBytes, shouldChangePassword=$shouldChangePassword, storageLabel=$storageLabel]'; + static UserAdminUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + avatarColor: json.containsKey(r'avatarColor') + ? Optional.present(UserAvatarColor.fromJson(json[r'avatarColor'])) + : const Optional.absent(), + email: json.containsKey(r'email') ? Optional.present(json[r'email'] as String) : const Optional.absent(), + isAdmin: json.containsKey(r'isAdmin') ? Optional.present(json[r'isAdmin'] as bool) : const Optional.absent(), + name: json.containsKey(r'name') ? Optional.present(json[r'name'] as String) : const Optional.absent(), + password: json.containsKey(r'password') ? Optional.present(json[r'password'] as String) : const Optional.absent(), + pinCode: json.containsKey(r'pinCode') ? Optional.present((json[r'pinCode'] as String?)) : const Optional.absent(), + quotaSizeInBytes: json.containsKey(r'quotaSizeInBytes') + ? Optional.present((json[r'quotaSizeInBytes'] as int?)) + : const Optional.absent(), + shouldChangePassword: json.containsKey(r'shouldChangePassword') + ? Optional.present(json[r'shouldChangePassword'] as bool) + : const Optional.absent(), + storageLabel: json.containsKey(r'storageLabel') + ? Optional.present((json[r'storageLabel'] as String?)) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.avatarColor != null) { - json[r'avatarColor'] = this.avatarColor; - } else { - // json[r'avatarColor'] = null; + if (avatarColor case Present(:final value)) { + json[r'avatarColor'] = value?.toJson(); } - if (this.email != null) { - json[r'email'] = this.email; - } else { - // json[r'email'] = null; + if (email case Present(:final value)) { + json[r'email'] = value; } - if (this.isAdmin != null) { - json[r'isAdmin'] = this.isAdmin; - } else { - // json[r'isAdmin'] = null; + if (isAdmin case Present(:final value)) { + json[r'isAdmin'] = value; } - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (name case Present(:final value)) { + json[r'name'] = value; } - if (this.password != null) { - json[r'password'] = this.password; - } else { - // json[r'password'] = null; + if (password case Present(:final value)) { + json[r'password'] = value; } - if (this.pinCode != null) { - json[r'pinCode'] = this.pinCode; - } else { - // json[r'pinCode'] = null; + if (pinCode case Present(:final value)) { + json[r'pinCode'] = value; } - if (this.quotaSizeInBytes != null) { - json[r'quotaSizeInBytes'] = this.quotaSizeInBytes; - } else { - // json[r'quotaSizeInBytes'] = null; + if (quotaSizeInBytes case Present(:final value)) { + json[r'quotaSizeInBytes'] = value; } - if (this.shouldChangePassword != null) { - json[r'shouldChangePassword'] = this.shouldChangePassword; - } else { - // json[r'shouldChangePassword'] = null; + if (shouldChangePassword case Present(:final value)) { + json[r'shouldChangePassword'] = value; } - if (this.storageLabel != null) { - json[r'storageLabel'] = this.storageLabel; - } else { - // json[r'storageLabel'] = null; + if (storageLabel case Present(:final value)) { + json[r'storageLabel'] = value; } return json; } - /// Returns a new [UserAdminUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UserAdminUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "UserAdminUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return UserAdminUpdateDto( - avatarColor: UserAvatarColor.fromJson(json[r'avatarColor']), - email: mapValueOfType(json, r'email'), - isAdmin: mapValueOfType(json, r'isAdmin'), - name: mapValueOfType(json, r'name'), - password: mapValueOfType(json, r'password'), - pinCode: mapValueOfType(json, r'pinCode'), - quotaSizeInBytes: mapValueOfType(json, r'quotaSizeInBytes'), - shouldChangePassword: mapValueOfType(json, r'shouldChangePassword'), - storageLabel: mapValueOfType(json, r'storageLabel'), - ); - } - return null; + UserAdminUpdateDto copyWith({ + Optional? avatarColor, + Optional? email, + Optional? isAdmin, + Optional? name, + Optional? password, + Optional? pinCode, + Optional? quotaSizeInBytes, + Optional? shouldChangePassword, + Optional? storageLabel, + }) { + return .new( + avatarColor: avatarColor ?? this.avatarColor, + email: email ?? this.email, + isAdmin: isAdmin ?? this.isAdmin, + name: name ?? this.name, + password: password ?? this.password, + pinCode: pinCode ?? this.pinCode, + quotaSizeInBytes: quotaSizeInBytes ?? this.quotaSizeInBytes, + shouldChangePassword: shouldChangePassword ?? this.shouldChangePassword, + storageLabel: storageLabel ?? this.storageLabel, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserAdminUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UserAdminUpdateDto && + avatarColor == other.avatarColor && + email == other.email && + isAdmin == other.isAdmin && + name == other.name && + password == other.password && + pinCode == other.pinCode && + quotaSizeInBytes == other.quotaSizeInBytes && + shouldChangePassword == other.shouldChangePassword && + storageLabel == other.storageLabel); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UserAdminUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + avatarColor, + email, + isAdmin, + name, + password, + pinCode, + quotaSizeInBytes, + shouldChangePassword, + storageLabel, + ]); } - // maps a json object with a list of UserAdminUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UserAdminUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'UserAdminUpdateDto(avatarColor=$avatarColor, email=$email, isAdmin=$isAdmin, name=$name, password=$password, pinCode=$pinCode, quotaSizeInBytes=$quotaSizeInBytes, shouldChangePassword=$shouldChangePassword, storageLabel=$storageLabel)'; } - diff --git a/mobile/openapi/lib/model/user_avatar_color.dart b/mobile/openapi/lib/model/user_avatar_color.dart index 719e366899..94a9a106a1 100644 --- a/mobile/openapi/lib/model/user_avatar_color.dart +++ b/mobile/openapi/lib/model/user_avatar_color.dart @@ -1,109 +1,36 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// User avatar color -class UserAvatarColor { - /// Instantiate a new enum with the provided [value]. +enum UserAvatarColor { + primary._(r'primary'), + pink._(r'pink'), + red._(r'red'), + yellow._(r'yellow'), + blue._(r'blue'), + green._(r'green'), + purple._(r'purple'), + orange._(r'orange'), + gray._(r'gray'), + amber._(r'amber'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const UserAvatarColor._(this.value); - /// The underlying value of this enum member. final String value; + static UserAvatarColor? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const primary = UserAvatarColor._(r'primary'); - static const pink = UserAvatarColor._(r'pink'); - static const red = UserAvatarColor._(r'red'); - static const yellow = UserAvatarColor._(r'yellow'); - static const blue = UserAvatarColor._(r'blue'); - static const green = UserAvatarColor._(r'green'); - static const purple = UserAvatarColor._(r'purple'); - static const orange = UserAvatarColor._(r'orange'); - static const gray = UserAvatarColor._(r'gray'); - static const amber = UserAvatarColor._(r'amber'); - - /// List of all possible values in this [enum][UserAvatarColor]. - static const values = [ - primary, - pink, - red, - yellow, - blue, - green, - purple, - orange, - gray, - amber, - ]; - - static UserAvatarColor? fromJson(dynamic value) => UserAvatarColorTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserAvatarColor.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [UserAvatarColor] to String, -/// and [decode] dynamic data back to [UserAvatarColor]. -class UserAvatarColorTypeTransformer { - factory UserAvatarColorTypeTransformer() => _instance ??= const UserAvatarColorTypeTransformer._(); - - const UserAvatarColorTypeTransformer._(); - - String encode(UserAvatarColor data) => data.value; - - /// Decodes a [dynamic value][data] to a UserAvatarColor. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - UserAvatarColor? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'primary': return UserAvatarColor.primary; - case r'pink': return UserAvatarColor.pink; - case r'red': return UserAvatarColor.red; - case r'yellow': return UserAvatarColor.yellow; - case r'blue': return UserAvatarColor.blue; - case r'green': return UserAvatarColor.green; - case r'purple': return UserAvatarColor.purple; - case r'orange': return UserAvatarColor.orange; - case r'gray': return UserAvatarColor.gray; - case r'amber': return UserAvatarColor.amber; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [UserAvatarColorTypeTransformer] instance. - static UserAvatarColorTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/user_license.dart b/mobile/openapi/lib/model/user_license.dart index 8ef46a0bb5..a3ca633689 100644 --- a/mobile/openapi/lib/model/user_license.dart +++ b/mobile/openapi/lib/model/user_license.dart @@ -1,120 +1,60 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UserLicense { - /// Returns a new [UserLicense] instance. - UserLicense({ - required this.activatedAt, - required this.activationKey, - required this.licenseKey, - }); +final class UserLicense { + const UserLicense({required this.activatedAt, required this.activationKey, required this.licenseKey}); /// Activation date - DateTime activatedAt; + final DateTime activatedAt; /// Activation key - String activationKey; + final String activationKey; - /// License key (format: /^IM(SV|CL)(-[\\dA-Za-z]{4}){8}$/) - String licenseKey; + /// License key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/) + final String licenseKey; - @override - bool operator ==(Object other) => identical(this, other) || other is UserLicense && - other.activatedAt == activatedAt && - other.activationKey == activationKey && - other.licenseKey == licenseKey; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (activatedAt.hashCode) + - (activationKey.hashCode) + - (licenseKey.hashCode); - - @override - String toString() => 'UserLicense[activatedAt=$activatedAt, activationKey=$activationKey, licenseKey=$licenseKey]'; + static UserLicense? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + activatedAt: DateTime.parse(json[r'activatedAt'] as String), + activationKey: json[r'activationKey'] as String, + licenseKey: json[r'licenseKey'] as String, + ); + } Map toJson() { final json = {}; - json[r'activatedAt'] = _isEpochMarker(r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/') - ? this.activatedAt.millisecondsSinceEpoch - : this.activatedAt.toUtc().toIso8601String(); - json[r'activationKey'] = this.activationKey; - json[r'licenseKey'] = this.licenseKey; + json[r'activatedAt'] = activatedAt.toUtc().toIso8601String(); + json[r'activationKey'] = activationKey; + json[r'licenseKey'] = licenseKey; return json; } - /// Returns a new [UserLicense] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UserLicense? fromJson(dynamic value) { - upgradeDto(value, "UserLicense"); - if (value is Map) { - final json = value.cast(); - - return UserLicense( - activatedAt: mapDateTime(json, r'activatedAt', r'/^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$/')!, - activationKey: mapValueOfType(json, r'activationKey')!, - licenseKey: mapValueOfType(json, r'licenseKey')!, - ); - } - return null; + UserLicense copyWith({DateTime? activatedAt, String? activationKey, String? licenseKey}) { + return .new( + activatedAt: activatedAt ?? this.activatedAt, + activationKey: activationKey ?? this.activationKey, + licenseKey: licenseKey ?? this.licenseKey, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserLicense.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UserLicense && + activatedAt == other.activatedAt && + activationKey == other.activationKey && + licenseKey == other.licenseKey); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UserLicense.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([activatedAt, activationKey, licenseKey]); } - // maps a json object with a list of UserLicense-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UserLicense.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'activatedAt', - 'activationKey', - 'licenseKey', - }; + @override + String toString() => 'UserLicense(activatedAt=$activatedAt, activationKey=$activationKey, licenseKey=$licenseKey)'; } - diff --git a/mobile/openapi/lib/model/user_metadata_key.dart b/mobile/openapi/lib/model/user_metadata_key.dart index 2b4c11a73d..9d7f00e60e 100644 --- a/mobile/openapi/lib/model/user_metadata_key.dart +++ b/mobile/openapi/lib/model/user_metadata_key.dart @@ -1,88 +1,29 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// User metadata key -class UserMetadataKey { - /// Instantiate a new enum with the provided [value]. +enum UserMetadataKey { + preferences._(r'preferences'), + license._(r'license'), + onboarding._(r'onboarding'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const UserMetadataKey._(this.value); - /// The underlying value of this enum member. final String value; + static UserMetadataKey? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const preferences = UserMetadataKey._(r'preferences'); - static const license = UserMetadataKey._(r'license'); - static const onboarding = UserMetadataKey._(r'onboarding'); - - /// List of all possible values in this [enum][UserMetadataKey]. - static const values = [ - preferences, - license, - onboarding, - ]; - - static UserMetadataKey? fromJson(dynamic value) => UserMetadataKeyTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserMetadataKey.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [UserMetadataKey] to String, -/// and [decode] dynamic data back to [UserMetadataKey]. -class UserMetadataKeyTypeTransformer { - factory UserMetadataKeyTypeTransformer() => _instance ??= const UserMetadataKeyTypeTransformer._(); - - const UserMetadataKeyTypeTransformer._(); - - String encode(UserMetadataKey data) => data.value; - - /// Decodes a [dynamic value][data] to a UserMetadataKey. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - UserMetadataKey? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'preferences': return UserMetadataKey.preferences; - case r'license': return UserMetadataKey.license; - case r'onboarding': return UserMetadataKey.onboarding; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [UserMetadataKeyTypeTransformer] instance. - static UserMetadataKeyTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/user_preferences_response_dto.dart b/mobile/openapi/lib/model/user_preferences_response_dto.dart index 7a6e0252af..96c43c1008 100644 --- a/mobile/openapi/lib/model/user_preferences_response_dto.dart +++ b/mobile/openapi/lib/model/user_preferences_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UserPreferencesResponseDto { - /// Returns a new [UserPreferencesResponseDto] instance. - UserPreferencesResponseDto({ +final class UserPreferencesResponseDto { + const UserPreferencesResponseDto({ required this.albums, required this.cast, required this.download, @@ -26,154 +17,126 @@ class UserPreferencesResponseDto { required this.tags, }); - AlbumsResponse albums; + final AlbumsResponse albums; - CastResponse cast; + final CastResponse cast; - DownloadResponse download; + final DownloadResponse download; - EmailNotificationsResponse emailNotifications; + final EmailNotificationsResponse emailNotifications; - FoldersResponse folders; + final FoldersResponse folders; - MemoriesResponse memories; + final MemoriesResponse memories; - PeopleResponse people; + final PeopleResponse people; - PurchaseResponse purchase; + final PurchaseResponse purchase; - RatingsResponse ratings; + final RatingsResponse ratings; - SharedLinksResponse sharedLinks; + final SharedLinksResponse sharedLinks; - TagsResponse tags; + final TagsResponse tags; - @override - bool operator ==(Object other) => identical(this, other) || other is UserPreferencesResponseDto && - other.albums == albums && - other.cast == cast && - other.download == download && - other.emailNotifications == emailNotifications && - other.folders == folders && - other.memories == memories && - other.people == people && - other.purchase == purchase && - other.ratings == ratings && - other.sharedLinks == sharedLinks && - other.tags == tags; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albums.hashCode) + - (cast.hashCode) + - (download.hashCode) + - (emailNotifications.hashCode) + - (folders.hashCode) + - (memories.hashCode) + - (people.hashCode) + - (purchase.hashCode) + - (ratings.hashCode) + - (sharedLinks.hashCode) + - (tags.hashCode); - - @override - String toString() => 'UserPreferencesResponseDto[albums=$albums, cast=$cast, download=$download, emailNotifications=$emailNotifications, folders=$folders, memories=$memories, people=$people, purchase=$purchase, ratings=$ratings, sharedLinks=$sharedLinks, tags=$tags]'; + static UserPreferencesResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albums: (AlbumsResponse.fromJson(json[r'albums']))!, + cast: (CastResponse.fromJson(json[r'cast']))!, + download: (DownloadResponse.fromJson(json[r'download']))!, + emailNotifications: (EmailNotificationsResponse.fromJson(json[r'emailNotifications']))!, + folders: (FoldersResponse.fromJson(json[r'folders']))!, + memories: (MemoriesResponse.fromJson(json[r'memories']))!, + people: (PeopleResponse.fromJson(json[r'people']))!, + purchase: (PurchaseResponse.fromJson(json[r'purchase']))!, + ratings: (RatingsResponse.fromJson(json[r'ratings']))!, + sharedLinks: (SharedLinksResponse.fromJson(json[r'sharedLinks']))!, + tags: (TagsResponse.fromJson(json[r'tags']))!, + ); + } Map toJson() { final json = {}; - json[r'albums'] = this.albums; - json[r'cast'] = this.cast; - json[r'download'] = this.download; - json[r'emailNotifications'] = this.emailNotifications; - json[r'folders'] = this.folders; - json[r'memories'] = this.memories; - json[r'people'] = this.people; - json[r'purchase'] = this.purchase; - json[r'ratings'] = this.ratings; - json[r'sharedLinks'] = this.sharedLinks; - json[r'tags'] = this.tags; + json[r'albums'] = albums.toJson(); + json[r'cast'] = cast.toJson(); + json[r'download'] = download.toJson(); + json[r'emailNotifications'] = emailNotifications.toJson(); + json[r'folders'] = folders.toJson(); + json[r'memories'] = memories.toJson(); + json[r'people'] = people.toJson(); + json[r'purchase'] = purchase.toJson(); + json[r'ratings'] = ratings.toJson(); + json[r'sharedLinks'] = sharedLinks.toJson(); + json[r'tags'] = tags.toJson(); return json; } - /// Returns a new [UserPreferencesResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UserPreferencesResponseDto? fromJson(dynamic value) { - upgradeDto(value, "UserPreferencesResponseDto"); - if (value is Map) { - final json = value.cast(); - - return UserPreferencesResponseDto( - albums: AlbumsResponse.fromJson(json[r'albums'])!, - cast: CastResponse.fromJson(json[r'cast'])!, - download: DownloadResponse.fromJson(json[r'download'])!, - emailNotifications: EmailNotificationsResponse.fromJson(json[r'emailNotifications'])!, - folders: FoldersResponse.fromJson(json[r'folders'])!, - memories: MemoriesResponse.fromJson(json[r'memories'])!, - people: PeopleResponse.fromJson(json[r'people'])!, - purchase: PurchaseResponse.fromJson(json[r'purchase'])!, - ratings: RatingsResponse.fromJson(json[r'ratings'])!, - sharedLinks: SharedLinksResponse.fromJson(json[r'sharedLinks'])!, - tags: TagsResponse.fromJson(json[r'tags'])!, - ); - } - return null; + UserPreferencesResponseDto copyWith({ + AlbumsResponse? albums, + CastResponse? cast, + DownloadResponse? download, + EmailNotificationsResponse? emailNotifications, + FoldersResponse? folders, + MemoriesResponse? memories, + PeopleResponse? people, + PurchaseResponse? purchase, + RatingsResponse? ratings, + SharedLinksResponse? sharedLinks, + TagsResponse? tags, + }) { + return .new( + albums: albums ?? this.albums, + cast: cast ?? this.cast, + download: download ?? this.download, + emailNotifications: emailNotifications ?? this.emailNotifications, + folders: folders ?? this.folders, + memories: memories ?? this.memories, + people: people ?? this.people, + purchase: purchase ?? this.purchase, + ratings: ratings ?? this.ratings, + sharedLinks: sharedLinks ?? this.sharedLinks, + tags: tags ?? this.tags, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserPreferencesResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UserPreferencesResponseDto && + albums == other.albums && + cast == other.cast && + download == other.download && + emailNotifications == other.emailNotifications && + folders == other.folders && + memories == other.memories && + people == other.people && + purchase == other.purchase && + ratings == other.ratings && + sharedLinks == other.sharedLinks && + tags == other.tags); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UserPreferencesResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + albums, + cast, + download, + emailNotifications, + folders, + memories, + people, + purchase, + ratings, + sharedLinks, + tags, + ]); } - // maps a json object with a list of UserPreferencesResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UserPreferencesResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'albums', - 'cast', - 'download', - 'emailNotifications', - 'folders', - 'memories', - 'people', - 'purchase', - 'ratings', - 'sharedLinks', - 'tags', - }; + @override + String toString() => + 'UserPreferencesResponseDto(albums=$albums, cast=$cast, download=$download, emailNotifications=$emailNotifications, folders=$folders, memories=$memories, people=$people, purchase=$purchase, ratings=$ratings, sharedLinks=$sharedLinks, tags=$tags)'; } - diff --git a/mobile/openapi/lib/model/user_preferences_update_dto.dart b/mobile/openapi/lib/model/user_preferences_update_dto.dart index 3b9b178b55..dd0a9ee206 100644 --- a/mobile/openapi/lib/model/user_preferences_update_dto.dart +++ b/mobile/openapi/lib/model/user_preferences_update_dto.dart @@ -1,295 +1,199 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UserPreferencesUpdateDto { - /// Returns a new [UserPreferencesUpdateDto] instance. - UserPreferencesUpdateDto({ - this.albums, - this.avatar, - this.cast, - this.download, - this.emailNotifications, - this.folders, - this.memories, - this.people, - this.purchase, - this.ratings, - this.sharedLinks, - this.tags, +final class UserPreferencesUpdateDto { + const UserPreferencesUpdateDto({ + this.albums = const Optional.absent(), + this.avatar = const Optional.absent(), + this.cast = const Optional.absent(), + this.download = const Optional.absent(), + this.emailNotifications = const Optional.absent(), + this.folders = const Optional.absent(), + this.memories = const Optional.absent(), + this.people = const Optional.absent(), + this.purchase = const Optional.absent(), + this.ratings = const Optional.absent(), + this.sharedLinks = const Optional.absent(), + this.tags = const Optional.absent(), }); - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AlbumsUpdate? albums; + final Optional albums; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - AvatarUpdate? avatar; + final Optional avatar; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - CastUpdate? cast; + final Optional cast; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - DownloadUpdate? download; + final Optional download; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - EmailNotificationsUpdate? emailNotifications; + final Optional emailNotifications; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - FoldersUpdate? folders; + final Optional folders; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - MemoriesUpdate? memories; + final Optional memories; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - PeopleUpdate? people; + final Optional people; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - PurchaseUpdate? purchase; + final Optional purchase; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - RatingsUpdate? ratings; + final Optional ratings; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - SharedLinksUpdate? sharedLinks; + final Optional sharedLinks; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - TagsUpdate? tags; + final Optional tags; - @override - bool operator ==(Object other) => identical(this, other) || other is UserPreferencesUpdateDto && - other.albums == albums && - other.avatar == avatar && - other.cast == cast && - other.download == download && - other.emailNotifications == emailNotifications && - other.folders == folders && - other.memories == memories && - other.people == people && - other.purchase == purchase && - other.ratings == ratings && - other.sharedLinks == sharedLinks && - other.tags == tags; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (albums == null ? 0 : albums!.hashCode) + - (avatar == null ? 0 : avatar!.hashCode) + - (cast == null ? 0 : cast!.hashCode) + - (download == null ? 0 : download!.hashCode) + - (emailNotifications == null ? 0 : emailNotifications!.hashCode) + - (folders == null ? 0 : folders!.hashCode) + - (memories == null ? 0 : memories!.hashCode) + - (people == null ? 0 : people!.hashCode) + - (purchase == null ? 0 : purchase!.hashCode) + - (ratings == null ? 0 : ratings!.hashCode) + - (sharedLinks == null ? 0 : sharedLinks!.hashCode) + - (tags == null ? 0 : tags!.hashCode); - - @override - String toString() => 'UserPreferencesUpdateDto[albums=$albums, avatar=$avatar, cast=$cast, download=$download, emailNotifications=$emailNotifications, folders=$folders, memories=$memories, people=$people, purchase=$purchase, ratings=$ratings, sharedLinks=$sharedLinks, tags=$tags]'; + static UserPreferencesUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + albums: json.containsKey(r'albums') + ? Optional.present((AlbumsUpdate.fromJson(json[r'albums']))!) + : const Optional.absent(), + avatar: json.containsKey(r'avatar') + ? Optional.present((AvatarUpdate.fromJson(json[r'avatar']))!) + : const Optional.absent(), + cast: json.containsKey(r'cast') + ? Optional.present((CastUpdate.fromJson(json[r'cast']))!) + : const Optional.absent(), + download: json.containsKey(r'download') + ? Optional.present((DownloadUpdate.fromJson(json[r'download']))!) + : const Optional.absent(), + emailNotifications: json.containsKey(r'emailNotifications') + ? Optional.present((EmailNotificationsUpdate.fromJson(json[r'emailNotifications']))!) + : const Optional.absent(), + folders: json.containsKey(r'folders') + ? Optional.present((FoldersUpdate.fromJson(json[r'folders']))!) + : const Optional.absent(), + memories: json.containsKey(r'memories') + ? Optional.present((MemoriesUpdate.fromJson(json[r'memories']))!) + : const Optional.absent(), + people: json.containsKey(r'people') + ? Optional.present((PeopleUpdate.fromJson(json[r'people']))!) + : const Optional.absent(), + purchase: json.containsKey(r'purchase') + ? Optional.present((PurchaseUpdate.fromJson(json[r'purchase']))!) + : const Optional.absent(), + ratings: json.containsKey(r'ratings') + ? Optional.present((RatingsUpdate.fromJson(json[r'ratings']))!) + : const Optional.absent(), + sharedLinks: json.containsKey(r'sharedLinks') + ? Optional.present((SharedLinksUpdate.fromJson(json[r'sharedLinks']))!) + : const Optional.absent(), + tags: json.containsKey(r'tags') + ? Optional.present((TagsUpdate.fromJson(json[r'tags']))!) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.albums != null) { - json[r'albums'] = this.albums; - } else { - // json[r'albums'] = null; + if (albums case Present(:final value)) { + json[r'albums'] = value.toJson(); } - if (this.avatar != null) { - json[r'avatar'] = this.avatar; - } else { - // json[r'avatar'] = null; + if (avatar case Present(:final value)) { + json[r'avatar'] = value.toJson(); } - if (this.cast != null) { - json[r'cast'] = this.cast; - } else { - // json[r'cast'] = null; + if (cast case Present(:final value)) { + json[r'cast'] = value.toJson(); } - if (this.download != null) { - json[r'download'] = this.download; - } else { - // json[r'download'] = null; + if (download case Present(:final value)) { + json[r'download'] = value.toJson(); } - if (this.emailNotifications != null) { - json[r'emailNotifications'] = this.emailNotifications; - } else { - // json[r'emailNotifications'] = null; + if (emailNotifications case Present(:final value)) { + json[r'emailNotifications'] = value.toJson(); } - if (this.folders != null) { - json[r'folders'] = this.folders; - } else { - // json[r'folders'] = null; + if (folders case Present(:final value)) { + json[r'folders'] = value.toJson(); } - if (this.memories != null) { - json[r'memories'] = this.memories; - } else { - // json[r'memories'] = null; + if (memories case Present(:final value)) { + json[r'memories'] = value.toJson(); } - if (this.people != null) { - json[r'people'] = this.people; - } else { - // json[r'people'] = null; + if (people case Present(:final value)) { + json[r'people'] = value.toJson(); } - if (this.purchase != null) { - json[r'purchase'] = this.purchase; - } else { - // json[r'purchase'] = null; + if (purchase case Present(:final value)) { + json[r'purchase'] = value.toJson(); } - if (this.ratings != null) { - json[r'ratings'] = this.ratings; - } else { - // json[r'ratings'] = null; + if (ratings case Present(:final value)) { + json[r'ratings'] = value.toJson(); } - if (this.sharedLinks != null) { - json[r'sharedLinks'] = this.sharedLinks; - } else { - // json[r'sharedLinks'] = null; + if (sharedLinks case Present(:final value)) { + json[r'sharedLinks'] = value.toJson(); } - if (this.tags != null) { - json[r'tags'] = this.tags; - } else { - // json[r'tags'] = null; + if (tags case Present(:final value)) { + json[r'tags'] = value.toJson(); } return json; } - /// Returns a new [UserPreferencesUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UserPreferencesUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "UserPreferencesUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return UserPreferencesUpdateDto( - albums: AlbumsUpdate.fromJson(json[r'albums']), - avatar: AvatarUpdate.fromJson(json[r'avatar']), - cast: CastUpdate.fromJson(json[r'cast']), - download: DownloadUpdate.fromJson(json[r'download']), - emailNotifications: EmailNotificationsUpdate.fromJson(json[r'emailNotifications']), - folders: FoldersUpdate.fromJson(json[r'folders']), - memories: MemoriesUpdate.fromJson(json[r'memories']), - people: PeopleUpdate.fromJson(json[r'people']), - purchase: PurchaseUpdate.fromJson(json[r'purchase']), - ratings: RatingsUpdate.fromJson(json[r'ratings']), - sharedLinks: SharedLinksUpdate.fromJson(json[r'sharedLinks']), - tags: TagsUpdate.fromJson(json[r'tags']), - ); - } - return null; + UserPreferencesUpdateDto copyWith({ + Optional? albums, + Optional? avatar, + Optional? cast, + Optional? download, + Optional? emailNotifications, + Optional? folders, + Optional? memories, + Optional? people, + Optional? purchase, + Optional? ratings, + Optional? sharedLinks, + Optional? tags, + }) { + return .new( + albums: albums ?? this.albums, + avatar: avatar ?? this.avatar, + cast: cast ?? this.cast, + download: download ?? this.download, + emailNotifications: emailNotifications ?? this.emailNotifications, + folders: folders ?? this.folders, + memories: memories ?? this.memories, + people: people ?? this.people, + purchase: purchase ?? this.purchase, + ratings: ratings ?? this.ratings, + sharedLinks: sharedLinks ?? this.sharedLinks, + tags: tags ?? this.tags, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserPreferencesUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UserPreferencesUpdateDto && + albums == other.albums && + avatar == other.avatar && + cast == other.cast && + download == other.download && + emailNotifications == other.emailNotifications && + folders == other.folders && + memories == other.memories && + people == other.people && + purchase == other.purchase && + ratings == other.ratings && + sharedLinks == other.sharedLinks && + tags == other.tags); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UserPreferencesUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + albums, + avatar, + cast, + download, + emailNotifications, + folders, + memories, + people, + purchase, + ratings, + sharedLinks, + tags, + ]); } - // maps a json object with a list of UserPreferencesUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UserPreferencesUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'UserPreferencesUpdateDto(albums=$albums, avatar=$avatar, cast=$cast, download=$download, emailNotifications=$emailNotifications, folders=$folders, memories=$memories, people=$people, purchase=$purchase, ratings=$ratings, sharedLinks=$sharedLinks, tags=$tags)'; } - diff --git a/mobile/openapi/lib/model/user_response_dto.dart b/mobile/openapi/lib/model/user_response_dto.dart index f671072c72..26848084f4 100644 --- a/mobile/openapi/lib/model/user_response_dto.dart +++ b/mobile/openapi/lib/model/user_response_dto.dart @@ -1,18 +1,9 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UserResponseDto { - /// Returns a new [UserResponseDto] instance. - UserResponseDto({ +final class UserResponseDto { + const UserResponseDto({ required this.avatarColor, required this.email, required this.id, @@ -21,124 +12,84 @@ class UserResponseDto { required this.profileImagePath, }); - UserAvatarColor avatarColor; + final UserAvatarColor avatarColor; /// User email - String email; + final String email; /// User ID - String id; + final String id; /// User name - String name; + final String name; /// Profile change date - DateTime profileChangedAt; + final DateTime profileChangedAt; /// Profile image path - String profileImagePath; + final String profileImagePath; - @override - bool operator ==(Object other) => identical(this, other) || other is UserResponseDto && - other.avatarColor == avatarColor && - other.email == email && - other.id == id && - other.name == name && - other.profileChangedAt == profileChangedAt && - other.profileImagePath == profileImagePath; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (avatarColor.hashCode) + - (email.hashCode) + - (id.hashCode) + - (name.hashCode) + - (profileChangedAt.hashCode) + - (profileImagePath.hashCode); - - @override - String toString() => 'UserResponseDto[avatarColor=$avatarColor, email=$email, id=$id, name=$name, profileChangedAt=$profileChangedAt, profileImagePath=$profileImagePath]'; + static UserResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + avatarColor: (UserAvatarColor.fromJson(json[r'avatarColor']))!, + email: json[r'email'] as String, + id: json[r'id'] as String, + name: json[r'name'] as String, + profileChangedAt: DateTime.parse(json[r'profileChangedAt'] as String), + profileImagePath: json[r'profileImagePath'] as String, + ); + } Map toJson() { final json = {}; - json[r'avatarColor'] = this.avatarColor; - json[r'email'] = this.email; - json[r'id'] = this.id; - json[r'name'] = this.name; - json[r'profileChangedAt'] = this.profileChangedAt.toUtc().toIso8601String(); - json[r'profileImagePath'] = this.profileImagePath; + json[r'avatarColor'] = avatarColor.toJson(); + json[r'email'] = email; + json[r'id'] = id; + json[r'name'] = name; + json[r'profileChangedAt'] = profileChangedAt.toUtc().toIso8601String(); + json[r'profileImagePath'] = profileImagePath; return json; } - /// Returns a new [UserResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UserResponseDto? fromJson(dynamic value) { - upgradeDto(value, "UserResponseDto"); - if (value is Map) { - final json = value.cast(); - - return UserResponseDto( - avatarColor: UserAvatarColor.fromJson(json[r'avatarColor'])!, - email: mapValueOfType(json, r'email')!, - id: mapValueOfType(json, r'id')!, - name: mapValueOfType(json, r'name')!, - profileChangedAt: mapDateTime(json, r'profileChangedAt', r'')!, - profileImagePath: mapValueOfType(json, r'profileImagePath')!, - ); - } - return null; + UserResponseDto copyWith({ + UserAvatarColor? avatarColor, + String? email, + String? id, + String? name, + DateTime? profileChangedAt, + String? profileImagePath, + }) { + return .new( + avatarColor: avatarColor ?? this.avatarColor, + email: email ?? this.email, + id: id ?? this.id, + name: name ?? this.name, + profileChangedAt: profileChangedAt ?? this.profileChangedAt, + profileImagePath: profileImagePath ?? this.profileImagePath, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UserResponseDto && + avatarColor == other.avatarColor && + email == other.email && + id == other.id && + name == other.name && + profileChangedAt == other.profileChangedAt && + profileImagePath == other.profileImagePath); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UserResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([avatarColor, email, id, name, profileChangedAt, profileImagePath]); } - // maps a json object with a list of UserResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UserResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'avatarColor', - 'email', - 'id', - 'name', - 'profileChangedAt', - 'profileImagePath', - }; + @override + String toString() => + 'UserResponseDto(avatarColor=$avatarColor, email=$email, id=$id, name=$name, profileChangedAt=$profileChangedAt, profileImagePath=$profileImagePath)'; } - diff --git a/mobile/openapi/lib/model/user_status.dart b/mobile/openapi/lib/model/user_status.dart index 130bd650f2..7f21124b27 100644 --- a/mobile/openapi/lib/model/user_status.dart +++ b/mobile/openapi/lib/model/user_status.dart @@ -1,88 +1,29 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// User status -class UserStatus { - /// Instantiate a new enum with the provided [value]. +enum UserStatus { + active._(r'active'), + removing._(r'removing'), + deleted._(r'deleted'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const UserStatus._(this.value); - /// The underlying value of this enum member. final String value; + static UserStatus? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const active = UserStatus._(r'active'); - static const removing = UserStatus._(r'removing'); - static const deleted = UserStatus._(r'deleted'); - - /// List of all possible values in this [enum][UserStatus]. - static const values = [ - active, - removing, - deleted, - ]; - - static UserStatus? fromJson(dynamic value) => UserStatusTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserStatus.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [UserStatus] to String, -/// and [decode] dynamic data back to [UserStatus]. -class UserStatusTypeTransformer { - factory UserStatusTypeTransformer() => _instance ??= const UserStatusTypeTransformer._(); - - const UserStatusTypeTransformer._(); - - String encode(UserStatus data) => data.value; - - /// Decodes a [dynamic value][data] to a UserStatus. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - UserStatus? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'active': return UserStatus.active; - case r'removing': return UserStatus.removing; - case r'deleted': return UserStatus.deleted; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [UserStatusTypeTransformer] instance. - static UserStatusTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/user_update_me_dto.dart b/mobile/openapi/lib/model/user_update_me_dto.dart index 0751d4096b..b9b6f2b787 100644 --- a/mobile/openapi/lib/model/user_update_me_dto.dart +++ b/mobile/openapi/lib/model/user_update_me_dto.dart @@ -1,156 +1,87 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class UserUpdateMeDto { - /// Returns a new [UserUpdateMeDto] instance. - UserUpdateMeDto({ - this.avatarColor, - this.email, - this.name, - this.password, +final class UserUpdateMeDto { + const UserUpdateMeDto({ + this.avatarColor = const Optional.absent(), + this.email = const Optional.absent(), + this.name = const Optional.absent(), + this.password = const Optional.absent(), }); - UserAvatarColor? avatarColor; + final Optional avatarColor; /// User email - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? email; + final Optional email; /// User name - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? name; + final Optional name; /// User password (deprecated, use change password endpoint) - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? password; + @Deprecated(r'Deprecated by the Immich server API.') + final Optional password; - @override - bool operator ==(Object other) => identical(this, other) || other is UserUpdateMeDto && - other.avatarColor == avatarColor && - other.email == email && - other.name == name && - other.password == password; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (avatarColor == null ? 0 : avatarColor!.hashCode) + - (email == null ? 0 : email!.hashCode) + - (name == null ? 0 : name!.hashCode) + - (password == null ? 0 : password!.hashCode); - - @override - String toString() => 'UserUpdateMeDto[avatarColor=$avatarColor, email=$email, name=$name, password=$password]'; + static UserUpdateMeDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + avatarColor: json.containsKey(r'avatarColor') + ? Optional.present(UserAvatarColor.fromJson(json[r'avatarColor'])) + : const Optional.absent(), + email: json.containsKey(r'email') ? Optional.present(json[r'email'] as String) : const Optional.absent(), + name: json.containsKey(r'name') ? Optional.present(json[r'name'] as String) : const Optional.absent(), + password: json.containsKey(r'password') ? Optional.present(json[r'password'] as String) : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.avatarColor != null) { - json[r'avatarColor'] = this.avatarColor; - } else { - // json[r'avatarColor'] = null; + if (avatarColor case Present(:final value)) { + json[r'avatarColor'] = value?.toJson(); } - if (this.email != null) { - json[r'email'] = this.email; - } else { - // json[r'email'] = null; + if (email case Present(:final value)) { + json[r'email'] = value; } - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (name case Present(:final value)) { + json[r'name'] = value; } - if (this.password != null) { - json[r'password'] = this.password; - } else { - // json[r'password'] = null; + if (password case Present(:final value)) { + json[r'password'] = value; } return json; } - /// Returns a new [UserUpdateMeDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UserUpdateMeDto? fromJson(dynamic value) { - upgradeDto(value, "UserUpdateMeDto"); - if (value is Map) { - final json = value.cast(); - - return UserUpdateMeDto( - avatarColor: UserAvatarColor.fromJson(json[r'avatarColor']), - email: mapValueOfType(json, r'email'), - name: mapValueOfType(json, r'name'), - password: mapValueOfType(json, r'password'), - ); - } - return null; + UserUpdateMeDto copyWith({ + Optional? avatarColor, + Optional? email, + Optional? name, + Optional? password, + }) { + return .new( + avatarColor: avatarColor ?? this.avatarColor, + email: email ?? this.email, + name: name ?? this.name, + password: password ?? this.password, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = UserUpdateMeDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is UserUpdateMeDto && + avatarColor == other.avatarColor && + email == other.email && + name == other.name && + password == other.password); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UserUpdateMeDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([avatarColor, email, name, password]); } - // maps a json object with a list of UserUpdateMeDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = UserUpdateMeDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'UserUpdateMeDto(avatarColor=$avatarColor, email=$email, name=$name, password=$password)'; } - diff --git a/mobile/openapi/lib/model/validate_access_token_response_dto.dart b/mobile/openapi/lib/model/validate_access_token_response_dto.dart index 16b9d0f925..ae8a3b74b3 100644 --- a/mobile/openapi/lib/model/validate_access_token_response_dto.dart +++ b/mobile/openapi/lib/model/validate_access_token_response_dto.dart @@ -1,100 +1,40 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ValidateAccessTokenResponseDto { - /// Returns a new [ValidateAccessTokenResponseDto] instance. - ValidateAccessTokenResponseDto({ - required this.authStatus, - }); +final class ValidateAccessTokenResponseDto { + const ValidateAccessTokenResponseDto({required this.authStatus}); /// Authentication status - bool authStatus; + final bool authStatus; - @override - bool operator ==(Object other) => identical(this, other) || other is ValidateAccessTokenResponseDto && - other.authStatus == authStatus; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (authStatus.hashCode); - - @override - String toString() => 'ValidateAccessTokenResponseDto[authStatus=$authStatus]'; + static ValidateAccessTokenResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(authStatus: json[r'authStatus'] as bool); + } Map toJson() { final json = {}; - json[r'authStatus'] = this.authStatus; + json[r'authStatus'] = authStatus; return json; } - /// Returns a new [ValidateAccessTokenResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ValidateAccessTokenResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ValidateAccessTokenResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ValidateAccessTokenResponseDto( - authStatus: mapValueOfType(json, r'authStatus')!, - ); - } - return null; + ValidateAccessTokenResponseDto copyWith({bool? authStatus}) { + return .new(authStatus: authStatus ?? this.authStatus); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ValidateAccessTokenResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || (other is ValidateAccessTokenResponseDto && authStatus == other.authStatus); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ValidateAccessTokenResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([authStatus]); } - // maps a json object with a list of ValidateAccessTokenResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ValidateAccessTokenResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'authStatus', - }; + @override + String toString() => 'ValidateAccessTokenResponseDto(authStatus=$authStatus)'; } - diff --git a/mobile/openapi/lib/model/validate_library_dto.dart b/mobile/openapi/lib/model/validate_library_dto.dart index 68fb0e9fe2..4ca309b338 100644 --- a/mobile/openapi/lib/model/validate_library_dto.dart +++ b/mobile/openapi/lib/model/validate_library_dto.dart @@ -1,111 +1,66 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ValidateLibraryDto { - /// Returns a new [ValidateLibraryDto] instance. - ValidateLibraryDto({ - this.exclusionPatterns = const [], - this.importPaths = const [], +final class ValidateLibraryDto { + const ValidateLibraryDto({ + this.exclusionPatterns = const Optional.absent(), + this.importPaths = const Optional.absent(), }); /// Exclusion patterns (max 128) - List exclusionPatterns; + final Optional> exclusionPatterns; /// Import paths to validate (max 128) - List importPaths; + final Optional> importPaths; - @override - bool operator ==(Object other) => identical(this, other) || other is ValidateLibraryDto && - _deepEquality.equals(other.exclusionPatterns, exclusionPatterns) && - _deepEquality.equals(other.importPaths, importPaths); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (exclusionPatterns.hashCode) + - (importPaths.hashCode); - - @override - String toString() => 'ValidateLibraryDto[exclusionPatterns=$exclusionPatterns, importPaths=$importPaths]'; + static ValidateLibraryDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + exclusionPatterns: json.containsKey(r'exclusionPatterns') + ? Optional.present( + ((json[r'exclusionPatterns'] as List?)?.map(($e) => $e as String).toList(growable: false))!, + ) + : const Optional.absent(), + importPaths: json.containsKey(r'importPaths') + ? Optional.present(((json[r'importPaths'] as List?)?.map(($e) => $e as String).toList(growable: false))!) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - json[r'exclusionPatterns'] = this.exclusionPatterns; - json[r'importPaths'] = this.importPaths; + if (exclusionPatterns case Present(:final value)) { + json[r'exclusionPatterns'] = value; + } + if (importPaths case Present(:final value)) { + json[r'importPaths'] = value; + } return json; } - /// Returns a new [ValidateLibraryDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ValidateLibraryDto? fromJson(dynamic value) { - upgradeDto(value, "ValidateLibraryDto"); - if (value is Map) { - final json = value.cast(); - - return ValidateLibraryDto( - exclusionPatterns: json[r'exclusionPatterns'] is Iterable - ? (json[r'exclusionPatterns'] as Iterable).cast().toList(growable: false) - : const [], - importPaths: json[r'importPaths'] is Iterable - ? (json[r'importPaths'] as Iterable).cast().toList(growable: false) - : const [], - ); - } - return null; + ValidateLibraryDto copyWith({Optional>? exclusionPatterns, Optional>? importPaths}) { + return .new( + exclusionPatterns: exclusionPatterns ?? this.exclusionPatterns, + importPaths: importPaths ?? this.importPaths, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ValidateLibraryDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ValidateLibraryDto && + exclusionPatterns == other.exclusionPatterns && + importPaths == other.importPaths); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ValidateLibraryDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([exclusionPatterns, importPaths]); } - // maps a json object with a list of ValidateLibraryDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ValidateLibraryDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'ValidateLibraryDto(exclusionPatterns=$exclusionPatterns, importPaths=$importPaths)'; } - diff --git a/mobile/openapi/lib/model/validate_library_import_path_response_dto.dart b/mobile/openapi/lib/model/validate_library_import_path_response_dto.dart index ebcb881935..b47b1460a9 100644 --- a/mobile/openapi/lib/model/validate_library_import_path_response_dto.dart +++ b/mobile/openapi/lib/model/validate_library_import_path_response_dto.dart @@ -1,127 +1,65 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ValidateLibraryImportPathResponseDto { - /// Returns a new [ValidateLibraryImportPathResponseDto] instance. - ValidateLibraryImportPathResponseDto({ - required this.importPath, - required this.isValid, - this.message, - }); +final class ValidateLibraryImportPathResponseDto { + const ValidateLibraryImportPathResponseDto({required this.importPath, required this.isValid, this.message}); /// Import path - String importPath; + final String importPath; /// Is valid - bool isValid; + final bool isValid; /// Validation message - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - String? message; + final String? message; - @override - bool operator ==(Object other) => identical(this, other) || other is ValidateLibraryImportPathResponseDto && - other.importPath == importPath && - other.isValid == isValid && - other.message == message; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (importPath.hashCode) + - (isValid.hashCode) + - (message == null ? 0 : message!.hashCode); - - @override - String toString() => 'ValidateLibraryImportPathResponseDto[importPath=$importPath, isValid=$isValid, message=$message]'; + static ValidateLibraryImportPathResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + importPath: json[r'importPath'] as String, + isValid: json[r'isValid'] as bool, + message: (json[r'message'] as String?), + ); + } Map toJson() { final json = {}; - json[r'importPath'] = this.importPath; - json[r'isValid'] = this.isValid; - if (this.message != null) { - json[r'message'] = this.message; - } else { - // json[r'message'] = null; + json[r'importPath'] = importPath; + json[r'isValid'] = isValid; + if (message != null) { + json[r'message'] = message!; } return json; } - /// Returns a new [ValidateLibraryImportPathResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ValidateLibraryImportPathResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ValidateLibraryImportPathResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ValidateLibraryImportPathResponseDto( - importPath: mapValueOfType(json, r'importPath')!, - isValid: mapValueOfType(json, r'isValid')!, - message: mapValueOfType(json, r'message'), - ); - } - return null; + ValidateLibraryImportPathResponseDto copyWith({String? importPath, bool? isValid, Object? message = _undefined}) { + return .new( + importPath: importPath ?? this.importPath, + isValid: isValid ?? this.isValid, + message: identical(message, _undefined) ? this.message : message as String?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ValidateLibraryImportPathResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ValidateLibraryImportPathResponseDto && + importPath == other.importPath && + isValid == other.isValid && + message == other.message); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ValidateLibraryImportPathResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([importPath, isValid, message]); } - // maps a json object with a list of ValidateLibraryImportPathResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ValidateLibraryImportPathResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'importPath', - 'isValid', - }; + @override + String toString() => + 'ValidateLibraryImportPathResponseDto(importPath=$importPath, isValid=$isValid, message=$message)'; } - diff --git a/mobile/openapi/lib/model/validate_library_response_dto.dart b/mobile/openapi/lib/model/validate_library_response_dto.dart index 37f6ad07d1..40348cc3c6 100644 --- a/mobile/openapi/lib/model/validate_library_response_dto.dart +++ b/mobile/openapi/lib/model/validate_library_response_dto.dart @@ -1,99 +1,53 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class ValidateLibraryResponseDto { - /// Returns a new [ValidateLibraryResponseDto] instance. - ValidateLibraryResponseDto({ - this.importPaths = const [], - }); +final class ValidateLibraryResponseDto { + const ValidateLibraryResponseDto({this.importPaths}); /// Validation results for import paths - List importPaths; + final List? importPaths; - @override - bool operator ==(Object other) => identical(this, other) || other is ValidateLibraryResponseDto && - _deepEquality.equals(other.importPaths, importPaths); + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (importPaths.hashCode); - - @override - String toString() => 'ValidateLibraryResponseDto[importPaths=$importPaths]'; + static ValidateLibraryResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + importPaths: (json[r'importPaths'] as List?) + ?.map(($e) => (ValidateLibraryImportPathResponseDto.fromJson($e))!) + .toList(growable: false), + ); + } Map toJson() { final json = {}; - json[r'importPaths'] = this.importPaths; + if (importPaths != null) { + json[r'importPaths'] = importPaths!.map(($e) => $e.toJson()).toList(growable: false); + } return json; } - /// Returns a new [ValidateLibraryResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static ValidateLibraryResponseDto? fromJson(dynamic value) { - upgradeDto(value, "ValidateLibraryResponseDto"); - if (value is Map) { - final json = value.cast(); - - return ValidateLibraryResponseDto( - importPaths: ValidateLibraryImportPathResponseDto.listFromJson(json[r'importPaths']), - ); - } - return null; + ValidateLibraryResponseDto copyWith({Object? importPaths = _undefined}) { + return .new( + importPaths: identical(importPaths, _undefined) + ? this.importPaths + : importPaths as List?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = ValidateLibraryResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is ValidateLibraryResponseDto && const DeepCollectionEquality().equals(importPaths, other.importPaths)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = ValidateLibraryResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(importPaths)]); } - // maps a json object with a list of ValidateLibraryResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = ValidateLibraryResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => 'ValidateLibraryResponseDto(importPaths=$importPaths)'; } - diff --git a/mobile/openapi/lib/model/version_check_state_response_dto.dart b/mobile/openapi/lib/model/version_check_state_response_dto.dart index 71075a681c..96ee5cd3fe 100644 --- a/mobile/openapi/lib/model/version_check_state_response_dto.dart +++ b/mobile/openapi/lib/model/version_check_state_response_dto.dart @@ -1,117 +1,56 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class VersionCheckStateResponseDto { - /// Returns a new [VersionCheckStateResponseDto] instance. - VersionCheckStateResponseDto({ - required this.checkedAt, - required this.releaseVersion, - }); +final class VersionCheckStateResponseDto { + const VersionCheckStateResponseDto({required this.checkedAt, required this.releaseVersion}); /// Last check timestamp - String? checkedAt; + final String? checkedAt; /// Release version - String? releaseVersion; + final String? releaseVersion; - @override - bool operator ==(Object other) => identical(this, other) || other is VersionCheckStateResponseDto && - other.checkedAt == checkedAt && - other.releaseVersion == releaseVersion; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (checkedAt == null ? 0 : checkedAt!.hashCode) + - (releaseVersion == null ? 0 : releaseVersion!.hashCode); - - @override - String toString() => 'VersionCheckStateResponseDto[checkedAt=$checkedAt, releaseVersion=$releaseVersion]'; + static VersionCheckStateResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new(checkedAt: (json[r'checkedAt'] as String?), releaseVersion: (json[r'releaseVersion'] as String?)); + } Map toJson() { final json = {}; - if (this.checkedAt != null) { - json[r'checkedAt'] = this.checkedAt; - } else { - // json[r'checkedAt'] = null; + if (checkedAt != null) { + json[r'checkedAt'] = checkedAt!; } - if (this.releaseVersion != null) { - json[r'releaseVersion'] = this.releaseVersion; - } else { - // json[r'releaseVersion'] = null; + if (releaseVersion != null) { + json[r'releaseVersion'] = releaseVersion!; } return json; } - /// Returns a new [VersionCheckStateResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static VersionCheckStateResponseDto? fromJson(dynamic value) { - upgradeDto(value, "VersionCheckStateResponseDto"); - if (value is Map) { - final json = value.cast(); - - return VersionCheckStateResponseDto( - checkedAt: mapValueOfType(json, r'checkedAt'), - releaseVersion: mapValueOfType(json, r'releaseVersion'), - ); - } - return null; + VersionCheckStateResponseDto copyWith({Object? checkedAt = _undefined, Object? releaseVersion = _undefined}) { + return .new( + checkedAt: identical(checkedAt, _undefined) ? this.checkedAt : checkedAt as String?, + releaseVersion: identical(releaseVersion, _undefined) ? this.releaseVersion : releaseVersion as String?, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = VersionCheckStateResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is VersionCheckStateResponseDto && + checkedAt == other.checkedAt && + releaseVersion == other.releaseVersion); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = VersionCheckStateResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([checkedAt, releaseVersion]); } - // maps a json object with a list of VersionCheckStateResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = VersionCheckStateResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'checkedAt', - 'releaseVersion', - }; + @override + String toString() => 'VersionCheckStateResponseDto(checkedAt=$checkedAt, releaseVersion=$releaseVersion)'; } - diff --git a/mobile/openapi/lib/model/video_codec.dart b/mobile/openapi/lib/model/video_codec.dart index ba6441c8f7..5c37f40e8d 100644 --- a/mobile/openapi/lib/model/video_codec.dart +++ b/mobile/openapi/lib/model/video_codec.dart @@ -1,91 +1,30 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Target video codec -class VideoCodec { - /// Instantiate a new enum with the provided [value]. +enum VideoCodec { + h264._(r'h264'), + hevc._(r'hevc'), + vp9._(r'vp9'), + av1._(r'av1'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const VideoCodec._(this.value); - /// The underlying value of this enum member. final String value; + static VideoCodec? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const h264 = VideoCodec._(r'h264'); - static const hevc = VideoCodec._(r'hevc'); - static const vp9 = VideoCodec._(r'vp9'); - static const av1 = VideoCodec._(r'av1'); - - /// List of all possible values in this [enum][VideoCodec]. - static const values = [ - h264, - hevc, - vp9, - av1, - ]; - - static VideoCodec? fromJson(dynamic value) => VideoCodecTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = VideoCodec.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [VideoCodec] to String, -/// and [decode] dynamic data back to [VideoCodec]. -class VideoCodecTypeTransformer { - factory VideoCodecTypeTransformer() => _instance ??= const VideoCodecTypeTransformer._(); - - const VideoCodecTypeTransformer._(); - - String encode(VideoCodec data) => data.value; - - /// Decodes a [dynamic value][data] to a VideoCodec. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - VideoCodec? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'h264': return VideoCodec.h264; - case r'hevc': return VideoCodec.hevc; - case r'vp9': return VideoCodec.vp9; - case r'av1': return VideoCodec.av1; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [VideoCodecTypeTransformer] instance. - static VideoCodecTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/video_container.dart b/mobile/openapi/lib/model/video_container.dart index a291fabf6e..eb1f58de44 100644 --- a/mobile/openapi/lib/model/video_container.dart +++ b/mobile/openapi/lib/model/video_container.dart @@ -1,91 +1,30 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Accepted video containers -class VideoContainer { - /// Instantiate a new enum with the provided [value]. +enum VideoContainer { + mov._(r'mov'), + mp4._(r'mp4'), + ogg._(r'ogg'), + webm._(r'webm'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const VideoContainer._(this.value); - /// The underlying value of this enum member. final String value; + static VideoContainer? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const mov = VideoContainer._(r'mov'); - static const mp4 = VideoContainer._(r'mp4'); - static const ogg = VideoContainer._(r'ogg'); - static const webm = VideoContainer._(r'webm'); - - /// List of all possible values in this [enum][VideoContainer]. - static const values = [ - mov, - mp4, - ogg, - webm, - ]; - - static VideoContainer? fromJson(dynamic value) => VideoContainerTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = VideoContainer.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [VideoContainer] to String, -/// and [decode] dynamic data back to [VideoContainer]. -class VideoContainerTypeTransformer { - factory VideoContainerTypeTransformer() => _instance ??= const VideoContainerTypeTransformer._(); - - const VideoContainerTypeTransformer._(); - - String encode(VideoContainer data) => data.value; - - /// Decodes a [dynamic value][data] to a VideoContainer. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - VideoContainer? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'mov': return VideoContainer.mov; - case r'mp4': return VideoContainer.mp4; - case r'ogg': return VideoContainer.ogg; - case r'webm': return VideoContainer.webm; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [VideoContainerTypeTransformer] instance. - static VideoContainerTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/workflow_create_dto.dart b/mobile/openapi/lib/model/workflow_create_dto.dart index dfd2d51290..b2c50d20ca 100644 --- a/mobile/openapi/lib/model/workflow_create_dto.dart +++ b/mobile/openapi/lib/model/workflow_create_dto.dart @@ -1,148 +1,100 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class WorkflowCreateDto { - /// Returns a new [WorkflowCreateDto] instance. - WorkflowCreateDto({ - this.description, - this.enabled, - this.name, - this.steps = const [], +final class WorkflowCreateDto { + const WorkflowCreateDto({ + this.description = const Optional.absent(), + this.enabled = const Optional.absent(), + this.name = const Optional.absent(), + this.steps = const Optional.absent(), required this.trigger, }); /// Workflow description - String? description; + final Optional description; /// Workflow enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final Optional enabled; /// Workflow name - String? name; + final Optional name; - List steps; + final Optional> steps; - WorkflowTrigger trigger; + /// Workflow trigger type + final WorkflowTrigger trigger; - @override - bool operator ==(Object other) => identical(this, other) || other is WorkflowCreateDto && - other.description == description && - other.enabled == enabled && - other.name == name && - _deepEquality.equals(other.steps, steps) && - other.trigger == trigger; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (description == null ? 0 : description!.hashCode) + - (enabled == null ? 0 : enabled!.hashCode) + - (name == null ? 0 : name!.hashCode) + - (steps.hashCode) + - (trigger.hashCode); - - @override - String toString() => 'WorkflowCreateDto[description=$description, enabled=$enabled, name=$name, steps=$steps, trigger=$trigger]'; + static WorkflowCreateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + description: json.containsKey(r'description') + ? Optional.present((json[r'description'] as String?)) + : const Optional.absent(), + enabled: json.containsKey(r'enabled') ? Optional.present(json[r'enabled'] as bool) : const Optional.absent(), + name: json.containsKey(r'name') ? Optional.present((json[r'name'] as String?)) : const Optional.absent(), + steps: json.containsKey(r'steps') + ? Optional.present( + ((json[r'steps'] as List?)?.map(($e) => (WorkflowStepDto.fromJson($e))!).toList(growable: false))!, + ) + : const Optional.absent(), + trigger: (WorkflowTrigger.fromJson(json[r'trigger']))!, + ); + } Map toJson() { final json = {}; - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (description case Present(:final value)) { + json[r'description'] = value; } - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled case Present(:final value)) { + json[r'enabled'] = value; } - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (name case Present(:final value)) { + json[r'name'] = value; } - json[r'steps'] = this.steps; - json[r'trigger'] = this.trigger; + if (steps case Present(:final value)) { + json[r'steps'] = value.map(($e) => $e.toJson()).toList(growable: false); + } + json[r'trigger'] = trigger.toJson(); return json; } - /// Returns a new [WorkflowCreateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static WorkflowCreateDto? fromJson(dynamic value) { - upgradeDto(value, "WorkflowCreateDto"); - if (value is Map) { - final json = value.cast(); - - return WorkflowCreateDto( - description: mapValueOfType(json, r'description'), - enabled: mapValueOfType(json, r'enabled'), - name: mapValueOfType(json, r'name'), - steps: WorkflowStepDto.listFromJson(json[r'steps']), - trigger: WorkflowTrigger.fromJson(json[r'trigger'])!, - ); - } - return null; + WorkflowCreateDto copyWith({ + Optional? description, + Optional? enabled, + Optional? name, + Optional>? steps, + WorkflowTrigger? trigger, + }) { + return .new( + description: description ?? this.description, + enabled: enabled ?? this.enabled, + name: name ?? this.name, + steps: steps ?? this.steps, + trigger: trigger ?? this.trigger, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = WorkflowCreateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is WorkflowCreateDto && + description == other.description && + enabled == other.enabled && + name == other.name && + steps == other.steps && + trigger == other.trigger); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = WorkflowCreateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([description, enabled, name, steps, trigger]); } - // maps a json object with a list of WorkflowCreateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = WorkflowCreateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'trigger', - }; + @override + String toString() => + 'WorkflowCreateDto(description=$description, enabled=$enabled, name=$name, steps=$steps, trigger=$trigger)'; } - diff --git a/mobile/openapi/lib/model/workflow_response_dto.dart b/mobile/openapi/lib/model/workflow_response_dto.dart index f44506d69d..f438067653 100644 --- a/mobile/openapi/lib/model/workflow_response_dto.dart +++ b/mobile/openapi/lib/model/workflow_response_dto.dart @@ -1,170 +1,129 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class WorkflowResponseDto { - /// Returns a new [WorkflowResponseDto] instance. - WorkflowResponseDto({ +final class WorkflowResponseDto { + const WorkflowResponseDto({ required this.createdAt, required this.description, required this.enabled, required this.id, required this.name, - this.steps = const [], + required this.steps, required this.trigger, required this.updatedAt, }); /// Creation date - String createdAt; + final String createdAt; /// Workflow description - String? description; + final String? description; /// Workflow enabled - bool enabled; + final bool enabled; /// Workflow ID - String id; + final String id; /// Workflow name - String? name; + final String? name; /// Workflow steps - List steps; + final List steps; - WorkflowTrigger trigger; + /// Workflow trigger type + final WorkflowTrigger trigger; /// Update date - String updatedAt; + final String updatedAt; - @override - bool operator ==(Object other) => identical(this, other) || other is WorkflowResponseDto && - other.createdAt == createdAt && - other.description == description && - other.enabled == enabled && - other.id == id && - other.name == name && - _deepEquality.equals(other.steps, steps) && - other.trigger == trigger && - other.updatedAt == updatedAt; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (createdAt.hashCode) + - (description == null ? 0 : description!.hashCode) + - (enabled.hashCode) + - (id.hashCode) + - (name == null ? 0 : name!.hashCode) + - (steps.hashCode) + - (trigger.hashCode) + - (updatedAt.hashCode); - - @override - String toString() => 'WorkflowResponseDto[createdAt=$createdAt, description=$description, enabled=$enabled, id=$id, name=$name, steps=$steps, trigger=$trigger, updatedAt=$updatedAt]'; + static WorkflowResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + createdAt: json[r'createdAt'] as String, + description: (json[r'description'] as String?), + enabled: json[r'enabled'] as bool, + id: json[r'id'] as String, + name: (json[r'name'] as String?), + steps: ((json[r'steps'] as List?)?.map(($e) => (WorkflowStepDto.fromJson($e))!).toList(growable: false))!, + trigger: (WorkflowTrigger.fromJson(json[r'trigger']))!, + updatedAt: json[r'updatedAt'] as String, + ); + } Map toJson() { final json = {}; - json[r'createdAt'] = this.createdAt; - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + json[r'createdAt'] = createdAt; + if (description != null) { + json[r'description'] = description!; } - json[r'enabled'] = this.enabled; - json[r'id'] = this.id; - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + json[r'enabled'] = enabled; + json[r'id'] = id; + if (name != null) { + json[r'name'] = name!; } - json[r'steps'] = this.steps; - json[r'trigger'] = this.trigger; - json[r'updatedAt'] = this.updatedAt; + json[r'steps'] = steps.map(($e) => $e.toJson()).toList(growable: false); + json[r'trigger'] = trigger.toJson(); + json[r'updatedAt'] = updatedAt; return json; } - /// Returns a new [WorkflowResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static WorkflowResponseDto? fromJson(dynamic value) { - upgradeDto(value, "WorkflowResponseDto"); - if (value is Map) { - final json = value.cast(); - - return WorkflowResponseDto( - createdAt: mapValueOfType(json, r'createdAt')!, - description: mapValueOfType(json, r'description'), - enabled: mapValueOfType(json, r'enabled')!, - id: mapValueOfType(json, r'id')!, - name: mapValueOfType(json, r'name'), - steps: WorkflowStepDto.listFromJson(json[r'steps']), - trigger: WorkflowTrigger.fromJson(json[r'trigger'])!, - updatedAt: mapValueOfType(json, r'updatedAt')!, - ); - } - return null; + WorkflowResponseDto copyWith({ + String? createdAt, + Object? description = _undefined, + bool? enabled, + String? id, + Object? name = _undefined, + List? steps, + WorkflowTrigger? trigger, + String? updatedAt, + }) { + return .new( + createdAt: createdAt ?? this.createdAt, + description: identical(description, _undefined) ? this.description : description as String?, + enabled: enabled ?? this.enabled, + id: id ?? this.id, + name: identical(name, _undefined) ? this.name : name as String?, + steps: steps ?? this.steps, + trigger: trigger ?? this.trigger, + updatedAt: updatedAt ?? this.updatedAt, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = WorkflowResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is WorkflowResponseDto && + createdAt == other.createdAt && + description == other.description && + enabled == other.enabled && + id == other.id && + name == other.name && + const DeepCollectionEquality().equals(steps, other.steps) && + trigger == other.trigger && + updatedAt == other.updatedAt); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = WorkflowResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([ + createdAt, + description, + enabled, + id, + name, + const DeepCollectionEquality().hash(steps), + trigger, + updatedAt, + ]); } - // maps a json object with a list of WorkflowResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = WorkflowResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'createdAt', - 'description', - 'enabled', - 'id', - 'name', - 'steps', - 'trigger', - 'updatedAt', - }; + @override + String toString() => + 'WorkflowResponseDto(createdAt=$createdAt, description=$description, enabled=$enabled, id=$id, name=$name, steps=$steps, trigger=$trigger, updatedAt=$updatedAt)'; } - diff --git a/mobile/openapi/lib/model/workflow_share_response_dto.dart b/mobile/openapi/lib/model/workflow_share_response_dto.dart index 336e8503c5..02ebf32ce6 100644 --- a/mobile/openapi/lib/model/workflow_share_response_dto.dart +++ b/mobile/openapi/lib/model/workflow_share_response_dto.dart @@ -1,134 +1,83 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class WorkflowShareResponseDto { - /// Returns a new [WorkflowShareResponseDto] instance. - WorkflowShareResponseDto({ +final class WorkflowShareResponseDto { + const WorkflowShareResponseDto({ required this.description, required this.name, - this.steps = const [], + required this.steps, required this.trigger, }); /// Workflow description - String? description; + final String? description; /// Workflow name - String? name; + final String? name; /// Workflow steps - List steps; + final List steps; - WorkflowTrigger trigger; + /// Workflow trigger type + final WorkflowTrigger trigger; - @override - bool operator ==(Object other) => identical(this, other) || other is WorkflowShareResponseDto && - other.description == description && - other.name == name && - _deepEquality.equals(other.steps, steps) && - other.trigger == trigger; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (description == null ? 0 : description!.hashCode) + - (name == null ? 0 : name!.hashCode) + - (steps.hashCode) + - (trigger.hashCode); - - @override - String toString() => 'WorkflowShareResponseDto[description=$description, name=$name, steps=$steps, trigger=$trigger]'; + static WorkflowShareResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + description: (json[r'description'] as String?), + name: (json[r'name'] as String?), + steps: ((json[r'steps'] as List?)?.map(($e) => (WorkflowShareStepDto.fromJson($e))!).toList(growable: false))!, + trigger: (WorkflowTrigger.fromJson(json[r'trigger']))!, + ); + } Map toJson() { final json = {}; - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (description != null) { + json[r'description'] = description!; } - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (name != null) { + json[r'name'] = name!; } - json[r'steps'] = this.steps; - json[r'trigger'] = this.trigger; + json[r'steps'] = steps.map(($e) => $e.toJson()).toList(growable: false); + json[r'trigger'] = trigger.toJson(); return json; } - /// Returns a new [WorkflowShareResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static WorkflowShareResponseDto? fromJson(dynamic value) { - upgradeDto(value, "WorkflowShareResponseDto"); - if (value is Map) { - final json = value.cast(); - - return WorkflowShareResponseDto( - description: mapValueOfType(json, r'description'), - name: mapValueOfType(json, r'name'), - steps: WorkflowShareStepDto.listFromJson(json[r'steps']), - trigger: WorkflowTrigger.fromJson(json[r'trigger'])!, - ); - } - return null; + WorkflowShareResponseDto copyWith({ + Object? description = _undefined, + Object? name = _undefined, + List? steps, + WorkflowTrigger? trigger, + }) { + return .new( + description: identical(description, _undefined) ? this.description : description as String?, + name: identical(name, _undefined) ? this.name : name as String?, + steps: steps ?? this.steps, + trigger: trigger ?? this.trigger, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = WorkflowShareResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is WorkflowShareResponseDto && + description == other.description && + name == other.name && + const DeepCollectionEquality().equals(steps, other.steps) && + trigger == other.trigger); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = WorkflowShareResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([description, name, const DeepCollectionEquality().hash(steps), trigger]); } - // maps a json object with a list of WorkflowShareResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = WorkflowShareResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'description', - 'name', - 'steps', - 'trigger', - }; + @override + String toString() => 'WorkflowShareResponseDto(description=$description, name=$name, steps=$steps, trigger=$trigger)'; } - diff --git a/mobile/openapi/lib/model/workflow_share_step_dto.dart b/mobile/openapi/lib/model/workflow_share_step_dto.dart index 79c55ef716..443a6dcac4 100644 --- a/mobile/openapi/lib/model/workflow_share_step_dto.dart +++ b/mobile/openapi/lib/model/workflow_share_step_dto.dart @@ -1,131 +1,66 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class WorkflowShareStepDto { - /// Returns a new [WorkflowShareStepDto] instance. - WorkflowShareStepDto({ - this.config = const {}, - this.enabled, - required this.method, - }); +final class WorkflowShareStepDto { + const WorkflowShareStepDto({required this.config, this.enabled, required this.method}); /// Step configuration - Map? config; + final Map? config; /// Step is enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final bool? enabled; /// Step plugin method - String method; + final String method; - @override - bool operator ==(Object other) => identical(this, other) || other is WorkflowShareStepDto && - _deepEquality.equals(other.config, config) && - other.enabled == enabled && - other.method == method; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (config == null ? 0 : config!.hashCode) + - (enabled == null ? 0 : enabled!.hashCode) + - (method.hashCode); - - @override - String toString() => 'WorkflowShareStepDto[config=$config, enabled=$enabled, method=$method]'; + static WorkflowShareStepDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + config: (json[r'config'] as Map?)?.cast(), + enabled: (json[r'enabled'] as bool?), + method: json[r'method'] as String, + ); + } Map toJson() { final json = {}; - if (this.config != null) { - json[r'config'] = this.config; - } else { - // json[r'config'] = null; + if (config != null) { + json[r'config'] = config!; } - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled != null) { + json[r'enabled'] = enabled!; } - json[r'method'] = this.method; + json[r'method'] = method; return json; } - /// Returns a new [WorkflowShareStepDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static WorkflowShareStepDto? fromJson(dynamic value) { - upgradeDto(value, "WorkflowShareStepDto"); - if (value is Map) { - final json = value.cast(); - - return WorkflowShareStepDto( - config: mapCastOfType(json, r'config'), - enabled: mapValueOfType(json, r'enabled'), - method: mapValueOfType(json, r'method')!, - ); - } - return null; + WorkflowShareStepDto copyWith({Object? config = _undefined, Object? enabled = _undefined, String? method}) { + return .new( + config: identical(config, _undefined) ? this.config : config as Map?, + enabled: identical(enabled, _undefined) ? this.enabled : enabled as bool?, + method: method ?? this.method, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = WorkflowShareStepDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is WorkflowShareStepDto && + const DeepCollectionEquality().equals(config, other.config) && + enabled == other.enabled && + method == other.method); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = WorkflowShareStepDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(config), enabled, method]); } - // maps a json object with a list of WorkflowShareStepDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = WorkflowShareStepDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'config', - 'method', - }; + @override + String toString() => 'WorkflowShareStepDto(config=$config, enabled=$enabled, method=$method)'; } - diff --git a/mobile/openapi/lib/model/workflow_step_dto.dart b/mobile/openapi/lib/model/workflow_step_dto.dart index e881ad3150..4138179f68 100644 --- a/mobile/openapi/lib/model/workflow_step_dto.dart +++ b/mobile/openapi/lib/model/workflow_step_dto.dart @@ -1,131 +1,66 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class WorkflowStepDto { - /// Returns a new [WorkflowStepDto] instance. - WorkflowStepDto({ - this.config = const {}, - this.enabled, - required this.method, - }); +final class WorkflowStepDto { + const WorkflowStepDto({required this.config, this.enabled, required this.method}); /// Step configuration - Map? config; + final Map? config; /// Step is enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final bool? enabled; /// Step plugin method - String method; + final String method; - @override - bool operator ==(Object other) => identical(this, other) || other is WorkflowStepDto && - _deepEquality.equals(other.config, config) && - other.enabled == enabled && - other.method == method; + static const _undefined = Object(); - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (config == null ? 0 : config!.hashCode) + - (enabled == null ? 0 : enabled!.hashCode) + - (method.hashCode); - - @override - String toString() => 'WorkflowStepDto[config=$config, enabled=$enabled, method=$method]'; + static WorkflowStepDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + config: (json[r'config'] as Map?)?.cast(), + enabled: (json[r'enabled'] as bool?), + method: json[r'method'] as String, + ); + } Map toJson() { final json = {}; - if (this.config != null) { - json[r'config'] = this.config; - } else { - // json[r'config'] = null; + if (config != null) { + json[r'config'] = config!; } - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled != null) { + json[r'enabled'] = enabled!; } - json[r'method'] = this.method; + json[r'method'] = method; return json; } - /// Returns a new [WorkflowStepDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static WorkflowStepDto? fromJson(dynamic value) { - upgradeDto(value, "WorkflowStepDto"); - if (value is Map) { - final json = value.cast(); - - return WorkflowStepDto( - config: mapCastOfType(json, r'config'), - enabled: mapValueOfType(json, r'enabled'), - method: mapValueOfType(json, r'method')!, - ); - } - return null; + WorkflowStepDto copyWith({Object? config = _undefined, Object? enabled = _undefined, String? method}) { + return .new( + config: identical(config, _undefined) ? this.config : config as Map?, + enabled: identical(enabled, _undefined) ? this.enabled : enabled as bool?, + method: method ?? this.method, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = WorkflowStepDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is WorkflowStepDto && + const DeepCollectionEquality().equals(config, other.config) && + enabled == other.enabled && + method == other.method); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = WorkflowStepDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([const DeepCollectionEquality().hash(config), enabled, method]); } - // maps a json object with a list of WorkflowStepDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = WorkflowStepDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'config', - 'method', - }; + @override + String toString() => 'WorkflowStepDto(config=$config, enabled=$enabled, method=$method)'; } - diff --git a/mobile/openapi/lib/model/workflow_trigger.dart b/mobile/openapi/lib/model/workflow_trigger.dart index b56d1b0dba..1da13db170 100644 --- a/mobile/openapi/lib/model/workflow_trigger.dart +++ b/mobile/openapi/lib/model/workflow_trigger.dart @@ -1,88 +1,29 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Plugin trigger type -class WorkflowTrigger { - /// Instantiate a new enum with the provided [value]. +enum WorkflowTrigger { + assetCreate._(r'AssetCreate'), + assetMetadataExtraction._(r'AssetMetadataExtraction'), + personRecognized._(r'PersonRecognized'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const WorkflowTrigger._(this.value); - /// The underlying value of this enum member. final String value; + static WorkflowTrigger? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const assetCreate = WorkflowTrigger._(r'AssetCreate'); - static const assetMetadataExtraction = WorkflowTrigger._(r'AssetMetadataExtraction'); - static const personRecognized = WorkflowTrigger._(r'PersonRecognized'); - - /// List of all possible values in this [enum][WorkflowTrigger]. - static const values = [ - assetCreate, - assetMetadataExtraction, - personRecognized, - ]; - - static WorkflowTrigger? fromJson(dynamic value) => WorkflowTriggerTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = WorkflowTrigger.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [WorkflowTrigger] to String, -/// and [decode] dynamic data back to [WorkflowTrigger]. -class WorkflowTriggerTypeTransformer { - factory WorkflowTriggerTypeTransformer() => _instance ??= const WorkflowTriggerTypeTransformer._(); - - const WorkflowTriggerTypeTransformer._(); - - String encode(WorkflowTrigger data) => data.value; - - /// Decodes a [dynamic value][data] to a WorkflowTrigger. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - WorkflowTrigger? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'AssetCreate': return WorkflowTrigger.assetCreate; - case r'AssetMetadataExtraction': return WorkflowTrigger.assetMetadataExtraction; - case r'PersonRecognized': return WorkflowTrigger.personRecognized; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [WorkflowTriggerTypeTransformer] instance. - static WorkflowTriggerTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/workflow_trigger_response_dto.dart b/mobile/openapi/lib/model/workflow_trigger_response_dto.dart index 6e24e1559a..74e852f6c1 100644 --- a/mobile/openapi/lib/model/workflow_trigger_response_dto.dart +++ b/mobile/openapi/lib/model/workflow_trigger_response_dto.dart @@ -1,108 +1,50 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class WorkflowTriggerResponseDto { - /// Returns a new [WorkflowTriggerResponseDto] instance. - WorkflowTriggerResponseDto({ - required this.trigger, - this.types = const [], - }); +final class WorkflowTriggerResponseDto { + const WorkflowTriggerResponseDto({required this.trigger, required this.types}); - WorkflowTrigger trigger; + /// Trigger type + final WorkflowTrigger trigger; /// Workflow types - List types; + final List types; - @override - bool operator ==(Object other) => identical(this, other) || other is WorkflowTriggerResponseDto && - other.trigger == trigger && - _deepEquality.equals(other.types, types); - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (trigger.hashCode) + - (types.hashCode); - - @override - String toString() => 'WorkflowTriggerResponseDto[trigger=$trigger, types=$types]'; + static WorkflowTriggerResponseDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + trigger: (WorkflowTrigger.fromJson(json[r'trigger']))!, + types: ((json[r'types'] as List?)?.map(($e) => (WorkflowType.fromJson($e))!).toList(growable: false))!, + ); + } Map toJson() { final json = {}; - json[r'trigger'] = this.trigger; - json[r'types'] = this.types; + json[r'trigger'] = trigger.toJson(); + json[r'types'] = types.map(($e) => $e.toJson()).toList(growable: false); return json; } - /// Returns a new [WorkflowTriggerResponseDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static WorkflowTriggerResponseDto? fromJson(dynamic value) { - upgradeDto(value, "WorkflowTriggerResponseDto"); - if (value is Map) { - final json = value.cast(); - - return WorkflowTriggerResponseDto( - trigger: WorkflowTrigger.fromJson(json[r'trigger'])!, - types: WorkflowType.listFromJson(json[r'types']), - ); - } - return null; + WorkflowTriggerResponseDto copyWith({WorkflowTrigger? trigger, List? types}) { + return .new(trigger: trigger ?? this.trigger, types: types ?? this.types); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = WorkflowTriggerResponseDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is WorkflowTriggerResponseDto && + trigger == other.trigger && + const DeepCollectionEquality().equals(types, other.types)); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = WorkflowTriggerResponseDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([trigger, const DeepCollectionEquality().hash(types)]); } - // maps a json object with a list of WorkflowTriggerResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = WorkflowTriggerResponseDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'trigger', - 'types', - }; + @override + String toString() => 'WorkflowTriggerResponseDto(trigger=$trigger, types=$types)'; } - diff --git a/mobile/openapi/lib/model/workflow_type.dart b/mobile/openapi/lib/model/workflow_type.dart index c18b07e9fb..e9ec7468ab 100644 --- a/mobile/openapi/lib/model/workflow_type.dart +++ b/mobile/openapi/lib/model/workflow_type.dart @@ -1,85 +1,28 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; /// Workflow type -class WorkflowType { - /// Instantiate a new enum with the provided [value]. +enum WorkflowType { + assetV1._(r'AssetV1'), + assetPersonV1._(r'AssetPersonV1'), + + /// Reserved for values from newer servers. Never sent by this client. + valueUnknown._(r'__unknown__'); + const WorkflowType._(this.value); - /// The underlying value of this enum member. final String value; + static WorkflowType? fromJson(dynamic value) { + for (final e in values) { + if (e.value == value) return e; + } + return value == null ? null : valueUnknown; + } + + Object toJson() => value; + @override - String toString() => value; - - String toJson() => value; - - static const assetV1 = WorkflowType._(r'AssetV1'); - static const assetPersonV1 = WorkflowType._(r'AssetPersonV1'); - - /// List of all possible values in this [enum][WorkflowType]. - static const values = [ - assetV1, - assetPersonV1, - ]; - - static WorkflowType? fromJson(dynamic value) => WorkflowTypeTypeTransformer().decode(value); - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = WorkflowType.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } + String toString() => value.toString(); } - -/// Transformation class that can [encode] an instance of [WorkflowType] to String, -/// and [decode] dynamic data back to [WorkflowType]. -class WorkflowTypeTypeTransformer { - factory WorkflowTypeTypeTransformer() => _instance ??= const WorkflowTypeTypeTransformer._(); - - const WorkflowTypeTypeTransformer._(); - - String encode(WorkflowType data) => data.value; - - /// Decodes a [dynamic value][data] to a WorkflowType. - /// - /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, - /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] - /// cannot be decoded successfully, then an [UnimplementedError] is thrown. - /// - /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, - /// and users are still using an old app with the old code. - WorkflowType? decode(dynamic data, {bool allowNull = true}) { - if (data != null) { - switch (data) { - case r'AssetV1': return WorkflowType.assetV1; - case r'AssetPersonV1': return WorkflowType.assetPersonV1; - default: - if (!allowNull) { - throw ArgumentError('Unknown enum value to decode: $data'); - } - } - } - return null; - } - - /// Singleton [WorkflowTypeTypeTransformer] instance. - static WorkflowTypeTypeTransformer? _instance; -} - diff --git a/mobile/openapi/lib/model/workflow_update_dto.dart b/mobile/openapi/lib/model/workflow_update_dto.dart index 0bce75283a..55bf95e702 100644 --- a/mobile/openapi/lib/model/workflow_update_dto.dart +++ b/mobile/openapi/lib/model/workflow_update_dto.dart @@ -1,157 +1,104 @@ -// // AUTO-GENERATED FILE, DO NOT MODIFY! // -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - part of openapi.api; -class WorkflowUpdateDto { - /// Returns a new [WorkflowUpdateDto] instance. - WorkflowUpdateDto({ - this.description, - this.enabled, - this.name, - this.steps = const [], - this.trigger, +final class WorkflowUpdateDto { + const WorkflowUpdateDto({ + this.description = const Optional.absent(), + this.enabled = const Optional.absent(), + this.name = const Optional.absent(), + this.steps = const Optional.absent(), + this.trigger = const Optional.absent(), }); /// Workflow description - String? description; + final Optional description; /// Workflow enabled - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? enabled; + final Optional enabled; /// Workflow name - String? name; + final Optional name; - List steps; + final Optional> steps; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - WorkflowTrigger? trigger; + /// Workflow trigger type + final Optional trigger; - @override - bool operator ==(Object other) => identical(this, other) || other is WorkflowUpdateDto && - other.description == description && - other.enabled == enabled && - other.name == name && - _deepEquality.equals(other.steps, steps) && - other.trigger == trigger; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (description == null ? 0 : description!.hashCode) + - (enabled == null ? 0 : enabled!.hashCode) + - (name == null ? 0 : name!.hashCode) + - (steps.hashCode) + - (trigger == null ? 0 : trigger!.hashCode); - - @override - String toString() => 'WorkflowUpdateDto[description=$description, enabled=$enabled, name=$name, steps=$steps, trigger=$trigger]'; + static WorkflowUpdateDto? fromJson(dynamic value) { + ApiCompat.upgrade(value); + if (value is! Map) return null; + final json = value.cast(); + return .new( + description: json.containsKey(r'description') + ? Optional.present((json[r'description'] as String?)) + : const Optional.absent(), + enabled: json.containsKey(r'enabled') ? Optional.present(json[r'enabled'] as bool) : const Optional.absent(), + name: json.containsKey(r'name') ? Optional.present((json[r'name'] as String?)) : const Optional.absent(), + steps: json.containsKey(r'steps') + ? Optional.present( + ((json[r'steps'] as List?)?.map(($e) => (WorkflowStepDto.fromJson($e))!).toList(growable: false))!, + ) + : const Optional.absent(), + trigger: json.containsKey(r'trigger') + ? Optional.present((WorkflowTrigger.fromJson(json[r'trigger']))!) + : const Optional.absent(), + ); + } Map toJson() { final json = {}; - if (this.description != null) { - json[r'description'] = this.description; - } else { - // json[r'description'] = null; + if (description case Present(:final value)) { + json[r'description'] = value; } - if (this.enabled != null) { - json[r'enabled'] = this.enabled; - } else { - // json[r'enabled'] = null; + if (enabled case Present(:final value)) { + json[r'enabled'] = value; } - if (this.name != null) { - json[r'name'] = this.name; - } else { - // json[r'name'] = null; + if (name case Present(:final value)) { + json[r'name'] = value; } - json[r'steps'] = this.steps; - if (this.trigger != null) { - json[r'trigger'] = this.trigger; - } else { - // json[r'trigger'] = null; + if (steps case Present(:final value)) { + json[r'steps'] = value.map(($e) => $e.toJson()).toList(growable: false); + } + if (trigger case Present(:final value)) { + json[r'trigger'] = value.toJson(); } return json; } - /// Returns a new [WorkflowUpdateDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static WorkflowUpdateDto? fromJson(dynamic value) { - upgradeDto(value, "WorkflowUpdateDto"); - if (value is Map) { - final json = value.cast(); - - return WorkflowUpdateDto( - description: mapValueOfType(json, r'description'), - enabled: mapValueOfType(json, r'enabled'), - name: mapValueOfType(json, r'name'), - steps: WorkflowStepDto.listFromJson(json[r'steps']), - trigger: WorkflowTrigger.fromJson(json[r'trigger']), - ); - } - return null; + WorkflowUpdateDto copyWith({ + Optional? description, + Optional? enabled, + Optional? name, + Optional>? steps, + Optional? trigger, + }) { + return .new( + description: description ?? this.description, + enabled: enabled ?? this.enabled, + name: name ?? this.name, + steps: steps ?? this.steps, + trigger: trigger ?? this.trigger, + ); } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = WorkflowUpdateDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); + @override + bool operator ==(Object other) { + return identical(this, other) || + (other is WorkflowUpdateDto && + description == other.description && + enabled == other.enabled && + name == other.name && + steps == other.steps && + trigger == other.trigger); } - static Map mapFromJson(dynamic json) { - final map = {}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = WorkflowUpdateDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; + @override + int get hashCode { + return Object.hashAll([description, enabled, name, steps, trigger]); } - // maps a json object with a list of WorkflowUpdateDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - // ignore: parameter_assignments - json = json.cast(); - for (final entry in json.entries) { - map[entry.key] = WorkflowUpdateDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - }; + @override + String toString() => + 'WorkflowUpdateDto(description=$description, enabled=$enabled, name=$name, steps=$steps, trigger=$trigger)'; } - diff --git a/mobile/openapi/lib/optional.dart b/mobile/openapi/lib/optional.dart new file mode 100644 index 0000000000..2784875afc --- /dev/null +++ b/mobile/openapi/lib/optional.dart @@ -0,0 +1,95 @@ +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// Self-contained three-state wrapper for JSON request bodies. Intentionally has +// no dependency on the host app's `Option` — this type belongs to the client +// and is only used at the request-DTO boundary. +part of openapi.api; + +/// A three-state value for PATCH/POST/PUT request bodies, distinguishing: +/// * absent — field omitted from the JSON (`Optional.absent()`) +/// * present null — field explicitly `null` (`Optional.present(null)`) +/// * present value — field has a value (`Optional.present(x)`) +/// +/// Sealed, so a `switch` over [Absent]/[Present] is exhaustiveness-checked. +sealed class Optional { + const Optional(); + + /// The field is omitted (not sent). + const factory Optional.absent() = Absent; + + /// The field is present with [value] (which may itself be null). + const factory Optional.present(T value) = Present; + + /// True when a value is present (even if that value is null). + bool get isPresent; + + /// The value if present, otherwise throws [StateError]. + T get value; + + /// The value if present, otherwise [defaultValue]. + T orElse(T defaultValue); + + /// Maps a present value with [transform]; an absent stays absent. + Optional map(R Function(T value) transform); +} + +/// The absent state of an [Optional]. +final class Absent extends Optional { + const Absent(); + + @override + bool get isPresent => false; + + @override + T get value => throw StateError('Optional is absent'); + + @override + T orElse(T defaultValue) => defaultValue; + + @override + Optional map(R Function(T value) transform) => Absent(); + + @override + bool operator ==(Object other) => other is Absent; + + @override + int get hashCode => (Absent).hashCode; + + @override + String toString() => 'Optional.absent()'; +} + +/// The present state of an [Optional], wrapping a (possibly null) [value]. +final class Present extends Optional { + const Present(this.value); + + @override + final T value; + + @override + bool get isPresent => true; + + @override + T orElse(T defaultValue) => value; + + @override + Optional map(R Function(T value) transform) => Present(transform(value)); + + @override + bool operator ==(Object other) => + identical(this, other) || (other is Present && other.value == value); + + @override + int get hashCode => value.hashCode; + + @override + String toString() => 'Optional.present($value)'; +} + +/// Ergonomic construction at request-DTO call sites: maps a nullable value to +/// an [Optional], treating `null` as absent (matching the wire behaviour of +/// omitting null fields). Use [Optional.present] directly to send an explicit +/// null. +extension ToOptional on T? { + Optional toOptional() => this == null ? Absent() : Present(this as T); +} diff --git a/mobile/openapi/pubspec.yaml b/mobile/openapi/pubspec.yaml index 1c26f8707c..36170ea81a 100644 --- a/mobile/openapi/pubspec.yaml +++ b/mobile/openapi/pubspec.yaml @@ -1,17 +1,26 @@ # # AUTO-GENERATED FILE, DO NOT MODIFY! # +name: openapi +version: 1.0.0 +description: Immich OpenAPI API client (generated). +publish_to: none -name: 'openapi' -version: '1.0.0' -description: 'OpenAPI API client' -homepage: 'homepage' environment: - sdk: '>=2.12.0 <4.0.0' + # 3.12+ for sealed classes, exhaustive switches, and the modern emitted shape. + sdk: '>=3.12.0 <4.0.0' + flutter: '>=3.44.0' + dependencies: - collection: '>=1.17.0 <2.0.0' - http: '>=0.13.0 <2.0.0' - intl: any - meta: '>=1.1.8 <2.0.0' - immich_mobile: - path: ../ + flutter: + sdk: flutter + # `http >=1.6.0` ships the Abortable{,Streamed,Multipart}Request types the + # generated client uses for cancellation (abortTrigger). The platform-native + # client git pins (mertalev/http cupertino_http #1876 / ok_http #1877) live in + # the host app's pubspec, not here — this package only needs the abortable API. + http: ^1.6.0 + collection: ^1.19.1 + meta: ^1.16.0 + # No path dependency back into the host app: the client is self-contained. + # The backward-compat hook (`ApiCompat`) and three-state wrapper (`Optional`) + # are both in-library, so the dependency flows app -> openapi only. diff --git a/mobile/test/domain/repositories/sync_stream_repository_test.dart b/mobile/test/domain/repositories/sync_stream_repository_test.dart index 4199a5b756..61f8417e94 100644 --- a/mobile/test/domain/repositories/sync_stream_repository_test.dart +++ b/mobile/test/domain/repositories/sync_stream_repository_test.dart @@ -33,7 +33,7 @@ SyncAssetV1 _createAsset({ id: id, checksum: checksum, originalFileName: fileName, - type: AssetTypeEnum.IMAGE, + type: AssetTypeEnum.image, ownerId: ownerId, isFavorite: false, fileCreatedAt: DateTime(2024, 1, 1), diff --git a/mobile/test/domain/services/sync_stream_service_test.dart b/mobile/test/domain/services/sync_stream_service_test.dart index ef29997e0b..c93850bded 100644 --- a/mobile/test/domain/services/sync_stream_service_test.dart +++ b/mobile/test/domain/services/sync_stream_service_test.dart @@ -116,7 +116,7 @@ void main() { when(() => mockApi.serverInfoApi).thenReturn(mockServerApi); when( () => mockServerApi.getServerVersion(), - ).thenAnswer((_) async => ServerVersionResponseDto(major: 1, minor: 132, patch_: 0)); + ).thenAnswer((_) async => ServerVersionResponseDto(major: 1, minor: 132, patch: 0)); when(() => mockSyncStreamRepo.updateUsersV1(any())).thenAnswer(successHandler); when(() => mockSyncStreamRepo.deleteUsersV1(any())).thenAnswer(successHandler); @@ -559,7 +559,7 @@ void main() { await Store.put(StoreKey.syncMigrationStatus, "[]"); when( () => mockServerApi.getServerVersion(), - ).thenAnswer((_) async => ServerVersionResponseDto(major: 2, minor: 4, patch_: 1)); + ).thenAnswer((_) async => ServerVersionResponseDto(major: 2, minor: 4, patch: 1)); await sut.sync(); @@ -587,7 +587,7 @@ void main() { await Store.put(StoreKey.syncMigrationStatus, "[]"); when( () => mockServerApi.getServerVersion(), - ).thenAnswer((_) async => ServerVersionResponseDto(major: 2, minor: 5, patch_: 0)); + ).thenAnswer((_) async => ServerVersionResponseDto(major: 2, minor: 5, patch: 0)); await sut.sync(); verifyInOrder([ @@ -617,7 +617,7 @@ void main() { when( () => mockServerApi.getServerVersion(), - ).thenAnswer((_) async => ServerVersionResponseDto(major: 2, minor: 4, patch_: 1)); + ).thenAnswer((_) async => ServerVersionResponseDto(major: 2, minor: 4, patch: 1)); await sut.sync(); diff --git a/mobile/test/fixtures/sync_stream.stub.dart b/mobile/test/fixtures/sync_stream.stub.dart index 6d8c0bfdf2..76a38c22fc 100644 --- a/mobile/test/fixtures/sync_stream.stub.dart +++ b/mobile/test/fixtures/sync_stream.stub.dart @@ -125,7 +125,7 @@ abstract final class SyncStreamStub { ownerId: 'owner', stackId: null, thumbhash: null, - type: AssetTypeEnum.IMAGE, + type: AssetTypeEnum.image, visibility: AssetVisibility.timeline, width: null, height: null, diff --git a/mobile/test/modules/utils/openapi_compat_test.dart b/mobile/test/modules/utils/openapi_compat_test.dart new file mode 100644 index 0000000000..d68bcede4c --- /dev/null +++ b/mobile/test/modules/utils/openapi_compat_test.dart @@ -0,0 +1,41 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:immich_mobile/utils/openapi_compat.dart'; +import 'package:openapi/api.dart'; + +void main() { + setUp(configureOpenApiCompat); + tearDown(ApiCompat.reset); + + group('configureOpenApiCompat', () { + test('back-fills nested and scalar defaults for an older server', () { + final json = {}; + ApiCompat.upgrade(json); + + expect((json['download'] as Map)['includeEmbeddedVideos'], false); + expect(json['folders'], {'enabled': false, 'sidebarWeb': false}); + expect(json['albums'], {'defaultAssetOrder': 'desc'}); + }); + + test('never overwrites values the server actually sent', () { + final json = {'isEdited': true, 'visibility': 'archive'}; + ApiCompat.upgrade(json); + + expect(json['isEdited'], true); + expect(json['visibility'], 'archive'); + }); + + test('timestamp default fills a parseable value', () { + final json = {}; + ApiCompat.upgrade(json); + + expect(json['profileChangedAt'], isA()); + expect(DateTime.tryParse(json['profileChangedAt'] as String), isNotNull); + }); + + test('a type with no registered rules is a no-op', () { + final json = {}; + ApiCompat.upgrade(json); + expect(json, isEmpty); + }); + }); +} diff --git a/mobile/test/modules/utils/openapi_patching_test.dart b/mobile/test/modules/utils/openapi_patching_test.dart deleted file mode 100644 index 18ab07b3a9..0000000000 --- a/mobile/test/modules/utils/openapi_patching_test.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter_test/flutter_test.dart'; -import 'package:openapi/api.dart'; -import 'package:immich_mobile/utils/openapi_patching.dart'; - -void main() { - group('Test OpenApi Patching', () { - test('upgradeDto', () { - dynamic value; - String targetType; - - targetType = 'UserPreferencesResponseDto'; - value = jsonDecode(""" -{ - "download": { - "archiveSize": 4294967296, - "includeEmbeddedVideos": false - } -} -"""); - - upgradeDto(value, targetType); - expect(value['tags'], TagsResponse(enabled: false, sidebarWeb: false).toJson()); - expect(value['download']['includeEmbeddedVideos'], false); - }); - - test('addDefault', () { - dynamic value = jsonDecode(""" -{ - "download": { - "archiveSize": 4294967296, - "includeEmbeddedVideos": false - } -} -"""); - String keys = 'download.unknownKey'; - dynamic defaultValue = 69420; - - addDefault(value, keys, defaultValue); - expect(value['download']['unknownKey'], 69420); - - keys = 'alpha.beta'; - defaultValue = 'gamma'; - addDefault(value, keys, defaultValue); - expect(value['alpha']['beta'], 'gamma'); - }); - - test('addDefault with null', () { - dynamic value = jsonDecode(""" -{ - "download": { - "archiveSize": 4294967296, - "includeEmbeddedVideos": false - } -} -"""); - expect(value['download']['unknownKey'], isNull); - }); - }); -} diff --git a/open-api/bin/generate-dart-sdk.sh b/open-api/bin/generate-dart-sdk.sh deleted file mode 100755 index e81d28096f..0000000000 --- a/open-api/bin/generate-dart-sdk.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash -OPENAPI_GENERATOR_VERSION=v7.12.0 - -set -euo pipefail - -# usage: ./bin/generate-dart-sdk.sh - -rm -rf ../mobile/openapi -cd ./templates/mobile/serialization/native -wget -O native_class.mustache https://raw.githubusercontent.com/OpenAPITools/openapi-generator/$OPENAPI_GENERATOR_VERSION/modules/openapi-generator/src/main/resources/dart2/serialization/native/native_class.mustache -patch --no-backup-if-mismatch -u native_class.mustache ~rNPq=V5g}Y2sKFB?;srB%?^C^3MeY5|4;SI>~0A7zR&Ob{r#TjzuL@nb#+yB zb#--hPtPR7_u(nV*wTjw-7;^`;712Nay!#$BLsl>Pta(XZHjH0{q`P!33D{%pWvd? z=^3;AX8T*vFo5{9{D8uUIn*1vW+C-J@*;r@&y!r?JO==N8ePPdOpy9ZWAs`!Q&avKXG5%nBxzJD z0Mm7d1Zu8Sq1UxR-PjtH2_*MbU{K51$oIrNilG4-@e3}J6vJ2?N6>0IYAi99ROfgh zOh~fyL_0OArl6QE8fHmlI;ce^hkxg2I+7*?v_@`!nEq;w<&5Pot6pFlsFrE1dMjP& z$CbyJ-l(yfty8UuKxqfC)|zNd|ch*xtF>sVqR_a{(feJ^tMq>}R zcd~Z|N;tq;duMxRjsO$^JqaqEHO{Wip3ZnQwmqRZZ=!qByx<(l*zgF@I;4sPAbL*N zfb;aK{PP`Q33=t-(EAh;DFCw_a&*X9_V*?o4ZMgWD(cYYgvq^Po$?$GV{ckJTY9p8(5sj8bWh~zFbc|=gV#YkLplG4VvrsLH1a_>)9>wNrs0a5W9V$Np+9{q2VJOuoXz=7% z8#{8mVi`{;|0J>eYc`CR?`rUDlgoR1KGwu~-na@Z_L)5U6frqvrAC71bAf0cYw#Sk zHeL;-ppg69GxPtlrEw5oW})KbQDdw?itOq!JVl=77KHAW#RB?03wj9cAN zAn0xx$TTTiQ?^R_PM~K3!d6@ix?67td}qo|Nq>z3-wAkxZonYG-%5E)(*H|=zXkY} zx_=J_yga2`-X@Gu}!4RQbrqaX~NhHfA74Jd%65gZV0L>%S9r7nz>A7f0qnb(zGU@Qu`-7-Y_ z9oM@Uvkbv?8m>@&!3kXVqSkR-e+CJn$F9_j(56^YnpX{H(NMNE)GLPRM#VF2>d4f| zLU%MJk?BS!Fl|~yS{I>*s>+T`H)cG5X=z15jO?0pcTWJ|$F%c8Pt*d!*ojQ*o$5^# zdLb{}f)PGL>z(VJo1tU9QL+eE#^5X4c|91ly*Q3{Ee4Z3mc2W1D-U+>As}=oQM`Wu zC=dH|cr8N=jdk>JUQ~Kt#ya#+I=!Qils-hg?>I*@0@{Kr@Op%?ey_*TV(=akMm2d4 zIrWD04#Jq0^bXFhhV;I|=ws=9o&5~y)7jnK)92h22L0=kS$d{F9hLe}_euX|?HbcJ zI?ijF)8BSR85+|4j-SH&r~ex6ovV0__WG&X%ypR?m$%a~;d-=Do4I{C%?X$?^qDY> z;c{CuzYnxE3w^7!H4Ec?IB#oKJUTvBZUqLQkd$?QAahmL%P0(KZdTew&5g?{Sl&)Q zJSuB%GRxZDoK@w#z?E749RuJ%Q`Vc#(|ysRgNqd3@d+}A%1^MYsw}_IJIjA%Y}U6o zG-aK3o{r6C{gPRB*QV?afjY6-H}sFq9&lr??AcM-(@{F1DSK$3^lbJ_*&(S!W3%V7 z*z9>XaVHg7LYo$*g%Fu~2&C5=M_OOJUaG`sSaRwQ8FMrNp=YB&&j@kKDyT+VHoX5L2Z+yqEOKN1+$oRE75oNewM zrrbNYoa32(k~VizZbq&Tm2VT0awk*e&Qv)+7tF#zupXH$&a{n;p{=vIu3gb1)Ptp8AiaSWD{AX0oi{h2@uJzNMQn^<$%j;&! z>&C~;M7gqr7`AogguGh?f8JnEp8g(fUVYxXdB@Ql8h6^fkMoYVZbm}hr;t0Z0qIjy z-ls5)juRLkA4aC1qFwR$iiIo6Q5~L{X;-|wg60YOK~Apy6-#I$T#=T{RxB~CSR&VN zj|xJ>4J+2qqEH&Qz&^z7qBGOqtIfYIzfV4?me06--8JJ0yF2A0IA&_94RTkgs$Dp`EW~?c0&~4_jK)UUO9k(cgnz(1L)c_ zF5jE)72@-~QTZiFkOGzcEcK4iVS0wiNcb0Km%mj=%BOkSFf1K5_LHeP*Hc~aMZdqj>%Fo{6T8xKS29~!f|P4oncGTXOg~M#vVP^4MLPKFp&+^! zJm8w$D&i!ZpRPr(d-!To8Q=V(U66(kj&42v&t#}uSR7kGKaWLA)8D#(+CLZ-r4 zP?olt!Nx|&Fi_l6@HHsDC-f`$1Qc6(7P6RvpP~wW0{VBRg71`JirnwUf-_2G1sK|O zCzudZ*gmSTeKIT5nhLdiaNL8rqws2D;T1|f1=zY?Tw&M3JA{P7K0?338;8XgJ`hv* za8%*Ls5!$_I74v&$USK+oTt!HfT47LXK{s#3bR3HDd;#rXJt%bNmL;^rf`+1aFyZ< zkgGHnZcykbzz{mpV9=>4JP0~_LFe6J358z^HxxGGdKUTf`UkZ|;YHn6(PHsxA*ran z+M`9iIgG{_Ks4y%iegvAg`10p6pdiIVE`gvFB)5p1t*LF-k|6qf6a#y3)U@o!X#PM$;;z()Xc=39EXNdtG&lf7K1?*%z%d;M2Dvj6I1J z8Fnw)&toiNAkyFaowI8jgxRK(;wO`{V80D@-gx_I2(GZf>b)ajXb=?4(pnzyz1!yv3 z!zbc)KUW_~Nj0mIrE*8VO$(y;dTtSG~}Zo;FD>$+w2GOR0QbDGv| z$hzII?sYb|W!;-u6AbIVXAk?=oyZal>#t!CHLvfSH6na%y%O+Vp?^kO(ygR#i50@f zKwfRhkP<7d^i$)Nl2O9IlBY|i(X_;Y)Wapyl1eVx3!22uu;f8g$%7QZ>|YqLFrtJ& zrdP?+ktNgoCDXD#NoFO_nM$5Zh@+w>nUP?;Z}$rX(Lbv#ah2>Z`5t23BP5l$LGMR| z*V>Y!C79&+kESh*?Szs>4BC=LQ%R#TIqIL&mOfFspmaSdPXVg7bV=#@Kqd4cDwRq? zOsOZT)RW9gB~z)SR81;f&1b_9H&lLx=@)2AzbidkhP@qjFA*%$lywdgTio(lKfn z!|DsQ3d=79Yw>WAKsxh=(hU{zCdWbH%!VrShCLfFDrB<;(F3Lp2h>i4Bi5KVfQ*G< zx#N?!HHh*C1L6^6l=fe4HtZRfd=$`V3q4k<+^y@*!kEuDeoFnersg;tqtYf zmmP+?70QP+vYd`nVPnSfAt@1^YycwWep3$W|`SIxx zs;PWsPANn9h>cyUk8}`i^@XE-z9`>SOce~7fMDer%`E4`wt}sKVC7Fiuo+aDn5`m2 z2!`4u*sAiQ!q9KaH!OQ6x_qbv*X%htpKVovyZnAC43ZTl3+~h=0Y;u}5In^<#e@R=> zzhY2D6>5hATU&8wMU`5MrVoT31k%J;j7Vk`V@wre_zdtAi>r8`Vx^E!FmO{^si_uwpP4b@g1ll$f?+dVji|ue8OSGOznh(I%OuT{7i-+Ovq5C!YUBTQ0BraIJt3&oN3ia z0;}^PcFgD@NYxF3D794Guwq(xvuIN0Wv2w?X8z(kZo?J1! zXLD7%6%)+Isz$DOSkQ|$ZPf!+FI8ou0fU63s%gA+XiSy0DjSWVA59Kq?^O<{x+(?9 zVXAU)X`mTCiHNTQ?^;;FwTQ6b4MeB5>Ri>Io6~wg?@%O(sT18|3e#3kt$tXT!)6M6 zyHh-heKs*oTm5+T)0Y_X7Ox81nyW&NW{(KfzX z?xqu$iA5+X*>)_r|BUr_(zZ%vb58W$q7!q(RY3Y}+XZ1F>SKKC#O2~@rmcynxk{Kv zAUshKbHz0PJyx?ocud906N>?Qx8{KGxC}y1Z_w6!Uh_>Y+%JlLs)a3MH(gf)t1-y^ zRofo7^ElDkZn%Anv#iB>-taiT1u1Th!@>+T=LIpxUvs`-kfFA{ATDpHZC^0bP}@xq za~o^B6-+eL4iLn=rrH4o)52@MQKCPcURKb z0bujBkHO|^A2ZcH#$`gg_2PPM?ZR4X?Ovcgf$Gl(s;6=o7S*+@vCoZJodgX~DyLbw zb~DJ8n`+BdaM)F05|Xy=dVUX9bwiNnV=y>S z>m~}l>YfI-I_z}TO)=F?R0+@L-0J4}>t+@%P=O)b4*9w;Q{A)vx)%x;aD&u~rP?}M zU2fe5uz@eGv#YJGTg71j%bg2l)vZTU>eid;*7LrE-7wZ|9a0lx*I}Bv4s%0v6o5L+ zL)yA8x8GFHM%#Nl39?5nH5|$#bmB&_mT9;9wx8EOMLl0GByF#y>j0g&Nvvbq9XUH% z^iL~AJBq33Hl0`@ZfDw^RlBa!Kcf`w+($*X>%>ZN2h;9awfippvr5sf52;FAN}z zxP=f#=)^7J9*&S-&qfXi8ETgAN`ydL0#B{El>~8X16^0uQ8rx=w>8pr)!X5?JQN&qZxFjeq%x#$Ak5<=1nys> zJnrcS)8c^@Ks7X2aD89C>`bOijfwt|ZL9v`wZZcmJi9{q!A11%m;GVYh)I22i6|vs zH;khfpkOo_K8XJSrd2@#Kw6kKT_D0}tvqt}g5cXAI64xk zJJN%w1do8bs1SmEl@bhA+znPd15_G9eWcvn(FvT%NMbTlWg>eBK&JTd&xAGI)q;?5 zd$63m#5*L+ETrdVO~^9sCfV@>K?sRZrxI1yi`>%V?F+bRD^U23*}dk zK14MP-uJ=i?r})wdKN#TM>2MgneGK*Lx~&*&7C^&1Mws3JATU5S9hisu;ASCRZ0G|+lWASGO zl6&mmf|zEYVTH~bcVqF`o){kE#uVQlgK;r#cJagGn{a)lc+rGrTvr#TCAQ#tpm@Fc z7_KLZx6FaA;v?K_=jo4{ZLQBTBM44W?pXT_#(JdNJV=79jx@?0bq>RBlSWW z428y0$B(CdF+Q>3{w69RdiW{6h9AC30Q?q?eMB;rI`uqnng z@kOPGi#X9vND{nvbSoK`DKai28JC5~SVes`v7BUDUou*>pk@zWPsH@_-@e|8$Zt_` zeaUDpvaioSihP7b-jDP%hTJle#>z$hG$^uJrxbCK&DRr>EojB^*d&uP528La-ziApsDnX>CXg>ypphY< zRc1%YIR=X`TT1VP+gOD34r9IHNqfWidn35+^BiN>V;OS&+wcvb#ta(qE3|P^F4Ee1 zcF&!z9wM|(#@rLdaMItPcru*wB*}BQCDxMyal=>Cq4O1f(M-R3gCmr#k6-u1AgqowT}S`wF7t{0oS7 z6C@K!Nq%_pZt{@5~Eb-`Ao!BJ)$WfL7WtpU>1(!l(8QsO}#Afj%$H)gpK8U!3 zDEWjkUMIGQr#MP6P>O-#38EAe%0!)bO#F$Xlmn$4C@Db{Y)*(rC+o!H;?EqV8YtD0 zJ~4=a$L-?LDLV06@ifP%0Y(joqy|xH2<1MV_?>u$qmag42nl+j7NOgI;_g}+(M-v7L1sTW2y7xK-G0vt>cOY-2OC)VJRE!yf7S8|N+sp= z6Xg^L$byC(3NfKKoq!VYp!}jEQ2nwP>-RZOvAOX(guNHT;@(^9*^C=q0xk0}a%euq z$dST`;k~yq9a=%e`43Y5E=!4BU2agAx6c!y*O3k&eI*cU-tv3DqP$WwFfAjm7cZd7 zec*lH%}D=7m6zly_x+plN)JmcQ(ekh~$+{*M4b@bHxksd=@iK?&4Ri{29=a~jD+%93kNpEU4GNF?m z=m?BDA%2aCJ{icJMBf> zwVq#4nN~#8zef5Qz1oi|Tjk0#bTUA$JR^oGxAF7<_P+^f4pJJ@9;81QyKy8E6mjEr zBsgL?UP%u|Gaf~HuAa>a&hy)zc4PHWRN;gi)Va@v|r$%*Njbsp{1VHN#W8J zy!;oG|0VEXZ^mI>9yAu6)Ly!huo7XViNggRekJM@EWSnGk*xI^LK&l^jgXM?iAemO zMqc7$5SwNzm~|p88H4i_697t;PqN7*$>Sv!sZ&))%qM!ZjxQb)9}^^lpXhBmfY~E4 zS&+gT=(_1BWm5&IeIs2rorVKX9HR`AFufE-B2^=OT+e3qf`~lyOT?)IHGW9kuat1} zOl$;Bo6s-uXE}UG{MiIjKL^8yne8CdOihKYRp>Xf8$th7VUt6g%Z7eZN7znBNI0`E z(%ndv;Lbz8nKuL_oM~1{X*x!|HvKw-m78-)!sU25nzGoR#HT^S3N%`B_D z4P37xuCF0|TF+*|(B#l>=GG9dN0kz;mzgJk(`w8RqgfhRFS9hz%PdV$FSELXqm1GNy*eSVr;FEDDQf6;=(qbm%v07Zul54dWtTKJ?=v8%gB%kiNs{TusvO&~FxP zH!IQVtP4sJ7kPFxA+>P`B=+o^sSjuWI}rNKo(%bCPo}|yAx@&to=%YI!6AjA%|pN0 zFKNsud8tk4H~S?u^yBrHQ2ix6R4bjyy8!nJ2AW{8ODuJjx^r*=z{Ns487zds#sMf*5?Lwb zYmxXpdFDC0;dsO>P98bT#0GAbP~n^wWaLQ%1o=vj`Slowjvkpmf?vlYzx9$w&lJ#$Jv%y2EEi9?HjL0>V@>b zv27srA&Nth5|RE-whg4~i2`Qp|D|mMsV~v1LpqEla(^iB|H`((YxS+>jtTO%!E5#Z zVeX)91L+1x`2S|xVC%y${|QxFp9R-`#C0dqmssWgU)wg=`gyClL)kXi`uTsDJGfr@ zL&E=e+XmZSzVzHNQQkJ#_VRz2JGjUWm##D#F0|$d8)o`t?ziogU6NVrz14L`Pi!!uMvyH}8%z>ZV&uodf zkCh**;=~<%m%Pe~vpwei)evu+-_s^V+Foq1JyUxH_MdHDqs@jpOi{GyhZ^E?@|Qlm zdt}SC56}#cvH2F`O~KdvwvDxT#)pY5+O}6d{$_i3ETbJAeh`Ik`XA)J)z^>Ne6~YE ztnC{yFTvhJ@Y`c+g<)oUynQkY8>WWKIG1Ce?&~km#I|2J!p5eEg;N<@2nfePqEl{ zwR#Zn2jfKwjGt8ZnOMC2?I`=lE%x{8dMDXw7wh2E(BobwAlz~HIIY=!#{MgWD+&nr zN3;F6+9UJ~;;j8bD@NzB@6_Kh0NATI_8G@*BOF6VIS_p?$KB12(E+tMCi@-ZF0U5H zH1|mD&>tNS)%B*T&-oossOoUM;&>%Q9gbI^jsOhmAOO{Q)#!L-`xJwGtjF?sQ zO5sH+F+04DWsrWg+E&NP7RU0s-nXNzNsdB-J`h?3=l$ay8;IK$qhr(dO$H{e0qP*f zw(t;shkQ4)I7gl12Vv+b$6Ix$2>(m^=iqV2M|G#fVqWEN`;aOJeYbGIjgGH~YG?_L zvBo=2M>)>7IDSRXIsPK4rd`x?PNVA;t=ZYz*%z%@%Ujdz>{ojv-uWUJJ0+v@)g3Q~ zGjSbQ6TorIX|3B!w)2bAbrH9a>>=N+EY6wYnyZa>Zl!uVk2&k=_Hr^!&fT@|x50hW z70zGca~^4Qepb7Ij;&F><9_E+bm)2w(=<7Mu6_TQ^IYBDz+lD86ar#Hh`rwjmm{}L zKHEl?Th)QY~?8Egw=7^jdiD#>O}Gr-@n<_48OS=nfPt3h!6e2 zHL>>nX4ieSM~01bJ;mZ()+kqMi^~Z$yXg5*n*ril=kBZ-deU{WZZ8S(OS9{YGB8}{ zLR3MI;)b4b>*`LOabFSV?(QBUjCA*B!{XhOqudWRx$moe|BO5FqAqmLc4r6)?j?fX zZHIe`cP|4AcVUw|ul9Y#x429F?p2o`MD9xWS6un-osI6T0p+{j^}Fjy`Or|4`%`q9 z>LmX`?+I={b)5TTqx*R62C;;+NDn?__b6-gb|xU;9g6r|{~(SokHQfuYSy}C=DQs#l|4u5gjJrwL!cnsKZ1e zet|4r3XDOTOYGs;rCW543665_XhAH+0L8YmW;#<=A{2_>sbh|Esx1fNR0*qrTTnIR z-RO3DX@Ji8yfedzC*m3r^Bdks&U5AwHhwcT(nEX>z`b7jx6ZZCb;yOs)tWv4XkFj9 zz9B69$Xs#JOSkFV)7?+IlYxV0$!?rolvj!FWP0V7|Hzm)?m(R<&$HIEkvMMvMC;k; z*(l=#3Er+t8J03OC4rDq2`MEZh2k^%;km{jT=ddlU20~kFLj5OY4Bc0Dwahu*VIj^ zJAi<7X(}z>_~SY*>>*z54xM+PcZe5T1vrxch}JutGW-V;goH}PNa&xqpBNj~4QT|@ zJfuRT*MWdO1`8;9*!RGif$K2>$a$=7(2IA`f=DBNiDQ_@L?08+@p8h#bEh!LF12_k z^bqloPr~LnHkOob#Da2|G>U~;?z1e^i<{713C*)SMAw-*X}B~RWp7(P2rei`NMl%- zHPYHCWHI?bn01l$W$S84q_sM%tHBnLi51FJmW4qMJ3B$AoD>k5p`>m<< zZ1_rpb%h{}Xt1t8rX<|@va&Xe)Ju1V*_h2>iw1FVEhuYk9cRdl*<|ai#=oun#vka|v0=7ewn4TBKpy5~lix%qF2ijP$V`G9yXN3QR-~JetaXbPn z1c4___9s;Wa@X4zne2;HX+!AH+bSVhBCD6ihuQbpKXF_^f>v_r8+eAKr}5TC`V)}; z95KfsV*3e`{e;S#PauB#FF5EjuN52YR}=mPzx@v?<9Gl#!a(3Jll?E1fGoYEoypPe zzmfhXNIxOWai8NsM-B;EMbbMS;u%Qqc!q#@h$KIOmS0V9@D~&vZogv*j-d1wH)E`r z92v5>(opImX(H%O40C+tXrK>AFmW@ddz@#8?%7Mwb%qN)oqfYNL2x z0T%6dUJaJ7sPI-AlKa;=2zdYYJNpuzxR$I&x?7I^P%y;g91;LtR9i2Z!<=rX*ZDKa zwuJ|E1U;5g?d=g%6mv&OlH;UE~Xg3oa7H97YNcqBOAr;+dc%J1A?&&J%u zS3(WW7Tk|h_*2+_NJ@ahCWX0jTx(pv5i6P!w62Xj1OBdR0@C5?g8@I7;Myy6cfBP& zpkW&DaDAT4T>DL~{i=3oA>em?309jzno2PbVgE$`9QV7h%`j$@Y&EX$Os?-PV>N`~ zcb#rS45L9WO%8LXyH~mqI54q>1b46J83^vCx$9!V-LDDV-L+isWafU;LB7m3vO-7aGn9{l!*ik zj2k{}#icx$I!J3yc{t@MrW3bwbBRuQ-ZxlzIRf9eSZqpJtV)7xia$lfF{MNm#LOuL zDQi)Ahf=vb@MZ<{mV$$KDO*h`TUB(qQ&V=EQg#QVmi_McR3DCvYJG!Rhy5uZgfdcU z{@_pX6ZkT!CW>;0))asFyWT zrVU7DY5h%U{Z+Nf=W^4A8`A~`2?qGJqS%GSrHx6O4T=*%@xEaRX^#pwq&=yZ?h8xX zo%V)TLk-GiZI<=W^>?x!knl`_qo&$XPD;A`t7mDeb%}mclsbP3{l# zw)1xJCV(8y7J3PfKNIox9KJV9hEBzXG@y}b!xvEIJo?qud2VDb)7$;NsIix?!{ zktXj*)ed64<6xI;xSz2R!;lbYj>N7MKJCFqBj6l8o3SxbNEwXX4cOgpGBy@?bn-9$ zB_ssq3COcZB&-IIbAnn=T&)C<^Kx)Hjp>!(6krJ`2v>P6oE6hs`dL=kJ`%*eh&%hw z(P(B<=c-Tk=jfSb1-p2Of%Q-55<{n#X6UUqSqECNrLK{KMC)MdV9rAg5@D^0dTWX` z8-XTMzQDAC;!^&jp@bW~G*fSjuw8At7C5x^rnOybyH-X~!a(56(%ZbYBHIUO%u&9I(ZfR|N4bhR&xIUQ#>DPnMsoG015xfAcE^_7K=0 zzR7iF?MC-+5x%^Z<99r|4-=$E{MIn+ct3Bj;&jlX4c2bRh~bu>f=_-XplR|C>j^gD zeWVUZZvzI&DK9s6KJA3^#%|ch@wFQ1NrPp%Wql4B@is&3tP|hi&7`|`19$Jip465L zI_Vi{0W()oN{@ zAusOZPxodsd}Zx#%738b5#(J@`45#m+5)OiYM~u4B7D5FWxp$>kKSybZ?`d>_z^_; z48{*U-yJ~_2G|`J!?0CaW2cuwKE7O)1DB|B)P5RO=(sTLuAYs!{YCjbLI8uW5jwgaV>t3QbQ&54KSg#Uzv1ZUPqeNARNSwS=`W)`NCfaE zp`*XES!Z^Pc9PF<+5YJ6>W1yJtk-m-wZZkQyQP;QXc^C!lof#c(gV#n_8fI8kN_y#2 z*4C*|ZPCio!8aREnH;CY1E_x78BT4W%4oN03DP3vrA%~6h%!$Zq0CA1!&w`3Iy;g& zzbAEmhB_3Dc2tp}P(})Mc63gacm9SCbar!M5aNxjRzmkE0PyqZ8BK zq|e*4fzI2Ux5>4IP`iV2owpgO>g2Ep{z4_MGWkY~P6|KZPiBTz@L}u8IXKce*yy|s zbw*tQ%6B>8=DA#FbkEeRgT+(b97sK;ATHuHVNkmjWD*L3D&v1P zi4XqSBwTRqL6Z}Emj?P?q54!I=muOGa+LRGws8V3BlY<2)Z_4}oQzRMMSlzA z0$fIqMr(H6BCFQ!-sZj_ z@4g=!=-%tzt60?~t=+wsTf6%REoW70cOL=wFJSHNFWq0twJ)}I_m@VhdcR(=cB*p! zP5)r+?r$R9-x%Fr0&O&`-QDPJROAYEGgI7+|Gl-}Ukhswh{&xyL@e3bRk@7rMsP0r z2WwXmR2l!HwY$G>YY(9g(9;hMY~=tw{Te*|pl`Qo?IDw%ryrT{)TM2#-E#+e+|z}6 z{4n_sI^eckQq-sZD>2`dx}W|50D0e z@ex{8tk!riKn`QyQ=HP3TfgTG;A}H`HbU4B@x<}-)?rO5Yp|9XQbz((Q~q%P3zm9C8dN+v0O89!9Qt6_A8hL)z;9dI3e7YtE>pLdg*yX zdSd!ZnP*8AwC2&KXYmYfDZ-&}9seM}q7XVgC-bb%oW3vpQ>GKY1ko31{YXJ*_jJEx zVM-30=M?W|47sG~WDH4W8AD7NLoVeOFV~kDLmJSR58l+qmNUi@C+zgL?#Ya?GJdOm z%ov+7pZ8IaKddFZ)!8%%s3AkSoUSS zMYN8pJ;yTMrMy3oR~E=ZLdHiFD`Ye;%4mdQKWWPN2o&dI?SaS6QW~Qjr9~Nkpy=D? zjAJNzIZ(vMr20WAu$7;I&J_?$%fhNxTE?(M-w2kFsS_GABS_?g%6zo!MJn+sVcwU~R{3f~H>8gSAo0H23bN~@wXlc|+7 z00IqM9oj%;<%M>wUYfZY?K&lZR&%BgWOv907s9rc43`@TnXAcFC-%H_BlFP6SJZB! z=E=yR!+^K!{T6E3-_)|}GvCKHN#>i!Gxvb*Y90Vd9t5cx5)cBg~ zn-rv%78$Y!XHUwOplR^{WYA_mP8k{$*)QXjV7^r4iv%8$qeL$y8f{Vi>IkjsFgEQI0RDwE9%(66f)g_2)a2~SU&F*ka#I&=N3a=iVH-YBT_Dld zNiV~c49hc?ZxF-=b$kXpf(g;fO9SSsXp>PFW0S^WU^%;(4xB+s{sDs=A?-B)g+Gno z@F^8(^wLtp@`~kqmSZu?#3p=0v=U>9Zz(Q+hXc{rv;%6!!#u7m#Vfj%S*2|BY zmLCi z<(rn=10ekiv`GFq1v}9{^~{Tm$!iyx*X~&E*?KmoCp}Zh>toEjiZXhE)J+@a4S9W` z(33Rg0HWs)^!bXoya9Pn2t&Wii=#rSnP|+557wmT5NGpdh18;*nPKsHuM%z{zOcF+ zNiyY0Vp|u>FfRCBY58~Z^S_3?)oo6lMzPSup3eOr=oC#_A!B*np>=hpj`8_UahWS1G`8`nivV$SN2TeN< zMNNa%L-gQa$d84=<#z@&bTH({%IK}^Ek8DYrDo_0EdRFV{F^~+o_MSwe;A1@Ww7}C zNiq5JBlG9uL$lMG^Y7*5YDf^5|9pN94}|hg%XL%%>U4T1y1${SYRTyz~1zay8YdR%nrh64c)1-MSKVA{0Se}J7BpN0ZY!Ab!~jaw;Oh%Q)hu>t8M7h)SjVSM2XEVwxp za?Z;Pg>&#<4j5?*ALUn#AQaB0U2`n#;o1r%JX8_6Ccs5*CBQfzQ#fCc?Eb>}_3Yto zhC)e@Tn&X1GOvdh&Ji|zi^}BBy@ta4!pg#r&}{L0A*paBh9&psg*ysAA{_i^q=IHb z;ck4h^_|E`Aj8)ub&c-eyx;1^ok zMUib?8)J{4$|GZu@^OQC5H$?QRbXHL4-m^{?BOuvDMZE8MR4>6&NAgF-=L?CT^?>7 zW4$jmLlE&QFLmsXBo`&hoD9vJQZwY7P)zDy70#^pv5V)%(>;X%RtU|+pFkXs+b}6%PFoRfyVo|&wgAX@c^BBWd6Xe+ z+mnQS8raahjGZ6uc*F6oqmi&Nb>oP}LCO%e<7-^y_qrA2mEo=@UC+4+37OVHTGvv_ zP$2H|&@_1(4PdUki|ZAHd&YPYJa(!_gG1|im@-t)1JQUr#ysN1^$NpN=cdj}^-{fG zsa|R_WvE{2E2x)9%1U*&uEyA-laNsUD0=bH!;H;~L_(j>TLMhIMp_-7c17CN=^x4` z(s;+vcwDZfTQvzfX{}Vk!qc8hOB2N3U;rq=$8*z`${)`~M^=Tiw5wZpB%ZacZry!2 zYgiVZmX)?X?JaP}^U}0zVgb9+rfuRdfQdFb5RY@WP&|{i1CL<0n9{ZoUt$YEt|m0u z3GT-quFy*x!qeVQJK~K17=Jk+4PQ1=sQNh!9hgSLF~m58xU`er2=3C-E`Y;XQ`*@O z4)hIRzgJVw9+S@lV>_Mx;)Y%-5BElSW4zOe+Ru34i}yKYR^FRA5UjidsW50+LY((5 z?{v<}i_h8chrDfAO$Mtod`=3m@`Zb6d!O~fi!$*HSj`ErdX)o-60vV0U%~aH$$Ro5t_|J`;QCqX_H7DJZ=c>Z{VC%53;y0igvvGjHVy>W^t*yw(-SV@ znm#%GDb6*07XHM;R8#uYi@ByhQqP`9Xw9`EJbgjBHGLm({S{mn2DoN(AaPwuS;9rmutPo=~QYJ$5D1BS;_NJ5P5Yt;Khdu0={`EJ+6z z?U1m~g4~VpwBKNS7U8}xfEpPld){i+9;22{ky^Wu*6^spk7PhhF#*?ZxGu!oh7v*z z3!H>>FHS;|v%mn;NVV;~Chu*#jxg~L@Z!y*mCX)mH*4=r^v)N=^HMcNpS7Ai^IPp< zd(V2w#b~{Y`IQU~Zo?p+=SV=6YH5IL4BjPzw8QU3V3722xcAxMX3^gE84(#>N+B#0 zFMv9TW%TA*9X2e`yG;C3nYFMW0oibtF_oZyaVQ69GG3;+>5pcRy7KD`?I!EZAr)ZjA98{?+g92_76+Q_TbNGWXd1dwd;iL*~{(p zMcBsdBH)k4F_G-uJ+pBZEPJ0n`*k7_pwD8m4>e^U2JE4@?4Jr=#5d_DAh5bONULC) zOsimyOlz3AU~|D+Oecj=tI2s6eAZC#4hjcQczmWn{kklU&sf6|5t|E+7vSX@NzZq1 zVNMOgl!D({ZN77${N#~t8KZ58rv}2nHReLHcV%-s(18ee3cL9WyHQ)zm8D`@!F`{? zZnVqsRN^#rK6;DyIsX`N;q^qfBcM{dRwS>NDC=j3jKYa!OLM z@o8X?A<2>oYq^^$w6+vJ4^q*5qZtzUkd_+@J@xGAso_kDfGG53Ua5hEvuc>sfj+qCDg3i-YySk@Kbs4`uV+u5{4W~#C+YL)gKavXD1w@IkeYXe(!8Pw z88^_lqKJ}pVdkRfqJFTQDE0Q zTd!Or`FIf~h+qv=$s)#4%7;(kMn)B_1?ehdQ8^It%1~f{jVRg~SG2Qarq*1vzX;!h z=UmC;i@q@yeXbx=6mh2LIG+o!L?^*~<5+yr8N$0@EIJ3g#t0@|1-ztHS5x^TGP1QR z4P+}8jjOt^dPW$zY98{0Xmj=ChS5D-s#oyD&aBG+^< zt_iDW&(80_;?{Ip^9ug87RPbhEpBft)+eTOGe)wP1)%xO?^_wEsZ!)egsb|mSLS5^(m5k?m zD(epqT>tTU#MHFaEPqBAzTUY0Er?ptp7mP)apd}sd3Hh46|9p2k6wR(7Rhroz&(TG z90W!=6v8BqcJ55BTE(PA=-UA9~PkOl5r%HFGI3v2mPg|cJh-=FVl;D?~PmmRZf@$tK3Wj_JqJ%1U-@WQ7X zHfV8qi5vVJjqM!m!x+nU%hk-~zVi1VK^H{=%umtfe2a}5Pn~ZrZ^2(Uz~?A9MnDZf z`z5fgjUg0HxN$W1`Z@)tfFL?P*50Yn*9nr?FFW`8I`P(g9>JzTqcEZ1?Ca}Jl&>U3 zcWXtoyIQ67{Ojw!u?Q7z@(qUQ*KzsaBYZ=RKEzdv26W)(qR!xC5xfALj~aH!4R|rw z0Imhd4*%+V(dc^`l^?$1znG?hjE-5f;>t@j#Ys(>PECnc$vai-z)a?IZp;(neZN8K zjY5O(0(Bvu4U*Z$Xye8!K>W{0*@&%NSKN=OQ^UqS8#DO$-#E#*@m6%TBV0ZvxA9)N zqTFr^HwHY!VH=kiH$Drzvi1s|1$a=CJdTyXhVS5+H$A)QRVcN4z^e*VHZ9edH!W3c z76&GHXcoO`sc!-~5yWozEIy)(O{<$WdC-uRQV;ZDNNgco99!^y*z|due%SQ6ant8= zb7U(b1qOp76hrGT#B^w@b+XJ&?~>AE6s0p2H=uLEspt~Ql#5=`1z*jl6ltu`fcyd& zz<+3fDjXuEz~6GH=)xH;zl2Ey7>D5rQ?h)1?gb!1GEhL!7J|U_d3{9}!C29yo-K}y z#2}Fx=s}#!Ao=46xeIymEm6w2rzj5VjN#0iY|z9rO%)IFj{HwSqAWRlu^Npl%CD$4R#acUBTSkNm+r`lHElYQa9ej| zt4LJtNJOF)l)g1q9I0n7-g)JJjB+p8k$;kKFV2pQj{Fnk zK934^BxkTVuY=N&RQx+u9^6+2JF>zI6#>ayIlFQJIV5EPF$R@>6;QZ+*x(|DPz`wAw06R0BK!9F3% zNqL|jKr~mbsoV{Lt`8OHa3%H_)d$|Z?Ih4)V`V*Bfe$?WXMqmO0)1<&JPd(;y7Ipe zNI@KWqG}qfRP~$`D^-WFFk@9JSS4J+j8$d0 zIdUays``iwzoF_!TwXd>bsm@Z&@*9ywgzs<)G4^cb)o{ahD&eYRZ$GqYCdtjyf`ut zz*cu}uD+V2l=>okJzL#d?(cFuE#jYx!vYZ_GbCyar?|>kHLso#nK9LwLUn$10SkP0 zqq>Otyn3y%dQClhqmp6#abWe% z5M+8B7*}1t8DDT9)Pu(AcV)uz@wVziGUF-LM>J;o>l4BLC%so63DtY`x2EcERlRQx zQ}n*Mm#lY?-~707^LW{3(58WLGonLkmZ~SxH?|Iv*=G71m7A9tH@^^yopVWSbxn9| zGdlSHs3$icBzN%2Pf>xM+BCKQ&xs7?We8z2P^_2%RRpNOSL8c+~d_pWOl&D zASC+;%+Hfp!j?|d>sz{+wsfO?H67C!x0qx(nzxK1`_hPi8@E7r&+80KV#l|v0Pql& zBN`nJ>wr{%Uf@Qftk6QE-oR=?!nfU}H`;H@+E%pd3wQ|XLR_@lDtR_6ENt5z0wZ8h zToKy_Q(!dlsDK(R0r;*3tLct=IXcHTcL0_nYt=hp9}qiuHG_A35jHfs=59Hfu9+ak zGIPy>nipy5rs_k8uCd7Ln2_+aCLd;~Yz=WYl+0@K{WbaZY{~bR^7b|Pw8yaYg=r84 z8V`n~HDw4FYO+bf8&pDNGH$@#*OYC43rICJ^>By%<_NNfsll6~H6JzBybih@+J+Kj zF2`%WK;c{5Ag~!vHL;l)U(*s(b2_r-w6W$p6n~G`8*0wi#_+*c+o7cvgJ$Uzdi-jv zjpF43MZU6CS>Y~#U)y*49<90dNbR?fs6Xg-C3C4g)l~aEYIK%vgdN~-Z2WDi{hKy@ zQNJ3yz{l%|9*F~sv(kH&4OG>7D~qp-?pZe|vhHSMUC(+ZzJlKAQx|u<4q^7vw=g2_ zimRJc_X_^3Zru!Cj6Ztuw6QLUO4~s?%U!&uEu-Z>S-yRG%XUPlawEELf6DqVhy(ey zFK*tx5b$2qxZ~Sjq3Uw8Xb!SWwA{l6ZcpEC;U0!J%DCMki_>d+dgOKs&q`Bp^l>}B zR%7itPX#~*sDS=a{D`6_inz9u$7*dV+mAGC$M9Qn{!*s0{RnlxRNTf?wx1ztcuo>D zmF;I_+<>WUKeOv~jd_P=M?|Qp?6@hJ?YOpa2jYF0N}Fhlo5~IhZ|SFtO=ZWBm>pvy zcZ@aeh^uFoPU!j_lXoO@Q`s@MWyf??%f=m#@^aEaYg5_r>aLv}e^=L*T}BnZ`!18( zE4%J)-ZcVnxmR{21jOKxf!r&*#9ecPy@IaXHMeP3A}V#3Zlb>2^>V9PWK;uKuU%r~ zuDQltb0OKc;VfyFSMDi2Xr4DEXA=EmqQ2k^%Q_Bz~`@Tsj__NH=p<$gQHB`nLtp z8vtR{8?fytyEJ-wfwA{CMJ+o;HL_v_=YoIFtQ3UV_()*2c1)x_r zZWb$#U@u3A>S_`Y`F=fCl>Sp!5ZG#Yni1k%=MwcS!n@!xsSl!o~e}SUSQB?I`pJ z(rwhngVc3Li4?TT(|cf#&Kij@Y9zm>t{Yhz+I1sq+H~E>Hwbhar%1haK<%}WrGj)2 zy*9G69v>$|CylHTq(kVnk(egz`v~xcARR`pjeG-uZ_sNa(}TVCHHr2S5^9X<1<`n~ zjr^E2p_K*wPANfQNUx1NMZGqvR~YH`lr&K8p}%+!{YE|Xn=CDK!XrK4s<9OXh7{|e z<|s{nUU5`=syHeP6-R}IcI}tSAMpb`f(j!7RArAH*lZzUS4p?yT|gwK0kR56VR~sx zdugBaiDfAO(jb7e(pQwBKg1*bf~$nTeT_$vmiBai2kyg}g-k>m5*(Y2v2R2w{;WDDpl7tI=G2^xNj!lmG6ev}Y?j(kegOp)m zI-TPrF_0N^S!H`?&K?B6OJNL_{1Y3Yk_gVn2xX`eFi8jG5AX|o7{@uqlwNwXGtHU9 zbP~Q3Bh?DsohzlcFgX0qb&#uqnVmbF@1k@VwG^cvasQj-{1P+Y1CKR0j{|EvGrQWk zqL}XDy-Xq6byb^vx-qV61y@g3Z=fsR=yP39VE}zC?1p;gT53?&3a-ITuA4yr@MTvD zuHn1_)gEC~GP3=+SY(@kz5bwQx(Qk*OuoT zM^qbwDK{>q1KwatNV!VrpK`5U+S)$l*VHg?e{vEdU{2c9&XghVlzJeJhYSHd~k}?d3 ze0IN#tGoc+ok|)D9zwv`M`dx@6&2%l7wsw342|AhF0Vp&SAkUg?tL-4KTc-55Bhh1 zQqR&>NP&m3yN~YvRY=&~B1G>#p)|0o;NSftVX?T~f9}B_eBGm^KHZZ(WlwvJc@Jhd zzGcGq)Ui%ck2}z6C61OTdj^m*y&s)I&oTJJ>pcUAzySZAn>hDt;20YA#NmFOJVurM zd3BG0o`tH589amzY*+6YK<9+LW2Qj^{joY z-d3>b(R-##+cZqmyyqE^-r2AR!7;?TB>U-foWuLgrP&j4Ws6ltYs)(f52(0FylUY^(@8T_%o{nJHSU4^dwWR~R9t$G6b+?-p{D(w)qASz z+3*WwM|T5TyJxqYB}>}#J|MCs?fC+?m$#%nm^_B#uW9f33)e6f+{D1q1VGv;+ZbK> z6FC3~cs<6`*nmB9yuLxR0>TYwbrTzfJA6Y2|Bh(FKX=sQjk&;Kg*ZSk=7xW#g;O3r z3+dsI6AQ>bMRgwKb@-VDl7Ezs5HN(Gn6&)tDb%(V zqYpmkAC`bRKMEu*JZ45G0fQ{lg%zV4E5&EA+PH-=JdZA<-O!#nG_{=~wB3?L3p>Ib%8z zh400DEB(MCEIllJ1o1SD;ZK-O`c66l*zJ}P0zP{N82>u|*$B(s_%DfgStjr+EZ8yy zix_@l^%G{9MGKk)UV&sj20l3JZkZxT-})_6>RHx$gJqT=eaGYKtm<&f-GbCYG9#w{ zF~ahU#bGHDaA*>r3woABfr7P`6iX4I;3pGCtnL+hTZ*)?7OylunOQPTmQ0x|#E!KT zi1m8uWQ1j{rN*)!)bQy?%enxyddq&97*RV20TV25;E9^$J)}2GmN(?4KqmvK+&2Yd z_@@ZVA$%!k9;BfUXdVvGI&GZ?T9`L2f8cu2Hyo{kb)F{P+Ai7}QT`iTn#tP9Z|z#o zvdi%mrC!1f)_%hhthWh0t>gPxNBFIGQVG{tl=Z%3W;L6v=7227&oo*e;FZZvjs;4% zTjHm!58)xaUivx0I^Vj)nhSZb>a#wn%8E~S5{!NTK?OnrKG6xfsU~Y`KzVxUbcD6Q zy3zJK@bJest=I~ad%?Pu!_ZbMjEw#qFPRTYNriFNy|&+lc)|tj&zDtJvnzpbqWJ!^ zNgF6FX@QCg%8eC-pa`fa0a1{&Qn{(zA_!FOqukKlr0JEWciQyeK3gcX+{h78yzoK+ zPcUscR1g(VL_q%EH@llAY5o2F|9|_L&Cbl5H*elG$Ii|Q0pj1{9Tsd2vg*AS8>E0> zYZLrGg2GyBGyV%nSX=q7AN)o2Y3f^B3F6;wYbzIXv!!qqWec;Wd2nq>gaacBv+l&NpM_cX zB|fY%Sr50czAamr^@Q7c(#5d9Dbo6l(822N9clepXp^XEZ@uZZ{!TgI@?R`0F&GE$ z1R4?pJ+vSm9-gS@g-I0ZN{4z%yShJDCkercZE)TWaSRrg*jA-Au@_IHrmI{`d_icJ z2reeRAijbM1{xB*xR^LZ9Hf&p!HKUXPD^TnQn0r~4;K^X@-(zOabazHOI(rEL@*^< z+9%rGiAgS&uOpI;i3N!#gvi8oq~VD>P~%oZ;#N-+WqV6J8lHH7N^p&yBB zBu*jvA}LgeOyWD|lIq<^s$bh$98g|I5yFp*<>eq$;hjJ7)qxr*FgPhSDKm9869@Zg zxKvLHV!=u8C7tlr@J7K&pX0w8rL{?4@n5t(>8y{2V?@U_Jn5_;)pIAEbup(VDCu*L zhD!~ClYUIPm)uO&@T8wq*(3)fHv?w+Q)QD}PiU9iOdFA0PmBV)l7s2e1jn8~ak{^IYNWsB4p!~_?fwDy;xAN5fTrzdg^oJzg=Op)rMI`q_ z=xs>u?WwNDA{quK4@sV$TrFEf@=y=1naRW>@P?m=?Pn3m%af}$ret%AK&Q9Q)rX?LHp#x?&N)xgEgW+7M6Sxw45*`pYYIvIL=5p#S6nC zB*j+16z@Lg3anQjocv?*ZGOZDEF#&%^%N~nQ`*h_N=lH>E(Kgq2@;3kbc-g2lqQ}E zBT^n9iwF%)X_?X`bta0zB2qkDOnI88q2(#PYFk9gi>WgOQ%Yp}lwodKJ}7*ENH(TS zNXf!nekxf+$}GCXq1xGol-ZtYWwW4DLE@1BsbR5HEJqwWTlO90YL$-E; zI9yH>0;N{Lwhs7*@nU7-asG>OoDEB?^~GUaL2do$ez>fxU`JyzJ8gYi4?zld+j_WI z(Tw`Geu8vgrL7+#i-T+(YHaYqVB1hztj#9dpp7u{ahz?I%|@z#KO}K&u+0_P*=&Ik zwz<^H*cKRU3uFq=lnC2$aRiuTi${)Vu!%A~Xple0B5aVHPHGm6Q`|S&K9{Y}>lF7g z8}D`Hdb#!4%7qrT{iQJ)dXi~7Y_J{nREzlg2HX3d%Anp41=~*BeoZToP0>cLW5^Bq zJ*@ypp^!EjF8P^a8cQqCn9_7D(i+I7m=^9%Yvy9bTUlgU8yqs)0f&t~DYQwO(BMfOHyy!}s8lEgx3@pwwl{XMRoFKpH8$GY*+0=n+aI^%oGk3z#ml|W7<*s5NcN1u{)~qn*~INb z!tEFuuDZ!hyoP~(CT_C79%i3eX`kX^s~^2?pX19TqkX=;0x!hV`%0@HrP>ndg0nj8 zNd|k8r?pCzYs2k@URA1m_p8!hqkBi%4+@p`x2Xz~{ZxDVIk)|5xzXt5?LVit6C%@_ z3OCXpHl{z8ZbxJ#H9XyVBR$a{7ha^<%~)|KgapP`%|^g;rZuo|@+Yl>(+{N|%gSK% zVQ<-=;Jq%Xt<;_cr(aLMDPSs={vDSQE;J34It8cSNxze!2Lf$|mj6O%89{Iv%FAvL zO>6QPn)(?*g4EWX5#(ZPwgsi%QJh48PI@Fbqe(_YMjzQ&Gs0CZ$ap-X4-nHIi4#~N zGoD0OnejBjlZK2Zc@?0J_mm~S!aN@h&ghphKI4>Zo*Df;s9wuB1vEt4H2nIRXU6P| zQyNo7T#Jk)vUz4$+!-k@wsruE%*YZtWH@_AW~>+5WW3crW2ZZ#gmQSh!ZL6yQ^pZP z#u1eiL_ZGCc#oGQ(`>C~cx%orP}(6l;~Ts^hSdbJt_(b#ksV3K4W5Q%k9B4IjW@j- zXd^QI7DwTou>eD6fQmIDvp(5T$KcG+%$8Yp6oMUPhN;LhALVIic4p_=c9hvI%PyEQ zd$!Mf(Vb~@v2}Q4Bt34-9GU49A~REk8<|CXI3LH(RDt6tUsAu{V3LY>v; zM%MHG>TAq;B`XCG%Y++QX6P*z$=0?*_>{4ASmIpY2<;EhNS%YTe#^R-{h%O@=6Xzv zDst}_D0K;DS@--WXA+p>H#u8BgCqcU1ZNM;el>R<6UT5|P-YTqXV^tosT&K9KIC~@hK^YFB*~Nds{pljKnd;6#FU66!Hs;LF*$?DfIr5!1a?1V1Ysxv=KIcPs&O1tx=Zrbu z=C&0gbHk}fZu1+t5BV1{=61}T0f_O!joddF+t8G;jcvgSK_fjAoLiE+(}5S!#`#E& z+}5+fxtDS;IRJ>Ge{S$!Fe>*p!>7-=E|c*|&ybXapxjFW7mPdiwu^0ioeFJCr7N~0 z1v>&A!Oq{9IG)#`YMM4cGD>|}u;V$$070ApWLSa^ka|lmAZ@Z^8hKI&RrI+Q7o6H6 z^^smg)(VFt(C5Gb4JxC89f|lqgsQZTZ24EKbvQ|vCU79fHjkrq?8B|Rcnk#6b3}VU zeTP$!jBbb1#Wn@icWe`+-j$ARh}>7-u}_ftR5|t`(kjT2sB9R3H-0JD@wVe+z74fP zp&Z9lg>rn$)4(Uk549D_aWUT}m>gHyJN|S#VA7jXi3np}z5M63(Rqb=>%98pyuCP` z25+0@Z7}3*kXr&~alV^7D_WL^S4s2U3(s>ADz0hI)q?bQD0%L%yvvn&=TYR)^}MUz z9v5F>%lke55%kr05aOmo(5L($oF5Zl$X9&n3rfZL4~FMAsi{=d-U)up$4j zr;VWPgdzWgr+S?+04bZv}KV_j69tfc{(xjbgpRQ9Ms;~$L;J%nOuXyoKtaD&1i#jv=>>)n zB#dxg5eG50X$oVTHzV9*Yzvk!wvI(LSat_vv1-3{F*-X8AhHI+55Y2WzlQ!C#ApgV z&YIWI^K?L10Kd=$Asg_xr`3Kc2Q=DX>17rIR3e5rqMOpN!Au$$BF+;f=~!!VBJ!x2 zNQd2z2*EiunPMJ*wPLQA$Kkn0LiOa4#LOCVeI-QPEgln32e2TKe3KTNVK7wUe-O|> zCP=RV5p9lWDV~r(EMEMV28T#(qzEYrkr4=591&0VP$CIUQ1%^qs*IGL5?V^nN^><> zxt5-HOE0-t$yA^j8X^snhD*~K(}4K#}D-k}Q)DV0j#=RCI-7(XH zY#=q)Gh-CW{{S!&`Cyz`BS_R<7O0a(g_!l`mgc7sBigaP9ja=Y`4OHBZeYu5?KWVE z`zZkEq|qVfUgn`@-p+PFz-!JfOyVlBVjU@ge5v=6G`kNXDZH z^9&CO$>t0yjz1(ppnQq`DYMP`woV!oV$L=1Fk|xuJ%cb~eO(?qn#;{_&BS~20sQ*8 z0<+8f1F*a&v^Rh0Hh(whg1$ZLcEG02C96i6NG0mRX5-OJgdik>#TekS0k}S%@VQtMKA9V1(2H zq{-4Wq;0fp5yTEigO&tHZ{TrKNW%7n&s&2f3E7++VgkM-dQ_RGC%kJ&cvqZ8NPrX{ zRr=VF@UgtH8VE@j=7w0dFHf<(TC--FM)X5;ZodND#jDAZrhL$>|}MPc7#Y3_veJ^cK&4I?K;I5$QgnH(Gv4 zFleJKcM~)WpJ4E)0NNBFKdr?(H}ISEbTlEvkPyOk61%z*!cq5o)YW;)jFD!t$b^>2 zdxY|I(#(*AClg*wNF!pnDksoBLcT7M5XFAo@Wt2+~aZx_OkdRO#2JYF#N_v*7lV*h^oKE=FxwVHjn&lN z+Q)50|5aAa#TjNDgr^KI8>}yTNJ9M8aO+TBo)mMUCx_GOd3MIatWy9x!C;->VF%)~ z!>zGiWmWz2Evu7ehgeryvl5lLoi$z+hP8mFp_R}#-h&yf#fc3BlXZQ2YZ>rwHdr@% z>H~Qrjn@6v(?X=x1?E~$AiQs|zVD%#_iJJ`KD+RJB32cx=kbJrX#w?%!TO5_PlWY4 zIzsE;2!9%^f7U9^*mh_Ry~$X16z^D-Ft&3PC=4Jng%HHz(2<>lrIVFY?p$O*ij*#Q zZu3|}fYOugl8cl^f0_VkfwWj!-Z1`#i2c&B)Z#Nj$M}B&q=nK_)=&%)+XsqoO7qA} z=;cm%Y$bFR+p6~rcDAyi_^8-fyaD_o^($JjD@B+F&#-&qm$QIB#Af1*2|~$9A(rKb zQBNZn#i8Pj0FyYfwK%$&I7V6=DNdH(8xR*Z6K6?F#hDtWaf@abD{tIQOxB9YIKEE) z0}0&cis{02F&);&2~?gAQfBF^T>r(QW@4_il)t~^7P0DEPTQ-*-3!DD`rXz{+$b%j zjdE^rJ7w}AD}O@+D46_2LENhhWIfY5r8=sIK4)MO549FQ2o*o56fqnwf7mFV6t4-r zT8LlqjYRFlU$k!V2SOhqR*SR3#R~)_K)<15y>(K2L-D3~2U}pl!`Wz`R=h_M{>K?5 zVSj93wA4g;kOhcy6e9;K(FEyHJPL2yOll5xsRw%CbF%&aeIFOqirp^c$fTZbshf*c zOsw@TAQv_tO!LEiqoo1TP}Dt_n#`*m?Usg9NpT)+wJABRxh}BE;-38w2;i6FK$&zi7vLQ5gLY z;z6W*#h!z!AoZ$;)GFy3=z9xK$mubZnN>@FBmQ0!lmw~VbCiyeTV6N$oOFeJBX|{U zejKv!Z2N*>f%|c{`Eg>fx|<3@^K9laKTeyuc0U(WQ>DC_%ls5!dlbo>+l1#S85BFJ zfC0O?Ff`f$-8A1l%nopEah;Wnr(vkr(7fAxz>QwX_v_Ef*{gyDj&**q&{aK_!fq&K45^KPkmi z8t#m8F#%q7FFD>aO2_XXj8#0t*d7eU_N2>sEP!SkW~N6I$syCrb#$zt=tigqHFz1n z&GGvuexVk0{Fex_%^z`;7+hQQ;>Y55_9=q6jCR-u#QzHEd`^K3@pFJ-bhQERLVrhH z1jteT#-b<=TBLlhgBBmsNmjko0gGiX3K;J%N48daQF>7+#NolrM7^|9N|K5RW(9{S zmWusgQuNZ7($~^;XtYR{rIo5F!hOL{m~nO{WYX`r6IXJ)AeRKHlT!8Om1c{16_t#q zlK40nB3x8Xz~jh6#8g^rdh;3ccjn&+n#83wU!VwwzU+baAWzd=sFyh`8_fm@;} zLg1ERwZZNB1eOq((1O6t1fI}@A_SiBpa)!~C0(B|B4KpGY=X9M=*bk}&~JL6J+x%# z6SgLlCA>@E2^{n@JxNeJ!^oqC4pNB+!{_10=Ggh{K2#I*yJ&eJ{zwQ z6FK-Cig56SwZXIX)_vAP*3St%iGv@f2nRn=8$3s!SU<60VjBWaCh)}jDMH}1@57&% zBzCh+socL=JR9b@* zVTppjD8j-2sSTc|PkJ?Jd=gYdBht`Yn-oV80#5>4RIP#ykq+kTX_rINC4#nd=$SI=`d{K_`FXfmTLNVx`*P0)0xKl>R9bs8|LSOBqfP zDwZQo`#sPe8(OEgN7)D2Clh!+2OmWd4nCm@otMEeCr}5P-K;N&T2Ix z_ilKnUE&P}!R7S>r0vo^rq7DXdQ}kDV5XvUaRIb~h4c+s6@s`H>6Y#RutA)hJ6?k$ zhXYuEv{O0=fFH8{5X5!pj{)*NGU+g4WR^>BNyqfrbF<^a#PvLvzGtLC<~L9UP52wiih`=`+u@Qdn*Y#n*xdej>_!hceb7!y_2fE0qSyQmT<9#xnu+b29~L zyE`}2#g0B&Ket4X$|`e95P71sSb3GgkSKZgQh!<)Jlg0xH~k9t)e2Xm(<~R ztpcU^IG`gh)R9;1NCn`S?vB-t)e7zYxLZ0_TSf%GPh-8fr?IrE%~U)&C9RMO9DhC7byWB zYvm+!I#|mxp7rOK3xY#={;~^Y2R^~4@;ec<_q@Jur~>5Cx+&}HW}gY%j%9_$+z+y$5hdm6#%$zsNWhYAJ?kp);{ zFX%ydCYuU|wJBIZsIWj=5MwBa@kM3js22I7%H(^O3-VDW*-((|TPBH@S?6CS8`W+etANUGPs~1B@ujiCi+R!sc?T4yh^};bO-f#=_T&W(vJ77d?sCS3qBcmqCj98H)P(qBj%z zB5!d5on*&JuSN5zR3b_(G88THEtQN?)kRr^TG1TN^c-d^+EDZ<9+ekuLmmvE=zyW< zfWLB^is;y)q92j{jiKlpU(~4_^&kGIb8(( zkn}MQ_#L@wA`0#C6q;mMHHjA@3^ttgyWFs9xleOM>}3SXRsJYRR{6B{L)Ccjf3m6y z`1h)cwdy)ho;R#I?~9TYD|~g3KT0l08|(Gc>aLv6t6#8~b%Z_;2miiiSpAw07Q^bL z)vM88AOGsY>Pf-7n_`zu*doQj28F#-L*F3N(K@+{E^BU}}#HdBk5Tn)%z}ddf z7}h*fcgHO5BRQ-Y?jr|{NUR*S`e|efnjX}8eb77*4|I}0?|_W3u1MQm81{xjA?D} zP0KaWYlo~Ihvt-yhXW=|3**?@35K;3YWH3^W&urEo9)vS0S^^TYu{?U_C)B~6BpMW zb+HeJ8rPm$hmZ6Aw6=;jW$ks#A3ACZ1oF8qj;(vZu_Jvg9~csx_wj`NmP*a#=Do4K0*uEUDz}arxV{=Pmdc9DE6|xNgP`r zU|1jELxPw^ja%Q+r*TXwVy5-ITCa}`T_1UA{qrvNQFr6|q3iK2)}PkH(?Cw^=UY-# z<6WO`SfB5M)v$hl_4-daPU8mcrYQl@8y?uu*;}PI7~|N6E`|+Ve9DQW($yPAc~Rrh z<_#&l;thr7AGuA!Yiw{CHn@Bc7&f@8H~dM(p}*l9VZk3AtIwi0PTe>YwI5Viu@NsI zZJce`INPVJ=s@M}jXAEGj)+{x8k|SGwe`kbp&NIFZ`|%;C;9~8(Bwm#UIjBYQX7+7 zZv4T#Q^OCR+7w{e6d=2gO^rD$8J@3sS8nP=rQo19Wmav<#l6G0Y2D^lz_;md%86r} z8&__wN4Fvl*ugPJ2G%=r^CLp#W;Ez{vQGL$zuCEY!DL6LN2P$i+T>OeVMXd=%Cr9s!RkxAXv5 z4;d@~1EV(;gSFrtN$FGlmc?5vB~6L8qeR=5d>+AV4HbnYO@+v<{LsOz8x31GiZ0J| za_d)dZ0iSxtsnRb2Qy(NC9;-V|0?;CP(_r~7vBa6^pPJjFa$igF*lb!0}Y?)OMWl8 zvwbAsL>DgF(nl$RF?fJ@Oo9F!hcMu<3T3Gd548aM&Uj5AD;-C-?-Ifqic1%79~lr` zYAMYCisPu07+AU%NBw3QO0#@P%1A#DC;h_Dd@`|nX=Q08Po%XHPFCgl(l3$4 z4?ej-P@gs+Lhyu?PKRq=im`p^uc4*CUM#IdUd!&K_ewDY<&>DO$+8R-T9)23-{JlX zOo98__Jm=ZUl+YCs(RaKRFu?mTb!jCK1itnRoh@dpG;&`+c1FmWJcw-Pk6M3N2 zRY~MSe}%?NrT0M2Yamsla)So_N^-bNtd5VT`Ng#DCkSEN9nkiRVcRdhLg1sW?Jy#b z5PF;ioEx6(y-zD_O^8EWoz5}3g@?*C{ZVUuHRm|eeaIZq!d_x zV%qKR^9XEh`xmPEZ2yx??S0rnCO3GGrkB;*F*+c+tZ`WjFTE-2f`esS8OmDulFap{ z%;;jD@sGknX%xLF8&)>nqc<(fCR;M7m!tl?Ofr;7K3EK8`Bh~bfWuW;hK}O1wO~=% znaZ+{=)MW)2Ybn2PFmLCkifEEki7%*n6lpuWxx9%;=b6u12Yg0IVuNtG~Uq%Bhwwt zkasVR?dV#)BZ6+dIJl#~P`zUyCF-P;`WLz`-4#sT|yKRpnr* zF9&zrE{_g~-l^N!*o%WZ+s3h-;f9^zz9e%F?!>U?^KX1DZ|8uW^oW@c+=Z4qU$vB| z9Nf9UuycVA7Q@ces-1Z*c2ZNhvjnKB!J?fXR_;7Z_dXni>ox6kQ#J-@JI@<-)-gbH z@BGJ$9F>FRf#pwvgXIlT>`rynS^!n0fMfFAkPJBUG37p+ueZg}!`f`TUBviG%4v zZ22(Y;X8cFMV^Q;OnIWpNvt!}9GKmlVRl=dR`Iqrx_oQ-PVnGE94Qzi1#DA&!i|UWukm7l z#&ok{GzGM=;w9WXZK!zKN7P^@y8MdaYOB1fz`f*T;z#^3zc<>_iJlL7*3?z={Jdf` z9U1avix>z?u{HVmdBr56wLQu3gf~7SbCO&J2h)3@!~^w;NfjITW9W+c;T1E9EBwfw z8u@X)0m0JhiUp|kBYEAtbP}UBONI)G4@LmssIJH$0Q#aFE1gWFk)81_6GH~>b7hqv zzV?o+*ojkf;XrEDsFS|bSG-qoZqICLNr4bs@xH2!6*qVy?7HG_RU3C<@Zq;B4JOs@i7yW*;LO-JT0#$79S?Gz$+C6lJ_$}sH8kcVfxR#7hJ zfiEk1n|2*;v+MKryN*}xdRrk4Z*uPXs&W@PRiYGclkTeC9S=%>-*p$1eymWsTMtU_ z8Ft3aZ1--%?%lq0(a7Ju`!hef zF!JC1ee2ynh3@{TYPZ|P&U7*EzP6_g=(_m3sygp~P6uL+Os!EV@7`aKKwr0uyz`tpeoyC+Unt39iE zBAncw4Rt8fo~?VXp|TykG8z%=*=yLdmz#DR+k+<&d)_tddDpk?%4kxNypLOvzL0(0 zo}XRptNNVSnsF0jM|U#zb|GW$bU}ba{#cJt!q_JU#y(rZ*yrdJPX5E#DH~&Fsu}w# z86<~jq_6aQAKhzkF==%p90ZCvL4e4&jZz~KslCyHVbSm#{od(&6ZT@6kADS`Y4>LD z%?3XDQ=Yd7xYbGD>i6dFE#G^L0D%sG$Mzm0DEz_1%kiU=zSr;Tvaj2|G4Pqi567KW=|I6+VR&?fx{1@IP`QxY0@H z^!tzQ|7iaO0y>Qp?f!2mLeB;FyJe36dOhH7{ecAs;tzfa2=R=(a(keBPi2- z@O6UkZ92H5>fj2b1RD<~9>jODE+0&%{5W=SbM?U@x)pJ%F=lUF;7$)75vmU!r$n7} zLH|~Vx4OMGpSbij8mWD&FGWZWZw*iz`qot3c}A4pT)U`$>%+HB9coO)(I^zJqzEs5 zNiBXzrxvH-ly~t<`Xl0z#3Q$;__tL2h=U?5K&w5n7Qf_urXVi1g?afrYtdFdRd z8;H=&Kfgf}jVnCi^ACCJ9^x$wbRoUgGEF7!`?}b76RU88;l_8fL3B0lV{yNnj;hmQ z)IzNhyjs&-aTH?*M%( zZ!aDsbVV{21o)5!3pUVp0KXVoYoy3qhanhc%2$ZxMYQYt8NOpb4(LDjlM_9ACkY9i z@PD>{9pBtT<^!CH7ycr~t7AYf0v=Gys^dTzJ;s4l77X2@qees^bYk+WYcl2C!jS}) zp8Xgfm%~d9*o`@f5ojdU^cZOtk4{3;67b5cta>7v1wDFk8JcUR2ZDqr+r`cWH{jlq zRtx}IicdQsV*??RUzso=x}!BNABNI}itR$Ne)ygkZohD`es5@c-G|%nk=lc{vf}4llsH6CaDJj+x5!dkC54hEV%{k4RBCd6Q%4_ard%dy->-uJn76bVcsN z)xtpBFA8PR0J_D11Jz?m6!$a0z^0t4ehWR=MgDdtfhNnP7_UB`m+Ow?iwH;f;)uGu zLJ5?L27iB0ln=p2^i!hkQxOYM=5pyL||yq7aWVIr5IPeL~I@8w4V zqjA?6fsP~fa$f^_g2@AV*0`?$<6Nw=EmU&A9NatsHbEu>Z2!e|4cHE#{dKyo0q=QS zS3dxK3V$@S89av`WK~nCb(G9PbM~xq*m0`1LxI8EGLd7CDLzfHc7$nW)d>4uNEA zY9l?3l7!|7LQ6iw1j(C50*d<}0S0AqAk6eLDAP>1d(-QncCp8xOe?@-(+Y2cGGzj9 zX8nILD3b#QWts`KHO&OvC-@iuZp+B|kwGbm{sv|G^dj=!Mb)QNgED<4S0nS~43UA8 z;V~+a6K=SX0OnQl!z&5%Ummjj3@TEGoP9ww83*4wK_rn-tV$!fTJR|nx&=P*`B2Ge zC??jUWfP0+|9>?xquj$q=KO~qE|MRp8JTk)RVRUtLI0l~E;8p58gu^97#IvlhtVj9 zy#i@5@82Rs90~=~?iLoKocbV0Yx(sD2y1 zN27Lhq-c@n5H5QwT2x1%gso#)yT)@zX`pD4H_`SQMT=?-2}d>dR_QKGDFnBDRYg-0{S_^0;zdBkplXkzMM2}K8m=Buu|!5}jiN;*LD8bj zD4;4@6uh58mY zW7Iw3qae0I!(P6h8m5!3=yCr!!WkEfK1O2$6zM|_fgbqB8Q~2#E*eLs>AVtSApd- zg1teoG}efQn~cWCIdKJOG<{*%tNV!VWI$r4n(iZ-NIwgyMNh%aWm;09X#gmUUO^Q8 zr+x$iigpk|(Q8$LqBko9MWchcw4dpuU-T~aN+3co0z3qx16fHbue4GUFhj@PBa|ge z#j7)Xr4s=OsOgnCa*y-MBDCO@MdBsM$c?*H7yEIt?8o@5EJ*qTwN|3mL5mQUyV%fg z3H6WiBp*r8WS+$99pt3U1{jFkq)wPt9Hw26SUkk+7WB#=RPT7&B$)Hn$0{o`4` zF+W!S#Q^S(-XI|i`qIUQJVrto^c%u$2;nF1IRbs}*~JE9(GJ%jLVA~w^0NWVpyxv$ zVDlsDBx3N0S}s2#7uQ|;Z50ixv1)X736$&F?c+9)t+o-@C*ce)mZ7*d1Dqs69>bVe(orz z%9D%1=#2*#0urw-;z0uX_QBA%!JGYD?%>U^yTS19KlP$+4|Xzm3s6nt>Qb|^)|QIH zmIrT!XBi9){&{OGZus->NiYpLDX_+?LM;Y=+8UQH7E$jy_)Dnd;4j6?l3ByZ%MXT6 z_&J-?f1T+6h3Kb!e_-=u)w4IJ=mcn-R7EN?_%_(^FlqXbdO}BB_4vdvex4vSL%2+b zJP(-;L1UqQwZ5_Bt$sr$LVJ(PA9hEH{r^d6hV17R$k+8$0X$Qk75u-HX2||Z(0|!g zhtdprn=8!_%fBeikhkTcbt%n|x6wj;Aq?bxhVZ42(hT_y{2y}K#jcF^R+=H#kxGl^ z9;F$I^?{*SL-6URhdx9M8G1ihF%&+_%PKoVhak?OJ%D+Y>~f&USW2dEK_UHF=+MxI zpk+fb(znhU^vq(ej3k`4{s(wmMEA9_OQfa@1JsY>r+!{F$LO?RX^E1A zg)_vgNagMbycm{6kS~zFdi%&>PAWkYm0^1k=-V$>6u%|mWIU{jbw%<=1r|M?WCaSl)O2U5+G4t{C9Fha1jLmYttG>gn=x!Mj-tNlxX;o zi?{&MuU!e_F$zj;9*oBfluF&2td+yRBLZZtlo>8nGGBW5_6I`jA%;&oJk(s0>-yCK zESN*fSZEII$$%ouWa*&DeA%<)48%J8W*f+(0ilH#yZW6xsvObSjnsxN_KUp2O;Q=r z5xg4Ff=E?6JDKE~6>sD}fe=k+!1|y_lB@WW+9N%{}qyP%a#O8Ba8XR8c^5B z3aTp>H~aB0Q$AxqR_!`RR)K?_cahO)5IG~OKn{)IeoIo{NA~`>1m&Fv*l+K}zyd(1 z_l#rY74E)9enrNieq#b9uE-@kpL(Dq7|ImV){z*$j>Iu=;%}UNFwq#{d0h0$6e^~h zH<8dRA~L3%e1$&8KcpMb;`%Jw9&+PP(dhu~F?29&@qR-y^;G z9TzPUdMXL{_84OQC`+AMjT%KUbx~~8Y(BN(Yht4$S^=Zo05s1UwXUvt)+o5Y*WaU6 z{85JxjzRZ$4nFm^{BsbgHJwub>78B--r7N z|84q-nnrg+=!KfDQ@1VGG`crx8r@r6_#Hh6xcZaMV4_4&^f(Uyw9x}U;|X}Ycv8bO z=%Pl?rON_9!=09#R>B$Sd+NhRFLtqU6E##=lnWrk zqx2p(j^5;AW3gEuW6ZIT@s0SFxQSNhV`GOQi5N2${p5|Ox%|h*LH=Wx@H)q)kZ&2g z6g7`s>UmBrNZ&9~LcdalkYKyra|gEX?8vC1Po)`?=sr2!HsdBq4>|- z7|@<^kSp55M+Tn0gReo1XOs;axbd|2M_a}>0Ok^POgz2|+=G8_FuqF*7aQM&cPGFx z{uROjddI)v)t#vB*0-M+--Vp#pQmD=@*v8)pBTTCyW8>YkmJ=)j9)63@aiYVF9nI~ zsPPjIqwy2nkkiDsIR_@500$->^Kc*>v9Db0CLZ?q^MDG;Y@7HufnAfqIOBlibsZt` zD`Z4^BZPb|(AUQUL>B1lGa%5{r%+rK=<5qrfxeE(^^K0G<8`w_ih>r?8d;*`MPA=a z#Xn*saIWj>(_n#)x)IK8u@|<#tTI_TSn84o$u*bLfo*)u=cCrKhXXeIs0z?i&0z1@v0xs*`>PKi+_!odVUL`Z6{1CN7ZP6zBv`;Jv~WKG0BQIR!(U8d**mNc{Lq zelRj+JVkCP-NKY5b#)6D>#7WjAQ|$dz z6J!wE4mZEZHN}FP|Gg&2Ahxe8gIE(`H;H#?7lqc1`-y}ff{Def@=kNeBz87#=zUQw z#>})Ogv*6~rSn*XysihxegycLd8dfw|H!h5#kh_q)TgD-*sm!|mQ6iGuQ4`=Z#Z(X zH!Q{mpbRaRz_PIej@|@hm_J1mssVW|(d* z`36P#Szd^(2IA>OF80raU`Ahei$HW^d?D{_u!=XP@j+e5N&48AGS~3JewDCauE9=p+=$=c1Bs#L4Al0|GYxp% zGn%5zj3#oKCe$W*aB#BZ9F3x8bVeA2&(7ngJ1+&CGX~Jo#Edxz*f1gCvyOaczd)Rs z5pUT*uOJB;7}AVFBAY5G<7JsfswdZani4-o?xp(ttT&26(Eo%%>U_vl@-xW}Uy+eC z7m@cHKo6kOnPCXcAzH6T1~VT9<7PfAevL6LRAgo+z|I1~nO$A%UR*FC#Qtb{5scnH zkjKOqs0A~JAWQ)=-?d6w6`DEC`x*1hIk1A6OAw$1HP4u5O0pr&Or_cqTmpMTFMsft z;%Rd0yqd$GEQ6CX^EfEy#LOasl@sJs?+`8WDnvYhAZD&{v03NIrOn)iKrXEVkw`qB zxmOB+o)DrVG7-FW;OETqfb%?Fp4AK~x0UIvI(?XVo63Q|_b%gDQd&VoeAa!yb2U_v zh4&ibtY)Evgv#7@2|}kZh7NdESJ*3mkgOzfCi9EDGh@~mLOK9QpKi$1>FKPoawVJ( zvnD}^vnFv@DJMv7B*60SPEht{%(D6s<=LAtD+i=B4P$b_z3>UMN>DI~ma?egeJBXg zC|vb=@HHBhEgl2 zC5V^}!IQSrEo8i|T$Z?Ji*i<>r3H2k}BgZ){k#i`Ncr@oJs-M5ii0-i?5=Q=C z1qI^g#36j75I-k}@W%TRKPOiv1|pfWhL0?HGv<^M)tkJj-tn(g?~$qIj>cP4diMj4 zGjJVqen7YYA$zu`%(*1Hjyb;(O+UMYfVDNQW6rf&o=|libMA0ZPUBqCZ6!f<9dnfd zn8$sB33CI{gT7AsITr(vx%YYN=iKHJbyz?&x2;SBxsJKdA(*_Ca_&l`Oz>06xf7_| za9^dIyTl~~cBspB%v}lPlFLj0%oOfA=H{tNIaf}sQA*i$%zc|G+3qW~xyR&6WIlWd zm7Duvjmpiv1mVp^|Km})xtINj@~GV0TgVx#xQ=o7YugpLg$dn^Eo!6zS>X(cyz-FdtVm@0I_nhDQSPH0lB7%~v-d z%oC~EVA(wMKjhK{F_>b|QS!Yy>4x6L=A###-_*qxKhGf2`nbSx&Bs`jC+KL*H@^!~ zl`$XmXTAwzH)YH>|1}!N1)(biN9Hd>1n;BBk*yTLV>tOGs*Cap|P*|3*{KO2Z$7`4Hx=ncMSw4EFgc01#R!rz{^J|zNfYCe zEJyhGF97xzw+v*4n_p6TS9F zFU-LnXQ9Cx4OmQ#9OU=ofL7i=w$O|$uN@2?0*ckLo~O|qJ%3EHu-L^G@e#_xt-w^X zgN#J6a1Z>$LiBD8uHci(eB>hUVOV$q={WVSW&pWJkCb2idVz(%QhAI4g05oUnKFP} z6yy?u9}7|ZocGXVkskh4F7qp3W;CRs$)ZQpUSOe|=-&%08iYy~JqIG6!H(P05HrOG z%aw4wT11bY7RA)`0*m6@NSFg*3{wV>i_kUs5asCw79}BPWJA6@yJ!QUUM2IxcZ=Af zL;nvCz32?t#iB~pLod2YBvBoI%RG}k^kV2NHBKk}0WL3r8()%$;3jcj!UZ0BiBn17 z8-tdtrYw0@?loUtvXOuUbPY>Nsp2Jj)%CI^hg?F)pPX4s=;7>=WBg?$+1_CiXX$N~ zYE-_o55hnfTX6<8NP3A>4%IJxQ%T~BhJuc-^QEP z@nvw4HAK~}co{m-WxaXD%Q~qQFY8WNpY+B`kGPiggB2{JWw>P~0tMa6Mk356!7Upv zJccWdRKnGYkO?EK{R+o2yaoizqLmUO<4gFwrNLoDAlHpR6Iyw8#T#?wBGN9R+AZFmYuQ~FTaL3Pl~q52Tpj|*`?*E z<*g7R0C^kAsI1X0=Q|viKL)`q??8g9%^?~cqI+511Nbg+O^`Qh1(h;V=;eJ|<1!E; zUOo_pzP!In2zwS%!tDrzZp~i%Q5WLf6rYSVSJM?E}~VT<#P>mQI_}Qq(ZP@ zxdSvUAeTn)t34F>ysfYt{yeM^pKUIGo7XOIMX7rw5H0YT;u4|Ij}^fxp??se7(;sz z`X^OPjk_z?R11f!k}F>NPb#?rZ=Rzb`T86fzM^N{4FCVBXF7 zk}IA-PF*UwVvt<4E|pv{2!!U-(~uQo5NOvyjY_VV3PoEn(Iqr~)}xZWFo;?)j{@&I z)$y@xnqV#Rz*+)YL4gC2ZIgtNBs5;q7B^<-(+V?JgcZxdc`DU-YkhSO0tfswNbYiL z)Uh_a+I^}8xCqjS>O`X2V;=qzg-=>x7RXNEqgJe<&Sk|`bA60}h!{*T8dlIjHCR{@ zTT!Flr$*_d^LiIsiBbGYl;=m6lSYH<=uuX_pd|4gWu=K^p*{jwIUF(SQQ+PHIgVoJ zQ4sU$>{h-;2eF5oVBeei zc-eP1PyA{!m;0WHftdU(Eq*(gSNR4Z%*)Esx+RYQc-NnRP>J#wzuj?Z2YfjwP z#FsOiFEy?IcjCUrlWgI>Gj$PnQ6}y^BCbgdaTnzh-o#x5ao5S{l1sls0dGEXd4a!kVw_kZHS9n<08S# zMTrV5LxEYm+YnO`#cR}ysACW}RO5mr9M*riPTY=Wp1Ql8kmS=C5{kgOpwC=1jE0=X z?>aN~eGA6iR~fswg|Q!@zCZ3}?3WXa-Ow`j*FeT@!7u#%AY-?S8N2%o6Y6!wCwe|( zLc^Dt&}0=8?%$6Jna+@0lO83EEK}}jp zS2z!2&5%B}+`=ILh8qku4>k{1KW!Nx-Nx`M)V#r5CWx(Yib2g`G(mvJC)|*E*U|_x zhFY0-p?IN|bqVe1+hCR?q68J;Iav$K?$Q`2WgN2{F<6eM1Lqc&&q}93rbxbw;5Jy? zwZ}O%bMs2f%~=b}U8PLIgZQSE-jJZLT}J)(3$~Jv29Jb5bNx_DQ~XPaX)UegUwi`s z{8qlpsj)x~A%3XPibx+0ylELrP=0guSj&80C~gG&XlhF*LHgTm!C3sk{q-%q1nG9A z1#1`&zFXfiR*>#gS;ivrbC9K}ax}F@XATTa=$P=L^$xTOACODHqZ8$8Vg0Rls4@5! zMKpf>zQvU=+?gXfR zvspxCWWsu(V?qh?_Owno5|(fTJUw7YIG~CM(f7j>Fnj|ZZrf^xZ$}oH@CneI0-7IM zC;SnX@CV9WMW{9;RQvH1+Qru`OJgzBwPIx?;h*q?ziKM@cX012uiy(~jf9TY2YQ>V zZGopNLWIE@QMOkkasKQJAw~2{$ zJ~rtK&3DE?Y(71cbvazWbpldrkN>R8_qv9&cX%$f&kGpnqrF5#hG zo?#Q5q_qSYYr?Gs|B16ShX7c4m9>=0dj^Z#kJgOeycvHTA2i!%{RSU2dk5_Q2z%$P zzu-%6H*{uQXrho9o;VS$!IugX>5)1=11s?%o`z(2Av&{9FebK4oG3&lwkL0%h?h4K zI~fu?shTA<)i4dxdKnUX)#g7kOol|0p9#V%fo2?u=;f_^B2=@v2kLGX#e|2o2wOpq z1|knl>X6hW{c9%Ok6fY|$pPkIjMYMuzD+tOh}?PNbBN{;^zNZax0CB(8$S6yH^9-^ zX#>qoLz6q;A0GHVd<~=|lue1B;2wB%_i=$U|gCjSl4Xp$Ert{_jgb&F%eMey9x4y`%QVQi%$kMNYR)dgjn1u0ib$*i2 zR;E0Gtay#sswyQKcQ!G&I%O$tD$pC59}Gr6G8Lk9SC23Ga|f_T<@t zp1M+oRR@L7r>-=nuC#?~OsN~gQumxs-3m;jo29-h-SaY9b09OOo=CkQ^i4f2e`GK9 zpQ==>0k-^%MsMeB8Y;z&9tsT`I8)k(McX>tjNn2ukEWBg+6GnG`cOf!9q6JDcrjoQ z+f$($o4_aLOtx`x%r>{mHj$v?@!S_!J20bdsck18L8;HW{;-|#Y8k!hV*AGatzfcMwn;O!NxLu1_76(kB2xdTwq2m2 zTzY%NF@*D8OGxjOULZuKcNJQs_u?~_IF>%lkUmWI zTIi65q>s`>r;k$HkkbDEdQ@qI(s`i7WJCI7FW-hfi#C1<>3Gx0CA6C!PY3e>Ome4V zZr84>A1JH<4lamyMPo`IWtHips1zC#9-6*7y(0Y#=tlRRz6J)(yZ7{iJPpZe_a2$< zB3F@)we)nCA>HL$Mf@fZ5Rv|c*j4r(s0xDux|CA?+|tT~cK0DvF`>N)NHGjXawuZ2 zVPdolJ@*0JV;Ih`>Vq`=VWNaj<%QvfPn2>oQThigcO$^lqr+k1BaB(_i$6W|K1`e> z&dUxLB+SOBeso3w0p^FzZLqcWOX&ff^biQbB2p}W4RYQa0p=Fwwk%AVDHZ9Yhm|}D z6C88YZn@KFs=Ej`6>rzK65adTk6bDgjs&G+(`g4 zH6qO?wF$u#q24y3HGajXQAs&V=t}o|(GZfO#~@U=YnZixwW;-KDvT*F(^|Vwgk~Mq zZgmxSGR*q6^*w7f6==*0oTLaZa2CI$<3J52pFvD#jtEQXl+rz=7qz7c!Kd^}!OV;Q zd4L`bOSzD8HRUFNq*ln%rrb=y104S60qPKjKJ8R$B>_>pw5gS;mHt2-!)z^V5w<6& zx_kn%Jz;x71(Lt}r87SkW-GJpvmGT&Z8*?T+ffxrCA?Eu+K{x-X|o8^UII#+l{U*C zsB>7_=V{-i{Qw{=2mt1Xv>$3y~?hq6W=@FLkPiA1|G$NlD%?zUm zsaGbfj7jZ$Mw%=$iW1xVCXznL+;}Q1Yi8EGY^aV#qT<@Dc#6<*cUeyS*1?UeJ%ll0 zf+nFU%le+~AN9hHL?P=Q!*&noHk57*0GRN|ScFuB4-js_0d+u#Mwo|?k8l_PF6YsD z2#+C5Mo2-}f$%dEI$%Ag!x~^}q%rpl%f3JR;p}sbq>jK0#&i7@bmr&6vioO`%O;Y< zPC{(L*>AhEu}oB{Bk#D?ay&=MJz(=4Y| z4h)WIbGqbsY>jh?{8~;cWxO7wGxrY5>5&taGX}s?8zDC5DV1S4!*aOXP#+f}6C!g) z3LSGs>dbw@a$d`^=H#P{_#w(n^pr`l6Ga>fjQOT`Ww9Ea6npM^U<^eWbw7c25F);rSiqtMautIpg% z%yBm_tbp`G0@oe?s2s{`&J&?Ld8GaR{xEL@CD!c^@zJpb1>Xku!I!$$SLP+V1Vbm! zTp}+yuS95iA{9A_nTX^t*<(ST_ceJyS^8psn z8*#kU;A~N|na=r4l@t3JyY!@uboee+Z-cY9T1>Sd^|b@%kSb@C3LD{!>EjI$?VRGA z!2-nkBzU2Na~3_paHhDOONctDE6{gyW@(*S1*;(#NX?mtU&YLw>*)Rk@F0kH!h+Gc zwP2Oj?CV%;)pscC@rYWP3DA?^w zMr6Sea-szvR}~y5AQ~M46CWzzO%R>=rLck@3VvHfBQ)s|eDuq$T3o?ho`@ksA&p4t z7%~)gr9$$Mq3~6@_a8D8E@R$92EkaEv8s(=Ds;3dJQP;A+E7>!Te!V$lPdhAs_>{w zcw&2vNfn+c{DX6}@PfPW9P*M$jUx&#(|gX4YRSnl7>=3>@3bj;D6A;ZP{d-3@aV6u zWr(8ARYfg*u^06yis9Ic`nijY9_&R?Qg?6k#-j17S_G1M7ELh}O_ADy1b5L~f+w(A z!^|<}Zd^=7N$w)C2CH2*CxzzdqP0bvS%B1o8X-g!ZIw6v6k$G6$BKGFQ`l}1o&*$K zttxU;D{AkeNN8Hu`Z-cP+Y*be(sSA;H8BvJq7m|z#G;!_6J7KbQhnCXh9;Cxj#r5>yf(U{t*DKs-?Kcs82=DwnrDp6|DMc4m)+-|PFlfBZI|$;|Y0S65e8 zS65Zn^l15$%Qi}y|B15@hq%jB)&UUv5-=`e(8p!(QGSLs)UvN|^)kG4tdIUi1}+ol zTh8W9DL=(u-cPTo+!P$1!Hze`*Bi@|%P%XR4syc-P=1a!{K~K7Y1BEy6r^vJUk`$n zUoVzl&zl8NFR*hj#<3j7^8!0>GLENkKy#e+l(&&~S^j)^8`X&)GQi3p?XtXv$=fLDB!hgTvAm;vZ+U<; zMM8Loj`05S0Oi4t2!N95<)5<&<)0hmImYrs<-b%E;t}aR*whOwfo;<<`l zK=wwqyh2w+E4EhbB1G}ih+EOYk}Eo-OAYc(#)>y8dMf)<3%8@xZXMgBm6)*jk7}b9 zR(yjD^kV4gcN^px#>!JF$5&3Kg0HaUm4mc`l_`~zqY74D%EU@kHq%%+t#VG~N-DDj zWvrK9qFJcjsLUipMxCWj}2oR#%>*oVj_!;Pg@ zZmN8ri@M4Vem*s1{?MxY=0waplpfSRg7Tq0&$E zN`I?@HO7BP;{9IvClLM9AkQ*ZB~+bRbv`w&kS(w3ua&7fr|NvI4EGnX^r~~&xmD*H zlJ9=21PPQ6@z%GplNzRwh_a)f_gVY7Q7Y7YA(6i>KjOg#-5G#oYqCWEc)N zj!qmu2<*~x0N^C}iHuc?s_w2ej+Q2Y9O%96NXI}}W~{2MYOLCVx?`)JtD@mSKV-Na z&oL0H8kx*}7#IlijaA#L-mQYCgb#$O4js`?s=CyI`ar1q42XVaknb{99jyAf`er<) zflzfwD^nfA6VY?kr{H0f0Z=`p`ev41eH9yDoonU zmrIQ5RV=xBm2{awzQb58RhLzF5Vm0IYFRI}uDU}nr80GO12Q~EOnt9GUTCa-vHG*> z<5Un#UHy_?@XPAs(FG4PvHGwwVi54){r}ben{fHQj^3c z)Fc_?yNxyH)=aLk;t?@*4J?dcnQM6>NK=DeI5AV#EUB?_rmlIwUjrd=Sz?f>Yu1Q0 zYgDFQ5XIDsjWw>C${Ol$V(J>VUTJepsP}`2wgS;sgS^C8v%Tis8ZH3A)HQm)*L+%| z3&0>#*L=awt@*+r-)XElRP%f7DO3-bx<(g(wT4>iZ~AEjsqN1u)bE?1el6X{^;hmEzj)h?`Ejk;rN zm({MORK{u_5CoqfO{QMv91d?2ad_=QCPQ2@f9(UE?D7Rdyg^=JtbL|7xArjgCM16C zT8&7xWwm6y(=Uj8DkZV>+E3AhfI)u1So=*~Vx0{c$cC={Rx4R|22TVYb;J)Rw4qb$ zF0Qk&^twmb^13I(E$RD=b?&;Vx*dcQIIPa2L*7!igAl?mh*NsqRyMwFt3m#kvF@e1 zPwKFJCykrBm-QlF)E!bwP!T?E>bh8RU6(Y)AU|lVJ5u+@I`R|{Th<-bO0Db16VZfq zAmEAFa@|?$RGVbo1^#v8JK5y*LAG3%Dy~aa+45fzY$>qItvEUbHu*Fh@TX0dar}Z> z;$!5M#&y%z-MnGQXbEmjl3j2|vN-us`7yz`u3_D?Oqz^lpi|NHHsiYXbvxIQh>BhJ z?z%2OAbc_I62f{O(+ry$ldx_dlOOf3+t`?Y+OHATtCad zejepgr$+K4?~^eu$E>%HTmP_s{eAQdc&#Ky$ol+M!g`mu-lZeW>p|jr)B0*&7xmvt z{joaX%GxUr2Kfo&`i}MQH%w4DcD=4@t^c?IPE!5@2ApHpcd@e?FoUl@f}=}Z-=#w} zZ{b*;2RB6nwta1g6&qsphbsR~6vj480ErvU!ZBQI7~bo7a>F_17lCc#UW2^a*l>Qs z)eVb?A29YBENjRUlb8j~9vQ4tuhku(o5AT5gFKhY+&@%+Zdn6$=} zk&Tno;IhW6{Ecay?25O9^v0QNeB<1y>5WU+m`2OE#s~b3_tF#2TgJwmRYId(Y_#h* z;=a_>n9mDGGF2F-A~xC}Ta1mH8atcj0v{4+jV(H|yLloZ`vo4JP68{{kUho?^&4K=fUi>Vk-TBOMu-jX zY{2m2KZ1{f=^OR}I;2ddal`%%hnrn^NK$>nr+S&6cp~_8V+H;(IMS0|BFPv1C^jo*0D)U=I{8aF=U-}nSQSiTX{g?##5k;5c?Vj6!Q@R`cDw=)c6~ ze@WA5xHQ8n1Ozz(LD}yE^Z1O-zUI7UnB6hbG_*6ec|F~bFlp{Jn<0OevH6AO_nLc< z1(S4hr$(;k{X7lH#4~)ZX!e71oBd+5Ulade37Ah;{VuSpaa?mAjuj{nhgAXNrmHul z??@G-D^WL^1{T4pem;Ev#!Ze*xlB3_aM5*fa)Dfmw1!R3F=?WfRw$PV#%-&%PfH>Z zzU>x{73F7VZ96<>TdQ$fH9j4NiE^7$+~(Am70jF061HRWoA^`?8MH_@LQ-U06%E?;f+g%(xwbXS)T*6XNzKLX~XisETOm z_AGIGmi{0TRe*jTIj~l_y;9s>8A2nhc)Pg0U4IZ+T-^TFsO_I?Ek!`m_T%FA<9c0s z+|nwcBN0cu*b%Qo(jTfV#jtNNZrX}JI4AK{+ui&O5C0}iZ3!w!VG|6Y1Qi0Yos2bE zhIqqG?=m^xzvk7_ntcsAX?NqKE1NWeZngqZTMz+%3CNX*P}JmO9j0B(@ZVYNhWZ`CH&wx&FznmX~m{VSGb) z%dLyF1>t`HlS*UDo|c~0IGP}^Qrp7g5+F-sTaLCus`4L@`R zDrpR5kk19QDr0N^){(8LL^p_lR;*R2`ci9hD{O@bXsr_ftrfnK)(K+k1Ra{bZKXl3 zHnv{XdV4GO9U*I}^=cj1!q$gFz_>hVT|&U_$FW3gU7`cigo{D0F}6O|>TV@B9BGWL zkL$pyT6cwj@piV>5-@Z?YpvK?s{_+@1B2XXY<;8k>$b~KkgUp9-9Oj*BTs~cY(=QT ziEWG2&4b!5i_6$NdNV#Krq+NuH(w}j7WMivHs6FV?8d1)Oi!1Hn-}O~B5m`^F`J9V zZI-(>Ki0|87olfY3gb4n1UA>=_G!9J-Tc~?oh*IJWHxfkRk|57YRk;vDBSXZY0I5d zmV(T}CX7|W7Mp3ylLUsFK4DYI@-6kqdiuSXMYilB&TEUuzb*c*EpHMa5ChZ6mLs^n zT-CmU!6tgBiJT&sujKWe&Ms=}AKTWyEd_)E!P-v3S-OhA>jO5u&B#WznK-`PZD)6~ z8}19V!GcYHnwzU!!q9{zpRQNXGy{CtWNe$-HlvN4Lo{=@U7_`M+dQ5~)!l=KQ8Rbj z{cXo%(%K$5v+Zeh=5BMM%1`;s-ImS9w-rrIZ>wcv+ICaR+g1r}O=4S<-eJKqFY_`w zZWtOD^4FW%K0$%E#kRNgJ`5H(&_@A-Tx)Fmp*^8}5;zv7L!0ivYENv3%aH%jDsDQo zo7l+q)1ebne0}?9v3<0T6YeL9?GyDXL7WZ7_SE*dTTfL@g?3t_?N4>G=|2nU?Ft*;?wXq3p2x-mw>2Fm`5vd6^sV|p7_30q@L?SF)o z)n?tuvIcphaqFDeGrnU^$J5-_=~#xTcfQy$KZG^6r#e;wyEoJk9Tmeyi;D)i&e$P$6n4A>W+fY_ zL(x%K*YOhYq92mDc6 z?nu_5Nkr0pGAw9z-A@9$ehv=5z|uq0 zHlt8}s}K)}$gBR4VGHsR0)lEy0fF}a{eZZc*KvC#6mNA_C?Ia;GK|1rK-|pBLjiHY zGMfGq42YY#Om*-vH6U&#I&$WBXgp}OJ-A9UQG%y1idHWeg{r%I(Q11yTJ8AXr`63X zPfV+ub3?Sc`JNE1f@Pv;b#rb6t!}XMhWKiiQK%geq80d* zm`in7@X5YYCmY%JexZ}ix}7-vrT=~6&1yL@@n-D}5pPy)h-NF7 z4*CgFnjobM(hc*$T76^(piF1-JAP$)C!4cBLAjgBd%Bdnar1S8vWCg;29!0p`87c)Wb)o_ zrLdFTYUr?~rxC9a{11w`L&!8fT(X|ZJFtAMF zi4av5npz{LRF-a;K}c8@pr#q3Wkxg-#WAFcTOJWDk5E6UNcb(VspiH57i<}aF|5XA zOY4EgCy7>*b*%L|BE)N`F4lU1^*WsChs}j!Ax}w3z}vYOvgOuEi(-_M5QWj5Xq|3d zV7nBVq-jVebC;{~)(3eakheaChf!vZRkmFUNDel}dTfmK*>To?ECXOwULI;bReM&#jd4Hm9itT3G zokV9iC~VxwfwB{8n`gU|h>ag*CQ{q(U=wV2801eAZOd%W*cwp=ZV21G8j)>^tx+vO zMfUO{HsT5!-rcs@M4K%NeKYO2jYqYjtu}%-#F_*GJ8v80&k}8$Y%kmJQV`jFHhpo# z_Lhy@UGzg-LqvM zWPcf;!7_Fu&QaE%eVF~_m^AyDBkf75^=CiVZ~sRpyZuLe(RLCWZ@*${x;>qZvFDDl zKQhjKtKUA89%`H*80~O7+Mf~a&xB)W_nPc>4x|sBiL~Vap$QNwM0-VKlaTnF$=)0Z zB{EASB!m2UqWyLIUi+7zurwQOjkWvjU*b$Z^aORJy&D~6?-uRdA$$$;fkgXJ`=6er z$U^3%{g}oIj+1#JyV9`>%mlx zt*Zn_gXn08W~w~SRF2m~$7>;6gYpje?UO2mRL36o-hLEP==j3#z#8-Xf2z^fjvmp` zqdLhxymM<6q5@BMFqX`N^(&^9){ihu^hDD}2xe7t?}i5rvPrKBTl{*XL?9s_RETy$G&# zwCgXE>o*lE-rb1zjwlZN+{65CqgEo>eP(1lYKA-2eKmUWHu6P)0`BQ1_qC`I6o?3$ zb>C@nFX&_oPd+Iav+90`V3Lc&jiEmOzP}N(I+a@NZu7faG;|KQcMv(kQBHM#>{-O7 zoasKOI#%592hIOymuDbO=>gA3oaRuio~v%m0Ny`I&ccWCrs-PyAoT*;?P zkHQln`#gns*vIfy{Un}B&pX^t;@Rl;tV1imUHcQC4Lv(W&(6^3qt~`Y&nsaA3yydG z${z+-88G=G(eu9NOE0{o++E`NK*!`K?@(YsKP2&K$nzhXQ@s5F^gp8KKheX#fDeDK zQS=%^2oRyP$+imh{W}q_CSKrOi27(z*?WdopZ9X_LbW>Gq2f*D^=07Y=~U618eJdW z&qDWmZxg+@^{x-g&Qdk%^Cx8qIQ9x`-UkAkKTu!`--01J2gj=d zTYNE&5@3M0g}+Ml{@Z)ZcN>##7f81bspz;dLm3LHUHXMSNeQ%*$YH#yo0w_NbTjj7 zcyIb1-bC7~I!-FMpeu`E2I1K3EWVgYz|hj*pMegloqq z=sPpxCF`R+;ZjYr6?}1&fNipI8Vuds{2JBe8;?uQXQU^}Uy))->Cnz&6MTc2e7M^; zxRWi(Pw*yfr{1K`@4o1o^LSokKS=fYZJ~vgsIq~xEiCO!z_GjNu z?a%s#pA7~>7OIM9e>R2z5<>0Io~XA!8w$^bs&2pPOk3kDLCc#WY5N_ zo?H>XCT880wJM8(1*8RRd6phOlx60LkRDlicz8nTkyVz3Pn}~dXEpk>YC74{^Vj~! zrAO8-F>4pm2yFq)RtZ^eiCJ%{(gRBveA!Nu9;N7)r6=LYMOAPd{E?X5lKn!#TqfP| zf9V^}8#>8QI9`cK%()kT2dFP{9_MH9VvfSeTd67iLQXkP2=ztI^OV4OF$aE#h`yi~ zVzs`Y4hUljxGQq*W%9Q~^Be^P_^~Ueyp!E!2+*6WcMa>#c?G92JvpD@bfJJPv;IoV znUs^71BEL_TEMYPqZ`svbLjpAv=$7CkeKsz&Tj>Ckcm{aoWpz&qMf-3JQ1o|Zc^V6 za=~7js+LQ&^-|SxZ9=4~mRnLV$3R`1TP5aJfj!{E%H4=od`^LTti0Qh64ama=BfHq9y;Vi`cq!{Dj}~tkmu`UceDRS zf66N-Rp{=5xoA1C59v>N_0XU4(DXj^r@VT#P;dPyufE_PDE4e#n-J2U@?J3IZS7?D zoEok_oLvuvoWBJP|Ejd5O^Mi$e2DBRt)P9MDpBDy-#sLL&pNYbwbOVH9icp6!Y)&j1h4fT?I@VMqh=Y44 z<5-Mi9WSYzlvwmY(WAvnM@x(Fl!m^5QK-35Ao+}mMRi3@MO!gb#ul{|ZACHqkzWM` z(2OE&_bIevKw{C(qW6owLT2+Zw!G*C0tnn^$=MLl3pPDv~}R`gf# z5R`_=DtEAc>dc^r;Q zaX=tY7bYea7Z+ES{&TbhVsI^n0Mijo1Qw?ZR)z?PC9x$ZGs(d1UeM*V#1do4(2`4u zE+ykjE(KV~+LH5WPBrj84$dI-026A-`Aiw?FFC)Ht?1XkB(&L~GBmMdO3BS7*aec) ztVDOTlq@c}7lr8uyubr2y<{nyP_opZ3{Nb%zvP+H3-E|&R`LKLPINAD@x)t*B|i%VD~{IqpmppRP$-((elHBv?O{o zVO9+KP-EhhGnLWG*i)q;(levY8$l8Zag@d?7xB*%Ar@1*T9mGiQo@mXn<(8D<#a^q z3Q<}S(#pq6tAsdZB(}vIcdC>t3!}}=S_QRX73>nFUA-&#M3g@1UBO{dIvlEC0-WMt zn(?Qam*bDdbFBGs^&A^(hEFv@r87f2icsmy>nVY&5zrKr(}}#qR;<7IxuAY(ex{TC zYjT%452qUg=Jhz;LHeorU5v{yrJ7*OJw0K>G|Q7jMMzwfqOP6dRqmRoQQ zIfZLxQ2u$UGgr7 zYrn<(58ry5XlWy*nW_hog0uO)`Q{>!{DG-B=yePhqofQrUumAHlrsq%tr z)kgly2P^j}4=J!cVk8pYv5HJLJijlLpATQ8K6o__7~v1D!||cO9*W0t5%R~!D5--j zXIRF#J`<$n|6iREABVN9>xIFVPRpL?l3U$GUduH>yNmZn_wHjl&b=^0k~O~U^|;BS9jaa#*MkZ^>ux3P36YH zwg%gAJH06>ajV?+yB)RiA73wvY$p0Q-S!ttu@AKUg%a2|vky{W@!>Dg_7{<=kH=Vh zJj*_CkbR)v_E#rcdFErG+%Tc+iK0CbTYK*&3}AosfrBzzP-X}wwKQpVy*s0iG=p;U zVEY61LI({3GwBVn_I3OQd~e@DLu&^gzG0n;)~4Fucf?{v;1l+!{ZGOVuQ%EKqTMgu z-$y0NjeO50zx^m$rhaK0Au0=)&L&MXpk@ztBskJtG^~Ryjdd*Gw@B%$#e|1rk!yc! zhGU&$lMp98*hk&$pN_3jot26qo8f>jNi!EA2OvBhN6`?+QCxg3IzFeN(2MmjP^7!K zq;>ouI{u)s04~JXAVG^OP5vmC2Dj}8&$ReV+7@LVU#O{=2Id| zz%_?ICU~o{-mqMBEk7Z=WgMO-3?4~tRBA6QF@+? z(kMOIx<=`#g5)&UfUkR1Ps--4YVShmF_EtRzAJcF?zkzMelSjeN>t$iy=}L5B4tbKJ0A( zKB^e^KI3g5B=Cc*P;;WS>0XJYczs@I$g1!T(j8zW(JKW-b`bDF;ViFjkk{w;O4#~y z|6`#%U`%hW=*^83)WKrQ1ZAmUQp<4h9IQjf!=Nl1>}~eGkoyC$(gPznHL$?AsLPxe5_KUl&Oo%xdBFn<8<|&&nO75c_Q4(C z-k@No&IyA7$v&J5y|6TVg+Sf;IXq3@-X?P%Nwz0islOwHVCJ0=f|+n=3(`GdB?-$r z)gthtX)^{Rp_qAR?x!p*yA@>5er1)A{k)j{e7Hag1!iO)3}o-`WUJ?g%rq3rL99jg zk7D+Z(S_D>5uY@Sq!FXT)x#=A50YI|I0 zf?EaYVF9Xb)S8U0o|D80b1cUx_bU$xgY$39pB28=pgcM_e=hzG19oiwzxWwz4f#(* ziIIF*AQ6UXKH@rphG{<3=Lr9HK2&1Ozn$+V?F{NW23=T(sWK(s&y@QQQ=|Il z&ke3ME{!J;JZ6&cxlJZLf*F9sIz;|zyh4|>qq%D zlhE_NEA+@UWfkUDY6{lIq*kUp(Ji%hvNh`xq&Jwdx<`5gH=FxQvzWRzCSm1z%@bXc z3nxtU)i{+v{2!1Gt#!vm2o%K1cP zp7J!nv8T_#F$2fzxPuQu8RD4lSmMK%4bZ_611)SeCxga0#POWtIpxJo)PBq zc2xg3x}*BX@sr*^G&U5C^sK)V5qW&^(eZXCduBwJqZ_9Q0mn}`T~70>b0mms9pW7C zOm$`i=U3+hjZn_(oEbodej0I|>1@0+-JsZqIA=K@@h!n4BCd0`UgjB|2;w>&^zcN) zO?4LemJG;n);LMWrlrjf+4s)Y3}=V)btF6UEEY10!aW2;5M5x1B z?B8hqCDk?1bw5jU4TFexjf0*z%H%qo9>ziLntxHh32y#fSONLmT(x+TpiUKGXtlZmY|7WJ9rTdEdr3SsYJky<)Vm+sZ@shA~!w+Z9cB+ zD){2X)Nnl`!#&+S7dhU7EMbqj>7#k>Qt0P5|l7WcM+o z{Nc$!iYJ~@#(J)gP4*05TLS2w^AJdKhUhsX8af3h9`HL@^P8iBj-kmsIGCZDnv`ya4w&;6au{6bhy@Q=$M_dG^fDEpI#)N9^n(BD-z zI&mXWKh^V$_s5tFPnD+;6=9SrStK{uC{K%0%RS;T2Rx7((vXAn9Rumk7^&YOZwvvK zVkUS;&=Rco(jG6?Bh24(rNo=2_~Ho$6d><|qW8h5W+T-ldR^gW9D<0ES|fUELVafP zK8H#kOCST!yVvA>UA-HOzC#nJANDGkkksbLr<1~ykvSxDWMnHc$Lg)foXT5~d2_H8 z-I)&(<)oPLnRaSLW_3?yk=}~T)=(=l_lcSNdbJ|+xR`moS1Ww+qAxzwibFnACsPQ# z@BBl)v+4SOYC*d1Cf4JFA!`0!V9z{(W23+<{n1QJAg&?4SAB1l;rlwP`Ej9`PTJEA6%EW$3_X`Pj+Pb66t{22v)sDQJ!Py*Lp1e#@B zp;;ztN-)wO>yA!lS<;pDI8G}AS(!K~-B}elW%guk!KqTfbmJM4wJYnR9Efzj>u(lb z-&g15tN>5M+Edmq^e}1{^z1V!@kG1+W>3!P>X(syQ}!HvFWl_;p}lak9}8ro+pX8C z(U{o|DCuj&>@_^Jg|`qfMyhNee=Cg@IFq#9akJ|K*_B%9+8^UvBWbep+8Dc5{ z4Z-%f*{@KyXMfd|y$40csN3Uae;b?qZ4T)oXkIoZY%R<^2eYnVz6$CCdV4;)FEuA2 zr!Fon$C#93>dqMg5FG?B=d3`^89E9%_6T_*gIq5kMaJ@8V zULXgdHEPq7a~4agCM*!wL9ms*)P_rDMfD!92;VqnUI0q)VwPQj~F(vab8TI={ z^RbDj_6G;1J|bGEPT3&^9qTuoc9AcZ&9Z3u|ONsD&8SE2XlTdg94`pksQ*P zA~%jFQV9$BHlN*plqKpBeyCS-%!_dkK9cex!ZDI zMM6;b$bCH{*H7S{TEr|vgW(|O;r;~Sw0RKsdFKW4Ms_m$wf|K($axgmVP7{Fm4bMD z%HiR(c`49Z@`fO_cQ|ccidv|TaFCSzgD5sF?;7ytc+ze#LFV0P%Db+UIg%p6LFSIh zTQM$gktuIJ9?j+9w7-!2&3har9yaA+szGvZMW-hZ4ja4r%3DlGqsX)8J&$iy=7DGI zD+x>^z|@-ZFob%6;j>fT2F@%h2%4SJ@;b)k?HQN1%aqrtp#&ca!TJoa_L=hD(_lp@ zIX!v*?h~aW`6Jkrqj}JL?Fzu;pMpq}1XF%oA7D62`Nn9J@<)%$KgX0mR>$Ym)clKJ zdQLf({{o=q0pReFY~`rN8&&e?!<&4F@RP#I8iu!sm9FiouVCMvPb6uc35M-*ru5z;l6f}Mqaz9)0R z+x~)AH6#xeAi&bq9HeIu%>xBr>C8W>;JAd%H<+p5XB8nKqi|>;=?%#=zzN&JiGjk= z0C??9l&=uhy!#f2<=|{Uxtj2?r^3sU3a=ehc&({06&W5qNk}ccsj!sG+QP-A!rOQv z28(5=x|eX_1B4^R6%|@>HUDqK6{Qx|6uzoLe9m9EQEOvz;kJm~ucsU@e1{sHT)0mf zkXCpQd&A@P?82|b!mlHHor0qGDJ8)4uc8;@Xg(=A#b4A&>N(Cu_nC?oQIa8y3ba|gN`;~Tv? zOr3JPXcKQ=QJXYi>NQ2Lv7&d2_USxE&FDE$^fACG#Lqtzsb7ZB-SeFsK7)LZc+Bqzdhw175^yEG0Dv!z|fR@+Ojk zVVEUv3sa7le5k_wT%B=CN1u4cEgg-xq0xcTQ&H!CHRG0!HVK`~H~b`FZuFd6Iv#Uw zDQV!n=iJiqTCv`GY)1Ipa!an@VTk z(K`b$-{U2g(#2&>JP5P&VSnigjhLoV=+v3r37X_r!!U=GVunR(a%rtFWk_iYZhq>Y zT-vDyVwQg3FU4#WOm(fm2(cqzgkAv{XI3vR2P;4foZ0c@*&s;Lb9OPF!BzmGu7 zvUB`pNm_~IGBGL;v+TyQS?FEuMV7L8rm|a9D(KTAiJ7toO|-##)&~QFFS3+@vsIQY z%fr>*VOg%mmhJSHwQ1;>%64&jM378imM;Zn`vc!Mx*J^!<0@-N#h8k7>aqoCO|)@E zDrhj6k*wM{B}XX|hE%Mnuru>pJd7_+$;E6uq$0nfm`VLeVfzs7*E|T?Ar%c3Elg6C zIHcvnsu)u7V#Qu2#c>-JX$4A|Fr@O)%6j_NbLBj$E|x&Bk(IXKx1KBAVx^n=KTtJx z>@E^3i&U=w>cxG9SXm)y!ktXN+94JDD)v>9J3F@GD}Kg@PAjnZlfc0Um591b2s%Mx zDlfq6#wt9a@_M@Fu*kj(nv?YEam5cz$?;eG(1}R!gvyhclHXN%5^k0yR9?W8+(6|8 zxOp_8@_MG^byr@G8*~4PeZjB?tlyOnsoYTcVijg{9-vr>_$}4ot9-ZWN*Z_gAql!a zOQj@i4}KOKQ}xePLe&JZYC@=e#;VJZmLgWA=rs7gYKrRDP{RX{z?7&QQgvO`;_54~ zLWtKctFG5-tGcuL3e*J8WYr3sd6;CV;;M(MuZT&jdVFNnQ|fD%RaSqMyOZVKC!|;9 zvhh_VQ`4*J*qG`OW2$}|Q?+MY)nc=Q_BeYadokN5~!?d@iwQj5~u4Qp) z)s?`Yv8%ealjS|H2Zg3rZ)4-DU!0m&{bo}2N8_qL?5f^F88rH&SO35!RR1VU99u$AbR0BC1UR)<&YR&4JDrA>PkErn?vqP+L=siHbUZfS6YM{|X0O(Uu zKTSxhS&#f1#F`CZRXks_2UY9n=hEL=4<3UAl4kvYs3BbrW(w~ebyA- zn=}flhhVqy5p{?eqa7k^2_e4tQJcimkW4h$OJlBfY@IJ5qxO>8%Y-;79;x__Q0)~V z-%0JQ{#rN?3e2kSq;`Q=yWoVblG?}owU20-lWW&Rxk~W0yS*+cx(;`eM<8IHdYuhO=mD?InudgJ9uy$)$ zPVV-s-BA}8OS4Yx>;76ec-2;Q)xLwvLp*bs->3H9{@Ty9Jjt~OB=zg7T8^)3zoSyg zwZB69u0t?N-6>)n+@oj*SGMbh)h*<8)s6Ajjnd$B)t%E!k&PMY=?mrBP z3JK36oQ?FcaBWo)k&t*s&PEk5?RFmSY*aVOP~(+f4LTdm2Rm8Oo-PRrT#-K@4a4c% zZYde3-+Lq&X2k=^*;qdm;h+nZf1-B!#F#{y3?B#5a-ImGCatB1QO-uGjuKDgY?O8> z|Lm6`eI$LMI~%2*(14Nt3P`^IgJ;zNBV(6MIbM|GLoFm{BduZXRkrBnrRHpuF9^tZ zcTg>zEMF`=6V8?y^0o4GL3cLF8N>_n!(H-R6vVPdA0mAT7c%s2oBerjk1%j zuL^TE%31PHv1xKql3dm;mv^#~@f_ZUfLs?sVRMwTk!N`|Aj9pUVmVgcAKN2i2$kHH zEbqm)t>h1IeOEZ%Qx3~md@LD1K|V~$eYp@7LqPsZ1DUK0K*x|&3y!vQg`4Qg*nom~ zuHt8-ING4BAF5oUT<^G$Iu7rlDVJ(pt=z&B;X+i1$@_32Dnyr{3sGsM>u49Ef&i%q z7ozf|<3g^dD?j>`W1Xz@F6!)L<+osWX+{tBJUKNa@GK^QFKAjWM;$>wBGmqam_{s@ z2aoeb%lQ$UVjh5Cm`UV)JE%M#jDn$?(0Zrka{5qH>9M&$9W>*!9rqksrooD_oP$*E z0p#^eQ}fb#=RsQUv`n);&EKfA%gYM@X7pWoup3M5s^zHlGH$I}{xVtM+bR3GUzq)C9Z0p4_r*FER~3K9 z`(mADUCJR^Z}wYn(6P79jkJG{SntELkCUyBs0NhP<+m!K+*v^e)>y%M-1-;V8nl0H z4EC?>bQ@d*n*D1#SD13d23-a)ZI`Q@VtYEoDPV)em|V#7&UXf|J&ow!rvtVJQNr=x zc${rdlk>P@crU)O*}ylpdx&q|>{Y8xE!5lgwb>k}pjeKr00K($INK^rHaI0Ja>6~% zw#FpebK`8AO}1t{+RZ)A2UBf39SM9)+4lHtuWN)nV1q}XygP!ij@ph>S~AvYryR4R zhs%FTwx6lmz4m|j?Gv=ZJ$ATTqS*L|{W?lZw%??7oBb}o{SK`FB90$0*`W{;RwuH1 z?H0fNX{|)E-4(^u_C|XPdR4P~?d>M}W|aaFcCYf=R4uhhp)! zSe2^+j??`PlZMVg2Q2dPpTfx{u;N<;R(gfNs<6UDR&Uc#XR))=_pKnAqi1=Nnh{p- zM&(&ysPhNsZwzq+Foa>bHY?8wLtQ7i1~c>d!K6(PO+#JdT@#sk0PM%0yh7dm@Fz@eh`->sZk8b^Ri`ev$g4K2(oY`gqYDZ$6)H zpA$y9Pj8~gUL>C!mfvyveEB?$g5tO;F6ir+~tyS^FV^DfGL{-6njyEJ$ zDJ|Wub+~c$cg+r&!tF!dm%C@U-w2w*ZhVnPRY%+l-ERO{`XPy%!j#0)-J7YIJ8^6k z-CM)Z1ijbhQ{En--YyeWv0;yd|o)3(k4*=n99IuO>*CR>C4YVeT%JT$pd~Wi56je=# zAwX#@dw8WsK%=iw-M3TIJ-?H(?Zt;jy|JP zHk#|GV;@GxZXfDB$2%#r0i8#0YI-47RgUpq%@d*Fd2f%j%3-JWZIyf1WH!X7d1avK z>GIk-S=|jGtK3`0#(Qh0rg@u_yxYck+q=AwS#>vP{g&?C$0m3`$MY|fytJa_{oU_{ zF-?FQ zhQppEX3o+&9-+HSO_>nb;jp!beZYPYupgV6p2>~)Ob{p2A!a%vX&>yP%t}*caTMSP zKIprTI)-L8XTIpe1`=dzXKvEEDDw@ThGgB=&V0*vykADp+L_`oeus;BSvRf6w! z(RX_!QS`{VFiq2UdjJ|k{k^?32HzrR48B=ts;+7J7O8o4P1Co?x05eE`BwOS%QVEh zd=RJgvxu~su1}h#PxAXV^tz-8O-(uR?2KGQTj)Jls6e zvr~|i=*cwnx(3ZkuMXpH?|zJ8vF6oge#YCoW-@leylQ4lND-#8xsejocNZ}pUkHWX zn73$e@0vT=`d_=un132h4wxHpI)ef{&F{q;loyAYKR16T#bDNv@Z|yX7aD__e}jiw z{gJ@IJdtkx6L0VSX;5AsCiRm}vn|F`Za7nLi)uKJc3dayO?mS9MmhV&`fH)~t-lNP>TjCGMpJ<46%LkDox+OnRTC)77+7e}OKpCJF7^~bE zi!DJ%o0KyMG)H$5*OjGlLb5VWx-dma#oKD(?Nl!HEAVOr+o?j!FJ)lfO#)nPn-3i(`l^}#13a9HaNy>_VvQ$GlS$W7jL#vB?Eg6cWWP_iA_L!1; zMTSy~OyChRi&nVX`f_jjSl{RLv3{!3$NEjc`ju8-tZg9ZWBucx z^*@A{P9Iwg=wmY=?N~S_C!~+<+<;B*;sZA7VoP|zblWu~6l}8sw&_%N)Es0`b`7)L zZF|f^h7CEnZ1-ql*{1MBIJs44a@+-+q;wrsgH}g9rB8m$~9tn*G6X z_Qwy}AL(Q*SCg1cwYwboTr07c`t5mIBYW)Cxa{Daqxrv%kQu+JBiX)98jxY%Z}+3o zw~<$h`pkYjU=QH&{aldSzajV}u)+no8b4(JGs%%K$dPc!5ra&vsg6VkwpRoQ$5|!^ zsNB*T?!R(?Nj9aEQ^0XOu9UyyzjEB;@Tw43`yDH(JnuKh+6ezunxkx-qwb)iDoBb+ zsg5@1pM0n}UiUj*)XMcZ;Mt8Pg#$VgNZ~lBjuyx7e#ehm0lb}IFgdAlDh2epA%dD{ zu=5PRbBIBz2<*a?rfR)IE#G#8=s?j+}fgPac@axU*= zn@y?CC!DWyf;e3!r-hQjN$iBEP)Y1;!PVa)v2%|T?*UL70)8j_HbD|Qzl3LH7ko?#srxFEzO@!lN#73u1zFU+2lLMF&;y&`*@59G3#{RG9A1HK8Yi&l zSE5_-Ci-i`%{Q6vuuNl;rH}VQOKHBLL)A6~GHc!*E|?L>hSJ0@{0A%LHPyz4%@Mvw z3#^ehhGPq+Go%zjh%vV#cdRslZpcRkSsA@Y%kJS)m9$ZMAGswf&)rEkJojtl_h<^f z6WZv9S%li)GkJ5k^1CI*GL_2MsElO<-H;Mu8I3ZMopM_6;-FD-kT+1E?OO3;&wnYf zEkkjn<4}+Sg1j@_QfXOdTPYxZ0C}Tcl#M1xY@D)J*(VIQo?;!#%++}PGMpB1%6rO3 zczBWZ3MRSmkPwMe-d8?WJ{xYGX`OGB+*E|Atx;dm|6;gxG5#tE9qWVqOzIT8JPBsn zR7}zDSQ3aRh_Ku9|_hRro7i>g_hWMb${#Ppo0>x!+tW{ z#%x1u4}l(%hbpvo}R84F-c_m=NhLaQuTOgtne?AdoBQEpXgQ z43UXfd&6;dEbGNN4hLoQp$ByQh;RQL#zAojj$4@$=yu%N$+q5-;8@0#?j8rcI9pdF zI2=srIpA>M=IQ>9QthSFVYol1ixilxlLDl@Y)vPhgrgl&;K*>t%Z`s7UxLwSQwPT` zO_6nUIlff+P4k4OJ9^l7M~^}IcDUoH^AzViJf@dU9r~v5&JjG3UOGLC9-io>({$%# zmg2nDIXTF-8oi;gOctG!sTUToV4`wZILmqMAm_DR&dHr@+kKCP@_=!j>7p}T%0{o@ z2SrqWhf(=nP>u^GwG8<_wL0`GgYx}w=OX7rzK>Bf2qMYTS%BP*X)$YUq7BR1aPx#}@!8Z(BY6UhLZM{YmuxMB*rNWJ6M!H&FvKPu5XW1tuCO zpDw+{eHcEA-}e-rpUL0a^m+JJ5<}U~2~8b@`74W*LFN+*JZAvI?x~K6qHSVoJ7QDlUW& zUjq1BQ0XvU4=(UEA>}6lUWK?mza}&tf?ymRY^NbBP>oT39%0^P-mN?)NSG(lM0m^a z4M62T${)fA?2K?LGY=t!^F|2uUzI%_xe0-VI#0#;T6iGs29>x5jE+lT+h>}#Yox< z_~}Xp8>>7TpR8m^x$xR86qSW4YG`+|a;JnBmz3qAvRuUrjZ9Wn!bD*&OvC|aC1y@b z+z9Jv>)F^$3WG!=T}+&%pXFp>g!OtW_5vwDR|F*&niXeBunfSXhpp};sSuBN!~(e2 zx<<6Fk&2Ll9~UW>p_W9VpkH%Bcr zuI#J95O&bpzFM@eCN3wO!1fZ^1bbm=7%ZoZuxHsz?Jp7>a?8cq8|*Je!`VP^p2x94 zv~LK9LmOu9wIl(~sUx5P8XW~FifsY_$1#-OV3v1GzdwCL^OKSFShiZphE+#0qcH)PP+Bb@I# zKlDM>hNBk$Vx0kggC28|@awC`T$m~%{I9Mveao=9$5~Kj@HT`iS#%}$F^*_Qi+xRZ zLwiZh{3JHR^$_obT>?z`YV#f@*P zs{m;?P>nTdSh-sd5wKVHa}Tt8ODB6RCP7u_5K+Q+2i3CEdZK&RAonhlyA|2a?GL!G zyI&7S)Z9gU&Hm}eCxO-Lu)60*)Ti$1s8wikzYdV{NmMiNi)t`!hp6Y!YA3@ztSu3D zLEvwNXmQZ}K5p*QCImv0pr*PHdoJN*_l!(&|Kk27yfsl+fb73;vU>)2285H{GeGnV zP^SgUnL>)^WY5Wc6Weq0Ap-IGOipai09-!tKM>n9Y>;P|$pgLo^+FKabGiqM&LOVQ zi0#1_)-_`5b#r3t^{MpGDl~a8tG)is|3qvphgSRlmDmS7qlnlCJ!kht<}}ZB2$)(J z@Z3NIH0#30vm)~{>?iY-XDxRcyqAda{0I@_c{yCfL;=AN^!%un)?`go4${&*KW6?jKEpe}3wbg> zIC8xs4tOC>cCRFXBcDzJ$9tuB2B;Fb-i8{ya}Ri-aqM2X_PYq4Z@Py~P0Ey7!K&w z(x)xDGEV_{<1nxPKY#r^HFH|#`+R(5-hv>i8^p{T^ns$*mkI3w^<}PIo(We{*oejk zv?|Gs9wPmRaU{0=pLDQ12dRkN=@uh}$sS8T-{P3>klCC2e@iNw&`!^sOj0GX~N1D{n^P>FkIPex(NDp(unNF z?B{c)Q!jHpJ^Q7c=_;n0?wU$Tu^HK)W+Qa3FI2O?456AMh&j;vNTtrffO}^>P#vE$ z?(d+Qa{-~6lj_g8gbMaTHF-qN%$%h;PXaq=+c`Ibk~}Ue=RTfBNC%0Vp7SucF6Ut} z=V9F>5!kMG1ol?Gz~0^~uy>vk*q&q@_n=ff6=frE2an6n#W4O$k^5ZS!`2jHc{(oO zb+JqkV7$hX*99@!wSpN6t}7i3be$krCK4F_V+PB4ruU zgR`^_EQXh}7R9)L0!x)*13wW&yzez_LCpV@V^xaekl_2~dKU_#UWZ?Loa*I^e3l#` zMcO0n3FScFNPGSdW#0i9Me+T=ySan}0t5&(jnG035C~nGh!Cn3lpr8YX;wfKlw|KN zbO;axQIM8|UIm2!r+`=xDT0bfFVcG_@cVpbX74V6`~LG^ePn0el=nXGP1%{*JtSLy zEP0U-ZwWM*}c{IaIYMqXmO}%x; zFH2WJbolY)2QGbYL!m>?LLfZa3~D@Kc0!V2lsRV#y^N;s{ae$2=kp<$zvFohVcgM^ zYG{}T@xssX z-tm?eW)?AvfXm-pA=fM-xOSVPp5twBPnajbU1@Po2<}*$qrPK+7KWD*R)fpuMdr1y z7TgIoM+3(|EzB{-F$Ub#it897xKnJ7hK@m6n6sy|C%9`A*V$8W(`=4Lj=@@3O5>Eq z;I38Nl*WQP)8=UG7@~!Z!GGYcQ`|8a2%ynyo1=;29dOT&IS=kP7Wcg1&b8sUvftIh z#%>zB3EcIHJ9d-crrR7%9q(yjLe3EALow7A)V`<>0v(lJyEo49A< z9&k4)?nLYpBX5??@vLK*7B(q;QaZRHs#oy8UY>qaLPryAq^)R^KTinAU@1HhDTgON(Y}%q}i@^Osai=X3+(R};f@72x zHvO&XZ-Ki_ai_l}xJPV`c8*WAu(X7<1aP-2Zd!uip0GLEJ3iCGW|WvwA}JtghvLpC zA-Mn99332^!970XIP$u=d=!fteaYtN=t$DSKHv8FHgJDbc|YGKxYuotPL5D~8;IM09Uo`rn5x74q?iY;&_mR!< zqQjwu&5oEI0WLo?%$71cf`5~+4E&PA3GVsX^w?i5uJG6-f1BfFM~W8q<&rO#K;NZ` z`{fdmH^}CA#W6+;`|5+QK0w}Giu=_Ef?Lq$c-1jh3!BqqP7`o{Q`|XC1hmLL+ z!sdA0F;NSfmo_gA+`WoBFHLZxZH{h^Nm|(aLGuTJyH9cF4-(vpHb8a^ydI#_@y|OuaVb}~yUzomLPtIT*KAq%v(~*X_ z9qHJT{?m%&bsvaeW;#(G^E0M+cPRdd4wy z()0w+eNsIvk$n}GQ8^?U887LMo+mP1a_N8G4a^v* zJ9?eW80gaf@(avJ#TO}0WuzidI51;{?&y6wV+8_Xff4!5=;U#KNZ3)vEvjrLDMT}MvRvH_b^S1)gqSsPR5ec zVEr{6v=2$KgEA*9<58w9b8T7v!Vm{H42NhsUpp3PVVPwz@e>a8Bz`}}G0(9OaWyjI z^d$NZ;sEO6u*~|I&txVN)XY|yi6|9^Kr%7w3QXE35@o*1`~Bix8VuO@1!gAbj<1hp zCb;y!>jh@MsypT#&wLeumO+`%s4WvCz>yx7*(>v{OwRPgM8+?3hzKC;Ry6ZNy+Wqx zH%!YM7MnRt)(Y`sGCv7H+^E>hQL=W3AK=Ic%N&zAJ99PiW15{ zn!XQnkiU-Lo=dNog(D6ZCmc((aKwzp1Z45An6Z|{Rz8;j=%S9L;mOUDTbs4D3Z_ND6G5TI4ky%ZH|?Wwcu<>-l-=ak(?8P1LLg^Pu`Wh z%S4&*pabGBj0fqlxAm{Ph-A!&1Cx&+EHkoj_q&Jqj`}~kW5u!Le_Z;Z8-dAJb;ru% z$yZ(aKYl^UyF43%>%z?dGemqTJ^3iaK#gWe_czkTVJAJoEQ6V@nA(+zHOo*DO9*Jk zY)I$04Y2@{(00VDtAeUpKV~ZB<+~z!_C!exX8G5AiFPX}asWv&bYT@{t z`Y=8Dv`Pi*MvnbZq{1!A0^UD_kNpJyeW?uv0)At^z@5CH<_13=BEWA|3va@r{n$?w zddPa%&UA)jTliN4zxsG{l%9Mh@4DJ-jvpPnwD38<%sHhepA|kJ7D1Nm%~`J=HwSaj z+_3;*r{gy*eD0dLNA%?Xtn82$xrImQk#qMf9jf6Vggc7R{p8rKg?~N%>y>))xtzI# zYvOZK^E|nvw<6cij^DNLd7<;F>dEJ2u47mkln$py&Z|sB-C+sqKjGR}ALrcrK#Fa- z0o4?qfdP)a;qzC{cP%&wQ27f1n&14NL;$-W^UaxYrqZX8LtQUtt40Id|;$j!XC0}tYL7P9epp{Gi_Zrt$BuGMC z$KU*N=z^DG7rc~wRi*2nGo8TK@fW`CxL{=Tg3-qpB!QpZbiu?0@)wL2WZ?5VX|W5^ z2$mT7ENK8E4^o_1u+*g=31iI`M;@S9@B?^1lNaFF7rto!q8m$s3CA_UvFL#a1o-)- z7bP5S9kq1qfrTW$21nJ>8zQM3BK^`aTsBX}izPrReTWCO^a;GbA>w=LIG=-u>GZFb z1pBwm$QPYa0P1HHIgx=?>Z4)F%^+?}M!2t^dvBUiF5^u-A)~53AOjQaafg!{h~uOg z7lvsWM?k+H%h-W}wA}s1O(G*+{Kl^39f?W?-qSxSP@%(9yrs>xwi)-MGajAFcnn^h zrkMpWL~(s56JNl{j0Hs;%ftdIDnLI9Fr{tQYRONlAhX$1DrnX=^M!JmJx^!80%kKk zIACvz9rn^L?${^kGQDYtG96csU@EjriW3` zr_t)i7ZXzPsaQnP;0cS%=;asJJH0rXRS#I)MIhK{z~YJGrV0ARafh2FEY8-eEwKeS z_J=Q>zI5G+9rOrvxSHS6%_4yJIF{m*Bi+Ww z{Ms&?7QO6qXt?aF6U%10^y4+8<(FmpwEVIa%P#8)%hu}ymL2x8{BnE-c=A5}PpN>WUD0KjwxShps>QCTW|?*cRyI8HJZaif%CrUsB4OGU-H@T2=t?w0n0CcL zoMK89z%*^TB6G#}dculTdbJfB0vvyYue`LX)`lqB@h6=20FNV5b7}dEj?<@LdS6oQRo}Bj%!Y@!GW6O`yTFEe>Ybw7q1p8Ttb~sEyoTY;+mA z)d}52hMnv9(&!^dA^H(WvF^ypb$<&fa(Wr1_$Ki9y4&ED5mKD_2FI{Yb$vpLZ)$(j z5`{kYlH!{_!?bT+KJyL6pHp3POChYZ{uPgv=nar${VS)}ql-EfV;vt_ve#pY^{?FU(5dC4 zKL@;_>nFMN({VxW-C@x_hapqi`tzbQUXP=r>o+pvyx8^gR3i#qzs@V$6CTYT^0aJ5 zm_Ke6%?PFZeRBOD0&X?2TqkO!MbTe2OIZIH@^1);-4MVzlaI!Nc~yYpK=^mr8w+lH zUDFIcsAzs0!x_*po7h;HouiyhY;1)d(c}b_vk4qa5bX&0{|w)FVN=wmX~;r_Si+{- zB8c_qO)!!gWjP1&>i991CTwcQXOvC7hH0DH#cpc%zam%&6X~*sq6X>!JB4HS?NU_2OpwlD%k>Ii<@P!jY%|$6w)__HVk7CC$}auv+woa3S(wDIG+nhlK$sPCJgWrQDcm zo!;|k9w1PhP+6%T=W(*juxS9kYk%+tpBz_4y#Iu ztW}pnR#bK>>psdH;XzhZDUlVNP+6%!Rw@r<#f_%_i*11;C*eG|;1-+l?XPm6H#Pli zf~NnsP}9#n0@#5VAj7vz+%nCjwH&XR@HIUDcs-?eHx}=r*~EB(^mr6J9r*4-0zoA@DQEWB9-s4o|6?aO3-9bH=US3rF=n`!e5PA?+r9i6+@ z!U5Ijs7Gl_pV8P&Vi}7|UKe_caSDl3kRvgDaINxxg_2?-; zS>)Sz5^>)k?tJdY1Ny$`{;6T&(&yz-6r{fCOS_wqBon@w6Sheho`W!lr z_u_ANn5t!0mwq{rs6fA#?@~X&==O@MK5g z-G`h(@>YOV(Ca9|5BIe}yvITw?i%o&D>EM~ES5t!nvoz_s~5@QPcS1f_+m(rT@RSi zy5kYXFaXyI7QLJWfm-1a>++vmeLlr{dw^iO)|-%h^aXtYf<0j$(J$dXRk6TD={b4^ zy(#$9$!Ev#+z!w_%{Kb49Le-ZME{`{dt^(;Vvp(wS_gVe&5@lgu65u?n)t)Ob2nr8 zj~U3pE2rv?Tbij^d7_Z4b(CjiQ8)D}h-rrHVqJ_ih+sb<8!W1F98e7o_uidL>p=EY zSDrjmkJ8!;_j&FtkTCg?Hz{s=nE@{*X`B@^9cYef39Wkp`qnR_$R2#?ld6pndiJHv zeSN5=){#yi$wZfa^?9}y)L_|{D@mgLNH-Esk4U;uXKh$0x`Ne$D@8T^Dwce?wt5zp ze*Plpx=TyguHo?H6C<0qLta4gHnkM>M-gzyHc+h%?}bCQdCsRpw&{`6A>{xp#zL0p zcE~o*x%6ut;E-*4;N~ql*q-j77lq4mTqT)rnJEK z3U#=Ei1Z-b{HQPf4>{SG?oo<6fHxRa2km|IdG_ud?s^(i$5Lc5Judc-$e4hrFg+Uo zR>vUUu{vF&V;EecV_5F#06u^Yv)+0cnNd9c2}h_8cEggftMfH>J0@UQtb}24AbO&Q zF#bgFdm>>zkq$T9F?+1xaVK9gyg2<6IC5hwnLfbZk(#y?>rUnzd`i6*{_exyWtwKs zr->akdrka(gd*^&gW>dxaOQW0q>L$R7JwMtjWI>_H-VsTbNV~;X%WtW&MyPZV5sQy z(+4;8&^r= zk)(0emVTs}IG-@4_Ba?-zx^!eBhWRJjTib0M~rDOrs?>BnpsS=HZznpkx)tsur+MX zBF<1PV$7Z~f9Ym%`Q=q-QD<>2Vr-AGz4ejQZVx=%86GkAE&MkV1^bQtRQ!cskG0dQ zi_>?Ty0hrsSZnk~Rt zB4X@UV}BhN1iv!*D)t-}1&jEN{dZgt)8K;8a1uRX>>0digLC33Ba@yDaF&d~E8G>w zwV=Z<2BWZ*b6m}FEo4Twk;cX8G2`OQk^#=r5qNF;c%^sEfByl;6V|u-fUq3c=;t|9oAT&G}Zu+7q=92+-^<)#vMF1ZnsOn+s_QgjG)rE zhg$5oI|?H|*@+6gSU}2pEx=hO0^hxDGX8B84X+zt)e>!dD-lPX5GA~Be1cwK{M&vp z;}gsXyiC(Oc6@JP1eh>pe1E=md1pE3tft?M0DY(F_X3dJW;i1vCiI-pZ+Z#MjD)DH z0$SVfR%S&lV#07Xr<^o_=@Y~H+5(9@yTzx^n05FCy&JMVxE|c4T5_=2Tq=G$ITr_9hG#gv%{v<#fGLUWcoK4ldHK~u`8is9RpBT}PNtERp}-!4y$Q|qT< z?N(e6Lv+Hajr8c$MvUj~zT#!RJRO)TLLh7Z!nAF>5 zMf{{`!Puz<=?HGqz&&E77EKP0nHp|ZLV}pssWEObW2V+HV-VRec4|YntT9uYCv^^R z)`*yvHf`bbP}F5shG(JrX-h>=Rxb>jFm1J7e%f{%GF}}!ZM9jR=r}8DQPX~L)}+9R z;2e#eb~Lw0W)v8gW2aqq*J_p>rcKvkr)zHEVyB0|%~6ehe=O*Tra!=}_`xJie^?qK zph?t@nEu}M;WLKfB!lcPMa!e3$Pq@2(HLUtIODa5w8m*|b+ek*Q)iL>&c+dG9r0fZ z6-(tgAWCo)kGo;@6Os*zi0%e4bq);j-?H9=?|SjX?D+`Q$HeYLfYK4zfcma zm4hd&7vdf77nd_yF1D zXq4vuT4!3eh=!Oms-p9pqJ|@(W=~y=MonkL&G#%t^AB;g=aK7J_FmR*)LU_(G0(0`Btb5>0}=-rHf&eA*)R)n={k#=_dD&&DWy z(Oh;PSa{3$h?Z}HSp1Jqy#$bry}Cu;rMJ)%7H!p|7X31Ire6-eact2^m;R{x@kO`r zXRvP8K9OD?cS!-x<`L;1rjJU;m+B2O4%Palk4Ybczq}wfdK2^xEh5qVI zxqKZ{V77@AYZ&lK(KcemwiQ3EL@O}NCQPy7CkaUXJG;Pz&O?Q~04O47d&Hy3VB!p`#1lU_X*1t@4PZ zBkl%E<`)DHDrbKMB_}Ket;A#fFqZt9EIHvv8KL=Wnm_obne%l|Y2X$@ly?P)Di7zC z2a)*H+O7s`s)(Cs*wN!yITrI6-`a}Ds#9|_QOJXT(2}$O=c^E@eOpjR(8m<1yA-K? zZyCV`g}WhC_6>e-OX<>u8Lxxx;DNaqGopC$7+*w2AY`TOinJYEpdBEfVwgR_gBx`C zLq^C-IzVm9msBmUA!nx_K?hx0=lRUpOXlo!K}Kl)HXH6BmS(;w{1~B%4E6SguX6&U z`dA6xVW_Vs0W|D9fvEMfQ0x4;Kuu&IPOn3d7u$j0U@tzVApKDWRCsZ)jF6uEqREoq zQuVyJfT6cN^}uaj+?1o97k?D>ApRV!^Mq4(L%lCU!FR`qQKuA+*dot}_5L_bhKc;3dFO+7D#fp2;#o*3olJt~&ZK z-(66)OY2pf`975SdKHrqtU}e%7ioL_2s!{d&$Q^ns7J5=WCW9XJ$lmm{g9`3C(z3v zh;NwaahRuf4;dll>OBy0!E<0zRat*z>~jos+NJdkV8-DxW1kx`LT2oPR**B}TgcdV zH)ucTC^LQ}Gxq&gMj&KW@;1^^!hYpIwU~BhJj7?gon^E27* zO1n@-NcDznM68*t)EfePHPd`Ty?0R9d%u8w2VG!cc3Iea=VSyzR>kik?fdZD_XmJb zr(rr|+V?+`5ngHEW7^H2A3(ykPL&o-kr5J#_y5G5nZiEJs^xv;`~a1IaM`7OSd+D& zCD3{wk`N))`!JL_bi;+`9=ncorLV_^tU$+dN=Zm4p`w_tVXrD_P0be&v^c95RqZ2Yh4j>=hrF?Swk9YyfBmt*^ zU_(me^*Dg2w-`0q;|J0U(f)^_!V&O<5%7c&ms#NyS>cF(WP}uU#ObF9I~;jG9t!#x z^fmLQ%Df*>kr6WQ$Fq?aGktg0@e%VK1EK5q_yO}xRr&782!t%Z7=g5(U^M;Y6_7CK zG@14jxFaKE9iO}_>u~4$nE7CUPj-V&vX1F0-*Fj%kX6SgNIMdv_DIw-vOm+N$+RQk z_KXmhH10^G9rX;^ zucS;CDrX>`slaE*oLmaTzYUmqw#=MdPeveQfi{|Hl0Z(-9H#veJa}sImokD$Rd1Ta zv}ZsUTpC}hG0d;PW7@|uf=N|c)@@D$%>y*^NNhnV0AR` z6dQBm9anUp2vudsYf31)RkZCCl$Wvuv=a0i%S)H#rTi)*5VBw&gS2Cy`Tdx42+OajycL49z8tXJQf9v{SEZ5OB;s{$uQ|+C}8YO86gW8=Z{$R5a)5camYMA z925-_-QHrEd3<9TA$$MvFEH~G1?u?03@!B%Mp|e*3)=xgw>JJbC0V8lJ1Qd(vece{ zv=h#N;F%N4GwpKlAT_=ZE+VAV6H6jCY1b1~O+@yIT|wPJ?=brcm3^>`K**|U64FkZ z07`Xflk+p}N||<2mW+@(PTGf9bCuF@(rt!TKT+{y6gC+>;N*8elUdjrS=i)>G6Es1 zV*K=!Hl-4%8mJ}Ht_2S|PH8S9m{hgCRHlUsO!*n~7t^8-5or&~2(PqLkv8?AOPdO3 zp86cqek0RPEg&N_EGFQth}AXYzASq$HSSKuIQ6u}o@pre^9;}imo~E#%Uv(a{rp!M zq2VV2!M@0{28umOKG7iNF$>%P|KE$y%+d^f%e^LsnlSX87m)pRZo%l-g5f-PIx3xc z+ojD4099nA8xarjXBCwZ(h+8byA{xK7LbMl=ClQMbZK)7vVcvpfH^&6gjf;<|5G;C z9J7r%Xll*PERSqRh0Hc{Gn+D>&gbxL(SxI%xI00{7K<^LXN?b5p_M(&O|lK;2+DN((W~U{D639vf@J-A-!RR zoyB0%3Sq_Yc$Vlxf%fBqO8>>vkhHslIeYw?ocF<_+kiHUPK{BJ)o&^MTPV(Nay?_qNlI!x zKW_DB=*j2D`6$_S3G~pVeczTP6CF6v_ZU|gA;tV2-AV2R!S9=}H{i?Z{B(d?q*;LS zcEA;Oz!i2JXL);Mc{`5E2!yOYd?C{AM3=YIA5?{D_sX<8BV~lN*Uk#mYM<9S>>_0R zX*9?II>(IrWyYW8$p~qypH?&DA6VT+B|q(B-~a>4`O{I#&nV&NaiDaTa!{7?^FkSc zkd-zAX@98-stIb%w13L9zqFDOUTHItc2^lt6sRfFq7x&eyPC)due6Jq_D9gKpi@ly zw@Q0LMtG%Ng0#C)=I#n0G2F1@K)Jgi10y6{yAyK5wG znE%Rx_NB-OX}x`)v!Ek<97FUbB+0orw*tlNUjWJk!O090JrCj7ze7eydG`N`V#M~1 zGW$y8`y&KY98`t*j>&v~#K;JQEVHjd+C!-0&_S2>PY~0>rCGy zkws*Qr;f|897RuEv@k%*$8P%|37fU|HWs3uVbn=ESgIj2z_||foCdC^e*vMH80IOt zg^%DLG78xwY?}V4FbD^ZAK?ht4ELp}N8L4!fF zK)-25Aj%3vU4a8ZpMy?mMo4Rl2_@}unhIB%K%OU)=y7L*7={$P|DjCz7m zW-#grMm@pVno+O~=qu16%_xLA3dMom0O2jiLfb))G^6lqpv9mAnh{b0^b+W6&@LDb z2m6cE2iZZZK!-J>XdnoB7e)GFNM8)Hgq8-42A$N5;^jbZgJyzINAatgQKAND6zCVt zC|LpYAqaJp{97|hMSfLm$QQMw}tSd>1Z8D&sUnUAil_%+q43nDcN{-goE4jyQj>M()wuY|d|S9`8rgaW)>*#%7*@k70N@ zpx;3Fd7JY)=T_%V^80|s*vzxw<4ETS9f|hp=o-%sU;2qALYO}~H#%L;pP2l6(9a>} ze+-1r?dg{T&kkA_yz=y4kEM=v=+#SEv0iy zc+lfNwbAcUi`(taZ?L!T9i`)A^T@nJcWyk!zb+$ka1d^+PtJc5;QW;WT?gGq`~>UF zf=m0a0K-s^)9W%&d=H5MAn!h_fO8S<`%o*9*ysB%4ibBvTtJC^7?bnt0%E_=FuJ=> zFHnP=rx%c99Yryo!D#*8#--hLd;|b@F7v#WfWL=nkpIr6w9#{9W$d|tCyzTIHri!G z6-UQ)E*>{AJo141zPNuz3vm8G8+;4;&83}>)*&&z6NKP*)DB}h4e~cxP=*(x(NF1+ z)F}Xp&32 z5QdV?I-=rFdwMEPS1eYX2vnOQ`C`V2x>rhk&#z~->xr+SClcKA+sw-V_xxFad;Toa zhp+%#EQ3;CQaNu6u`ep)9C2=v(A9>r$}` z(LLRYU3gxxShP~?0tCD8EycUgS&Da|3k18+#Y?dZeatIR?1B@DU2uYyvjAL5u?rJa z&NM1^VFL3{@Tpi`<`jyx%9CQhQ?bpU-7f7?67rhyLa{AgiXBlb9Kk_C@l2@>;kdMm z71^|Nth--)8Bw_o;?T+$d$Sz%Cc(wGp~uCyEgUK!FeD$$d~uk0^%(w)bs6P@82-Y% zhGu;6JA_Ly{EK-VP5I)V2v=kHXi{gOckvw1yLb*23?l%z6nYo0Nc1k=C3+XHu+}R+ z(Tn%f_|CzlqO9F8>!apN%~^BO4ODumFDvCs7-;j@NjAKc)V(m!6P?fH3H&_(|B@5* zxl6m;9zvT92>zuM5BQgsDV7)*E^THa&xs|%dI?ju%k34cm-a!yOZ&WFy&T{Nm@XYP zZ&0y2E~A1I;mbAw+vP%l?Q$Vd3lz*t!FD-R!gd)4fx!($sh2~2!qx!YHA=r+ho!^& z1UiY%)_DS9FF?5b0th|Q<<$_uY(x+)zvuzs@({(cB!t?R-(#Fo`|@xKINVa33XU>w z!Y?jQrh=0}%a|9JrC^#;aE?$gjrr4jD%glQMXP!~Pde?RPU}HCUD_3PRAytL6IXlG z0CRb-VzFonMVU5PlT}9FY%!|v?>9*48vC!!@^WXNVQ)A{7 zI;T@LZi?-l0O@xQxov7~U-4yy`;uYle3T z_^uuVd{+;mz|zDHmxAx=VF};W(}eHpVb*fkCwxsYg+XoC4Auttt_8CipvIH66h6_J zkSDYb0Ih3PK&?R6A&%LcXkDx7LF?L!iY2^{%C|7ri#Zyi4iFxr{2`Gdx*fb8Qx|xi$;L?wOZd!V;y*##LPVzbVi7&%RwS_$E95_ z>e6nCcH2TAb=QN`^_q$$jvQWp4jQNx2xRNSkoTca#MwFMx1w-R>iS&z;nNO&65#7= zSvH}#{+)#4x(gs&cS(TV&4egl-@zgO`fuhvpnUz3%cy#R;XA@3uir=b9>O@n-5OnPa}lG7=B(@<;DxJ$_)%GH*V7;xZHKg8RLyEQl1+}I-de^#x5~UR<(^UNv6*^YVY+5U!3x4s6g zc4@a)A+OnnI^CM*rPGg!CB}hUhnYy8d`3K;U!OSp%!YWo2s0_AZVcSk`evmKGUz21Y| z?W2k%W+=DCvy9iFZ&x$}nfhdX>$zSGyM=>XR| z12}29^S=2QxZbh5jG6}+{z~9_XEDP6F}z7kTJCH?_%_2o3Y_ok0nT@*P8$fq%hTZQ z98|R)CDeBgvhIUEp>8MVEqCrx06={=j5VY0x?7)B0&~xdB?tJTg?3gg^zLh-h29;U z=N9@8Y;rdlG|i>mTLJ~lPPEBg(_@pnSacUG;mvoqFp+iG?e0O2E$(yk#Qp9yCRcuZ z_YTy)d&kR$RDzGt&*z#DHd8@1nNxQf90UUh_rGu%Spd#@evy@y`&9>y?nDL=l~ zO@ez5A5H_e8)~`N%_q2>q#xh=n6&}idw6=SJ>2qREY~GEU&xaO9|l_YR)SnE?STN| z1)_Ctl?SbR`xQ%!)%VU3E$j7w`@sl#9aJ$~+Wkr#s`)H+5Q^M?i6O6JGgKFt-bW=5 zwkS;Ra|F0AMgXq8z=!V-Edb2!kFxVA@BTEG5%)R6^8}{%7b3if;Y_^Ahd*oV2K?&& z4n%*;@Et>M z{CJD`GL80NyT@n`PAit7X)wwIjM1LgEFKnT=vAaXU=2_Yt1`W^$HQ9C{b4OHAAcAh z00bXCW4FN`4-;KR-3|=*6+l0H$L8hU^&uyz4>3v24$KMkLp4KvC}yY+ zIYWKudxrWlH85Xcy}Mbj`6}zW#<~EjhK3+D(dAnt01+;iqqlha0^1RQm|Y5l;rdZM zI&~L{26>gr5=gs&z47=?4;8ods5MIOZKf;l-PXpg<*!dCX*t}S2 z0^%-6N6x-UN6x;$S}*u?8eaH;#dtdTd{TE zdF$rU&y=bnlK#ytg>FJd)^oy&f51``8N#^62Uqq*kBhNtBKNqoMDB4}VD`AIHLfl> zz&`15Mb7;n*RTh|SdU+J8TB49+(Wd1$8Xz%0N&%_E~9=CMkm?x1Hi`<5w5`SbeU|9 zy}(I?G7;T`(JSo1r|@Sx!Y?y?K$!ONQJD7eQHaIq7%wF)Wjw89yiDspK21qa`?T(B zgwuTe7>dHkRPRyJs^hqQhEgVDSyR_ur+{WRysoKzK%vaUQ@EW$dDy)CHGg#?Tf(NR z6WLy-!EZu)9D{N?Uy*~iu6@tJTh|Wca1kcSwdBnx@mz5%0?G09Jnex?*Ox+XvpXC` z*DfH1T*lJ%5XIs{wyuY#2M~I~k^$9(3%(#=uP>cp!?Yw>g{fM5Z7-pqxx70b~BXYy*l0R0{g{& zz?$bBb-&xZt0*$CC)8~QDmEqF4I~=#?Kf33%IH6c7gB@uF!VhB1r*$$-xh4rh2ihc!K5nY|cr z4fqz(wHS8ULjiBV0fgHyd|H?`;0jC|a0T_wfc(5vvkSN-?Hcfib`7{iVQ%@fYkx8I z*7H@QP>?2HBT8eK{UAcV*C+y~-g>@KtX-MJ+n|Qm^N3~7MCa>yYPF|fxO_C)4=z10 z85)=aXt;bC9>e83q*$W=%6EnXl=sV^Y-sr|GYuPBzME3@d=H>>z6Z2`pH7!!Lkq0N zPAo9cUK~aUEblU!?PR!$Kr^ro&%2ESc641bgC_AvBPe2FgVx$V} z#tP&}Wl#iXH+d3355yOny-xyAJRhEY1^@-7fbdnBAgn)W<{$zTIK~4|;2g!G*z^DZ z5;%`>dRyFO2$7dk=I}4RARl&{m94gJsrO!+>Q`8t_1IeFbz)dh}3<{Pt@`!*QRMcJ)H3o4k z4T=QCs~VMG2dS|%NQ|XH97}_IkEMf{S&XHLO2{C75z=!4&Y?c#nKGvpjzgXS}}f;lLYLT7sQ3_<^3y+aTB#$F0e z8HACw=UB@*pB_3GFrc>l z8f!z7&mX{Q0G5H{!gSR{XZJj{-~RwsezdIo7!IO@T4kJ)6StM*@!gBLPSLk)Q>{0+)g# zf3k!l|9HZYKbfT_`-EeNE*fn9IV@c^SgiQGktYPs5rO5PEucq`z2FANDe63HgsxKN^T5l$9ObT>i64zpFyOv&?_ir+)7+r)UY7 zU*@3+oQF;YP;-G$5Hp+aQl|nok4^<(biuNOf=-;p6nIDJRGPo(sjeO`3gGk$Qk-I`r+ljZo-W+Az+;x~cGq5cg5e@y2!>gMD}p|P1m^pM zA-K2)hTvL?WeEt=24h?d{)nmvtD!KsIfM*uZmA9>gIn7pVBg>_P%^j+=mQpjODP%L zU4jK+6N;^WVPMF}Y& zOk403#wo1}Vxe3w*v--!`W5VDkAhVTj)Hy#fp5WuQa#J61x;zyf)l7;L6iASpZa~s z%)+XD@}$!h>a+s%i%T!W`Juh6&}pTYPIzz^EMe7xn52Z*qkHHWVK|T}9d9xX-M8R< zDQ+Phf)>)LsAqmyD3%s3RLEWq7A{oIWwbrZaCKqfLiK<^p?V-Vq_|Z1D78=%RqAsD zp->Z+-NY9NP(ifcLS0yaFtTp2tdw?Yepo2)^TVqEs89+BeN$mhm&~CAsF2tEu+TS( zMWNk~VG@`^-;zgQ3T;s;?4a;FBrxvOoShZgXD<&=D0GcDTthxAdyC7R3T3jSJF=w0 zng9bEJc#lIhWOYAJ;Ggxv#&y-aHSm0-kl)V)Y2UJ}kHU>WSQ;(-4a75t5s$)+ zJq}YCPilfC9Hua=>Gi1(wur*a@QrE_g|V5U7xvmr(F;$YmlPgmuK+J8Y zJWhB?;YmQJ@FbA6)TsJ_!qXKhUlEnUSi8nQK2aH_3l}Mj?Zx(`q>Es&t6!el%ymMr z5%jA|4{1sWh6@Nbc|q{EVo3;2KMBDlCa@s5L1AxLodUYTkfH*Dd-jTeASA!b=zwz@ zdPsCBijXoAf{^lrAfyaR4JqRjg5eT^kT{m^hM<3*Ai&WQJ>*%? z%b>3a!AFE3q?HGPkT(>IGODgHq!;6q)*<~VUw=z$>NnV42@N2GU17*55FUiYrA!>6 zy223A6^5`Y4DsC+a`2_&CpzEClTJ6O6Iyx5T9;k~y_;r^5IQaJ(g_cAg2kdOoqk}P zrPEK8=_hZUcH3j9(=qBqV`eiiE=#8~%4S!D&CW3Y8J{*A!JI;;xAUaaE$CDvAE=Z| zFDjmHKc-Ga0zEnvsjpb#S*r*hAKdRT>P5udG}n8KY{5m6nMo;KWDJBZGR9IG?px#_ zAGwO8*(*ciA{$&rCv0fyMYfAat|B`T#_L~t5jklq!bw|^BPj4$YKKcfQ$$VLiik;D z5l-5Q_@1oFKACOp@ z97W`cdOf8U#lo*(Suz8dqIgy+x?2HLl#fM4lPzGNa?vsND)5G)3!rk*1)!gW!fus| zir>;j{2F>g(Z$Ta*rzv)VrJnD1M{TQ9qP0nbjqa{n}xjQr$VPcJl;?=Td_pPRjd#b zeJ00YWoZc07ki04SF!5$sxW=AHZJ1@n!4BvqUS2s4SE;r z2AV|CaVb+5>m^%3u>sV(STB~^%ctI->Z0>5hN0mFT3DxmiB7CXwZeP-_o609?t#NwIrSEELNGp{-qd@nqyRlc-o|J&$6c=zj%E zwDr*8Oq49Fi*#QyWV#!Qlp30cV%A`qTaWVzAOvCW$FDu<}6_odUH{=_yeDM+nH0i1UlwC`1%7VRsv6( zC0c-XAg}45VkK&OT%rUfYl6k1DHIed@fzc(Scx7=ynYa@L_aUZN_=3Cg<>V9L$MOm zK^s{BE~QwBFI3J2RIJ1o%>RW?#T?8j6vMJZ9u#{>#eMzkiQdm?GEPf46 zFNLQ8>#H<+DU&(8&v)ph_@Hi%7u_e5@5jECI(vZ7W$t2i6aMDX@!GHZ9EWOSrOUD| z1$F640HJgxFQ`jbD-0-0*Rj_I)TNudjIMhbZX=*B-45X+48JP2EK6e(sp~a{-xu3k zrAOMiTUZ(=v0u{|J;`3@6#mRYn7d-7=gMS@?R8Hhv<1=J94r01FkI=sp-t((A>N{# zhAVwkx_0UR=-Q=^Qs$#RU3*-BhW9}9(m1EnbuSE8rVxcbfg9`#b-m`7d>tZ|!RG60 zn%ND~m3fQOnTe37%y>!!oB9RdT@lYQ9zu}497C*n_uNW>9f5pg7^ z(?{Cq^br^A4Pl;$`!1vVuLwtq!>oEF4zuDPP;ComcphdQC^b@^XVoKlo)saK9qIc# z>l9r$ePm@;;O+Fol+#DH%n1Qq-ts5HhNnr8<<1YHx3h*<#cnC>b>fl$uk?sP|RQPpD+n z`^^8oPbH@^vzRSnjVBL^*{Ik&5GL_uTOhAFO(-_sOR=4bCF~pZo3t;IT1w)vxoitH zTu1#)`Tn-_L!VSuIDOO^dlQ&8>XFOnxeHpCl}=xlPG1&IU$&kmFJ;=Y%Hzulk1tD) zFYDXmr%BV6t-ty*>_^Uw5Y)#=PDtom`DbPAwO zE)e>q=*GxvrU{+C_tNQ%Vu9<{=^W!Movu)(E8aTYvNwfJ(R@&i#)E2fE}KQG2i0it zpc>5w)o9-js%flP==4dRbjk;vqML)TMpDj+yygt*6y3t3Q}htU;umH0Xg(6EGjt3t z;pqA~QuDyDwL25No>|yJqqC$%qPJ1*ZPeTS3a4H!9|z9pJ@#gB;^;FjqxUd|Z`+$= z94m*T480u)m-83>Rk^|ds9a$XM-*PFKGagKxU8jIB<)_VIO-}_+^5}V7@{XHhjr-Q z!*mlbC+Ouc!R_sUU+Z#h2eDKM6DtgaBh^4y?oBZemK&DC|C!{8eqIfPfk3z1c+i(F zy@J@Ho=J4eP4J*w4p0dekI?Joc0n)mO*OeGcZS2F`pB+czJLd6)m+M#WM<`B2sB!`We(5&sY}ziB2pz=79U@BS{c|t`G{s+Cv4PrkP(5=n7t&;1w`v3YO?_D|BL_ zx8$Tt{>xFdLLw8Ztj*u_c zoCC?lq%1!nx&V6U(kpWL!<;Q3y6Ex6ip3R+aw`|Bh=u%$_|0Ste7K2(z!f7c7lY0f ztJzzj_o~<#I#=urLRTs-)gxDYRVrMu2NkaPD)YbUQ{manDtfQa@?`b`(5d1$&}^4p z36H#*`6YF#INnPq%s~Z^`+3WiRV3W6d*!cJdNr%Hu9I#t31NU&J6(y3BBXeixoeEMX*r^ii z6w?rS%{f9RFFRG*q*yH4(rF9hES6NFD|81jGy$qm|*%| zj34sH`1$lbEKVt%u#}ynRXx4SDFmHj&}GDQ0^LJib1rp?Y38w0Oi#rUT~5qZv zu_&U_y>dmyDeG3Q1_3Kqv($!ym22A*VBN|IP_Qxpsysxf=eBNT`S~Wj@@rJEa%bl6 z>`OtrSTtoTOlhAdokE~f<&QwqU3%3v)QK-H>y<}%>9j(z#K>KFI}({KMOTk>CmDLy zv$vrm?lDJm_eU8-O0l?8r5FpM6I79}SLs#odKLa58lGi{Dit}JSE*rd4?n1q;4%hH zV)$h-npf$9@Rtnt5~F#Qf%XmJrUA_=(@5+-d^T`(<(nw4h-m34p9Kze2%qdvsQYJ9MIh`fXy$ovd)waYF1UXf|ylR zZIHv$m?ZbC${NXvz&2GofZlNF)t({HU(+^KJ9=zW^#jGyH4V^Lg(G`?KA$6fRT#F~ zGX%Y=+Bm2>4;ojUXSpC+UR7~Etm+DTM`&6VGnOIM0A*EqKCCLwhgH3dQsNYps^wKx z=fkRs^I=taKCG(m^I>08LUSG}sD@?AA^et=rZWc0@cltdw{rmV^v1L8lOq4c|Vg@ zJ3m=tE=W-T{QRVZ0^;4Hg|Kr^v>#^Q3!Zv^(m|!sItn{tn#VeX@L%K@&I}< zfL{GC5FYSixxQd7BHM!8S=d4tciHhCDg!%SZpf2 zvxeFbtHBMi8e&6?4^VQwx5mH#Kv&}f`wKw4#vGUN?plV^1;RB}+5Mn;jqQm3p3(C3 zLk*sOsBr}4!(YXvs%2&B07MOO0HOvDK-BPk0AeAPG8duh*eF(QzJ%&xpJjFQVuMVU zt$XPxM0Yw>+m9VA+J0V7xxv{&TSL`mUp#z%OzwIx=`D*HbrY8D}nz?2YHS@`?v1SOn#+vz%zh*vP zU89-Kip7jCB~N}-96HrRmsAr*ujP-tW(IYt={1w6*+;R&Orjpk=M*)k+h2n9YR-2V@84%QU9`cPs|dp?&>m`n%k!jN zbG<5ct3YBs%UwVN9tp&Q^%&&_HIEB7sCg@w8$3A#Kz!i_B>-8i z{GduMy>@X(Xl4?!T3#!MwVqKd0a>k%OjJ#dcJg120=3>?BEnUxk5sJIK&Vt}V9uep z)_lTM>m&QifUDM2m+@f@hQAhY)mj3$YApdBLmj+S`7CvnD)l?URcjT?UgZ<6ObJ&l zY;=BD!RIO_QsoMTIk@_ElWl11ay9}tBOOF#s;YZXF4D&RY+RrJL*t4zO z4H}qBgbqlDmE0$O+=R&0wlkAzQMJcGvD)LT76k{Zy^~8jwLiDxy99debuMFQ7l!do z74#9cu>m-=FT-*vx;B@hYyXY{^AkQ?YACI(mZEEmrRdsRimvT@DS9z_9M*P^wV|3g zgVg{>gUYyFFVTrz=^XeyeM~I{W_`;s!wFI2JdBd2uO~R_r^2hLpQDC96#5RN(@df=#od7@xhVnX*ipEFMBUgs-H`IV(R zwOnBD3KQ4)j#_>P!j`VMEG@SxEq@YPZe{+hKDAuItir?-^Q04Zc)9sr2Zw*+`yj8m zQs{Krqf_0oiX|F+T`o9Vzx1QmeVw6Pzw|?c*TwuXzK>G6?obF_cc`T_3|{wRHu$>9 z_SazWx~p8q2)@@^cdKadbuj>pc$MKp!U5`@0yK3YWc+KWjhBL^uG-zMdxOx_rCZfK z?-QDpvcbn=OKwCPH28R&Y8mnBQyToFJRuhj*1RZ^|*~?uBA@(N_lju_l#n(XbJ_L>NRJa(y3l+$W*Vj zWo+nFuf4q+bgI`MI@RkBf@_LP=~Qp9)T!Pu>Qrwq^AGl^(^_T~I-xJjL&qFRozMj9 zWrFS_uena>G}B8b9JvrI7H#SDE#oYmwos-m-a2i!CsLGiP#RDUb-n%_{T`g|r(^V<3tiv)`wO4I9?)vQms z>h){lUj3YvUZ1NKPx+LqUjG&5SNhlQ2KnoIzZO*gEqiz9U;k4U{wYYPfU=bS_0-B0JEMPKQg5^sLX5|kO4o?r8mH1nDskP2=!&i`$wj{ zev*kzqrnIk&M9Mq&!k5*Z~}`4PWqCc?oQ2Vc7yRjXe|w<+24S$4VJi!Pb)LLN_2`1 z)*{@9VRVu}roj&gv(s#_M|=mO!C{2iX*M`7I?V<*VVMS0Z5Tx4<*o~jmhz}Kp&I(p zLJjUys{1}IwBDxK2w^m(f`uAloA=X3kfR|siau>~5;r|408C}Ge%y?R@rTUZb1An3 z&S`2#qG3u78@dzZTFi0Bi|KqcY}ydrXu}OIy-^ovW^SZS8-D4rX~S)bC8i|}xnHh+ z%*I`m?7AAF?KbK{JQ}JN+mO$(4NpDAK8^BomeTN=y$6tJq`8dG9wOW*P~hFDDDZAn z6jWcJ{RG~PN=f@SiYDHTN}-lUrF`POQ5Un7MzO2~pz_d^TXg4i1z#iUdkpGhqt=hZ z{ZIJH0lr4qxoR}nr9abz@NFV|jks7D(A1i>5VXP z@%;Lm-bfsT8|`%Ijj?EDGq<34@tKsy(Y&k3f20i>*I;e5LE}0SqsGu%Z`_DB@GM_6 zZWau<8$WOF3HTf1AXQQmhKGvfi^iYXd%-OmPeybnM$eSd^X+fKNgHoM^qY)EW8t4e z_TF&W#t#tv3BpZE2^%)yso5swAdNNZDj^|S6LoO5i8wghXok;J!2P>k8ibO#mgxur?R8V@8UK5If(iGSbKn0N|O?np*@s%P);Q#xb z-MjbR6kq<|^Ss~3!)$hD&YU@I&YYQ@-OGcs&9Xl@`wayr--&952dDAP621j-%|?*8 zgsmW`*1fh3^A|Y)6>l#($h@Ac^~dHcSWXIi@cDMvd9am=`)f@ zcm^wAk&K^8Fo2K{%MXb{arPBp|HWBjiJ?N_=9-+>AakWG$PyePRe-6G_-) z{%D~d@;h_hKJn$uKfFiZ7>aQa_AK=tYQ1?7nh#LVXs2)2O`gUp&f-$YWKB@*+xlt12Scqbfs>=*FD)sI{jXQ*jYk z>qN>aors~PxFTX9sEAl|wA#?rS;U9bSww>KRp=~YuAy9h%;Wo_kXJ-1@`ah-EINzW zh5WP3%ZL8;h||zn#A)=_2_*5KjoVaL#6_$B->I&Mi=^UWw(3eV)fI`4RJr`nePl&; z4|PR0VZT%t53q zp2!rdO5&BsEd=s9&F@~6M1DswD=3fL2gW1!QT*m-UiHX(3{WC}alQtzM_xBn@+#)< z%20^nYhO_iSX2$l6#uMHJ<4*vQ3WW@D1Ts$%Ko*l9l8W2QRRr8fr%a6^-Y@fR3Uj) zh$E^AQU|2RphJFVRF7)vG25sZt4hQXHP{ornLjhi*(2&b!qAaKjWq2cDxRdrn~sEl zG{vY@lu6V?=OD-=3VYY%zhOSbl*w0=$yZ2cL?RkCW0UKdRu;9z!kR8(;kl2fE!kRG zx+NBTqHFv&6blcz16R^)Yph4z^cm|yUWTU@02h0y1_3n(VaWvUpmYK}9l(GJUQn)CQ-^LM@MrujPV#x##} z4u*`HPczhnQ_SNv42+lNklBQ5%zq&=Yrch~Z9%$c$;`5&=7uS-=08wi%?*j7u^V95&-CScgkQ}~@sz`ia7dGL2WR~^DYjsE~IsmB@l03}ZNohsr@<=NhCt#$C z1f$rBJEI%0m=+Y>)FeGR5=2KwnjVdS3VcU*aK7;z{=5giqhWN>^DMqCOl)siU~~dm zj~+=ZBeP>YVJF*Twa@lRbKqe3RnO=({CNmHdZ!P|LPG{Kaffj=$T+r$qVYiS1x(9Y z!Y*Ol>w)46xvVPoXxYLGIO+R>%d&+Rc&PV>L7~TJV8g3mvIG+v1`Xro(Gt zodIegXMkEziY>A~1N5CP^FWJB>;Nj3MG285&9kP=mZo91Ebb#Cf@GL2StO3H79`a& z2&tK&w~7XF3ExvvEo%b8(tgX{R+TuumTwa%&U*UPavJA}%s;?P;k8`Cc9w;-OaX5# zQ`{DUS)%1ldcc+&okJnCmd6b>2_N~_Tb>sW*b+QWy2$(u@qjJ=h7eo+4TMc7LHx7q zsO2M5FRlDJHd;PnFWLV(;P<8nY*mH5!2`Cc%Wmia$q(W^`)8#4Ce42;OREj}wSs-L zf|qK&33Mgwq5N94@yM^$6st;(XSZ4ciH+hpBo* z>pDm{aU=iSs7#A&9cK2{x+Ue=ny+oN4$Icp>``Kotp~AFJz+09#ESc~im*Q&6Een@ z$(`=*C24_Ws;#Gr4{p7}$5h>58O+sPEGAnAB5%DF2_kCSnIiv@B5%#z4$EX)U$?3x z25EZoN$fw)oJp-!@UqW$`(SHhB4`ZD-4P+wj|>ZM?rN+GZf5?KZDF--XQE zj5pNeWahC00ui*CgZwn+5q%@-ZG)$)lNU3eCOT-d7dmLO7ag<^4cNxq=AbG3Hos8# zZ4R>6gV_rIM>EQ9tFw1>+qN{jMSpFvCZD_*R_(ApE$9_5;vA8Wz_a$Bbs^%mJ&>?a zZ#Rk}`iUZL+tVZBwxg{ovFf&ba^dwAZ5nsmbu{k%V%(nd4{Z&$qhYt*ZF1X|L3LXR zs_9bA^AGLh&4aeTIEO*NZGSb?l++rOOek<-V>KS91-4iRX(0uX4s0!VIwdd@?% zv)(*tCvP6K3Za2;&=XR^DDw+zN9-Kov9Q|ltjWTR!o%U$A zm3(b=yH|>4k8?OC;C6iHy4`;O{|ph}pXE5)S?^r8mv^q)@tx~-*}row=S(E1So~B5 z6b#1NV~?>tsBM1^y(SzaW9@5u7;6vvk}8>i+xO!bwSQ!uT(*CS0OYd0`3pIEdp>M$ z@BLw@_VXR!wf$&kEX<_+EJIDN$^7SH7VVdV_x8(?j*xNuvv_a6+O)j(8#vC|uO`;j z*^aY=x;VM^2Z){1uDoInH}0e6tOrtk%HcB7T|@84sVm{I$l;1d4jl?xRWiMHs7N{d z%tM%l-T~gJV8Rh*+^X-;htL#C2kSt1he05}!yvcnF(GvLmJ>pU;m-FVlnzr3HRCzv zmx^=humbrA=FRt9JM4szI_v~iJfo6-mXJDFFS&M*ms~sSVK3RgWFla0+S8wj^Q4Gb%Y^F6{)pGL`Q6_cf3fkbR1^t zwj);r9Y?yw0){)foF8CBbX*OFJ7QFIJTC0oR?%_2)$&_fMaT7Qzdl>5Km=!nq|2U) zu?A%9SET!f-f1-2CLE(BbiC$atW$ogil{BdIu&9W8S7NSB(D=+@#y6Jibtm)=Lj&? zsVx}m)E4PoBEUaOlbt$SE&GtMPMz7lbGD4}JPGuM7YUa?6=My-Sf_DF2y;5qh7yjG zu}%qIjKN}VH}1^eFV;KlbB-iqcgYw=Q0K}-fPZer{xMs2 z&LNEb!}kAV%b2KJ7+djFj6Dy=c<8V*PG5E2k6sf_kg?7UJdAb5GaadN69u=`c>v4E zSZDLs5%tb*g0Rl=>xdR(okuu7Bxb&d)EQe;on?LMVXU+D7EiF59P7uzy8=Pt0zF7k?R7t1cY&@Q{! zb_qY!r7N9tmmudT_@OTC4K?Qn<~xgX?$Q^$cY*x6;Q71!vy|G!datX?8|1yqi^Te3 zwo3g)7w6pNV`8_RbIMc6p)uspWg*fIL+{ERhJ=%pLzhKfazHpGRi+&9n8p22(|2>& zoR_=6M!U|V>bqE$*_H3Kbal`RIS>PhmV|r}m;rm&Hs%=U+Lhw!+J^nL$yQt^O>uP{&aO;xVdvbNtfW+H_pIwA zpZU!fDpP#!jY6XICJ=7d#YhJYy;~B6dy2yCy2K;guBWXk5pLJ39^v{tIgz8Y68CgP z9Metq!@FA1OV`Kb_c7(`r)O$K5qGOh5qHbu90L(|Lx?=DHuDul#NBE_#NBElx%a&@ z;V`A#E!dQDx2BYGw_xeeZ5xSyd8mbc5$9m~aL^>_WbNWsAnLHgfyvZVw4g zo9?cgGUy%v?z;!LXI99#dq)Nw-HSQnAmi>>Q_o+*e5eE*-6N3ylKJ)`^X@$%^X@&7 zIOO=x8u;DKp9IvqzeX8%@6TTPXDj2=X28*XEPF%1(fw0)17Tw`Qzr*~lU6^K7ib2N zbzg&oFFE$$Hc-M@imdxukD+!yWmSoxcE13T;ZqM5<#74kF|YR+A~O2JlF=Pff5%Hk zJ*v?Tdno5v$fyS%h%7k9e4xmrM_tIIM_r^BDG>a#WYVLdiLXZ(WzwS|u=Z$}txV49 z;tYHABX-*v;(VgdNX|M^4S^VXV7b>L0g2CM6V6c#J%)M2&|{iaxH9*92$W1(d1 zPebpCO^;qU7NI4a7smeMVXS9}RVDiE*@Zxn<|sf%@O(cjd*v6STsYIq^-0f{*ov(8 zwALp*xjyMB>l25bWlMUbp0jBQJx4po!4i5-G}NMv%+C}{=(z|&>bVH%Jo&`GEb*9L zsi*Z#^qwo&?+Rx^;uBpnW!ZB#W!aOD?5=Q)67?jz|9|_Z9@8*zB!UZa`S5A*Idm;XkDp6*y_W;O)$mS>oW+j*Jm{5f6-_!`HV}ic}^#U*$W3>mN=o&Ugp{PUOYSB zYd@HTIz}5I9)-G~wZw-VdFLP%Ylg zR?B)L-zTR`ZGCbh|0?r^Wuvc8G319a|EwH-=~D^$B<35*;O-L%Q|J?kgcls-pG6O- z=+n}qqE9Cd+&(QqOP`k64ctQJahE3#6Sf4F4FBayN#EURzQSDL>o3f=beLwerO`+toZjt=~RO#8L5ie$|9 zbD}i=!b2%{$KmG$K8CSFEl@A5=`)*4nyd7kPjyNt#i8Y2(#ZdCcKfE zgAa3#=%txW+U8r+S1%*QyFbvtZNGgmIJ8qM&P3{(ew!s6pJ@LZail!ZYyc3@KQ~fo z5RjZD8#?CG{$;^=|FTE}z%T!0Ia9&5`qwaRtA7nhynhYTn`H*3z4wn+AftaU=;TBD z{*mMOWyk(4kpDoJ$EE#y`xr_VXnf5kGXRXp{8~l-cOba_uOw|Bdj!!O%(wr$hFZz< zTm2JB0OX?}n*%uIcCc^iXpOAQ(FunKx{g(a*QSBTLtUOuV{}OUyDFbj6kktt;1UE3sHEi#sRV$!*nS>R_aZLU4VAL@y88yy4tNeF>w{RY6GKQj+(xAKgBd`! z10dU!sTy=XfG>9CCu*4UfY)G<1KvRT7{~kYXPBW<>yFlO=Y)U;j6$nLfamx?6Mp$; zz{D5`i#O9i+_)&_xDh{KCbG^6F)DS8Mx=8gndkh3iX}n?^gduK&3izK^P|i7gDEU^ zgeDNX1wu@Cz+r;?==_)lY?fR!{~W)93Iq|U$we%Z(D%XAvD$mkD;xdc{DgmQJ13et zO)WzJ0V*pqke!X!w2=3qniw96iSg&pXH~~dnWP`I5JYe>RWVJ(G^v0~Xi;3SIiIrE z!BKP+ti`lI8f-naiIE?*iQ$jh#AN@YHojgajM(3X&SKy{Q`QsZXr$FTWf7C;mR8I% zauxHDa}tZExT1AUzl6KbsUuAbgQ3Q(my#_k@pnbTP-A{TI%ent_fj37x($^_Ygwd; z?~1vGyRm=KVC6wE%$2iM3TM@Ulcqz+E07NlRgYgZ-k9X@a4-B>XIgMpS zV73DbK}G}fNEu~x0O_FAR%LA!)|U6F{Y`2cv9=*=v6urscU#JMU^r5Wg1rvxh}0K8 zYCOob9$gI_j3GU+f71325D5{y;Xz=zI~mTY<1{cca0DqGPwK~?$7M8t&p~(tCrexG z=dV7ev-5*tl<7dctjTriz^#7{x92oXmD{Q*e5_49yINBf0+F6*s^W1?Rqm## zD!nxoSQ{3pG*#_IO;!I?Q#H0|s^;gKsx@6xwFhge&Js=4Yow{*S2guq8BH~a(Nx19 zHPz^jrW!xeRFk8cYI;snA*VGJhBo0FH5FN1Q&HVDg>yhEx~8UH039uIA_1=D1x>Zu zpsCi!G}Y#+rrQ3dsdhIs)jmyA9j0lj<9T(5UQ=Da(Nwpon(978Q$60* zRL=#PLR6#r?ABDj*_!H)`T;vM6*EUu13~wT?`Z0!XidEg9Ixip)N6G#HOPU4{$5Yj z)ZjQxy)j->Z}!vFko%e%3YfRi&pY7f-5)eH>>o`Hhn!+#H1+;-n))D0QzJ@fYGfx( zeOLtvZAL+!qyN@a++Iz^=SJL+M^lN#HI;N&Q^_A{YWxIEO+a5CozT?BhcxxcGEGe! zsi{ej<)@c4HMxhTra;cqDk449)C|x!6MfCfhjc|#v$tz%&P+|s1+Sk&#`A}1Y5{O8 zT&<}^Nt#;HMN`XaXlgn1xT1rmQlPulpkWQdKTpgc*HNAL{&K!?etbcge+zOirh?+2W=wW&;O;0(@IzN9` z8}#%Nc0^vzgG6(4K8p%WH!ouzW`Q}1U#^arls}1s0yD%z{L&U}U&gyBFONZ*!nUof zwx5{=$VsRK*mi&&{0h==q+5h-W5N!eWEN=hk%++(?nX)%D93b{@tY=t&oMg2M?G|z zw`^kCqk}g_BaK7C2C{O#Zg%j-G_ydH?V&f8nT$Z3D3(Y%$i#t=4z0d`1$KKN@dYW@aKb4w`CVhlOeDdR* z=_zv41iw9OJW(;Y9X1PTf##Q=($Q-pvnUkYv1S)yTCE$}OJI6LXPiE47swvA%TVhF z^ssAE^Jvi!tW5vIc3sj?yRIiXXE*|4j;7|*7;6kWX5!sIx@M6|6Xh|pMK6}57SJLH zDd2`a{6r2?aueyc=2rruJ)lE7!yYl2AvbKnMDqyo*08(id#0%aSWP8@VL}=9=n5}} z`l=HYJ?xQC`d(g4NoJuxWairKoNZdfdj)}{(`7?{4-4n7a+^Vl>ur)p0$e}BX7LwO z)_eF)ivC^$Ab+neK$}J4CRAhG@ZJTpj~h_?dsm2W++UakiS&+zRP;pgxJGJdINYIy zf!E=nd3ccK=bQtQ4wy0>9t=u{*J2Ms=>g|lTe_gt|WSVMhXjhYxf773q*xsE>*C@~>+_-sgU_!N=g=jM5m;cF~W4BtSii6mW+$f<2h zCZLnX<9baCvrK3By(~;;_`M5geh&!W&DwN^-=iUXeWRz%oNYR>aPSlk10pZeiOplS z@G_m)Jm4=D9{Gck4z!4cIAg1MnNDmy6x8!Io!EL{Jhp}~F2mO}o!ENNZfreh7md`0 zk6}8o^+Zy!;gGIb=xaK$%`JJwwndBRe=(id7$Se2$X^EN`>=r6cg1vK$3c^^NgQpl zAG049>n+946N5QRCC1JHlX#OEN{n4f+D+2FCNEUmOsA#9*q_}*!4Nk@3)uU#k64Td z8}ocy>M$uRg|g8w{Ne}Yb@cH;Ap7ul^@h6|(H$wq&_})jBnf;a(1C*2tO9XYBhanK zU5#)eXDSkGj-Z1}=tLQezDO3?B+1{ zn6$sE4;cIqA@_$*41E-5Rp%mHz~Cr(h|X*jX8ciu+!iVRZPXy|BGbQ(8U!{*4f6JFqXxl-MhyZBXrMOpqamXP ziF!x95A~XbTn~AC+o%u0>v?cLDgie)vop|20Qk%Yc{vDo)I8TMhCvB@ePh(OK=9bz zO*!f20Q)-N@9GPYjRB4^u5b`N)yYgcCdONOV>oq%0vE() zUb*fWGeYB#9)r1S%%@&6)|knb+lhPC<97O~k4g&XGC9P(`l_MFy(+Sa3*pd;Yj_Tq zI)>U(-nj(8SdBwWuJ<(OQiTAR5Il??7ikMz%J`*{xK3zQ%PtogViw}O|1#P-m+?-I z--FGLb9m0{rsJasyxx|5b^IRFE7}dbXVth@FTyo$dATR#g8m>B+cm}w71uZhQ^GhM zyFTvjgxsNKvtD*F=2u8EuBOI$b43DHpN{V=fM0HSF-}p zEUoBs*;@tKy)?94MM=Yda%=MUaxM)6Ys@Yt(yH~*i%Fg!)p_U6Ud}~1S@ zQ9#JvMY6}NBag5r&A%agqT7!GC4$*4(x#wpFv2tlH?1`yVMa7buFYWda0?yWyaM^xr?~3D({@BT37^bhH@wkh4)*>K^W&knvS_`71SZ#KMs#k z<7NuI)R2CKS&&SP#La|Pj++U$%cAXd0yH@NxS1k`d7e^nW(gJPja_?08VpzCQrUPL z!PcU2sQ|{EaoYe z3o^j**k_S~(bXE#r-Q4py@76QOEet&9MCPurSZ0}&`2By$|0NN`W^0*6^lI;WPI!q z7N$uQf4k%4c->G&9{3LEq^JisJ!L#>G=7yH z@*DnevS=++NPO4@` zgnXPm4Sm{KxJc(0xL_DKU$F{gs&vMp)DAS9c;clwzXW$ab0zjxa}m{JLr=^DQLp0? z*o=n~OHgQu`D*iGE?%+lc7CC2GF2wlIFE`dhDz&cSAqq|FS!&`a#cz-;7V>#8pijtNU#AW>@Tv9-!%$7+TVD?EHY_m5X zJ7NW&ax~=@hg{MwBsprIw2uqDBrG4(_7k1!N7$q5CUCkga-)^ZnLOAu;hHc(9rsFNpIB^zVBoXsY?dbL%( z*}Hm+UA+(5Ouh>jlROkE^}0;MP)nW$V@{sLq4r&5K8eY`Ymk@jAbAoKBx89RzZHq zTg?hDs#b%)fd$ClYVyZy*Zj0%t2z10GNex43K;0$=5H(byOryI*RjRlY4UfP-Ru+o z#uhU98&**G+s6tos`i1Qv4zOrKJv%xFnI~rYEJ&LjH#1P1042j^LH9e9l8H^9h;sm z`7S+O@?E#5OTKFb)#DW$#(0G|>HEAGzT@%WaeQUOJ>S6oC8!=Bh>}1dm_tHGfQBOK zL<7;|0}+6Z53~yRIP)-`9Un+dkFV(|We~YLQ&>H|F&noaScswayp@MubbLocpOCCa z;`)IE*b^4uHU%Vo>n3T!DwN>-AY|w!2}KkmNt&<NxY0o z2F9OYsDm|jcOaXH7QBA4Sa_WX4>hqVc-<-<2QFsf01`g26EIC|;lbo|?`Mkhp7=QiKSo;%+Y*Ra((w7QXxY);&1=##4HAu#AkISln>U;XfjvYS=aavxBo79=LIL7T3gI$|x=9<*U&_69_ zlJL8bK=hyHA_B~H(1*$1c3+}gCrJON7{ZfvY5Z9eXlC4ElTGG& za`IPRJ!D>ek&?;B3HOs1&6(l27MOyFf66%YpYFDuDKpr9%0#rE;`HigApu+`&1K7! zC9Iz9h2C8aoKqpzscnICryJ+gmxyy}Pc)j^-V5h0!Ffs(jZb}>)vtQtbXOB6wr!`* z2F~3a5|qx=RM+*KT28jv=|RctF%Jr6e-o{8R88|U)V`INgK%5IP(M{KD7Q6nJGv0P zz_hNcib8uBHypsU?xcI#Yb@>O!D^c#qIYaDbBIrivxoRJ{-oqIEJr;NyBUYtNY#WKAtM&R^1WNdns+PFMx2Z!g73pUjL2fjlLq)ZQCNI1PYm(kNZa8{V! z+xXIkbX7v8DmJ=cP7=-5spa#vR=E+)A5epj4?vz z6S#{R4&t35LBI?@V4vY250bnu^DfAa}Wa#W+FD8SpumyS~!2e1#+KR)+!(xb4Nf&_cJT9 z`fi!=`{ig0g#W(;_@-ngGR z(yAdo6d%O)3+WiES7rs@51BbOTu4YD`UIN<)_gopBFLGOST)J+nN@S+JNmm`ME|os zM#A&2xmVDG6N@pjKMT>D6v#HotaOwn6o44`e0&zRfHddc7&Re?B)LDpKkFKse8e-M9v_NG6@OJ> zb}Olp$2}A3%X*?&r)rS+a#CHT;n+<@68A-4=`@|>;d#uVcj6~_cD;tnTs#|gKKl;*)Q@(JOty1$Qu;S3 z9oHrCiCvjggRwa>0Fg)&E8dYV%cJ*!mDO7rq zYaxRirrIY2QQh`u z$?O|;;TlYTF?S@Xotv0chts@C<_h+-Ff*A6+-IC?80zPh3D1(UWB#s}Fe>I@<9Oa8 zLtn_npA(~wqhj7ht3V#Z&O`L?85Q&JoYy@n41GRioZ*Km+>c`C=Oq$u!_9~4<_G$W zllj#^!~AOQaWemTLmhF^F6VcEgyu&hJ1yflnIFrlH>K)n$I1K&f^-V(WBx?6{N8(< z%m?4|zoFjer_l4x|B|OE<{v~lliB#^|HkgmvHL8He?bmIUyx6X-~B~b)A$!uAq5MH zLoW*ops_37HvU7fPME<0tN@NIh6OBu4>-!LPtV&z_9(E`Kj8$2!-5wp;u4F9eZgB$ z>;eQFM_1{P^MZI8A`8Z|zj5r(Jw({SMt0!bhe%+-akj|e8E;QLS{7hWZ($BfZNY6y zZNWp%R}1r+>@F;VqJ>2~X1}l!iGb)92H|EJ6tS=&ZoUWO3!C9)F^E|hnSq$69tHlc zmtn+wF7c9a#{b{%Hnh)$p^Do zd>rYtj}b5COE!zox{Y}8ABH;KmfBw84}KT_gKY1NM!cjJs_;~XRZnZgOCkhmYshX1 zM#k|^yp4ECFO;sLI+hHiJ6Q6jm-AXOLA=6}&tVNqrjxwP&VI=b)a}n~?@LaS(u1Tl z3wvMkCo2E8T^YQ>t!1&U@Wu^ zP_<$csd{R^xB?qxD|5&ie8mknohu%KgO!*GS3V~-D-jTa17Kf?Sny;Z1iG?05*C^X z&vIrrRkyM|%xGnMj~T6eg>=GuZzh*-$ z;vhx}dnH1ll}}7kj~VLJmE0n$mDdP%UJA^`4?2NSAQBlMZ!4tu)Aytl@(M*#o`ZZ- zYLRYVrz4?A3ZkJCa}%Bg-jtV2y#B6N;LB6}k+8T+?MFL1iHidnEL)@iS?ShX9i&!b zuc=i%tCZB{wE5H~5MOE&dx;=uOp38c3ep6o17SMYYXvOxUS;=3kj@(V>SF93i+brE z@vs!g;xzRxO5SIHlB?F%B=SlZqV%2h_pY@Py__LN^qW)F8*z6nTGxkK1f1wsuT^216@E!rl z@@fajTI9@khQ780Wh_5_yV{9C>OSVR`fICBX71H{0cFqJt7#GDq{54uKj-UqXcuh zS~CJvuNh%e?K~?&SR?zWYnDP?Yap+4{u!PT^CU2tUh@T;e_=N#cC1Iv6@>vRZrXy= zBmDbOBo)5qgiv)!q$ln9DXles+q%VAU#rkQ3KlvD()(f)(hfuassMN|goN?&1&CrE zC+)mmRLGeFLFpH?R$F{u7Dvu`4&AQ;sb2;&H;V)@*O`zZ_AJ7pHwbW^i%(4U&_j1H~Q|xNn;%lu4BY}5hb$U zz7A9PI&k6M+@>_v6@WC>6|kjQi8+CT=RgB>9*?y#A*?GPN?KRWQ>;_v?gQHE;BL=H zUjSeY+zb?5xKD1Pd#?l9>zY*nR2%luhRDJJeyillp+K|i1BG(pPs#zV{np`8)%j>x!n&on=|VEna5E6PU3U~WLopezyN;W2%6S3t z{Q8o(|14qi72Lu~&!=D(%8}Fb>QEgOW~+(HK`T*;mkNXg*G0~H>j#0O^>4xztRLb& zzq0;)LtU6Hhi29%p@%a8(tvEPpMrE%54njypQCEONOt`SC}RBz_kRC+L<}O&^*eDh z5Uj69s7Q7A45YM=YaK%b6^u2F{NJ`M*LuIBYx2cLFUF)C|d;`Zv4*mn^&MDK4;^3 zc5o`24j{aZ*N726UgHktWS?gf_ER@i1<@HEk;rDxrrN-{sk-3I`~Uz%Z;AlXn>vH& zO`T!Co1y`l1fn<%LAQjLGc!>94@VLE@aa!P0{(5hSK>$j%GZjaPE?tmsx|&B9OI9YEEh9*5Q_q zS>s}jy`As8EN%FcC0h`|qRnME*!iwA*^NwVFuj4n#7Es*8ydQS^Z5GMWiWgUrL9fO z0!^mltsOZW+zaWguOSy7AU++Cqmgr7k(}2k**cyG0$?&*C&5~_&Vr1#PBGNg#Zc$g zMfz}D*Mi)wD^d0(PmOHdK)5uPZDASV_VD@ZRydifi*+G6EF5awddUuMwmv4~TW=E# zOK~@tJ(1cG55cy{iMDO|0KCngUGTJ;t5arRqJ(vCD@RYdtx82)MAO@3LA$LE5nzyH z>doHR=L@mhx=Ek1X}hf-n{>~jPrFGd07f89(ZTq(crv~Xk7C??P(s^gk&^Ai{kh;? zBUe7r+J@-F4QlgailNfc0h0E#_+bBH05X65zcc?7r#E*LAvIQi z*!@OcUFU(R{|D5WXPVNsbJ3W#-F>DhZ9C62al|;0K0`$JtAxn_+A+gkS?>6P)}JEQ zKZV;DIKzDrCErlLTBs(c7}MVdqgkGlOn)2mVEWtS{a?;WroT-Sy*a!mToi^7+>`y< zQThn!VFwSwW;`dEKEiC4@tkD(5IHBg1E)8=&q=1^Se8?BUW>ut+DNgmT@ z`VgjU&Pm=pW(~=&LEI7dK-@q|xp%qamQ|hgImz^5R`q7HbFhgs+gseN)9FythhP}* zIE-QJb-7QYz7Mn6af`R*XDBVAMNqxwHM`DYw-;I=gd{ zJ8=4d@{;k(ruTs<56?;dk2*F7ZF(U1OAkah>BWS<@#Z&oOb=s)7gb@PY6Z_priYO~X6MK`Nvk>eyD$7z)pY(9b7}xkZ2QrkZAo=R(;%Lc z{2z5}`jqq`^eO2>+&(3Jh;>dfeFO&-;?Z53c36CSC&qJt?KF=z=wMx!OrqAQFo4&$R%J4h$Imz^|*?1?xut|Lj=YmMfKBTL9 zB(BHA>!m+2^qqWV<##tpJM*CgpAdiy-6WxiVkAjB^8xEl#{Mk49VX`_cS>-$v!tgq zYm#)fT;r{dFNCnzKXhYDXDV)f$y)f zl5SdKNV#*V>xRGPj|gVxdPXqBpDrwui~|(c&eQPUJFzYA6`K+4wvb_i?J9Tyy2=GG zPe67VB~{^;>uY>&vJ-LK?QiqF!aJJs?IZd5Gm17n8aEtvCJ~-6Nm;?jro^u1gpnoj zt{C>wg?aa~c-Lr)kzI%m;emKgZP#MyI=i(fLd{*<`N@M_yMZwWf~5XzF+sO`ZOarp~;rsk1+8>U?2MU8j#|_!PXRl@!c3?yI(i-y^jhxZ!#3$-3cDt>*FH2pX*(`+6&O{a5U+=Rl0Kt z-;_1q`Q=FY?vsyNVBo@Pfz{vNHJqR~4gGtClv~G_Zg{@U!3-1b`OmWfgGR1cwE2D( z(vL`|(Z=~FY59J(MT;~)%{sF+C|I%@eaiP|{9W&(`42%zQApjT2o*{5=iLZ?3tL;AqbPZU?q|6t7(qf+pSTs}Y7 z7}v*C?7p{|;{Ba}0k3NmWwGyV-o>}{bH%wnAq0CUfV`8h^ldi%K&T~i2iG!Ij}e|!zH zedIA@b0fYlftWv0`sDu%jKFzm}5BHckErjJg{Mo zy(=)U__>l@(+P9D3sby*Asgg)7XgX#bB%Y+5ReT3*^I9yfh2rc$u+?>lf_izk01D# z#1Ke1$6*ITJ@@gi;%iLv*ugfWok-X5ECdF694_-X)(YmL`Z!EXD+R=S-XWRN(hD;9 zdU!xC$p~pMmoOE;a@{o^{`B}&Lp^vi7hCBm7nG*X!EZk3e4f_r9Iq;o)MR%UjFyGGS zx3N+Q4O^1*1$qZdCr2a6J%8c;WCCRFb?ycw6Ztu$bAlSV<;uX86ziTBa`x@zc$N;bI zm_k0u1%M^wlLxFCFCk+VKY5tNoW)OGLHZpL$0N%e@%=hX;wSH>261x|IfU}jD0r-+ zNlBz<0Q{J&=+Mxq@_GeaYao(1#dl{(_8spLd+?PlaK+Jk>-hXz%k)NkH77 zp5ml=hiSUJBUU8iSm8Eo96I$tpT1hE1@`mVMAx& zEzWFkH`QIEaO>|{3-GfDbk07DR2|@BSDN5wtFyojF2{@k{w2YOBfXDw11uzzw7}Px z1)$C^p;QdN0?Io&4Mc7nHC~Tf<#52+^Jtk+2H$}D$}vFWH{kdapZLP2{8NwfXzFnj zq}P!Svl9TK_jAu9yXK{5EhSv`_8+4(QNaLUCZ@#vU7OezJE!O8 zK{{xr5@9XUc8^(LwY_JxO-7{UZo3(6FMz}gu)Yfo**1sS_5#K#3(U3`>bTqXbhp*i z69kw~et;@+AVnbY*#^E$x0N{0AYC%_OYO8ofA>Ro8i!@u_%Pje*ABYHiyt8^(i3xX zsxp5ZP#gv*)PqsAfWE?A0&i-#(%I}1v~sD9o*3Y12EZe1a;X)YFh|Yr;t0BM$#(>q zzjg<5eMS+4rgvf?B35*9tq@WjL%;snI4v<3C;e-MfmI@4#JT=-If!f#27iywL9oGA zq#b%fMS-1a!UE_3>DW(z@67bu3vLU%cGS?3gWPnu!D|>A0SOhQ33Pw$k*0kbZhkxk zO#FtufltH5$L(eoTffMjg~!}Y-%nCxLcVrhcYS}3*bIlhABKAEJN=^)Fbwk`$F)Z& zKI1$C-~U@N+}?1Wy+~}h{Rgi9N6>jaCsIwMNubO*o9tWrApoY>8_&=&*~dANN<@sw;`%$_3*9)>S3$g?@4h|(zS}I5XIL2)(eN-`5d5?N z-SEc;!2gYcNLac?#%PJT$^DH&ZpHI2{HLGmkn03>{zo;W2D)>*8EJVIFMh7W_(BFD z9vS*ghwfaP8RBO=zy!q25lHd6b0O52auhax#C1x_!OG3wb>}X3`BA(y2l&4r{=XXH zl?TWd$4>lQ$MEQqDClz`PLK@HzcD;;d~a(H@kpXkilBwRto*_t#yfc!qNP8ej<88@Y{R@ zeOt4S|4PVryS!8}@Vi|oBdbv3*y*G{wK|bwpX7ERk>9SJn3n|J9?l*T1;hKq@V<>) z2)v!l!elQ3Z)2XkJw{`jv`y6ez6 z{xuwaQ7m|*yAGe{UljB~!L1Uy>t`6qtr930#)A6zbO1*3t@)2)fMZxEA41aC5X0RNtTd_h1v@D!Y4}D!Y3CD!Y5Yv}=q&f7f|nyN8;4fVuY= z4dv63z;^FBtH8u2&JVHZJ;W~eYl!UQ5?sm}hf1w}ZWVLo%}GT+43nC8FDV ziCI{Rc^cy0=dAzS9xl#ZHIUz&P`DEQoE8lG39;X{R|w|bS$6-M`8hwG?!(`80o>dN z@%M`x`a?u-X0U(X57MxL{rd<8q{d`RUOfX__aXm>eFEC!4t(Fo>ph7Dgcr1wVE=xz zRDT`QBtKoPgQfe?Bz@+|-UBf>wjbq>ZK5o-5*$fP%5!-MqCdXLU9k8kbnnGf$%|7+j|jV3#4Iggx!d+gEzuniA6FY93i+y z6W3_l+=vUCS`W6kam^;KsouEeCGyOtSO}L-l=uUK#2v@TdLX0k!A@e`X&=!c*7LBt zDsHSdiS?QrYh_fGqlh2eN-RdI9_B{-hq>+cKK->uRS=hh4|_P!=3#JRaWSBWt%3Am zb0QtPOxNhkA9fg*moFV6Af`dnR~$@j$R*;#ZhV3AB1X|alaR2l@5k`E5E4e!Ki`^p z_#Cg5kQ_Yy=MX^b!08`u7}^IEThMM;j@hN8dm`kG}EN+M_*&{&*atwnvBPt{$CsyDK($?1u)A z{jwN5rr&y8iS?DTuxaPQ>Zl13NAuLoWSG3uTt7cfA)1uL zl8H}nj^rZlcN>m8zX}EC&LMjO*=_a<8!(B-cTw^q^y{$akr=#0iTGm`(YmhiG3XOG z$tV1XLRJU*p0vG++7QE$_q&YjCI7(FO;5Om|Kw!=)18rL-F` z0j1sZG6AKRM+3cl7P!R(lpf0Z&@4@W9qK(<-_!0;4)G~HmZh<_FG?tU3Hd1y&qElA z(!Zy{XE;0xr6~Ov*jFWS(Qga(-@&1N(&W&N?SxasCs;~cKy9gxlI|hIx z$ABy(1{FBor3xIQ-6tf$o@0^8o^vfTI|Pr$@ueK6Ilh$Rj)>1M55*@39+h9jRSbQs z^I+YV8I>pRK`e9W85I76blOlkrcuQ6adDvFnpJ?T$A2il-&st{@cWBo`8{%51~|@9 zF(b#$wJdIush9^kRgSLUI!9M8I{@W5-lk_zIgCmd3vRQRR$4k?9@)n)7w!EawVllCjH;qxULjJh9-Jt;#tUi64^5aH^FH2$l0o z(3x{p#yX58m|xDF0&?^sZofAig<9Jt#}3XKDu7?xQaP_uS~>qp{!!s4BT$N6ppw3MW|daLkPKgPzd}j6rm~C`$Yc=(OWd-lDFnTkDDfoM9=#Hsr9MHTnQ!u zya1$fxqzTdd|{~S9C8?Jh44n2%7ukY;mc^B#p}oD;OK;(g@G-G%00_Llsn1rFQkZ; zafJ%Wb)7_?M%LC`W)VO#xtpkvKLCm8p>P8<$z7ODAeG!fS{Q3`BRnbGKxoeW3IRkA ziO+y$HXnjsbHB}A8MWwqcFoNagcH6RPEEk~N>%QUWhTkJumJ8iUBG22npTH8a;HIk zMRn|gs@#XHbPNHJ%6%fS9P0CwLHd@@x>cSkpr`<>JWr%6)uA~cu{;AQG5DxF!--F} zUshpm$pg1uxPXRnk>`7ki#&&ATwKB3MY2VZI|AbGx(Y9l*NHU6Q2AD394D4{dx5<3 zts<0SSX-M-D(_Og65zk0yz?%t&5P}0nA?CJ^M2=crvmjS%m2(`gqt&3K5QPSe1)>` z&*F6R)e@(huaz7+SNUEd^h@>%$MnDXK4R%d_E6MGu)ph9uvY+rEYQVJWsj0Q1P=J) zK+#)Pk)NL*a!!;c6kwPDz6#JyCq8Qr2^L`sP|L^y%YS7C%l58 z3i?wf1#^Plf;sKTkmX24>1hfTLc)6yi4|-DDDpx)_^k>(4+Fxv9!K%~_Jk_sy;xQG)LytRTACr-0X@2?p>E4b~$K+6G4(s8^3gP?pi50T|_`U-w z4-5h^E!a^W^I(h9#qMhbU7 zhYMCk#ctREXkul!po=IT2L7^mQ}-xcL*aO&S)2|Eek27Zs1Caz#kN+C;eB~S7a+7k4S&`05Zf@vs@Q%u-^b?ZY|hOOwm$4>ZBt`Du2jV?$Q)bzV?z~RfU#7? z1~BK-;+tqB#aBXg#W4+f8N7U%<~)iIp!gvtRlBKuGl5^GQN^!;!xB1FQ-b6azhO8^ zw+i5>FX6|wnN(AvFsc$&NF4r@2JIDdnv9gFW483^tS@>f(S|+Xj6N=yI!a(@7C#N? zlo)^%M*}JGI$oktC1P2NS+V%(u&`*{eyrm%4QYnvH+D9sNF9@BiCHG|C2%HBm6&Td z%0%bV#?Ao|6h?{Va$NxLSYkmIGeSJntCpr01N>USCBvb_7esCrXpz8u z8`&?s8u14!$-`HMDpd_{(5Vu8kq&5n9!F)7$&C_K;t&Zslm$Tyj@TDg%w)vs!YBR_ zQD5>F^?d;UfhUFDdZnmK`a{$u3qjN+3qhDAb6cV=SsIxp6m`kU6m`jZtPK)TgZ7f0 zk@~~H0&U|ki7y#T;!C~;11lMm*}y<|Nd#k=NU^b)CRTDPsagUPE4hSCW*UyNDS5cm zExFumoyo{bu7+GIijkGv=*4--AI-LzIlsU@ZjkdEIUl`akJrAzC$R6?raZN{amnj$V;6BtWlSz0b{9*-H9Zo<;q(vSIh zW?QEJV!@>&1&vs6=_q0_3)~i5Ix2$&lg1WcqjU?f5u`|MCsNxR3BPQZSj|1?N}E4U zuS(-chANG?vD}utUex0Jg)05Z|6giH2pW^xk;GsY*wl{9g4!{pc8sCQjKKHlROtyY zs?wjb?L?C%-XeUZFujfHcgE4Brz=i-rBf>4vc~Lp7Y)4h1{ip0jCL;%D$}|NgRe)Z z(r2>b&KkU>e=~cuy7U>mf}%_gqImExD9T{bMVV%W0%iX?v6m?Uc?{*EtV}nZ9F|D{ zhh;v6y_TVD%3zE>19t(@m6?TfgTtZBe!SqM${dA>=V!%jSU@G&`6!FI6yQR5+2Uwl z7W)*i_Y8Ju@m>~>xG3$c2nQ);>w}cC;UJ}KI8i-slTwzo6G=+hE_yj!duN*7%f3bG z*bE^MNb*c#8h;Q|mEA@j%I+eRzw39z>gAdty=JIq@dQVgpWspDLSV$!OKPgzduE-+ zhvTZ;c#K)=kv?)!_R0k^D)%)TbFh~?fb$kI)+7|L z)=`zpAt&z*9?($N2)V@S*gnA#3sq?Va?UHVutaVo>uR{`K4;ypsOzNZs7z;NP>epI zv^?zgIV>)FO_ffNh}=+ZCG3b)&ZYU8YX^xbDkI`ol`#k^HLzC{fUMjUscjZpHBeyX z_O3s$$fm?A4}k?##*|ShD&z7G5*LW^h+r#^1H^zVAh1xcJP&mnxU{Rh4QUVhOsB~8 zipYs^R6fK`pbd25){}|*GI7Is0k^w?c1kYJBKCALN@w_N_+!e(08PXi!$vB`Y zp?m{8Kox}Cl`rMd2IF>wY^E@BV>If17^P}|y4BWs<&_-Yrc)CFRc%cfcYB;L=jCVLH;2vLDR)L`= z2cfv_XsD_cxW^edjEOEKa5PWe;Kx1`c0lWymJ7ZDM<=(E_bOE2$LOd5LYTmnBs~xZ zMpYof-%3&TD8t|l{0b$V2z5rFj)B2IECMPGu%RxY1drq@4Y>>|Fzrd9Gi5BRa?tvf6RI8&! zt!3~^i8bLW94HuJ7HG1CU41GYNG)HxgA%HL&GOor%dsEp-rvr0Kd1ViM4ty{Q(ZO| z#B*0ifKYX>y+aLFYUHLzuThBQoY-qTL#5WJ21(Yy;WkTH-Mum2!@4E0`3t;RDCG1ILNMviHU;ZZ2_Cee~pc6A~vqsn!f;`YGTA# zq}Qwp(#^a@NX@Dl2%)#DSsyLdRL4yy=&IRC=&JcL=&ISxhc0YdSh}qFzDXjm{X1RQ zKB>7*Q9w1v+XAXN2?8?nZn`FAr0Wkr%t4D?q-zWjEJ1psPtVyaVD!(8=kaQ9rgnE zRI4%FQ>}20BD$wqZHapjarXctwK@WhU$R%V24a-d>djH|FSy^pbXx08l1$vO^k%gX z_`{nqKOSdPRjnCFpUN3kU*pDCm{5VXr!ZJ*&A?!(#ib96YV{0Y*idV>ubYmK_S9z> z2pO{euA7)9>U2OFXsG&OoF*E;|2a@F)+*36zp*zVHjdr{vbd=889)-vr_A^{bx5Jk z3YI)CWU$1X8RU+!K%K9MD+lCQ#~cB5@PZ98x6k2%aZu}tTXtiYz}2v>t{-Gn=aJ#4 zUC3SMWiCfk>uJDSH!o6Odc(R{4%Edbt^?g9P<5J!}JOtbNRO-E|MMH%tW{ zMtq3HF5GVbz}bM>$7H0{Jx?T(w?;$V^Ik2iEx5X{$a>{;h^_983b@r^e)Y@=r0(DB z5qre7p3pfH+dX2pkQ{;N@pw`Cs+S9V*K?q@kOf*VcVgUXVQRtnXm)oA$4m(SO2dV=c!e{eP8 zkFSh@VV>pE@LPniv7`1lNo}WLr!u&XdAdvmH-_qg(^0QDr!Ei`9O5Pls5xcX08mme z6f1p;-9oUzU2VYzcY_Sfyd~J+ZW#n?N-nq$0TC*DsWJFvNHe(Ke^FyFJe#G);2}gJ zd3SF^GV}&D2EPL}2ET)J&B1vh_(L)$`Uw7nJ-WQ~7mWR{Ec6#V+k{_A`C=96(O>Wy zx2U|HSx|pl^e{702tG{dVZ7FrXB8ChF?SnFyztAx|H1ptDwx*r2-*6z>9*@PU|0UG zKjAkU6hVUGn}yPEHh~HpC_qmv(6HQRRu0G+z7ASL`78|w=h8Bl??Sn?OOT;bmh%k` z5j}lE1KECWa2@h$fZ4EqkR35YxD9R_s$qf-vKzimvKwL^uOEe04JXjMHk`{c2)2Hd zcdLd=4fXsYwtC)02l_lAf`IP%mFTqz9c?2lCmP{%dWlW#080FIqX~d-1U=Rd@_on( z^K3L-$7Md!Le1?%;9MImHVv=Q3Milve8qFm+5V%^CJ@*NyEFBpa?+?X2huzg(g-2i zbI*w#G)f~9$yAm5w3Ocr5Dq^eX#M%Jkli zR}kAmVsk&eWOMkm`VXD^fU*fZ`*Z0}{p_+ySxDd$s<`P33_F_kW%4+#4AN-Y7iw+V z4!s3s>%QzJrW0%0*K%S_Uq#dd{Ei0u$9@VgCNgUJA;jAh%Yyn*@zqS%))cbv$hV(L z&E*NsQ`^h-t8Zc7)M}cInh{j9^0d}wfh5!4bqzzaSrk$?LxmLJ&s8_=EFxA~`7rWkQI2!(J52bP_Il_mqXv@*p z3_CRquiy(ws@dO69&r;ug}s2f1*j{hX>7LD(`+A`eJ9N_Zy~}9g&jd1Ue-id8uox=A?!bFaa~$0BnQ}2 zhg%Lq7~iv}3@K<5WhuSz6R0z#7tWW+R5)jzaBKjfBQNPiD3oL&y@((-ig*@{ zBCr97M!P)Hi>Qr~ETk9FT^hA#qZVxBExiZ?e_2Q`;uQdorSu|((8WZ&$A%DVgbP;K zTPh~;c}&D?_w$$w$fNY!pGI7YQdPnG-}hqF7K-1OyQjMZ`M@ zf=Vxmf~fR*rAbpnzxQ1;XU?Q}ulN6azdX-Anb~FSwO89~*HO)0*Hm*uQ!S2Ys&zjN z(&)~(0X2@nurKBh!`7GLMfN`Q;qH;jyc}R_(S3!Mf^mUFNXQEdA9aX=ALGSYp9wf=OW0n+l{BCJX!mR zRDiejeEU?uy6~E`m@8*l>60jFFGGtm`SfHUcHhlVk2q7+ZAdOgi8Xw4I7tA-|m_yU;gun(T&G zfxF?%ly;2iB#G3GPBR~Pl~+{6k8%X2~w-xw;gPl3f~ECA)xZ!1fW8 z?9xa(4*hJi-J^$s#$9?K3`4+fFm1+4(zr`pkj7m`Gf5~+O3LZHu811TUAkSy`Z{{_ z0)+A^!YYX10A%%+6DY4apqwz1Fj@-vM;AG`yOt)P{4a7Kle^Y5J*uwwxF@JoQ|;2a3^en;>6mDLj@_t zWPoOfAHgE{55k(y)cSZFEp#YIe1tV-vL7Vsp zJT!m?oMb^fw}A!}1q$(F5PS%)+Zqr*Hb~cacrfv=13UgLF~vXr6>egUf5oF0BY?LN zFqIO2)n;$}atDCzOft(m*c-o-?2X^)i}mOw2<0Y-1PUa8nihNGZv~+wJZvWYbM_{T zBA~x#Z^AT_y$L?hKVh1oVg~v`O!g+MH`%KfCVM{xXWGp`*s7_R0tnm$0ruVptP}1U z?nD@q7>FcC{03qJG#F_yb&%^fQbvfis#G+qfYlJwLd4GpHu{+<8gMWhnk-m0- ziHWW4`)u?wERJz+;(G{3V3fVZ1MXzv1~W>NjlhZKk-S0f%ojM7i<(an^lwB{M z`gn+53EwwCmfoPq{XtjFB|dKJAUIHvL04A*O69nLjhWpreHtluasZi{`Q_Y+}5^e6wtLEK(moi~# z@P2I!BKm%VuucXM=!LU6uIRhY5d|tqQG6)`2_|MBR1LnB;Lj=k7^=g5C{kb9_tN*% z(t$Vy4(R1=OkAvjMZd{WbW0sX?G6;$!a~4=KRNwYlz*F(O*itFrn;R^J7M(IcTSW?uRx$(XF~FllTu zap}t>iVzymjXVTjt%;Pr{NxuAyvTU$4&`$e>{XwOfph$NLvXt$e`weyZxA{!5Xaf-LHw4x7J#SU# z@#x{GuYWm&T84Wdy}mSXl{NNnWJQQx^^a!Khi1)I{Sc!5vCPD?LH*~2;b#%)(0?gN z)E{Hg*p;@-pgZZmh9idlA2FVb1Ouud@Y4+MQfys(tE1O*^R5v0fELI)0J|Y#S85&c z)WwCLM-iUDL{ksR&sH8$tpY);xv5E5b_Ow@5e3X~bxg_IeHPAPV!M}H6;8F(GxFT*`(EXmFy;K-n2 zRs)^oQX1OMaf{ z9MsQlZe6^k@aJ*Oqt^jO$@LM?2PKaqM&FniCAYOA92fz5az{c>HlYJDKsPKWGUQM=2d0xd-wk&P zoT-#l5KTU51qn(iZbdlwg$AUQVl)LiA#<>5%EL6GLW$!$auo44G-DZY^*@hVe+lT)*;^_E51H-9{;e>p<4?AKQ8qgB@|4nb!%bvAU36l(Jv-Oe@f0fEW~+^ zAvaj5U7d~5Pz6{+F$xL5va{sHXlP+%4d*w}+(YjpH~=47jr9zzKqwC|E|=f~qoMVo zI76FM!B11MvLMh<9G>ac0(cE=&q5q54eg9DRR&8#VdJ{B5WxLeM_-oc%{aTIg2dx2 zE7`^{+i1eWT3EMOI~&+FbSBN_P;8Ar6IJX?O?57f@UEu1glGyw6xFSirh0H1(1ZPQ zkgVbGK8N=<-19bRzC>D?;Zd|QIb6ObdMo;2!?z)v2=(S_y)tly`^iEsUvH_h-`!Xx+Fcs>l6?o?}e0CQe*J|(*dl4s>dD#;uO3fLDr`Ec3cF0eyHB?+?A;Jmx zD;~WAV2^|xj0Bov8&VPbniY(M;z@+!P;O)&#M)CGBWL0*?P~C@Utlm2!-{BMKj57W z5~8J|#3Mf^6xybdU!r#(xx-NLMIlrp4;${$Pt(qfx$(Y z?db6!c|CWW;U3c*p%YxLM`T~LAUI|ODLN(z6djX9;mb+UHX2C+5{`ks#$C)s60mDb zD%mw=8G`;d>>7hBxsaM4a29=&AqTq65a^lw@d(8bRM$|lpUiZ{hrVnJY}_sEkI6Gs}g(VLuWI=qj!Xoj0M=S zFok0|ttdXu*k)jh<>QP+zbPr?Ik{zu|5$W;V_zdL#tuSA0WSt1HH$PHJCwnqVZcIF zV4U8H$s-s{THx5YDJ^41fHf$ndbT5;Aq{B7#WjD<8*m*uK(T>HqrDudk z?*xvGgNYpXq2ZqSAb8>%1UoCP$hdE;D38a33_l~*TLN=`V>G;BW2NRxhIbx`xA7(U zHaPIsm~Sc8`GfJ)Zr_l=+a$bMrxCz@e)Whh%=lTFyN#xi{}ZNw`1V&zRu8dNT71k2 zQ>c~J?{E-gLLWmV{hXi0;|GbbGK`-fjMYQ6zz0v9u|>3wz(Y7UVai$f61^h&0Z)*b zBAUG#Ti1c)gfu~L{C*(FkDfRnn7E~xMe*SiN7CvNQZ`8oLF2~%hSmqV2R612-+e=+ zA7B+wg9%9(01n@|?*lh+Z&MC8okXy1(Mr0(kBY+q&tp)?_}4C+L8CzQgw z>RqnT|6RrMsSmJ|9qWW7>r)?iO2g-a+94`UBo-Q6qzI3kO^N}M6aQooB&mWwIs z^b63O_$P8r{1X<0QGI6>=EmuXe~MB}Diw@It1|-MVs%d{gVNhbpGi%SWm08nv~{g& zW>sns^fzM+q<|No+8<|?O5Brr^Bm74xRjF>4F03cL4!Xzlp%=bX^B!vcY)^QP@p-P zX9$r?^#ebE=HyU8bMgbh=p1NH#-zT9=45;b);+n&KSUGQO`e1>57-SOrvz=$Cx-aIK8M$HR;_>wp_zOx=#5P&MIKK6>o|U} zeJyF5!)MJHujS{VIWV>QtQ=@cujRm#kLQ4nuec=?rkhVc&5;yDT9iwExS4xO9Bf}9 zVe*tg4e&mQ-IRG4Xv*_M7$v970fj!3!_-sOnH+|IPuY)To}QR;2@iMA81AVM9Gs^a z;`W%L$sOxpysr@c?K?GN)o z7p83ja?>`UA{0^s9x6s%n6^pCH0|qPH0!rjb{h6zn7S|xU#4+SJ7W^f`o`(st1O5y zonHR*aFm)}1@)CL#-43DW-*=*bMx5L^oJ!DvNgR+#;+W2dGBLpjB?2rGIBabu@)nz zzk^0iUm}fq4byXwz3JNnxJ|#zg4wxnL)`NosY6H#7Alj4ur44mf_$GCbbTI}Js%Ic z=5u|X`}s!*C@}~qf8IQwhFrMU#rIe){#HT!M;TYKM5WRUf&vW(jxDaGZN5?g9S3Ab~P(8ZwgAC#;E5UM9918 zMD7eqT`G45rQ*g`%3>-Ho~1&Fz<=R_y&>f9*Z~K0W-0EBomr0Pd-TrmInxwEF~dC@ zqhZbWc);gOt7Juq&zaT;iMG#~hFyo)LY2el0--c`>%pV2Y477L?QEV*oLjcf#HL}( zK|Wq6KA{otLesy12L7!Vnl7_t>0iLsr+;dw<4T>JdKW;PleE@e+;2d?*KQ<{25jYPs3oi(g)BN8~l~&YYyHdzGnIWCWzq^4+`(hQiriH zF7mobd`+wP>wo8KrVm4Qv_9aA;av@Wj=tvqQN^aOnZA(iTgYlsrG2MOUvuzx(gmld zGQojWDzG|DUo$*wP`tNS~WgSNhzHnTVYa*iX@=G>2>%YiO4;xEhxMN+dV`&&~@l)cpvr z0m_I#udBa-m^Xx^bON}~2vI6|Ac(5J0eti~fDfaFzQb?K;ZeF-eM2ys*3j-|b%U4? zF`WiehZh1C1&uTGJzvil*!eL}=dT3pBE;nc&Hd)Y8Q}OE1A{J@sEd;7{VA-$->m_E z@^d%?ZkT_FNo|4{Yp6%z6`B|X-7rwzuR~$|%g|i^GUkN)GIS2Vis$yPG~6#d!ST6& z8^ZU%Ze)OV{-cOF8l>H6zM}Q1pq>9HfpNN@QIDP|PTKj8n#f-XM(3cN9|I7Rc9~U? z1s9u83XmnUg5A0O9sSUX%xJVCvp*`%?9bvIQ1PzfY(?f!v?7HoX_?d51FQwd_)$N1 zCT3qVKbM3(Y)INi&U+DDRgk(TXvP>Br#U>Sw)ELv zSY(5Jf$PREEH`myuWh>EFYF;`isB2GnBhlL*z*%e5NdW|vXNV6zUJWcP0;z6a|UnR)-7ps@e=eo=GI`^ zd19mGyi7o5z~(k(m6X7_?U4~q6@fsS=O&cI&m*v@b3uj2cAdh*AUvGQx%mS^JQvb2 zcczP{UFVK6)Z_J71~T{9E++Z`e~#SyHWwQN9Ql?Bnr#w}!m<4+Dae^`mK>19DhW-H;` zOh(}o&A+V93e>yK}p1ze}L5wsi1~t?McRl#YX^Vp$DM}!ZR33np<`k76`Us zVJwquAb~Br3**_?g`-gG)YRb~eE=a%KzI@1eLyldrY@Z5fV6~3HlzSm7cM1L7cTWZ zx{tNAblWOf;T)5r=<(8R*mi@zxsf*w@{->Rbi&~lv&Z2f8{-TzK8d264 zYOZE1vNopb*zlxfV7fp(6^SqfVXLM_JPN?rxtId17rl*u-h1(#YQASdXQw<5)rV1@ z7yXIk+Lk=0kbH|vf-5PhPl9J7kYO=8?ZuG@Ndb9Y+>viK$@CPHgNRHB%JX9^+7Dp_ z0ya6A^1QfzkY|x1LDI#i3^j7J51TYap0WC&M%>cW$W{m(mO`FKqV^@l5rEICshV#* zsk5X6Yc^NYGb4}@WE#tiea-MP)^xd-W69HoTb?nO8H!gQxA6uqMT9Oad7V+->e4IV z^;3Cm3-DP?g;HTF`~pgU5=`*@Sm>D?+wk zz6*3U-y~VkN9J$vX7`Kl{){)Umfc&5n`Gg_&b$9+c`j?ed%e2hUQs#>KSkl1ttbjy z-@S$UcWUe@R@8?pu;KxEhs8**?5)9Or$0#dY(*`S3uci4Wu(J2)Fu&K$q-uY2Iokz-$4ymjKCtoiv7M zS~UTP&xQs7o(=%~_um1OxtEm%fcMG*rgM!JRJxXbDTqYQ7n85aDMgx+1VWWs*Lf#`FEp5WaHx zQkljLt0DSi{duOWS&Z>EnoCI^!|J%di$AOf#`&pY<$vWvt2K29;C+g*43B z7xc}zuyZB;=eWV!T7$NAq-V6*$aIf2=`E-%P z%=Y*fqG#%}_4&+j5#f&J^9SV+GPRH?_sp=4t{ix|4$PKk=@8eUlDQhb$Y@z-J%eK8 zf{=W0&z0F7E(Kb+4wEgMz(l zT0|c4;M@9=E`158vL5pw<7$FwAN~>4Y%Ala8w9%Kqf=&4kNz6l zun=K2!Z!|Ht#`P1>o+nn53km5BCpnO0wdJ8N3hAe3c_P1ua*JshT#Y!4EHB(G~bIh zuVCBX*5A`VK!%TMBSdPxIYFHY(Us}A2H`u+H`kf?j=qXq-Ut=jSk__q!R7Ug zuV{sKCYLupgm*p*mp3*Ins*xXWdSa4Z0geA0X;W1HPnQ{;PS?bK`yT*To~SsXvxMu z99-VmDahrG6PbvL_?M4HZk$3cZ%k##pUWFlgIwO2YT56N3yBqGrzgw_aCze*-#l`8 z<2&H;#&<|N(a87maM`rq8$Zbl;#1#z0kMl9c9FsY0)BVCUBJfUc|n{oyMT??2;!RE z1+2;g!Y=C3-v=c>aUr0)`lK}}Y1!{j+(AlyQiF*mAszPn6Mk^h{Yh;Il9~{$sfn2g z2ayf-djsLZc7Fo$Za$^?7Kp6rP-1t8zES^7H;`e|FoaQ>Z=r}2cA(Oa_(b2VZ$;u~ z!1A+;nr~51)*w;am~zDoo3T@c#(lFJfzKjQn+wsnI}FDLiWH6eXIEVM8>VsJT*y$9 z2GY3W3)Ak+5Yf%i2yZz=X>+9@0XFwwqD6pwL}_yZMQL*%hWtfob03P5F0R1lKGwbe zo1a7*QA$lZ8W5$;Px%&84mM8&6E{yJX*j&lVQ%x4gUxzg5PsiF0%8e4EFl3!ls4x9 zVHfr2`1rGX^9qD75KcJcVDozpGC=(|pRmY)Xlr=7c{k-?^KLL%O@iH-JRjjGvOx~E z1McV0)X%#c?k!-;5|IPCP>_Qi_&OWYmm#dl?_0e3PMu$9c5i8k(B1w*F63Z0V-u|a zLq<8+l7hfzaU8e6>J`krlC2@fWX8*fw8VwnPVt}%x#cmJz5^uL@|dBf@BrAB$u528 z3I0dKR0zKtG;D4FxAlq-6hmG*|D;lC7*RL`ES3e@$bopL4^B;Bt zN04Tj3%vd6SL+4YPw3bEZsgw)g3w6wy+LCK2Z5vd9rtI9hP47(JL;k=PMxB_N&Q#9 zVgc}W$3<<%A3^IFqMy=l_(PDm^Jj$Xns1pTW=4ozJ+0p)W?v6Nc+TZ}Gl-d6cK-vj zub%<&WHuv2KcnB0>~A7^gUk1pWM3YMhJfCr%q3lJb@=)$GTe5hT_vJlZ?fpOe2qoF zv-)j<`DT^j{&s-N_qKpp-IA#!-?u$h`!vZ4i0AY>%=_*02(N~5UX?Jv9b$0}mnwrQ z-!3pG=|lAM`frlmK;*G7PFqR#w{m7b6v%!-ms=}#fzrDwxx6K<>?bXZg{L4DklIzj zh57XE(8X3(IZETh5CKHFg==z~$XFIdr<~ zH<$h+1aH@GhI;-ojLPofF8vIQ%I@NZnxQeGnM*%*lK&A=mJ!1={gPBOiTNI5K5IQ1 zBCx!j21~T-M_1;TtZT-6kA4s2+@asNL791H;xs?QH{mTzpkY%pz3Dy(d?s-9-SA9>=}>nCc+jrahX&(!BOQp zCfQYH?zURD!K`uvtJ#pFT^@e{f`y3gIb^u^vitQm7O>kKU@uuogpBP&6sbLz85a^Y zfdsojz&D7$OxW!$D6QgmH~0MIY?TZ=WQz{An5AfbH+Qb?t%uM=3-P^+HjksS?tNHK zcWdr(cp6Jcd*u+xUZL1t9zEUL&j~d^EBmyUl$p$Ylc{ww9dS3X*uQtVB)`Vw*Jzn- z!wj3vLzs}%z3&-nW;TS_MT0Fj6|Gs_Sl5T%#D@oCl*aW2lOJw)IOgJI1 zf(J?qIS!NqmIuoD-Xl3Qcj`LWngiG`J~s{dm~@z;_5Iv=Gx_W9M?< zRJz-g%>!6%@P%?s`yjpx=RO#A3O|_f_g(0U2kh?=1P(SsRR^2d2psH61P-=iY&$0c z2e4<9ktrlH?5ytsZ$`+BK>H73n}CnESSxUQ3?uDkll>Ww5?zm<_qH7LA}loAhh8Uh zT9AVW(}Em4xYA0Jq1Hi+N;Gdv;b6d=9Q=kkc(~)>PY7o%RmgBb6%O8zwT**UqzUJV z?fKlA;4MW>T|JR1kP%e_z{-O-hss0l4izy}`p)x#2jTpo%7AjHvTr52bMx5sA!^v6 z77jbF-=k^;Hzae-!9SZjZw{5mX7TjOLg+*B5Sl}sP{kQesS(9Pqe06Ps!4%xlfXql;6raCd}O!}bHM6-m;^qwJV@X} zhLwcW07(yRW1QQ>@*7t8jV%s`ew2C-Gxo4k9P(OdbME2LH7RhB1uo_$KCLFq_MzYO zg%&jr7evOx1s#xumH}((@fSs#4r3g17{>oFh98=@729;!F?v4S%t~^!=`coghxc#; z)nSG{PBA$=(zKX|2NTu9>?aQQ%Z+M27BfRAblA)MUYkOP4H1;XFEaW?hs8YnDrD;L zLPPnB`c|QH0cSJ2Xy~gB%f61oA24}^B051m0^Oa3y)l{hLou>m!b4TqlB_rJ zAeUxjZDiZ94=Xd?_de;D8R3Vf!OVt)ny#zkgYG|2wzkVaVtk zA8JO;b4Hox6tZPjFq_9(vvr3GIS(yl&x3i(o(EE9gVwXYgH_6&ClZ^@J%?r_ExEOq zlCYM8A=#^ty8}>lBMCNrRgMEiHIU)c9Duh&ud{asjv?^nf;ln@RI*(v;n+H3Kfj6a z{Z3Tyfnf4Iztr*lUcOu3@I}2a&^W+!&a{Kyp95aspR<+j`@1Cd_tzPF-Pv;P)kox! z66ARqKpYCtN2(DtV1nj(Hr+|rR05)Mgyqm%9_3CnZ!|^a$U|tjB`QbyT1nD19T|j7 z+%61(1Ex4}FV60fVa!CGIr1FB3<$_N)R|}s$dOsZ`Uo$uJ2KOWb*|1GNF3q%*^ze) zHG3#Lh9mC-Y(0)Yj(kJ|dgNc}xM4+8vh;rBN5cCtXNTmiDplQP(rrgo-fH0OQ7k>p z_5$wF#t0h-_h>7^JsRtPdz5#o937S$F3V46d2cmVar9N@deu>d$6pfEJo-5Typxkr zq-Hx(^XQf!HILq~l0rCw{h=^3#YjhwH__Ghwhy5(M;Cf;9faO^8%9O#IM}7+Qh{Jj zVZslXm_Hfii8I{C${;)lCVXgTaY1yCwSjaTt81ti4~qO9>&BKGi$+V1Mdujx1U_bZ zY#=g!LB+KJ*$?>ABxrK%8RiHkqxPQ$AUuuQ*K;061J2n`IGFR|Ix7E9Zz14F zlDQVodETGk;{5c!rTv(dU=#$vjsmPR5~b#(qcuOh4@Lax{j*k77Bu{)_t~JIcs>Rt z)toF3)Gjl^UhaoiqDQhQZ@vl^{SqSZ(|%iRrRbL|3MBYr8u1fN2>e7fQ0qiB&U0Af zqRa@)fUt)bnx1IO^tQeYGJ*hdC;9@B_fO*i4$mB3D-6q`N7`h>%SitVR_~t~!Lbzd z;KU5D>O>k@1$jLIBY3icHN9}+W!CVr?<3z|N^^rEC%ypSbnxQD55fy?N9g_uY;Jz> zI64ita#OzS`dp^`NN@3?+?RB+nhWTi3@3UXKd%uy8G|s$aG%~p`HZCypKKo#;*-x< zNl0}Vfs^AHO|3fpqDhR?GJ|q@5fDDTC^yL*oeW?2M7YO?d_nA_xx)ZBD z{jXrvr!QDZtlH|ZPyd^7=D6ZCP2*`XjlzyI9y0CpJ;vU1D63q#WLaBlr0wzFkNVG) zMF=uTB4RSlla!vrnHUVnG6xt(XjtbAL{tq67zCoO^Ge1B)&Kxq-{5QFj0ZlpUM#L3MdEgWr z=PT03K-|x|A?|0cKq@54oP#(Uin`8*S{^>6=PY`Q`O|agy5-SBoy>yl$^e@`x?%QE zXZdmSvkwU-SP@|>&UPT=4i0MTTdmAJnbMOfl94Ct&kmBZ!4+KTm`Z~cXD1^pGTavu zN!M-^g|kzFtT?;eN)kWstcYs&An}p;Jj>yFGvUs;5`2pbW^hREIn;I`u|S;RKGz(f zt&>6LdYfMJxz0rS90!Q!+U4euLzV;c3>ye-27({Z77N{=ALm{bC=0-gbF&P!FvhVG z#RAwyaPAWncu9Is7T6^Pwz9w`DG*$D;xO*q8SwTTCkxLVL~?QHhxs7lf9?X&yGcs%g9_K-j^SDgT_p#tX6wcQHsPlCkTop+?-<;9S87(!QPd5L> zFgnH>7QjfI?~IDK!XBPaGSs3jVg~=KzYkM#eiS?C^AoKO`Z%63v{-Q0+Dmu-ido$j zR=3453OTT(aNn)2S z%x5NZ0s+NV(Q8QH7${&eFMP%9iUM@u2n6WD5fJvmE%g_zgPgpFBZtHK-LKPVp)9~dQ!>A)6f^;th`jvnk2Ak z#@YfSWf8)Qod~p3z^+{6T+PLvj-pkC8MV#ng0djz#itQw81BpcNGZ9z>f)FnIWI1- zlEh8BxRRM7EJJdU!%oNcS{UAoXX&N&MEPtq@zVW#OA1;VtDm}5mq6XowUDJfn|P^> z{8EE1HP20v9K%RvK5Z3^-ic>rH|=xrFXvNjg1*kenWZ+kv~w`xsm08t6~w6yCqfpb5Rq zuJ&>*RCc)*m&$~{mmBfDk);kWU66o%yX+ zd`m>Wwe8pCpU9KTS&YqcpeM(h82KBhc_q|Puas_zht3E!a|~Fo)O1Ff1J)}w3G@o@ z0lZSt33MSyvLmA}FA2I*6MA^1CU^@7>J=UK_)1M7?3Kn4XETy=9~`h=X$}@&i9&9V zP%kjZbKHPIz@2jd9tU%JrN3jqdS#03`AQ|@q!M$$3a|<_QZusfe?QeI<8f1scn9&7 zMF{U2?rV+6n7-_yub{6BcuQB%ok^11S$5@f$27y0BPijRC)Qjj`Wso*59PB1hU#h& zLQv5q4foX=p#0TxhFXeQOpxck6Y~kf2CNFt`^EFtQYn=@Djn3p{fAaEL z3zCT=ZagPjNtjRz#p^Wk>Jgi&X#cf$5#?klqOdt8Waf2}NZ@_NC)mGhm|F_*4zS~Y z3dG+g)Pa1{@Pk}jO1lmLzR@`}4o@h1y*~VscLOtW*IS7_x!#Plx&9DnbN!+JXi5nM zf^_{d5Rh3ebExvGtoB^LN&r`L61P9-0pbZlxHnE%_-h4Z{I!D3!e1M({$FVlf31}d z3x92P7AdU_^?G<6JaqkgW|+Rkue}MWx9>CGUj;P9vQMz=aXd^l)N8Wd_v=e%@Hz*t zCma)nAv3Ro<-fvLd~Ke0z$rZL$Ky)xz|(lVhR3bmO=$m(3V56j>#qtZQrc!DdpW=$ z3tT2ATo$9eo9s;J4|J_7pvVWAZ?qt89)AT$(TyGm5S5$IWz9Q?T)zC)FJ#Szf z{Kh(JIeZ?LUfzQ<4mS%Tlr)70TSj09ZcCl+pdo2!OsB;b5S>&}{7yzbSJj zH#x+)*&(-}(L8|oH{%VptP1PT;icRh#6p8?nYlSh)cU3@;of|LiBC9d{>GL&7~K>t zZLw($Zp!TE&9}hBn>ZNq#vb42Vxh>z<>N#fZf<1ahmyD@m^guA3~uvCE3PbK0sBF$ zL4R5UQvh#DKX`K&vD(G`HnKg>+F^suII^)0;&>Csl;2p#MqjoX9oUn@ef1uHMaaa> zKMnUS=;YqjwdnKs zcaP>AzsR_?5}JGKV}u=s`}RRLH-*i;wb9YsEGtP=;1*oRfU9md{w8y<@wd_M-7e>B z{OtzjaP)Q=j4Oj&J00^=0k5}$=&0x48Gj{4grVh-N_{R5c1{r_d&kgDQG2y zhJ+aIJ5`uzsO9tDiQ(I$w*3R??>x?^VSx;o!PC6MgBe`Nfnh_4{?Pl zy0tq7D|EFp+`pGXFZX*Xjb`un@+5c*2z$0^^nNc768>J^_eEgw==X;VwY(ds@p~*D z`hx|(V-98cNZ9({$Khcz8Xv-HY;1DA0J1-o-u&;28My1|_r*kI9N^4abKivq|oWllb-4N(8oX;khjGbPf+w4E63} zvzC|mp2>IbgV!gGdFvT5OQXq9pgv$aaOvHB)S97!wp3aZHyrqU=k*MGcE+G2{qn{xl` zR2t>JC`tnu#poI48B{A(lkm;)uTphEI#t&m|0>nPP%GX%fyfj*e1P%qNjy)(^EQrw zmBLLcD}MMN#=stbRkT^*)&d15BSeNhPqEF)2)0?l$Vd_`yi%ZhN$&`30o7!UR(x6& zQh<3#&yZpw@+zb@MIwYE5mMTReWX^8>n63Z$uu77b{uJ#r+;seXqw!|mtJ|bhJLmh z&tuEvnjB@x?`)Jz5R?C5SE%CK9XW9S!|_amVmDao6Stz zj-f)nVWw}m|273HOZp9oL)2*yAdCdKjPRGCJd;R(Q9^(#K>~ypwURhVrb5esFH;A* zT!0eVfCX~wxKW`|%pHn3G8KwXmEZ?*6x!ZUt6E+NJcyQs!dF+Jy@S1;3LV3kG5@{S zgCd0{T9d9SbT-}=nVo&+D)^@=bZO>Cum>>eq2G`Iq1)tlll-n@9qXL7V*#ud_e9!+ zmVC!yNkTCH=76&OV(kET?3o)1ce=S?d~wABL(W$qUV zsEB6`)6vB!&mIJP>moQJQJ!;x1ojCj&*8rvktokCL%rXg^b3wi=#{DhE|e_b3OHn{ zKxGlB0%ZucKv5fy@Eo6@W|^JW9(`fMm9oz98MT@%ArqWmN&LeW?Pg z+1Na5UwK{G%vFF^5Qh{CR)nq?oK)lpP8FidLhYHcy-lG) z*qyBk#RW$Xs!%V+^l~&(DtHV;FNDtHgDU@EBvlK|Edg8*rNqq&8fNdAtHpu*9HT30@=<`(YH#9os4KWi=;UpO7%MT_q} z*sl~`nAz9tR|@Zz>UYTR=kkk9@T%|zC+hk3D}^ydt_nM+$gTdQ@HGL0X-ZW%-<^=q zn!=#!hh<6Czzm7UUmFZB;z59z7THdQKSPEWDG-$JBGs)VhkO@-%UWbR<+}(vjUwIb zc0#_3JZV~(A_Iw15%$wXdgm7Kd@M{4k@F&c=J(rjUgQ(uaFKnvJ7SZ7hJ z-b#{#14VJtvgo8hJ(xFFMF;w}+ry24elK9xA#A8~(N_>Ip>$d`f$dP|qN}YWX;0Bl z(Vn!h!LFd&+!g72OlP_1&m?itJ*;fc-#g2={Y7oqEpp~`mhp`&RTO5lSP_JWN!)RQ z%(Y-ci-A0n#D)e(C>lNXV&<1T@gLO}tLgj7ZmXTqpN2L^pqgTB5fThlTPYiBx!T8$I)gC72uNwI?!TIGlPmlu~`TUM7&*?2oqT>_8!SlY!UHTl#h31jTwr; zlm5sEl0jdFF#|lfVjIKo^CdjEVqe0>6#ER>er$t>U8uC1ERd;UKfu8%c8DqTAN6JI zT+PZau-Xd_Mc^gFs@R>Jd1ck_JyQ{jS0TQ|%b;NKG7f!7JBGoHBsBzt;tx6?1a92G zBDRe+(cfTr*SwZ~Rs#{!!HpMBM#Rod;-AVQaR8NiMLiw&D=g z;^=uwY(=_v0@+sFA*#h+vyy~u#WB&7i*3a}WCpUWIGo1fSvlEO{Gzn=JEHU5-?Odw zB|~kTke6-6?|^M3Lcq2XAz)kaKag!9*jAz#!UB_RB`SlECCV_xVjGUW3)@OGK(!?r zIM`OABlAY(%qwhLX|k=vW5l-v=CASNBwv7SB_~l*=pKGGW z14OFSJB=Nb`yS%k zRNL6wvUFbz3t2tk{lw+|cYHgg#}y>+-^8d*zOQBL=5ah9Fw|#s@9sa3hsRyMZ|VR- zIZjCB-nQxc2FUSytT+yU4GuynY!~&nXh0nXUl+1NLOYjFe$Us_iey`DT6L)^Gee= zrdMW0|6I!hEpv)_Px*G){qjKnyg-`F8kE5%CROH6ZdcIUg`~mVoEQwflr-PkR9X5Zd zvXI2jSNL|r!jP2G=6~daz0Zds+lIYR{vNL|BrArSC zWf5;)U3vg}EGqW*!~t?9!b>369?tr?s^INqYd^Vq0R8NicQoeWYMXB_u{Q_u51c_` zA2?%E<$>SW*axt}j~@pKa*xa)(XgTAJYo2G05-JT11IrQ81-bsOqQ#L@SF=LIaE2w zz!t6>sB%vT!OOLi7i@S^*uE_rDAhLIfzIX3{p<}gFJs1_ z+({RHeur3>`<+p#BiQAXJE^(Z^76^VM%r9{>M6XB=6hPMUO9#f9px7SQ2F-(sQmi^ zXe0rZU#Q^=yQ)GXVp@SmFI9zRz_&s(^PE0znMgYd0m@#%ZD*>&Fof4lLsfxus};uB zY^}g6-c*GtjGf}3N^Wex*0zFCg?E8bg)e|ng)ao7(Ne{`nhVyuVlm53RIEj?6{`Sj z#VWZq(Xta2>-%x#7d~&KD#Gw?`6HK|Xadcs2uf9ix>x*=VxC6Ls5m&N85R9j5>f+p zqT&mTGaFlRKI@-vH@4!tg4Jt`ea+d}{H$_Q){lLE6~XOFgIT{%>i@)1|1m4cSwH5O zDh;L`u81L0#XFXr;%;?S$s-d+mBcHl_&d?~JvVV26Gnd7t*$DC9Y@jfhT0nM+iy}2K3tPC1a`8Prp1D9($G{4!7=3r%&vIyaZ zs)`L}npY<)t6-)*uzFRcwUs2DNR=MUWbJTPRp0=Z^!hQkZu7Oulg!Q?&Z^2ZSn(>; zK=CTj#BCShYMBpaOW4^~Np-B=RC$##ul}Ren<~?SJDgP&naHlfiR>zQCbBJ?QROr7 zEy#{4hrstLUlAp9G1lJiki(D&{i~cL(31hJsB)J@;h@_^t5URZf?E8s79eNU!Uz=& z74`@z#mhca)gnQ1R>icLBzdrOsj4<10nL-Ks;Zo~aBl5WRi7b{S<+`S`&Wp3tF z)i5#jRZI3+xi)hWEGAj1VdgLGWguamN>$Yc3&b9T*dynLz7JruAq~|=J0P;)a;TPx z%`}#pX6?Q^hv&J-dI#E3?QJ~7LeQ(huzuAa8|6;n8Nj}J!aLwJ9x-hAYP@&g8ML?@ z9@D&=&f>8h9^Zsl|Np+(&f{+hriKkhz%aXd82Rx6nHrW7WNH}3aFQhEE-cMvswT|g zt`imZBJ*$>D{LW-*s1E6GzeR6ZSuhY15shi9Z}}D!4OAshAjnQ!j?KLh~vyH@<7qT zmV-=$u(MkP9|+H2u&ThZUZHWA0TDLyae~6$)vUs{o9V}-!f#pOxB2of3}$d=aZ4gB z{)xc}Y*;q;LDyjAM9cu&h|12TM9d)g>LElz;^>j#^J#CAQW-yJP-~91@PqQzi{)ro zi@Jy^7eK!S(U+0gs%(${VQ{HBddli>CTe#gmu8bo)x(j;+ykkq_q38^OGNc2n901Z z1Np!+&HEw&ayLYE%q-=+yhBz0o>9TeHXM5js$V2vZse$bwYs5dlovu)mwvSR4G^;W zjU1|#cEt2vYQS~>`ZNjYa0gdqXC5-oG^!e$=d4jPcnt^$Sz`ps9PrM8_}5s(;*f65 zt+^eT<$n!`s<8$|zM}xv_}CPM8lMyX=U#3og7DPX1$bW)9g=~&RIrx_l3U{^G_O4e zP&F{~U9%9n>O+AMLCqq85kXDZiLXDR3tuxX3_nkTbv2)aYSskVzc~*$HJ>q5t^R~l za~8rYFh{bb#zdy(I~0tX>;q~#kN2h>QaoaxM~#T6YQmt}p~NtX&v5*DgYw z^Kzv&+EP1;rEAya#-Q4f9)Bw+LGA7cgA5f;&vWK=DnacYK_#d?%t{hdRr^U~GOaf@ z$x!&kR@ENQOt_Fn)t*W`W{@?t7s)TX?b@mKaKV?wVk>;4bnUhHOs%T@aoafjev5Dj zEH1-S(?Y%4vSwd9ivY56T9#}`;BiFXGSse3R$H@BaQS8mRCqyXRd{7!5?%&U6fpCyTRz9L z1>t=>{?;I6IB7M`P!HCjahOX|hC7_x@Kh^FNEtpWKdT=O9euD4xfH&XCjLPJKuuO=;4lNNxmryXPW5Q%%zQbm ze)uloP53FP@Bk}3kdrr7uN@BE-xCs~9(!%PS)1cl1+Hs=s)g?)VmqN5L}kxBBDRy@ zA1p#7B+jz>Ur~56j^(ua4{~cuuwf0rod@x`FcbX-IjnvZxbz@!eh`jGL}SYGK62^7 zhk^qCV3L(YJBcKCRMBa>Z974HCgA;B4>x zg758p-xF3p!s7d|l2C*?&k}<=bLDp`@TfDvRz&Bxy$;Z>`!7me-5IVh{ANf4>hc~{ zRTuYn;3sDTP*>fzSr?F~i-E~r*#uv$^~&b6Ol6$`Q1$Afd@=zwvH&@^ZF&4{LFsxi2vC7~_h`fBlhXCt2Ps|e zaVrU_fr*fM%yWbK){O==>caxmhoUxkozz%B zYSf4C5Rkk2@CPJG%dOhH5M`Jd34% z&huD$+z`!{BwqEa8h%S8&7J#vy$ZAIeF?dF=FGa$Mm79{MGC|jDzX#;zPI7y0hC29 z2w&twrtn2pCz_EJfo5dIe;|B|I2#e!7rjbkUr117tf3Cq#%zT7AR-t!fWQVgW+NhL zS0cy%quGeazJa}@k#o^T-w|2|PL4;e;wxrU@d|Snxf#kD`7c!86c#jchoKs^mxAIs_}Rr(HNSU zRX%qPkG}(ysPP|Ox z0z%g0Qvk`Jcr@7yf;TY?^?eb0-cI7rGX8ss56Bu62#QCX?GBckf17Xuy~*zsA;521 z1n`@N2H-cX2slkKIRp3sIE3G{5#ymlj(P>Y%=~o(ADhM?BqPY0!z<)tQ%6_ZbflFe zolDbcqs*E?4~aX zGn+04-OWh4%ed$;y$COg+E&WTz#!x!6BGjQU_UEdGp z5=1k4+Rg4b`XT=fbFHE|-Gk=h9>7m)E;~w_A7k7x$4Le-MnJdV#Bht%Od(1w3^oYz zgqn_FZXY7zzpTlf2c1BT7C#`sAU(|aa__68MvG%XZEWebk{r}%3E_G82hOv$gu1n? zVNruO7pj(#LXDR7Sar)dPj<^Ef4xh+?T{P6O7z&&$@mvvJ zwfc*Bo%ciM(|L&2;~TT8HQbce)eRNZjm>_Y&2D{Pu-UC)6eP*f?AGWmqO5IxQC#Va zs$!EpDuVA37NX!_R4cYWDw5HW4h~9e8^*SAa3?=Z$)K*lG%5jMh@sl_BBpN;)2PHC zrcuvWNn)R(yv$_TCyQNCbD4weih2uS1K9OrU?MQ;qHe%S zMcsgvih|Mj@fzHVsC$5egDSMeZD=6cgt7^2QJW4Td~L)NXj77DB^}KR9Mfx44+gFc zMm;}Xqk;R+EBas+&dhZK1=_$LZi8mGt%}B_bs+`XJQAcpn`u^(gI8^4Fph0*^E$%2 zmWb|iLATp%H$}9~CxZGqV!Q4ii0D4E+)jr`Zg)_lEjqKd(T0lVPTVx!^QGF>3R0sjHcUv8_#JJ> zAd@%7@;lnj;hW>iL>J0pTFY@sqU4m>#I|sFqaS9U*7hrNCa~>pw5aWF>nc68qwN(# z{d@{C5)D8 z=wD0`h(1o9MAPa-ANdC&kR>9}t_1S8D`AU3yBHCHb`=<1!65?eIJeoZnnM#&R=5JUlxwcRC5tA)-a10V7V-WU&oCmVD8pT|PVQLRFPPXNx zefb(DVSW3`0MWiO(Imw7T#jgu>4%fqw%1Aj1&&Djj);|g)a{2cQ*X%>7!v{G_7f2> zE5W=o?7VXcf3AZJ?eM<56Msx4Y%f-;{rk-KevVmlpS4}7{dUm)2IR@<^5@vD)IJ+r zZ+{tL)BZAAdpT8h8MVh68nNjB={h-FM7qN>7zA|~#`oL~1cU%dnE=$`Edc89mH?7{ zPaQI4yHdxmNTQB%7PTYKqIUcy-)YZ|SOkuZH2alUt{KHDTR37LAdJ}Jj4keBAX?-cuCZoRksv{=LcGba2%fY_rX zKn~x_lf`c9Xii%=ecaCbG*LjCmuMht!3>f0xw`hUa4*;lk3ocR7UcBh1jxbOuc&>GCtn z|Li-??XQ~4n{>iZT??~aT;>B;9Y^Ca1jbNe4n3c);UIU{rZ6sDo5J9A#n9~R4m7DN zLyFm?uCV~!HI}HsW^_$t7FiZaqzrZi=cc&;pxcW8&@GLr9)AL4rQ7QWA0X_bth`HE z>GnoYR=Vx7l8_qkv%Bq;IFCP(fBL}zbEkMj^4Wa zNQBL7$9u%1yTcvr?zNIkJQgyOc@tQ4qQ zgRSd+$x4#lOg+F;&AZC#(Rx(o+iFK+Ex)%%T^6#YV|z42!+JDyZZGfAfl(cT+sk_- z0ijPJDm^gSdVUACmlFbSeahp?{HN{Zz0jT>3lY#I^^hL=eYU5^qF{S^U~)*3fO>%2 zJ+?5;{3f63v5mNGv-WR84twmQMzYB=@(t|W?s1g)j^^6C?eX^}4zNyfuugGrkw9w% z2Zwcv1M?+GI2HF0GNn2e*aB$9wPrSpig7WhE-uDN#kf9<>SIw6n8pnUZ{tQ7>S9ro zf^qZyR|@t4_Hio^Fx-#3OYGMY`?&Xl6pZ`YNMq7v6pZ8GIqpD^f^k3QOTjqq z$%{Lmhk|{9L%fE7fnq`!arl5Z#KS!Z=v+KVBS|8a@jaPooh6m=5A8{S>zmLVK__zS*`5T) zPMZYyD3XNK08JD6G0viCLNahmNDk68;i-ISnm}hRVO$=X_9qUr5nu}wOkn-Sp%Weqq0saF!LH&E2Etoo~oAS0NMW zvL{yX;ff3vPiz6vO>AhWf3NqQ@L_TxGa|FF<`2P0{1Kp@2>Xx-XDCr7b3Y>LiM@iT zCyup}9H=Kg$2g*%n1L|I8ic%Tc2kKPhXC%MT5vqj%tDY@@)jf!5Pjr@-3!(Sx*%=RIS*SNYx&i;7=ST?cKm01k zK(wdlWQ4_r>eYf6ZDf0TP6@WB=PD~HBqRhWyV!;i_+s6C*eK!#H+%lXVw@5^z_&Ym z`xIN$_Tw$7BHw~H^x@E|YvpEiQ7b3IKR^qT9wKmVbWY-1cQEc`3a-O98JE->Elxt> zNGINE$+Akgq=yN#@qe(5*-s35OtQIy}jwF^0NQyDJ_txcMjPMLIA^YcP%v z85l%>6)s`mOl{Jq8ZWpShJ6VE4B>)R&@4ngWyPQRPRVUorSZIvHE^qy9tmb7q0-Ag zgBeM8@bJqiG^#ir?gG;gW+8D%5}Vt3>hWi2)YO?;OS^t6B5egqXLILG(i*mMNf@81 z^9Q1uw5A4scx>)!>w?-j{*P$NC;QLq?EOXy4`Em?I7-eowS(pHN**sBgc!=QR0%asg| ze-OmFR}=!Kw0g^o>t__}UTr8b<}Qj}XuKpzzufC-TQzfwXs=1kNKdZU^IUZ3HHSec z3zt@|(#1P1Os{lENw0K=SLfV^+G`HPv)3F*3n5%P1i|bzhw#t?_gWEvXYE7nwE{wB z=HnDza35+fxn@@Nk~?>LeaH$w%y&mpuY;&$IaS5n&-M2^l6tKmVk;oMMCE!7BDSIm ze*RpoyMlvTmoyO)bii`#dzM_bsrdHwNavc29Ay90Kdmrzk>S`4pGx!%g6Q{y*N{13rqX z`x~Fl459blL+=QJ2nf=vbd@5Y0qKy?i-JH%c9Y!zq4$mm1VjW>K!FjE4h9GTDH0Nz zqKJY>3;e&|Gc&uhN$~gl{_p#|`F!qV=azF%yXT%;=H7hXAy(H?d@tpjiS8;h@m(u0 zxoQUnAD07 z!!mUh&FdP$3L?@DG!qfM3?#`GbuZUAxU_v%)peT#*^YrnU2%|uHBZrXo5K0Nu2&(i zZn-G@uK&n0nRO+nKm6@x%+YnL%$(gyB4@XfX|V#MyTL!Y-;U~;8Y`gDZIGZbl&&~U zJVb`gQIJSCbXDE6$z)D9bh8iY!Jc({-iV(McmII^W$@iyHfeW1joQ1P_N(2zK}PKk z!fg{bbkS^^e6~)dftnO-FJ#iCM@?|0M_*Feqm4XYLv1}?OP?z} z<_TUsCP~hb%sJ8zFKbSzhdT{krmTp@ZbLX}xYFaWuJ)`bTx7SrcIG#}A(?Wqd_j-^Ce6rz4lH_9=_r zGI$4r)ms|9Z?GKJ7tG15VEbg2z4r~?!3uW}G$1_goDDZZ;wMqvx02rUX9%&x4c5^YBIx-#JfBV@1LL;|^Ty1g|vmih`MhsG7jKPh$putot;U%5l$v z+DC3GvE=JJejjCkb)Uw-i4dM-6s-F+Cd7UW7DUr)=+n=a(+~STgQTu7CWrbs`)@SB zqwCX;wF^wt_M}I4@~lrk0kw{xj9Atb=TEZGoyJb}`9fFwE(&OvA4R_b7M{!m)z{du z)#nT$>JqJ3pEdOPg^_>wFovf0RsSbV_o^{#>RSP&zn0x&eWOLjeVYSl-6FefehZUi(>W`6tz-S7L=bv$;_JfkD)dkEo?G1b|Z zv&4N*v6O+InBBfyE$b_5^p;|z-dli)Py&9Amh)jDDCLI%!1n_M&FjOWx9}*YtN%1d zWgotxtNq?KD(lBh7X7^UW2pT&6WPyqKZe?`DTUInE~D-DV}L#VS{OW|HB0Nf5SM;E zlJV#bG;j-u+HaDs_K!2_?Y|ZP`>*x-PyM+b+<&Xjf9kKZ-u_=R`fHp2gnIiQFc|rg zdfOsLf&&Eize0io-5<2eFtC^cOcpJY`TBv) zINS}#@g3HH8+Z)FXI&ARlP0wY{i%Uy90Mx^G9`?*;DRWkMGFOICA|L4PG zKgjSl`Tl&|{}Vj$Jr2nqM9K%T#z8`H&#VUJ9kK}JR2^u8H9s&A?=O00CFO%iIbS1e|J$`2lL7-Pa8h7k1#41ZUn|{`As}#Kwi;i2U$`vmTd-c8fef? z+c>TlNFRhfaf40?E4_`4lM#bXnIa!_32k@KDOe~(X^!j3`0+EF2W*=WlhHQ{^8E_W zLp)N52U`2!!ffq>g8~3~Fm(L+IKUhH3gCUrR`0EulwzVX7&dS)iw)J)knS{JI&I+K zw|q8maI~2u6P1HEr?!EE_t|aWU<~Xn8>q-7lU_g8uy%u?^_=p~CKB z3!wc&>1htl3qB3a3Q$A2i*?8|fI1{2o1t>V$IucG=g<<~F`Kg~i?5GR46lFa`_zV^ zZ!^=|{$Bqbj2$4np`!^g01gmlJ8kZc=P-Nxp;4@UI!yM^8M>zS1rbAK|LD*)=@BvX zd!*wuP{TSKV}PO8Sj$xVE(;rPS2;aDB^31YAd7xn>BhMzs`6EbAj7*;sO z)(Gr=_Anl6Fzgd(E+A;yE_6%7J`uNO7&pBek%4p>4@E2qPyz^Rp@7{EAr4!MG8Me7 z4m?f$1s#`>L+!30UlH0;b3#E|L~1u9bS@*I$PUBJ2*vm? zv@_j|P*|ClyBVR}ZWFrMbTg!K+13(z9F`#TfUX6G*f#KD$blB&sih<$@i!!vzox6h z(J%sQqqPq&fFDi&?>Zo%A^+-tgwBOxhIS_VILT=|LdxM+NEtrR4Qm_?tXwVrAfenSN{7*7_LX? zT+%$3)y)-}FK40ap=JCrvmiH@2{x+dBI$A#Qav|6ACi+~&wUBmrt3lNBC&ROXb1!l z_}72CcEj}u?M$yCw6o=UgmyMvkKxUsf?d%Ly{^abUY6?teH|VF9LtAu7sT)l_*vU< zJ%(R~Z5e)o`17_8PZ6&vG#rrO|Db^kw_hPn2V_JMgzUmluNFAa0gT8FK$QB3B52Jc zvcp(1DocMfj}gU@))ciFF@Zj}!}lvZ57Qg?urWSR8Sw#I=7{b~tCdh3*kVO9?!pU^dKWU+Vk?5a72q^du}x3;?K_iAh$Aa8PbKC7=SDWtwakBGks3Y0$gX7X$lk;+(A^iNe&i^G za9tfGS)aWDd7jmwoyZUJ>;la zW|FXN)Dp#7K8H^dg_$=l%8gpjMY&O18AOM??#igGWWcEP#CQEm+?7#V!KqPO(F_4W z%RUJ1%BZb`cZk7)XHKt;It1l4^7${yjXGwqMka1X#j(OTKZnd|9uqL?PgK$x4Ei4z zGlZYK6J)<=uA#rp()17$>boT>uN5kzI4Q&{`4a|)gOy-Wx?PKof z+Gdh$s~L@X5*}Xlw+dd8PVsHLkD?*rrT!=z_?8K0QPw=|Q)9FK2@OkuB6`RxsJJmfy{ekKq&egeW& zJAva@7$fWPVm`)ufbn=wYK+s_MaBj?{s2M(pkXUL8fYoJT_D}#AIkGLd0vCwj{gbN zJ+evOds(Kpr2^c9f(WGnPG=*L_CBF1N>3=u(zXK>&?+Z*P}_u=;M{~5q@L&bgcFwQ zTHg86#3#gpjtQ}5Gfc*BbR~J^JfH~&3G%yC2&L2V8u1(CiNj&@Ck_XMiTwxx)fhjd znu$)5IB_B%P8=;r#!}Cr+;1xpsg?%NTTC3zp>k(wF%y>o!-;ZklmTiR`jCn1SqG;T zB0Hz^35=mz6TfH4?^A6tgpHV(z#EY!!VSyYGSEF3$}sH^ct7?u4}BY3!g%u`g~^D5(kXXq~D~)O}a(aPD&)K#MJueZE;pX zVd-R1nNNO!us*qlDxImU4wy4J2jW|M#&eiFxd8&ZmwUYfBKL?5WR;WqqWt9dr2L=k zMU6C1ALUI&p^=#U1$+?YU0jIDRRNq9W3oqTpZtZu_yQU+c^zPs4m&0{r`j`a>Z^21 zQ+iWY1>L>j&rSXU7wc&S8gz$1jQ$80M`JL7{%7(|0|(AbgdMj-HLBlflwfCevq} z_%pDl&t*&YVFT4N>9c;Y+hBSRU|S)RPzAR3+LVcsnlcU{9FmeHa1$q)#GB%*jwEMV z-bYfyJ0%9VLMny*do*shT%B0BuyQ{TvQVF z6)OR(u+w1e>C9f%5*M-+u){FV65h&$J&iufw7Bqh0?>}b-$lu3kBpMxUGWkgBq+i5 z#-76jt%9L)cvrqS!uf&WIoxDj(C{aDS+*MfwpfS<<^pl}FaQr9X7l^PKW45`RxTQT zPhT-@;p}9?J^$|ac?M#|U%+VJq@K**f248LI}$%!@L4`H?C zszQgZM&#ngyyM85fYkxRj2Uy25kV|OPd(x-gbyI-zb#YhD32KPc7})%6i38h;2SYG zwGnn=gCv;_ciFvolM7WCo+P2}M~DN|hnD{zaZ^Z-xF!Jk=|;rG)BwF!orRz-&OlgE zXBJ&6as#q-=0~_g1MGy?>ujLdZ`X5nCS2#6fa`qoC3kdt7%6+1?Tx$1#7R~6D`bI#Bhj4WJBMz78XHcSYQT%7H4$!wSKC^9SIL~_j_ zGQg(M>3qTp4<)jYbRvD@7iP{MSjiEFqccS)sK2jAG>KrA0cGNwACufR8T_IFCeVbBC_q;dB{et=I zCq_UK+~}7}WH$SAcP-{~S4BQ|)zmGOT@e(?{W=Q7ik*iEU{8cr>uymBj~-AqH}6h# zw*kwJLyg^i5v-%g+_G%t9zy6tUUpy{^w2$-r4_VPsc*JfpZ(N0oRlyOI^$lCuwPd_ z?@;Eas55TtNw9RrebP)4GwDu3rm(GEu_+Fu!sa&){}Dy(r+axYVdHs+lUkkvMz8AO zchH{V&PO~_l|wgAEnO@5!V&%>G{u8%J}55~!(rP*i=<#fDWZnC=fSLp0AEiJ1R#m6 zt-v>q_HRL=!t@3Utnv6$&qD$g2<%fpXMJ#sCQCH|uXV9jX+ z`-a?}ucg2jEbv8o@`a{(_Il<+(vtBQGaj?4t2iJu{giv4JCrnCLAa}{)4xTX;irYB zpM$+Jh|Xvx$yhZS4sEXRGqAy40;BUX12^YzmqK(kXgx+N=1?&D6<`qkiVXwigJ7b& zn61OOc6!D!!qxrCePl{I0*#?CE5)rPkgn_MRSji*0oYcyjH&rJ)`J7 z2>bmypXl@CQ1n68b?_yf5A-DZCZL7;_d5jm6hvo4<+uaK8bVFahvqmvv#yoSVRbaq z^E03s@X2R%vdehJ`y%5RJ;?VNoCciH zjH9SPu$?ocbD!Y^O*1~xwKAKXpjmp$>E`ah8T_he#ugZ|8CxK}8OxAs8VuQtZ*+C$ zU^*f*4j^0rX3s&T=_SvQS&td?aAsUg*Xf?A5fE*f?Py;)Ql7`l%q)+RGs}A$_RRVu zawfkyn_1JQ{NdPjpfa*4RAna2PT7`~@Z){xmkLF~+0wE6Mj9VjU@r4LlElq`Glzqw znJ&;Y(**&}#H2-;7|=8`2Hb8=nr1FV_!2Z>9>bz(rW|K5b33cso<2>ObSM*(>bPPr zO)*@_i1FQk8k3JS#c0YIs^%Yv!tnC77CFq^C5cIwvS4?`-ncNC=k0M!z5iaQJ z?CK=zf{?|@d{dIM{x*~BWMPtPwsrRC>(nHU8$r>+I~Fjb^ttI|vzP+mES9 z)vb*NPO~xnI=i{9E@(xZej-k@ZD*Fw?rA33aGDKeT+oU$u5*I8@4_W(3hY1TG>~_3 zs^z`6ymL=YXAW6sKV-jI6_uJJU#!gGcgAzZrlv3*2`%vMkAN1X z*`PV6zLD%wDH$`_g$<%`Vk@JDo(*r~iJ@`DA!O{F63LjEs`#lZ1MLGwv@4W`5cQnq zW$>uaxu=THuJifFYm8u!;Ym*ij6dFyj21noKE~zp_J;tiZvqW8^0_Ss7v#cH zcg2tYdsPtf5F(H7YjmwrQSNT2l!M4as&jgp$p0blNG9?<@0xEp1o@sO@)=F!SDDEF zid?;cyyw4G1$AT#!nca%%0y|1r#5E~HDiy>jI`0!xwqiQ&V7u|Ztfl81p7MonXXkn z!l^N|F3Q{ZoNHbdU7c6Ya5CrR0jPO-2nwCWyy6rEI+C{dT}`@^`58*<>in{RJ-;Ae z&xglS(S!CrzX*N|@rSK2S4}2XU?Kp{uT6mdxzGaUGmJDanBNi@%x_5yfb#s#MA^V# zet+|R$N2}C#hUsugdz9bq$?QA>-D6-07U08}1-*53VKObjMOuOdwyO#jd}1bvgS#L+jf1>woiu{1B(R*s80*H#xxm4NP1siT^u~ zH=V8(QZ_ii75;^L1uHaaLE=2AIB%oEvmPoj7Amn2_Hj{Wgkw~ROH_%4zxX<=MU~7X zQHe#hs1kB}Qri8xXjY3_a^u7ze37!KqnI91^tBq+*c&EA0BBU4CS*hIkh3ml<_0SHoIZ#IAN2v+mxcRIh>Vagg|;9}!Y?b(yR% zU#7$t(SVvR%3>&kB#Fcq=k-b4f2*MPla$4PxvV%BW){DS&_qdl>DA&6WXNK+w#Ci- zw>_JeUM=paYc&QNRzdaR?>RyjV{s_L$BN&jSBqx~#7TrWDP0LJUT%YEN|3<5LpTm# zn?+rqL5mX@EDbU=a&dxyKS}U@r_R|la&ZDgvp4~U7!b6Yognzd38G$$Z$KhOq^yN{ z)o<}VsL5h$_`S9>Od>L-+m=X)HBn)^jk-HcKpCz(zyo65f5^-{^_O;v?gDu$xw3g^Z z3y3c{#|i{-?m)MVTq2<+7>x~-(HMBSR7J=Gc~{|lq0tL0Z7)?WI8O6u{L92=lwts z4P~hlOk3*23<8R3uik((mP#vMI+LX&j`P9T@BR*#aibd1&v9`wY^iMOTB`G>T$Nz5 zM~F98d@&s55C$KehAOagOMl{r6H5~VO5mB!kp@feu}-YvT9~HO^cA4G42uJ=x>A2@ zQ3a-XJR4PM1o-aDchWRpVMAS3#@A4ny=5lJe8e*Ndbz@X=A|9TCLfm>mj){4=9y)4 zm^}kG1uXjvyju1dgt2UquGKF2i}gc9w=5QnSQcwLn0(m}jQQa|I+%RfXTsJFC;+K1 z`_=5xW4Whw**(t=Xv0__Qi1|qUPzwehc3^6I+n|^w3c?xg|rGsc2&X#2Rot)N0pXQ z=5j8SE{8JJE=kjlleRHxG)~qxwihh#BtY8`T$|M63yz?G*7A2yUJkObCIHQ{vP8JN zFU$6Q*|csV5}|~(^AJ#!3CKR9D{XN3d;*!zE?4l`LbO-e&@L%xoA($_fVh|MK{%zW zE54z)uTtF0dD4VwmzUo$lf*7B{}bZI6)nhW%6IucOjnJ{Q&@S5*RNTTn>eiC1qLfJ z*}Q;sRyjH#OI?J9e!ks`E&`wt0W^BKZ?~e4uGMj%-K1WcS}}|zhxrhiD)6|nutHWA zESa0jQY&P3YsE6C=n9Oz>-0|RJFSRi;yOwE-}z4B4u1rWuRve0;-s#wLJ?Os)wS2do%=C%LnH8Pl_s)sFjF83q{JWv zL(!-WoEJzv8IyVzBVsLDC+nF<>8xDBpK|fMDILRTb8e2t5IsRJV`%X)c)4;j0#tN0 zc7Z72*T~D2pZj>Z^0ApD+Pf+zGc~3CmC1cshqrYFk@%#8U%Re?(OBI=ewD*pIr4o~ zCH4w+S(d98t19VQ-F?jK%h4QD5=sOXjy+YlqO+@ zuQ)#@sQZ*A#Ypdnnq^Pjs)5Kd2}9JZmcy_r5;2kf4#TQQvTW64ux!<2dkeEU467nx zc2{vZ77(<0Vd$b(MT&G+Er4|}BK;kPRci(8x6ry(UlPsmM&Rj7jtCI{p)GP=FuLMZ zSBcG4S2n8;UiA+_p#IeX_%YNFrw4m-Bjd2bl2!bHFQvU;tVB>J*?CoRzD_>SKkA(R^NMx=vF_5=vF_5#Q_BE zjRp|i>c=9wHJKnfBa+JF8)~ePt-@<+68M^u0KTTApP%Z=K}mj!1z*`xW6pT{dxC2^ zpxQNkQSF*8sJ1+)TQd|Pirif@n$lSFF{H8PV}xlG1^!+pjWts#jWtvKrNPa)Yi1e> zvxa@vn)#-}8076>)DGWj;hJN*R{swy306k@)qh_p1ZUR#PP~OPbS5z^@$dQ;=$-`S zSep%@BElb_CpUFtZFZk-tgU9IXqtv!b*-Kdzp=-}dm7%_K`3lL4G-yxP^xT6+XP%Azr?g}>bJ zbp@>W4-d$j3<}pZLV#`BaTXYHt_S}h$aUS!C{F$06+46*8&f*aqIGllX3VtW4Q-;a zG3#SY&WgoccU;NYL08vj;H<2(BRwb%q1G3YS=yXv2Zz|EKf?s(XTPzHtS@PpQJMa?g~$NOFw>jC zBCBx;UER=Gf2{vft1O5QF?2)D7?6L_C`7n}2!ZnY|%GFUn%W2!zqFN_m4J z9Y-0wxdq?^797ih-d)A40*knB21#SwFqiMZ@y#IH?p(OW6&0ACsKNlg5$?>!ctwM8 z0rgU9<5kFYBZjCAZ$)f}|BF_+@ek1XT_$s_AgVAkN4`(wVv8cw26FjeMiL$UKFMy3a;lWP%MVOf58h zJs;`g7Qa}&R+hfsC@%Dggrj-EoTHCWGeZ^|l34L7) z81%KtFIcT(f(F5^KEAfeFX}GEg+9^P=nARm`wH2i(O&w#0)6Lm{`V?2 zzMqXf#kq#qQ`Yyhv8VX`Y!gJ?L(dnBb%t%NxJPGGCWNdob;Tf*IL=LP%FZANQ%H=&Mc;T^C^_y zd{`os2y-HFa}pzOgNkpmb6fc4hXS8izHBP7DWGSU#kkKSfY#^HDE2vKRZO%#pQo!^ za9$>A--1DlRr?lxM!Y4ff9+e!GqS3;_AOYi1@Zqw?OR&Oxh`L#hA#_2KqV{zeOUxC z*pLDB6>Ye|S9C_JpbKB}>*p_vpgu;m8kC3P`Lc*`=F5`4XpxU~D8-j$n1Jyrx$`ow zAG-1-LpMxOA0pq3PW;Or)e+glRgw-Vu%vE&ImyReR{$g6>9p#SM{#jX@+HQL7WJ-t zj5rT=^~gd;Re@70u49}-yi5G!+yMT)wA&{t?kNfdv5mc>sRr9}0rIxY{({(6mXVdc zg4k9UcwNCtLi)4GrpvJXCU|YS4D7p8`5jdK?Kc5<`%QxmqX$o$)83V%0FZ4RpKe!< zp%*>U?bzIpt~@OuaaVSTZ6t&qX>%A~rtAP_JHF#quk8ofe*`N}|O+JA}zC9T|_x2s=&y2@G z82#-Bp}O05ktJ>Z%q@hqxt@zge>;}!w(k;Mms2C~&MYwc+jl|Y@_IcN95=J{_c_zy z*VM&O_o$jeEMXpGu)#bCm=3%usWQ9;q=}mN)n} zjbCc(IGn~k0h}553OanaQ9d-~omJ43HCH(qXLzSj*vNO*la%soe)8T@-r-fCZ34#5 z%nURSJKIq+upQ6)A$r$Yd?xC+*yhHc-nuR&Vmug$UEyHQ4Vq4`MQ~L zHS3MMq;P<{vn7(337qCevUiCL)$cZj&=t~>up8eXfVhh3q^y+`ep4sJ?S_#+&dT0* zG$6dgt1*b({SNARhl|0xFOXOn=*MvwzWV}jtJ&}m;-PCD#Fg1C!|)DkvnlD(3#HwS z?YbR0W+FwqXRr-R-Y@*|jJzn_(r)ad=rB05tzq2!K!umNY3rt{f#%r55mC9 z1`IU%4sQ7-WcM*Ehnd0+vtzg?Q?6(uBUP zI(}~R9*-7rk;JceDJ2m7B=R1oy&`lB`@gRSK%*kQ2MXTZ)7ycY32itKl@h~(S9Hr37tVsrp)#~|Rqo5V6u*aAizXbqMg=m?e`=m_!-pjjfH zr1BM0IqCBd^dIO7`iGbw=pB438E>xwb|bDcVuko%M+I&SfE?`V12T05BVawPN_=jB zVob8gyo@i_ntI`f3XPyS2UjC}3e9=NUkzzD4}OM%%sm6P$!;R^(RkKpBtr^A<-?XvB>AcDsN#gX~~ z{)oc@f20<{AIa#dP2`VoG2uu_TRG8+BjDAM-VotyV9zh-xJP8$p84eFy(3%GIeo?c8Ms;6|1)qa()JnnkpoBl`#=0Xu z8dtcl_~?G-ltJIoi!3ScO`&lQ@Ny9}!-&Me`E zgvs9JP0eUskG_B=hXoMVV;KckV0kRNtDZH>daRXCu)+A0Nd$VV6~UX&#;D|2VxH(fgC=3b(;eQXrf`BEP=zOb>Q-^1k3OH2C9%5rFcU8366vYdLzyanylCX_|%%U081e zN&(txE}XvTIT~L;(`(8k^Zm+F#l1_w;By?V65_cbVJ?;+ddK|xviNm)sT~idP@Hu+4ILv|J9gPipm1KH^9 zIuKzl!Jf{+G27|FQRe~_2OOr;UCQCnJPD5mptJ;ttO7u%v1zGW37Qm770foBejk&` z*mdVzQVB0pfz9b9z~=N8U~`%qyiR{c2rF1fusOYpKrkz007-?-_h<+r|I?A)YPD*rN80 z0p=#9v#)`yvu}tKMjIa{Be=6|uOYUDuJsJ?-?W4pRd^dCOw${C&ijKtNMsN0r7^al zofRW-mZu?}ec5SF*g}5xBI7UmIB{1X-eBwvTRqlR_xM1j$4gs_FDJkG=|y~=v{G<2 z7M3?w{Fx(V>Cw`o+p8J5BchJ(j_!(vtVl8cp zpT#)#4)I?i>@qfcxz{+#a<37_$3J0yIR}B1pUV!t zJO{n(J;L_2F7<(*RGuq_%;$GmPM6-?HhJd#90L785)$Y6%{+EV*KLFxfKbG|&`GZ;G~pA3t=Td)&ir6!SD!cK59VJm=jx6Wj9rEFUa zG-z8BXj@US_CYS9@mUFw>qvXGSpw&)jcl~rk^k}4W~k?UHa~JV5bg7_o9KK=pnbkz zDzvA)?R?>ttE(J`S3>^=`+aNP41sPZbme>_gi*SBGc%Ne+kWs*MU>l&lAXopmmoI6 z*iDBtOaLjyUN~{;Vg2I$ZdlrE=+ybMgu&&e^FN^jIe&{dV=X^;7&?%g=pW8M*VV+f zRJsc}5Q;0BaT|u{!-Yyf{{m(&f`_r^^yDu zpS&eDXXkLiiLd}_+#FrxW%j8T&WoFV;ajrt0ypDc_|yjd8`$sDo_xx*M(88poL)FI zmg^*r0PMEe#3k`_#vXtXMx(!QUBK` zdI%kb4yG1Ydlk~~J@!~i_)F?6EF~j&kfk~@jef~5EV=iU6iPQ(W*0+1=^vIt$$huU9_*{DJ79JIl?PvRt z>QWQL&Ne4(E{%ryxHJ@@lbDZm*v3m2E@Aq+Zy_krrJ-QmrJRIHf!c^Hf8>wL*@A%tisRld52Wq>n;HN=Wn7iYlBe$ za~trh<$R_R*{-%Ha@+&15)Nn2U( zwE_rbUt;#Iy#d}_D^FyNdH(c`-?c8pT`C3=haL#W0u8lxd8`$8lO=5$;7LEpg zEgX?6pmY37+lr0e{F)1ymb1ZM!wBr!ftNP;YmdDOYH#pK<&>8+ouqO=H3=#(@SM@i zz2)rEzKqgUlOElHc7ROQmGqF5@=5vXEvIow&)6zu;4l9V`((d zmZZ0IZ7{#8OX?QIQ34&Ebd@V9!ok9rg&Fj5Bgiu88|culWN^~=WN^|EFgWQ5B9jEn z%Nd+>9GR}scS(AotI2^cWpHwRFN1`^D3RO^;X`!VExbwevy)dNEKvOY?-Gnl>!>D2 zLA#PM^Yky;MH`a58v2{O07NG*(6u2I#i>f(L!C?J(oXU=KX1s%uR96(7?oX4C}($u z@wgXL&k=Tz1~kpq4|p?>zz4c|Jrf$n4LJBKrL|qJhEmrH*$|er$e-!wTyKXaetjTN zy*?0~$aUDjA$K93>(Kujd#T0OG1|Mn94u?;t;YbnonTioe+HVBl|DlpxsDC^`VRzs zROr5bj&xr?2D+~w^P^iX3k8#|V^L&Cc4*Xfe84}nv7Z`wD-Onr3$E-0e$ZC+#wbTa z2=4}Z*c-V-cxl_D15E}Qw858{vmk>Z<^bNy7O?SSnmoj#O33U+MKI!qA*ve%;8(Ed z&>I~M(JQAifr2Iw~FzW`^(ky00BvK_KF&0a&yP>W@z!I${0!i|S)ST|BsJ}|_{ z@NW$Z`ERQ9LvH#MPFhW%+lArJt#t^oxVrNqfH=RlhCjD{Fr&190A#p?#PC7pZ1XKn zql6Fk3Qs|f+r<=|yf%Px1Xpf1<=fl79Okmr?H+`xaTodR0kVr6QoKDv*Fu&Gvu{s> z9^Ia1j@ZFL-zeQ3p%Cx@gvIoaZ*N7|X&}v1ze$kh-P7@hylcaCsk{cA!q6?Uj(yUA6?ImT z$z`J^u5kR8Tj9X&x879ot3-`v?6(mxW511oG5Bq)4tUJy*42AEWcmMYK3yA8Gn4S+ zZV*Vk8{|yH;wyZC@V6nPyXY-LmSPmAz=qgVosGM*JBAh9?E|B8cQ_jM-TnfM!nr#E zRm93x(tDV~K^3Iq-U8HcZ-Gs%$g6wb>gxU6lJ~Fs-n@UkK;FOX=RTsY`$d!RfQJ_{ z0|oC_LWnYid!JuT-ha(2-1|-W-qa`D`{FL$Z_Vh|sf2s~UBo z4`F7|d>>2&b?iZS@+h&2LHN-)1oi$>=3VN;Y6IUl*s$73zTDr!=q)y^2>Dwd?wTFwcwa zgVlUr?ZfuLm&EqLdPc9eVJorxeC)xF|BQzZjxzI6W){_Za794GGdA7^BH}P~8N{Qj z!@T(ioHqv{51#Al!xL6hdl-+mc#{7x9^^m#$xHrL}mm--+{zHrWe?b1D1Ok0@ z1x7p0V8r7PAo4iG%ZSGx^ZjEVBOc2n=Hsc1o|=jgk7qD;hK-8!r6Vklu(&nmZC3TH461ro#&5`HT!r|o zE%L0frn3I^D#T}_$v)e)xlqezPV}_Tuw`k?8u0DeLh!9E4fV4x5ca^=Fj8pD%K=|gl=dZ5}AjIG9AlxqEMN=)g;`b@!5WpJFAH6UBRt2j^m%g!8S=amfq=f}bsNz&e%^_D&YpJ*08Y=lGYxWlJ^(-Jrfsi* z?kL!a=Ti{CSFJrX)VbTT6VGGJsEjI&$YQFm%xOR*&v*09cGDQ5#6`w;!ZoRR+pY(wMlp4MA!zV))+KIEItu9&{^iwUe>1HWHPMl*RaP1h!Df=a!B*PxVe z;H!NN>lE6AnN{#3UmHBi!Ch3|xPb?lGGP~lp(!mP1x?{Wx|-6eIv-xM;%Y?<)`!E! zYYLz{aIiCgI>Jq$j(ON!m22Ben2sbJq6W?i$u-=aC`mqVFiWu-}0X2N_AR^!`v?f<^T7NB|7jO;e zWm$hMV1z&$$k>6lww{}fC^jww<3Aw`cOoA10XGE0&VY^hG4U3De5Y$44G4%xBC=0_ zY``tBDd0Aeg-rn|$#{K^*X7~6Zt9wfJ$Vxj!>(n>m_b@R25hLu@1&lZ07qKveFEE0 z=g2|qjUf=VE~-;Ipe7Z27*G=%hNku+DQah+takQm7_QcEC4shz0nvnsXav5d!HPWR zC@FO^)WSGPUQ=BJ;vzo?Q6AiyP!LEgP(z25W3;A zzbtHK8_Z^=1-i^Ac+vsLu@0@le#!x&PO^c-c&mWR1Fo~H)dH`wFnl*H@CKwB$X&Kt z;B$HY3i1Mf^=i9!mo2)ijD>J6rk1fJK8VvYRtB7ml{rS!GB#0+F`Btk2@wR95qoCv z2wMe8Pei>?oZR>XhT#J`ZQ{99axynQX&EO1R>pcLa@R2gc_;E$*f12yl$R;>t&~jo z1e)8Hh{lHu@Wt?i>SU~3TER3$#)(5fG7BdGnMqyz`v=LfPc$o|2tFf*5?aOu{@6lj z8Mgu3+v#CT^pXuE{9!w!{!Dqz`iH)({!G23{!E+{*D}>Y{h4Z|sXtT4f2lvyRD(kQ z`h6^sUp!Ak%M|CRgy(sTk2D+ri9kiL|1z>YpolX)4Rm{;ds&|AT2@upvWf1+Te_DO z!)l2#bT2FXy;QoFb<#_9FY8PeCQ4c7IUud9bVszTU&wPQc#w5zTIDlLK-MJ5be5UU zdKo4CBGfADU0s{p84}C-1V4C6p2sW({i@a|$H7vh9%+1fi;s9WSv!&YSL1%$Ho)wLaEPkqXbgtsXzb^QI(wi3un3@VkjQS?ETZMWKok#e?~!A&6d%jjv384S ze6p$KSe%5Ebs+9M`nMc=BLBjST84;yXc#%J`>%Z^DJ^~bBR6o};Gm5*)v|QMs zU|T7mBzO!FwK>s$CGt+uPm-8@fsmya|dDzeA z=}hpfEl-SKou|LN(8cV)8JEhs?Z1^4~8BdjM~t} z_Vw>#n;`q@R(u!@CeIG3U?X8|^m8(#^SXv;up&$cT)UGYofj*-3ysN>;K1YV5I)2@ z52gQ+C&8FB)be6$9v-AjXv#Z`Rp$MWu^-ylna%*cDgB_l5dfce8NlaVCg6t=eBKC7 z#c25|5?H>*@~jGw`KqQhrpTV}Jp|0A-NC;BU{@_cCEu)MyiekL>e?Gg-TAhm?tI5k zcfMm%cPQ)5w@q<0#a&N@jV*{;e(p5V@>fRn`75WMN#_0pw3Gbx-0}E@`to;XebhNH z(AZzt0kLDDhL~S4K8DruFGAE-DArq4Z!DZ?`Oz&;>j{$cAC}s#$`kv)wfx7^B{~0N zT`Mrvf#n0O09>kwb?C$j^kty)f@TAS1zbi=>sf|Bpr8f%-ZG+`IpHN2=*vn9jE0gi zn=>c9XipWxPGd(6{P3unU`T;TT`Rbf<1DS7`wThe`KQ1T(}r<@b_<^e}yZh?np`? zvi7Dx`;Ik2f|LnKNwp6~dZWU)$k4uV1DzCmqr#)5H!2(xo(H81e}k~m)Ddho!my+; znc1_@^QYS|w2&PvUhxy)E0ak>Q@uKPb9^Iq9Sq-HUKY(VW=$?&kJP zt!TWAHH-d8i4{Epi4{GPy1Dvo&uk1H7rig*Pl@=I0+P>&;V6a=?6hJzU%LK;Qb;dP zbu3mFp##vk!KPzqVzKTJbg@nV_m8X`0eG?D1Wv??MG|(T%`$?CKF^Ll0No*vL!g7m zVyB_(?P;D&=syb>dX2@-`sukfASw12E29PSsyB<{ON=(URy-%PvUvGqJo4&V)MZGc zIJe-X^X-6Eoca6G8z|n{fkt1vJ48@?FhnqgA}9{iTHFQNWi3Uz(c-eVP%F+4Z?)o4 zz_ECgjZ~{+EB*z{Me(mt|724CvM!BvpbIXcp^jg~q7iI~K!7a~=v?K*Zf+by`+#JX zd{kQ3f(n+xBPWzNC@1u~U@B8MUA} zQo|OoBM5y$)MRs(u_ikZlP~ZWjaf!+iHxcldBrfy#2F)lpeLztej*V6B+h@n4Cg1r z`3Z3b1P?a6;|JiC3SzL}8G9ZPLEI&uKklWkE{Pi0c=dEAkXsis7wACiZ^-Gnlh3PDJ6UlR!} zw?UPq8`*G4wQxgwS$Z%#ztSUoxdPp@U^PoeAWlOLfZp#4G4I-u%hst`(SjaM9$Bc^3%WTFt zuyv|})nOdTtd+qj@^~cTf$m~P#@p5p;ba*sJ!xe^d`B{CWoTx~MExg6G6Sq{a_b< zRl#V{pp?`y3ReIby!oBLekUFRysTK#GLIPh$liiEwQNWNW10S(U4+t<&1G~8WlI5# zvIU7o>a%PE-Ls)ZWuc8_(OZ>`2Nd(hX=qW|7G@NI8*|QD+18B1;=EQi7-5j9H1!-% znzEA(r71g-)Rr9rEXxi_-OZ+>H1&kmvWu915pA~={~A&*yG7Sxdb>K%n0p#3ZVfXF zbAWI;OgWePQrF6lBEp9)wJ*2Fj1sjk#{r&kuT0S!il;?1)d_ZbCP4B;aZcjvj5&&Atmjx{{@mRhNOVqJ71j-JI z<@@GHE8m)VWU*Z&U;cfm3+sMbdHZ5}>d^}tN}zi#SX2pisS*aFRg%etBNmG)!3If` z47V#aLSndik)~Fu58ozvJp(#im9VL%v2oocnmLA znkv7;7dA?MU#C?bhBoY}BKlN$95PlO$4Zj%V>&YKf&vk`Y;*1?BQBWm$_Gm0aTRT( z@?m6Z##NEZf5XsJ{+k66KYJI_>DuKE-rywb*QWZ#40k*Su$zELF2#Hp^ zN+Y8IR#_`DtkMz~RcXnYFsKAN)hgo<`uiMi49cqXCuk5{WgIZ5(*K4T^=V1`_{8gO zOSVtxtC;RKjAoUYK;so~63#(XO|KN`GP8YSj^!lYjNStzGi1p4Na=Hgym>Mt9^m6L*e~E zSj9$9S?#)LO0`q`eL~RPC(o~m-q$u-z2AJ9=cZ}Z&Vc%A7j$i2h@k_1%h15S+8r{x z+Cz)k$X*>bX;VMv494pu0AlC4_%wjuD&`boi`D!$cRyW0~6mbnaHfZLJO%t;MdN2tM>-x_=Thk4vd45rpNr)vxP)2OD} zL`<+~!ZjW!_IqM9*EL@ey<2;T)e{Avs$_x>L(`F4P8b3+{>j-&G##=&W=AaJNwC?B0j zM6J5=EDKUVor%x~ROOE=IYfA&R=Zo}#WqzSVOTp3<&c(e^x;c-c ze%@12w_H)wFHR`xmwOa-8|vB)nA?{s>W+#CF^c+iOGW)AMNxNtqNuwOxBHQzVz{k- zH$YMMj6shzQ&GRqfpAw*5A0IZA2KQGA;3HmuBgYO6!pYeMLqSAqQ+HI)YA(U^~^d& zJzE%IEW+OkKM_`c3P9Mcs27hY>SYH4>bSB-QGfnaQLk=O)I`v7?JGsS(NIxu4My0g zsJFq3+mVX;OE-i|iu&tfMZHrT;de#-ZKR_9UKIg!-Cd@re~wnv`xzBAWu&47j8(J@ ze=AznL`BP9P|Xw_RPT8+92q^fAI#VOkBO%<)~Ohv1Yd<`xsTEjhx z*6xm?bphP2@rw2y-h02UXz!!`;AV;zg8XBODcXeQiZ*eRqD`)#Xj1|aCMsH3UIe$I zMQ%{E=|3x4Oj(3;iZ<(!qRs7~X!B5JK@CM)%(b~W@Oz8vTI~pgxw=-rtiy#54W;EG z)sexynyH@};dPi#dK|T3?d3OK(Y3l4BPVpf_I5@)8h_%z|53FOp)<42H|E42Tauai z0HQ~7y6Uwjx>hF}Cez^U#GW>+Y#o`4u9E|;rcRD&uLK8d8n!7!!OFZj(2701DVpA7 z9oUgNZ=!4$lr^pg*6MUgL}X)KTUN>SHVkM5yuCMdX*wUvp4&8?W}wahF=TZnpo!H% zx3H}L)K5|FKHfg283$+{kdv^9XXR;iK0%0c;BXzSP9!Ta3V+T@m-2n;x&S4Bg}))Z z-Gt|@n{!6Shq|XXy{a^7oC`Vb)9BQ>O;T?=Bk2Ogo^~%+2=5``*(X;XOIC0$qoXXI z9dRa*_IhsDJIMTcRc7XUL)W_m`FeAJe7(61B#g=H!Caqz9ZrSC$plkGV-!bb{QT4r zdzOi6pnDlaUl*pX?id6YMi9<$t4FRI#wg~)A7;1X;r7O!25oVWE~=>;flnIn^u`9d zmjhb890+jO>y>dR0YnU?p(6FlFbFJBk<<7Y=w8VJ6%pQmUY15wUiR7bc+Q`3w3b${ znVG_(tjbWWdMz1E7q4CqgkVJrJ1R5q%;M;RsJ@bDtjPFMN-%{V$V$HZ)}OLkowUk?K)sb@w)va`me-p@KKU`ly-cy6PGyz%Kc31P>pS5HV0m8AieueLp|Ol^ zobs;li!!aA8_{9MsIb&(k9<%ChBj#CbWubN20%m&2G~yYFx?hu4E&hYTQtxe3mO`LXAM>%93u^A z?xdlC$40{@CK@DI4Vb8Jq0w%z1p?Amzk%>V(blv=wg4RX1h{WjL#Txi9pu6;1;~(x zWl>UJFttCzPy{z>g{0n`$lu;d+?arHG@`A0)1^fHWW;N0I8CeIJS6~V{5AqCN8@jT zTxfVU@Y|R=6JZ|0R|fdT>-pOUeyat(@irg$wHUJy{B{EP9RdAA(*=qPT`<98VGSDi zwR@L)FETVafN)ZA#)%4I7PksX)0uL{4EF#Hq&2yWz~3_G)&#RnvlQoaQ9`QSb__C4YLgm6{Y znnx+F_dqQeN=HX?A9Nq4rD!%CVTr?ef?{I3hmejlex(^s02YMQ>>C9B79lm;L(_1= zE2HlbFQ%c{9)}y>XKT&&=-Rr1P|s#79q!e{8nQYvvB zH)RR@r6a56*(j^#c^J}{Rr5TAi{1*dYM#fGRr4TV#Zv2*S+Z(g%6W>iYF-<%YF?Wx zAVJ_uI-@Iu#Gei-EHDYCLG!YQP-d>x@7LLYDrOlpY+-m;Ik5;ufnScI1E`*RV&5CxpDu49WcFAk| zTLS;}nG{E$`wRfK%7_4Oq*V(_+T>Cz+&^yF{#KQkNc`}JXgWS;v0iPy;J!p{ZoLTMGkrFmwzD&430~f$+)6u5Qt*`oMYy;o8O-EG3 zzjU;@O<`(to01IaYjc~DK5cGO($wZQ)qoXCZ5U!{bDQdhHn(X4ZEn-VtIb%~No#qG zqJi!!prOq>2NVO-^k-qMX`%1VLyUiXvQ9w2c*z4ceSYxR6s@ zxL|G1D=yex$chtGRJWT*ZCl<9p@;(q+rEOp-%z;#{A>(;YwY_d9L==tyNn7i9ZV|~ zj5;VK_JD2sE5<%TPTsa{tZN%5gqMbU()L~ajE3DwVtu0#q7W89QsHH3b=r>c(bzVI zNvNKGh(=FLU2Hpt1C6$G0^QdMV=2NG1Sp8%$G63*9WvXZBIc)ZBL~>Ns2kn((T*$gQCS|Mi>WJVCOAV{uVUptpYeJI6!d)3p?Ha zAW?Jw>b^_We+$*Wb;Q9HPY?hWY3@7jKim(H)GiL;lH$DN*A+ix3OL5lp5qosq1~V6 zZ}A7)J(8{%UnOAG1_`;?OfCy>3g8w6K!31(E{FS9FuXlb+>{LxX_x5ms76oS?vbv= zrqKG|Lw)TlBD6<1U~4b!ZG)lq?=g`a#9un?rG0O@sx#0Hmaa%;bnAa;_!(%Ju! z286e0p!-j<;RwQ2$WpPH#`Z^jy43zxCYpbUHg&1}?`(4Ie}@8So8D5i&0P?dARBb# zAHeNU1ECJig3h40z#gA@eBw@_j&%4G;VTEvV1oc5R7VC6KSSxT+YHwL3u@5eC<1?r zdF%jNpUG)x0p$+0GvwakM~C|fNbB&Uu6?dS?j3fU<`LuW=Y)F`$4+NOz~Ru|&c4Gf zADtcHz;}cpm%ntx-LVwK-4R50gk{0bL%%$9|2tOjna7S5O!L_BHDJY3pBv}%uzVfo zKNNSzc92!acD7^a(lL)l(LnbL(9jVBy^bFtEV9X};FDFyNXn{Xr0c^# zkArY-=~^cs&{;)R=S@7o=uSD!2x)Jf$|Bb9i!ZHHBShhxU$kei-dgnP)RF5jo!++A zVMth~+47tM@;Xhikr&!fYl?e4HXLk>~8@xqtv%zp~hIB^(=&ylIAv28ogKv@D4Z-Y%y|;(j z-4Ib9W`>APyBpFJiltO#qHCBL(oEvdVGr>~!wm5!)lki#uZP&3megcxf;tQdK)?(( zr;AXd6sU}Yf)n}HedKpM%tf`IA|TO~-J z@-`$r8_j7$4nhpJm&Ya(dW%TXiA1* z#QZaKlxS;SL!Xsw)fkHSO0+#*OP`3C2}>DzOt8J~B?w+*`9nJ)wkPinL*K^XU~A7h z#4f|(SJua2Hbb}IFot)Hp;twdttC|yzU{Ck2&JeT-@_aFkKPu;e4JNs(W5PfnQ87H z*78xb$S|`skv{$-O`?uEjP^B$z5NguU|4@?GAHoLFE;FBO*d#8O8jY96Z)7XP2ofs z5n-CX&`Na4E=}c^vguN`yYthfVsb53dm&&tfk$m?je30u4SWcTAC8@*Y1|y};4PWM zGd4eJ_79IBI7Dkts#cZ2Y|q-v6hC|+f=!J0m>vdiP3F*+V&O*dK-(cOhv673hSM>> zt3P}NdbU<1+M63*P92@UR8gEFq&7p7wstk?@D-x%8MM{#6_sqwKs4#_a?$o|HGLvt zB${-%DmsTNfvw3y7J|Xn4n_F54+7@?k>^EeI?b=l+L0QH0wzS-+ojTWd=`!HG3HN{ zlM?g4Q4m2dE2dJ2jRp56vaJIN{u8enh6Rl9!?v%r8HPAs#Ss`eN5FUIe;7&}$b@>7 zV6yom)yO#rixFaJvlved;0hEoGM0jt2%06GBf;~OU=PA^ggQ!qhY6esV4@@I8YU3f z+C~UH5N04`5sADZWKfpvWHhDWPfY_Ib8ZxO#$ zjF?BQeH5+z5}wotKl%xT)_8%WR#tO7p*$~gK3oYS$^`A7GBp!1K$P8582 zKR%%Wp3P6qu2Y42zpJ~CF2PyEJYEo>a6jNlKe zSMZyt7fKTRW+hwK7u5(JfqJ2$!I)#$4WWoHQ7=?9_)A2LLA`?GJ=Q_Nh*;N-4|2h6 zarkeHV_i|3;AIGFU>O+uwQ(#sn|cN516MXVuizq?00s)04uf~nI2OFQDTa~YozhGi zVS-P>hJsH%WB?03$49B)OVTV3;*CBm_`3UnN0RZk)t@en@xrAsURG`Zc!&{~#x&6e zurbflCH-gE>Cy{a?wHpk{&e6N8bQartyu`nmx%YJ&$--DbZM0PyC!sLJdJ+q_6lr0 zEQvu-t;xG(Nsy%TC9opb#XzudZFwyoVOm1vgCEL&i?K5_adpE(>ljP_Tb& zO;f&eZ)|L?-aKQg=pr(rzlXRjW6zS?G8RTL7DL6u+~u)#y1P8K&gr&{y+x%$stp@l zZp+x)+H-c}o`ELEJ>!0U@*z%(me6GDg&K^5wT{E!J8m}Bz`5r$4&MN98Q8c{bWy8- zhk=a?CZ}awFdBhvm@KgJP6&j-Y3T#G;~{fAwEn5LD9wRB-R<;_tv|KXgc%6)M0%$; zq{3Oo2tR=0(KmRYMG{(Sf(?O=`NC!b98d3v0+)BqZ=vu7?F74Mdj~q10I#zA3|eZ! zm(G?#FA5~NSqR%v9+O8)O<1Paa{{(GKgBS}{~pp(6HZb~(X%5H91m})2@bubCODie zHQ_2xQOP!rb+y!lU&Hx#HYU)mrwMmFUTgl4wxSF-juqI(ClHRIaOejEQJ;yAAz+N3 z+(wY*a{Wdv!w0hsvJD~qPI>|1)rR{0km9i?$-^wjf_^6jA?hHVjSvxm`K^_J z3m9@d)jbe7aCJ}mRJ0AMCZLjS8US@q>Ly05*7gr34MkiJa_m2#{N^I0Bj9lfcMq8q zqU(K9K3zls=vl9jE+;NnQR}qye`^Kn%Y>jjex$V!Vq#1AbV;Dg#RL>kOrOOO{Tw zO`Yhpf~j+hF7@)n_~{*k+(>%s`Ic zzk*huULe{&Gzj$I`}Dntqb=R(wRDk2gW14lU?DeS5W-duJDBmJuEQCl=%Q1H53z$8 z!DI(BFzn30*z~aZa>l1*2euDrG??+Jb2o9u7bp{@`u?KJ4rVOSwwGq$&Bbhn-L?M$ zo!>tSYrBavzIjl@%7|adlxEOw;*1Ua*?vrAHavCo;0C^yyU8|()UXo)HzHDA4+LZ&q13hab^pC+)%We67m!ITz2?o8BqCVJAWGC}%+n-bsp zW45nsi^-H`rXs+U_>MD-o+jOJiZ6AB-ysVYG86VPlaBeMFmo3-kUzN-j|=C>Ku%Mq zA&=9xfDD92ftlw-+gE7vndd6m7IJTAmb!O)X2MC@GMLODl=6cK&4S6#n&n{zGyl@- zKkEg$$ZP-5;b7LQWCpWdr|@tynDsgz4)~_>tk<2x!7OqSDAkr%5 zed6);qldJimegbmLmg(#MTkKt@o2+Y9uwQF6uRiFgWiU-(y0w+rK5q^7PQ~i@d!m+ z*Eam{1e;Zda2fBrdQOl?wa{=MJ{&~ZVr=w1n9r6W6bTW$(`zF*vqjrtZS)P0+078z z3lVo34DU&F1uEs?ZRCYEp4|n3j`{FD8w(!ygCx|d5!9-5uV(fO?z@Gv;VW+YH#MR{ z0{bJ(K)B-3h_eIrMx4EnE;<$PkiI;75jEoMa0(A^#M$AzFY_lwW`{fb^6V5eBBk24 z*42o!QzLFsN1RP>HkiGVRKv&gmLK=~2guurQdF(K9vPriKkRpzMo1fpKXxASGO6}uQXW;vhQ;4~W3*GmTMvrpE#cudq#i^f29c7v zbz%4B;Ua<`6fs6Ja1p$L=TK8{5z8JB;ZAC@Er%vUA`zA%RC*X&NR)>rSJFkNCUs*A zDI#MFDS{=j9~KL2$4>&=iKj2f*a{$b-m3^02v_J0^d@DVOv$up3OCxYLS7R8@vH^TXyFKR7n5tFSFiFd~!#39^5;&9ruLiKj9&>{o_B5}A~5PF60(aVge zs}!|Yk8%nX*pHte#3Jkw*iQn&8wm3dc!42bG)abM!!L*b5uxBjT8!R`Od}qnQz~tQ zFFvi>_mH#=G3*XTbQK3jbTtOy5{6*DO%@c<11Dau2h;0k91%S#+3u!qMRW~_=o-=0 z5D+mXVu~RsA{fZJjt{?D2C1>~Z%9A0AInu;Y7~m+0ih z+KB0NrFX;>yze_=al~S=f5hS!A{OyugA>Aop}iv(3q7lO67gAq?cO7ZH%|-VpV(XY z+gA{8zaoft)(eJb-xmyJlLf=7TY}+_j|9VC{}BwgJ`fCdwh4y27X+h_BpAivg3&lc zF#czmVC;b}bM!hZ7<+#w82jK$Ap@rh#!2~taq=a>ICY+2oK`LvX9Xgp3&z=P1>+oi zSq0zUHqNgRj0-Lc#)bI8$(N}J{|GE&rNEXY2yFR>2^<4-c4 z2kC}qK_uMkFTg#$M{qxHA8z8D!F`VsZ2PalmgXsJmszo;Q;RKud@Kly1y=c&z_wPv zDfkxsy)F9sd9*b7Pd)K@jq3u9%8ZZNwh3rgF%*658<-mYn8CK)H|&+LK)HRmD1{0b zXd3P%Xd?p*9ld?GuMig4u&-l5zumQ<*KeaRlWm7@*!8f#a2LVV8^Z3<3E7qv<3cn1 z5De^E?*==4!$ZTR@IvqrKjVTiJe^L64_}VY(2g+f10D%>`G#MB`L>`0>nTBmflj#b zHqkTCI|p^PAAN1dY=6pakw|)r63NZ!gc8ZE@afJ4zafTGf$a@KScFiDP$#f`lm(Qw z$5*z?D-&~}v@j&s%0@amn_}9;v~ebA zSmp!1F)1+xF}tavd}xSSM<-O~7>vUAy>`upF##1l=o|Y^?9kXnl!(@O#@NYpLWyFr zz-y4GVRnanWB*i4%D<5^oJJ_4(u7WEo>rd0=i)S-S7;2Eta^n0`wF;VvK{tSd#JtD zaU|;mVvK4Kolq&%Pw?sS(3frrM|{;%b*+ja)DTJ*V^qJV6Doj8^_Rl+{8Xx&6ro4x zVyb-YZ`gaU^=0^?PKxz(7ccO+K<{#+3z4xM0=j-BAxI=U?o5|>j-N?}Y~KqsW6M4IXrFV*?POp5SmHvP9FaRD|x10fY*ufX; z2N*(kgxLrfY7YF36p!L(q#nQxHl)*`Z!lZ6?SkN& z+C8;9(%PI?Q|Wc6r$hh4Y&Euvf^TwOa-Qia^5q;ffgo%BICM7p<}Vyc&cptQkziB> z`r@ChP=zXiAGXHfK^kai2%uh@oF^947zBd@lgq(>Xo@-Hg$dO5vo8|xBu^Lcj_Euj zrD`(7KtXIT82kkZUnUnU!m|bY=|Vw0w0`Ingqc9GFMriHbx-QSbhAN&q5nNSVSC8$V%_2oQ!n7-5p^mTZQzz$>OL{k+0@x>X&KG z;*mQ~D|*Q-{bH(Os$$nsNn*}upLB?!tsnnpQk4*kiLqb!S&|(4937scLstn=>44ae zV%HhyD@L(+ZX|YsC3b?A6os7%N9TI%G^{MC5| zE(%U^k}R=FQiAO+QsZioCAP>d(J2bQv?j=y_F@;tt`fYwV}2K9Z%54UmF&oT@7Tto z+_*Xx3$Y{N-m%Y#@*_2|*iks5ddKz=dgJ&;>@bglRu%js zG>)lqK7%2ezU#<MS)RUVJ_l~32);FGVp)GaNQOYpyggtDv3`} z=`f8Smf+BBmQT4nKQHfu;iBBykubcH9b?`J2L$<<>ICfN9BbyCa7~b(tx15r9DCY3 zv4tS})+V;ZNr%P>uehJOk)QKRG9)!g9**q7Xv@U~*41ZSp&o zY&(mZWU`FEOs!{ihr2BzK_Z^}BoQO50t zSyPM{m~mL_nsGkkq({~nCoLH#slh1gc0#+1^G!2OIx!lIp*90m3f3q$llV6ixmwWgvy_eMpKhLgN2kz-H zxr^Lg4)Dv$$jWOLrXrrtr=%+1tX%rCDIH!Xqw6ZaA@}rKwtU$dLCSD}cw(?h^j)@! ze=U`cfx_nA^%Isxkdf(bG2d61l{hIUoa8uiRJtDe)0CX0y0o!|(7En>__t$S`HVFPJ%e%% z=A01N{n`8GoFYZIivwi@|7LS=;2$a%8cH3Qc#8OGZ%(g3d0^uoxQ!~*7ec|OJ4&f_MLsxaE~RxUdNur9h)^`V zuIK}bak&aKTf3~7z84)(q!bS{^ypf2r3f1h{C29d$D#d;uGAFOQ;ztml;~6R3j_@? z@hZ4n3YVzD*MxRO_nH>nLzXu#6kVxgXS(Y{@w|qSb;Z~>KHXgID0C{iM}~wqcNLqF zU-45l#m(LM6}S3d^P>SZL@4f7SB#x(y@K+KLSXSwv}f^{y5f=i%311SO@;SLT9v?s z6s0T=J1Kd-tS<}$?nsG+?Bs7xJ1OZ})|Um9yj9ZI!%j*D)|b3n$$vE9k zNe7PD+c*+QLpsHJ`Uy49Dx!ml`OC8$g(OBI;3j1LaJWm(+wb(E!}mYam2vXZiLT+Mb~-Jk7bs!+JGaRZ+icHNn2Cwrh1+g=RusAPo>badfocim+<+svl`NvFbwoD!9U~La(~? zutKjku4yXvS^XIJ)qdw!W8`sYFEFWJ-G}5u7<x-w#!vGg*1SMUs9y6D=L6PsTYJOUtJ#_%zH0_*T3XYO0Ks?7 zNKNvZVGohKrr(+|LXV4U*AV;l+Ku?o8g1=P$J%XNfL^gnYY&r%uh(Keb=H6F4piMuyutZRI;w@!n%@5R&#K12J{yqtlL<#4z24k zVQ9^&*;i*l{B_+{!YS#t3)(SXzOCEVK%4&v0qb^dm}m@IcWK?P7}4;84}CUR_gBq2 z(kq`0F0A{T1Uge!xj4)Ny_&862KlVV8=u$PE$i*~k6tvF;8Kpy`pimJ`;ND3jb`R! z4%L!oQwX}SzL2tLXrSxu>x=koxM5(3u;DGshPUpQ&+pdZ+6O)xg6_+p(}oc!u)&qb z$inx8zzuUm$A*Qd)+UqO*Kfm~4F}7y{UMOogAe0|)BF_k!-iV;A&Y;<$RP+=0g3?| zE|*{R>c8Qd?}i(iF>Sb8$?ArO2<2XuaxZelX_R?g5CY4a!LclVqr5j%+R%{^eaqjz z-?1dmt9*c^e1OxLgur2z@?p9_M|m)1R9z1Dw=NAe`k&p(0PKtfm1khYcE3i(*`Sb` zQC*%v613kIcQ>K?EimO7bbF`%iH}fY0m_+I)JLgq1?%J2{sx61%B97JvGFF0c z70ORq%1@Fu9Q1y+y5TbJT(J|;0y}v{V5gP{tPVHH>TjZS%rIN-CoLEJ%CE!e7O_Dz zLX7yYL6AjZw%lLJ5&Sm(h#d`q(KiD%Ec#>y|624l10Cb!!~}h zal0TimsV)@v2i?|lK-&r6R1O!^0a&eZNCU+LWD7B<5wHQ1Qvns!tzo$HilQS^I!De zs5IS}QoS)ACn_^JaXr%fobTE8oUWW#S zhAJN@w1+@cF>upFvCF3MMoj^v`-fI)qUgJ6ylY|N*o4k8Jel+QC-okl3g52J9;5P zMK4E1FPy&rP+hhb0xJ4djOGs?R19)d3?h;o{Z17hQ0<{Wa@T2WsF>`im_V2LNLO7k zh4QGWn2nDaK>6^-@%KEUgjv>zupUd9+}*4zYeH4y68n5SuF_Q(z~>z5_g-LbR(JKl*l^z{5%q0?evy5l1z@E1|Ol! zJ-xgmvqkx1M`U&-yIkWPxmuJ*R7b*#xO~++a<3?ltcl!c|TYH3{tJ$q3&7 z!d~h`bJS~5-EAw)(k4%RPL^i~=BPnYABYPe3gu?<6nQ41K8>0qwsom^syqu(kx{8) z8>o(JeVY6kqBca~$!pqe(cTg_f^<619JM2APxQN_)2PGI?;?NbH0msrw18(}jQSPF zZAcK;SF{f{Q`>TNM|XyH{dIZbl<4mIStuUpkultoYNO7I@?=NU*-Cch-`-Kbit^Oz zs9$l?+dJAvl&920!&$!azISwIQJz*C-5Dn%8%OQYw^3)CqX$Hfpf|P%QU(4oMo;7? z7>}Z-;e2sSu%WP<5IvWG?@+iZAvyxbd~6}L%XSnbAUZaBzZe*uAo@iwmGhXu9MQ$d ztGYTG?R@2zn&{2=_}db_10%&8bM%quT6`%B5;x-?WAyL*1c$o3o3>XW@0RFiGjVyH zY%MS%*`B^(dnR-Mk(!%ORrrB0#pXxlYHYE+0O@nhwr;jSTRsrjiVcs9XtrV-%;P92 zS1}508*0lJ18pP3_O_hH{CGogai!Ifo)nFR_w(P}~0=u$ZV83)jND|o9jwk~5UFVx^MYh$kpPHpg zZiz5D^ly2hfyoQxuLQI0mfTouiz?LeD)2%xd7->WFw4)&-NiQI6uGH(iA)g|7h#qI zQYqPA4AySjOg^9q&x!9T}QIKbBXx?NCPhcvz@> zil=VS#nCGC(7wDvlo!;>D=OL56W;P>QC?Ulqs_0@HJ0BNJ|HdelSIg6J z^li5qIU1ikq>c45mMB-RV<-1(vwSV4Ma-M1fYVLk!(OystaNtcke^;pL)V%yz9i#9%G<>$U2b(D#}sSbpPx(zsAZpPK#11aE>3wE3Z*7=Kc0U zw^|h&;J>{gZLCvY!$FY2B+F)Hf-+07qNvhVl+&nusaWwzf6xzZQHz1f*O)YvuPw^g zu1Uir$C}lC>IgLy7{(E`zpGW$aXij5xjI>FuZ9}^)ydMf5J8<|QRhfoNwzEt{_5BC z-O}GyAe<4{@12m)fI-u&N@`4Uf?3**0+4L_U9G}aq;)&y_jox)FsldD!{Xu?Of?vR znVcY}BCbZgB1+#;(W?-bD5oLrmR%GZxuTNfbir)*v9}Q=x{Z&C0u7dDws)|W|xA=_fl){20txyELbyu@tZVBco{4Kmtt8Hen@xn*b# zYp4Bodo4nh#a`u>;Tp?La;Dk-N1P#!zEj(VWW@Qz{o5sjMpYO`TuaD^dk&$cC9b7g zhHLCM$xF>~Z^nHPHy<+mxr|TZ&?otyJ}z-dV@T3WgfW)5F>Xl>XAF~^ZI1gYE;c?D z5+;jN;ug6qFD{wK!QG6*4bNr)T5E7az+@Iz9G~hH6t_NZGv41!k+gji_hb9GU6koI zOWZcCpA^_jil>w ze>B`C35@$&td1Ax8g6jMH=zS$9B&R0;#*kaTWA&q%cV>a_p&3tBW380cV@^p5DPyP z`p3W3CVoJ(_yN`NFfL>m|K5EW#t%k@!+C~*@e`<)@e3h%nk9ak)~-ujc|};_BV1AU z)ypI=H^*njm*7p&7#DWnA7gw4KQVcE#h;|eozQQ-5dRAu)AyySg!o%@OmAYU5)z)k zF`qVtgzgmm(dI}8&S0}?(@d|M1mm@oPzSmh($LL*B; zMu?EG%8`J5%9|&pJ*0lQ2%8cKyBrCaLlL)^#}y0J2`6xVz9yj_AHUZoT*t@Vxs6oTEM&$XOapN=?9z> zm(xF?^v~zr5@$ZPcsaG1m^eQ~NStFyoZ~i{fRy808e-HM%E;&xLabu6E0cnAgk1pSjvYcjC}v!ME%q)ac4`H zsFM)2$C9|m-3$MRI^9<+lbmBtypSX&-NX8$2UL5}rP?H8(mkjZy)y~Zn}FV_KYWTu z5gt#vXXu~wlyA~Ad<)N#)WMO2#`>$35SY|Od?D%0o`Fey#kNU%+9nmWOtfA!(*1X{NgwaQ>xFQV5sACl2=&k1kWFVys9?1}j^VWOpmzJj*93 zO;78-;*l2n^hjF)_FGHRw=S*Y^ar0LZ0e)%JX_a=2U6ApJ!VNd=2kM!ulgk6#)K=W z`-*4U>+p(l&B-jeWpW%;iRm{PUk%bMIN6WKA(||h575b-#P-Q;AMsD_B<;hK9=$Bd zz1)iMPwpe_N8}(&@*sB&{gXeI4j^)zC3&2y?EcAm{!?r)){t znfjP0;b#a^E~Y*P@i5yI>_)r9qa+ynG?7=i$g7ZYz&q6>$OVp6Z#rq5vQuB7mzt9= zCEre21X0vnG$QZ;Cx!7iM7x?RAf-{tB15l^DL(kGmDoOIfWbfIY3WFakn)Zt2-$5It8&atG-abFbJtw#}Pe+X;(HRjaEQ=iH@XO`e|YU;+n_Tk=4{uV13 zbL!aCS)z1|DrJYyv`+pWabc-;Q97=biplHcO2jQsT`Ni_TyY!ZEr{Eex>J;PQ5^YO zd<9ZfwgNa2=_l+9yCw)GSI9r$ z!Y64{F>2!x&E7nbd%hr#?T9&TR$53py&u(>CZ)qugG<&Z4IRQ;I>u{~RzSzck@TRD zwvCQYXvYpZ)~2j9+G21{S?MG~o3hd|dwDmQveI9rn1@eUJsW$c#fkE_j@*a|6Fo{*Hh3|eo|AC!(QQAk-y zQZ^v0v}CMwOK}g(CV8(pV`s+xjH{5+2nmfDM>8-i@jtha6C~s!!U;>p3AYf}KyH%v znKQ00@mX?`N^(k^l5xY;=1bZl60!KhTB|XQ6bJb~@XD4vzvQH0;1Ubmt|eV8OS))% z38O;)B?HmxOR^n8rI*kQmhIZ!((ZyS$tCeN#7cO9 z;F1z5|GMfWYawW+yAC}~@_zG@bD2WsHd4wNamo^hODUO8Ao71uN@lCfZH9rFeh`}Z zoF(%)ZLq=c**~*;o6JE?GY8>94@+i`hLsD*9G>~Trj$$=lIxD3v*?-1+)M@OzO-b1 z*)ZM1l#;1XMaAbHP)cSTl#)5mQz@Bo8tYa{W?W{uI50DV%AZr6nGHeV?m9pz2hEwg zGS6fMlMw34#>`rNf7c9aCuIsw1$GEneex=1=h$@7ss(XupAI-@7w z|NkQS`ff0*#u1g(D9cTsmWp*q@z&b2T9nPM+TWGh` z(R8T;NTrvdu+vfpm8RZDJEh6Aup6y(;09AKK3EusI1E(&OaGL1cg^z7^5&A=GZ(~X zd0VnPXA;bG?XtX^W_dfZyeqwoUY)YMkw+HYxXNnjqs2LYRGe}P?Ja5@vrE>~#;m8a zEXW+*N!By?l+N+ZXkHQ;PqNz58X>EFbyizQo^fA6$#v&$Wg!$(aL}#T!a@J1Vnt_# zP|>Vj64nY??;{MbWDR(5S~z6RnvgXu>kO68fq#ry^Z5x5T?GxuT9|dl5R?_0m4t_R zs!@q}5zosO;-%W6f7WWLMhMLMj#p)mBWru57kgEz#U)GD5x)F@p>f?OW7Fo&XoMUD zJT-CmHH3KxI|X(Rx2^7BkMCZJ;3X7cH*O1VV3`o`Ml7L;L9Q}q)nr}FzamI=&>X~J z!-;$(6O)h0X9e@J{>z4mG+Zw8r;A3nw&2Aam(KxMvjohmp#%Z_OBH1CM-be)!K1#|Y(+3iG{w6l#) zftaS@7+o=EKac-*lB%=c;-4myDSH6wH_d3FDFiS ze1z9&K{4GEbr`4Q9e-wR9*IRob2?@-YCka>$5lFW>v;@CmEWzKc)ke1ozCEPrIh81JCv&n@o^W4hp;@@YI0J1l?B3teJ)mnqBX zC#6zC=Sde~Nsi@jR(hGnYd_MYbua1C7|}p!TtOI7nAULA3tB#W`9$OatvZJ+(Rcau z!gOZ`^<6H>mm!?;%dB3Wj2ynEd-MLwmrAGHhKn2uQ3)Yv`H#y_Ll{~_7k1Vy;CA)$ zo4SBI(wX}O1m$$f=^{AqR3OWoep7OKJ7w9Yg)XL?JLHU_XUcL0Rp<0~3(I-G+kLX2 z&MF>-Pcl%E2`5QkR_DysC4B||h(;8r)=;lbImx~`D+}r2 zs17-sdFJb?b4v9j>mNwM8xt}Ly9MQ($hiQO=*B0u%YD3Qu7PsCR-JQ67xSC6`~IAB zeSqbDP5*rAo7>K%$=r9Vb9=cH=JtCap`eYhm@t`r_gBS1oz3dW=pOVgK*sLowOs zVX>1p#*#Nio9rDPlYQPiO!j$;@)mhc_IZmed5fHreYMaoZ&A~{MUK2hm0pjecFJ1> zrRQ0FwA24(vd>GxWS@t>2PXTxJWF1lhXG?`Z#H{>_Yr$wkX!{@i)CpdS{@cB>WFE9k1hR^?) z%AY^kkw2!=tBH>`!{>kIHgQ;4VKQ>NY|j5WKOz4zG$CD<1CfU@e>t6!X7Xt))qci| zTdji+=C~A)zdHZ27?{6-XL7tl{tm&B4@EVZ%auJs`kBxAn9|13R~KC_=n~wxGrcQ# zH7*gn9=#}dH5rCLQ!B%ghRH$l`*_Ucd21JwbcL!~B~G!vMxTutZZHoP%*7{*?|4bS z(6!s5Z}F9ayEFk5Uze^5nAtus=l`1j=gOf}6>L}u#%~y%P(|o_7j!q3ZarzwQlJjs zG+jAV3|wgv+pTQXbY*kL%Ev0b9t-HS@@e0d{sr0ix=ZVo-3yoctn5kAn!UDO*}otY zhww>F@=$X@hl0+9ohd(TeBjF&-RXq#D|i>5p`W>HuD4u4P+@1Upn}l_p9&0LJT5pU z`V~woI00PfTd+thh%AT}+)u?8$fVx_drg6YGF;$KuTex6zNnGvD2PX7315lgyA*w( ziW>#lyn(eRu<0pckJFI|`dnKGx=3EUM+4FsW#Pg-?s^ z@f2!xVS7qql82d#LW`n`f1(Ea9SS!V<B zwgcc?vix>Vv}@(FDjf*vj2@QfjlZYiXW$|J%ftd6u*SB-K5G> zv5McQE`EiwAiduxe)B$^_bq-)EDkIl;5M+E#X&sTklNz+E4`Zab3PtfJi5AgsAoy< zFX7L{6A7mrC)H}l+=_}Pd63+Sil-Hqi9IeCe-6F{@r!G;W8&$2X}e;%S+P`G98MB% z7Dszl_ln?O94r0dUz{4&gbzKgR4c2Cm$~X$TU4>JKLpqf96RJxCD!rPA(SBj+r0UX7=wvaiRE`!-6#_~>D-#X9+LT5>0i~*=RKn$u z#dw3L*t#?o;~ZA-qQL-n=V_#X+6wIQcszf%R$x~H@Z8CEf&GqKDgU&> z{(ThIr&y~tIR{O63to@4L5LH)n)VjFnh)n`F%i*Yn7;^Z(E5u{3Ia`tp-*9tVjR+F ze|VhW*EXRag^mu3B7?b&SYzmCbV6zl4Z){$hqs%1APEf(ixLCFdW!ACB!hq0JJMaW zSlC?pXCnPG)DiaIO0OsKrF+m|x3F=|+$yJ>0Md1&K5!@lwlTO296 zt%X(>FjLOZ2J*EwVRBf!H6G=P#Fmg?3|mSk^jKgRTq_~c2o!Gs3R_Dj49$=E7SCFS zVMt_=bPEjUVI;K56b7BKNE43nJMUpv>65mX=!RGT-l7w42(lWjUIOb(kzzY*`=-_> ztF4VHy?j1yZ+%U4Sf9t?K-AUR-C^xY$B~UtS05`DPCg%F8X!B@x~Mim#K(yLQ6ayzu_jrUSWl5cu#qGf ztt;t-n$5ZjpACoqK24-MJHTP1U?&TARt^0zi8+mu0mL!;2)kJ z*|cY1_;;dj_;#5d>vn`!6NbEQwh8|^{P&0%lvgv#E21%-P+k!&@%d2iD8e^lhM|8% z+Ylk*MMp#jh}z@K@dcsB%Mo1#|A;puoA(Ti7%cim43~#ejuD>{h8+KB6Y*KZe7xoo zIX=#FjHVNwV;nvs@p=(5S!WvrL@bH8gUpt-iP+REViU4li%{Z-fQQsFAkqh8WnN*v zz-Q~i&x9Khn;T9|D9;w5eZ&Q$f5gtn7LJHhl*~V(KJrPF?`M?jcZx8{f8s@rQX^>! z6^klvlv>aU6^s80-F>DJAU!8dG4z*S2oa<%4yiMQRC#D!>LK_`eIlRg87Peq9nx63 zEMg>k>KTk+62uDlv23-m%e*W>2cTaJ7hbEDF`U8T5tEW*S}@nD1@@)=YKs>Mk0 zAEvymgbH;1OA4W;$Y-H-dX}3`=_oXeDSeeN&Lkr;8H}&aV5$TY&XjlX^c=}4q5#HE zXNou@G38w)oHIMX>;PldnH`*oVoE>6}SqN{}LRMg}8;@z)s)3Mg|jQ{GczIFkY<1}K|2`UkU|DMOWb&a?;99*jk2 z+H)qCDZ`Wm&IE!91oM*41ac;iDIY3{oPnPAlAd4I8BNdMFy$j9i8FYM;@)U5ujouP zms7x$;Yu=RmVsFY=2e|p#+f3fe5|B!W&@ZFU|!Ri4V)=q$_OQuGkd`70nN*ZUbfVl#utIk~E%xb2LQqqap=S>03zun9}Z_cb`$|p(&XF7oC0EWJ}p|$(I z4xCxXl+nr(&cL4ckv+ezGnzebU`nu($(awqdv%gnaxZYr!3=44wxJ;|IwKo&QvmGypqkCbzs(k>7g_0IJ1@E zLEYt?*$ZYbm;jyG%bD#=`Bcf_%w;f_!SvJ_tk=*MJD4(2$>j{jjeRt3^wJq^+}OpG zNy-Xh_CHPm%v)|||KnWFPfVGtr7|P>|x3jC7&~W!Sn^wM`!wSW*<|g zD&KHs445%s-qx8hoH@XhY065@ECRC#OkbVB6QHQqA*M`M3OIw;obFEp^N!A>apnk9 zW+;W6Sr2ACn0Iw%J!g(GWu{WZnZsZXgXyO;hdFbc;gRWL&cL4clRfv>8O@$gG37I* zgfn-++yxV;Gk3Y1vrPG1DJABBF9k6Fbu$NiIaAG)*-9B_dV;}=;35a;40dEt_d2G` zQC4wg1eg(E2I>qJQDDw9Wv;TCGqb?V0u!V&vp92!DIv-l&S304Kx6NFI-`xfSC}$S zS<9IHLq9vK_0t1~IP*JGzEIY2rXCDlQWrT`XRxb` zGT&s%0%bjCZh*M~W{A$qL>XKpb()n3k-PGCBL8LBg# zICF<7Unv_o(+^BPFvE1FA7}0{Ws$OpGtl8d(&2|X!*v*DV9M8c(jVm^KV$bqllujF zRDIXpqS8CeD0(Sd+!&$oVvMe2aEq{5CV{d9@iVh$iLxc07?Yq4OnibmokKXcV8XiUI|(y?__%MSg?@VS^Xzd9?`>yxQyn zDjJlnq-V70!DE%;g^q^E;fU3IsKpqdwyWIPICvfaIW72sJ0u||>L58STf@AV@`K8q zje{6`4$|N=LT703*&5b}DLYi|Y#e&BQatn|n2~Pg5Ejs28Z%|5%AJivFN1j*%qX3C znKO?vWtYmGjYIE&c@NAdI`bZ99%IUnDt9&xjR!Lx%xIk%&zYu7`AOx@#-W8^7J>=Z znT4Eb&XnCMcQy{igNX+-MrYzV^8{1&sNC5&1gGT?IW1##hMbnIVJ(=lSLM#eAt?C} zb)0cJLmg*pSWBktQ@OKo=r=IGff=tezj3A&Q}(Oe**J`WN0NjkHDGi{i1 zSmn;fVK~o+$$6fvGvqvP4Qt1gBPw?`4i|wT=Xr|Gkn_AX>^Y`XsodE(ya~)EFjIAA z6KDMK-5QlU8;4JTIRR#x&Ya-P3rsnta%bc4B`}x3OxKx9oaw}r<0^MH4#QRtldaCs z8O>HZGv$QJosAFEQn$%AJiP9l(&&GD~O3Y1ta~3R6z0+}SwN z1xyz(pXp2&&b-Ey(<*m1j=T-#Z7`qf%-fvl%9JxIcQ%d;0W$>5Y@HdxnQlxut8!=K z$XqaU!OYQ_xt!_FlyfR~HjcoakB~jj)fvs6-(-qI<<7>D)nHbG3DKF=Tuu+BRIA+C zII z<{i%TXUYYYI~!Hwz>EX)mClUg%zv43QRU7?6&%Paav&G!3^|Zn!v-?tlFFTpsthn0 zV7}Iw49>jAl*=l2HmWdgRMEJxSZB0x<9(+5ta4|g3X7ep?O;N6h88Biprgh zs#-9$V8V2!mNP?{@{7uyjiX+b;!!U!RyT7LTWpZ?AyclZ+}SwV222|;;X2cXGsBtk ztIC~?qZpr$()b*qGurq(f+^Qj?ra=|tsW&?m2^h4)lp3OP36wUQH(!FY5a-Q8EyO- z&6M9&?ra>jg0X^$(itl+&lsj$SGlusG#yMjm}s3z=gc^!+)%l*aTJctQF3f-Izx`l z*02doxv6qz?->%w)UZRj9Q%j@ z7`x7V#F@{Sa!cLJnR#I5fr-2G`*}_fb5GsM8MuAN$n8tg8FKr!hRtWHpl&1P_)`?XB)gg8 zPjO};Q$=+nd+_X=FBZHx42cNQ2>+WW=_EAM0t{# z`iQ!hGnko9(9E<wvaApNlo2rL6vkJ^AFe`Ls6=%L-YBTjP zXHJ1R1tw2tPI0D?sm;|RocRmPUtsce<}c2aF!gb@ikOq|R!@?*`i+}8sd=lbnEHfz zlrzJ@3wt?9Orch_LaXA~A`lNb- zGnh?J(rj9!GumwW9aCGXCpm+q=}B6e7V8WxO}B! zOl_r}=1f;GUBQ&}NkypH&^4Sqx?|m^C`Hn9DiDRA054Gf7~Qz^v7oB+gVZ)laSA zOgWfxFyHD-IcJVD)vVTXrW#B&m~}c+&6!h7ZKKu^b6TVTX1$v^jdc_Be3q$g)q2kO zf$;;gL1+9pQ_a+N>Uqv!OY1akX_f2D8=R?QYJ2qpXQ0E=q{EFmqv`MhQ=h{N{;52Z zD1h0dGn2TS%S`Q{UgAtFm{>3sIupy8UzqBzUgk_Om|`&B=}a+at}*p_^=Hm(2D2H= zW}Vs0nd?k_LA}Bm%%-PlHvL{_wAu6zrgl_+;midv7r<2N%mpszZ>DxquX5%#nA>2s z=*(@-+-B;F>aWC{X-xslRyT8|HD~TIwX=GSGtl!H((^W*;d-_jm}*gf;|y*koEZyd zyUvUyIaV*GzJy;`pu7|cV1CdUg)`nveObNEnNl#NV0P$CDQ6yK>MQCE&Kv}D5X?@U z!EI#Z^)IHrs@~+xH89t}?9!QQoN3O~*VI3VIr|6&Fh9DPvyX7bhpAoEKRJWCpQXD0 zq%&IGTQaq)`WI({zyyKWtusMfPHU$ATm73eSW%y)74;sS;VWwEvrO%#{==D2Fri@f z>P#q?V`l2>>MhPBf=L9kPiGQ2(~ha#)!Ure0%i-C{W`OSGaZ=vhI)rHXTh8Wb3kX# za^?l5zNy~j%s*iM0dr7i{^87vO#P2~kC=0qE6>qfdC1M2<8!6;C8qYk3jm1eP65ne zo$1cyyvo!7yT}>%8|TR1IHEJ$->`ONYEQd?GYi2i1XHCm3%Q(bOzmYiawZE*7MP!_?k(FV5f=$T_+Na$INV7RXj>Pp0;d3VhjX;! za6)JJj)S!~Q{T2XBF6D31u!SwjN?%*r!Q0c+PyjRESP7(oYI+RIn$4+@7No22L6VF z{EgE(!~G5Gf0_EO{SnT*59WO^XLRO$E+>eo{p^o&20ojEe73VX!+kdE`%LX`Z^9Y) z5)Seu&gl&IC9EGXHPHSTX9~a+fN|(d0nh70rvBIdFV5@$vja@E&g|gK$4nhyZ_1g| zU`~Un(HVSi33?vI)PeS9ocROHA7E;A<`2#UGd0NGoS5pC6u{KEnd+9D8OPN3?2mH> zI;!%vwy$o>RpV29OYhv#)hv%|?uec$fGnVDc_g1MkGGkIRqm^#?rf-~r+ z)znWf>WtP;XEJq&{YlQ0fhhxXNoUHqoX?s1fxRVXwt*qv=CaOk-^MzZsYC5gapnY= z6JUPUnG;+N)&;}ttvGW93~kL{(HYvB-)hCW;6r+(~dJ(7Yw&Q!x^l;YH0QKtIqJ%mlf-RkL}NL<^wPvfVrkKA8tP4ij&74^WW*wO8Ix!Mb3)-JdgCfi@+%n&d`z}(ZBA)LXwV2ZsnXW-M; z!KaN9bY?MUur8Qtw{QkyR2{~sC{bs$F$(K~Y4(>ma}vx+Fb17D$>m^OFx~z#XW&QG z!HJ0aztXLP!u)jh~eOn4(n476@%jIBQFw_1jXI=*LG8iwNd6_d<7tFH1#+jaA zdV(?OOi#{WUGSN`3umC8dgv#rk%!i8|AGt+^4l-T`=4JZ_dDe z>R~@ojdez|AFK=J*t>BC_EQi0iF!n5H2cB2V6Odj&MX6iTjo)Z>dZ1;W~>WB?A;DF>R&pe%>`H&d}03& zG3Q%Q0MpdXoaejGR;&va*n4oMBbbh0n(0hOo)^{y3+(}%=?A7CnC3duk26>od};5= znQ>sS{)&2BXZZTdigm$P_FkM>0A>N0Cv;{3mxFb|BKupM!JK;@b8eK6&S-Nk)&*bN zdvgYQK2LgXp)^H_sKJ*6{z4PwQ*z-oVoGgvR5$9g%cmCo?>ayZrn;r4flxqx~30_NqY)^6qk zpO?e2E{L%ABZh9D9X#f7YY;cd+_wg|hMPn$`#?8FsCH{mONKjf{MO*XV>oK%yfw&A zTDxxzZWWxj1`i(7Zw>YcrdxwOrVFCU{$IK^=$7ZcHRz6kXcWJ}t-+|LAGkHx0}pHU zs0AttLMYxR@lPyV(y%7hq1wGac|IP#d>&sCoFD!OlW)bs7q#YuuhyQfqKnq8{Nlfu zd^;9SXoMj7YIg+bVuUZh_&AgA#KQZOrbQ-ew*u*+B=d_;GWl*S+|J0l=+4?bK)M*^ z%`diQ^1WF2o6!sZAI81|FpA>)e>T}$iZlfk1O%i62pk<11;vJhrh*7clWyoGp$gny z+f8;acOmrNA#?&E6k#b!5m9LhDkLCSzzRrH`F-BZ?d5{-{r`#M?aX}k&HKD5`=;z& zN}|~Oqf8x>d?@s!Y|!sRRZYoB)fBA)$WmqsY8;tWWJ5CHVWyrk{t;V(l$rV`&#WdJ zF(zC~vrVAA*bAgga{$k*DI2jSe9FMwG`H9Uq|CraJTqQ4WE0M0+Lxi>Vn>cL)9&!h zda~g#;YEgiNS~=_7112<4R7Ihqxng|lX$YE4v-Sl9S_LzG?Wd+gp-*uep*v;JdNaM z2*OQdqmT*ja++uQmtw1rGN*0kg+D7Bg-y7XGb+t|SkaygTVuwvJo9{o zbdrryCfw5%{a4Nx`erIplC}Y9}U7NVB6zyR~)FwN_lO;P>i?Z`t z|NlmK`pL$lCj8Y6yEh&X8=h3!hLgOs4`kyp6OQVpN3)W|PA6q<5~IKn*?8Q9hnlr- zbFMgNNSRsR^E*e#Mp+ZC=@w`95V8MBnOk1wnMtxy&V)~zeSYg|MXR1q0@c?pO8KpY zBFY!Y@r;#?Crmi3+m39v#Lg*6--1Rii)MVpH6He*wy%u}%sG`*f_m15^ z@@zvkDw*VuvX&JP?kZYb7=T!F4oQ=Z$|kv^?4@=VdwHnXW2GXHGKfQ_%0?BFyixY@ zPK&)-Rcx^e$jj$AWQJ@!Ws)<>UL9ev*Jg?xRsnex&s^}BBO6ss@peJRiELCi$rEL*=U6P^px9m&kk(r{WQAt&;+Np2`>??Cv9 z_Ew`SUPF6}3>*N|eL$vXlWf#7$ya4>RAaIe_Q*zEle}5>&Oa9GT3c-63XQv(yS->PC3?#0m<^Iwc#8O!9VFuela` ze}sZBx26p03cWUR$QjvaY?8Cf-v8NRy=N#|z5k_7?*b3fXm!4mjV2~}#H=q`V8166 zt$w~B8a4$ltw8~LeWyq0-52A@m5rt*IniuDg2e{56+7O7!hl3h;d|M5+9V&E4V-PU z52lF?Zvh!72Kygm;~A4&XqNa8!e?|qI#TexPcs1GACT$!SvH*EgvW7Q(P+3=H z<9U-Db~f^)#YUl3>XBwJ@+vRuFWG2rlE2PI*Rxm>%$yQ|jK=aH8q+P=Xkn7O&XPbq zd8ydP7aAvte)hL)ykL^I&c-}}a8A)0|1XWlJog}t@5;uDW@{2O4tp2lTPRwSh&tmI zk~-cP*=T7d5M=yji%me=Zu-B<8h`u&WqBR4@sinw1bvulu}R(O?7;)D)Nek_dO)VP zuxz|+wk1JR_FK#a|Jf`cD5|%Rpeec0f}%3L56Q+WW;+t(E^aYTVR4E`TsB@e-z12Rrkc_~oR<&~oj;bnPsm1V^DTm;WLhk>6TLSO zU1F30$T}(eACT#-C>sf8M-pUQwwU>cICmk+GK+C_D$7P2vlBrA11y#X_x#xcWks>0 zvH}mJUR5^Qns1Y!AbM$N8J*vV=!F4GUCBo?bya~uEmYxuW0GZ~o!ObBX5?CIS~eZ| zh}?nE=pJ#?iaa0_E?9f>9g;J%fyHLMp=iw_jbLVLZizVA=wNms$gKGmo4s8e3lYYe zb$~-K!+OK)N{~5)EjG8VI29rwbLw*l=2>r=?-FG01dGix#i0-ZnJc`4E?}uSaPK(1Q0VdB%%97vE2B@yn3BPRl~K@2^Z%JecnAjn2|#+%?gFDcM^@9A6{ zgVC)wD$_eqHr_WANzmrX2)`)W^Z!fG=GPu1Xpn65HV2WQtq&nwr1LEgz*2YL+T;P5 z-l4M52R~m8LEGWk?s$j}!8`yTeDs$nFgmvpyGRX+&l0KF%Q+0tT4F39_fH#rBp^ zv=#+4*03xb<<##P60LDmrgySz3^YfOpnVvVKE|@q%7{Aq`ApR7mW>b0kp%hpdy5@d zERN&|bw0teD4LH?HWJNI1Uc}##SUSOA~Pc8AYYsErpU%1b2LE?;VF3-vnD!_BcvSq zjY|p0#$YpvAfIB^bfkwkk0T(TcIJ?D*%)Fb6XeJmiyeJU9LEumBd0lJx@-(J#}MRb zhQ&S~FHYkK$We^jPV}v=L#2mkAu@ji(ZHTZw@eo&LnQV+SClKT$W_c&k^)^NzC!HL! zQZ`1J6A5yvwZ*=wq-ZT8kW<_l_F^J9+We3pUk$O?*Lb#Uia@?f<5DmYOfn}C=rsU6m3E;)(<1gOaT4;fK0C? z8{{gyC~5Cq-a6+X!L#m2V{Cb zk&TI_mjwOL)M7t=AWkU>_CJVLd{{OvK+>}F($;M<;Bgkd1#jY$>v{xfiF3;nTQ?fC|)CqFsPmBHfoH(H*r2K-F zc2xNp*>IUD1o>6B*l$=ip#w?+^6LT)IV&5gnM#n~c3SNBh2ngYfcz%Lqw})iHVuOO z{;S3Q_(2>`5|BTNaw!*O!(*BR`O|H&tCQ&E$A}GS68IV)vb0tOMy@|s{%?%;N7?Y2 z0TTPy;}*LSL+?vQ-{Nx%v9A{p``0u78{@q!8$L6Q#NNV4ej9#G!D)sDKPzg0y;b0m z5S8iuRW|%)kObX1Z?V5uDOy6rzIXoNmia?AG&4kyzi(LV-^UcKO$71}U()nmmkr%a zC&<5jEq3==@iwQh@4p{%DK}*!#hglzyV%lZ6Y11ege1I6t!)8~@8Y}o@>k8HGQD?X zBh}1+ASvdgCCRlFt(~oo6myrCg?XA`P9ums){-1+6@L1Qt0T$F2;z&C4bz-X5XT)$ zDuib$9sUv!1#1F;D6$bSXAq=NS4%4F6=%N$q|jszDJmOj=1hVVK5j`x9~Vcz1f=k7 z4k<1hL30*CisD$sL!Ig5*8`~G;Vl)-c|fMGlx&2|*(9j=8cQl!R2=;hWfjlkWnoH` zZq6Y{$u5>uYJj4(kB};v#35y6W2!lqAf>ig(!=nX4@V%Sj&ewO*~l>G5#-@-Ea{Qs z;%t~G=;6OOq>^k*Gv^bebQMb~b5y*UD|GbJaN;K%KxBf9U|(KFT)`XWMj6ugdi1~SW-o}&0jLYb+ac%%udWh%?_y%En@I zHHodY%#v#38GHKwLu{@5+4cR!c94xF<{A=PXQL(6b%~>Cf>516!bJ- zboC9FjWy;Lf;`*ZlA2-XDK`Rnb`qB|S~k|2*#v0@M$eZQ@1=`^n%&?K`2Oq6tps`g z150X-d1J)Ylb+W(1it@zGlw9}uUgUz#TD(HNI@;|@)kzcDYCJ_+(wWWa8&3;O`MJs z1-;1bGSF=w)<9IvXb-FD>B^?8{`C zI|=d%I^(Oah_}`Shahty={0R&j0?Y!U4+_Y#{>OEb|aS-jfk9vyHf{ z(tFi7WS4C0F%J`@8)~up1aUA=6x8h%4%sUkd(BS?(j8+*j~n7#o`7^0V+Wk@edZB@ z^nBHlda2@Ao`Cf1!==Cp-*0|KkX|^>(i`hMbSh6kdR^lXIN=|gM+wp!-bWvdV?7E~ zz4+E4Nqi?5jY!yf2lm(Ks{b#>_oZxnVt!6y`_Hzd0i6}CXTDf?YWK+NzbzuKV5aYc zY#cDZAVD8Av!q09ledac_~1QG;cMAAXnskML>%%Qyi%Mi6f6f-<&bY>)e_`1;X`UsB59b2ubWvoABKi0%(f^QaoHEZ5#Q(h|X*(3H ze}t6ASAzW|WaBF{mmqo(OG+86Xagb;U66W2Hoi9V2$Hhhl2ZRtw1E*w%4N>`G1)k6 zo+pU$iY1wI6zziu#2CvV1=;w<{GK3b7=MF@#6eI& zI*l(<_$$lCx8_BHgm6$T{cUj$R6s&}%=1^1jql7$1W8|FNmI`%+Mq~5>HBy=HD%+h z`2#`ln`+Xuk%~4r0?FVDCjL6IanAgaAk!>Mnm%0|6cq(c;}dLuec8x0ek9E&KJ#J2{ISw_vU>h zj+zQ7bARCw_|BKi-v}}vuR+YeB2JnL$o%RY0^j)u^LK(Q!1%ThURTjbK?{WG;0OO` z{y~t1@VXXFR7JX((OCV)f1hVKi4(TKtKbuzxvIJ6=4pp?_ z5y%og6ZLnIjmzdWf-K!>Ny|{v#UqfVC%KevvT?<{PLSoO=@q3FZA1jJyd{V9l8s-? zzX-Adlhu_N`b!k-vm*-(L@NqTR`WCcePrWT^9BjZ++<0sH;ePE!g`rUcv%Bv<2Umr zLDs||tQE&l1!T>W9Fiy-znix>1e5f&m&7Sl0a?pkN&isU_`|$SkadkMX+1oQ{CV9v z?#uf}%Eq7O9fGWfhq1A?_?jCbWrOH#$+B_P{F@*faZYv9Tl6hA(ZkU_)1QqyACT!E zCmYwye@IZ)IZN6+N}P!mWo3zeFi|$HoBtAI3;My9g^D&Rzbtx$VD;g@Gp;R9MvA;I z#*dZqzs$QNcI(%cl!JBUxAMi}F@Yg2>JhT__lURxd45$kZUh*K!Cr&39czCb3y9Is zX!BP-rS15&?x@myN#z4ub5%9A!V&QXY>$_Kn~WIQ{TFNKb&!q#$qO$k@$RV?3 z5HPy*v4I0DRPfmS4^*1z|+^HQb z#|J;NgsI)}8=nJH$HX!zaVoxtJ-mzw+SI>e%3fwvKag~?>cl9hfCS~ z$Labh5)#pSew~F~W82SfJpWbb?Gk#=@0fan^q!CJu1uWH+Rq<1-$1S!&YjJ3^X9KY z?qZfOf0tBg{-M+{GFZ(&6=6j!stUg&>P)LAA@-?i3nn?@78KLm=jm5^5_iTeXry^A zEO-sqXW|xg)x1@zEw}{40?l`RL6$)5*Zdb292JN>O^a)|0P}2^A|`IZU9C#)!iSMH zJ#Jx~_Eg@&=WxAP36!k5q}GxKOZ$*nbYYeyohizza0x2yMKN4OOtED6(mpZmmyBKF z0@)Nnc1c?5RWikrd6r|)T9&Y6rBrE2mZ-udR)j1dQDdLyO;q91XJg}*T-Q?bmX^k? z2jZ4i(2Tf-OB1->Qryxu{^Gey@h#4S)+&KgRhRv??8b_+q^l`(U0#)-McX3cW*=B|W+BThZLsUA7!U9IXAizt@*QZo0@_ zUqLjt_3_Akm?f-#L8`PqK{U7Z_=T`=C!*%Yi;6zl>*R zZvAd8s^)EYmx@*b zk5t|I!`9!nO(N>k1@)YA6y?>F6A!xW3b4&-xNTBQ`@c&(c3$8wmW)pQl)w2n7AiHBM4tTs# zSeuuJkFpSRn&Q>8`Bmt1u(lwsAwD;Rso`>?RukLXZ|tHHl|UKr>o^I)XR%J#h~Gk+ zU&rMlDa^0qR`9#0x8pvGK*X=(L4+^CFWl=9J16=Qu70r`!)6h`jyH*4r&ya`r&7`U zqWk|g&acxj;@9aJZ4vl&!uN*{+eYzD+G66@DX1+Wex1IF@ayy~`WaF#QHe_6QSj^0 z0^v0r5`CBWEw%ae7$B0u{CbR|`r{5!WHiHl9s&`+9tOe;@WZB#sJ|Y|M4v-Cdd2W@ z#IMI5;@9Jd7%^~lI+|bD-{Q^jIK~Xfu0#BK#%RmIuP27!;j<`SL0dt*dNz;n>e)i8 z171B7s3axu71Oll^TC67eaCtA$st~SOwOy%T!S9K8B}g8pN)<=Fk~?}M~=C?3+*T)@XH#6P6?GGU_ra7y_|ill?wME&tY z0V8V>mqCdz(^arKc^ast2(7)#q{xj!2=r%QlK_6@Dp!A?C z5HpeD*U1Gz$vFDKACR~##=Gv|$EYMFP!7C?%s^Ox6T%yb*Ls`R5KAP5c@6pUe!Pa9 zArSEz0)r2^9L;OUEt}WSLY8B6W8yXR5#lwpqRne)?FaGth4UKfCtgE4Y8$|7D9kgu z6U9}*Yv{}fuc5Ozuc1q*Bqi_!c#SBE@CZ&L`-#^^o7af?A}P#kM9cf}8UbBL`ia+w zw-DZo<~8C2o7V{ZW>J@Hy^T;Em`*W1_!zDjYI*W0*~#Bc0rZ43B~lPpJaF~r9e z74q$pNQkeCmbN6FC=|=()>q$5dH|bV1>&b;|){`H#9AmZ<>&cag_2hV)_2m3bse+@6 zw=ictc{lNzoaBEDye3b8m@^djXxpi^PR`YKP-~siFv4$2BhGIMeA6-8mB5qW=UR@i z&SL6r;Jt8xQ1K&HV`nRYO5o+g zgVcuyDZW+~ymr~VeB(t@n3s>H8~=GK_;6y-|32~Z%|%!iU2ncDyWV_zEXTN!#LIVt zc=^7vdHKGN<`w1GdCPEK{-=qTzp%C&_2#byG3gXZo>g13iHBme0NS>#HK?WpIbpcwO5AUPe!dNdzw=QSdURM0go4US9?}>i7gDPzAiw+9AA+ zllE^Bue~;}v|%DC%qwlm{pu?XN7jOG5wElm!tCh!N?U2yS6a5^nD7+wO5=`dTEtOJ zE8wU`*H=}}D_E22EA5W954?g;K+H>s2dfHR!Dl19g3Wk+1>rhQcuEO81zsWC68Z^e z{reKH{Wh<3995xRm(iCTy7YGu27=|s1fl6v zda_-6>0Xq5n;g1yj9lrNK;d9Q7?oo?bm<2y$Hc;9i}W*8$LSaCF(>`cNFBqW`|leL z$$aFQI+QFjwVHMS?#0ySA*?3F6SRX>Fy3aA;JInqp$ka-8oBK$_b2Tz_1la}qz{%} za9LShm5Yyhq%*~zS69Mb8SP0sB~TUioAxKdZHvvgK=%98w%_!cA}QQ1rZ>;GU%thr zqfO1YK<#2WTGsSF(H5IN!nWA-DVF2IW@L-$L9)g4IkqjP=bt*n_$#W1&!;DHBg|+{ zG^bzEjzH%b4?)Vih|ee|j4)$8<<97#eMY&OojYASN=BGraU)0s*~5)6;|o$l2~-2= zO+66?SS%}(NPljV-sBfaVbYssg0yI@ET8nIMFb+!n^qxgitY@XEW0yo!eZE@dPI8D zX(GMpdzR`R47D5AyWltm4$8FYIx{0JP>n%g>$9hXLfr#~% zNeKRE)?238thc}oom`z*Z&^pIw`{XnZ~5dwtOs${*$s%-mRp>4Hdf>&zlwNv1?>c} z&K^X$*$JF=c6U3szhIp`F;dsrA9B{&e$qn;)Bx+8DhOb{Z3VGDX|vAhB9g+aa|Yj! zbwQ4*A#O)xh})4r#NE@vM{w3V z#}KcbO*!kG_=PQ31B!Rmz9!Z?H}c#dXT1{*O60B)tat8>u->_kv)=g`>7fK_g7sc# zvlqkozI0-J+Gf3XtVjy8-kSo};_Zy6e!UmN`Mz{wy>}792CzOuWzq1zcbC1Iwijy& zY9V61_Xn!$y?@#d@4a`U>$4^4JA&7~ArW5thH5Wh z(B3zRN>T!~!0T9P1WbF5^YQ9io7XW+c_=B&>)1QsRd9h5xAholCNt>N&UNaPK5`=Q4=hxdk@6b8Dj6MZJ9BwK%<8-a*g(s^x-S zE*_)qZ$T@!g_y7AcGL2RUT$iHUasN&6Z~>9?7DXwLNN^9SP-vw;(cy>~}qu_U8gm#hmUBCg(u*ZC1h4u>gUD!e;DuFuS zcdW2iQgrg-^C#!Da`Mp>wfijF`Yof@8WEPRnhf#ajVVm;>VW5JCXQZJVo_) zG0*0AG5-)4hMMU5`-JnmG=cbCs-gV=ewPM7%v_2m3x1a}MEzab7vXnlKd-+_SP%0~ zR04Iu@9K7hy%xKkO8kDb`CYvtl2{C1GQ^$%>aP_EVivnrkz%j$Sbl9@t4Ftxhk5O3 zgqOhfCxXxrbL|bgFJ2pHIegv7!@M>Q0Y7G}{TxBfuszIc%YjNHn_SBwn_Syx4@B3# zh_q>1GUQ4~QSWP7-9Qqufd+zlSu_7;DnKGv_N>xVmH^5k*?TAx-nQJg^hH>1+)0v+$_M)A|vtH zSX7h0v4n0RBi&eyK>pP)HvJox?Nr{t(+9sOK&WpKz6a{p2Uu5sr?39-RuQv>nT1!`yIBrIRx>O6i+He z7Q4xpHo4<{Gu7vY#cpC)^}7f$OM4v_ySbS3Q3CZ~vD+B1Zui3bDj8(4KWvNL)n$9)fE3)yHN$7F%`6%s7EQLx6MzA z>7%v9@xqu-+J02*>1#_aJ@`;d?BL z(K20xU$GK4zhX5kN6H}LSL|uxSL`L5U$KJk)#dZ^mE!!0ogse3H0?I{60Sy;YoWxRrdDW9a>vH6v4E|S9h%C-l;d*?<{ z*>?y;{L12(NLiXf+spk@+2rtWE|v9Ij?^~9uWTCeD?2;fE~T<7qT8hq&+E@uo7$yR zt~Bv0dqVpg{K{U0m_Zc(Rr`nPtsLLhrgkZnt4_Y5R1Qz<)HX_>5qQNxqqqThk)s^( z`q$~9}$+TMKFhWUj`w>0`OTH72VO)wk9Uh^ixF0Qt zQ57SU6n7or-)LLZEXHjC5;d{fVKg9H)TG5bsU{Zh_@i5@nZI~P!#Gzd`VfP!EwA#L zD=|VzH3#YJJU%cXG~T56I9vo6F}6W#?+{60gVz26 zCKTE;;D5NEL2Lg>w~#?=-?pT9iA5PSzNBr?_$Ms~UTp>{J|3YlP?5$J|B`Lcc+4m8 z$}0>S{~j4MzQ1kI_)(F@b$^3);0BHVkqjEYf*Uk`9i%O$_!d1DCW}9V_(6(a5C*Li zPX?_c=`wQbkcO07Cr%i&&hvaEA%oUw&J9}URX|2l9Op}5&^kC_Vya4@2@Kl$2EtuS zY70MJ(jB%z6TpI!!Uj!fOa>JvI4mjQ4T|AlRP^4Yl#ocbkU6L4-VVIPxqg#>Zbm*Hoqlz?s)I8Fv_6H5kdQ^GcAoALz=%9V&d-QkdCdHIMQ<$zDI$}G#vGT^_WV#}@>DpnurKGUw+Wkw$;%|_kEw-;r zv99-+u6;eag-qA}X@u8dl%lp#+IO~1*S??S2r@EV`-uqf(R9AoNTzFV`)E>o_-ObV zZkVq97BXFX%Qjv6&kC51Dh#9O(v`VPIJ@!@#Qc19V{hh#8~; zZ@BnQ@CWF?ozz4I_R`Bj>4EUt($`QtjZQD(^E1wq9-sq{`u+jWf!|O`O5j=W8u>8- zj&>)lCSK)iUL*0s3nhh{#3%{8#49Ff5~FHUtPhEeY7(PfqFbm*i~@&Iy}|McyRt_O zxBJ*AxCvAHQj-|99API=7FT-i48*n=V|+;GNz z2b0oFw}45<{z@QfIAig4(KrWsnY|DqjVokS2o5kN@8MW zko_pN%R0Q?EGfJG{a9u{N4LP`$**|#8#CQDmoz1{_U z;DI$WMDg;%L|Yqh6VXt$wIS^uOIurzniPMXyQ*8?B88N|3ouzuHo`7T+O~{LR^K*R z&Q~HS+!S(tf{|jl#qxV{4&J8Twv1Xr4qk@YhLK9=MN>=PR@%1Fwx=w|tl`uWwmFIY zwr6ej+g^)q30%5p=qhKuZJdM_ux&7I#}R2<@n*&+h1*hNKx^A{lB@(?1dSbq5K7|J zj(DQc(5A5iKN3JmVH!JHQqA*sLZTjGJK7S6c;~F{dQ8XzLIHdbiF;60(JLg`+^ix&u^2vc(=c4kzugkHblO z@{hyCV6MxRh<+KypTN1L%elY12k)GO z{oOtLv~jS|o-asCLgZ;xP=@a9A=KhWab!T zGRNR&5iT;vkX+^%n#LT%hB3$R4$Ltk4&g3yjB3anql+S(XO5)3%#l2sImSR9PMA5y zz0MrtDqXLeL?-H*-vF#vB<)n>K+troYD=GoE9P znWdRy)@#f$yEp>$2T#VD$gvLv+w0A$p&_{7uB9e0Ns9I5_`dg@a$#L3*avaRM=QC( zH>#=M=+80sehk`XuxmF7|EuO%?Ahqelzi)efRQo7XZU@9-qk#Z@pqmj1>3V&PcE*+ zKe`bJ{4luZu#|b65*k-B173|sT0+0NVUzR2#?yl;7XdlP|tngbKPiD4j=7>r9L*rS?vm{;|tk+e@aD9xJ| z26dNsxvS}BCD^l?H^aNoyONM+IC7t0{JhYB^TM_b@V?Jtiem#UvKsgW! zDZ#g@d5?R)_61-7{dq3rB1Oo;-aGh=5!UG?QK3=`pX>`r3BJNoRbPYZzQ=QYB`wE% z%-vJ7l9}(hGCnu}^Fw6y)T}86-IR(q^nD|%`#R+MT7{t}0i9UJH#!168HVPuc%LTG zUHpGauwymfR^Lv4BT^2_eJs}Z1x0xEUy4=^KlV<_{pN23<*rIq{f|}m$K?9(xL)8C z%K0mo@#7%c0;f>U_Ytb^Wa<$X@2`u(GEXYOPSyO~{O{w-Xi!)SD$GBEB2*ZDLpRD2 zqA-8Z|Amy`&p=^YtNWMa`sYCUoN!@#%J{cYR1{W-m-QLSIvg(R?P~s8{=0a+6lG!K zki}}HDMDr8E3Tu;O6`Kg7Ft7XxRjtZm8xo8t81_3YRxUjLP#a6YkkUS?@?5gH6E#5 zQa@qwS|Z9y?VhI~?hIlHmSbZo(s4U%s&v04Y zrOXq!#PCNY>ZT4$>LIDBzPY--Fjt?6A}~83cKWU|dNxHxiE-Uy>^oBrquj$%z9=Qw zrJ8;#rCbVs=D&o}VpEz>gi24rxRGBv??t@Rw@B%lvP?=y=`K}GnNmGvaBfOp%dx1t zC_E*lOo~cTQMm6g3d`kfJ9R&cPgy{Pi?~#cITr0iFT+?ipI0P4M>EHQhY=y55fAgBuKVj!?m&!DLq5RS|!Rm%d3d zI9N(_RisbXI5{{hI0m^j@TWX#XV#$1k#cZ&a4hob;!n|Eu`}!PJ15A&5y5fDZHhld zr*Gika`E_t+z;j8$l!S7w!)u6Z*B5S>>na?k{lcroPf+X@TbuGnmqFjo;g_#jt)*l zW=U7c{NHOK0ESI&E=ZVy@z}*7u96stVhIcr;8$AsXE{(m$@nFocr#uEOoTDoRWkqg zS(YgD`z%WyX83)U$<=WKza{+JEa4cL7UHOF<2h1|#l$iFwPePetYYTpl#zK6gW;0q z2otClpp6{t7yJMW#;6}EdMi>}wAL_BqdKAX2L}WPvFi9;7gf<)-wSu+3#NH-VfbbyRcDT+Wtn5K1Qlr@!YAVRN9{+|6Kc>k zl4FAI8m?Qef7RMCdK<)1KH85g2fe`*RzoeM7IG=>+GI*M)WYx)bo;aApf8w;+|p`k zXy4Y(EzNUtsOfYLasA6{ z8ek|(HBF!4nx@PAns!5Zs_B38YkKMLRMSiEP)*~P&8SG+V%M~YApr^&tm$_Dsp(~K zN0#*i6g7?i)j%u>25pJY5j>UR_(#T_s<)4$Yv5vn8F8)>uF|eoV)PD(3*$QE;Pl{J z7U!ypKSh6o43vS+S(QHhAIZTP!FkB7g+E1q)6T8Mb9c+ZnZfzUZG=BXr?1cA_rgoZ zy?f-~tl$FVHp8Ey(>G`F+-5v?pB$VWT!`G#uF_GaN6`_}XZZKS^vgKJRhpX~U{E2` z(`VT9beV7Z3{WG}m(Dl+@C8>Qd%HBTr4x-)62i7+X-BP*f)?YPv?a z#%RYY>zxsY26)(%l7p*)+gVLlx@)@BPN*dZGlM&jw86DiieY#z;v`ORb#N!EsXEl+ zlJ6$#E=9dfUA&k5@;zW{f*%34$So^6eZy981v<|b`t*My2iFF7v6}8mZl9ue31_;W z;h6{J;JV;$WG?b3ir&@E+{QBx%farica6V#4|7O%wuve zE4ZK4^tJVkRP-LUjbsw#Qav67_1MJn8mx3?Iz39fxNA5eYh4>L=t zuK*H5mCmCi9*yM%xv*MG3a-jkYgvv}wF|3Fq~Pj2wFx3k3#+e4!OZjOD~NP0qLvNM z3eW*Qt*O4H_EWu3q%_(=M{07hP)Z%b)2Lb6{XiWhRa3pOaq1|&Pcl;{JJrctXSB^Y z)s1%SShWO!TD<5FHJKxmF~>p9;1CHSP}Tmu*jy~cg3 zelE;)X2|@yKiwJ={GyintonjJj_H7*Ys|n9Aj!dF!4tu+YN>-&_*VE%9chL`il^C8 zZY^~J{%+&uSk(}pu=Gq!x0wDxub7N>EJj5kL0L}(!&5LNeN6GGxk!9bAJi)*)S0Rf zJ&;Bab%Hdrbu9KyRCsfl88Lcdo{G)N%*Fbk^J*?Gwqo*evX*++-NWq%e;p2jn?!PR zx+lB+(1iX`DG-_9R;Ai*RSBN1FwV6H)rTk!* z;(3@Sq7)B3gYPZHQ_1t3l;Ei@C3%`AGf%@@PaVkLpbzgQEu6nF8C1=|-Fyu5ZOQXxT8=dVeFSokJAKFX5mZ|8co>sar`>cM75uEC#GJ%@zVctYJchDV_9sjUI?Y1%+pKYBk#Np zgRT7qy2O&YBtV3P^Jg4^PG@WBjW7orL*ggkxBD6+mvGfzY_!-L^J%`8D5K&9#f zocaKLB5~G7SdMic6yU64bjrkv&}w+3t5XrMVzc&ngbmEG?iGZk5L^g>Nwp9=0(3ik z9;5^w#|4dLd8{^pkQx&_U)xp6^{9F`M*k3TC<~VrUe))(pIL3!T>L5eBp4`o9$wX4 z`t;|@!HdDmthV}?`WSL2hjZ1(ciZ1iLDy%ed zuj+Kh_CEw)!BVn~331-&Ya+xJXe)??jnLsLM-Q=~Rxuff{a z@JW+kSRQfwBg8aH z>HkR%-V8D1_Qs#$nrr9w=DC;U;H{8^+zt3sbg!L@?_a>ZzsSMcp%~uC_@}5fewklu*F~*OIh$W=8^=(sZB$Wfp~CSjEG1lP z;TW0s-dfZDQ)?U7F~>&k^~QuAidRRd$?lyodP<}wV&zcr(8DYqzGbDbtwRstK~xFP z*@yhs%99bpM zc89`FXyI8!NjaW|3$*1>IaY@%GJ1wU69X3-J3Jx!7ZVeDq7Itsz_h=Zjwb^(a=0fk za;QS66076d<2ozpCRNrcCWk79DuT01SUj)y@ zJR$Q`=2g~0-K_o+gQu*z)2Z&%1BvQ!4!aY2iY2Id?1kp_-EXltcNaaRgsRtZ>+S%l z#dN%!!eZU?d4v*p`IyEqskM7W75Bzc?v2UJz1rzsov(s>AD8{lJu0|Ab^k3v1^02M z`#4l^|IA@`p~4GFs74)+!&B6EnhKptg?b+45g5Z$krIV5JTzw6juuzO)6jQXYUz2V zmFF3_I-VDuo);skpprvQ+0#Mx^hxye;lNo$D)>U%Ib0FWrX)Jbbz6*Y_#i z_rByyO7y|$LFso{3*Y-p2ujcOrA7%_B?MuTiywYleXk%T6j#T0)^|bQL{&76>dp5n zkD%Usf92PkpL$_|dhL^y!oBy)pznkd4%hOPA_|9ft zZ(5mLt+?gL{#ewT7LV&M6E*A!qTWv3OBfA6>wxd0P1HnlLcM8dEv+>;t=br;HYUH` zwCUP0syA)1Q(Fvmv~3Y}T4<;BhTPoRm0ay&e(8EFFJ0$9@o?XI)0;_p`$WAx$)bAG zn~8eU2j%MUhHV-;)~Z2+EPDTXt64|is_#tQPE|CW>PQbsYQ>wyNDb2(UG(4rWW-qi(8B{7I39^PcQ-(!KN=)$!*gYdnN-*U- zw{FUU+!RbXb3PPxn}Xeg96d2*FYguqY0Rxtekzr66@~obO!+0hkW>e^^}WMcYVp(_ zypYrixv7ul7m|u?FBFpc0x#r0U9UxIztn7T-{{=bAyN0C*U^15_67IS!%n!`H z++gO!TrIIx|3^SE@}%3Ji-M9 zo+Lr{8{=x%3A75dP2*$SOtO679Ug(@13mLC9~g446|h8Lm#`i6guoH>gut(*0yiP;PiNrId}(P#1?(Pa zX^*6J=9JT_rwl(c=+BH}LYhr0R=-_Ln8l=hEmcdq78{rLwGKBX?TRz)N`y~b z+Ml#2mUV$SHcvqKojI~sGDl7?=GguSbL=pfV<$GUKZ3K0<-CxyPTH-se}jEv^x49* z!^E+$9I79BmemP99Hi;X9P-HE#RV~ap++u;8ibl5w?eQ2a%uX)b1U%NJ94OD=sD!p z2x2EqpJ(TahrT3-8ik%mZi8S0Epivyxovs5|Hz@Hp%;+bIoKJwi|pLaJol~~dOGwXtCRL`TGSp36&-Qqotgso z^i>W?<9jRwhLO-z`KNH@`DMN$x>f)M4F1YeY!#{H6Ut@LA!?-I?XFVj}4p)(= zbxye08Ljx*<`R+_6KYl0wac|%{f+7Uc->=h5^I~G)}c0`c6D91)flEPg&mO$%e+~a zw!T!90B`$A{)r;gYG^L{QVt@Mw}J$6+^b2U*12jm%dvZC5w(ysjTSG+ARX$e4b_*` zUl7xmVPeq8ZsqXjDG_Tu>HvJgwL{95?Z>U{MVDM4LID=zA0 zxbv%>>T01&s13x^qL2D1RM?ZJp1{WuzGAwYo-45=UO1Ht=Xaa74T~ka=Q4-Y6lDlw z!@w5i|GTjQW6^U1^MAzgj|}}5)(%(<8QKebOhGG|^Ak7hN&qlj>g;rxSaZ1~>8o%j zQ6veD(7R5C=|229taXR~!DgM2hc?6_%j2OgPS+OKcGve1re^{e>-vl$RD=utlj)eL zcpEYpoECMVytNnMDj{M*?>W^wZppo;vc3j!UN}9fI+FrDo$i+IR_?yw80+rs?n^i0 zAF{D#N=mp}Hfey-n| zqN2(&PkA$-<(}6OX5kJ=8WrlLuVqg6QC@gwNnaWbYV=Tx6?*D_o9;?xM= z*R$%8Fc=^v)Vm&*zMgRZ6QgfN9L&&6Fkto#C9-<1hWJzTEmY0Du?hv^q23w>`F^26 z$bB7uik@xfzRq)t%Ax+D!N~23KSkea=XT|}#pKX{&=BM%;!n|Y>|C@ENG>6V28MmFrm7-)d7XDM}WSFnYyErPTOD z6~|CuxnfwEyI0nTdg^oPE9y*=wUcCFq$E#@{@Hp_5@hv+EHhCZFKWT52Je+MvYt9m zU9SF4vOdE7v1+#ZJC_tC3rUc*6S6KQs$X$gMV;!8_sSYoPra`G>uyA{c9AT15qG14 zvJ%|Iq^I0fFc=hbx{K-CN!`#en%KCjIo;KCIy`nNG?FQy(e>QVU}VBB0n=%`iFLPi zqlWmuFv$dW2MFtndpkJY9rT_2-Vt2b0H=F^PUk>Rg@!{|Qa$$sx5sUfFbg7L-61!9 z(!YqX3 zJ{@62G_N?_S0b7*$3CpU?Qe>J&b|LAbA0>+LVtuT=J*61_LFu9vmqUiZL~L>G5q8( zx;)mPKS4Gi!d1eOyF8gK)r;xhgR>zYjiJGB*7u!qW5T!}_i+t{xWqYBtmN zLJq9(1^qvx9TxE>ht!a_zH6#$4t6N9m5Il_9GVhxhkW&2OI&$Sg32R-aPelbSbCYpONz)OT=wVQICd zQ>`f!2&t^9TC=2DGf%CFLVt``Yhr*`8Gd&ul=mZgP3DQDm+wD%nJVU{P1LC>mf)iF;!BL&FkG*xCDo~UDyCltr^KsM zNw0ZjL^Q0|$6T*90Q8IKmGK7GE2X}=Lp_4yL(uCJ=tW&X*y}5vh_O?p5lcTH944Ac zXm4V1-yL3jRByYT(9zA15T&CV&tck}M&*%?ZdTIG&b#5m9;z1aX3)`Hw2X+-%0osw z{gW6Llk0vAI{uUAt`1xgs2X0Q3%a{a!x2;!{`$V1_ z&gS8s@$M6(*V!^68rJI&*9$Y~!>>g2nkMuz>w987WjybbUWehW$hKad8axqtdC2=N zU@uQ&&->8J)6CN>S}#vCr>9xIUY=$pJ47hs z-!(j$PETf(j+rGrndd#3mgCbo@t#c5adR0F4L7?_so8mU128(z^9eqtL^Zn=-7?ZaBAoc8?eeSx(24Cl27XJkfi6Qop)m@#7$*DF}x`-=B%?{w1ZD2^Jv8qw>0 zo=AEP{EuG4ywgdqByUmyy^@^Xq$s_TN_vy>yjb8law^`NM0!mwBcfrwj&i*W0Cwc- z^)A;dRNp(tyT(T*(LaY?b0d1~=82>iJ$!U*h+rBPw%2iAA=2x#_jCchPCLD)qx3pm z(tA43d)jh*HZBAnTXm-B3 zJP~^N8sBR#-*dkH(974-hv#2@Q}eZS`da4eceMVe&!F9W+>hSm0uqNKbKhTdB zluz3~(CHtTPuoARq<>%;|3J|GrwC5b4+L@lNIO9c?Z=9+BDwxFK-_u$x%fys@85`z zIT!r<@v-82|4DpgUG!hZ$L>ph9AiKF=?~h&`1q=fRuvx?3Nx4t8-Cca0qF+@ zpPMwJzV@{Cy7n0{{00X=aPm)7wKk9^VuaDgA(KDMt~1Sx>jI;oW@w**zm~40NAuUx zomzT6e=WVFmVRDKw;Z4U6R)L%y*9Uuh=xa)Z)k+kJ_6uWp0*Dk=RpMzw%~Q5(=DS1 zS9e-{?U;5!Pb77}g}SI{p|1W2PejYq%iXJ@URh6sih2#bMzo504JVQ!&tAPoNxep% zUc+*Hu`ph*0TuQ7WkfXGGQXvksrLfF8)=yty|`Y}>+8exDLQXt-{H*4@Q7YPo=AGp z>UROt>GSargkDRr)DzWo^#3F5yaS^s-nf53aumT6J;a70ii!uv38J8)bOND<5=sII z5K2M|E%X{nE}-#;ch z<=MN>_nFz5+1c4kh80;VSB5Df!x@pGc%JBBiO3+XT(d|@uAi9;o%4yND%V2h+G30N zPsFcwOjivNzkrLji}SoC;wEPj*WH?2b`QG^T=qJ4^h|1#w%4)R>!@7zIwpG^r@aoo z_8W`64!G=%%pxhda6jj9)((fBC{no=Ggq7qFE;eFXA#%09>I1z@e^G30L}!LeIgZ} z)m&=!P#2GmRTyd7jA>fJ}Z5Bz%b&k1a!Cf*^_eO1GiT&y zisyGWOXO$7^`%)PCD(c8a>Agon=2M?x?tjzXp8)JUEOtq>8me->$Zz)-3y!vu64~& zsPoslx7G~?*Sgm0FxOML*0r{-YprsvYi(NB+PSVZzV@hPU2AZy`@k%clItRIt;2@D z?{eH+j%Cc1WLr0U-Q*2ikC!}x*I`XZ)Z@DOoLRqq{dG|U{TuashIP9sE=HkspHuwz z02oKP}b-cd8vVI+$uzs^ELyTsZ>Kp2xU61{; zr+PToAHrc!^?J-kPWhi({|63}&u{R+Va|mOO>kI#af20y^_Mn$fl(}( zMk2DO9t~@FRD`kM|1+$S6hFsZ_VqT~h7}uPHvB;v|MUpn;BK26vN;oNU_${4m#xsW z%?)K6{(u8EC>s>512!nu4T|c34T@=l;@qGpo~OUGY)~M7!!ff+$~J&?9*?sd&ch&I zZ3EbJg|?Y&+i)|gc9bu1-2m6$t~L<$0%w9Nsu^)bYPh1_it+_lRO={R+l*>$jncHu zsMe;a*3Kxj&F{xsqNr^~eP9+z$#sLcqWZyrp4FnNXl%v47;vT7qWq$!Mja)tzwi_c zuaJqh8MT@-iEI61T#l%t#Fc>GEY~!cs03?Ng6glR1XEOkGb#aJd*2e3KwKGSk(6A2 zF;^7~oGRC9=1R3ieHHb~M%qFXaT8qsadZ92nZ)()V_Xk6TEMlj_Qu*;u8p;=*#7Mv zTQ}A=ZLICwSX=S@!C~208(bToGK-|-x=CCcUxUGXmFqZjrP(&xHg?%$B(A^lhz<|Z zgugZp<;>c6Z;9_Hc?M&^du%Wi*Yd`V6u-swOZRHJ8Rf?OO-4d5*;t}OFR^Yc(V&-@ zHkO>wKG?SZPU6< zNt@2lSKkH~?ONmc%%+{3NnAAR*IhfCiZ`7hu8K`q#8o@BO%>Kn6&kJz)20gNrV4PS zST}!(5rRP0me!MF$br9dKcKAh@ENa3;8-U#ZCz-6A>& zT+xHte{MYlJLq~y9oT+w)g_9xB!4{N=+rnlRo zgQFKl(-be_u19cmh?{FGXA)N$6=JiP`wla@F#0ZWl|`57xXP^2Wg4zBQ*@a#x(r|Y zjU~E_xIQ8~=zgdpCJ1_F6Q95W||x}cbaF$=Z0F$=9R3su~hg{GK==VBHro@bU?Vip27W|dha zpAgr}eR^malMI7?&X^n=MpVaOQhkON1D~Mpb6qTc4y=8{xjSt!U&Z|5_@3AvK!m$v zin+|0=l~oja}DMWT2PI6$c}cl&sD&HWSlpohvc?&U`_^A#fXZJ=U*;DpZVY$ZV!w_(ySW8X z)CMkAazsOq{ev^fjsKuf*I~up-`oO-n`>>ZrFG-xTGq|ARK(4-Oq**tH`h`;e;s7m zTnmVs8<<5>y0JF7aq~+spsJP~X*Rnt+qU_g%^z*XEYD!~^a$Q;adB-Pz?tCMOcO;N z*Jl6C>xgR{{t<&^=5fR|)hv>d%agg#E`R-x%C(ER za%`J7ZBE-#NnA#7xnD@xT+ErCo}QaOQ@J+(fH`EpW>S8)&* zlVUMYZE3fq5<0eY#5+719a}nDw{%o>Z0Ts)((%HUj*92me9M-O(6ObPStLEV$FLhc z4W4JWjDf)f=N7DppPgB~WgZSo&TUzbgZ=!LbR0HABR1nv|FL-@(Yb=3Bc3(q+O~YQ z<=eQROgKnh(V#m_<@vQ}yVYirWM7pPX@+ z+Bh!(6N^B?cYcmU#@%C!I}~?1{x!m_58T5pf5lzmOtjrNn)U12ZrnfduMy(CxO+Op zd)Byn8pM01xO>jHdqB*z#N7j8yr)?tW!tS!Z8sh_E!B3l?WQwVzAgUE_z&Xk#DzB% z;@@&{#rNe*aK+Odsg5gtWV{_*@d5DxTCVs2YkYvp6(3-V4{*j~?de=6OMC!v1)D`u zay`jh%V5x4<=W0%du{Pi@hS2D5?2FoVaKKDgW^j#lenrL<2n@oFL51@Kd$3CZjC># z;W}=LKkke_j;}psi9b$Ur_3TLxf(FnH5in+xnl9kC&teLTm1cmh6%%ot0A}^xVREt z;Y@HPP{*nBS3;|V;owSWo6uIvmC)9j&{pM2XlqJn>r7~?c%GkXNoWhMgpbW4DY+UF zR|4)c&-=K!9L3C4XiM-$%@z9|a~0VV4kvuSm7eO^p9UA6 zHHvynIM11wZzTMwa&4u{+}`<);i=t(5-^;-_W5vbF10dh)l`Ypa)* zeXEystCz~Y)yuTi>-<(Puph8&^#c1=AG1h``G);zns01HBfYS~xpgWI8>+Wr!gV3x z+*Wk<7q&x?=8j|6DMIjzZO`J0ZCewz?%sNp*suq4tNYR5*8QA`e9_lz{cP)1f<3ww zvq!ZP+Hj3Ag8vq;Kj*O;1JVlE8aFNylac3`ejTjIgQ?~=UftDghc z=WfSbYXF{zO$sZn(j9%ua4%#zdy zj7cwP)(-c>X@hl5~~0Zka_=ay?I6+n#_yXE&E)A9GdMwmq}$^=%u7 z>jnJ(`e$AK+SZ*j!L^O*UdOe~XWIsFZ5zIAxRz_%aO<|=D%ZB*rftKW+lJ$7Z(6nu z2iLZ-W|5R!FECd)3}|bp^j8RTRob@2Y|Geog}7b>m&47K!O2I+;&9qyc}uSc7(W2m_<@@y~tcY!C;1)%kdd=RoS-vne375 zLtp(exNf+(lAq;Fa3#M;g-tbF$*(8-fGfFWa!V~&a!YG+OO-3Rr75|kGr6VWdF6FW za!YU}w=;{RZoJm~Q9^?8ug|^Ei-%Y-&^VeN#@?DL;?wXSCI+O1zo>vE3lJ9~m zrM6ilCD*IOmGTA*I;dQynd^WprCmz*6x;+F?9DuaQ`~!GQU-7)xKij2$o`t99#eu+ zV!)LWk`kijN(r&1gs5C8A*PfNXG#dZ_KGDXgt+FIMN)D#W3J^e_(tXWin%_srNpIV zrP8vZy*aqzUH(cr$eF}NcfY!NOgWKCYlbP`r+lyD`rexIy@u<1Q_AxKjI=MN)FTPF$&@U_e8r=qDU!nd@^~ zYH;ep)WgK}2DscyT&e3glenmob^c0CNIgtkDXA$st`uu(iiRu2l$zp9O~Ka|SW;7n zYnNFhCD$9wg*C%J;#96`<~n3cJ)U|djk->I3vhkus>jqDoQYvG^|s2DMt7|CH(_*2 z&NI?XX*6u6HBM`+WlU>qO>3+&rZqODHLgx;tax7cwWKu$W7?}`k(9$`i&_{q)37n- zy3LvPF%BOCRo+zXI_2lU_IXUk58KiPrUjHnuVKZ$$X972E85O?GmqXfS zinr8U8fn|p=&4>>c3QR$H`|()t-;MUrDa#AWh!#CEfc+idx*zbRzrvYVKumu}#ZB+7;--(LI2JtID~Rb+ z)A6oW`}A4qv$W{xv#jZ}RP^*&ru13o((xSh&jXh9SwK%;Y!*qef@pt-RuI!2FxcQs z&%hy}I=v7Fn)vb(6n!TJKgU&8anzQ6B>jgBzLRa`5uAS1)ke~P<4m;O^y{G2wcYev z8FVL`en0)bj`qGa{l13wzA62_GaZ-mjp>&3`=HG*nnhB!-B#3gGjJz+V~E;zuQAsb zwv0D3KFHvkoYo$}8SXpTjNY6Hu8e^-xiWk+!oii{pW(0N%J8>l_^VtQ{-z9nXNJGx z`BxoFhCgvlG>fFY}hN2ka3AB5HApA*j@h0$mUGqDtL^mEaMV! zDH)26OR;7s8ZO0@p*S-Xa3xzZ=#gH=F|$ZYE-Q2W3s~hPX0^!Qf@pUt(eBOIv18=G@Fo;<9-JXHIZ)E$2++i}`P6cxEQC*fX(up<%IG zGwm7{yD8ItHq(x;I%vtX6N|$vlJcI$MxPjnn<~dY?3k}?nY%K}Gx?U_T>$KM103Z{ za?IB_Memr?nY7_E^Gqh5^JrksSToOPV9uB_&p0#BD4u^0v}B$kn2TnSl#Y3q9rHH~ z=vkK>G#)b7e{9>I*lylF248J&>k+)&z2S3v3(f@B_Et5ywzu0p23*@aZr3dvZtrN_ zu30wR-qEzZqjNi!4gdblvYnOC?%+od zVt>F6-1p;|3iXIP=(}}$0(Q*XITEsWEZMO{TOB)=Sa&Q@t7FF!(~c$P9ZM9?e}2Ud zw;f9$e8*Z>2AuEcXKzP4+;(h*Nsx2LUK~QJcO1rH@wpwCYX1{)e#aj;#9r808;8`3 zJ72;f=h99*`ueBTyz>JbKF68{?{NEnYz3e`mbU@iW|w|r+c{?Ej4Yb^+TZgC-WlL> z>CRQ0i52CYn@F>`AKbZ<;=-jnX$eSf6x?~5KA=7OXeVYN(p}>6*?Bu_DO|Mk;ZC%4 zwZ-myXx;fxbEhf8%mB}pmge@yPD>myE5x?&doVCg&IV+zt(Ymwt zp-^|#W$n+p1r1q;vJPoAWF4|*9a1%99WrGda%N#e$G?XyS%*l&*JhEFts8INc%03` zz39L6s=B=Da+&L-E$iN{2D{mlAAsw=i)+`LoQc-G3#)prs@T<=;$r{iu5lDU#jSf6 zp7Xh?WfxbS*uS|86A#z^&0Pm6E~;@Cx)Im@&0RFX5iMO*-LCt)PebT=w>W>fN}=Z;v{+ z8~Z+QPdvYSJ`S@k?8X+)+e$+JaCD(_{bq5BARjyjhb=sCwH|K?%;pDH6Jc4tuiC6e5=MByT zSB|A7S5Dg;S_{wVkkdiSmD9nR(?R9R>0rv~;LO3h^Y`Xkayo!3r>j{cCD%v9mD3*v zqgAfj%=Nu3$3JIU&R4|sF}U1o;W-hUNnCj5qp!!DEjhF&I43D5Nyn9B%}LU5C7E)P zoHOoFwAfVHQcr^)YiD1lKK<%g9_m*m6$hoXdTmxH^H$y%9L)HfIvoqncc~ z#@zS8mD?bdE8Wdi!I{KGU8cP=k8q-I z%>5>pHiG1y&PA84w)@=E*4)z?uG6O6)6QIMGuf{h@L_ z&s;y-@=oMc@0mkf-N1Fy&2@t_ao?NAhP+47 z)q5u3unqLM@8t(Qa*cimtN6vXXThGxJvhdo&g@T+alPkXNBcS5ecCji{T zX1;+lQN8(fP^cR=^PkG^1ekntzF7;CZ?@)Z-c-sroAS-hd^2Evv*gp8O8Kwg3`)xC z?Mc;}-wrwI{6F>?<~nQ3@0ve2e>-vY@(9lF=5kE_B+ewR>5p;E&EHO3i}DxgxE5LS z7pYFlUu4Q(s}LaUC7rBoB0>4`I=!f|AHz1f;0buVyyMNC7*`P{Oe|slw4lKwbv6| z4^*!4%vEjMYu?*p?@Z$A?Ge1Uv5RZ(2b>A6y`R+N+S_CAOmOY>-iyUKwforXZQbjw z`fIPZX|K0)uQ#~%SoV5@Ywu9ANJ_5W%ryxHv2HHM7tD3ewl{3=+PzqeHQ4)rYo42H zD`yf{+GAWoCSjl(!pEc zTi~nZE%3D#_^P}GzNP}-a|OP@xos)%1#dy1StMom;Z5B~!5kPIau%$_;Y4-8CLDeS zy;wGrlVQKuH(135TfxqP(!$!LqOV7AL6*zA1;;oO-YqzRLfzF{@Izs3qWz`d7ai>{ z)`DL&w7-}NesLE3q8Mv$w-o$Bw7;1}QhK*9dAHy$3?fzUzR6q{ZH4s;Uo52Y-Hw;B z3$bNgOyUY#aVEG5+tuVM{IGB$xC%QLcGhwgcD5FFR=Em0n+iKS3p*=D&rd9cv_xLm z$1IYPs~>R{`olnd|1tJs=DK7noKm>BP$91V;F{{@vU4VJ(S4N8Uxjgnw5O+VTj4ex z*EVb6HVxM{Q{gse;Wm8jX-nZY;@W8zNy*ipxr$++dH?YcbNyy3JXCnPh?hSHfXls+ zr|=SI5*OWS>$(0ZqUF!Rdxg4gQ7rB=|i+Xb=xQZTI{w(q>qUFyb{~~{_zl!{= zMVjT$B7aknzq1I{RL5v3qUFz`iDr?MTmzYF0k~-4TlT`;nCr5wD55B#=qAt zKa2KqCUKS4^jDEmbd$Ia7ai7d9kv!7R_n3ou&L;XP?fhh)KnaLt~gXN*6nX84h3)VLbFK9Ud4xcmEu?!yyPs#pjP*- z>f#+Zw0pc)@nRKMZN*CQiIQdnH^d{j_<&o*dCr7)i?5(i*BXoeDrrWvw~KGJeN* zGdtcZUDA&;!BsM(CRfR*lJ(#!2`mZJa+L&HO9EA{l0Z{QptB@UG1hZfN&<;1#4M7M zYbbM}Q?93Z|6wh2{b4JKE=e!>i@1h?E5^-L%$dYh`54#dCG?c2r9jJbY;K_ho-j4fua>$Z}A_to9U3x2-faz7f{ zXXZ?_#(ghfeVf<;^7rrmH zl;G^cJ%abS*YNh`awe%L(5O&|Tr6SkJ4tb!iZi8el8Wkm)jAc`)_v8g*Y{PM_En$T zSFISIOtb8(CKXrBA}Li2Cl#ee7)*DTHpF3Jb?FN@ta)6857)&FTdAe=P*U~dEXzwh&fkT(- z(g!&7J6DG3dxH_@%ihF+=Eh?66~FF5bVS897aPW!|FV^RQZ}GWA!I*~;4=5pS6Luu z;z?@RB+?*it876{J!Ro#H1d|&%XAN8%IwxM&BK^7yQ$1xU1nE|4F_7v=wVEm!z_|C zYGAqDuNEHsmZ8sU*wR^6fCD`S(L6~V%D6XeWrxa6mw!sQ{=jt)!ezg6CgJ{xLfP$= zJ*bIWUZV*Dc|&V?L)HD|4Nc_@tIN@78a}d=Hw12Z6SGK4Tz|qXx4_^B zXL(y3&g*bv1@7Or^6uqB%P}W0*hhN=m-leBsPZ7rM6XjmMa2~})$&>8+X!)f`FtJX zd~5l94dQ%L`Fv;je8u=wnx%X`A+9uwr0jJ@Q?FC*fC065c$ppn`m!7Uv6ZKn7goGS zTw}nM;pRHXnYdod(dD_^SWdSF@)|9_i1^kQaB?U#394rdj& zY!w|V`czN{Vh`{LuK3WUqQajup`v2Es-glzv`aexr!LY`1JFZiWpLnWEM%OB7jxogZqNBVjm7Ssw+Ojf$j!ts2IU2{(av z4xX!Ag2UGkMo%Pp&4jxc{GyAWLsZdiTji$8v?}Z)GuZLFZk6sgBr1zJ6IE16GclLA zqa;FfHI@IRxOQNuJYUt41YNGYtP^zETB&(;z4EfD^76UL%Zjm4xuud`U9bGxERwQ{ z#!?kk)q}xWXVud&V(DQ5>P0Ad!;Iu41)q_1ga{d_ynpL7vupvjREA5sv|nc zBi1U-w!^9;rm7?7s*WheXKPuiXxm}c3A0E_H;!jFo`Z_7omGG0@KbfwEga}I2=z{w zdL4&9tGH*|@45fE{i6s7{~Kz*(WPSl8=Q&WaK8nGx;g9qw)^RKy!Ln4-$6^ezk_wZ z=CQ&44yOGboclX~c8_I0JvP|i)hv>-H=Ibl;r>A|P}e_V-)64+w*3M7Llr~k3?iEZ zvOqW4QkiWu8u!y)b{_BlG3?JoTsGAG6%-fmtMC7YK4LO^d;cYhzrnSDPoV_>U2{g> zGxX_Dhr{y}vp`A$Dd>`+;Iygw`#cK7P;e=&Kp%pM;8ORgEQrb9ZVxOz5uhM#?#=AF3k{G1gV-y#srr35YoD|Md*fb zkEDf=v@Y#bXfwFWe({^ge%SX7!vb&TZTB4WT zr3A9OXkMnK6l8ZPLB-(&<8zxKyGx0XeE_mWrtG~#sP{(RmoV&2vQHx73y*cdve9!v zXa!yVKx7sifnHqJIS;gS;l{B;9>F194G4`CL-%J%&s1_qSF|&6bBFkgvgpYtpG3+A zBez4kb|KN?(KyQJ`j^XeNX@2{*a(8u21;F)mrU2~l)BxN!Oor+T$F7Ia1wzO^*xV)PM-o**V=j%Ob z;Pcq&-P)_!;?kS?q~S?8y<1Pk*kmM}-VJ?ylSy!Tw~2_%h10t&L?j$F*li;s(YW-w zr6ZDZ5s^|vaxWo*TgoOC^w~~Cj^P(35JhD*`Jo;~yBiR_Sf2)pC%NY63jMzY&G_u+ z*haM)Z9uJdN4L|xrDEve11H(1QLT2TpH$^rcEoWNa1pvcq`Y9{uGQ`%kdi;yfwHNT za{0XbN~B~rh%y?Q+#O+ewC|er(fts857$Tc<2d2CzCOAiM}2fZuC0&m$59{Mk6)xe zit&Yb)JFH?TpQg_k#9Itc7)SJN7(%$3~i{5?tdZj32LK9EkydFHhQ2_cwr=JqX%x9 zUYLa1=Tw0G>T!kC zT~UlLehydlxWcaL@ef=jGG%WuUGx?`UxHy6T-Ea}L{`C7JwHSw2CnMa7m-x8x6sa( z@Kfe!SGC}fp5qbbAnYS`q2!RBL8?P~u9QU>@)27LBYE|Tc@*-Z$bx0|j71bmCeuMCH3uePk(>tm=EnNsy^q1p?#Xs^5g z)m|eIc?+t&#v?+@B&urkO@5B=ShW$Vy}}UIB795GVWis2{d5oU1X;wFp;t1DYFvh1 z+sQ&G%SJT2hO%r@rr9x1DN>eAoY{);)wZN8TPQ0gWt=H5!!U6fdVK*ylX@ARWd1tD z{{zDBilO)W#6OSue^hJD>z*uP{@%4gD*ul@!8-X`Yn{Q~$!rsSU|_9U}8=+Rmzy23p7yP|HLg!9NqxnKk%l68}sc|4ibaN&GVvW3#=)KU458B7V-4{PQLM zIv7T|`5nvI|MiG}8$zC9=yQtr7cf8m7mRCq(EG3~;&H9_N%H>+d7bn=Pp2&8>jYLv zxcUmD-l4KZn6y;Ods5_i(`T{LK7$Y)q*vN!5R~@O{4x)vptR4R^YlkCzLp53edrf@ za2N%pB2$iQ3&gnA2T!VA8vx(*S%Zi_uAx53h=kxe?1N|2uhC-z%!1Xs9YXYTtYnAO zheP`O7vYLx@Qxw{i^(BW9pfw$(NKc(OTZ*Sn^1Y>i$|M8}W|2PbV3q+>uMiz^1#CtLf1K1D z1{Zj*K!k3D)NX{Dv11jheiEv^9SE5S_esJsQtch9s`jpsMcjk@r_wHzcIx`t074XN5BNB-!_uAf~C2izMyD_EW)!3qzZJ>zMz!&T`!cKr4Lvsn`hsf zlyc2V`%y!#;e>v;bLdCw)Hu9CL0_f)UV#((y`rtsey_j@{a(4iCm37wg%kR{!d2Su zZ8!m+f=u~z1FgdoBYnTF(0&6>=r;rrnho{C4OEMUXz=~8WYOX!T>Ska5ornk$mblw zN2uLX!dL6qS5LuL{n8N%6+{14BrcqM)h|PB2K^4nB5nr#z9h}AX3+0fN{PKCu2H|= zHL@2TxQUN~%e0NU-%awsO`QjBk_T>*jGKz_&Hm(po5BMR$OD`yn?bl}2K_Mzz1b8V z=#MG+n-+I7;DJ7xrI{eD|GNlX5sr|wRV1x{TUA>BA+m_2^`|><`)XO${X;3Wh8*VZ zjQcMmdzRLJHKMEa()zE4wEnBL()zE4wEn9h4JR1iY6)rmSF^PK8zD_(N@=U4G~DpM zd7Gpa;S8f&8c)U7v$Us4+Ls7FD~16ph;uDV`${7XwZKK(<@Ub|BlqIMfM+P>YT*M~ z(g%nZ?yAE99q4QpI^YvTKhX;v@Ck$t_(Usoz$Xwo;1je!oM3$W83-Nl2@4(I1)(BS zcDZXsmpcFxwzs~8&;e+?Z#m(k0qA?*x(>xp(D+CdA=>H&R^14y2dqJeL->iHBS`gt zwW{g?nX-tx+yU7zs?p^RC?E@=tQ67G8p=vZS*cE0DJd%@POLz@eU+4z3S|dL8E48a zH$rr|15Uv33+NCtA4e4PKSTVudI#K438sDI_h0q@^gvcVbCeijcO8q;aN{7Ad6_!f-rE!=2JQ zGxgFOEX_>PP9t1W41<0q>h&xQ|JlVY?V&8<`QD)VFml)0pk|c1Cxs5`L?5t0&i)4Z zP?^3)2L;e)vFt$;5S^fxJ!k@C51OErJ!k@C51N23A14?s>mYm31eQH$24ss&Ip13^ z=6i#1OKJHOvInIi(hnXRgjQ@Bg{yZE7S}A3;RrF`qf5}eurre#(ijdIM5o+T3_id! z*rUiHgU+cA@iEFGu4|u$WP~3q!lM@Czlu~1(LOE7o<;k#L9~rtv`-s|_R;KSrW8c` zv;hWAFt%C_(LQZhv`9*i1tCh(~4e_(99fuVrkDonokJAB7`GE zy@{mxV42!g*FNiI5%(}Y4j9$wVSKidg%Fd9Xle~HsU#**n{PRf_ zVs?`l&XhgOCeg$ARKk#kJrC|7V*{DL3GriG@WHq+_+{dcW`51M;B!G13I419qcU!h zh2TeboGJOE1^-}-->ucXaSqDiKj0rcRPc`hzsQvQF_M1@40pTz@5o{Qzd-y;5TX!%A$|w*z> zBEg>pqZ;jJ@E)=d{KbeC*WfQE{$d?}G4U4@f3ae0vw`@F1;0Z4oGJMolK(pxhPe4- z$1?wm#E(v3@ZXAINEhOdW&ZOj{}7`rV*ViwALk!}uN=~a`G>rS=!<&(Auob|$ctM3 zAuob|$cx~|2}T>W{~<3j|ByH6!#Gp&#|r)-AHYy;|Bl_v{}T9z^hEGg48xdzGw~1U zrQx3}i}0QzO6HQtEwVozvYt|Lu2d$a;$5jKN+q~bXDPK+c4l%4W%A`sIJE!NJ3-MEc>ghhbIc-BESv@k%|?s0*&)f`^PvV@aob)~;Exa>qt+q7{TMO?D zTMNlJ!Pu78KZdPk-wcZ;e$F%q-z3vF1=1@e`3%{VAP*s&Rt&ytP-ahI$ir#_8uq&^ z;=z6x?rvO*gUGLqlzZs+May@MbSP_w6g31*)%$j$&th@D-4N}j7w6jz;(WVl#rbxF zINxrlE1Y0#NB94}-B_G2RgTD%gMEq^?0o}a*a{Wzi%lx+K19X)Vw&B~3l;B+jVkSE zX#j)0`oKceS`s_t6*$Cq9YPYqWhk(xl0$sgs}AwamPOnn_!g+5U3KVNNftupK|~MM zka>_~9@NP^NHPx+G}`8S0VMOFkogtK3KF_h%S(a`$MCOy+-;_^&I5;RXbZ z1O|H=^Z%*x4}Vq`G5>H)rMdWrzd;tvKl~j;-_i3Ae+T@--_i09e+T@--vK{PFt%?7 z{^9R1|M2&~FES;6n&2Pq1%CD27ze*(72OQ{!$%^7AXF27I`I!5rQu&Di+Hj%oLa5B z2@a2cyf%iXlf6)rg=kg{HCd!4OQ$A_)MTOM49|j^KS)iMP*Xr^I8#ox(#2$JIM%M) zSCalyh#W_?sFSVOUR*V=ku>xy!*45w5p*HiGgun_Yl3UA98pIW@lEUq>R8>llHS31>i9|;Ut8Na}BQg+*6vN0i z1ihV9k05lp?l$6cS;Q4O;y4+Jn*`W7DbUB=5B8JJe}v9Qq?0pcg>DxWIuaAM4>myONUTSFkm#;ZfcV9J#L`}ew2|*2^gwt( zoI6R{$o8tVkppBAcb+5tVB}tv7&)6x!D~Q#n=mqpQoC3v&PgRp{hiXtJo+q_J(8SR zq?bLi2(m{OX=RTrg6xq+=jo4P>`)BZBa2w}$o-HlGG*tvQ*@pqaXZvuGRgh{kuZ2{ zheM2{M!6+LPcM2{K;a-3l7NY8&qjbhQG zf*@LC%DUby>Uz{F7%qV5QP_mhksbt#in!+bxR(|6Ul?xYO_}B@4m7AJP3a`1ce4ey#ug_7nep;@=Of z+r+#V5c*@Nm%X`V9-zI*l{=167pW3;75A$DE`Td`gMa=Kt_;G&! zm&t{9Q^*xwfz3g!SCN3{5Zk*@jmeTH)nqTR^S(zl7Elj_wNG3Se1Vw z`@bdl{RbihB5JyZNWm*+Sb6 zM0eECwu7|o&}rL2+IFC4^53BtJ2^<(4xtTiF3U_gc;$=1%U^*Z-S_%qxb8Hr8WG$V zb_#`BF?h+2&ChX^Rlh^3FCzS_7)FPagaTH5Nv*Zf_$n^q4sG;HFmeylqu-`e^nJkS z56PZ&j_!oGClB0@0z3#?1E< zZ|EF79gz``r_M(3UmmDKut3`A2!sU1Fs2r97Lv5l?$`4WPnShP+AcDBjXMOCDU`D4 z`s&fg$zDi10TZl?Y8O&QpCD-`v{g9z1W7wV(y)U3sV_-8A*B68(l}E}E0ogk&h@8n zlC-}OdCx74`fA75EUgu!jj4n1Ji>h9EFx)R>Z-LihD@l4ueC8BkdYXM41UP`1f^Zc zg2jySLextyW{elajM2PJMJb3GLmO{!g0b@(5Hp6}s=~nsVnn9A){4ZnHYNmy9`0++ z@gwuMCb%UCQ3(Gfv|{Ghtg4Jjl0||)14cEjr!l!?A@~asEv&&`Nc@G`${15f{Ds6{ z2(0tOUnuyih@Uehf3f7p``Vr9Z7?y`IGoIHCH`L#{!|PBQ;ENX`Oj+n|40^bUlC9n zM(%B!0gXtF>xo;y>yK*-XiaCcwt#ksw$p11Xa{Wp?X=ng+Cf`DJMp7l!(3}0L!OcmcttXLlB8V8x06RBnfJ1KEqEHd4zSGW7Tb-I$$QkO2rV^ zo>cE6)d90q)d7jJNT}Ya(@ERqKMlqQ_hi_&I$P zyCCow?2j3A9ZcXcxFAsTMkb};g1}?v>5pRUM&n=LF?K=VcW{Bolr!K`F#`@nztU|A zTrk#%$O5=vEM`>Q*20Zr;frpY;S2GsKn@n{kJx?ek9XmZv7HeHAyEC=%gG;OyQuyc zJ6;y?r8{;q8NEpj%3afA=a2=<9J>(Fg?gD|7eeOPh1!}PyAU$RE+puMim^NG{}{WF zWsY41nIcnOy5-{19UBir+UT&%LMkD-4 z&{d>*Tz^&dxM{M8$HH;5$Y?)#4()c_dZcP}zvH%$z0iridK~VCv}578B+{w*eH}`X z&Lo0OQj9&vkxu%Z9UOL$PR^8LVU-vQ$L)h*ThjR@BAp=*!@TI3{2Vt~+IuAJ7liAI zVf+N5R#@7v8foZ@xrn8WHgtHbze)BiZG0<4Tj`~ZZv|=NTWPCs zd@D#B-wM)jg0a^pkT$**OB??_q=`%^O%c+@4KcYSCRZmWm&D`}8nz94 zJxOA6g_wOLhBM{0c2Hbv? zwSgc!|LskWeQV77AF=8Vr206*8O1Q+HIi_cRez~beMJ^=(+c_%Mm6@#2BBUjye5=A zz-K+Eq3i)Ed!SSHfRsHT&IgLI&jeETfR#=X-&Y`)Tf(hTGWj{VE&Ha zpYSHa2M7-0KSKNy-ctD|U{cFP%s*iO86D-T-qp}1j3Eo=pAdv-ke+`+5cnqqY56Av zfqy~}_;G^K`%Umq2on6$!7nl;{}IW*9EMM*m&R1)|B(3O5q2qtiA@RZ3+7MI@K?$r z?zJXRyLGp^38yKgZ)X$G{3kXQYA)iFFV;|Vkf5X&*t_#O4U?5H^#vV#DSg7>c-vt7hVm z$Hhz>O%^O>BBm1)$LqyR91k%QHUD*wQV=tdc7EUlW8VW1GjTkNnK%t%M5e5oW1?y% zM!=AM4Ndl1dCdPY@oz=QRt%FqBmU#epQz#gTo&`?ujFiSQcF5dUx|~@o+o|Ax+ir)w3A-8_EQIF!IQf1J z&9psXl5Ts#B-)-ZiMA(9!cK(#Iiy)^Pnb;G6GW!0>;H(lo{Vm!zxuzyV%IYNC*Ys_ zCIZ|(`8M%?P5hHJ-Nb%V&Cij@1JoV=1!qCQcUh*XWIgOj(@XR*@B zXkC-D^-3qxO9qp5FBwdxmkcInqe5_kaljTRoh)85m`pDjh|Jn(zj!SCwV2*dJ_*A< z@Xh2O5gCr!os1QQ0TWQWld+mQU^XiC@u!3I6dsEvpOQn+mj^$EK8)sTMEA73WXZ7uaIor>ubUE`dTo( zzJ?QwgI1Dk@%maYy}l+gWnG^XbshW&hVMgmNCQN=!($<6=YxDu*CALA9TXtyT0YF+ zTU+|yUY_ibE^tT)I_Z$^2nR{QcjS-|_rF|0++P-PU5AW^k-NEv%%zmR`wCe`_AEMN zHKMEaqC-|gbck*{Z3u0r4WaF{IKk*M528a>bN3ZO+i69ntn2SYU5D&~VJ{MmZ7@Fc zAV5>sby!+gl6Dl~N5wFO*ZEJev@g_V9CB3_328S;Ki-q#etJrs$E8haMD{FgN)tqz z=%r0*0%=p4XnW=6jc&?e#W>_+5_(t&{f2~crkt;SFXpRL&Osl|1E*kL z%8)0?M-LHs0g7qui7SFC!!PzJR^1({r#_AF8Ui&#`;Vl0Y9m$k)VF034>VKTkdgLh zb5Z&+S+KIHT@mf7S2ndPluhlbRW`LNluhjlPMlyI`W%!^?aIog_JuN$DF>P##XvI^ zi)lk{LI*l!;%~(KJ&1oY!U6=$lMVL&GJmj!f2}OyTAR9_jDA8f-GEQ!8#~vE;nY1S zt5IuH%jj&OjVe&7p-mxeicXtC+7#5eQ(N z!{5kAERi8~pHkgr%};-xQoqP4jq&OXqi2^k{f%dh{jwqZo%%`=1`o-kP2WZ;8x0Xz7@K{9MOS=PdH_ z6{Bx5yfqzLdVF)>t?77P=vxktPe)_%{o*_zaF_1;JqE}buOf2cA|hDF@};Y$4yoZl zQ%#<3YTMOL_OKT`Jfkhw>SV$s4YgG{Zrsh+mDt zSs9e7mRwf653G~@pu>7nT*a$(V;^h7afY5<52P1Q)m#PL3+`lbaNc4 zyEzV}o8!E>8u%JJ@;81F(?!0;J}4&8)EGf317<l08eCxd_okdTBEkLE22s&reed(q=A#G@M`@bqCUB z($7%iuo}`trj&M3N<)V@>L^J|N943ln&TKt>r2v#5DqJbS+9|_ODwHeBkhbV;_-Us z|EQ;#sHa)t#&9O;X=aUjno0FEQ&&$jsh(!uBsA2M-(eCX>S-p`lgO0g^(8T0&oaX> z9U9P!(FOG?^Y;V)tTz#GV>ky>J%jx>;-B@F%0H{CEaH8~vxdV+{{J7?&8C!iiw>#v zl=@Eg+Ou|0>UUS_0Hs_%1T*VLN?mc4{f(6TMOMWyyFQg&m1VPAPztwYn6SFmvt~0a zSN`lyIHAVk!E9PQn5|npm`#fZv*`gLPB8l4;(f=n#qz;yT0W53@C|zS-^9M-*&|^} zJ6>joA`*(0GaDeBi$oJ^bv?5XriT2)0}Kms~>RcSH{1v*#EP z`L-^t#@74)|EvquO>?fB{-~QdFC(;83}G*ji+-oNnS-quuHJvnC$gx1{rV{JCSSQ~ zW6pR=xoTq$kCU$2m=i~3uG*Nx^DI|w%sEb9C4L_lpXnq^S8dF>iu+v_jWx$RL?bK7f2l)3FuQ*+zHZ8*U=CZ)asZF_EezEJ0W zs%DFt`n|rPKE~p?!xiJ`N2sZ}Q*cg0)YM$8Mvi$2H8mFtJ!4v;rsifL@&RgUF1GrN z>2VQ}Zx9)bnwonFkwE(FzY&?vKg$zlM09aIs#n4Q%XNjhs~z5*{xv<5M7{mYuEy~HEe;_ ztziq`)-YQ6!U@KJf8o@y1?<$Ya0nNfayocfOb5f@xqy9eY8a-20f*t#Ff7dkd4J*3n%Ia1GS zOsPMl59ZNLP7NQ-!<9cTntd>@8=~FxKA1;4(C6uPpwFWn=<~XvE#L%W;63{JZ%-y%KN$szONRENylCyTfl%&UZv`|6r^j6}Pxu6bwvhYK#!*}?@^@xfPX zxZoa;&u^`&p6?}#cto7v4@NbfxXd3y7OZSO=DzcB zMQCR(^G8D2{E=E^^RdkrS;UEMd)yCDHh&~5n?D}PM5Y`O{}dzQ{24GTf)4a0^u*;b z^A9Her3f1p!-CGle}nm#Y50?65jW%cyI~}kdU0AAsiCDMYSi<;q!0K@Hskr1kXmty zQ?9XW{y+3tLg_u6aIc2ad!$tJ%kq>WrT5T`=igI|<3A&%^b7O&98XfpnX(z*5Y2c& zV;IhXZx+0a$V$}Vg4Yq*gm$n1yJ*HIi)KvAXQ)uw+xf+IWrqxbLl*Qv7>00=^xPze zEa<5^WWfYk#Iv^rQ(@$8xC@q2O5cAih#-3wy&wwFD81+fQ4qaA_oG4!q9A$!?cKo% z#-I|2UJxZj$3wKpl(V;+wG8yTfD5pE7POi~WBDw|0g0M9cXyUHl%yR+!1CEbFOv2* zOVcc$Ex0a=xUDX@MMmP9bk*R(`eeak7Cw#W(|R!rpN5!)Pix!i!lxl-;nP6F3C0QG z5VP=U7PIh0h!L5xt^O_A>O$N%P6!lj6)Z{)PPzMkD-(&~6d`Ld|xEg>z&P zSIt7YAl*I8!nH`DYEa?sxz)mGvKMON5RI#$CXUp^>D0uLnmAO=!Z^h^(TCK;2{mb? zhBIZ=+!9r@undN;k^TdSv=LP!TAp8QZ->I!`Aub&*64LII z(NZ~nEJ7{RY;}uXBzu;&s2QTo^wJhJgS17>w9*zegS17>APpxNC$)yOMa@{+qIV!o zWJ+oO3Tcb5KV>34v02myXVllXI&T9#dl(LBi~JC#A{-{_+azs~zbb9f3R%RhZc)Vl z5EDZdLQFiO@ioN6lbCp&n0OKsPiWXNH0dshi5FthNepMoR(D&px<#ch{9bK!5eDKP zLHx%N&M1b(lZgKg^J|`|FS;g+cwAe=^ZUE9Y8Ka_Q(Rlc7C-;Ew#CiqY}U5;ZA9PJ zYg_y_v@L#Ht8MYy(6;z(^k+E1IQcZREq5E4P`q?*-o9Zouq6haqd)%!Fx#APN8fsDdS98YxhL0Eyg-@@OpQx#r9?XQN;fP z!taV<$%n*$pZPVvzP0$SEMop89*^@cd6F!ce@P=mu_mP*mzOjG|B^;p{w0mTzoZfP zae^^q2KbjWV*VvBfnQ`w{`-P|NoyGPQ~CQbzaRLQe2Op-A({9e5dRV^eY>WYO9Et( z;Gg(E_(RD;@P{E9R)ar`_``JkVZ=`xDVKyP#wj-94-@>$iJvni{{zX7CB!KWRsR0W z?@#<02t|rvsgd{}GQZ~asU?SHk>LO8fAD`#7J~n0eAdr3_tZT|0Uw*Ov(RH^522sS1SJi<{u6IrB5Qfj1WWokBEP11J(aa-w0yBlw|udT zmM@ld!cd44jMHfU?=rD?v5XckM5dVXMH*@w=qDAIVMF?~Nszs4F(Px}v1M4znilR6 zF%P}uvLeJ|M%OYtQCrv9p_E8H{9=9BGXe0-vJ(h6e|ayGS&KZg?4;_MAjdpn* z7|BX^>0SO5S+HKZWR{!tdY7A_ce&B-XmtC99l7V#*&q8=F;seU1C#VeGmBgfRi#C&Ss%2`XGu6Sldij^nuV7eY8SX^nuV7ebByef-%$&LRa)*p(}yw53D^{%)=XA9LgU~&T%o`wJqM?a6b zbjl4Xj`Jp^32g z{U}#m$F^kE3h(dK%g;msj5T=%M7IK65Y-W(N*6O6N8htP2Gs$Dp}Y9}&fg*Frw z8jfEMn{^&S!+Rj|7km^x7^l+eq3B=bdYPYNJXh!hs1BcmFdso7XcMUppRB45-zbYv z>S~pOgrXN3_PIKb$80;krqGI8FM)^)soi!9jvtLh?JSMUB+^qRmb z-D?7?=rw^=b>U2$V4RZ%&F_%KN9kfI^-V-`A2f{kBTv@4k7<2kk1h^XG$kOBb|)J@wxO*k))G1F@G@l zS2sXtijYbC&l3OYhN_cSx0XfRHLY$>{I0#BtNYR^W*Dno(`pRXt20^6>T!soSI~CB ztLf$B)w-9HSJTVMtLZIJoL~$)1vRV3v6|IWp+;oNuIX9PHLb=Eh=gT8|LRSM?1ija z)NK%mpJN!l{w6V;DXXTjsG2qPVW?^UWz0VX{A*rCpyPT%YeM{M znyLJ2y2~QwU*r8a|C-@s!Tf7RBRX2ozh*S}*NoOStu>>;zlOHm;soRTvEW}bn)%mE z0>8+V{7oc3=BV@O*S=-bs$l-9#2t;0t{B$VBDCk3KSsm9PZkOO{r`jiOR^CBC-GS) zYw({W{*yZXlf-|L_)jXv1z`wQ*!t)5Bg!TgQ zuhqQ0y0(KXLaD3&S^E*?G4a|ih<4Evuk8ZjwOzEtYrBAWZ5Q-EIKjB!I}oq!!o+L6 zK`b(5|MLQUQy~3r&?ttSPLOjE)*w`)Eb>K$3{#!F7DEjev6I)Pz$oH^u92_JB@2OE zh-hIAWO_w)t?m`owe*VWT6#rwZJ}aZxQ39$E2?Yh6;+Wbo&2J3^4b$H9Pf5=>=@>s zLHw5xZYzd}EaHEO`F~USBk)yR#Pf#;zLH(j;0T^WzAUG~5q(ITeyuuUIGxSfB5(mj zjMi(5pbH>EcL7Au1rRYB^9P(@Ttx4GMTiR^f-V4&Dd!I_iTOjsG8n!AZ$v~Q(iR03Z`c$ z)X;KW)AkN@3Z9v2R;TT~$({w+2Ov5?FTg$k0_+2{0_+1I zz&-#T#RYD*Ke7k-MW*C`P4Gwh z!*Ha^-+=k&fIo5u!g7R@#NV9wBSSU(v9d_;<2JqKx!b|yIw_GT@q0-8D3djJ+3+vp`27g~QH1Zz%=jSTzlYIG%_=Uiqc+kfrrUst?zY%3_oP)saKZx)fC))5EF}>j;-n5NNh~&M} z&l=a^3VxQR;Z`27acUu5iHv12 zFoe1nhb|;!5b1MjA;S-??MxYvs2)IJ5ZkoOQ)A^b|zh7h%o_id#X5+g-|8j8o#YLH%l zE7;2btH>%CQc3E9SskKv4$SI^S)JAegwzo;I!O^yXIA{z5VJbLYzHypiIUk6$*cp4 z^N1OInZM@sw+6hT(Zrd3M$E37S?H|@?+~-0oEi3({vhETPSnC8 zHPrS>k)Vc|tfgq6*Kq@Ca4q4&afe-i$^{2%7l_&gJ8Bn*+6AI^!K`ekBx)A~wcm*v zPn6V#3u@t5QQQy!YT@wU8|b|sa^HifrE+SkK`k6!JRDv;{0iY5LDa%EUOfC$DdN<^ z`6zCr^y1;M$ReNlw3J%-X42=S7M_b}u06HzTu=+o)lv)31-0;8P(ub~V+5#$=W=S{ z<)9`KCAATf8tULi`o)uQoF(7*fsGoi{iJbfpA$6!StJcB4Wl?U%>XCDO^W!# ztq~)Lj1%vYkZl@W@ufS4s~70%B}qHtW4he~7R?a4^0ad#5eal>ZiEQbnus)eBSfUZ z2oY&oBSfUZ2oY&#=))%u9< z5qaShzFUXLTc;7h@^awEu#cY55=I_m+$TyrWv~Xeilp$UnW-NT9WSy~BuH7DXXGM$D>Xxk zxT99{q2%DG)iToHoYiVXtL-_f)!?jFYwL$v4bEycF~A5WnA*Qu&FhES1kNH+I_ign zqgKyAk(xbf4UKNfIR15n|5r1M(jznw{)ah!3|}nxqgA{mZq6-g38G8vxkW7jx2PprZc$6XEouqM0vQxTB)CN_;oPD=1vil> zr^^qE>2j0`#b;oRsANQ5LwQDFJZ@M5wzlPVpz?{T;H>?@I;sibu$h^#p27^{iFH)7 zhBc}H7jZ`ybskEx)R69stANafPHG=3Pt$Fr&v}~qAPR|gOlRr?o~Axpo~AzFY3c*8 z$eq%@}

Foq7b0~2H>NKl;{30sSMf1@z**C3 zbIijC7_`NFNff3M>lktqa%vm%wiNLKjd>qR!966;n6;E;nq7g$gpoey8Dm1!WY04O z%>;>Bo-royj4=^dlUWHn3!X71&NC(%JVl}`(5a$8W9p$uL*bYDB)!w6WgDYi5(0wB2l)r>7uR0Vm~rGT(mW+kY_mlAmERE0^wBzbUMs1gYd^{ zj*G^^6L68hzxoFF14u*QHy~ z@mNg+9edF6&MWFH#~)1i8xZ!H*``5+ep>mPHe-26xlkwPJNJHROcMMZ9TjdWn=CmrY~SN4RpRO`DdJK4-IOHKHgmZ8x-OHP~!gt!1-m zHP~!gO?JW-n5qMtO{)c)K(G;svS~afn#LxKNh9}z|E4lTzP2_EKCTeIHDn}e+Yk}Y?aiq*X{eo(B0=q{Mn#Gxg{P36quZb$TXduDOBgIV0|T4r&#gIV0| zV1^8eO7p+C+c~qiJHbpON@n5fvBGoo#SXwZN4cZVei+c=VK0*aC zn?=mxP%0LG7PnN2c%_T`)W*!>spHm=h9I*6(G3n{=zS4!cJGUbqxVI`(ed>-oLh^^ zCNdiY8G2uYNR*XsmZ)@bc~A_nRk{~>r3)qeH3+-REPg!UpUv^tYVeI}39q>~#iMMMe@zhM> zR}+3Tljxy@Uo?|=Y9=C4;-4e&r$bS1!#|1R4=4Pk2pE4RxDoy*IQ}x5{o}uqB7y%j zlpLCQ{CUz4_|f^q|LlODP9??Lol1(QQ%UjkON;S81J-whUz|#cr&CEHQR06>;7>rm z9!*dCOQ-uS#~%Uw3HKsAhyZ8L408#8!eATz1a$RW#PKK0gObC!=Y*F?gX2$Fi0DFl z{0R$zKVhM^{v<2}{sfxjBZCq{^*>=DuRjUCz%LRd{<#uA3M$4{|4mCcewx`Pgd?OP zTq68Wa{Lh*{3sqS68NcSbi_}EcS+!HMYPoce=Fg)don(Oo{UduCH$>sC6?-cf_O4M z;Sk~Hi4y;l5sy zx_a7fJeBwm>2o%Tk0APpJ)1;2fSPD`05y>gpe8;7*NP0vrU$_$Q5--`qywlTQM%T7 z!nG#inaoXk@K1abkv^zanx*!SIJGEHOZ*679l}<^`3zA@T&kfKB1ODt5~HBx&@>X` zNkfo95htcPkf9$fOSJpZvPAmPvcyz^hVyB0U5HF7uUd)pqh%sd7R@uFXcDWy;iRo; ze8=&d2>%X*qh^-mLHM8L_**pizmpH3$6H2>&&0(@4BV_~{vw z#B0FcMEI|9{7DMo=ZO;kvjTt8ols1%;x~!k!;1#~q#+0oBWxu6&k_Elp*H+Uv!#gR zPkQ=#{7Em82FIVY0MP~Z_>&d@f6@Xi{-g!KpR@q@kwJ;~2mYi50{=U}FA^pG=Olj2 zC*v2|@Gs}~k0JaE1I_|lF5lc&-h>|XYhJQetp>2xtND2Y`6lf}z^lIdkX zB2nUhLEuk*1^8|C-}D*Bzlrd_hp-Bvlkm^y_%-`U$!MKiB=D!*0Dlf?2>eBe7CGQA zBK$?#`jcEl_=^ZXrU{8u|C5V&{YkDS{5(-VTznfV~3E_W{ zuB=OADHG`G40p7UJwsRaCrMIXqkD0tDT@$AiEB$L zWf7RBEYdPfSp=pji%!#rSxG7Y)09P=Y05`nDiYqJMb1u6kbDlM;J0NDn;LH8Ny03;gAdgMoiB^+i4^iWhF7d9J{YJ@ zLh?6sPhpEQxIE)vi!)@4Gj_H(L$)}B>X3?|LP{Ok;*7AxPh<<8D67NE&Wt8FX)s#K zBG@9WA0o?~3_dVN+C;?H8(x7?(|i$)#)BYE&T?rnB?(Hr77NHY&hryDQzFcihVD2m z$;{Hb5v5njOlhIE%8^zkMSLKVRs$ugnbKNt<q#f0o zAnhnjkam^15lr~XpQ$C2J`-fp zX95~BC}~EJNuSBdq|XBxktiM60^!KgUxy;S_EC({O=~#*WWtYuRQftI%NRoV7jpcX zfmC{o6!9IL^i(KW+iiL&u7dq#eNNwrE2|?*KZz^DYf`p3jILgXS=z0ukegHJ&Ybt= zOf%b@Y0rCeCU|eo)bie(3ErDCQR$IENvG$ZH)nF*n~T9)B+4C}g<=P1^BySP2TN_n zZddw4DF4ma`%9mJD!du1v+2*EQDopuOFBIxt+%#v>-r?U4N{y+OM$I2h9f+J&_HzF zAX{aOu$6TNoBLr`8j?z^n-C70S>^}={U&Fv*#XHwd2kW0;Tb;=PqA}nW%dVYaAuhdQD|s8uuKMK znM}(plYv<#15RX6GUz3EnT#{bycNtuqO9R>iW;7YHO`FL)*2r5F2|n+{F!KinbQz* z2>)AzKU4Dxsmys&#GOy(e8L~f9U0OWQ5O3rU^17IzF@N)QNXfevz*v0w_~%M*er*! zGnbo{OnU!g=5oPi9kJnw()qk4oKI#r6uS}sctq&6k4^-MDyUDCFQ=AH)Cv(A%`6M6 zT+Hw`r=~f}nTdfZ7xALWJWkX^_hTuV%#)-c$ehK!&N`4eOJvU4kvU6b&JwhvJ zra{TUd1lQb4URtx<(M_k9)H$6;Ln<;#h*0~__OF(5HcuPt-zl(kK@mJ3HU{##J@=5 z{}_syHvIk^e+J=4L(NhVItc$_jvxNeia$e&1pWdj!Tu;ms}syBCk=tW22pf<+RBtw zL-=d#@YfLj8p4l<{j!4ye~rN3O!#@C#J^bLN0*oVHph?e_A#yJ_%jLrS%lxrEPD>& ze~07$)`ma(HYwuxv;QUVYqyfJ?z@LrjM$TZH{R24uEa1<63gLBxt%To~@Mk}*!H)?B7YY39q2y41 zvJIpm@JApT;ebDa@JHC;k0AUJgg?Tpi-6gKb!FH zKsah5FJzd;B?lfj_6O7Jp7(;Lqs` z{K%l>QvJ{A%kk&90l!F;_}>-yb1=%twblP9Gsm9;{5dZpU?!Jyf}p)e_;Y-0_Rm=@ zMclRK1dtLYseEHHCk9sz?}W}tA$`Fn6H)XO+SZUmLxLQ;Awdoe334*wT5~WY$crI1 zVn~ofLjsW~UF&1 z>3wD*QBr$fP|KYU#YX`=_bo)8v{9p0e+#FU2Wq+KwsM2aEbmT2{Q*(S{ZvCOTZ#lV zOss9Cmb>i+)b^0RpmqqiI^;m@5K%j%t%JFTh}t2dcF3$0(D}#QL%a^=enr%HqNMhL zr1lpSX)iPHRz&C^q;=lmW4e`7%Llc*0SNfMym~^tgsA1Y+NkAWgvLdjTHdo-YI%#U zr_5VE4*XL1RFA^oSC4yRB8W{aX z)G!n)q>TU#wQihR0a4qA0Q=?-Ce$BtYE2qy-$@bo6?s2F$-&p*GOKZp z3Me@|ZJEEFG`RiqcOkmV0sk(-zsnB)F2cWy@b5A!#mfl)E`k3D;pd4G|5Aw`?<6dK z+KN9){CHQ{=!vER zyC<3o=!vERdZZ5-l#;Q)Um%`nDp(BsB2nW1Sl}`sYD}GZjum2^$Ur>sGsYu}i zg#SMrzh*P6;Di(j{HLzBf59)LA@EgWuplGZAQHweLQs6Iy+b^7nkWBcO5&l9t(ar}jELCK;1 z7owvr6fdDEgkLILYLCBgDexCA)z+WFrNCdf6!?)rDW&>fxRlqQ!j-@;5+(j+5014SYc0A1icf=o5!_PQLR2g1TBGp@ zKs={b4r)ci5GEiPiP|Sbt%y#Q%c3cIQi^!d6g_XFW|>A6y+RtCOwk*NzF|+Mh#oyI zvU~Knh#oyIdV`?7VOGlLflQHj^tkAKkP(TpXg(1|Q-n!=`3P&%h$`p!D+oV^u0?4G zRO=1PIeyJK^P);Ag4Bw*n$iSfOdyLI9S}DXV!K~LE}~yTE^0hUA7-V(i4colLN010 z#5|F~?c=O5N`(O^)&Ng)kd*`y9aIt8UGaFx44-n4=WIqU)=LpLa&dPkIn@8+KBU1R z7xzQ7pFQN_et=xuPg`S(`vG!sKNuMqlnSc<#r=4VDZU4gMWQtFr^3kaluCuI{+mW~ z{8hkTJQ-mgLJ8sjjPMt04igl=FGT|Xe@JNsAM097Ui=wp2>fdhUE_d%4dGv7hkp&> zUqkrupl9VW!oNn~4<`IPQR4qh;?IWS)7DC28o}{zA^fNX#Vux5(x0HM&cB zA1L;=;UCHIR|9{EJAxNN2tiv#_)9!&^{3=Y|v0L>np;hmaql6zz09z^uzgYDy zp;d2@DDmU9Z925=60C}D(bWG3IR0ATFYSfkVP<8ng#UBGU)tM-zZA`bi@MNON9i0= z8o7|xI&cM3TiEDuxr(tVhBe4*eYaI<4CUtBN-@SNO|<7$nh0*CiQ2YNnh0*CiKpnp ztW?wUAEk-BZIot#n@E(4pPzT(EBd9op-86eHs)EVgYRApFTtX@KE{#~31E}0w> z0*BXGd2;%7pkH7f?e6rS=t2D|g{#S>6lOM53hTFQ}Cdg5q#cE59F+@thh; zj)3@>@E$ho&ozKr`Amct5O}Et5Vi8hY^7HIh7|EeSMCckL4VtoQ#q!6<)WO*S0lRG zfef7hE4MoVR!%3t%IO3cGAMP!h>SP^R!%3tM51hT0iw~BW6)LSVsjcH9DgI>N70m{ zXexS;oi}j&nxZL(OW-1b{}_}UI?eKLNP{=5@-w*C83+7l2*2HKVL9ydD_8Tc!ZqvBqKIKsb?@K?aASw>bBv!#gRuXy@; z{1tH86>%JY1)O$;gVU}cr(I#^v@6JISCG?22Bkh1_$!3dt{|r^5+(kP5U9* z<7TD7m+&9wjiKTc;pd4Gf1t#F6^f79@P~5z+kn5aD?&d6+<+N^2!ADhOu%CQ$}v*J z@mEf`9)IOj(%|?j(Zg0gZjZn6ap13fT#LW*ap13f9QctzX{7pJ`8da4`84p0M2SC0 z;II4uinjV6^$o}0MEF-Bgd$*3i5Y@9{?!`%2~s5Rr{4g7E@=q-RF1_C_=^dDu^s+m z!e31Iivf%3e`T@2UqkqLqQoC8@#9opqo)3cas17M{}{qKGpl-)@EbV(;~M;bN)dOh zRZgU2IksKZ?|L>>ZlurIR1HRSusxfq!C+H0Sj(nrFxXTLhHFIz#k>V*OBe{RS!R<5e1+=6H$qKytjX?jv+H$ADM=}A@NDf%!gTT_Xs zn4VP8^h6}e@qkfmhE`#(YU}Gn6wj(`rJl74@2c9m8jNw^1Dy#C2M~Nr;%V_6V7kw~Pj} zEu(=G8I)}+z--HCUW8ldmq|pTtdOCiLT;G_Mf$aK9r5rniRbuR2>*)+1e%O)2;=zi zgsK()3Mmr!*NKwBJ**SQErFyV@P{HA>VQ9#@Q2#r4<-C`l447!S!tR;_(KK$Si;W} zCH^ppKNpI3+VIElTDOz%Z$W4^v+BnQe>lfqt-=4R6bbx)UT^mN!Sl!hg ze>J^WuG;R!a@Addzq%{%BZJcPC-7Hy<@l?61HVX=_`?PM>Pb+fA9;}WkLCDVfxr3* zgjW%&2!90OuhtwGs{TZZIR5I@*W15(J!x?JR|g{+?0`R*@CR${UmZ;Ng9(4IS!u2% z{J{c$6yfKI5`TomUkJrm8~#lke;eV)V5AyLJvFlle)Xp7BZIP?_J3-` zn@MW!1~-u?TYaQx^)+~|efxY^qXw;M``c*sHRBPXjUdtL>8KZP^>Li_F0ihdhwvK0 zHe#(3>l&Ptwy>`Gj}&n?Ub8~Wx@LoowUuWG=?k7JqN)Q=m3XS!GOSUFr%GT|v$ErJ z;;Hg7tVtxEJW;xFRk-n*5-83ko?8&{0X^x)afHAm*1mQVH7p6#95b`pJBV5or?yi= z4PVJcyh7HTvr)5>xkws<%oW`0iUXM|MCOVenJYx*3PHPKR$Ar|nJb)3Eh92KQC7$( zQ6X!)LGeCYg-qZ@vj_NV??S*GYL^mz6XCDD+lIe(ycBW#wKT(V7$MhUSW~-{sV`&@y4KJbe~iQgpgF9!Z|HvEYk|6an67GE2P zaE9a@~c4L}48q?Gb27Y8vT8+S8C&n~&G^P=W5`T=qUx%S+tLFS$GRMCk`0Fq` ztXqt*o$$vJ{<`@Z{OhDh;19aq{&nG`A@D~d8ts5Tn(#+!?Ozv7_@fDbv{`AR`d=5# z?O&Hd_<5qlA1m?KLQzxyQ#k$ugue~pOEasVK=?Ot{JS*xf081B|2HT(INf?ZX>k1Y z-4N|&kH5Yf@Yi?K;;-)p{PlD?2^o}KRR8O{as2gn0KZ6-_%{js^}~Q))PL?;Q#t;F zz+XQF;VFay!XHQY>mRk@uYW^|IR5%~Z-D<((h&GRNAz1^yty&l4s7IEg<2ilY8={NimPhX{WuLX(*_3?uyU9KU8;s{XhX3H&EXDZy@q zq5dLi2>kG$^;aD5lmD!@^PlzPKkLbV)?YCzyQ%)y3;)?b{!=7M{P6;R!@r@ZssHbA z`yU4WhEWJ8gNBO)Es^jyJYchb!!uIEJM@MHq$J+0hji-b419>paAlyYWa>JtgT;na z%FVeoWFeYm&#fT~+#0g9Wz&!aZVg$d=)u133eb2ZYtxf+K7Co(8|r-E6dcsEz$7%&rwveZ&UsWncA z;y|0%-OTZ~1ApVQ2ydC0nQC272H|gfPJ@4i6!B7P41y9mf5RdaQ)2?KdyMd7 zeq(Mmv#sucW=QAwHS-(u2`LizPeTa@jkHb9{1a*LifKkAH(z$Zf0^)Kw!?p!@LwkU zmx2FF!hc!d|A+ANM2SCL;NRK@id#5-a)(j-IsW6ozjZLeLkMdC&9Is9ZyjQ*m|LHe zB1kP3-}*GAal~8aBRbz6@z(i3ymh`7@z(i3ymkIb`Yp(0Lru!Iy!C9|paGdCMcl|+bD-ofX53m#8Uk`9qLmJiY0S0N zZp^in##~!z%(b=BtQ@5Jzg3L6w$hkOBuXP^NF(Fy`oRIBl29#g;P}5J{8S5mG_!3O zt1?3-H}Y2+{J%*NpN?$(8%oxvYqs^IEBgk&?Jm;iY__=}>SoVon;Y0{bJG^UHaD=@ z=7uJT49cO~!DgEqFMw^sz(yp>=}4xSj%*tXHeZ4Nwnq^;4_ca4r5>Ex2~gXH{$|^o z2-}HT7E#;wtc}{X&!mVK%{DYnX2`blUfV)RLy(C=G|GWY6p@LtBNIhrq6k_P$WZ;? z7A43e5gDE+izZ7H&9(|Ciu%tTkT~V>72$6~z;LYTHG-DI@oR=-+kTKDC!G$8zmQTc z$B)aVuCy>SrY8~Ki0v?)Si3+f;lWmzICcItI5xeFfN4v!6T#0X zj!p2!mMKe6+TS$gQkDWJAF;OorY)o|I5yx`4GtU|h+~5t#|GlqKpY#) z$`NY+O$~zMPU6TDCC7YG{hF|sam0rRVki2DudVvgf%;#0_4@|Ynq3fJ^JZRrg+#5n ztBqRoP$}ZouXz;6ICzHU2T6mIX`YDaM0+yL6G5hVqLxhaM38Bo2x!Qlw7�%@aA9 z=9wTP5@q!(6xFZ!1t>mb^9&gr|4G9CHUbsR1+sGy$FC`xW}_7GqG?ub_>rEEs{jlP zG;gbFt{{EErWVm!2R60Drq+&4EwQOZ(KKVqa+J+D4J%B*4pX( zV{<2RXwE;ThVNX=i(w>G~0*Rs9E}%?Et&|Ely_p z7(~a|li5Co@;& zj?w=AcCnSQowhPWqQqY!@t=UAX8&LOTEi*Ae;(nQneCWC_)9tdA8hz{beAHIe@CC| z@$W!4vttIwzXOG}!_6N54(euh*mW~IsGHg02K>mN9A5_fJ483LgSr`!DDjsH{5vK< z@o8Jrh~)M^4g5Q1A-s&RpYWFv{vES5_?Ji#ZyFf*TAMb~!*J!$GU%G-?%OFmzWhAJHL`kh&P;0^5=8GRetz{k}f7+Ef3VL616-*jW)MMqNG+SshOd;lc?dq$(QX`YBW?f4d>LpC2Dj}IJKRx6SXQ% z?Uaq$&fBDjQ`<@9B>Nhq55$#RO1HSTor6iAQ`fuUAXAEHsRNl(B2#Kdrj*E(60}mY@)hm>?JN~! z>WBY` z6~lm5KaRf@!+=(YVL&Sl16u8d0j)F)Xr*BQGALia2K=pJ7|=??0Ffy1R}1{D??G{r z4Sx~G|2^=xu0TLv-+G?#*AV{Jl^Xn6QY7#fUT^iApjI{sGb z_*-iUKRW(z+zG$v_*<#t7l{&ojl_>h|JQ%p@E36W=L!EsGi%c!%qRS{9RJTY{B0Pa zaS_MgMvcK?7}hqJG&ue?G=?^Z#?VHMq0O!_v{7SdqZ38QpnTH-{B5E!v{7Rai4uRU zz~6?||8E*>_zOAyAArB@6@(AWY}Z|czmD*?y{f^#R*LxBA=;>Su`JKDrGd*D1Gd!o z`b=9nWHbP!Uj=V##)S*Nu(Xr5{d6b6vmF}k_U)vtop`ou+euqH@oYa$A7g@^(EVi%5Sos2t$NDoA^U;^ibSY9H~1doD` zsg9fDN0?(5cExEMZ5QA%Lj##(mm8Gi9>=cPQp8uQcD(>4`Fd!izk@5Q-`f?4E52X@ zpXnnOY<5LbZf=5I=#zKF+M8fkEKIN~R%?P?u`t1|Sb`sGRyt_?cULSo!LBrzKqSgF z#s;w#wF^^ngY_S7^Re(~nsi-f-s zVZWK}$s_z*IexPS|5YjCwQi4|lt#*Cx93h=S?l1QVRUsrms!eY&p67>x$T*Z=wy3t zdnSY1p2=EndnSY1p2?_n$e^62_1`^{Ik!FD;3g7ft=lSU-JZ{&*ag3-8!_XFvedSTQrio^ar&yQ)V6W_mwk$qV-J7t9Khc@M+<-N9Khc@ z2k?A7M2DpMW=W_#fEJ zzc)#W1pG|EU&l`y*zlwL_KGR@-bzF(9q`lA;$FL@#l5t&xR;g|kwG~dPx!^s;$B)> z6p0dlv&4^{_v~_xpASlBaQwd#ehf(WIU}3~G{bg|Uo*?z=PE_K(d-*b__1UV;DzpK z-&44E3m%)19IfOsV zZ2v)Gy@Ocq``%V+`~NLPob~=e#O(M&npYqlLpv7qr*s_q=i>?$5+X}`+W$Ib=A`#8 zMilj0yHm7(F-Y%UtR=mFF-Y%U4ARJ;eD@wm?_bPG?_UbiB2kjwAxQ6sU-)h$Nbkoa z<-3U>y}t>OS)4S0T1iL!hZpq~klue3;X5-s*q2DR5b6DzU#mILMT+>FUk>yjnwF{6 zfx&cTF~NaJbY(HYftToZJEcJmd_*$)YH;9lx-+-PfdDf*5MXbS0|BtefdH*V4g|m= z2LjH}hgmtd8WuSaz%6nh3>FcI^35+T;>|AyFyKFT4=i#3Q|EJ@u*iX9h>-t1a1oIw zP6I?2L|%rC@a7lTNMk3u_K8}?ZS@;$b?|Nk3?vVR5V=;e)xrL@3UY9o6!B(#a29bE zwzAZMgU^!&=X}ryQ4C(Rwcwx+I3M)Uaz5w-&If795*d{5>G|)2KAiKxx4~H?%4Xdv zn)SieP^8DcMPDA}$MOG8_%TR2m~Li=nhAd!$FF(#d=x=obzp|_ye1C~1U5h4Rn)`u`sIDbFN`VdY=ogas? zJ_NULp3X?4tiyTP*vg#V`2PvF)m7N)P%FY0W_EZZ(b-M5I@D$>>qEav5qAcMZ-tW8 zR)?w6wT@N~566|mX^X=!!eQ|c^Wo`;PPezm;pwo);ptj?9G(t)9G(s?$e{f28SHU* zI=9E+xv+;wl-^*s@CJw9f#L+%A47)2UV$Gi{Ybh4{&d2h zuC@P>biz-oIY-igpVohlq;vZpDIokjQR3ex@xz&3pk*I9TiDL=|3&x@A)uXMUjq2| zbNq*Gt>(z@QY7&Ib3Oicg)}(+_U?#wx5wY!9r)Yr-tpH?@Azx)4*bZV{1gTJ?cF*4 z_P)R`67BJ~W480tM~?Xa2LASm2$=1(=M(+|guh)g+i6Gfa1qDfzT^h@{YXRLUy0~S z2mC7u|4Oa>+gB3)m4tt#S-D8{zkQ{^zk%@cM2Y`^uz!0R6m9iCO1u#CAHrXPu+7Yl z#uEO69Dk|J{_U8IauN4h?cYMl+MBokjjP~6(u*Ixn`HJq_R;$&H|KVA6r!W-xg8w^ zZbwIHxg8w^ZbwJKYaxU3^8?^^bQI@ybR4*eMCr8-3a@qaC2*sMMUP@#>*7D~T1U~@ z|9l%tOU!m;|Lha>8EPHVw`4Q@&M64Tn7(x*(_NzuUo!oL zkD30bZU{9@fAJlr|9KQb3)5d(fbbjB{}RUZzxG7PX8OxhnEr~&^uKLj`rlod{_00e z|Hmx|sZ9UpID`XCe+~EeONX$D>HqdbXl43;USkRyf{@J=-4ujlOmX^qK{^ZG7@12Q(Rs}xWbgKbxgVCS%e>$a_f4gbeqML?md}un=?WgQ*M79;SZ*u zVkkW~Fs0WUOzC|eLM~JK;5+_>@3`X;ru4m&DgQ?Lo&PZ9u9-}^`vs=-|2M)VrVRLw zDXw2LWndCh-0;2bu1xV5#gu#QML5HhLAdw5`2N8yOc|2Kl%cUqxol zkAK1x@BU1g)f?d;Q)WjpWzPFdd13@p=Dx_3C;KsF-Y}*-rDw|1eGz_U$}_<8>^7!6 zw~i^#FK5aNA24M;zVF2jro05ZzZ}C9pQTKB#fvGg?q$ltjZArM6;oahWy%}tneygz zro8nWQ{H|6;UZHO?PAK}Os2f^HdB0knDQ?0ynBKv?s#gq?wA^gCU zk2;yM^cYh5$sgt6f0ZfgtCmntm=c-H6!kNvL?OTFUkHbp5*@{q7+lBVIu_TPikK3& zgemd3fBa8ONx*d?u9I+`jJlqJ?@L8lr=hIVerL+&K}^X&*=Bsfl*|gIWG!P#_E?0= zOv%A@F0S)%o!=ATJW~pGFr_e+DMe^Q#qJ0wn-W}?;<^miW!IQeUdNOQTvy_{vV$pA zsZ7~|>uOxrxFMka)wVMQr-+sM=b6&b7XjCexHjW@t0z;op?z-qmMKkHOle-klru;O8DHm~l z5!XLgVu5$Llj?-t?I;E}M=`27wv-tTA$g%w#47xAR-IKv?Me!V5za8fVTL}hT{jF@ zCv|$Y`vaK498G7=jCDb`CjJ)Up2$2|hgV{$I!eaBE>?-BmQw|s~+ajNp@d0QWP z42!T_#QV@=1EFMDwm;@YIV`6tk3CLT_Fd>POaPC4sC(oS06Ipqy<Ucqpqc&-_uT?B{+5Jz7=0H{L&UjDH}y8=$(Vl47wGGMU$>d99gN5PPz6^&wJpBv(>uX258;;?c z$TBw8S-nG@!#vl2u)a(&9EVBOuXMiaqv(HNFK4x{`ULX~7#FZaF?>P7T%B*g)AT>E zkF)x3buRPVFnGf<#qgyRZoob}gm*ZrcdAc9_~%AX#c+azIPbmjU-Uol-_B}3bsqEF z_W3|PeT`jw_-R+LQkEqVG#Wf9O$eLP@jeHqR~q+bU>(LYHY-BN~vvu z?#`;K`W*8#o(Y+t7&=LaQDF$)U#A`jyvJD`s6Nj;Lk@+yD~3}fJO&{q9O|*ad!1D` z^#$e`+7{MTF`OnL9uy4ymi`A0aaP^c`OGscCTy2tI77lebiQF&qE-J0yw6$nP+w%8 z;V*=5Rt#sQFnkpk-tVm5qrSvEBVLGzPz>KnVFXqek#mHzI!Jw)c}6}OsVau=q%aZ> zWI{N~S-n^FVV-Ia^+_e@MH1rthB|`&2YNcIgVk3c?1;KwF`OeI_M)S(p`%s>j&@du zsIM|l(_JQ%=l3MU(@!QUPc;zLWT?7;c}5S8{!lTThcIf2&Nq4{{SSP|S-nqP2;t8$ zlN7@bBpj#njk$yV2aa=AhpDeI&zPE+D~jPqix6iPAe`W=-mkvSJY%zBuPKHLQW(3B z3mNH|32yD6Lg2hMR;N2qTy&$#NiKNZ782vw}W#$i!QZ4R94 ztd3OQVxI8<3FV66XPGlThv$6DSskUm%{&tyO$<;Bmq^%K=bQK%{SRE^tUjPFVxCDC zl4mQ1U!*YkE-rk>S@l#GGtZRllwXy=IZ~L?WD$C)?=a8Q$keYD!># zec-#!>S)!Md8T`$hbV^2Qkec67ryVTj#1xbo|^}3UZfbVkT6x}yLk%z4_xA`j#b}d zo*6?k42t15Da?3*3qNvJA5`CGo|!LZbyp0(OJU{?F8tV8eF(qR>6!I$R=Z-jO2R%m z->hVgcA2yKu)2hKW-rZ#h5jJnMV)VU1pN>E#91Aue#ks?=H>(|hCfMoTIZYNOaB8u zbyml#A2H9|mvV~~!!;?)UB`thoYe{HQs$ZWaNY;XdUq0HM>G%XOKM%Uu8RP|E`e=7P_HvoPXF7W_!R;OWj;aTic{Ep7(L}~3vo35@vT6^&&ow180ZHBs% zd6vv5c|vD&wxrEeS0PO;N!1zkmbAyz)y%WhskFDws94e-S3gJEd!-w6Mi)z(x4MRT zmN}OV)ET>4(q^e^k@jlY2Rh>|>=h@x7Xk-1(R1iF-bRaB@Zvb?kKQlPv+U!tPb(*( zPw7$?T#2808XoGSr%j6jp)VDXZn`W>wwztEo-5)E;8+`NV`I5@Cl?> zPTfTNz2&_q4a;df%|oQ2AM9>aWZDdo_8g_T$h4*Of6a#SbpT`Rx==@%@w)r+Y*M=A zCS>rP=9`ED0Dw*`>L%aXwalbbr=Bb`nU%jUf|^d9)=`#)i)&rWT6F64&axJ>@=wpM zWmk0Sj8kP-a51QBc`uzh^K^MHTs+*h+)JlEcBb457jwFnKc`b4KU@ABE*5qz&(^84 z{#Blhi-4}IYxy;%dXKH_Qh|vyUnK&KZ!5lqblE+XU3ye}`!8I$u!*-Yk4i6(O1F;6 z-h@MUy7C_AJghraITrs1S+ux8`Nu6~pXzck!a*;usOvo|r&T^*`3|noN-L+sbo()k z=~DSBPa`cP9RT@Rm2c|&Smm1|E8j$&r9{+WMP28)W!{z-w|s&MV7wLDUA8RQ@(E?b zAC&{;+_F?RY|Bzb4e+cUTRowA5e6E@Zjg7Wo=q1F$B(L?#(%l2S-lYPpzwuGF?zZO zZFJy^Hh9)#)a2D-Ou~%a@zJGbAHTpzspd;u%gi+x>sd0_(5i!xumXm-k#1IPZygp1 zYI~2Y?QQJlgd<0__n2LD3p#3t;orMh2|!h)-HaHNdPY__O9s`F?#=+RK%(O~pwc-Nz0 zwnxJVkB06Z^&_jJ!;SSvDyo zDJ4xp0>_B&i6Y5AQt}6v)RRZK5{L)zUF+`^l6p5G8O75{w0r2hSM0 z)_*J|9|*}>F2U2UuJtA<2^W%dE_s0@O;XYzBnPr(Q0~nHeP7_#muIaPz8lMWnIi{N>`CUl@wP! zZct5;++XJbHI+X8Lmw~D$Ak3I2Om=}(Z^x>D5DP(eURSN8T2s_ACLY_ABX6poIaxI zgH#?Rl}88D2gApdR{BVzk9G7hk3L4yb7525PvWD$*~K~DR@+^XG+yvUY%B?V5qX?* zrh1GEAFKQYiyXrU*o0~`YEOPYS$WJvJ@*`IHevAARms9-) zt?m~2qb^eZD8_QgPqiF!FROfnMLvbgsjfr*lvO^*B45DeRO2CEW0kM4$V0iD>OJIX zR(YaDUbxUH`OUy8Avas)wHEnqF2{y7<^RSi|H2~2EEW0dh5Rq8{C6pz+KqodwJsF@ z{TBJu!4~;AE~hpIxs~5k3%{v?AGI{dt^B51_)Qi3sJ%fhy$)jVJG}g-3eQ8W4yldS z@2|1Q_wesG3;9W_{7Z}c0+(aAg!2Dwm0y+eX_yJ3{C05pw1F1+w7V?w5nSFX}MGwaAxn`|cBREB|R0{?m+Heo)Aht@-0D`SZB^2-vd}PGrj1eH$G3-Z8$2ghk8?ExS7CAPKQQ5u} z@@%U-%_1-7@~?$lb~L!{HjDf)mv;#Hd29YN7CGEH?thxgXLPm5XE;gu3@jKxj-QzX z{ux88a(9ay9TViDFlIbvl|O2cKf~qUi~Mg{eqkHA{nSsiV`(G6D zbgLYVS;$e@A^%0lo2_zmXF|T8%c;8u{!Xj>ghh_Zj{Kss&16>jA5uOOl^yb{JpW8< zWuMv4BEO%@uL=2NOa7VTEb=FK`Ff)=_C`gV`7FYVX7<>JR2eanrcP+)Cn7;q#+j>c zSQ%#;sWLwHD1G$A$IS2OV+Va~2DO=y)~`02UAnoUYRydHUp-AgE3wM+Eb>M!|3}CV zS><~y@(wPaDdd-}@}H#qu`VPJ!qaQ`{>KJb5g^d->)$j-4SY(_>V!R^K$0W^*!ct>s2ntAd?p3f*7VfE_RD?4$E&?tV~6P)Hxad zWxQkUZY;*#hQ+v_Y>RR0{>@n2S~9n>?>e;o_!b^VD!UuYMqcaE)@5(l?1pu4rV|q$ zn&3rxtvkE!2mc{7!SnCtKLpzJ2Zd1RVS&@XCsXMqaYOw3Vj&94oZ(*n!~G|1NQ0KK zo6grCj#11h{O9sSjQ0I8U$eL#|2Gh~AMNWV`M!J*%zJ&bN5EYk>(6q{vQD$DxAysC7rZxuJ`q-qjK)o}ekQt~U81l-0e5LLi{2ZSWxULl#p z^LVpK0n-D5bh85H&`c-b4L=s}Qb)iu(CKgNx6mn0A2X5}@1jXTz$zs6WSH9PEYlv$ z^>CM@xW3FgAly9w2YdojIs;7f1x9-5O?yf{?q9WGqi)uQ8Fc>*K7MS&GaVbykvrbM zbAun{yUG10&)N{8>)a54V2@y zKvZOs6mrS!B-t+WGztl3EXdP`Bp0OQJ0balOZq|*)I&&uZsC$3EXV)>dBz|){tOx} zBvZJA#%4jU$UGP~13}QcBnj$AlJ!!uT1X;!9&+(9UO~x0C1LSoS~U2e6jT$wh!C`u zC!)az?X(#<2$S*a8hp^#Ve$I8LEi^mwl(-*tTzPxbu#ETvr8|Xrojgf>=``Jj|Jb= ziPw&~^crew@WHf1bX|kTs=XKU4jzXrPar(r8H_<$uc6!#r_?gzK&saGDa1*^F9iGP zW(6uA{bc;Y6a z0R32_pV3dObdk63G@^0z8oEkneBX~57oIXcVRq^L-SX=fAq|-Eq496L?KI`+Gx&N9 zq*#AKQtbmjr^C{v(VhAahB}-Slf=A@G5D4|gv?H3JbkgXa_~jRR5P1otPB~WBd>4V z-eJT*3l_MCyuR@Q>HCJb+=SYCIu^{=ly0Kn6Z-(06fz-fjm|q{ntRA&ek|mf&Jc_j zP}i&;H^euz&WXM~WJO2Fe{A0#k}1A@>rHMRV13y6CJOZJk9;4BWe8rpp<#Y3bVEnz z=lm<|dW+6b%!N_uZroc;3T+DejN2#7sU!4Ho}Jq#3^QEVC+zW?0Ki)3|F?Z+g>BGv zhK2C&cj>W~x%522T<(|yN8*H?J+H8xVS8hrb~6sL>n>8f!n=mw9{wnG7vcAXKMHO7 zLwA8*fQByNBjwN~d<^yq(McqFh0hG19q|#gES*I7>--X(L^v&yI(8D_A4Ytnn-%V- z^N5(`5i!Ig!r3GIlt=hBkMIQ7aDU-3!_mv$vE4U3f_uy<@TK7eQj#SkwOm4-eYhNv zhVK!QZ^)Ym(nKNrSD6R(4R?zG5A*%;_%4`xSPKFtX^@7d&HHV5mzAkxijJ{L|1IyJmM<8`Z{kOaW?W6 z<{jC~k43t5M&3bLY{R$6k!rEdJMuw~$R+NP<6R>s2=5&E2B~4IpRvf5BO_N@Twr86 z?vmUYi7`muD^^T)E-;Zzip+{^)6I%3(RD^{A;rm)y;V9ys_q)8?y`7f^%VaKtw%;y z^ayr&9}+4l;vM0M|o(j)$*@Sahl5Z^a4Y7)F>)Jst>{deyf_0r9nkbZ2Ge-yU% zX`g_5&nSQT!d1Gc&-_@_`=_E_GP~S4_`iBj%5mqL|2OX$wb>);glkl`Fm@D{#9(aZ zVPZX^e#iI!(iw%ZiN?S>cT*1-!_;%6si&nVOb_`n)96mqP&-Y>qA*P~or671(@BeN zF~7s~6ynmJCajjgo~B^f)0An-{O|TOW!~JLrhTS;8he`d(HE}LnJ{ZGRi84!>-O{e zulA%I{mTDO_MBw87&}(yZTj8abj^=NckML&Mc;1g45A0de8fA0=m$EY@8k5jtBrn{ z^n9cJZp!O_aJ7$oA2Wn*1M9|2_hT^=I%3A~udwe7VqPVsn{@^;%VS6J&LF0$Bc_;V z=LlmuDVJ}|UpGVeKXnGN6Lg)iQ~CG1+>yy#`sOm1yI+JKLT8ZbwW-ghen|t}jQ83) zgD!eC%WKmso8H*8gF1svftz+foBq%lq>9d9Qv^B#OoWDPiZNWlj_G}yw(8YvuT8r) z9f+H)GY)25;=07m7P&Op;=0RhalH+{Ve|FAxS4u2$184L-1G6b>5M~=EiN82asFrf zwzzalwo=3Ilr5h6pLDPI-tj}?=K`ehR-JErAB*peeTs z54{97lB8Kq&%U0_{|l zdc1ih))ETe#KSkk{XaFYq^`P7yhsFhVlMp$BP?Pru3J!3(7bZJl4d2%%Q)+1#AHW@ z`b?{NPI|T2D=9cBJP8jkvMxz^Nli$lKPcpi=9N?|$6861IMJn7OT3bHChbig!&_F; zmE%S}#{k{BV$p}38K?Dg zQ=Us%Xlsrs@AxnE^G?Y? zmh#RN4Da2h+L~j^wzQ{o-l=;%QZKrv9`s|WUw5V+;wtyyUhOHxd_0x<*T~erES-4T zAU~Go)|rM;ncGw=F1t>=fK5spnl@WEE6q#SnT7>px2YIUr7iYIOL0wmPmCbaFdlQ8 z%5R^RH!>~HGR8`Sk3qV2j77KGpS}uBKJ6F@(I(P<=t#ptzuOSeU zeERtR-sIEA->m8A$ELrLjiE*jGW2{*klx&pjw%ZJ+$E&{M0&oPZ@nq6|7lFH z8J>k(cQc0ZoA-5W-pRkheoU|#D;_8x5WK;1;-rl38BN@2Wz6o#zyQvIFaz^;Ak2uk z8N&a`X=Uuwb!N2l?{^vK&0GdvVJ`Q)kM;zoRqB=5H?x2KR5#-=o72MDcBNP5%bBlb z{z*W zTGKNNU0&9T&MY{sK?7_}JInt@O*`wuER}g@VKpeL5Fw{CD~YmM*EOt*URhhRj_PJ* znRT66Eu=BoJL`f+_NyM*gI%*OiT0R%7YX14vnO&-*O~1}3BK90xTm8v&Fue3$vZ-_ zPWr$}*?~D@(K@rkDIKjddviy2BH~V>b!Ou`@3}HEyB)1F`%?C$|K2*YFWsz;=*Q;V zopZOQb>`enU${z_)7y{b=uc&%YTi5azqU@waqrvzr`GA6GZEi14`Fs^&J_A$tDUXu zM>#L&9OuKYQQp7lHYnb_F@7xX{*Jss{44C;L*86c zx|w^(Tbw_T+b1upBQJ$#=l01vNV$CTe!LmN|H(b%->>V;$0`WE-{qbI%w>oX?GalI zRbKg@?=Nf9g^0(%<6!2{?oDJ1%dsPY7kbhZ@PV)aWoWp_5`wBeZ6{@`o zh8IjKX^~!`z`FNUFqbF7D->w&xCST}73BHBPc$23^tU|FZ z+gZ3#NK!}=ge_0k!d)_tSxAms+(h9wMd7@D7GCHm{1(DHMe8U+#lp>t9=KWQ|1ayC zvx=UfrJo{SKUVZwM-di7aC^JDd9sLG_9k`HyC}xJC?1)!I*YiOZSAV4q4*DuyJ$~G z(GCsnD;#%mkN;n|i?%aL;)306hsgdlqPWY z*kdP}qNJN{OffO>|9x*}ms^y`Cx1Sl8D{3qEA!^fo3gWeuR86e9j)>^MV#&RLXa=z1%aQ<9WtU1HyFDcJ9_s_TGCsfby`FNU?zwT20YKQriN~f`$?|3lZ z0Z?gGejY$KtH*Nw-rLRa`FZ)Lm0tN5fbvaM{wIV|J(lx--}zI$UimlO3Ys=9xL*vq z0#~ZzTY#HrI0eS>$Q-4hO<;iq|6Z%YuN?xYi&IUhpzF>sw(uRjF7Lph%PXIYk+}m; zAwX?MY%MkvF~1HA%icRDxCHK8h$}(QPDg73-2p@TB)zX+0v7v!e^+oSK+H}h2d_66B`%4!Og!^h(*gQmA-}D z*&AW|I!7s7R8=^GYODI4*#`?VP`*B}FctsSR25>G?WC6KJ}JziJ_&iwc(oM(h6-Ab+1KRb$bd@6zEb_w1_D6DvEDfw5oB@YH^LAh%H9xSX5Sa z(4|+={y9p~nJWB<6*W!YA{2dF5(MC{ZpC*2e%-z3x^C?*O^Y9QD<11s+`4h`^TJw+ zu}Xl%#jmrq&~t|3ffCYFK;C1>D+Ceu)vAgE1q9cZ_-R7N;*}+Vtd8Q!%f%-FlQ8Ln{3cr~IO7HY433Dq+X<8CFM=7yal|)gYjV^+mOWmp{O-r)f%3R%c z9e3Nc)@|1mw_Pv0m44?|n(bB^;8xn!tyFO$UvoyF}a|t14l8 z^DVi~&7+yFw2@Fr=|hZD`Z7c4L3*iFR;f@{sSjHnc1Dd$qa@B^fwPKnQVAk%vQ?F0 z{|4=p@|9`6O0-MdQL8Hbn<2X%V;ov|@9H6_?RrZe1V;g&whMRa0C6WA z+0tF2rMtvMV!9Hw>x#trRN&xkGjwDpK+41|u&T2EF{F$J8$B@USk}61cfGg2E?b83 z%BnIvqkHA%+gHlc=zm~Y(Hy0$;8Gbes`hp7@a>thvzN<`qgs8SOx`%tm#-&TYMC(=^D8qEaPZY~Gu%1$j{91be_H+p?v;Js zM0LkBC6BzYdpy*t;)RM=Dne;GtLR%1s?RC$`%n*$7b}Lyd8uNQ?I&6yRxHN6bf8s5 zWJMA#D-M?vOGT76u~cNqVoWU++W?lE$BGK1Yfdc{2dQ%X{uQSyKB=BuDz3~?D!#mg z-%vNVvgqEtQ&ZeozUx7X_*%7VRmC5u;8pF;0HVXGTb{O|p3>=Qr59p1Mr~Pz489fbE>dL!=XLN)qRjduu*u8MXZNKtb{oqnQdKSgUBBNCTNs*svb7`{k|izQ@p z$m9!qL@HB*?`F#r7yLS1)Zrg!@NXDSqZ2$$I{YsQ?~J>ha)bab?k<9V=hhm$pR{bo zA03akx2Q#(g9xs4M9S(=y5K|+sUu`;_)kBj+8O(lR_~}!)l=vzww-@Lj(%vd^PgmD zcf5cAlJ}yMx;#iq?$QVhyTGMD$-4JOi3NA>ajy%h-GXtK6JXp0M=`{>J}x65hoyTf zdil4jsb0M{_~%C9-?!CNqt;PJH2P3*+FWxH*aW#C)rCav+U7GvZVq$npnu(D3(VHL zZ{23AO(A{P=_Gv}6o!828ixTem}eJcjzAM#_pv5;+lbsXq6LfUR_if-otC*E@HSaM zw{Aqw6o0T4(xVZk!7EhJAimdyxL`UI3rwWrC5T_+?&kEk955Q#axf#ehX~w96BVt5 z=}jRQw5{7|B4Fx|6kZnZZmJ&O$l*i-@%^x}?sqxNZEhHbdH2^b%)7tNRbD}#bZ_D? zw{7n{(7WUE@~s1%YbxEl(opZ-o6$!QItFsv_Rd4S`y`ZxlNENK=0Y`aeAl);4fXCt zu(j@oV8-2dL0{c5i?w~ig|bJPUM1DWy#~;8vg+aVQ=pP^0Y)vS+L9ujfqy z3EH&pfo+k3J?goDhzDpK2Mv#g2+u&?uThb9ILPAOw`Rj0uS!t8di4NljY@JlLaqyP zH76t#gGaBgO`RGeDen;?HOygd=OE&K?0BDq@uE!en5n?LJ(eI?oz2@LfsDmt1?xqBOAS55{>?GtS<*a!CXD4qFv1YLKdeMV%os-y!_$Q2L$)n)Y+7U2mU zat{C~ElIOYc)UK3Q6A(HM$4!rJ;Y=V=}$ z)8{#d`K^1<9ev*5X1%5E&i)BO~`A#12S7>nY zUY>ZLsgHa%2soUcz^{Hjh*J545UFo8xOhsK%FC3#&uRSoJ|p3MTk>cT?-BGJuEPgv z@QExRZ2_Pin-0e^ocZ@nWPCbw1H3|qw5tK-8T@=$D}jpd$HOX z^t~ZL>Gu$Fw>pDJ&LDvt*cpWY(MCvSgfPNnlfF`*9t}wX%zfnXlH1=Oa5mD)Xw>TR`swGus zrT2eVTRZm0szxh}6&rTc%-}+$DU$ffB&Gkp_=o9EFj7}Z_WnOqA^MCe>Du8(q7KE= z1rwyFi}qL)Y3$X(!1=-G8Ct4(zKDRIroV!J?o?$SEmu9epp~B3FLsdErjWydV25Kw zbv7Qv;9netJFOZ$<7#zzM5CC3VbzEt2tlhx&pc|Q=LXEF;AQTZe}`2gVRroe)>UKO zmWrOR?t#y`pbI^#pl{DFnfX;H*b`^XFb=2n$h&ttlmVmUvhv-hpsIHtVO7ax<-6Sp z10LpGpITe5tx;;JAnx3P4VL(_PX@S?NCRE~y8(@vox$lt(gB!g(8p--?H;ZIJ{E0! zl23b)Nh3l@Oi0Q-;3(lk?g3xbB39kbpupt?8Wsavusr5BFDvE_YZP;*3vdINZ7ShS z2EmyRYUEHx{?tTmX_#$3A}AysG#TNjm~95dQX1IwhuNl5n{5WI)@PeR>ujHi*=Eo| zJZHH;WKJT$en$QPG_igebgJ5A4f;ib*kuj+6P5J!%iz0^yVYe4hTj?a1G%ih5Pono zXO}e?$D}BG?GmEq4s+*VeNfWodhh_C4j#Z&`a(H_JEKajv&$MxSFvu{UUN-l@OW}r zgZ&tN0ijPLbZ3_}I1;6wvCA49r@5@b+o&3PdN5|4&N1Y&1|Oxq8H{@xopZ@$4gS;3 zp$yBTXf8$XP}Bg?(4!P3Q{+ccCyJgxG~|1Vwoo*SqSo+DILP3)9FTg6D6@YX(o^$q zLnc)hhHL(9$T}`0|2CwAXq0OHZ3w<%fczI#h%QhiU6o9Cs4Gua1jQjm=UkZV(1&=k z5|jB*cMU!ilf8gaszr;R&csC@w-O1+CVa>}GPyRn>$v?LiN`G#6 ziuY8V4oN>FC7V<#6gkn7R5by|kCc^J)pmdE6Ptf4_iWr`~ zJuC3_Rk;^dHv<0%!`%d2e{tIjOHcvl7q_EYGJN#i8vW6Dvd8ezk1{?ztwHNv*5S`< z@OIKsnBp%(m!rEQU@tyyCFzon07mzyoeNUlx={*Mz3|4J@)E;pQg~!`!R)%#*-_=jw(buQ01!g6gv9-+fSjWsf@0q zDRlIwjQ$J9w0<6q^|QxS{W6Yz=?Rd(v4L(xrtn?^GVS;7rJ6KlzGr~}yvK9-dw3ZO z=`I9+!$3*9)}!!9evb}Z-}90S@<60R8F2|A&L%{?sfI=RC34vBMK~1i267O;mw-Y1 zUMx^fYJ>PaJoopw3gdgPvX((yrz=8enfJYDnRhpshWCTogznvrs4Mgx7H|4d2yY*f z+&+)h*PG8;=*#kM>)ibNV440dDZGrO7-``8Usx%P>DEEXi=W=o$imQE$c z{>p@;+~b-NKI9(Pr8c?iII)ilChs>cg5@#y?4g)FRw(BF8Sw7d%zchYVq6kJszaI7 zuZe1@p4@Sv=WBv~jDU_G|GJpm$GcD(*z||V{c~+{AAgU&nH&G0?Js=0usLeJ(jfjD zP#KRt9sd?WAz$-BVj^XjNDVU6^fkixK--Oag3KB|9v{CQTf;Aj+%AOU5V;R1hit5iHv?S$Fm{ zuTAKHd2Iq8cujZ%s-A#-v*%&wd2PZwx1ZNgQ<>mN^V)==%wYndk0f;U0ie*g-!L8~ z%tBZ}GuecN)Rz;mYw$cwGuedA#6O2|iwUxoah(o3CVb#fCerPB04oW|_B-Lb%gBF$ z{ASG;PsBqQ&t!P2iFA)1|K6lF4o)U7ZV>+?QHex|aVS%I$gwtgA7um;Bbj6RSeyKj?N_lLpYk-1wJGf}*1iL| zDSZ$|L*zA}AjaC1zSU!GN`M6MSer5%mGrSTWhrvEj^GLd8|!gYo4+h zV{Hn2=peIUtW7zBu{Pxh8T^z3Q1cXQkO#GO9&1yM-+rv2rZVLd8f#O&VDxK*{tcl! zk2T+V4#jsgAH(?GqaDNG_k&OkHsg!+z@SIz7{<2;^|Eh20?=!hoImE~kY$-#$VnSBK+qmw>~a;r@*{vGDy=ho8~l-!ojC zDEK|D!Ts))aK9HAK9V;Ie%*CAh8olN!xyaheh+OV{KjdAI(`cYPF}|kR^(4N`;o+o zZ%|wI9DeCggC7?6gC5m9haYy*gUs+8essql|E^NFljrdJmz(}zj6vZ4w83+r2tttO z@aN~_{te(cz{@=3{yTUM!W=U2zj_Y;4lvdbT8;R3Yl_H&tjB*a`qIA_N#wj5@%M8m z0cCPE;=c&0^2f#zs*+yDKZ7vP`~G`s^D=dLmPmaPFpEfWp9I8_NC6RG7ZA+sYOY2C zvZ!+HtC0XWh^Y(ZYGkS_5yHVlwcJzP2_JG#?NyuHbzF^1ji7NeHHPIe4?L%shqZx^ zfOq@}u4d{9gtHE1cIzf8ik*%bt^qm?-fUw8__JwvhaT}SP|P$;L&HtZ{%qP`xA$kL zsZ4K3{%krAhv`j$J{=b*hMS!I+4R>?YGr>m{SD2ZO&?Cx(96@uL!vLppG}`d{W5(4 z0mz?CPjf@`14aAcAg1SO4rKa9ssdA(Ud|3g9NA9SuW3z3BL!Ss)9S?zX!>={!OXxT zk>MtCFf%}R#u0WfGjQK*xQUH<#+#69hK1zP9L$W-q&GO28UE~GX23Jeh`f`7nGso= zsnRxa#x@ED2ZJIAK@Mg{CUwY+WH=b`GLM*c2M0r#Bl7>NgPCy(*7GCzEBKm}x zUqN@wz$Hy|r_*w7CZwA+NIICA4?|Tm8?vgTgPDnC2Wx-k@LF46$L-FnyY)Vq^&*Kh z>lv_{1q(yZ)O0YjI#K1?9n7qeXyZfD!OTh|LMxo*p0!WPJ?qojQoRK->oj?CR`U0zIi$0{dJ-gh!TMEe)O}FaVwnhW?e7bm~`c97fa|c6JbFqYls-*vzyM!>%5p$DjZG9d6$Gkp7iu+{VWD;qfH`vX?)B|=k z{l`3PX}x@E_aF1tppAp1|Co1?2w@>yE%$sA;Y05EO>2|8j{ajlJ`M*m6ImX!m!g=x z&tYg{f$}Ft_ySnbg4PZttXmTmhm6_+rG5juLQpLK7R*36Ed0lUC`tpH{@_3U)cnVS z75V~Y!D`zV`00n{sJXv^-G!)N5wzf}Ls__3Zr>LCNf|-KKxUzdx;CPD04e%`MOXGi)~*Cp%#AD!0t+9;Mx|#<`<>8 z;Fn=QW>FK$+=k4e=DJXe+S$GqLM@uZLM^i68PDG!w`dc>7Kakl8x*Ra@hsXSi})GO zqC)^m4~cg3B}a_=MITTlIu2QM&IP_C=s84-t~W;X89R(iNPX-uj~N7eSoAYF47tq; zx<`Wt)tB&~C!8EkP-`8I1ux?Vb&(Fo6#oz84)R18gZ}SAa`W?)pm(c1d=NUHLG0m! zVEmf=Knq9iRu3N(Ln!3ogRt-n+UV@zgSOGQ3Ccl(g0OQK`-s8A2c3Y24?4kB4#Q@H z@EBpN(-$F7LboMub0q;am7pr}@ImaUg02(#4}|XQ;TM}7%98co(oDmGyIrb4y4St>HjNraV_ErA%Ycf=$Ht$1o zMlkdi9LO|SjU)>uszR<0I~4Od%N_b-ZF1Lf1`m6coJ3e_ zmd8BiWyL(EN-cg}zdOOl49i-(nCvEyS=JHZT`>6;Xkw~ZM$ZBGQ;Puk zNDxmI%O;_cz8P2sCvlsp0v~e*HJU1xMIqRor;25%)IrPETtb9rg_Aq#gOwgpEGx%U zv8KjJ+Nj_+#f2dohh+WAKWHY1Y*6c=%Q74#PO{W=ko%q)7G_8+7?!(e)S_guV z6}zfxxvfD`ZfmVmT^*gK^&Iu370YJGW1f7UV)j1{lQ`04Gg?3i^7Jw!&D!#eM}#KKw-NE_6I>l?SkNe zkT17A>RieQDn>HF)nvkLpU?*(P;+Yo`$I&g2%+4eMB~Tv@NGt9Zc^qpWTNlV$wc38 z`&5vL#>-RohM*HY5Mex;jOUlqeMjSwiRQlXiDm&}_Z__um2~$V9fjPjEB)x@ghK8+ zdM!exv-^(b7oMW?pv7pcZUg={xbNsw@D|ah$iSnIp_`&%V^do=dy8m#H|#bmebiK< zzaaM={T-wKMd&{fy0iO^LFdGbXZIcRkmkN)T2VFFTuetK8j|~t=|@%)GZ^_6s)rYM-A9uz%_DCP@_vf;yHteTIck55l+f#DXj+R4Yp?9t(c8vFw% z9~<+R4(A2{KlX0M7Z1r|U(w*PO(cG7d&b8c4gRrSI(&cz_hq=awi}zE!)+Qoo#~4+ z?AQWrr5ua-Z)yuc^cU@pblf9)Vcg4_w~y<>g&m>T56u-lFsMuqdpZO8dRzj5P{ zZ>YKLI6NB(_#19JZY{g*xMC!W@8q`QifeUTaNBWJ6bx<~MG%7AcHD<#8F5G9w!zCh zee@mNHepUr`>$?$Ifi7s2f6L#4Vxl*fS50T8UikVkR)<;+siQySBP(u0NfR-THb+G zCEfP&se}PLSRPet>+9&YSG-B2xKCCLBav402fGzLnO#k{y;?J09Om1(_j4&t$(3`ih^7fQ4dwI-Ie1aWsBPwcm<| zCy!6py&<2e^hQwvzK=uyV0ZBe`d32~bHGu>JTna8JaDjlei$t5^AHw0l$69K>YLTG z0S>{QBxnV~euuL1Suq>fzoN9x(f+VD8`yu+{jdEu8-D+^UUSrZs)79}P+9pr!pjI} zK;8-ZGa9RY_m2{&BuW4%P}5M^#h?Udfcgv!XiqKOH= zyPE9(1D#ba2#+DqyeYbBRlVx2TGfI;I#sQ!R=vhuwdyr=)vDL@t}@vlBa&SZ20Ik` z@U5J+R&{kEi3yECJZr7;LnVFIS~VZJTW76RA%s#Nv(~C;gw@Wo)~a+enpLTn5MkLp zJKr#Ct=fZGYt~ zPtdv0Y8M&?tM8&3G%u~DI~c3^PSxs;1i|w};Nm3`+^ND-zosY}L6ldIgceti)U^ml zy&B^(k?#$!o+-{aRtIAQubvMQyS0xntj5)p*;RyFSg#%sR-g94PXdJp^EVC>T?q&W zS%;58B+}t!QYVTYN0dk}z$Vh$Jc;ut@@R~xl{POWHY36$Unico=vP~ic~6HA(%}9) zZ;5#^F-C`nYVb7-7kisT{dJSXQVlL%HxZXd62rSnSNCo*4qLf*lS}y%8_C#m zCBp&!+ozDwJ%8&I z%;vWSJJdRvANpZUcZ}}4<;G|Y+4&k_=W?c6vzchY;?~r9VWo~U)taj`MAu-$GrP)U ze;mGQ?ZXIg^C_#ySMet{);?10tJY#Kz##s_#@fNozH05nYF`B+bBVw$pV(L%Nd!#r zTx;_XN}WB|+JmIpa?tY-JgFl$R#@TbNYlPCb$O_jzPhXu__X^b@&$TYV4bftl@wyq%*SeVi zEOeo42-AzE+Dn<9)Bbi{I!Y^0DDlQ=z(4=qS}LmKUi|TB;q`^oPynGurYZb)Y`? zrVh9LgP%Tcj+(JJoqLwZBqD49lSV)jr*o-E)y9`vDnUF^rtU!{eWFbL0J&Qy%G63i zq3vDj=LkPKn_KE%)Oo4D!`xDTc9<7_WH7h1Ct+@BPg0e%|Dn^yEF{+MGev0Y0Dtd724jV*=dZX zB@=**F>MbNo%SW>n6#7H9Fhi?x~L(nA?;K4@#6kZnm$LQeIw!Pd5)kDh&hz?cOmTH z&ChzQ@)tFnN1LDZ&x8B=XNbGD`B{$z_ri~0y6cDX=4bs(Bxl~q^RAy+n_-gYU7t+B z;CWF5A;|NtUqNbLzYKN>Ugn^YcksM~8MN+J&s&Gtp7gK_HsV5?pY{8iB6^>hpMlcX zA0mmIXR7tzI+XOcrE6YKZwRc%wgIY=u6Y9%1KbfCYJEeXu6GGH;QoQ^lXU(*Rk|7M z(lN<^UCqr;Iu3IeHLQK}lim%ef62{HdMFWEcVMl+e~#`{?w z^TI8Pc}WO{CeEzfFv2(fj_|ib+0ws>+R@-fUIcVg4+K2Z+q6%(kxg?b4Q%>@8*$Uz z$fhN_8`-qXc2l^KO%-q>&l8zL2p7SmFVKV=*>t$tjch_6GKk&CrmLu=yO9jybgLW5 zz);!Jm)uCk{}7&ab|V@5&^4pkB>?bzGWa=z8_DPeHC;r-AG2H=0-9$Q#JH*#ttM}k{ij`NBxq4 znI?E3xsi;kZVn~$F}RUT7tM`i;KVg}AlyhMUUa}Qxo{(y^3#+keo}+CVmP~z%ys~L z!EPk86T#VyWYRU3Og#1qZmGGE%(=)t2RD)#&Tb@gJ(BD1&8}6!%G1C$gigH^46I zb!J!7jbx3a%C)Y;Q_~G<$>WiHZ`Z^uvfe2~}m!P?WpWPSrHX2{j`pR1Xdz zdxnd>IaH91gQu`}?nWX~c%@57PDEKtakP-V7N^&*66*|vVuzCd0@w+^l#Mr&wbSeD zLlPt;p#_cZm$E-W?pD8){UxE0U&_9U@VB#H%DJ0*JEs9ja}&~(8vIgDGx(*PW?aP$ zn$CF~RjxSur5t=!^>%&lbt{`(G&Aoh_Jg^BRGY_KZWJse7kh)SLz*AV#gGXrB`T%t2XnEJ&AsDB zHuqmQvU!j!4<_QYkwp=NAU~MP8`)gi$by$SeDfXrAYq1o|DXII`Y*33sVT1w$FD+GoO9l>rif0mbRUy+r-+BMbI!ZwP`3Aw&Usq{lIkC4skX6!K&owhYIAaRUE^)L zLCo1uw)0kF`-5P&9a{~UOHJpz9p_~*O!Uj`KSi{?AKF-7YID0vgs_PKA*s#ng@g~e zx1Xv_?mDjV@*kvel+P~1WOs*a%YPZ60~~Tc7@;^e$bY5UwdMOr5FZ=l`=gTX+VU48 zCtVwe#1es9jt%ltiGT^-Bp+@cUtrgNpBy=UqMLv55|TI*h)U4C3Ei^D{~L}j|8MH= z{68=P@^O_Q>a???D}YzOoufldrQktwbOlckdOn7 zT>+nG77QW8-h`-&MpVbTAxegf1rr-1n#3N6s>V`Pc60@q?14T0(K+^A}13oBlB4x1<@L9+mIBfeBtb)hKLeyCj}N6t?3pr4)|E z1BBL~Rv3t|z@ZfJGiv#x=O|h(i})68;cAeULx9Zh99Y0j6{b)nQh4D;7xY+B2Z|m> zRQMxBM`0(0+j+STYcIq^q9#Ivg$`bhi<9NTk99bly?}qqaQc08kW+N{pAuelKf}d` zoQm|XA{OBkfbom?tB8@E1b#mazX<070zQiI@l`{68)%?tG6FPEJ{FA>>zpE|r(H!> z3F385(ei3d04)W%Th}>7SUHuCrFBkGK0>+k@Gm+{7F=`y3Mq0p%+VY4F-F6`=xYrB zqOZBiXH`g6qRJ`f;a>#h+-~@zrc(454gcbLgkJm@#}9!>v5AQ2Gn&))O^TZU`dd9h zdI`EN7C(YOC@lyDeN~JnKlm1nh33CvG^qHz^w`C85?DMO)wXFKyV$BBZT$ZXk#}HE z#h;SPF8-1T()O?9J~u?XbuHluyQC4|B{*YrYM3@vi_fi;w8hvjXdo4|^(^O9_`w}fH zZ4B*~T+!Bar4JKzdBwT3IoeU$y!u{pDegr9dW+1Z=$=v>nq0xZp;Toa9gvm!Lio~g z$ZykDbfwYAZ6K;^ctuxQgk;g3cDAKOwX~E!nL;0;Exl}5(V+-J(2A~S6Ttq{Y*&dzvD;pSpe5Q|R_x50FI8Q^u~A4y7zqE}nML zCokzI5~}-oR{&w4pLf;%CZINr)S@13XIs{uNO7N(@l(aJeqdLIoe0>~Ts)Ocr^>Z2 zp31CfV`pifWrv8+9wsCgPi5B#A99!1`rATvTs)QYb)E9TM9*Yz3x8QY31L2Fr;X$< z`I$@k{o~Wr*^ds+CF__UOb4=eXseq4* zfADtRvtp)0ad?pTtXR+(k@(3DLRm~G(0;|rYVTQ*irUR(msM;-msMn;1(&r2M#V=O z((kocQk@PX$a^|k(h9@TjtG+XbkG$mhYAfjXcOxQ2HziDC>u-7bkIwxjyS6AJT@HL zQTip#?v4_%oO0}j({Sw8mQxPwMOK_fLmXJSt+=d>1ARHwMq5tpei4;+KkMAu-8gGw z7407X|7k6R+Z{)Z-MxzFDQ0!LVve4vm{+V<%qzRXzVJY(J&bnuSp*!i9{!_=+NF9) zh1-X31G?u41a#q^&&85z5B3IoJ_k1aVM*0qTT<DyZgzWnospjTD=)tn@^Q%>M99F*t zcKengtb!hY0|&8K+816u`1fT<5HFVYZAB%0=d^DZa~r78mk?ofnDBuZt{!5xNnWd8 zwP`?w>RYKDJm9{8ClMa{>DrjOn@DS8@;8DUk@EFGQfyY!cG<7b135j(8 z{d}NMiglnn#5#b3&4f?1b>4xQQmg~DU6~6Tph;SbJ<+5{p6S2=Xz9QSUZO+x1BW%r z7g46*1Zz2HC2Kjjoao6P1UQ&U{L&2kw4Ob9x)ySE;s*^L z{IV&cD{cM8}5je?ZY%ie^&Oo1zyeazz&${8{UQgWqYIxXHUD zu?u_u5e@!69+k1S-*3wBy}ZkMzl{#Zag%^!=Yab?Z3TR!4j-byv1S0gy?`&(;kZR3 z@Z%UR?%lqhqr)>bcq#Kw75JBQ_(ctlx8^}#+{-=mKMj5eYe1%d2qOazjW#g;q4qkw zwFd9WaB;uske?2psKMtmeet>7L+f-nb_RleHsgzTLk{iL;pH0qB*Qxi{@>~FuQd3d z4CjYdhh5+!7vKl9@DE#;gb%8az#2aRKca;c8!z_phiB1$nd9+BC-{mZuOZ-A>FoI?YB!YP zE#*fD+Q8m}pm2#tmO7N9EyUbPp6-VgZVR2k>WRLAzaa?ia8qan| z8{?rwS5P~Ofqb;BLph!aY}ymyA11w{I85XsKCU=A7^Sx!R~#KhmB^(Z9Yer6Q|hoW~WYJ})0J#jorpIU-XXn_vjs=@aVTn>|?7j*a;4UStv`Y<`>s>A=5@M8}#{Z4E~$HX-{$ak!n z27in3g_#~3qv0PLrNIMuiP})$N9gbn4Ia<%4h%ouT7w^Vm+<3Vn15FRAEv_xXz&RP zKOo>MbhxU)QyET&G2PI=$8!)WU`uDIfBEI;<6EoO7spRX5U($epR4X?pnZy0L>vMW>Za?B~NyD zL-ZL%1r!Cr6i@cjP76-rfnJI?>-S`&c1`jm+@w}mp}k3P5^E?boTs4GCx5`ifAWXw zbA?kThB}`sbfx+C)FTLojQ>U5hMbOcZ%-? zpGqcnc4k-8OPzuzO?kZ*F9ofg;-@C3_zK>sOHk;kvqW82J^a7+WardR4(0SzxjZ;^ zlX(8YJmq%!^h<<^CZ4YC&9*un_duDa;ik`)&>HM?P*X%9WEiKTA>HYv#KU)&7b=)~xHJy7K`E$)lRp(lwh39b8upv^V?_!@@)k;wq@Gi%FE&<#L;03zrIgR>r zBSF`b>H0KA#c7&{Jcl=WHY|Xa&MjmQ`~r=|bD;>Qq-xKtAjX(zHbnATnD}hgkV<^8 z77pv6En1P&b`0k}BtBp3d_LAtt}&l?n9mJJ)kpFCXzdLx-1W@S{%Jsr*ETS8DJpjF0nbYW+Vt93GVEe|Qh$ z3+;UwAujMSsC4aqI6{ZxMFjz$B(>|(N-<}2R?PRN zDdq=WRm_iiDdwlADCWlRE9U2d6mzrHiuvX56m!dB#r(#n`02Anin-Gj#oXfpzGYmf zm6wZ#ks}%F3OvUW~A>Ld1N-;0&fona{xYlz9XH4~RwloZD;C#ir!4nSqQ%)h5bZ7%d%g>>p5JW^>c~Z zfD#rBF=TLQu=0J25?=2X@u&$-;)TpJ**z`cuZOn@r`Fo`B61CXn=?>BI86ZJ$`tW; z=@{MzAd~%FOZb5Bq2aRtjoQyB<2gep7^u335;!vfGua1N!smqth0`+BI*f6mID@0_ z@EGJn{JEXs$w){2%Ck#&4y7|VE%_IQpJPuOUgjQNX4{LCsAk~@)c$a()cliPc2BSx zXo(mSF*4#Xu&u)pxkk+53|K|XLte6qSVrUptB6&Uc4ifk79rjQkH~P3$Pla|@>EYF zt3j4XbL72|lYwm`J8+GBmNQs$M>eCv`aUk0CnMiP+FHVC(UQpSk(0S4k$v1F`v~%p zgQIGYA8d&%iY$w~1nj8y5xGX57}YguEx=YX8rP^H zoPkJDl$R}zno4Qs7DvsCTFW9uEq0GuEJTWmP~SDSc&H`nFRNmWBl1N=-ufhGpj_(< z)#R;jRgl;>u&WGoUF4{Itg>?#$gugN^6pp+8uQSk*hVG zGiZo)3-Yq@)?HKqjyEntBYzO}O!nax>oMyo8%$oYj$!-@oWa1eevZ5}1M9DZFU-K! zkkUdaw&y7AOxM=R){n)uwR5+%6Jpyss{@TTn^hIz}C26xYk5&Q|BEX~2p)!DLj<5bJmLGqD!JHV&G<# zsEdePqd(;gj3Ao4Cv7p~epRAxAZ^fWj4SGy?B14`%Q0WZ+5xtbs$661a|T8b`&2c4 z>`PQ(I=i4)S`$lyh$YiCjFQ-Kv33?ac8YuK6d`u(Om&D+Y#&S9M{$>zKTFsjA#z>* zAZMV}<&Pt85OsNDz)bcrmKAMRycO?8IHw3_#k-uj`|i6}@W92%HZ-|{2ksfx>WWCJ zd{(4WDSb|)cT)PiNS~y1rAU8G=?^&_k25AE>VimYmpvXb-0n$ z1j}lV)%{kJ+HLEJ)oMS^publyMV`!bIh+gn(WT?+$kjVp`qeS+t78Po)vMGIMv@aP ziA@q;NDKkC)t5*nw&M(xljvljiP)(bEi`ddVhEE@9OIriMvzbRRYw}hPqHLtCgvpm z25j3*CST4ONSsJ>y7hf0b4Wa!_?sYk(LM2^B>A~I%1CmuC8=3bizJ#>ZCJJ`u1VcF z1CmL!yfBbV@=999B$LLvCyf;(ll)XKBgrY2q_U(v$$bc$7EP{6=Q-1$L4zdnC~}x4 z{YhzI*U4l_avUV{ux`UGN$!MlXB$uM4N@k%uO)d)a$fQcKy4Ecxh9u!26|3rMZ~Z* zB%h%Q&NiO>X)-=AfjKSt3-{zNL<^FCP)8eE;AdHru_k-XFNDp$a!na$pp-THP-qp> z3Cmb>YRxZ9a!sZCno2=(&1LmHBT0YDy0CRo>y8r1bVRP}(l~>pAhRxg-BBj9F3Wvg zmLP+d6TOXO0xau(S@%auXJA_n(AXD zIn|OKG&WX_nN8 zR5jH>*w+!crf%a5Bu=HZh{3C-(k%j$eYz#>x3s_3w;>#|64&)la|Sr;+138#WasN! z17@<%u&lqf{`v-Q!XdkG-S9AH;5at0OBa^5;SH)F@HY%bx}THZ*zg`uO!k?U^m^&$ z^ejNF(L^e}F=sIUq`yq)V&ReAiPC~p`e>xB!s^m#Xc{z?9-N-Vno19MPY)NGN{>~? z8Z|Y`l724z;>H%hwozZYrvJnlv^xEFBJbR{8_gSAFv*Sgxo^Brklgr~I?hOPwq@hj z8^7N)oJbxZlAG?~43x5orVr~&-1^=jr+_spq+WaeCTf|2B0%jPdPf1AaV z%C#Cx>)aaF&=*v%=l8 zWVdI<))Zl$CF}dFt6PQ{agBtAw_*Q$f$LJ6LGR-k*Iq`y0ak7?ErC17Igbc2avG@< zjba2@ax6LRaz+6=>Jui}mor3i5b_2waz+AXvM;u54c!{KH5FjnGla8s4QG%Pthc5h zZ?Z43Y~8puYb$vzD^Jl|cX0;Zbn9*uN^!T+j={iZ>)EY;vglhcx^I=!_14eTNk-9w zEn9Eq*3W$&*im01a?O2|GY~zuQB9J$&jDt#hgfn)=6dI*0c@SmI8!-8IDyC;Ix=@j zZW@b`yUaaznb2Tvj5^sU#!^e}rra&LJU#rxB=>QKNFG5xc&U?v&OHT~$sTISYnb<7 z9tMYET|hW_%{T+EnrErT$?HxP7W&WzBySATQoKAHmE&n7eWVGa-KAq*cAhv`$lLCo zw_S*uSE^1iiW+9gyO?)rTYaMRGa}c#UpWI&^KKw-=!9*qfSK&eEZaJ5>%NUw5@TgtZmtjTQ~-M4KN;%(ci`WnRxw`@DS?Zh^6 zt5H`Gxo-QKGZ1gvkH{Ov`wcLYJ;Ji>#&(zO?*eQMCYc!L|V2F**-HI(A(9wQHApT2%w&(UY%khgmfw(Y{y^lq z{S;>i=R@QT+SvYCenTO~H}2cNkz!m`{f%N+Ed{R?v@ReWN0CZg3p_akk_AJl@HZ#B zDi{Zt$!@dk2;Q-5$8Q9_MmReXIRm@ev5^YJY`tR_rNzXwgVu$T){bwHcAoEc{0elF zUA64=+c~|E_8?Z;4Y=-H${EZIJ7Wl4klmS1X(855n%AtMEaFZY;Bs@i^OmL4&R+`g zRemUT=XLj;*M&9;>qSKxwGnM8oLji4@FSwM43TSL3}@g=3RhAgZl+3YQDxCW zF$jx(D}Ibw72R+zx*=Eea&gMKZ>ST>qh@i@Rt_Bcy% zY_Yv~FLAUoP6}tx`r=K<%MK`JQJohP#d}cCWM6J6zEb>SNn2F4JIDumwqlpD*Yb!OARevY1vh} z%Te|mux-tV{H_a}0r_1{Gxjc;1jM1ZXz;G3}vL7sIU1Ps*Ii0KdhTF^1)Hx_|WWAelMkOa$2;iybsq}!o9>N}^VRrCWb zlRe2&F$g!pl}_P=n1IN&!dGT-rd2VQidP95F_c~{(wiuqDAE;_P7-Od5oF=Bg6XM0W!G_qYoY_B0)cPO3R zLCt!%VB7hAS-@;NI}K)(H@lT>=U2JD$-Wj8J5y+fu%9TVN{W4C0gMi*At;qgOXMaZ zCk+p|MU)ffhTKZzYBaKQ3d+S=1&NJlWM{cvL29cy$Joeq5T{Elg59BX-3Mw`vTf+L z%UW5`uwg^w@+Bjj^dd(Uqr?Fya-UF6%*Du&VaPED3J+24iZqO_%_%307O-x}SqEvb zkpvS)4A?B>bQN?BBbbS z1*7gBvVcvfyJs~cl+#wm2JfzKJyAB6>PxoWCxdPG$r{`4Gt~J;wrOD7V+6u`2$zT& z9YdgfJ*={T+4i7Su0CLTtfh)Zwms6RzGT}Y3v7GH!z`ro)dfbj>%q3?8iX{5;z2&Z z_Nrjp^SCTvwmmNp$erB?Du0ihHH&lFIPHlM=g~p3?RgVyd&*e{<#&OqVOHA!wjNms zxdKGPuMC82htj(XD%x5J8okP80sJz+v=*?@ z1qr%&)9Vs))<7-yE5Y!PjbXj-r(7E?_af!mIxXrzwKG#T**AiB?*#};5OxzuGD-AS z?-*IY^7mee(i&#p8)LoqZmFo=G}e3TW4-rQb)ivFn~2c?gd+$)5~GHa(Ir_R7=4A( z8j9-u1J^LwGeDzHGlUiheo{iaF6t(Q$K4xADZG(?n^mWsr7z~DMvq`#V~Rkw%4_q z1(a*aFwN}x?Pba)`)2U$-v7i8LgKEg3)G_*65M`d0fL}-$FEYB9uB5Pt;SaD}3-6veqO0uc(WS!e)b!CkBD%JqXQ+QGLP4^9fnNj69#cm67L* zT*G9~AsXHY;}KF((Hf5kn)RG63j_^Xnbgp%X9(4h!g@wPSkDMeSkE|hiBZ_CU^Kvt za4*6e#Hg)cG~gv!z>EfvQPt4OfVN!2WX}bSK_d|$@SsAXaahn8G+!1ljX}XEts(3n zINCwlTPcI$Anc$xP1r$+YOqn*JTMykIzk(SF~o?(f>s6(lm*Oa@CcOF5O%N+*D%?) zfyR(DgiQ#45skfq#*p2zfN2bQAEh;f9de3lNX-tZgs?;8lMkdWt06{V@u>`D*nW%>sUc!gh>`)+lmzVCw&z# z;tAyRRltasDQ8>-jA%{RvLPehL_Tzhvys&iTXZiM za6?7}qqIgtMnq5zjZri)iq;t=sG&wiJHTip?0aM&0#AOlUBt}WyWTe zKqMb<_vwIO1vT5Fh|nyb0kVLbj~S*UAK0dkc+if79~k-gX^ebktKmjQrNqdA zu-~DKF%h)~B%_aH0kYa`=L3rwW0Gy~`GQD)p_BeWjWCkl1=3^dA(#;c5$VST>9J4C z0&c@tHv$>kF!nX7AsLNr14d)pXpF{oRBIfQl@X&Tgct#Q#HX(IdQK9HM1!v zZk8aohjQX>334A(PTVd*?i%H^&Dcb81oDOnI6sG+^Wi9pFiIey$?ky26QP@l(9NVa zsAuy-1d%6xCkt3N6MrF)Q8$wmsv&hV$pqa@GHJS*^nhwJ>Si|>O+o)oLI3*FAhaG4 zjHYao1-!1CvK^)JdI&1-rHbN$2yz!GC$OxkxQ1)?3*j0j z`vIa6fuJJnCK^9U8mnZ1ps@y}HHF5UvoT#*)!R zSs)lyp|qy3-*63+{e7bGBLe!ve+bdoCTRG>3vvNZi2ipI=ovY4_&-Ux?Q-Vue;K(N zw&>rQuw_I1X^G;mFH!uvs&U4K9D)%3BN4n2f{Au7M6gBw8M1&I;y(|iH5%f-glm}W zhl$2A1T0DYFA!0NZI52>bAR^$&rXwLq|)c1#v9+iApBijK-xDEEqi?X+L1zGOS? zFR-2Vm&SH_ebsJc`vKU_7>h6ofyRk#gJ3&jfh=H+&0xo2WHck1YDh*i;=yP}yvAt8 z8g-?S(Me*o6QLC06Yz-oOfotl3k0KcD6L^tGd|`TCi^L(@fpI`4rS&msA!!lY5XY* z1dW?0t>K1dny7{pcILehcILgBurnW36O6*12BVp;BeX#n1!_^31*4fBvVa-Q^dwM~ z!H#B*GrcNSdv zEOGk}2|9qEr60i0ny#)gHsmY`0rxR07J;0mP5RSWDYAgAYF0Wx`gUy=+W}r4!|97= z%(E~&W>rc3&3d2MzOU(T)=71>k?lER`xU}>_?7vms1eU1f(x15P!_QMW+lWbwQTp&c>Q_WV>(dYOFq-GCF`D;=TH_h_B{0Gd+$-}&BP=4ZpOcINWPxBrKC339g_ce{9WB6Od%;!7Xu(M^ zT5wWhwBUle-pJ@nFk1LN!ZG}0{WHXr?8nQ);Xz8^`UwQ?ZRQe>V z)2i`nFbaAR;S~gLVnibkjDp(A0%jES_N|P9x={_uD5y6W1@+cc7c@wv_m!O(eM5}K zBTPY93u^q<7cp8a3)s~LEvsgP@;IvaqTvZt5NrqpO!g~8aXmr?!p~H(6cJG@kp)8Z zirdgYuLu3CiB7#9r1yHz1$C2A^lypLZwPiN&u| z4(|m!EhH9q;`%20cc8d92VuKIS<;CrzKjT>FNSe(0T0NIZ@7LM5a15-+;%iQ=b;rW9>yQ;4>-sV3Uem(|Ti(SCwxOMgay`Goc-g6|=M zXrT>d0h>$B2)5*FqBhBfgr!nNET*&0>J16oO7%6i1;n;M zXIrLb8`=H}w#%XsRv@H-nw2~Px_;SOS%9oI-z|eqQORWg4OrnXAiRt~-DB$^u)^P# z1>AGt-B4OXE8+dAh7>P+FvJTVtce#sTFo(v_d6Ix%tV-rkOFGfeS%R$uq;4U6E6Zb z5RoEDM?`^iM3hE4VuiZZNcsB#@d0zOENq=7H*zo9aj*%hv8TF%&3x3E$Ygg30 z4wBGhzYdYD{SXE^#2bs&si=+4vW}7kCX)#{>JhrR#21SAPOi?(nn3i$0vI((EbA0$ zP5e|-zPJF`C8}v$OId#)K2pQhYtXRunxl;^nQPHSx)yCqP?0=yF(Fq924kczRDq1HaLIa{V%L3MSG|k<*zN1eNMNPxe zUs6tE9sMVAy1ru`qMUe91oYggrcvK99f*(AcT5-PJEn`K@0dPno>AX7Aa2Yg1b+n5 zx0SR2abtpH0guXQsH} z6So#Qy;*VjloJgB-cjVpB%LmX#+@TtTC?bP@!~$xoArg7Z){dQh_oDvSbjgki=bwG z6A?sO{BuO!e(>4lbOQqH(! zT%J$$rRd9xA^P%SP4wk^qKuo-mGz13DTMO~WIz151`@qW76{S50jQ?vKXDDy$_AjZ z0_M2_<{3YVXq-X>8Y{k(1>7Smt`bNSJ^pUWiTAEii&P^Uf*g&-8VktycZim3R(y9f zE55tdtoZ&>#;xf}6GV#lL70FLOVm0bf=KbfvVfZvAA!;u&5DPL-U|>)Le&K+(gZ}h zKoWZI)x!JEojV(L3Ge;!(6iZl?wRwQa_h|Oj8#uM5Bt5Z;Pu-LA!z=Z>-dE;nCS^ysOl-+m=X@7ddOPq?5( zJ>jNhrL*bv0c*Vv`VX(=o=&>?oU63v3G6=BBAPrU-VySS3 zZ2;IrtWFZq1rvWH-T%V}B9_>RGZ<{*E04k^4tN|k5$lD-A31E|P{1Y*)nF6HS}L7k z8xrhB&{n*Lx+Upu$6=3i21``p={kVWb&^_YKy(>D(Qz3+@u6jvGf*P{C3ge$1mzGA z1rYuv59JKzU-D?GdVyy%nKF)s_~^Plc{a&&*yMSDO`fOummF?c?F{=A!4`tb@IL34 zpv`oU!=e!}2AeUGw^P+2w%dd7NrKg8^yK?ga_$W&dODgLkNA|dbfmUy}Xd1XKBSz{BCZV%7B^@Q8 zrFJ2$5$T{rk`A!(QhM)%1Jdx|;rwN$9LCp~L10 zst=;{n2xAAY-l2k!Md2OHB}wu`)8YklB0{+`ccWbi`fF{XzqyZBRFFFNXvn3l;sy^ zN1h=gz6H$!r4tejjmUv5nlqRqHU(T4M{G7Gp|d_qI5osO0QOI(mKj7u=Eb-f$$nx8_LtI~LqH_Q(lI>vJ$7eKKeo$U;aI zDHxGHk29Df>7n4dIFgR0f=&tdvsmJQCPw*qWNC(z3v6SSFE-~*;-4B!j~n-M@&D>-b&7?fNhmNALs zIcx^qsF&fmQ7_{=%SLC|)&z?zXJDC=u?pHueK>3pXRwH6ECtskVi}c8LTB|R9oIm& z?Ly{I(y?FFk!j!zW_qR=0o~d2($$TBAXTGjQEVDNrC*_pvHh|6f z0ki zpuDl1!GQ86JPwriHA!%wyqN&Xo2hw}_oHRAGf+DKDYaT=ju7?rg9{|dgL zlKRs{Xo#ee_A{!2Oe$$771;AP96zHf*h_WVDTabeR8oHosm+rGs);&ld)QoflisF_ zcglK0&~zRjX!}L5nK9U@kD?Z&Lp#|~^a_nj2)$oKrfL+)Ry2#X=~14I!Zg#p`$C4 z&{;c?j@LjvKrimbT}rdZ!XB)oWwrEII$ASg8yT@pi+brFmTk^P zbRi?ofiC0yw|=C%6Fw+nSZFW?^Oil?#B_xX!5UCm3zFbKWvu{I#($`eZ!cK3I|FqE zP+1=kW~H(}fML3*0+kKn47SrR8$(r>_=jvTT%GT3p#u(xsVH zK_*pbzL))C+2L%`OJveP&|i4#FS%{5zz2LUJHr`l`YF3iKw7h3jDlcl;uP}5Pmw%_ zUEBJ0lbU>9T7T$~KL25n{rfdf-_ji7q6$PADlwI7`a`ntqc}Z zZWlXpyZ8^wPG=wqKue~BfILK57gC7A$PlBs#Lq{y<% z8R!)NE$t6_7Zgw0=BYqSG0!mu16s-k*D5EEmVQkV9B3)cb4wlb+|nN{zdHlH3ZU}a zAPk?&h7-_FD$uf)oWX#W(NwUgxf9SbjGfE0yH=OcT_MXHcZDqLY1!=z^csLxVDMWJ zj`xywBB1#y(25++aHp$?E0$7~#Czk4Us2+)A}Xr|{N{TB+ue>;uNSWPn~vt*uB6|R ztaSXAWMzHJ9%m!E!3cT^{mL_Vw`hMt3c&{&%1WqV4Awp?Xs~n`QSmgD9(~*mWLuFu zhpq4dY=w`O&5Ev;z0R<&1GeH_(0d?4G}GJx*oqOH!Gc`z8MrP3V8tYo(12(OS>aeh zR(xl1e)^KNI{}4*%%COEW_pSPq4hC_3Y0}v>P1Cu?5SAHBy?6^=%~B}x{ud!hLT`o zRmUnFXRu*q6-9;X0KW^B)IN+-Ka?DE_o|Pm4i6ZAR9G zea`Xg0h3l4K~bQ5($*9oh~KJg&OlLfWK|yH>8w3*)M~WR)h~ml&{56QqgMCjj7N@I zjX`wv6mHOJI?1)#aguBG5X+y=2KkZduRs_JR%epx=3F%b&loJutK+E3InJvyn1s&S z3p&<#ftrDWNw9^gW6evP!P?@Q*T8kea*hAv8rPszt}37z##=vX@t^ggJNbWl=|kF{esgPFc| zJXNVH81Uy%$$6Mx8&2{(>T4}9eJy_~DZW`P2b@jsO|WI4WuSee?E`!e>?Y1&rmx)r zu1hys`v;TIS^JQVL!e`LBPI*xRj%VQXRsy0+8f|HqQ3SaN{;zzT@xxfFU;0GPe*e{ z*3oSX>m0W&tm}d&?mBIk{9(kpa!>`{ddbEbzA#(2hclQX>kb0Q#gTQ#NkRiUML_(? zF8FrYa>yB|FM!q?K#f4dq0JnQ4@8V!LckadXnp6$f!4oD5*%oK4*;$2p|z^@eO-b2 z5l{{2EMAJKhc?rP9Oxcrs6Z4*7mt3{F$tZuKXm-O3xr(#qJyBhQq}SECC*^2>gSua zIw1TXN<2|oJN?Cz$?L2GpwZq1^a`i~f~M=LM!P>}u%XNz_^3wvDAI_Z>=*ABAT^B+ zyD?5(9oi{;3)LTBX=wHY(!~R1PeGvUDO#ZHISX9YIQcE`hRFF$taZZPIZDbP;ca>`yuJ_qIqck+-T~}}cR?6$Hr#?X^Co-%cEdEzV5V=F39d_wHef-%;TF9jWW%C% z_=v%{w;=}pY>2QM4DQIrhGdYo4%?7Lrev8ny9@3?__k}DTUfV{*Dz3SI7spWZhXs3 zr($(&5ys*-{$bsyifF8LjnG$TeV44h5Bd-9tn2{OObu15H#X-CX7$Ea;JO5SV|yl{ zvkrugjemj;jSNJkFWafLHjz&G9o*AehvsT;Ti{MRNV&jbEzOL+NfOD*8PwzV8_ z4)`Fz{)*{>UXZzob*hh5*k9Lk1{-3Bf<9l}RZa_p&pr3TOU)LMhxq+>_xtO3x! ziF6m?or_HW9Y`ago6tBJgSoY7Gq{eiaMM20=zJ+-69&`GdhXVylW=R(NzJWImn=t} z-3kQk=7t~yWAp3KW*Vl#ZtlPtEF+t{g6ooz&E1%U&iWqdK(pKYEoeLGxXX2fa0WAd zb0k%%kM9FN4JDV1Y|bZnZu;g@n7+AGGkx<)%U{l>zfZ8cL1+w{@00Go@qvhK#<<5A zs_9q2jr`7OwY(VvAtZFx4@d_Z;}#sYC4hANqw3g#2F(~u$Cl?G*RkaVlHkT}=?Y`F zbk&UA(%o{*+1SAV+A68N^%QsoRggkbl8_TycXZlsM5 zd|PjFhU(vgT3D^G{U$OAo%Lhr*!BjfFNhLu22qT*jo}Ordbq*1Dd0MWkZnJapg2yQ ze6~H(e4%#R8f=D)a~|CcZQDhqF4=Dc7-uGg#_(?5foP;Ug%yq<+UKlIN!Hpo{1`92e1d z+_ao@HvJR8(n}Y2jst~|w(aD7;Se-^ zrs~+$fiswnU0om7u?yqfE^QIE%MZrx^3%GS==snPEI_v~Kpnvxy&R~Js{S{R?pY+%r%p`Qy zF{A?ucOM1O=wN=9>-d{9P}EYi8^bV!bk?yrYR`wDVW7Fwgc7mm`C} zhy>MlXP^{AbDFr(M|RgSx!5r?^7~jJ7_nECKux=e8BxZCpm+; zzvlu~opzdB_F!_sAv)`4qyt{<#bJ8~LC`cu)v>oZXD}UmTY>A+r}wre3EnaGc80Ng zJ8NxiZ#T;sXJbDH(B2O~AA?e%&HNk(n#dU{&@^yejNLnzBs8G;1T^0P6lpo@3^Wcv ze?aCB`b*kOq6+lKyPUx~{vU&>N_*tfALFQ`KJrOR_8(YDLV?cu1vKqz0%`#oOM%i+TXO~j z`m@91K!0{62@dqm??LlHIV3np)v-T;GgKXvYnQ0(&t?)j>m=wn0EGvdf@th9w^el< z=)@UJ$AMSC#Sh}?o_5WS18W^%}AA}Mnhez-6I)>5ln0A`;7+tT|@@;hz>m-`34jRe)3tx%##-rV1*wH*J0j@FDg zL`FCsAa=aka>dz*|B(?Gtxh1yCpwWf8qleLQJOJW+D^0v*JWpQ0>d^Wbk=X783FspZ6vr7X zQ74kA3imRz-|n0!rP9Yv?c+o_$!oB5lhX;uO-?85mTS&2nnAD!Ku7ID)$^on7>C8U z&lswIH^Fsj+9w{61P7`T08}Mt{#DhpTz3YV381Q>ppl>h1mvj#Rei-7tVLAKrYarl ztKeIxq#vhxTa}BF%W|k{86B+|v5JgX!I+`0%Jr_n)&((~mUTC@LY{V=wA_J5QxR-Th33>GvlF)#563|Wu(0Ard!|y&EGLc8wHhInL5FG2 z%B)#Sr7^4lqmJ6WOKfXSkY?_3&1tw?<9K>l%@yN&&Mwb^fhT8!FwC5^Lz{UxKH&1n zXwG16h;(9lv}(S!%iM3^W%&r``t*0hJTbCo0gX8Jxj@PR)HB z=+pv|;6SIs0d$JLn`+nm9GPQUj!(CLp!f&-nV znc}o#ra1kD<*qZ(4*)tNfILB;6VON%=uCUgU_fWOJPvf`HIm>!XL`IpT7T5@`N{*PU-prSVSN@bfQ{W^Um5mtf#|$1^a_`&#~XHgG-+ zJdf^p{*+y~@D^#CfDagW9s>+xuqd6s53a+&3pBbo47|{i4pU9iQgxv{9nFonK%2x1 zj!oi)ZkB(XjaUF9E(`*F0Fp@?wN)5#;WN%)&Gf<~a9w)%g|A3L1DZiVGqg5w;RnmV z&Ojjq6bDKKT_&KfI8YI1u+j6vQmWE^VsT+3N-jTaxv+!eHCX!P`US@?*DoBg{O1h2 zkYI0s?%IWmZ<6lGD(uDjoWcCN*o1)869rlzFFr#O9O$AqfG&D#{$1>7dFTwZ2tXJ6 zf!+a;Yvw5&=u^&6fhL0M63C0wn1s$6N;=SFFQUm_>O(rdRCQcx$Qew>rDov5*hiPK zm!2mHZtNwxx_QZQb@NgeB-Uvw69%A513&{ou>>@g1Ho9vP=Ux;m#AEVv6o^spy>oO zU5m=4?`6>$D4c*4P%3CM0R?fO3eHf0)`RO3l}nqLgw7g4I<|w*{V&mIV)ElUsyRc| zajp&>SDA#)8c8}3*-MD*Woibd-&Gx#(F_=a>9|bIz{QTsXa<+HW^kFB!DUA?xZF{8 zb9UGWpv!0mm(dI^he4ZpItTiMGgP2Y>j1(aep!3A(`CBh;+Aj+dl8@!6C{Hpfr^Q#L8Xo2R@ zRikWh28t%2To6Xqt0xJ_#DOX~Lk0S|4xr5>p?S1}fOa^5{*>!E1H}O7+N&U6kePs% zszBFBfXX>g1!t&0bqpid zFpON&PQ6^)PC(loK>Oqd&OmVlgfZgUL%VRj4*@Mxfv$UT1_Qd@0$dl5uD2!$?$P!3 z0J`2@1G@f_+|U^)9zfT_L1xe?0;2e#)m^u72J2PVbE#?&Uvpevi;^oWy2JHT8tiWb z>v%NV^}TWFXd!rDrHwrax zZ*zPp z$Zu*tOt@JLBW@OJM%-L3dpR4SkP(+a*X_csPNX{u9|-x)e>sEY_Lc{@E9w z(=ErY=~k)S*x92b0NoxALTGO%5D{Q=s#9;Z85o z5v%IB|0|Z2q35>l1 zV;O_Bfjf^F3qHljvG~1{hZ0|pYi;1payptv><;~W`;O!1+jlm~Pdgit3M1}L1Hq8H zEH&|}5qB4H25bL!X~5(W1K(O}ga&&T)6!inQFpTedpBG2{cefe)EPF7U=M?i+l6~g zp^ZJ40>0lp#~CchcdypMI)Ltw1o!XmKLqrT26WHUwdvUabZt!ng@<6G!Ncz zZJ(J0v>WuNUHJP&0!rdQS2#ljx?Km*KP16{{&oY<-)>sy{%#;QclIa?K>s2J{~AGu z2q;+v`WKy_F&NOldEmM<_J5a?1PA(;8vDPF#{Ta{xrH-O_Um?0=mB~Y6iGlS3`i6{ z;0yv1h2f6@iNXYuP=Q2Ys)W*1?vW_Wa0SW%kZ1wL+C{hK1Y}cz#9Ypxu8miHQkD8- zQIvL4DSaFp-bL{*DrK+|Z~CHmgO27#i1%QGcuzCJO_WLgRb@Ro>Wc1tNP+{ozeVzIX+ZAp%g;CiG29xy*Q5DgeiLTr4rqh zfLk&}k55qI_sD43^cc^M)>#Wl|CgYz?V{%(I_wxekSLGuIYY14qZCS24*k>_YxS?7 z(sAB)Ja$v*gjTvhCER}<} zgHr_KJ<)wUKL-7eklw)ujQ5PBg>y76*rXV_AL{Sg!bx=66AIBWrD zu+F2SF6BI&i@KF0p#kBSb)ruDWu2(oBzrppl@ZW2&~3Y@4qYfanJHuiP2={Y{2JL|r=t)D1L9DR`oAedJ*wU_obkv}^)R;7`-B@* z52vfddfMqKv0fM1$JwA|P+e~fXdLJ=)R<}Oindzs2hLz4Qaw6DpuJy0tVgq|qvh74 zW=7Xx@NP@Z^m-fVXw3+0oy2{}_XX zzkZuqSPiKDizLB;>f^kySYJCYEY|mxJ2(Ta08st0Aj~oKvk2%H4m5)^RG_(a04*R1 z4G7ml#QNH`5V3x={DL#kN&q!@0fZjkfEMFsy9(6cea>J&4Te4r)L=A8aG(a`0MuZd z)^Zz6g&wEvUj+eGfzVbO>Y>d|!H2A7r|( z>S$QT8LSO7WHZA9b;B$++)9FL_{`9d7F#ZZWfr3jy&TPl}Cl9yOv7HAHR%6#an`e#l^+<7kzQs!0_O zZKJcWsL@$1w2iLG9i1&&4U4?6s_-&`PLpa{HX^iM8Jxkw;#CH&8*uQ_7ZKYw$YF^< z7rjNV15|RJO1w_7gLT$5P~T)IXrx_yng)OKW_&<>6SPIfVCtI~!CeTAVcnpy37Oz< zzX=V8F8Z5nqocWxO?Jb_CcBM!_$dKK-X@pBUJ?bd3K9+N2ESnf;_>tg_%As*z`RRH3M^de8ASG7&;h(wX&vDz@>4)hS+1Bh)0@= zO}`-tZco$iU{BNUm_5O8r)ex~X==6`dI@qTg0&qGh?7Gc`ch0^>b7Ye*|Zw8-7Yqx z<$`&g7=+>)EKl~htJWRkRjlbWr8!YcRMY=p=>jvJ49hartTF0jJVTbPY?{#?Mb8SF z8_l|rD(*%zKe*A%kGTOWn|%l?(-F&NBk`q#zKo|Yb=$ojb~i5tmD|M@t;uehLJ`a6 zTRDTR4x0ZCu49aCPU|?;cFm&ZXGok|)cg`GYJQ1X1pF56cEcN^VOk61`HlDKOH=w% zw?#k0q82`&j-XG;BHqwjPz5nqc3ZqrYmsI|i~c0Rjc73tMzk2H^{5sf8PfnLB942< zCVYry^b7Po`x$5gh&D{@L6&g+*#(@zfSzTO4IYn*)M!A@CNl}0)earc?Evio-6CVZ z#RqgehY^r5n2zTzJ#OrCH<^Uax&b;`y#opak)U~ls-x9R&R|`y)qJYrZ)Fu*(J=0q z0$b7U#N_n2JF(SrI+_Qg6}FIKD{TuYw%RCnaSp~t7}5GH2s;RGG;+bb5g%~Gn}`_9 z5%2m0lWx}gQZfNwxFq`V-MHS zoikJ&Z-VP$Y?}cj!HsP*2*$PY=*!$d0U#Vxc23aaNdo%C8K8ZFe#vCeWp-Uj z{c7l1JsY$g^q-(#GYbTqwaq|-K&hbJf_|M3=o3(xpkMzg2sW;NAn1RVK;M8i2>M^z zf`);X3wnDK(6^x91pS7-pd3NJF$h#G=zo13v_;TwS}W)`!{5!o*zz>U2-+p+w+4Wg zf$j+U-#!N&74+NQ2Ep!a*9HA{_^>@4gc$934+L9w+!ORWdxK!dt}Y-G2r>VCC@4|T z?*?x-;<5XRpx-kB1pRxT2SMhKo}fd5ejjqUFAM~kKf8fo*PkZ@{r-udLP383@jWmB zbVSe}^afc4{h@{+#O%;&L4O!AI*dFXz9{IAAm&H%1^v<1pf5n%1^r)7fuR2{=syPi z$DseX2MBRKjy81swxB=pJ!rq6ukr^K2>R;AAhf0G9fH25J1AVxpKJj75cH>@KlMM* z89{#<{+<32bW_lu2?Avb`m^;wu>D+1&=x^|9_{l&4-haeoD}pIJAz6<*985gMWC&M z{xWbcFBJ4wnuA7x_6Yi`XbV@(g8rHt2)10S5%kwlcm24azcCz?Ea-2d?&iB7w7pv* zXbuQ%>~?<;e7;j3G#G?7eiwPVy8v`o(BB&e+9v4lHv%Dd4-n_S4Imk`SJ3|hJO24e z(EsZW`U><=(Ek?spg=$K$=+y@i_suT=OfY)RJ=)7Qf`eRV8U})M1 z6bxDe`cE)4n*xH4=Dk3$y+s4iLeLh$&=R^@t`H2*pzayye+GU%`zZ)@&%Fo2anGaf zd9z?>^%BSmg3i{^*&21;6F}z#LmQ)DX!{gsHt33AXg30sDj0k`KwpCpTOat?9zM3; zDi}Jv3Mvo`FEj?t1=R?K7lHR8Z0Xn<6b|}VFm(D3bYC!Z9uL|f7`k|Y=73Pw6?I*Y z35J*61uYQ_FFyl9TwcB)7^I<~LxSOz{-9#P@GA20D(YVI2jRGGdeBdxvx4FEk3g#h zLw6t0NYHY@;Ohs<5)3`+gJyyd>z;^p&))@u-^-xGf}t1udgBEU>fUS%ng}Ws482j` zTLC>341JL2KFFm%&dQ3|W8m|3!SFU(bs>6Ik-K1c>t8V47!O}O+#6W83ElB!!C^tj zXoP9yz97WoZ^-k4V8sG2WPpH&he8yp+^l=Mhn@|+9C4wo{0hpnsD&~Q>ptrNp?g?l zSd1vYDu8=H@UZ@AJqX_Y@Oq;B8u9iEqNnw*?%_{`Hw&L8VrC5Q5IzlB-SB@nRu+Tg zSJ{!_!|D5L?1*td1WsRfLwGOIy00p{m)-Doz9D?LX#KM~d^ifr>V-EGi}#UvZaVAX z?%`{~?Gaz0BzMDyd-!Hnz~VK0C(3-z3_pVJM!el9(NlnFw4xLJ!)qeG68pRweokl~ z{xDbwzaoWSQB8t#9V0~f^$rnVx_69tUG5$%M7$$KytD9?ac(7Fm3)obk7QrAq|{lD zbdRWr_$}fbnb3nwh}g#pn7AVdR-3lRiOjXYh*M(Mh*QYNCBg8{|3C#0LQF&t>kjKK zp?k>nh5dDMPnc=lD+Vp}q`$^@;p^`1k-Z`VO*knb%6ffhOOQ6M#j{*lv6 zJ>3UK&WikA@GyQ$UW>CL!-Iv$g;kM1+70jA1{3GzGb@CENV9ijLPjq)!L2$n+HQEa zaZqIDIJb<6k(UMk$h^o6Vqj#67!--0i@=tF0g=D?MAmpm?&U}9RF62uj<_I*K1L7k z$m_iFl3MvMRT^Iq1aIThtY((6aj;-)SZ&mkfWwp^qc>OMZ+yWxNDMS~726nlSZR$d z1QOsz>`H6IB6##P3H(DkzzWZcZ07#v_c z?rl8F#cNb?+R)!IN`k)$Z!{AFO*%2i)M%WW^0D#5zJaFpD0NY@p|kGkZu;G{&(e&N zL91kU(>W?oGE7(T*O7JhD?ZWRbjQ*R8Xt&0=G{K#B|hdDAM-FDb31Rd81E%wH*9{+ zZWy=_KA2x+Mpc=+5F-e09n`!tPvAA5sx{NOcQ_`4*CeYo`0WNu9%_E(HLKK`?T#dw zZ+M$e@XEt#Wj6WXM^VUn&tG=QA zLO&AZH=&3|46#e-dl*`7`GyY1f3ZMu5B-Au#aHS#IHf7}73+mg7Oa2KXd}PcB{W!m z?Ph2+y3uvtP$jg`f~JTeLktQ{gi5wk4=rO%3>~2>P{}hGx)I-9hmO$gmKUBH9C{%1 zXl>UDJsT{9o~#NzW;X=9?FiN2(Azkk|0pgX%+ovUDHhq9uzHZ278LdzkGX%CPuK*v zJ{QA~_JEjkVK@&G@ODjDUy|x`A?!W+J1cB#un;z~D(qvbbYS!y95yTLC&AO?js}q~ z)`Tq};eOs>DGcgVSS-r7gTiq7h9xa5Hmq3agUKRn1Jtdm4l76fM@GEKA>o6>=ken{ zi~}db_JbL7Dy*80#a_aV#tPCu);dlY94>}85j^DH+v)Imc0=G~D0SDAk{(i?exAr{t%-=OH1>IihXN5X1;8DVV}DU!uHH1N#yvysnp4LGO5 zgPV{o^qDP0_K+fbP^c?s1OD7T8Hph; zAcn=1>(XMI^fU(X4C5c}{k$Wus_}`ujA`I}Rpd$1P#d4fzgc7aScp6s`5)O~tS1@k zksY0l&BzX;57}XSwc6MjM}8#t^%Oj-Xc!K7`=oIq8F0$@J^tKoW{j%!v#XIFCXI;< zKJrGy{_^ih&4j*#ji-!P1&>HvU!-Zu_&4T;yH&>Pq}gF#pK~TRV!#AblWJ3aeE&%9 zN1-siNc@wgm+>d&lnILl)@E6Ma6m$HQez>&6yRf;>TMdOM#3~A7*Fb`!i!NJMGB%D zVK85PjPckshf4-Saz>TuD;LRdn0zPlAtsF|bFdqNW?Cni*0G?OwjyY-dLJD^R@YRU zj^aBHoY|fDC(TdePs}MZ`Ea|d`NOkjjPLK$v(^7^A@euSvv?7ld8uSx%G!!~ErT=v zMrr|PK3HwugYUe(m@gCml=&9noHYN3KTm2eftKcCm8BKQ>#R3?EnO@FqYKf&? z1*eqD) zA4|HoMP`w%wxGiejtR0P^YKdbv266VEa8>KYUNs%AX-pZ_NWQ6{0`mQt1X*Jz@a&y`z5T8n>w$5jJ%(6m>QlVT-yd zwuyS6x)fa>2VqgvJ{n<*_K~8U!WONCE!rt;eFLMv7TZUo0YrZ%MSu6GQPE-0=V2TX z6rBR29vVlgfi?uR5e$Q|dHQHOnwJ~Q^^Ng}sUMToR_@Q%2#P=WSP9(sjd>-;H>MwL zGGhE=`hiRT$U$`_5aTN<1BfN+tap85-ia9>lYtU7=a_f3<{a}iW1>07e1}Tc<{a}w zOokX36M{pc)Km$EAuwesk@pned6j%q|I&VP?X7nAyNLAv_@| z;XjDdiZmfYGc&=)m{^e}`C8qr^{n^W%I`Y4__VLJyY&t0 zY;w^$&^jB^^pB#Xx@djB)r(3-=Av~=uwY$ZZLP2yhHb8OF@apP9s!fTw}V_9F9cf8fQ`8iY{Rew!7#iP zl*7fQzREkwdnxv|@<1mSpYc_`Q@&SLl8Z{1vJ%qt4=y%UT~ti9E-ESVYqyl;ZaSs8 zud+tjndA#ma#6tqrS=JBFJr<*h9-W50|!EQU|cR5?iOV z@J)InX++A;6jJoxq&KyYCXHuI^xq`9XyV#`lfF&)*?n-*k4Yi5D~}{OSV%HfB`t#L ztBx=RBqjJHE%r{bsdHaalHD+(eo#^oUowb3Nq=}J{lY8PsFgdYlAX#(s$w;>l8!_7 zk?JIDnMTxi=nhK41D`W!m+YT(Gx-fMFzIixO|nj1c_cScR~|vh9nrAb8%GHN$^E^P z168QxcNkRiCp@SA$zzgJ#lYkVQ1Fd92PeqmRJL7Fu zNXnR$bcn;46mCokjG+ZVP>Puw(>E|B7wRzLD&EF1f?@bznGG z+99>Lt^6MAe0(ZbTKlFBN*$a!k~&}NC#fSLP5;O$wezJ8cFdN_^S-H{rhcEQtxQut z)7nRB7-OP+q*`#aOZx~+Rm7mwG;XP3Q#tgOz`$iYmwF}ZFgJweP)(6Px|<# z^-mj^Hjm6o8=N+eY{EbCPBklSsAEj%oHhZ&UfK^B_S*WUElkTuqYIGKfYY!{RL6w0 zV#b7lY2~PNH85>0gg0mgjxxhQHesWs_@@1lb|`&DTloVg13UTJ1e?yrmO!?~wti4b z|44;upsl&Xz%I5IV4%$(gVqbaws&kJY*!#kgO<&)7_yCJOblAKN3O`)rbEzmT(-@% zU2zMr&2ML0Z8C!ue*LF(_Z+a`nM0nHTer+ouorPJc@^IlX_dklv>%9VcGKc-5Mm{vkIxDE(7Jv$OHjuIXQj z<3y#iU>N-p2(4#K5J1qVJNu@uO8+@~MO%5WQ*tEV^qTZ@8EvTbq+iKs18Mq4>eS?< z->gkehP(V4#@~!qw=!CXpcT@MClD>(Uos45yp^uL867fuWZVLuGM4dz=5xlIjERh8 z&{CH-sf>^C-8EwwBQtJ!49=LC@eR&?ux9{?vogL97BYgXGQPDN#=1M)@8_Kn$HG&S zflb-iEF%e z&k|dwyyTm4KeI(Pt!F5I8Mv!U?H-x!7!&!+>{ROuqM+_9GhfMG=F!hPQyrkHGJ8Ya z?x4)U+_cQznL~xand34i)eire(}RV~ud6brkf_7GfXq2QnQ`8kA?iq%iPPer)(gs% znIfFs^vSI7&dlMJ>1yQ?s$|1|<|eh}WNw7+pQ|%hlYm2aQ05-4#y|65mX8>ic|vTH zc|jfiGjH?ZKdS*+K`-NHLO@n$@2qYrRMyK3DhsE65o_!!v);;z5CgN`6We5cq7MIA zXpC(5&%(}{D~R&RTI-#a$aTc2I`SODf7T9Ovqh~rtPTHJ_p{rIf!U%Ml#S_MdBym7 zKz2v(Z1p^Jbv7nr1SK2BsQba}fb1BE4-wmBk5!Gyo`Az>_|Klpjp-YhjWISm2gUBj zap)n(1;f~4!SGoE(utn(if?vh_WGPrZRHPHPtk_|*L|~3W}nZ#O+6+1W;V8O>>pXB z_LS`NwZs2wzS$3QTIP&^2sNKYgK1sC(R^}V%^4vE=HQT=x46BA z&v1S7b6UG$66o%mGd5>@Zr8RlIuDjI+9crTn`6w0&e=-Fy zICst|!x)>h8IwQ{-<+K}=X1#tGBanF!^~TZNoM|Chncxt+gvmA^B9=< zmuhA&-&`rTd)|v}k0Y=%8?0w-@LJT;|qGVl|OcJae!}LR9-^f zALL?QcHSS5rhjk|+iTiW=M~htm{$oG^Y*~Se!h7J^UfF0MKf|S?~vwV-WA4#i+R-K zxQqGj`0nareuILZo`dsS=f5a;st-XDXXSSb7V@R4{7!bm7kwQAKtG@S@4WLrVx6ug ze<1262jydl!q4F3tJkV(@7gFnsZx zU>M&G&LZS*`4;pp7*O=4AP;qf+|2_!r9sO3z6Em%77Fq(fnCe=P~KGn1m6N%L7pfN zS9=#uDGc!~C@v^2bb~tgf~D*);#yE42nKl=JFo!F$RH0_I~H>G7Uj&{P*5Q%?^G3F zS2sSzzDT93r`xg!^Ou}*0JPHRm6pmy} zxKa2yDtYrL{2Jd~nnz&a9NIh;hR!Nn2&6eu;hb8eZf=5GRiVjlnDAM3VJ!XxA&vah zf1)R)(s~$XeCS(fD_m1V8*v&h3NhoV!&>2H#>9A0xU<#_HSoBeUAV8P7o89;JS-I+ zmWPoUH)a)HgBfR}!ZWpI^q@{yh||9l_`@&hw7hk%^@yOnF9a6V7uy$gXjjzAtEg45 zP}D>!YT`IlDtZyDm!+bY)$Aet>hNe7e@-w==moM1hKb+7ICo44zD52;Zx^j>E911u zBg5!0-=c4ef{T_@=Pe2?S`KOYhlW6%9G$nw=ty_xqGY5SH?2YKK~>J(!+OGcQt%B~ z9`dJ79>LrfgF?3A_@>5z9@Z-BDZzK)=!GFVc_gn~IGsiY<6sYKwe_^%yC`wd&pLS& zLllD+Ehc2+hl1!U7$&`e>y{Nb<9Gz;&#-0rxEW|IPK}Jmxr2AGjp>9fOdgiwy+Ow? zuYHd>Ef-^Qe-L6YZU=gjKa7n8oq)klGoAQ?>!8YTd2|oe33RkidW6&u@d}A^lgF^| z6hqv@Lm8=jD)b0xjsJA=STgYwIEPaK$|uJ09?B@?Gt|C>|8(-FTJ1}$cA|$eTKOEc zqwt?j{!FVK#cC&eC}WgysPzi*(mf-5>Q-EZl#ue;@5U+UzLS_ph?gg_L&C5Z?VkO8 z77cN~z`o+DCB0*wG^jZX@e+$`sC^4|!{kq@>GKPmZB-`pzya)#=Zkkkm!^}#pz08@ zHSHj{brj^!g9SknS{Lu8isIAA`D7Wi1EOdv_~?PsQ3SLAf2lQytc))d+{rR#4)zbh zozgR;K}h2;+0CNv<0!aIJ(Q`+JfUaEK>VkZzaZrvI(fWSixn1X|L386t%L|Y7j{|L z1+^1+?ZPgscDjf1jj|B6pDp|hwG*{kOcXeFrib!BWf5u@EnI}!Nm}h9Ry)f>`Bn)< z?SX{{P&-+x#Y+Wo>}(HZx)LVzT-0z;L)1>;wTl|E+PNOe3?&@3_zxa!)oOdP+8;cW znMwp|XDynAW53jDX`esEIL`xT$Rbg@deLgsPSt8xv)cI{$}Ghw^b8#rIu5l#yf$MZIWQx{P8i0dg3 zBo5KKhgt#y=2I7|?H>Potb0r?6%11^KveA>SU636AQ+~2;O`yAr853e_pl0ng5bH} z2rdiWTbL_^yvXkU5=9U5{)lJI2h0aUeiVe*FK}B%mLMpT=|&dI`yrTTaEk`M8z+-O zHzmc-*vjaGpa1j|9K6Y|mYt!LDQo?Vi;S{hd|1oQR2D1i{ESJ)e7v--Qz%-? zIX_br{wqf8+)Xz27qK+uU}&pdI4C&rE%tRYm~uoVt;&>RH%!Z^XNuxCxwX?NoBd2n zOv^2$SW?L|nW{~eQc4F@(Lz9;NulLGQZSvcl!^hS(_W^(t4!yi>x#eG!`z=;DQ+m4 z8yYWmHMdsQ(bau(XUW{zc%iGgr?No^Fc0!Jf5sN8&CKu9ag^N5^dNH(+wevU{^nq_ zo$2{WGXG?}*vyPu#WXRlu~0G>lEwS#d{dTQY}xGn!&5J>XD1+b5u&B2XhKM12xZ<;8#qFFt!Pjbw%b714}|^EuP}sTQq(a*IL8rgNl~|8d9 z%5xMeE!kt56Zg@bpR!*Fh-ud@=2fqlSA&I^7o?aM9IeYgrdN#mFx{B`QcQn&E*59A zVx~asQz_5&8zi{M0Tc#w#WU2P~9g78=j9R=Y&-k4cU> z%6@eclO@GualP9iwqA-^?+~kw*;S`rxmKS{Aa8QF_* z73@P?b;d}sF`8tN6kFsN1|F3Rj9n#G#r{IM(J9;fVjsi_@pOhp{(+Jo_cSXY`Ej^_ zp(Q^Kv+rZck9#Hluljw?#rfI|(~}XVxIR)`A1(QD9}t(}B1M!YB%gvAH%f{d#j+4A z#Lbf8X4R%P4rdmo=iwMP3Wb(hc2Kkw7p)ysBE^-|<}Gf`6A$`Liu;X+Bd%JCt2X}0 zLX4~NE`f`?EydmDlJQST@lQQ5!SU^-`1YD)Zz;a_6B8W&z7+qyCOJuppY+58$Iq4G z=W3F1QheMK6C9r_#pi00>!tYhbtgD}r&tw_d$^|K;@x(?gr*74(ybeUj0F>}^S{ap zNN@seKX~s>c)N}SCwyRifCMKDwHs!BkJKfMkrKve2~Lr0aL zr6(rX+F!Ev*Ca?nK+b1SCaeqv0YZ7JzC z&sB00DY;2)f|Fb0m_cHLr6`)@5-DX#-Hj&YXR#^; zH@eL3ty6aSrRq}~rKVD&nNN)-^+i^|x;*ve+D7A8$fb5qO?B^cF7*w&VeWJ^l+*!I z>Hw{wq<&1?IvPsqXHx2C+_2QyQtIqFoefMii&d$(yf=5cPWjz0byw=XyoqGk0%q7X zR=`ikQ~#+oEbVy`2w_i0Nux8%Caeb(oSe{Bo@oJj6S4A4`_OLqzCH|28zH5Q&n?VdnD{Gfl9xSBUtJ9W2 zx`lBA)yD>-ew)pWEhf|UNoo7I>uHyyv`clm-q+veWy7Aw*0PjJmb=w^;|;tYVGLMn1t2Ws0Y*+}*Yz$OemX zdTOribdc>d`}#wAgP?S}css>73%4_r3+%dAdIu@J0|!bUAf@-Iv$G5kg!EBv=~IK! zahZnBr==$cr6;qm^9BF(QC!z5DSef^kS&wbtEKe6>dA zcxB=SvdmsmW-oOot5gbNyUbzUnUmSpZC2()R1cRjhdZi+GG}O;(9AhmomgYZ#GTEV zky2))1I(DHmy&dfd?l&!YH**Oh^a?}&LVL9D`a=I~rh@9a;Ik>(CWk%dQfOCNXIp4I)ndg;* zyRUO*NI5ecGmw8yc+M&o)SM_OCyF=SoB}DQz#+prK6VhaD+|c^rE$*hH95FCiC&+B zo5TS!-KF2<+|JDu19JXtm)pcEw+XHUi&C!W$f$qrbGhovKXP&Vcy0$Nw}T_{Y94d( zGpF1Sq}&f2#{}hmLwO8aqJ^1)&hpro_A|NpQf@xCJ@*$W_m?Nmd%63hTy31my(Hyc za!jj_dPzF-1SwD8I`f{D@}7O-9F^Bu%F`B0c>|=p0d>wifqBDlk$Vi{R$r&=_RCAm zvlT3%Q8^4B?s;oj0gI5ljVSYNL>^r-aXm?pcc@@VgFff-j@u3MH;|!cq`WiQP@Q*& zxXc&lePX_wl<&sZ6Zzg!zPBU2)%jg;%q|vLmwjTspOo*X9W+eJALfWwb^e4W9yDFb zpUwl9Z<6v&PfSLBx|E-;Nmfevwf)vL8TmV<{GFQQX(|8o6PFhGcclC~T(ZDRD)4$@ z+6vl81#L7*KdHd4&PjoqLc#k|fwuQ7m?RZUsx!e%a<)`3ThkdM6~xrNv?$2H#rJ&5 zlup^>S8%%EV$ti=6vC+~6ne4(mKKE#Yny^&rY>w+^tuiw$_k&A3ZJDD&YcT8E1Ph~ z03N$&2-yj93*VFq-_#mJ;d{h&X%GR0Bia>C^(vf-i^F52!ZD5v`4`S8+{%W7!VuJb zFBN|8(l-n9z)zA2lN`qc72?{Bc}^%T5S+(Yib&xusc;vM2)hvd#C#OqkqWiU6?sWT zUUlXpu&BLQRfHBBvQww*^(&fDG^cnx#V&$kSCqgCh+Pq_)p$2@#I7j2c)Vwyb47)A z!y*HWD_SZQE!84bWGAjmq{xM$ol=q3_=-+TMW-DTf@?D^dLR`&;La8|m5Q6z=>q92 z?kE*^)Fk^!#r^7RQh~)Ei&e#=$S$4ohhOoO;;&0_6-baH$=TwCtbj42*jVdqv4Zce zV@7dCX)wl&;ykFjP4Hz>ahc|L@p|Ic;dt>jsdyXj{>7)I;?uQbMlrU_q4X{Yw{b3G zM)52P#>-g;Ia1RNLZ|j*v=6)IDaDP8O?5zoty-lzo1srKQUjcci93sdq2k z#|miorMSZPSi3K+Ufj{p=UnMoyCGa4$g5K6RW1Fc4~bhx`pX(fWes=$%Q{G99iEt! zGC!$IOJCU#scgs-lTtQWDx0k7oG+ElceD=IM3==&Wm@{mN~N;WCx*JrE|u9eork5e z!%qx#*+r>L+o3M@kQRH?x$6yF+)}Js>`hV8Df|7F{=9Tk1)c7pfKjlQ?qfv+dud(4 zURqr-+I?_&oAM5|x1W~d{CxRKRpl?*4G~{E?hxx=-t(>Uo}J76{mb93cpJxzE+2<$ zv^U0y#d~pXynIS^`FI=|%u zux{;GUMQPu%2%Lv9ctH=UlseDEB}pvk@@mHQu!WS^1Og*=(Jy*4?tF)}E9HpvS*6T4<2ZexTA9*hu##MbLN7pRFMv|;r z_P=F#*~PhKKWM5JNy`?=FZs!CIJPFj9WPU5O=KBnp~Az(#)?-fs}s#ZKBC)cd#psHH&(u&WaYK0$H zwW6Q2qMw|is#<}qzl&AJplY)BiXg7)J2|yx#ZO#S_=-wWh0_o$>?=~F6)AEWS5@$s zs^d`gv-gUPT-8q5Ri%P@P6+-h8?PLROK~e( z2_04rcI&v(N6x5OIf&E+teoPra&EA&a+x z$rU=babH=CV{)XGIgaHH+XPmx+z!FWpq2Zdu&)cH-rKj!D43;#}ojx}aKdO{%zN{Ij|ex3yTBD655l z%0}%f+j&*C3l=JyNR>?-+c^KqE|oLc^0KnKRM}n5!gy6(iA!4+>=G*{&Z-=bKSQO; zp^hVHkBy-ZCuSXsOFYLBKb{My{JveK>{W?PdgV`2W$iM+zf!3@u3}_Lm6;r4HOJUJ zt8y2P_(iJx#W6=c5uWg6x?j zGuC7XYTqK3AY{)3RZDeKEk(srr6{ddTV4F#?{k-#5&HlBUmsrQ=FU0i*`M>A<(_+P z?l+x^#}`j6=iWDlSX#SyzW51i7jvxpu(gX#<;Uv;6z3JMwpzP*8~EK^Q;diD#w#|~ zE|yP)xmXOf7$1x&KE@>$!!oJ3r1(q8r}&I(@s9vJ?_PXf>mWUg@0N$t+Qoml7yo5A zbFrizVRO+bl|0w7q`hkiCi5lD+)J8iw(~4`yCgwaqQuj^#8b9JNhrZkbwXUpIQ$vv zUNTgJc&sISN>W;uHB~PaxV?ie9*IWT&a9MZRvFP(&-8f^n`-O#<Yl^t?g?3kIZ7rjILg2E^a)rGIM>kEc=Ayk*&I zu4S(Q(9ONfO&c(Kmc3IZZ#yXK?q1eircoBA&=?(8h8+lHQSN0?8pMClnAfswfomBS z`^u8t%aXNGooCsyvhzZYvUTod>l7Mg3XM5$2Js&>uCy$>=UR3T5ZBzx zu4$uD&$0*QJq3+&7x!`(<2pvFa`dCd2XW=^O_$2sxtF)oYFmR7SIKJdnp(M!?qc~s zRu_SzJRTsE-ODFG6gbM4vC5e8$E_>=pSl;{@^TQvik$I*bMEO*<)4>-ZIOD!Fmzx@ z#n4fHQOQ8?D8KfI;8A{?73u_(|5btQf`}Ac*o>=aFkPz9*Hk!I^ov{CgpZ0AVzu^S z1$M|R_8e2uUfE(((X`@C$)}=|TSbs-MSs9{b+72EHEzkZA{Kd}?iHb$6MI%ntPEmQ zshHtjF~jiSVg=q9T<~dsb|yxFD=jvBSM$hiv(Zj|tMI;)HRH z)ecH0QE|0p#jmavzXH{d?iD|3PUl(iPo@0HzskDqm33wFR=N>UT;-e7rOH>`EA2L$ zC<_~^c`Lni7b|^Py}M84*p`*ETr2VZT;)Xf%86PK@T^R(l)qb4xfo?x?v+^&S-%ob zL!iIPivOkC@TolCvht2=7tgjiL0F&WE3 zqpg_bC0n1W^)0J*xmN80^k(;}&DwO=v#O-(7a4Q4dsVf<@Hv@bbVyZ~+^a5WwXJAn zhCQqPgb(B6tZ(3tPHKf~ABQ%$)-@t_;_o}|ylC#|i(i9uY#4}6i#?rl&ve552&AzV zske!(2eSya9%Ri@ve16;EAbI62-z8|R3`v;OOcja+Yx?Y)eP6QHMp#>=yQhIv?gQ~ z%k2qwdr+7(1~-R9m%M;bdyqbrd~iL5owq$-=cOSoJ#M<0 ze`m?>Ry(t#HA{LnK}pXhT9A}l;wQQ?TsyO*vu(q}?|v4k*Lt>9+z(`hfrcAUU(aD= z8T&TDV9yD}F`Fc23q<^AY|km0%{=id1?jM`GHy&PH_7c7cbGTiBniO%arjvzZnv|} zb`8hlV>zmwApLWse@?)DLD(;>zKdVqLyWd6{o5?RtZNk274LkVdjf8!K7){`25X%Q?^v7uQXOlkWF}UKuYg{xO zkEP!o9^Gp(J-XL&;^_{9^eQDoC&&0JjUS7yk&bXJn{8+^|Pi_IaZ{igLUJy53!o zW{S|(yB9-S@2L!Jz55wAKr6i`5Cg2=dmgRdJB>e`bH7DA>%9bNxkc*7y=q*_kmFhJ z%}SPtXT7m@T5CE1xFS|!JnLPJbl5hY_5P9~_5QR57c4F1y=fQEdVjCRv))*>$P0wW z^!{1IvlWCQ(0zuBKKxQe9~>o&YaM8(PaSPU1)=-A0Q&XifYS#b>5=-hGF*pzecmR{ z+zNrArvUE5(mwWn)F%je3ltOdiDHc?wW0OFGEH6}G}tG>SbNZb?A(^PY$SIgaQDe0 zc%J4I7Nv^2MK#n>$^$+ zoJI0(t(dp(RhD1X=wn4&rtjSt^u2L{4zBbt?>ZWe|Dx~x8t8j>2Yv7E0`?8UzF`|S zz0ntr0i3XxR* z^Tx-rB=0gcqbLxn zQLEn?R$|oZSAbM#8@2jX2#HE+P=JBfhdgtCiyk{_aD)8~tND6@$dmeA zV$A7x9b+$_IxtSZe+0f;)X*)>u{e(M(X+(I1tmT%_HoJQdF1)>trz@#i4|TloCZ;! z*GUwwAV4KPov9L^9?W4k?lX)yCxN8TB!PGY;YMg<60`@OnMj`~{^*k-Y9+E(VlC78 zY*EDX+4H}cj(myM>BGq8^UXtIUbRTRPpSO;#2P=T-MDXEGVoA0?%M=1`o0PoeP1Q_ zzApmC_eCvULPp;=k)|s+eS3&n9IEe(C-zrZogLIwi)X9HPdiBHm(4Pae$$C+y5`C7L_aa0^uvI1H6B5qL*w+@goLK${{z||pF`jerbvGKlq}IW z{jiMih#`gFAy#7J^!ps?lx^em6TPJ0`5F{_W6`fmv1^=uzp6tDzuPF>h{o9;kM*%? z`61PD8$au?arSQj<@Rq%#q@6kY5F(P6a)GDzYO}*xTV{k#k=qc!1>xRHx{FmIMXh4U)YsZs}P4FKRd*>l9F#zYg^M z8-c!mBf|Q#qx7$18(jRGAV>MYlH~s~%U@RM`*&68`v-u&Kh}M4?ZrC1G#rnm&q<5_ z2u3^qam1taJ^o7t7QEFa`5U#SruIGlc(^HCz`yE$31B3BT9C$b&~+P~bI-%Q{cj@u zVvz=(qI=`nnC#vG5K3eT_YSE0NcRqC$VznYfTl<-Y~4Em%j3vvQ-e!Oi+3DL{l!@a5hfgi~39gx7{gv`27 zZGe$Da}k1Zp9gCPY$cklf+G&g0zT9nlxTKaBpinzPf-KPSza!z4fFw*1kfpFp3-QG zyq{ToTikxnV(V^^$66o!45$l!1~dgf14OGGP#>@Z>TAO!@G}6dc0ioM&w$ri{<_M~ z0MSMV^krsWJAMYlf}a7{Pl{^@i$gS=|H;oB@{>h=vIOjW!p_$`nfzdRXTT+uAL?(w zhZ;YJ1P~{Y1NPhVbCUdgA&T*7DQUpR8qWXZ=Q{bhM}DwKjVnhR18!+8oBTY0*|G2y z&n1O{9CHkGQTZ9zfj|Q}h#Tl;$Irm7;AdbLQQVQm9W|Vf<%g|x;9xeHf#Gy1rL_(e zYc>OC6U*#ct##l!#iIvq{~ufHz{7&{3F33k{SK{l;I~LM7AZ)yRy=-|TkAkHVv!|U z>%hB@Y^?+Dvl3hDAZMidwyky0bJWYAr-6FV6Bhl}C+%A6Ao=J`s9_LZP~O@Rt#yz% zeiQFBi#%yiH@3Awy)jZ8G@X}d7;sRiK+67PP(RHXxl}i3f+!izlHuA6jRVO+Vhv~z zmox^=vL9g$GFYU+z2(+EXb~$cGW1@r@5K|ioL=m$0@Y~a&? z4SZVje0VRX;elfn`hjn<{7sd9AePu=`hk(49~drh3}l^w8jk;@KZW$?k-nIO1#*NF zI9>B}($7FTrqW-`^2HkcZ5sVD(k~J83t6X7!||W=zaae!q<=xcGH?c-vK^BIUV|Ci ztMq?i`7bK{!Sz-8gI@ss!6HHqeiC&CKdIq(EPb}t!Edq24DLcaoJkCh07HW(fT6*{ z=LSa;S+wSjP{`mJNYx5MgVV_NV9xIc&(oT=I?5i57bS%I58m?VwJTCQLW-wJ@wCA8 z32}X*c{wS9#h|xUig!e<>#TKMqo{WML5&oOLCyY`U;@5^JV+;~JLm*;w{KZN0mz%B z@Ds$&BPc|jy97-n1GaM)2oRKrWD(=)AOqLuf=W5A4q71A=Yom|0%HV;_!WfswY8&j z?ghlJAjGer8jBQaM2O;^7dd_fU01S1{0h4B$oLiXJ1a4M1!MdjthbF{!D7iHxDikX z<2n8IFYMx1a2s{B5sXJ(+kZj)3dW)BnCX57l^{3*ps&$as-RjtYD7nf_rK6 z0|uzzp;Tiq2P45z_G%0skGxg#OgA`=72=GOVd~)dB#M{sp_1Ti`e*PG=FmTb_Y!9{ zNs8szV6LnM7i*0T$__qekwRWntP^}jkpGgkzO3af!G9{^g*g3>-V!3_S|P83PROhF zVurkjy!RD;Lg-H+-BoW1!Lz09zu0;UWDFSt8AE15#t;$RLnaVrf)-FAV@MKGg^Dwi z<(cXXBLtgxxBr505F(zBgluE!HVyg_GmMZ!B*^8o5HVp7IYN*lS_CCQET@IGPzj33 zX~-4Ux}qsnZSp{NSnq>LcOFedp}5dxEqurSgbK$=P1sCS{Zp%&phK1jVPWo< zaNES9FYFV~HGxX{lGJ*hQPHuMS>Y{L=AqvsafHn7qdpGGCZb&crnX4_Y&k9 zQiXKLA`MNWTr*|4hFnlGgu@N_!73Lj|IUgV?Hn$=F6&du@FyT;IA=EDO(A9YlNSA+ zNJtru>CDh1QKLQLYq(!?T$IC6aMyv=G{M4qi@1#8Eo%)`<92ueYK?*5;dp}(iy#{$ zBA$#?rl>DmjLE|}CJ(oc$weE6`ofpnQ<1xGZUwe`gM(5WAmPshVFDhu2RtjtuMp&~ zTBOLogj{z36XB>a`>VoigsYX=i04pcl)`L8JK8#e3kwl1+c!+mjOb}cGh(0!J3fzK zHewuNZLHoYIC*8 zMDDaldh9VRBK7~$WI%c-0`Sl|3hALwQ;|a(fb`G?nmj7$p`Lc6hlc(yq`N!kUPfyj znuWB`B1Ofp5hme+QP9vmN`{C+L(7nhcx@Ynh9XWyVZ%J?9!L8e%7N+7(`cVVKeOof z*P~n)Q6o~7ON>T`ax^;hq0uNjGYV06e?6_SM!oSkxyGuddrSo-3SEI*Q6rGhvZH%Z zu4GxRs6|SKkSl6=ZMmY>vj*jg+6uX%_CcqCFM4qCTa)qPP$d z^>HnGMg2|~O|IyMk6}A?!v9UK?;%&TH&TC#6yr|0Hpy~D$152^uITx-<%-T^4ayb0 z5OPJYf?Uz7AXoHKi@vxNaz$@KjdqG$(PB&#y#sPZ@2DkL^ml}@%Jtjh`PAg@nJuJi)wiEiUlGn1M=$=rv+OWx3>GO3Wx$+{{sgBt_y)V#p8!Jq%NA6C<`U z#LR^ZF>^H;MCgXxG3zb*5*!jF#S}Bu9;VAr=*1kzxCBh z21%c|Q_?5hko3u?C4K5;NuM4d>9f9(^u~`Q{i1&*eNHDypQo4fA682GbrF(&V;4!k z<(j15zD3gSIwa|L1Mi-9B>g_X?k|({#Y-f8$yiBW3e`z1k#J1Exl`h=iGQYFfO)g~ zAkblreARINqV+rQj_UY(n~c-O)dJeb=mz`zGl1R znef;NQb!$>|1komh0V&N=UdHzp-D7mCKfuT|rQOAp))syF6LQX)-I7nrdu}Pi+*15p zQ@k#vc%ZDK)G{RiRf8_3U;tbGL^e8h@R={^8l{Z8l!9G4Hg5mWKB)RF&X28GMZp-bH;34 zyNo0qT1n+-Nk0ayp)8Rc;%};?uRse#K3V~f9ldVc)>)Do&;J+iq>6J#eU)=Zb?HqK zr{l!YK%6*=S9O*U_c zo3rBTifb!=SaEj6xfNfoxB~4ul;(}twY(HZw+ zP?leVqTGAB=4rFGwb#k_cTurU?ysFC9E9P7UOuByOsX4 zgHL*|M(F`H>3uDFOYE3*eANg?avXRlE~HOS&qULhD~X2+>Fe+f)rIcq3yu3VksxOX zT5yZ>LbD^j`gt)OJI^eWFQtElKM6JI=-Vx^61oNTn% z?`7x>h4>+VFFfN3{*WBex}L*dW3k}fA)}`x^)QUZsWKt>>?*g!;}ldJ>pCW5F8|I? z)0hG#&x~|Kp;JJ{`iufp=l%+WQb5Mn8RwC`kZ0l|`|>g$M?|5F+ZKKG zEC<7wO9pgx)q#ew7Y)I<>C2}$hM89kQ}APvu>|tg7?N?XeI<(wntS70tR@6&!-tm* zIVhcFuO?k*Nq?Y@q^~+7>8sIl*fy(Q5P7&~yZp^q+65L&gl^PkmFR(^WZtLSrZ*u7 zoTy9U=){T1I0mBtzv%_glvC~>xqnMt62D5kpfi@?89dGecgp=U_aCWC(tAlgbjETu z?|$yT$Qzs#u5&;ZT*aY|*`Z5PH2&v-fMe1a`LCm6(j?f*SSD~KVJNRRmdp2xaWA_W zFy!6?7u}uoNt1NBf7B#Rvgi*K>64Olxqn_vO2Ut7ebQoG?)^(ii}B-xOH#CQgl-+P zW0$1WNvo4vNyZA0Ey4}RgKRne8cqt6C((`Pub1z?#{ENNb@h_IH#@-X(Cyx-N&3;E zKloZ2-jd5dwPpifsZK`cnk-#R`WpqEw1Qr+AM&5Pn2he|U?*dx09dbhY5tG=nSWop zlnf_0*c%>dmbxUjP41eED$>(9oW31uh_;v9TjU{|>cz-W=bJoG*DBfDxlQuGM7&j# z9ORxHB zI^x)zFX5NZ7(X+9Zv4XdrSYWkE8{8S*T!$MpD~^`o-uxFJZn5>Ja7EYc)?hc{cPF@ z95SkO5NR2>UqY`o3`i@*{U&^z`VKa?4|T2a@UkzjK9M~&AsWr z<9-hA9SjGuPBKD>&ci9|boSHP4YQxjz%u<31M6n{7<{Z-zZ{JhjhBpluGAUNc@d{%E{mylK3Z-Prh(@wO48%)GsbXl-%&7&{{&)nSH#baAdfle}rd zfo=EDjQJ%4bA59Qvxi4Pa={|W_zTWn&a1<-!OacKFG(Idzub9SXW+r{7#us9pD?$S zJa(1u`dnw=aq$SrPUeRA?4U>C(}nGIMqjmFBXcX{O)FfiGu}ndtUx!$5mX+97k4}9 zj45i~ljhcv$L@idWsH$tX*U8EJl=&6Oqo`|9xXyUb zTKjqPYvyhq7DsOvq-K)wcS4-f-Nmn_PUa@&*Ug?NjZHx^OU6I6(%4)l^V8-w<{l{h z_!QDT$@r&&R@V-{e|9oIV}8}#ljRRAjz@s|zD@a&#!lvE&21$VAMvp`9xZV;{)J+6 zNME55=YOH}Ol$68b=vVrZ0&r*F`zalxIOQD?*+pM8NoTHGQ-p|oq?^7dRcCH+u_zTkeDy^YI`b2k ziYo9UT3>WmGB-r5+*j{X5$1YFq7C_ok7M?Aj&VrsIA1w|Bo${^;c&Px%&(^6!}7{RMyE zFaO0jrm_ukqoh9`mpF$MMA zdq>xH?;U5emq$ruiKP@=Nyfifx8zIy0I1Up^bVg#Aa0e^pdfMfFb63bH}Xa2S@L5k zK7L(tN0*>0c~Db=MWka0F6``B!`b|XM`^v%r%O|T%J>iR9ZOr3!pX!x8l8Gzmd>}d zwa%?HuuS_tMu4I0SCtQuB+_m{LrM5nm44j~;c6N=KpUQ1{ZIHdSYes#W$? zoy~80lxCJLDa9yXGGbl=Hdd7KFaK$5APa1)1slg2mF@xVE$*dTY;YeExU21PgAKe9 zQhLh0^ps6iy!ud^V`pd_6lB3ZRTFq z%!;xMU+G|wwWscEe#@h*N10Dq0wsGOP==KyJd83z*RpIxqp}ge8sT0RVVKI0Y;G=% zDT9(3oFB&ewnte~Syov!u$qX>v20aY^}|@#fYE%QT;pE0#s=knfim`Cl<#KWv9k{i5ytoE{w;wbK_4tPiL75A!F=yj+?XTT7x%Hm#SVTVSaKo8gLS`}75WTx)A zSKY<;=0U?E^}us}D;0{dtP>yN_h{T4m!{(I3$FS0cq0xMcX8W}aIFZZP4v~Jq%kPz z0W9|nC;0H9hdI%F$y z5rse%Bdb8SxXmGo9Fwym%37AF3L}hpoYdV5Rra*RrBqP)m;^r(x78$AW=AmlC8}%9 zR>AwHc=0Ng8zp*NLb@i^nV&?YI%4=$V7NmJ7}MJ*La_Lc#$wMpV6kT%Q(ef5%02P? z@kBGIp=Vp%?3d+(H|Q4OEiUluEj$9nSgOOd2Z4KNev$cuENIUdVo?Q+%xNKY`w~35{?`$GU0HM2r5jW{|6=*g)HJAz95N5zWB% zO%bN;X@+{{)up_>da^3OdkrSry#@fh7hd$R0hf0f_QHe%Mcnn#E6OTXM_H_1!uXn4 zOaE4s(QC1QG7!pOg*ptVyU5z5NOmf6=|3t2cc1nu7tfK%%Q^A_*X(soTh0bB7p7rO z&M{MN0f}hDkEy^XEwT(=uH?qc85F#nHEy!7+{5PN^#)04GUU9ZLJ5O<(V$+n4eIqs zgL+|Lq!`pI4hEHfD+cw7Q^Zy$gWYKfuPl;>CA?M%E|-%f?2@sugn0kKtB?iTSfIJQ z$dJ776+z)cUKQlE!lZ{_7jgF`D%*#zH`SUq1+B}he_7K=<`lR*xqbk^O(56XndD?W z=bxhLBbUzOS4B|N7qGqi8h>ezKcN_mF#HaqK6{TMkh8gu2j0}mL|TY_);AE4O)iYn z$XKmpAX4MkrbonTWMkWb{|y&eu)gJFx9=X1?7K%}SB|;J`og0B@*~ZFjJn8#0{Z@7 zjlB4E9ogQX=-tQ~fAOoaH3H+8KWKRS+eKky#FK*1u{U=Kd(T&6vA5ZlHZ_D;+!Hm{ zBZzsgZ;1=~N?iGxv$uF;%R%=?N!RznQm z+F@YzzwmZa9jT6~o^q@hem)Jd{hlOHzb6pG`qj1QPu6H;t;da_XtEnF`*>N<9G5uJ zk08?Y!91dGPAfn7sNt1p$2;*a>LUUHQBUMJwHv&pW8OLg}u20xscKcgXmb+Fkh! zCD!o*>u6$q-wvzn+xFcRUa(TF?UM*=`y{H}l@B^HtEbW0=&m4}&pMc_o)eq1Pk|M9 zFM;=(>dSG)=Ws3HG4xcQb4XXja~Z}qvMU}%``jeER|%vU4Ap&IkX+#u>fv$t+2ng% zp0wys9k#WouR9d%+fgX^D((-V-CFzXc<1ZsKQWRBzj#kZUcSu}=@sSJH#YA6_jCj7iq zhJGhQ*91dLWQP14f!xofHbbunhWuXC81ickhWuKaFzh5les9)dXc!st^94hG0V+d& zVG2Wj(WXXZ$ZsstX@w!bG%(~hLok%9Ftmiom)BVR_*k{fC*JA*KE!k>DJpgv~WyeuU`JAHHz1Mh?mSbJ(Q% zXOnWa7Lv1GL@)7)Fck%IqIsP6xi zR$U!X`FA8!ASE;?22^0x9|Q0&KSC4o4-vqDXhQz|nWr@&nSK9QQ9hK&Z9YcN4iFuO zKO(@%7YK_DtbzV_}V{uaVoL!9pJfN=e~CcO=Dz3v2e=`G$ zxS#_Z&_l@(9pC_OwvGRiUB8x=R_?%4}c3=5mL|S=m-4CFg36q0S7wQ;DUvc zGlw-DJDa^Bd*CxjO)b*!BFbJ@mOb!YB}43&2<&B*9hJGnfSD17)|{Wq(>7#JC5S6E z5eUP4dq4;t$j}^^s7BX744J+?U@N#;MAyKLsFiPhG>%{U$adgvupNkC{p|sbZ8VEO z@#1hGTTfuMMSr$cc3UyM*hOy+JcB*lSdPctMV-vVH8OF{)VQux7aAEXCR>9!*&2+= zmJMp=-~sx#2Y`4mM*U}7!6<_l^0JGUQ}DXMmr>z!h)`Dzo8m8?e8*@>nRN7%x(9%l zr;uKh>KJ}wMVch2EoBR84RS#(>=a5e3bs%<-c!e=258MUeDHFuj z_9Gx?6L!%qc3`y~aOdCxT!L=$a-=yf`^5uiLhdHy7~CA>LuYI;*RlLtt^AZ)epNh_ z{!r2p-BYY2Z>S@Z`%0zY`U1(9cqWfZGkEc8iAyU~50<}J4}pV)#)I1dG8lUq&bHEw z2|j|m3OXAkv3)&^fFB5E2soUY3XUS+kXnE^77NeQKbHZs3AjuH%oTu(35emqLlid% zz|BIkkN^ONc&OrsysJnSg745mJ*NcrkU^{@Z}$XSArZtL5(?}gfe&L3vDpF|G6hEI z;n3|JRQ!QSSxCg90$d4MaHW@dP{E##|?W} z8S*;7hqM>BZ2-=l-!=l;N;;&w;96{k9^wt%tKTL(eoUsn9{(KI+g32*L(%i98s{DcdB?EE6UtLhiw?-3D13`gWd?D(2~5k3HW zg&R3^`w6$9@Qb#@f(eN5i|~m=U(U-SXd`^Cs*UhDf@C}^W9Vh00;11UB&UtTw`wq( z1Nvba5IX7HhXO)PTP$i-ntJtY7;vH3W5m-Ht1$F2ZP|x`+Y|MoiEnHW3EPkv5VL z2HQkLPe64?e51jf5~6)Um``fKT(+t%;zx+_giu|CXbn(Zq!WQ7B?A9t2i%>yixlrZ zM!t{Y$S4-u4nZQPV|#Kbhai!2<=`Bdir^fXDuy5!qeo)Ya!$guJrZljqAd&+5eq%Q zP!XE0;wFN=2%`?gqq_^8&|eH)#s1>|IP?IIL#rvm&|}~c+pNiBGcimmpy|Z6>H^U< zMWF#i4Y2E)kR^9bQ3KF5MGZhN#H=fu^c<%~4Txvw6cugFeoW^SHB**9iUZ)N`J!`z z*iq;o&ULUG2X5eeCyEQoQOB@+8g-1kM}5S~`&n5FERZJZ1f{99avF6KyNuIhk4r7?F(O3|mPLvVhe*-ksz}jO9xYO|5k46$hXAl1 zy@9O5XQS~bM&4hE`$HBfrmbK+`V;*8#Ex-f$+n381dK<20uGsVwWDA>nx7a!&N*xL z;~2lEF#Zo2|3_s!=GjLuP8W~q;f6~P?GWPw)?+YjJKHL2kno`$qH~BDuC}$97*Q{h z^$XB2bp8sXTNWj%7#tq1&>zBxiF!%+@}ri}Zv=O1Or>k*P5* zn5lk%fsM$hTbIS1kSk9%z|RK(tSIIZ{52B4l#h|%*KF35$6xrhgumqB7k+K!FM0HZ zU!UPu?KvNxJ0)Cm5-Z;y`~fLHxMR^@%hp1n$dE?3aCA2U&0s_;yA`n!d{b`3D+IA! z5gXB+RlUTb2g2V7e~bQlU08BNkf|9X*N7;K6dT0oIwDrq--z+h--z+17tBt2Nne9| z_`tPE2$>_WnfcmWl0g8xmJNPK;4rRhc?c^b5PGj|LBt*LFK+fBti`syiVKDa*ABtN zdU}JFw7H!+&r{}jz6@Kj5#TsBTID!)w8C-hB-4xJICiE*8r@6JX+UfuleK-5Vj?NN z%p0`t*hDmBX8rh-Xy37k@oe9*i>%p?YTwXsY#Gu)$te|^KXdbRE%57T?lrg+loNYK zX*;n$5zkeiAFanXk1%W&7W zK)8`(k+v)EdyM3J#Uta?_u58gvyu}S7Ow@4T*+pg;%y}$H)}?lkwrw$2siQ*Hl&f& zV02`O%&6_Fu_I4eq)~1vJ-$3T@`9j;PJ5IXK92mCp!XgE9fRUVq@ViXqv(%n2l}JB zf&Qp&aEejx;Cvs%8`T$Su|jSX&pH@2P!(^~NLJ#+Oo%sXjzIt2BhmAmmr?mdpARn_ zh2h_|Jfh!&^rwoRkA_B7Xy`FezLw{xp~r+ALGg`R=+P2J>*SU&S`Q4P^`_?78Hsi< z8l#G9lc>(ouRtfGn=3jw!&wzRE((*6#&|=R+)?;C{ao>TGd@^|a@ZzejZ=U{8uJy> zcUYOQKDik46O=yYCJBtW24rJuh)nCMwN?%2vCc@(1G)wK5A3Xx#x@1&v2EON@otVw zd$s+HeMf0OW4oGO68+3rUr`1T#s*pRH;?Ki#DlTX;*rJJ5f*9O0|%18uxso*kif1< zthA7;u?xW9SfjW#fWfhBYc>q3uPl(0wd7 z{mA5Ic0#KnV)3+k>>bv`#2qz-tu*;zDUm^m&3@G8*gwGR?__oyevR`6vzVdgEz>~( z<9zZKI*2Z89LCbuvZ11J6WQ{{C4#eYYg^-D0;zEr5B~IAee_l<`bd;)+;-+-V1ZoF zThS*mixgLclHxc-g>koZ-JZoC%pY#mb!m&c^WDWLcDx>#$M@l-4LBJ8gsSH8&uMBN z@76<1NyfL+3gI$}4aRqGBo;`+Hnn2S2^e5ZdY*=yupDU} zUX2mHB)o3IZaBw;U9`=Ff=jr-HjnYT35TKl31{JT6L=uNgp&|@0v@^Cu7TH)grv=|AN7WPV93gHej-|0J3BYOl$zE6B__2v+ktT zrv)Z9h^GZ6zF^IMlm#IC#QsP@wtddTaJA2wI7aDnCZ-Y(7DDcvuaD2PJBU7KA|^AU z&zV?2&Liw1m zwoE+OoYVr^o%FJ5;7PA52A=e`=_TrKQV)wXWiwxNoU{`)z`|7~T|k(>m*FMp@EH1QaUr71c03)cC$&T7 zRh9HH#y8f+g(|uQ6|G{|Fd0E+vfa>QvNrUXtPVXU{|Y>lZ-T)q_3+6&2jK=&>Onyq zdQ54e7)%-PD{kA_RFTeHFSqhiRE zXxYW4#KOg<#F}0KUo_v8*#yPP4!O1UtSJVKQQOXPywttBV6_lnh4!o#s;m~0)j}dh z*4?|p&~xW8L`{7Q$-}mlPVK3- z(y4>k#Y~N9j*I;1EQGtMc=#d4+*9M^r_fX9Tcl}kD6_VyOTp^YY>WQaWEgU;Y{;p* z$ps8K72f=a_WX%3$fL`A*Y@a+L`*jHCxt>^7wn| z&m{S~m87~$ppCpbKCQm2vuS)nIqfO&@EZ`*FcK0>0-5Y-^26_G??DgKJk+Q#t&gII zY5nDg-_t@ZQe0g{57WkiscBd#wAI5jx(D?z4Qm{a)x)#`R4B011F~d2Oe=sMrWFu3 zvhFnzdYD!q^f0a5nl0-=dFnpx2uXfwC8_G+6-5u16g^z091w{{WFU!#}t^b`?9^&Re4{>vd8(F`%6nco8BlHlLZOxYTuvo%B+vg&2`Le`ug^)O|P;1z6hY4CK zb8FkM<2c-wJ0kmrjrI|Di~9Ik)5l+mKBhaE+OW5njxKgq`?{z({dv@!{(`6pLenw5 zRR$T;-<0RC(>*NGjM1FGPWO>noX%;*^nup->-1!>!ujiT(MzIFnSPi-X*!=wPA?^& zTAzZBY5F(F;hc8*FSy~Hc1C^N>_g=lZCUv$ZhGM6|IfTuS=N}504Zj~DaK835K()^ zA|Ru2XRIOmTAlZC#*`UjN8PNRs|15-R!P}p2-XLRu|Ab*N72a0b8UBtIj zXLRvm=VQDNL3=&~if$}ELQJ_fS~;-JDC6gn{vy&}1eL@mfmP1v;`5O36~=h>5b;|` zZi_nQipK(x&5SPoD}nyfBhmi_^fT)N{mlBXLHq+iaz-~3tj<)=pPK0g^fTR5^fNoN zk~X88=_h7%Z`VT4j%4OUCcCDAEV*gSoJg`0NeNl^yNaeUbE1%F<~(cmW17ayRkGjB z+(7O&m|k^~oN91a4)kJJHIu7}GtnM|snppb9Bd|L)z`Mb@Ux!44GoWd&>ex?i(XC;CP{cP4kg`EB9 z;F#!CW^F))4R)GBmaM5+8=$FK8;BcOf5i$-&DtO|HEXXm`!SlD^`)$-S!bZBS!cum z6s>V~UAD&Aj%cB?7(wT1tx@DR2j1C@AJQJAnB7T{qV`;S85K5rC=@n(n5wYZV-|Op%y!m=5QmxoW?4Pb6!$doYO|$j5P;CjfBOHbl^GNne5DhEZHn` zy2C7UI67n2-~R}+%;_%7GKWtalx*27%0{j^TwR_s+$xyb$Gs})BIV{hXD(rty4>n4uXKD*k zz(&H$0*nhc32!}081oPkN`M#%83IqFg6DnWd0%X8Bk(i@SWqT)b2#4gegh?&B}{D- zt~g?aC1Ja%9Y%u*=M*C+T+GODHv6LgO2E)R;jTqWT8mzn{TBW>TBNy+l`Oqpk6&)c zHHd95Xf1O)v8uWfJ$Dd(Wqu+QhO#lNsjfuNP2w+gC3@~M{!&+>=kDRJZ)qIj#8C1P z>(XQAP%zh4;&Gc=ii(A6T=Y zqgpcuD0m(;G_Qm0sCwQz>Zp2NAG*Q3fpCL)(V#Lf`YJ9#AROR{n^6`iF~muB*?IAx zG!M%k56)mkb_VQ>s4@?u>j&&F=dB=&voMp^A{lX!a*qfi_d#U-lOQtxNk*Uf&IJ2c z#%J5j&c`mV`Qw#-Z+ zCJ}wmgT_`Qni0@k6SvCEEO8eZ*=1_)BDvJy?uxmP9HgY6lG;ONvJxH&`d(H50+D z3tfevk4=g@nGJZzDtP&CErsr#D>S@e~_z0bBmPnG=E`-A-6ipS4x_K2$K4TOONKb?XEJP@`lC5 zaSxbJ!O#v{5|)8K!%(rB74gsj70Iqn=VeBh+UaRAw7Q6(}j?XL1MdRGk8@4W}ZP-r!TZ zR1C#a-6SXFjVxAe#i}fV%&FLzDBE0i_f)=LlG@kw8n}YbrG{HvoVKf6QB~%>0_!-G zO_!W9+cQrAjVEZl2`|>^&oT4ib{uLY*=Rb@IvM$wQ` zzp}X0aRe%Pl%;rg2TA$&cJ z4WYINq|IX`Jq??-LiK>OY@j{}!=`Q442wJ|ZKonmnpho7+Xr#d_G#h>!@@*q-xFNb zgVnI z`_lAv;5vPs$z8TsI(%1XDE&%|!;3Z4TTL1YlOqTDV{qRoh>dd4Z%ZZ6g=g8#*vJ7#qS z9#}1N9Vpx-LKxJgp}?Z_mXS-vcRn+@gE~`QNhg<|kV_IiZxuchn6lQ>B$;=R?rRbf z;BNv@nk>C0O;#hYlhsH_gF0C)6{K06|39S35__Vvh7f#+y)<}qlVv0$OCZUehb4iD zvhv|L>a+8#GO8tOHxccwjp#P8WxGC%#21;bGUQ};peWAfNO*E~Inn`(v>=wA{Dkbu z*(a0?;mO%wAvd!njc(hCa!1C3*m?}1+5f5`H2aRlrM@#1Y^)~~d;x4CPclBK7}VI3 zoEx79=f>wX&eafV^d>kM*O8hvgc?5(P!WWR(4aD3l0&F*l0DQ3hEQWB(n3k?4k5O2 zF{`l%10*9pXJ*?S8u{*{agXQ@VN>JBsLNM61S4cd?hcJ-P=-UO=4XpG0D~DXpyoH+ z32Xe3cf#L|zYyCmrZ?rz)l`oqcG#lC`^l!p8i=VmKupa|9TX6R%!fcCWRUJGK;tvT zQYWV2f}qKp(B3A#HVmdr5w)O)+nnu(3gclm(+puY)}PG!Fqag?^GuW%&jc~KNg?8Jg2Av!G@V+EN)kSW5E2$Eh41dc=yL>iR}r+AB22=5`t z&RQVD*`yX7L^_SW;oTS*KuEpl2AThs%x86D?y{q-xwsCJD{5l;CJ#s!zvhap*J$X) zZh%?*q=4}hFh>Lo++uNmz;qHYqGmK}2C$}_yX?5Ey2V#maFPXv(P*xVZ{xPfqEzBp z(gg~}a23o*z46lrc$f6INUQQ2urwSgMpDB9+R>76B(-D|1Ya_of@_^5wY0>dX=%w3 zclMZ;G5;XiL{y>{qa#cAfDE|vX4QwM^U&|7)qgaW4OaBGmOK*|y#F=yiKJ{3J z=P96+gUOR(kDO;gDd$<$>N&5ov5|?l&Hb-n}&KU^oIfxI?$|a%LV{FGc z?^`5ucRmi!8Bc&T0;HjlYBEK{8b6X>=6Zu;)yUoQI z!gW0J(P_X}#Xb~sKR5iC&>WXA5l)~|a|l&x=F5TR{^VU#Db!{DKpm@q8S`ucnl!*{ z0hmD?Y2r4CIOf>lutSz-?Z?flEz+`vN=z~D7T{Z$QHp^Bk$)yij}!SvcE}ND z%vXdF;Xl+N2NE=o`7Y}LcA1D)%h-{c|FVOHW|lpRgmd=+u&f0OUDwWSadTCibFmU5 zaK+zNJ^>mlpHSoZN(@jR^0(m<-=$jFfgHNw#vlByMC5QCFT(oDVc=)wK=PvnUWm1F zMsr-!)z-Qa3j_F_ScA)KlCW)=D|4(PiIr=8V>B^U@rntLY7%4kFW4!s z_CoTpJuPIlAF~3R<1#{ZsMYTabkRgN#10)A-s;H=^%=Kl>DAMb@bdh1{J|o?bH4Gk z^y=h`>hE6Q58kjkS>{7K;)j8GwUMZ0h#bn5W9owHB)XL)D(j->j#hf^)rSOYWvpMO z=^=9l07>*4GNI7Ip*vr4$h-Qoz=>Hw;|tE_XxL=U2S^ZQBOa|uCXQ2JlQjuShOo(+ zlt_+Z!$nz3YcMB%UO797?cgL0ytW|{_6TQk zfk`Y5tZhXkYhMDvwHQ#?aD#@jwmsUz+74iAZ5P27;?3GOEG|vjgRQlA!%uzZWNolT zTGvA9)YlFLM{9?QRziRT0=$Ep945)`Geh7t<28&Vt=|_~n`3*BkxgOBdE&sBW^K8^ zA)xStXl;3q1Ref}*E`p4xQyEzP%IE<@Z00h%9M0i;K_ImEe@Dmn%u$rDaf+r0q$Yf zsdCP^_6v$2d~xknp|A54@x1nGjLAbDZLY=e$;JOonOb$XzKY69=r~VamF{$>}{iPB}VQ&o2h8Z`_C%pj(gGMpN-nWBtp} z$NDDJhqj|r%<}U;=d>gLF1cR+x<%SBhYyt3qt&j*$~o#PZoNK?W?Ijo_WHhdXh?RL zD4c-abo~g6%L@)Btd-&Lw4DO$Y+!ZKQHu2^$&WDA`pW|3TZq5@TdUc-%VuAX-s1VG zME3{LSxt|@DNQe)O>cmh8>TC5WJ6P6+R#*-^99K_bRi{JWkVlZ@3%SUE1k=)%A6%D zO{e&+O$Bkz7nt4{E<#33mIoNtX1R8h7~L%ZJcC_$3YHI9P*?M zWnx6VL4+Zpgbl~Z^l@Q*7<2>rduxQDpjds8`=bqF-~NUhtbaobO_|fMuzL|9(iwnD zVVaFFc$4;Mj2mB|*Fi$-!mjANzhZ>m*ntsxt7gHzK-jTxF3qze88=Do5yz z7*2}}5urEkd1Qp%SjtMybnA^6G&X-$2)2=P#*IhBQXxs5VF@&{@fR!==4U*us$N?# zU(I&8$pxti)*?F_<2H5l!lg4bzp1~_JQ~L)@w8wQpB8ND zK}fA90PRiT!WvEJlbha0x+YGc*)&$;dec;Jy=ki8n%K;A(M?N;4SnZB*!BuZo_&NQ z3~-yy0$_>I#ikkd!MQ z`2-N0ZNad+#Z54-lbKeZ0B-3opu7m>Wrf0Fw*m@FTDDM2=qX#KAmJf`?Na8JSwt{P zZA@D*^RmK`A{*0nRKe=`OY4Njx8xHfUo1F4vs(_ZL}gHbV3~;^pISk_Cdk)fjzJI% za~=Z09D^VT&MK9E3G%P{>}PAkS|I9k!>un<6I&U|wl>u?k(nh2#jO}>wzvtRTe~V4 zlzx>Su#_IKwI4@iTL-Y%**qK`uysFDg+@Lf=9ig=KF-@5{jf66{ zW1mCotwNdG&k^vPs?6cvbDpF!cZi;F2YSNR zTb<1#pv)b3sIvouoSo;PF;j0@nLF~8457>&g^yI`j$&4-!vW5YN{h=Y_XPVp4wIe3 z>Hud4Cc>}WgSK|u!LT3?UxLvlJ=&Aq0N|;EgwMn$j>GWy6ldx?pFn)u`3(Gcr~FA} zG}E1}so9+^VWOQF|GaWfGZ6^vdCq9o1)^_&MSlj6j)^_@Hi-uRohj(y!ObP>DoX)>!D?79Ir z*!2rg7uHb+vxSa=y$7W7ryYB6gF@~zQQV-g8Ghqj6u3d*%NnDFcwtB?Y%dsvu!Ul1 zT*#quA%?~_!h-q2Sebd&TR^IXS*(|8R}TUeE`EeSbd*ALoNZ%-f(kdl%<^x=Q3^LG z_E!52**JybVSXVW<`-HY=4alK9inIPjNHsG7*inG?$)eW>ny|6_MV8Fyo*rOyPY*E4tk?R3(LFr`qk9H| zQ8`m#)GRZ)C!AzsYBSnaVRV|p=xj1N+tg2C6mD!agJ5(No{5iw_w0f9?D@$e?Y&E< z=!c6VGJaPwM3~w0FLD*{vDr$ww>~R5(_i+sQvGG`^A?xa8^CaT-_ZO8dD7l@lsZgof#xrGT`&OkMk0-u>}EQ9ClbL#b*8g7*%nR+D9?2E z!U12;7E0Z_iXf}hImq7aEKx}b5Oof+_kiHBg!N0TJbo_6w!Ozl3m&%@J)Xc|orB~! zvW@P&Oo!ZydC}|H&gRk3a#1i+ghkq4N-cZKS}uxJGK7|k#v`}3mWyVwQaz}lC=ChQ zS~5?PSw`<7u`{FSL-<4yg0TA(t>w@tMdhkdigvLOMkzX?83lP#(Fw7?wdi|M5iA#B z%I>~|74f+ZwD#*T74oE_Ulr@^bE0O7{(@$T{<3O@JsX(V*NAjfl}6?`(R%yPkL|;T zdu4|r;rI0f^ZUAsTMv-k_a@0|%xl|#2|WZ_QMx!E{N$s)eWNTc9eh1;Ga0(6BbL?n z%|u>?u=Bn|aJMf}Y+NMr<%&%ED$&v3&v+f;?YksyJAhSXama4tB2e#dfYd{v-j8jX z3hMnY0QLSCgx3M}{x^tPl~?t;8z|^&1!2#-KR|fhW!z!>(ILYQMD@D;Q>l>sV_1KT zRkvTtuX*jqinsd|62)?x`x2spYj?X6ooD=+&O8{c243|E18@H2gxpV$!G#lC5&pb1&-z{K~@Zr#1Lunlf$qD zExuze7`7}E7?f`*umLC-=F_(u2EIGVPjyeEepujL8-vwo z9s2xgUj(-5AYiT5j?k?Z+eNFRz*#jG|Li%d#wUibrY=@-t7luJ1J66~$wD>yz_*9M zQrUZx7KPJy%~AdVSFzE#4~AEJ5Ev8kV2JyGt@~hm zw(f%+S;g5r4z2s332CWCI`ke}x3k>353W`+MC(4d>5;Ab;C5CLUqCpx$KvwtG?@6{ zM`ZS3HHnllPxD;1>Vqf6Vw|XQnN`lSN+k7-?_0yS58f3Xbb>feBB?q!BzAQlsskMy zs-x*3YoqMyhnf)$B-RN@b1Et6p*EECkUNW<&Ep~I;g^tJu}By0Q_@#tNe_2aGQ@o3 za2MptZ}EeL!vXk}DIT-guD>6KQ(U;;hyop+rG}})cvSJ;IEZjKO^i_T2|pIe#HGl? zIdHy9o`S|4)0etTpa$Cm2jd8tVg^T#m1X4wY@B! zUh;80YV~6sP<*V@G$f`w7mkO4`Vgv*29?P}p9vLV4^_-K@$pQg zB*d+k)sv<^P7xDX0xTpzJKPkCstD5`AC>IJ#~*(MkN^0%#idiCX@EioUSMU8;^u7> z;D4azKelVzN5nIXBX!{J_;{jArvlBpz}S)JXsvukFG3%A7pVvM90)$QFuoq?mA4p8 z539aMq5*uPEp8G;RWt6^pekBELNWM1vW^&bBOOO}pq70CwmfpW5iZ|Dj3Zb|?vx1I z9Jxka7=Env)b_|7i*#bO1Cjk}k&fa`g+%dIuRIw#>UtHKbu2EO+a|sWU4XNr7}IsS zp&Cl)qL2=Bv?T;MsvUuT)SY%a+77|-XluY1yI8kUgP)_GfaGyJp1Ak2NXL3Pbi0jP ze^d>E*hj24uUuFTCm|WW1;?m_eaU{<1-b4c%97lUjs)ILoRWt!a zBUcp7Omioq3Lq*`Bf#SF|0p}_0IQ1r|KCF_Tv9~|6$BNKMna^dyHmxL?(RmGT$Y84 zz%C0&cekXEUfbsp6%Y_a8fgPiK+50iJtywHgnoa2%(>^xnfdg5<}-2TmbDK>_`1HB zYU(j%zj2%B*KHj+MVx~4b;k&rPMK4XzSj8!2KA}PQ;@#yjXUZ|j4TGr6YPEl(7Q80^TjkiV^>tzol_Maw5#1(fZ09X zFf@R>u@diYot3tGm@QsUCK$qQ4jXsvYWFM%jZI$uSAG~Z`dOytg?=8UL#Y+ z_DwBO_zk`UW5YVW8OUjI>Zre2dX5YGn@Tsu6293S^!>CTr2>X;?uuB$%(rs+-=>_D zj@}M7zAdgdQ1We4Vt|(?JO|Qm#~R4mxEwZSayrokW{1YN>p}p7w7GA$QYBxYDc(Rp zztdacIS7o%&}f5C`$WDyO^Hj$=UcPX|LyOp#V9(=0m09AeV*qsITx1!NcFp6MyfRG z?^wNg^%7KnN2Fln=hJ)pBR`;iH%n6gE>T7Cps!vEm-%<{-0yR$s z>vQuyX{Rp*owR+f;GPeRw@2`MzEa_o#`@9oo|AG^dwz%iJw{A>ZmH0pLH}#L{k{O} zKC2GSo~uT`Hw_3^$t&(1Ns7nD`PXXe!@lqk(yAH|k zdxFc}WAMB8GuNK?nhBG=9}2=IAb!hHF}>CP7i^Vd+q=(5p{Y4^a9R`w!@{AUBs8LN(P?W}0F4_fqx#PhC~-H+zNm|3`(G zzqsGB_G?aCeVj%g2P`b>fa$sRYrFpb>xSj4s!OLCQP;Dq*Qla)QbQ~12fiRNSmdpA z4~zqs1mnPI-JUeJM*(+$(c;6w2?%p52UF45-gM)cgMRov_$-VaEaEbDu#lh~lsi92 zr%~y8+K47|u)JZ+*ycfM|8Uzmap&L-4Cvqu*MNRt6r#F=)uewY&AT5;2U^gWv6UZi zCNnz4IWrG4I<@9J?xbOI;EwaP$4~a~=ZBf1=Z7hRFePN-+Jgv*KP{mra+Cy9-c!C>bg~)K-@waDM11m-9oJgy~R5z#fWvkn=+Xyr|T67Kd7( z(nIDGmqU%v!67rHbf}K%vN91NHBY6ophNbTvZ`YKFY{19x04L!vAP{?Zgud?p#hHq z6z(hzEea{*(7K@Sa9(pd>*2I6(}$l@M{xKRARaDbGUbC0SHZT*%C8(|pmq3Uq+dB~ z=2Q-!M(Br6hlK9iZ=42o3TYl6Y*&ppavQY8kxS+pko(SLa;~v|${Afm_KW-ON;*6^MGW?rw0hqs9=8XSG-}2)f;~r4! zk>sv#;qL%E;b3w{Uh-8y+(!`fkp*muCA>MZg}&7eZ;t4g#v@GZnJ!XmlzQG5f`H(T z{1~!pZ>3Toe^kSPc|M^(A9uthB_$N=Iq9LxK=U7cQWId+fPa*5E zq}Fc8dW`83s{d2SdhBor;3eojc2ab^A?q=EN)xgk5Bm_uF%Cjj)Oef$fJ4yn%n)=u zvoQ&jaoms!LC0A+b=>g%CSf4Ngdj{1gbD6i!Eq+9BL@>n?pnd|wG#O8B`UupG@-D< zUMo1h9qVa{86E#ZX7n>RERL3bT2vi#V6yycYr_4FPS~OOoZ}a@R&e}^ibW;$WIpEv zL!}b~gT7O@eaz>yDNcr&xjHd}TxXRgY^~tLTop=LpW-;66Yn$YnYp#ov7Rs; z`w4vnbYff3U#qZZw%F&1uQ1IMyK`_kY-|i(PB09v)c|>(__?+Gp!r+N6NKoehC5y3 zNyTR;%bKo{3MXlkwHo04PU7!R4){0kcXGf#dB2l$fH5b+`<!*i*?6?5X6lrw}F}no}=Yqitp=VZ)EZAAz*7UAsk2ixP03(TSN)Z8lg} zsr)L>*yFo76=}htiqQ%B8&uz^OPZBDbye7+l6qmq+NgUvD(E{yVBrh2=7JTU&hBIw zD?a@qxer?L=>jUGF8p*`QqOQJK0Q>VogN6X)4hZKI)8YwL)fQBA?MRmT?0N%e_U5P zz)#N&8Sv>P08eGss!p#F03(~z+BSE3iz}PcpQz?TWpnztAwWBFPah1)<|$h?rx_K7 zDn=*llt#~FAid^j^vrXre@3qBOy*Gij7S1}{MYC%iStZViStYy5g3)!8*!dtf880z zOh2!pV4w{b#CZm5G8smkXNHsepg7NrQ6Y)*%udo5;o>}F{x<8(w?f9Kw_cTSah^Gh zIL};g#d(J5%zEt+=b1l4;yiN);4O_fe@-C)Mw~yVgT0^Ax#Il!Y1MqFIDalBar|6Z zi1Cn9-;b=BMDoa|B*OoxG#Ci5v5`FT8NfZpU<$^fRR&X*>q)5S29daFU@)XTez1BEW=snv_wc4qR*V9;@ z)Pv9H6h57PHXvw{``Ou~`M$8t%x6vieReriorS9U)57I`b`x?xyUWO(2;nS~I`w}- z?q~lCdguRv&K?Z<&UMxIuV;^);(|A-zZT(~#Xp}b<_PEPb;NS^y7A8dI+xx7bS^6+ zlfmP5A|a=P3|rVaS4Q+0HJ+FQjpfX0S&HPDXe&JoDg|4Go--w!=H!TjyOxsMU(z!XAq1PPrx z<67o9214~0Afa>Ygrui3-z}cI9rT?ylQHMha>xIqBV(s8JpYU+IiCeLc>W314Hy6U zJmzH)dhzr5gZ_qZ#Va^FxL}=(?>x41KH40XbiRgasuWXJ4c~&S^X-h-&Ub>t^PK`6 zFk-##uh${#=T9z-9iJb@yG1srSb?H3pHDKl^;gX21FGf`hC8=`Yd+(=J)a@+|Erqz z8?A<)|IQ3X5#xE{U85vIz()^7=_1bKvmAwAh%)H!3ea7zyK%pZyO2o*^P_|kA>D^Y zq=33mIRvUUKrYk{bhK^fLVLY|tP89sJ;Zi~s+nFGu4a0HW!3uAqLTU|>I+jztYTbT zrUpmzQZv1<-pMdaTNk#H>owC0Up=%fUiem3)D|!NNID*F3>VCd!-aD~eKP28T-uX4 zD!rinkr!?oOT(})T&F;1EbXE{)D|yh=DEJvZ+|g|02p;#%!2?f=5ZU(#d3Os#x7Rj zrbbABUgLRr{;n*FV2uOFU}R- zsHA>K^WtjK#-Q&~PJ|Tb%mry){M^Yf(!98vTu+)8kMZ=NXS;|qxs=lqj*Ir(=EWWZXKd#0i%vS%yUOn|+*`UT)G$MDyDh5)HFcCeQcVUPm;)oicz9Bbwh1heVUXR@83< zqRkeB6jefs`aLCyo$zt?em=1LPLJ4ZonEyj^+Ja|Br^-){@zE~BS@2&LV7~HX#w^3 zfU@V2mQ%W?m%UQiyCjBQt+h~#?0!Fh(f)oQAD5r>c!~!8JA%KN-><^Ill~0%Ls!g1 z>hE_&*Nq6#;D@fHK|ELN(?6L?xxy&8`R}PUU2r9r1QeG{z0;Kgx3D@xVo8`xU$nU zF!X!He4%kgM}}Xa9~X_DhD9vcF__$Y!pl6bHb(YG%@} zKEeB|C@cadTwTq@^wVX2U*+99gEb>^^%Z!spDSY!e<;T`25%o3D!AI56zxk9_Bq$p zc0$t9MiTx(*VTc@|LRb)%|k_4n|q_5U;nRlHGcF+$^I%`)wTR)wdpF0I?WSN{M9vv zk)2}1CQPHrtDgjVLlt_yN=V&oool9QTS7z-#>SRCRYZ=lX+z6E zvj%%@h!F>hxHeI3?%H^f!6Zsp8$4p{PlpmBYoK5NXW#&zq*0)>!|%7=hw`CGx2`)Llg26x9z3O#xj$@lR7gH&THyRm2p~jZ~w| z;@Wj{veNb6#0|dVt?yZod2oWqJ1K%<0P{y@N%xQm@aK5>+yecl9Cmbr6VYU*64njv z#<)?z7FOurP|=pN9v^RJnoU#Ls%CeiyM>@`#FD-=MskBb*%8!@xd`gUT(=qDSf@9b z!j1Q33in%p-HdM>k-gr)LEe1K9JOP3?@8;_=ubZtfubYFglAC?;mN(l0LOsCE0r&L)xya*SKrZLF45iqo zP<3-=(Dzq0Cse(up~ubd+%>YBzo}3vOOgToU-X_Ft@Lb&Nqe{n5r5T%h`$Eu(jH3w zY6T^KH54U(aMSidO8)BfGcP(*B2g=le+@m$Wf+fZpy{u1LEo*C4o!c32~B@}=}u1m z#c;?7ny~$^&fvE`m4}jI>F*y`C$71=ThnC;x27P@TXBNmH5#bDH52*PJ0k|yR@jfT@(&)7YzkJkJ+=)x9bCP0U&QPAxlO5gZ6C#-{$WiyW32L zB0G2Qx|x$!l&HPyB^4ds-maeM_D3QsDoOvsbNd_8_d(xX+OsdvmrHUoFb0#6%(8g8 zMy?YN@^~kM&sWjzNy28Q@8nYz=QFuGuZo2`TGhEzB*a1{;6R)&I`I{=5BN^gpug3J zgVm|u(RSoJ(SfvfhcQ$(; z&fVFgJVDl>p-x}wEk~i`JEu_coxcsWSFwmYznfc~i*@I$>UtL8eMVvBf>HVYyU8iQ zh9TeGY^2_1h19UxkChb8-WFD5NWw%<##8D zn!6(fXrw2`_#wy$TJO#`Z{LH~yM}jiL@1?#w%(#bFrllRh*>sUvaJ>1KrLTT$$93Oly zH(`JsnWMyed4v8oKf%I1W9s)xg7sbz<#{Z~+1;yW+MQn3&`X4O?=7{s39tK1p6^~y zhrfI8h`)OS;P2jm5P#0Z?Y&u4zZ;Uus~RxeTS?j;J}S7kQ`uj_4rFL3REfvERdm6u z?j1rs_l^ZEYoS?kyoY_XT`eYV7~I!HCy`wk6ByXvJ{bAiZy2FN_?v0ewyR;}Z~Y0# z^|;jP1O6sv`MaN0nQKS;1fsujdTo9htcLOT7mM^_gkiI6id`}^)Sf(*8-*dURypV%SKBtQ1d(o}J*`|&tEMGmURI(2!uzbA= zQ=yk}@~63*t_mf&S*7$Z;RhxDA^fm>dx5bxJpABsbPOv{mhTJnY58`X5tg98edB)$ zK7JM$3e9*hKtXbj$8mOs(2gwpgN(+qUJ(+j@JTK&p_98_NLryXSwoE-Sk@G&3*N0H z)x!Z=)^ay%y|QR0mi2|xPH@(G*_EvQj!d}?lFkzpSk`Zk(I%N+vKRxS^J_e%jO>Nc zTC&unH*61NCF462E=C0>xHAnG_{oZ^pB?-8{XE+9m{zh*;x1WBRc;w-j+qI=z@98d z*x@|cyW-r2VNYg6Czi$$S;^+$h^%Cb#Z6Sw;Ict0`501M&`R->9MN0G5n0JsIvJWc zvXXBIIU=4u;pu^iBP;n=s>0~RO1__T7`Nn399zkM7S+j5f;#z;pub}W&l@4U0x*Zb`M+$u_W>4N*DIVu}nPb8!vLS*L*^K^bF?pcU0tDrs-4Br3|u zFe-^kAFh(9=N_t(sNAZ;grgNzz$PfF7z9NXGX&9AqMD1(C{Dq(qF6KP6gnOgBBS06 z`aA2S^9P9>3X!S$lZFPZ$8w3tjy930raKvi$W*h#iA=TTp+u(Iq$;WF1MNf7XI^&( zQK`Owgt=;osgAiVG1VdEbtUVvV;bBZBHgfiEGu;?F_r2boTj=LY9fBSiKNa>_1&a|R-s@vT=&hjT_xVzUW^XKiDj@rl z33AxnjpctD8vQxU+zrmyk2CH1a$atVjMBf2TYfqW{|CuMpP$iQ=edRoe+}gBuMrr4 zxMAJjMQ;$dzc)7#;)c_CNh1_{TKHS^!eh+AU0DNhf9y0W%d6Jt4>3zr0 zo8|?tewqT*PgB69Hx26*hTb$)xOoJ(2c zsjM^$L+Dlt-O9iq6U|#`KGGXo%Z^00*%W>ks`7)X{NQRN4TE9BVOk$I4{~U0gnyo- zl+kF~EYwe%#pN(9c3?P6TZEfOaG17&-OZ+D9O8mu9Ac%74h%MbaAKupxM7-cT6P&s zZ95?~Hj;J+d7{XfD45#TcG=j;aBU{D(tax=#c`$8b^=}cz z+`Ss~_ozYhP3O)Spuco)l7?yQVx{XK04j(h=uty2M}xT|lWA5u&Fow0w!>694JE8} z>#+88E2y#Ci(JAc)2wu#2d(t)8Mx`?p=~9l@2a}#+aTlgZ9+YkeMX~|ey|FHBK>4j zY#b=ktIdT_+~2ayWSW(p`ED!yXGAyYH<+5M;UfJqaS=BAWu@Qzu-Px4s+pcYJ;z~M z>5mx*KMDdm>rungSp+D)oqE_rnw1{MmGLR#4l^)6>+qd{`B^JN88eZFsxmNi?>x68 zHz3R~;NK$I4F9y3%E~YY7;_>b*$i{cM4FXBd#S7pW6v2({$9`iQzZMOzy$rhTBm;K zG@6xRi!+U8W%$N6P6PZfg37R8g8Dy9qFEU&3%knrEQxh?j4oq-Pe>Wn>t`(Hw&09% zP4cN3Yjg967M!uS-GVc+PHMWIjFZ)Z)E8%5<@UuHm*^#ipK-g>Z*jYX^qJEaXVd`6 z%J{YLe;w+J7ck>OXO$5*+@*;KxhX=>U&g-$5LfV66gP4Ok64Yf9(!DY>|pcmL$#ywBVAQj8#sCM%310TO&e{_)b3kZd02f612x+uRq>Ed(beP0EnYm%KhSXm_Pg8_Nyepu@+z3ZL%3_FNA|u@ zcaZ%1<3;Sc!%f`@rtWaEIWy9FoDbZ&n8L%jJF3T{=5a*OdLliKPcR$=)JX2i=&_7> z9K~HvJ+j2cTe^@Z=Ie33dF;a72YUR#Ja*&mh#rra$6i4zlb^>-tkF}q4|lKXk*QrC z`*GJyk9@epBh4$*a6Jw;kBC0gB0VlLkFnf+uE)>KV;pxE^~kA0)QvanFE{Kz8720g zG*g}92S+6hN0DsuvND$lT2(%kBI$#q$jmjJ3@xi#nYBC4T}ZVu_v2~uDD@*)Tjr@e zO=R^pVqcM!d7%L0SJTMMNU!e=)463{FJ$YT*)c2g$9fadpLSJDnE3!O14CMCjZ%-d zgH{%TC_ETJ3{yr{mUJ@oEUB@{EJRX$Z+Om);#snhp7W)!*Ma%2)5^kVwckL!Dn+X9 zOBoodxkL+(ndL1SM3#oU&xB;MbTK096F!){CK9p)#APa%qAV+TjJxDLN_26T&0{SJ zAIibyrx{5^4Z?m-*rkOmzXq*buWKS9%XJm8ryW#;X@`CTAs}m7vo~m=N@vYX`bE7~ z)|^n9wb)56gwg#{s$ebCkEe^IRJ90_v;Lf%nRhE|d$%z5PN$!SRZJ@@(M`XHgUC1Qo(TEs+d(U|ovlME zE(26?fKd%?JDb{AHoJ|{T(fn(NcD@TX0EHP@$0=#g(EXbGdZQ*(XVYpzc( z)#Fn0*0hss9em7RS8Lk*d5K=?&E80N;L6@s>dnqM5?1y% zBGrrPvU7~Lm3@M%-Rw+P+1kxM8|~JTcC#w?_vexYXRsDUg z>a%~N`l1)|Ij>*;&}?PL?sD*5v`GE~lC$_BIS0LvvB(@5R7E6nnuJYqj^ZLYM-fQQ zkuQQ|Fy`RnX)A~Q@w5Qfb1>#;X)x{+#vC0zDd||KTqo2DZ4vmj~j&Cll=a^U*Mww(IZ%E}o)kU5RKJ!dWT=UimCGDSpi&doMv z+q=$Kr_Y(KoIi*$Q-;-4D<>XR)Y%Ss#wP6muyUm_%&AbW7b%qMSqIQ%`Q;hg_;(_s zxLhqW^0GJL%GFj-v5j1KmFH(!!t^{N=zf2l=4J>tot$~V=T{2s^9u^=5(=!MQu(xrqCZEqKR-Q7L0D<82OzP_L@bUKay%SzQ4S86i zw({`rlUAN#SVA61?-!J;^Q?o*Jab%G=Sgy8oo9vVjMw@sz2EA+Co(X)$n%MLUruf< z&(}e#z%-_JtvrWG=b&MPYoU2Ah$~T`z#xwo*5q-+n!I*cvsQreK0)F`15}WgCOW)n zI>elp;gfOwc^Pc>8>nK{NPX>M4Jg(wy^68v$u8DW#blv*hw2U+$Qv&y=Z!_md2v0F z7MeE!spOprb$RExZ04Qiu$gyF$UySGA7lrey0N@0%UXFqo&JPnqPV=qt_%Ygg4RnX z%*@tH^dx<6U;(`DNs9qL)DhZ^0(IA0B-d8qLse~($9|zEj;VC$e& zWUmRG3U&_qW8QyUb^1GJommAZiUQ5C7Mw{dE4Yk)px`nrrr;b?SW$4nl{Ur)hARaL z8;g9+X%tpL98AG|kU7%06=U=T`P9=YNRI|i`!p3e=9^aGGob8QSUwvS_G^$;D23Z6 z6iOx;6}%@1H-i3A(NBc-l0i`+2Ep!9S0UoCBA=!JMj`%&$SPEU2%%5~Di*@h)Mq1v zLNzHXEFIqN|7nkxhpeh~sni-5ubh56r=am8Xd8pJAmFoal-3RJTA4ILm)u5zMDDSBoRf+w}SB8(tn zmOX|NigcF})I$~-p*xJS$ZSzmWSVZ@HMa@|iZG)UA$xC{Rjswia;GH~*=}lV5$JUS z==I<>n`$>W2QxZ3u&>)ouE~$rnFcz1p+FX6)hIc3JFD1ds-~Yi*uaZjXcQWwzj0FXwZ$_;Pzsi!aB95JShy%R-Nj*5b<- zT`d-4!m5S6?eX^P=n0)?+C$$qvHFZyZCYFE`D5Z zX{3tNkwEcN4~wK<6DXCmSBedd*zBH>!Gs=$VD&a7v)Vk|RVwiFZXng7i@$QP2`SeW=_{%Jp%v z{ZH@z=bCg$<}w_|RI;FvjqyZ?pd>vKqWTBN1mco2P+v)VqFi-mN6=n!YiJsvc$t<~%<11MoA;(t=QgnmE*(T%QV zrL$7SgI3wRspZp4F%FurAd|6yQkrxq)x_>^&2a~M9$=~&4ZvEdq>v3HnUU;l4n44| zn<ujvlZEM|2`b?$WWmno)km0Dd(mm0r!_ z483$3hMtMXG*|=MtNL)l=`bCdI1dBnUS;vcW$x9tRPrrz5`(JKG4aZv#K2#rYh>!J zR|t@^O=Pe}Wv?DZuyH3`!M^$n_EtK*8)}qJE6z%%5>z~m3)SNc@TH$oM-^9C!Y`eN z#K-f{R~mmB_t%rUv(ET!xb*tTIcCOMtL4r-iYM98;Mu zLg2&MEc2(_#P}CHJdT@C;9IsZh{|ew7eokUE0e~UwX?FdJw=y&3*coNJBqGu^HR3E zr|7cI-+L)AaTL8sA}u?S^qCE9S_s-=LBkoCxemu{%B~GT+YzGEGaIyBmJM~jiSH@) zk%Y>gpc$3DO*1O1xv{cL?lAli+HxsKMGe|=>4cWo<(@RJja{itma9Z+%!JNpv*sWX zmTP;G3!{U6DdRp?F6*0$hRXFKOJkREF{aq?6Wp31rYB>_DHn_5DtAnmZMw`xtmWb* zR{5=ROGN{5z@!pS`Ao(q2G&<}=;at_GTy)x`BsGeL2y)FEvX#icfvYxR6Z@~4HN5^ z&lL2>pL-H=%A3{s^0^_W{BvT{Bgby{<;x01d98bvFXow|+20HF@_2CI$o7m-w3}C$ zT9KBTR#2Yt86{}*<@@&HrGeKT6HBk9gXPzvB3MSHujM4=@rCc| zd94ugeeEUH_ICBCWHnjR9Cs-8+Ut6p>$;KGx}m?uFzZPDs)HG6*@+U+9s#MX!CxE z01xr3YvO#5oQ+QRQ?ZT;R^&VYE?&X-4;lMFN=1xJq#%}xOl9;NNE@u!pPQ5r$9Tsc z>u8}YI&qUssiK+ts5nREh(>9vJ55{dC2Ok4KDtUN96wp{1EKuD4V@}}Z)3vkS3GXQ zrh=ewx+gnq0(_;kD8EuMkz6S|I4aTIfrG_j{6Qa|CO9jVboE}Tg3)`Wsz8=iKtZLt zr1=g7m6}6ArRFXLm3nv-R2pJDva>r?Ook{}CJL_TvI8GdX%z&p%Ff;1Q(SQIChVyM z4_e=f9M`H`WxvYZbIMg_E4X^l$Z}9xxd>^5LuqA=SSy!yDXrYlqqK6gC>v$P1Bj%%-pt1Z*GY;j+acH`I6Y^iqVsiU%TQRE-RaRkCW)?}R zFau&1N&IT^5lQyu=3#RZU39{1Uu|k{)`o~GM0tI0L?w+V8?>qxBfT25YR6&ofdO1t zl&|`xlVLW0R&7nLw?to6-@j;|PvoL})xoNgraqO&k|z2>-!fQL@vqZn;~%Qdlbou~ zhK8yM%JZCkMNG2lCKL4NY3LIT%U>X=Qn zWK`Fofli;Guhgw-%net|g$HxLaJH(wP>HPkRdmV6$gu*_}nG)-LFu{w^F;8z>IqQmR>1n@n1wMc`^l_MV(- zhEe0)s&N93Rc(vAtF9VRl@UQT!X6gbGobtGkCV3|NgXA)Yzjsm_UtF2F@|Tp)U?=Yx;VkW^&sAYi89eAlJ+($SAI6QHZEn z1+%DGf~?joIoGTnj`6Zgxh5rR9dNW(vk_XW*~nc#sM%dGvHhAc^15R`W(u_CiUs3X zO;qMSV=hT~xjpX_jkP#2!>VO&Yw{P{R?X`X}RK$)cWYYW}?%^tXfBeN9_D! zIJ*ElwN5K9!qe5ZTu)c)wnJF$j82oF!fjmXi;kzOT|$6r7l57G1wx+gJA2<YNVL=!)E=U~pmvPPM#8-6#J>a@-PAc?0BN43&hC(eoW7vW zHL4%5b)|8s=?m(@SKTMV`+~YpRwC<}D!L$ry3b?dbzcfv4W3kAQ1=y5+3>!gZVe%= zTLtRtmXDyGhEca6Zm;f}uG_22Xl<IH;@7rR@*eth($cs+*v`pl+<)6zkHV&s=6$ zs;j|q-6gK|*8N0p1b``g`U3t6%&L2bye*-|@IYTskIrJ&90XnOd68N#2c*`cwTB5> zeL+3ChgsbX)_Mgna{Jja@_GgCGjf=#R|QX1uLc~}^Okn%5w#c&>)A^?=F_%%?SfYQ zTj~qy^-z^QsxrtGO1-{rm2n}V)O(LAryZ|S?>`8k-hbS_px#MUC`r~$rGM)S>fQXO zzMwuXsXm|D=uZReW2W?)@ zhSPHE4@4&i!ux{yQxRAF#kk@6i%qe4sILCZ2-V@S>n{_qaL;^Ap1D48QvJiGFQ`wP zXWCl*-3HEAf@5sSYisHY>i=RJU<1OYnahCOAdMiSxCT!{M1w+@MS~noB@ z^aTxy2d#$N9IZ7di`E*Hb^C$_%>@(FZNT9`^acMx@C~N8eL(~BargxF1r5G49YBK% zSZsrHBDVp5Bx5x=8o_pWU(hh)KlKF-3#y{A>xLyDsbLAXH8o@k$dJ@rvUXqGdV;Vc?8 z;6~2kQGG$97U~NcwNd$~q>=OmjXorO7PJ~)QeRNm?h6|2b27}<-A2d4`+`QddD3>Y z>6sw1@zbhC)8>gL#$=bz!Z;gaDvd9h{SA#v2mSLl8HqO5z`k)McRHpq3YxbGvKuo3 zniqs@XMF2@1YU)A`sSvw{VzS3Ok=Z$sBwR|XiUd9Z!tMM*k)nNx>-fpN)@5W{pp&XjD=RGHaq#DQGn< zBd|B#TsB!}ECeo_tdRjUSpnWAi-P|7 zXT!N{!tmbZvdQN_NNqu7lW*+r1)J=L!zTM(4x5})b!6P+S8o1z2#3h3DN|id^9f4R zEaJ5(PGJ7osH9Qw*>or=CTKO=C>F-syf&TYWEftX&I;$X=_Z~W`v|j$rn^)nm4c_H z#9IsY!DiF%#b(p*gz~@2^Vn2_X?o6WFiq(a7VJa8O&KE@*13hJrgxkM(=0hmH%lIf zO-f-awiz5O*hi6Oxw$zJ&USQCJq;6^l_pj6>EF_@T5;X1vg(MyX7zMuOtx7wL2l-n zY_pCoTxLfi;R;OBe3u~O_nT?@vDq-M1;;P2$F0p66EBQ~C}-TdL}u1(p&??05JV-7 zM)b|Ll0FDp&EH0%al>uVH$&ql!+ajmY1~rqEM@o^*l{e!{-WTfDhY05VDGZ`ucJ(InqwP_*a{N`I4s z(dM_0Tdw-+NMAcLe)EW!dUGG#ycs&dF7Adc<2M;nF1q8%IANlc-U35!@s!W~KP#}b zU_ofn9la_d(*8Dt(jZ$@fS48y+y>dAo^Z7w#J5^h3Hlcg_be3xTM!JfDfxihPK$P= zsXEi$YQb1!@o+|lEtrsAoP-)$nAyM<;{}CqJPeBYGPFgK@{EpJ%!jKM^Nrc5^ai~V zs{i6?H%)li(^P2UT09WTwD`@J!d`aZv~8=!6;ad=dh4ax)0q7P*jo&{77x$IO=n%=ea>O#)>}jHJ+YP;7W;{LF=p1wtwxab7!^{wBy`4z=PCzoO%F*>tI1TKA= zGvB3OQglMRp*Wflz@a!=AwYDAK%Bi-CAwAXWbghNdkx~FJE#yrPc);}#ae%4zV=;X zrqa3KCC#?MjR=7oCvf8e6KN`fL2R~Iv0U_g5f|dssXtaW7QK!1F-jOCm}-5|--z|- z{|dsVg5VjCiXS5V%n&7B!#55iu%gc?`zq-kP?&VFv)|Ty^4qD<$lLZGUYz4DZP35; z1a|TE3m~)qaK?I@kzLEN+Qag8sa#yl!phs_;N zdy&1CE*yC4r6+WAP&c;V?%UX7571gB7oTt65~N$6iYHD$7ihNSla6LvJ}=<`uw@Ys zprZj>tIiRXR?FIg*HS@4%Ss-+cx|Rs?YErTwi8X5YLwR!zr1+3UbEu7^aMg^8IQ@$&ZmkAkZ>{=7*c;+#HU4=n9K39`nqp+a40NlBLH~+|I$q9d#fK;+B(+q+ zK1@R;Fao!PIZk6jMaiwziJ;Xwll~*rYK1r!4_DDY?4p%z za|b5DJ@mDHMQ^Yv!@U?tnqU^)TUR$wXg#f87dNe&s5Jd@SnJW6RO_}u|FVp!ZP-0Q z?_~I#kiB(J8+iCEXX~Nx)_RP~ed~8T-dayJHerUft!Gham+|DSmpZ()UTYUcj;%jI zj;((cB>SIkh5L&Tq{CryY?I8xb=ND=<}riI$g$0{L90yzBgZx`Ik?&swTmLhHg+Kb z%nq+7L*;GWA#r*aowK9zHfA}a&2$XBO`I&o>$f4bjoCxo=6xt^vnJ?YRfSFaui;h> zE?6%mw)rGzwQX;Zx5d{wifWrzVsEQhp>2-H&y&$aTP8-0w%cN#0(ieKJR?5y=?vP!+B$-!~{%ty--Iafu4rreh zR9PdY1KMY`zYlJoUPQLnDh!zXtIPe{zgPi?Vln@hf3ZTy?MWT#Ib-MclVGy_BzOI) z{U(pe_Fwbj>wjai{n!7r1Mc?x{SR1z{x!M&oyn^d>+pYJ zQVqRBCYc3|wnHIFvqNs|vBNVF_J~z{$@F~u{c=9Ubeq;PZ2Mv)r><>%^ zkIG)Mn<`{?Oe3;8Mggj$PoTV>+OcmFx~l0Una?XbW}x8brs;HiTICJ=j?V+XHN(MrYBOK*UIcU~NmD_c%7zrEa0$(KV$yo)39xjct2SQV8C@%MdsnWf zQ_rB)d0mt~n(8!Ag>9#h$&ps04hC1XDFTORvA&)0;8DGoV7L(Vo;-xear2|zmS zb$aej$DN+L6MdEw(L6K&>72^IyC-;I=h8Smcju>^+NSS{PN3&DPRt|D$wXy@7ww`wV}Gy58hB0CQ;u=*g)&P@1+`E>_Zym>EybsinU|w;e@&lCd}?S96@y*@!pTv zJ}t286v?402bWu2#|8ZxL!JcgyG|o#wHiRz1wpIZ5cTO@>E62D2G_e9j@WZKUGE~s zu6F}dfeD~)OloY@@S|I9Q{Ne_d&H<>Qmou!x6)A5twu&&kW#nuLI0*KpzGF<)Xz+c zb!#DD2)-K;)TS)Y!B94L{hu0V*&v8Qp#fsfMWmiug2t(d}>R zd5YylxZP74D`ZI6?eCy}a~3qwon6T$hL@Fgf7N~8y_oyHs+l^-RH{j_MZ4V zW9>be=cTng!rHN58%9dYn5&S`0(y=?(LJYvrsq`9^o#|~mng6&dsBNJGA*FzM?ygT zo?q&vU0+3xldfyUuIB}_Nv&6M6*M&V(kQN1+CYMB^u37D?=$*ongi%n1!E2*(x)Gk z>GgUY)9dv*6!mI}q4w%#40Ql^T_pZq9k9Dzxco4?L+icRb>$9Fdj;@G!6+E(H3Ob{ zt%RpuvxENk&p>dmO{5!E`Cs_?KzYJppS~s>KN%c{PILPWHowq|X@rCGJ(yd|;L|SC z-c3kvdnRod?%fK8d$)4!xAzcHi3WQwMsU3+2%7}A>L7O3dzI4v(WZNcj--63;TW6l zeF2CUA}qJ}1!L2F(g&?R=_B6sNpIV9?=Qu0@158w6#2Iv`#;z;h72zMwxSc>gfD>m zx7D`K{&^^IFx%%M{s}T+OfimMS3Sx{>Bug=YR(i8mDe}$QzzpqZ z>0?I6eQLuj6#2J(?J@fR61M@jg;{X;v^sFURhJf5(po}rHexrcs_-$v6 zxZfyaWc?QMW?_Wf`z^HP-mjgEtY33v2}S-LRXn*rfW(!13xo|W|Bl4eK4WHp_wQKm zH=nsa)XW|b`gosY*zW)`>~|U&_B-szupiUR{rMnTGQ94|uzxaS*gu);QTxB3#!LLr zKR-8*^r%A7zXpo!-wZtcn}Mf)9S2YUmORWc?z8_GL4&9M@p>7BnJk!x?)xt$?UeiM zzgB@-|1T9D^#4|+qmsrEsP+GeggY9jjm?4ST#}Q)z`|shK&}5Ra=k!pKt`UD88h_B zzx&J@;{XQp1FLD@!GIiiya9z>uR6fQpaWh4?SSWl{$07lJ>Gyaj>m)40hNGI)IO)% z8c+*i4X9-X=y^mOp&ODbi0n*m5_S8n5c2OLzXgKmg5;1|8YD2%8jZbB>@ z+-()S9oGfr4veDIQGg-)fjK1mfwZ(;xpm6vz*npST+2r#jYkgymD4C_4f+P`fg~>I zVPGdG!{}jPPjWpy3>?GL19})ZNj0R0fz!~#z(uYe1}+f)1Luf@8A1OCYs2+0knbDm zc`_*q9=Hn#+Z{a&{1jdWe(LIB;28ttgn;}Q0R%k^JV#F0|Fd~|7zE-$irhnb7?cUP zgEB?xVUPwYgBYlwhe5?6^f0KVuo*oJYN%2T-ClnXQ_CM{r6Z(=X|^5)jZwidMh}A+ zw*IGst%pI&q=!Lx+7H%B4}(6G9tM3Ll@yB}2LC`h7PN-nkshYndKi4q$uN2tk|taa zLvpL&EHCh9EzN5cLyD=MHZu+Ri1c66ohy#VriYjvR73Vc%aE^w{truf3Q=+7Ipi0L zvuD%%1&}pFgPS3@(dm%Cr%$%bmfN9usnR7+OY=!%zwiZA4wZcd=J1hH8C$ zC~IY0j0}f%VeMsT8*1;5c@J3EdFp1%(9B^RTx~uC9NIHz4Qp-=E*MHA{^5SR@(5Kn z&(6H=&=FyE53IVSQP0p=NF5sQ4#9>ll;sT7v3WxozJOfFK{19^}IwcjYv!vUP6 z!|KYd4tpE7H%vm93Fcw&I{d5}&anCHzZtd~CWkHN<^DgoS!e8P)gEbMmDztYY$N5% zI1{DAb`_@3F4IgPXxLHVqkkNBLn*RMFSuC6>Vl@5J>++ zE+fBw#BmlQ*$Nhu)+{`Yq<{M~Lp}=sZNweJ{JJCVm=^#R!`%9({|nS3dW6RqraeB^ zX3Ch-Q0g=;XBmFI2#%>o;y>Hj^P&j~Oh1PIY`0?CLV8SJx7&^}v+^!U6UIpDqX&~l;1awA+R<^sHhP=@jf{{A+8F)r^ISHglF@cc7Xb-D z|L0eP&R(=`Y8FpNZcvdDfFdd>;oysc;a{iE)nf#xypy6hM!u<<*)v7PCA_R(opk-@VqD z-ts-34l%*#glTfiW5!4~V^9Sckmp$D9lqSIe=W4eero*i62wZbHTJ)b%*Gy;%*O6P zW@GnwGK>4kmh?D30BU-6n$TK?G%hDepNyIbY<(Izj>Tf((aTCA*4w`{t`P){YvZ=* zajk@HoW6`6*DUD&s*FGM!6rnG<69|r2h%v3?YPC}o7!~f{e^ZteL_jkCPLepw75V1 zSyR#g8LzR$_!rGyByf+f#H-_Jb;{cKcDjtWcO&W5Li-g+$1e{-_Vy#u#>Q{LCy)P( z;qCa(u+Z@|q%WJJ%<(j&3FoyTbNm67_*o@>#&pNiAAYGd-0{B#t=RHTYZ-r2IBvS@ zxUm^k$Q~8ITx>4IB4b|+kzfZpK##2o^w=gqk8Oe*k7cOwWdP{0(cm{n%fxn6iT)~~ zp>k|jO7vBU5tMk!!5t@!rZ;}n+-y5nAg?zoqz z7>9?(Q03U-2*u(iI+Vwih4Q$vuBzf1n_@1haqSGLG54!VF?-xJAy_N~i|GR5X29ee zfnO7}CgyX&%f#chdf*SKkk@@F8018Q=?{RngP4hB#P`IP0WtAq&lOB8<@fndki|m9 zmo-mv)0dm(7~@2CczoF&tC+}Y%$NM9oi%YIH!)b!#Q$;=fXs}CNGez`BXwMQo2M<;wF-yHv}-H78~fV}t@0t*Po1&ydyjTi#stAU}W@)~i2H;Pm^ zSQO7rluF|1sV5zA{tqU8xY&;GC%FAQw&V8MY{$PRsIVQso*S_pPnc@hjz7YU*pB~| z8?ikpiW{*#>1l4n_9W&D4cn8d{{OPwMr==d(`I{8Ysj0_I%Q}Z}Jdcj-i!L=0iJHDXIwX5E9$)1aGG5 z8pl0ZhultH;QTe6HF>k%*SMY{b}8{bAr0QcZaLMntM$A*viF7{rbLSxc$mVpmI3|{1C=}YSnXm;tU|RZ0Tqo(ipN-|%_l7l zS~K)rNPyXL8SAw5PDaX_k|4(rB^a4bm$l~_ z;+Rf^y*E3OrEg?2j_V)gx!4sfaH~V$HVfS5z!F@cV0@`J2zfez&0b9~O#hLaj5aXa z{TYA)Hc3Om={ovn`d!xur{9+9rr!{(D}ohngb8U)`!YKK6PSxgte+gl6LOPEVBKE{ zvRZHg1Kd5=u*!s*f|gJfXbCv!Flb;-XoTz%nwb*K;Ub}V_>SO&VZhJqbZH6W^nRSX zBRGMtPR4QUA5Jy_|GTf6ZvNDb&F4dR1SjSdrbKNbOw8dKWqe<(nd*t9o$99PMkjPq z7m?TuZ6lbYy(SJfqB1*r6Q=^Es5t~Pkq*Q$ zghXu(O57G$istAx68E5|x@azufvC}3;^{|fZnD$R61BfM@s|7f#0^OD{*%`k~}>Oz&(Zo!I`;S8=U!^0bYV#k9_u=4^?XI$L69-H6I^GBeo(;BYrnyCP?H z3aqfXn@N9rA9p+4U3fDS3_mSEv?h-K}+p^=p z=!EvNikaWYDrW8%x~QbdSj8;3pY1;bRXOg1G9)24xWO6St#=0@7TyJb}cwI zVo$nYAF>hU8e5q{AQgc0+0{sOg4TPbpdqk|3#88mv&k?kE3^BO>ybWNAL_;37Lf2B zXExsCy;34}c9Ko(?0FD7d!9?|Y{ptY@ZZVS?8DsX?{H@0$$!vaJG{r-6~rpCc{H(8 zAojhLB>K%Yb4Bb*o7ndbI2kEYq~P_*aAM!PDq_Dk#0D+q$*H#5eR`QEeX&0^Z8#%y zz_Vs6Q zl}~r6Gye(F)6`*w)W$Pk+ok507M}Tqs575=5%6R-cnAOo>BSDcSfLkjT56lmOy{B4 zspAB3L3$KsPoVp%@|YDlEO-V>cs7luSr!mN|JYAs%>@OhR8F2~!C2iHRV>hM^#zjx zrEO2WV6omH)dlR}S#<&-t=b#s^)FtQk=u5st6I1L;ug-Q;@VL|WIZ|pZ00UG*M-67 zxttYm3-{n47k+DQ{|7Y-#X>pHyN1r3Gh{7F0}TtWc?jeFj7h>*s`jGi0JJE(xy=Tk zMVTT1g%8H8)|S1*wtB2AanVabYjJXCfV!v{j4vu?2K55i(g18BfK4L+mL#XQl24oN z!&lZO6qI<7k-d>`QSV2*9G6xwXl#q`?*f{2*TC92I#m~Aiz~Yzn255^3l?*h8PA>w$UKZD<;VteNK;jo~!{Bf%icjNFyi^s_qEuJj6Xv6rT#q$yD;+fkv*ub&0{y8p)>F_ULSlR~Mk2x5YY6fO$KNrK&4}@XqIxsAq`v3;Eg>$}IXbZlx zcw0fMKFe}ST=}>uWE}9aItX}KN5rtKW5@w7tAhhJmbOfLW0#F`5ik2fh?i{#@v`Oj zBVP8CL0sv6)=X%<{Ar5Y*1P<9U@m_?-~@%s8SdWa%X`V|EU%S|OINIDx!LElyd_wd z*E3jMw~CyW_X}F9O2~?qkHCtSkB}8DXZ#-@;& z%*i>LUA`}9t?1&gzx{~$B9GW#@eG8lNE1N_uvffh?C625E}&Y0=ULfVcC;b} z9k0M~8y&BhPJTHD*NUa!TCvo_Wma`poDi<>?#H!~@jp7=_n@es0wO^x%%J3z&5e>* z_J{wKQ=oC>l#r5F_IH)Maut|Yu5vN2H11^ONieTu^cB{N0bvzw1k4&yMzj{ADRs|Pz@)2udBuGZoHtCPGaEPjz?R{K_e1Rl9qp`JyO+`9pef6qiUDv$*m@e4pn%7MTpy}K-tyL#{^T{vT!s7^xyB zxf##Rlc>QNn1_uzOi#C#PJA5`4>q)whR6ki8T!ws_;F}dFt-Y(tx-nhiS7);+HXv) z&r~b)0djnrWWHnt0Pg#POHR{9?8#$3hHI;#+qzc-bsg>GbW~K*R1~qU4yjSl+LRah z1~za(5$kYjCc_Nf)@j5;$f^+!?;?)!Shw?`YFYQ007Rjdb$dt$Jhce>4?+K#Df;KY zb(grCYs9d=2p4gQ+c#hLuKzY@Z9J5$ z61fL!=%RVM^~b2P+Kms^|7r!T4Sp(aV8O)o?CXDJtYWy@@HFIZc-nOd8_EjxhEky3 zKp+!|dP5cC5*~;HDpRo!QI0BciP!G1_%*p$VBJHB&=m8hg?G=@z9QbN$$Vzzhb zBoZ3KrtMCK+1|D3BXS+D6t>2{=?fJ~S)bzHQ^4*#G_czAD~VGY;-54|c`aydR>!kB z6;j)r#Z}d2bDY!W$Dw;OfgqdB`nhqsf+u!V{G= z9iw=kul(O<1!LE66dQQSHj4LGIvHlt<^A``_0}uiH>($iTWfBRsz2-9LH9{BWD}Vx ziJU#!noi)%7Ll!aj8Wk5wq^_ZFX+E~w-z%7um@=5SzBLq#>`vIJpR@S@Vd2v$E(>O zqUv?kj&N%E>;5hN9??)AGEfmC1qg> zVq*x>Htnw6md$Lypy6$MCFsBS7RIyf4PA!W+b{HDhF*Ym+nfii#XSsW+Xm@z+j5m! z?(sIUg#DH1wr?PEBMRMioSTnO=r-)@!Z)zJ9aneZ2w1jf6&4WKi&g3fO=oCN1V$%x zQS;nhgjCX(!fw&FK(?0x>Go2AP1p?4+x9xZSt7`92y%#G8&Fb$+Vgh4ytK9tbKCQF z^HJ{h0cXkV74%=~7T%t>shRFR~A`i`23O+B|c>NW>-a1P3E|(R7lqU zwL7?7%rITp2(n#-*cM0wU*CN5CxE4=0iA`>iVad&qJP^3tCpXZG1EP-$P zd4GS*?#!KgkKc38J@?Mc&oG9II79Z~zP<@xmw3Fa(EM@T-Q+%-+&AWF8{yyIYJ%q` z1o*}h6voB^sK2p*DU9d=zy&|B5wrOF(U5^|cpsAgjcrKAM#$;@bRSn7_}_?uaN`iw zo;-{E|D^H1F;p**Xm?|bmH&;*wCnt%DgC_W@vJHHjXMb-AQ%|8vE%3ch#ZQ}xTPsh zH)xsWEepV>JJY;{4+Cyl2?5&u>psBgXR3e7IjC*Rw`en+Y^ye&i4mxNU|aPw63uD> z-a$`Qi@B4$<^~b7D1@EeNHizq25m|HXn4_*Xue7(o>VFjKkX=vq+0O1Nj2oO3aCk< zfTx>Y{H;WD(qzz()XPK|`OHi-CpifyMgT<+&@2x?R!3kD@klf$xm5es#`;VmX$=@p zT4T&4l4Smu#J4;rA#}D-Ruv@|c-a0W(VTSQe<5`y@3n6>FnD^;P^)$%(qPiu5D9IT+$=A{Rmv!)}+FP z&11-#S>9f%i93i7gl|VGF{NusoMe_P+ICD$brEi_2^`yN8s2$32zg6{l11CjmpX5c zg$TFHI`j5fpkn(Np~CPBAb&f0`Hoo>;r1`U*7mP;wzh9Tc?+Gb?K_Ebr@_{av=rg? zmjrm*10Y1Wqu_h9Xgk{BHq!C;@rT_@Dbe6>$8c`e+!380Kg*5qW5-e=*bxWw+OdG_ znSGoHu$O){pM3}QJJzZ8owL1zakd%99!%-7)3NX=k{!nd$YBE6=K(|;yLMaxQ#&ph zOzl*p`ai7x+@m^h?sN!KOW)Nsb{1i6=^8uB0OZax#)h$-82_HEmW`D%0*cEUqz|1t zyA$8ec5Knk9EhTGqF134??ixVZQ3(-v$1Vpr%VZVa&>QKjJqMXeSkb$&)DJ2FecZ8 z`jZ_HYqB|^O_m95awf2tj0vr$Sd)u_JR`%H+%O~RG`xYII#3i{e{vJHct?IQnai-r z9b`;N?uAMlwESZ7Sh|N~Wa1uRppVBupL_}j{NS!{L8|j-{2k6| zlV7nCJKrt^eC_f9U%Rpx=CUgjMY$^-(Cva(dp5{wF1ygBVJ_KeF1w20h}6CJuBy_C zD%(}YEysZf%rVS9rMa@h4F4kR%4+@&0T)#R{iyIvr2*tPeaa@d81h&^|Gg3a7 za381G`>wx)pA-^@Uio~aDFwbTXm>1shCpt+yNTQ`;S6#4b1nhw9-zy}&igaX`xA`& z(Q-e)W`|kq{*icge@y^zYR?y#!)0-l{Nnu0Y9oKMD#+cviGj=RKXIHyCryj-OJ16} z`*dRzU4m|Q!<+1xBI%IbcS*kVs6BN_(O*V7WKS02-je}5?m@I*;SsK6PkA#PvPU}C zp3bb-)}vlIl=O6WV|T*qHg0^V`v2Wn!^=mqwd;oHkw|#$8H!fu#%96`gzeE@#RzA! zXTA^?NrbaK5JJ3rZ-I0q!|V1Ke|k zXnb4=FsQwya8yw3`|s1BifRV67ebW+iJZB+2ygE)@cjF~&@pJaWF@x9N;_+HK~_TD!c zk9+|EqvpPxtf>i^v!&4t1oo8=#7}Fs+ZO~m@2e}PH4(q=tE~FJbiX6Od^MpBHoC8$ zRQrG}#1!^*W($~trG?dQ_YLgnX|@pFK8)=9yDMO8AELf}pTKUlZJUJpogny{P!Swk zpteNGZ<)U+~#hl{X;YY_KyMq`$su9Xj`-PFD3!Ny8m-xC9+=( zWP6DWINW=kEI3?C;klN=&<^Cq0garMv>TThyikA}QXpx!1I=hmvK1FfJHR=uIdMHO ziuVk&J1~z|sWxpLKtytOnuBI{;14l7P<&vm>i@a}%v_JAgsuz*Q#D zKs3kx11VI`fxBSw0Hpr9n&}H+QwN@bgM;Z<;~;ncA3#$2^$KlYx7&&e;ciCIa4@^j zfO-crx$A+FgMqr!gy;{#^&LDf8Q_EEiI3H*yQ>51!A63xz5KT3{bug_JvsI!{$Yy& z%(chYs8r{{o;dKzBk@NE2SJku2g#RZ!PLP;L_#9Iuud3g(GUP)mBDj5iRZxOdn(8W ziHQb*^FhR~NcbPTM~X1`9sG;A>_bS}y{;zc4|Rhi4y9eT7=t6wA1cW^C2`VP%OA3A zFv~#YA-=j*pXuuE)yN+nnnmspF|%{X{W-tLS4b1V;19vIylxC-9};E5@(*o93Dc2Y zR4jSpf6v%4RQjOxZYY76f-Vf)JMj;z|9T zp@+F!;IOt^07^dsnOfi-!GaIw0NgOFOH7*sfW0G7|B->1>Spo;`Z}_TJd3`Le1};6$mgoVHrm+~I%6Bv-3BBb+3UusYe~MQdIaWh{9Aru z`^Y_r{X+~^yG#wfip&XBvM*liGlRv>|eYB?0`Y5`FK{i`A zk=BSRSZlCZ3o)d%);Ot^MXQxy)^d8*`c!Jkq~Pe+s{L4Pz2hAH70e#}Rib=I;VA6F z0A3ZB&v^XXto*3QTNf-dW!e6945^}H1w3Zu#|mh(@?%+PkjH$X3}ABDPZ{rAu)xsY zxe!t22EnKfC7=Gz1xp>bs>~e;#~MQ1dG%2CSTLA87A#D{_>YaHA%MMOQ9S;Qy<<^U z7hyp==Llh}=i$lTdY!$mg}qf^511UvZ~w;LdQ^J#@9eQl9Xm=zi7_9$C1@^^$BXV) z8h6!v(QzcA#1$UL7rMk4&Azl6VQu27WjW+6X?)Y!@p{(&biBUNpN_Y7TLt>l@gdTm zjwAfl`_u8c;PLo$)#0TY{pq;N-3F8$x9r|B`x83D@tJ8 zf;U|hI>hnA90s&Ch~wu~`^j8fgE$V)d>n6>)Yl+x;p#P80@?|AjlzilKs%Af0~#=& z$cg@YA}{fs$Oj5f0poPhnDIHz}#6Rml_wXp_qVz&9r$cc|thxcSKe_|s~#1+4L z4dTRo!E}v~u9?AIbVdYsXnxXLZ;ru<9()`}xRV7{`T2GdNs7`9$0?eJP zPJkyXgSnGfTJRLr$z~!dS%WwUPkCk-MRhV1N4U+h-Q?sV0WzOJ=6L{VfRYuB_(Rl^ zWjgs4Dg9J+r1{i*wJyp09`K9Nvz^=sr*^74e=74Q4Sr6ZCe=Gc!ECOwIh1*l8@#z| zf!^(8ih2KzasQRY`<=>T+&`6FzkjN@#qXVJVcu_S-0!TLJK>)iW!@iV+@C7<#Uq}Y zrP@zF_0~d((|p$Kw6}y3Aoz3GCaMf0z(N7K&RVK!i3qGFq!8$ zJ(y?E=IM{9h|}Yth|?oI6al%Oo+mdKvS~CMm|+;ie|i;;+Y(!yUS}YHC(#k?F%X;) z7$=C}kOzVw0(lJ`=H;%8GXeTE>`Vp7;Yd*Ed^?;pf3eYolEE6ARhjUTqEMkw>)qGsb81;wYn5WvWWJDzI zjKq%@3fAZaGVeUg^ai(xEqns9&L-o^oDQ5lg{#PGjOnZ^H)rn<0Nuh_exUeV9vJvJ z?Td^sq_c0x-`STW<%#O>Z({YJ=j1Dm5uK#doin%AovXk$=gOeXxnil>$kw_@`TEp3 zAid^Vh_;b)pkL|46l8K(3ucyfTTnKqqs-+c`iRq%Y*=9WZkNdo1yx zXv<<){9qwsGGSeSOfL4O<}Y-^EdD~@i}>k@rq$VWymYFE)_J;oQSZWRv`V87Wfv9@ z@d6_hy6}^M7$QbyKgP|yk!=^DU6hTX7c-#o#SCucP1MN0SW$;^u~BOBd&Vx;J<7#V zl-Wg2)h-Tl1KFcZ|1Ubp2sC?f1x_A7uopKG>}8zn!%0V|7Vp@GYC$7(j=oLrBOZwV zYmfJgokS^Ja;WypFDRu;nIWZ1c_5`r7&b&om&(0IN|)-QR*WvCOU*#zrDledF7+lM zknyEqBBhA8r9@nOeD~6)@K~2V1<99OB$?EF3u@Nsa4*yLF4r@n?aLvoq?tURU!G3r zb3)&SuJ01MyoKVsyq+N34@O4s!|V_oUOr6@A+^gFNi0aXe1p&d%*zy(%nm=Iv$|rV zv%2ETx<0Pua8_5c;mD)fuQS`_!H+Lk6x40RvZtxb=Ss9)LCHvnI&ZJ-}pofGcZo;I%8xjr4+2 z4MQ6MV%h9U63@guuk0qw-Ofz_g`wffdDW4=iw4L5D7|Q{!2CzGU-hy^L02VCycz&1 zuBIVSvok}nSF^*(UagcLKicjtnCMmX*Ywz*ZNFNYQA9)^ai~{o8P4fyRpWkBx!;d= zd9{sdzt)d&*i}SiS21^uC<3!RB+vF-9Zs-_2GXxJ2Qwn)H(jnq8eZqB1OiuQv+fMm zH3=mxF7Ws?^0nYvg=@Gz#Ku>@R2>=0h?uVafIg&MGizHM7e9wGFo($bu73$GWJCfpHmJ-53r90p|c%jF1^VFj4nZ-J!7Y^ zOJ5(#{&9UYiSlvrk;oe(ag0~(DV5o!f7iP74eX|q0(pnQjg=@h(~&p0yF~BcXu5;< zPO;~Ky&LCvrKKZr^*64xe6KY&x#=MA^juN7DSEt_5A58`p*k|{FoRZRpl`~{VQzBv zaF&FzO|>^oGZOjzHE2Xi5mF!_$~Y;vmz$fHxHMk@mB^2`IduQlE1%IlPxQI zv?PY6f}xZAwuN=vYRP6=2>h-T>8(Dfb4DL~ZVfGmtD#1U^j0jv!)@Ghzp)%W!7{J; z&nePdaK^WL$h!5d6jCJ4<~D4SRz)B50eA^%PX;uR|I^Z?*HJ&f0L+=<~Z zJntc-aAyrG!NJ{G2Z&ra^BAJVQ7oga-`S7jh|ODnOC*~LUz7*l^I>ATNlZ6o%LD4% zO~*TcDkG^tlPwQ-b3tr(OB#d8-QqN)yM@^zA6r@=y?756Vd?k27lBE}<=zf}@s=t1 z{XwiK_HchBXt_VqxmK|$H*mH9Byid7K4Dz~EBbJyIdzxuxxo9}TylS>F%Q3gm;izB z{uS8M7xUcvW2_rJVIL3DnwTGC1&9Y(jd}QkdOC;)y)=`gq#jI$SRRabTe#_vH6fEK zgxtpGoQ$`1JXk4>V~HTv-G`F3nErtZOur%)eL$+&nI2rn$t4W<5B|Xkqx_UiIH9$2 z9=D1QK1Qz;naid`kfzzF_A_Vj zYmX)VWP@T-7V|ocAv~n|d#pz$8IMDtgU8(fXL^kP zdnzsovk~At9vXg1gY+Um&Yi>v{qYQu%NPXTKiT%kDjSWkC@-Zd)WEJ>$lECJsrNQky z`Kl0pHj(&EQtdZb!;^1SN50ZlxAR1$+nIGUmD_oOO;Jx9%4@QpAW4v~w77;R^u2g` z0whXs2Gmbs0$d%|j^Wc48^8Kdo)JfTyyC|Fk&)HFvv! zT8d3!V+0KON(1*(_}90@6E}kX;OR7)`&0PUe5HL{t)aMQVL0Zh_UGrJ4`-6gTT|UL zJd-L#;_aWUcB>A`T8pHz9X;~d=d8p9+h^ZUde7E_(`VnSj{IR}Fb<^8w%beMcP~?Y z&yGRX&#p@C3#@&LwXL##c7w8>?UPE@&z=I?F7AnWo)$-DTbj^E95bc+J=Sw~zz?)jhg zQusaQ<7xv@{f!md7rAk4q^R)Wc>6FEJ`Yj8{xb5782pPW`du;j7q#6|LpeuG!{B>r z0({Yn^%)br=wApwgDIC6jPqU~LNBl*275o(9$zwxs(UfdFoG9Lp#B$2oZCQw^v@SR zqVlh%>vsjCQwD?J7fCpFs`l3o5{&BjL$`bZk0V8*+ZT7-RN4%>kXU`~@PVjb{G-}m z`djiA{lcj*{RzHBH9 zrY|9vm;F5y{E||6IgpU73Vs{JlIJL29VZFL-Fs%`o5eBLK#6Z${#n zY&C#4;pFX2807M1s_F;~vKqjf80h0oBJ}Y_BKkMWLHiqsCUBb70N#8;19*o+ee(+t z50)38z1hT8qMbK~A;>p-aNQ;*E#!X@mEceV@uZ_-%WxS#m}CX=**;A6806BkYFVKr zbH%$VwpLeAtv*4zy(74@@eyFImsWwWc=C|G=TDioFEH?3|AuFBI(43+N>j+X<9PhJm=R;KChN>yB2j z-DV58C&iXx55#$dV(Nv;u4$SG+pl-Pd%XiWicXMY9{- zi$;`CgQ2+eHeTZE8sO4vB7#@Ni>9r3$y3vc*K`7!?&R)y0*ZSZkn2dhEkljv-x1Qvk;yD8$|hFpNkOXlZ`}09A<5wd^koacxRj9Ln&PF164k?b*g+Cu?fZC(~)No zgUsG5Aa|Fh&c;1A=i8Zd}nYt~4=zXJGu*#F%VgJSiBD z662q#Fy1D{$0m>W4UBIDBh$=^uP=`7g3&jNfzh|9j?uTQfzh|Fj?p)m7=2p;qc8Tf zSh@pv^bG+<-=PLZ-vK&C-wC4XRf2Jvs`&Nt!t;rWZv^figiw8v^c7Y6Vz#Xb)%P0% zAtx7#@9#wTQ!0de0#S^IpcUUg4R!k>EQY$NVBZ@iDOjNu1^YgBE7-fR9_`gvVhp)|>5l;LvdsSSe zNEd$--lZJQ^4U7@+M91gR2-GT3hFybH^kR2Ze7C#d&rORo8&oG#nIP# z|I~HdAC3D-@f-B}^DXzII^Mv2dV+)TTlD)Bl?neYFVOR$Gh6&lYzH@Qaqx0np>kxb zay;g}J0Po!zis|JZJ-Ir$oqy@<`5Ns$VN>EU{{rN<$$WxbU;ODI-syM4PrZfkOFd$EZrW>3l<$lCC?;5QL>0h?7{XBq`~laKvGtoJtvSh)#z! zjiQfX$mu?Yp{CmmLr%9IP}8jk+H{`_84^6DOM(ri(`=Zxw#qFD31G?TG)opsOb1iQ z6pOj3lJ1GBq=)@E_i#MZVxsi^u(b64&b`na;H1y3I?C4dcZV0Kn9vZ@RV95{5R|?Z z2uj}w1f_4p+L*YO{RT5Q(2{Nkxt6Aa6ay1^6bQ>2nUnybGO!bm7Hp;V4>K!%1m z+JXIjB5g6>3?C3d1_oRiI+$}SNiG3?h6x(Z_oSD!03}1LfWZ5Tl?>4)27&ZwuVlvHse7EvML=a{j3O1PIc(0h zn#ajpmiMh5XW3`saWdBg&kPt7JxMuUL7@9AC*iAH5>;S70FXqP5R8m1kZK+K#2Q6-VL6bC$_yk@*|*?t1s# zO>;kG56HYjRkBp&@RfPL5P6pLo|e<&M0<#6O~W_yS8RG4P0Py=oB1yQ-UQbm$bzwvdKiXlAI*lW39QF9ydPM}S^_n*<^%;8O>ENdvet${XRYl#2=#&4 ztX)V|)()UKYa0({-73ZA3e{*mfUO5OxrK0N8F-gtlgeI~fP_q~$3CRW{s(2tB5q`_qCmV-?Z2KVhZ2P2LGFZ$;uV3ES z0stLkJB40{%#WuIz+yJIhJ1KI10lnCz&r)W3j%pUAXcN!o-R;TvX_MrvS%{PHak0< zX4KgO=O>C$XRl!1t>wPkAYwd)njQTp_hrGDeVK_d`?pY1c0M4XWd8!lvw!TNBo8XK zf{Gm2TCU`X=g(;VwBS!+{A7R4pA)dI><1wJ>{v&G@ypPd{W>YXVbTVNW>EgTzSPK( z7BzCDGiv0>Vb;izf7VQ`3U+=eIVzh~5TENnax@NIu2sR)UrLVdW|jW#D#M(IwJI}N zCDg2fbua_UBIj(a%4e+dxmg91F{8?_&a7IMy{xj&ta994ZN15a zoKra3hEIcy>%*4u6poVfOOVrETk%wKV&@`$%=Y_@_9xkXUeCAN!`O53iC86<4{RkD z9|~1+*@*e2hpj}nr;AElM}l)@2Ery@94T@IvM-@}F02}B&M#Lzo)K7E0oLjwP7z{S zx*U+^;^Zoq_QU||j*z-|;91Ef^DNVWfcIS3vWb4ioxV!0DB!NH3oF-W(rN`*&b7h} z24Zq!WFR0chZief1og8j7#(umb{=8%+7ClTo|3m50a*QKLS-V$+XOUK(@iTc_J1mQcZ+y|G_Oocpq{+1@D+f} z5rY}GDc-tuF3AEr#oDmGAZ%lN;#ws^LOw*jVj%fSlh1s`0W4o34+D`2XudCCBKg)E zfo{H^rS|ubNwlbk`E7OD*2v!)T1-c?`QV*{Mk??KW1K@&OCpyKooD`&no^*=TA@m)Q0}^SB3}8 zg8bQgM1J6O!$)Nl^@+nLTGf7klj&B5l)G47im!EZ{_2=ne@_uZv%nR53l^Dc4? zx}VFxA)|J4k9iYuy>aslTq#7D|FWtSx`OpQCI4;G{SWE>hji0y5m%s20bf-qn1}XS z0N*%K3KSJZp-urtKYHK`)fA|x&*RyqI*tgv_ZDabdn(XKTos%3@N70(99I0>4vSD0 z0CN@t%5p+kE?YbZg+0K6{PufR;KPR)fZtPr&l7>Sf`Q<_Uv8mWWUps9c0w_4{Jt+PY4Rjs_<4MGqB;w1f_`wKY>=P341JvX& zi1>p<{9zJthLyAj%1Ok7{}T}{fhe=)Itt|io&_y964LH5!X$))(kt|G8V@zgGvr< zfh$ZZH?oqc)4+rOCn}-Szz3R61D_JlQ)9+knE6A_cnf3FA~W8?6>&o47RE>}Gv2}@ zF;OkN2z{dPN)&O%TX-E#;2d}g<>{&~d_q$_^j-KNMN#-3^j-LdhrVHHU6im_!(x*?4D@2JlZ6O7O7D41`EM?$| zYZdy^1+Lg$U)R9ZOHr zbYAfhkv6n&UM#@{*G>5Zn^Kf(VUZ8GyMb4`*z5q!$|mEitlTO^&yllCTH2)OT}r;_ z6{xxB6*Gc~y6JE8hp3BU3LEry0K>jw0XXH_X0ZY|8Hq@@SQVT^!5E6Qz)1pZpjc0w ze2y+(Y%ETGh6xm#jgzexaRS#A6oM{`Ey+wqSi0@o=U}X7Tp)dHan3l3|A4+y{44Z_ z;$HzraRU0B^V#B?fvNb<#DwlqJXuvr%;Tt29Pa>8ir-E58kQBru+r0@nPQ*xna zv(IG!r!gp+pVlNsCtWg`lw2Yur%1`EOZeG~<|DaOUGfpj9>MlXUPW0HnRuxxrCREE zOL+lrDK7(WsoZR6H#AkM9P!S{oCV8~}ThP9Q#!Vr^* zo_KMibWQ~8#Uontv>iZfj|hg~mSh3w((sLl$i1D%s4i>}P)cI}2lXPR(la58(lce( z1#p%ATBDYyzp0MKN(Q?9(x9MzHY~B2`!D!-r#?O>vagq6Mym`H+hv&8F4G8oy$n6f z=hS?eZY=AD4qql1W$f@}`l?FVbu`~HL)kQ()uyxBbeM0M5vV5STgG@Rhf*ejWoCyj z^QpVTm-z<3zGQa3%tjnZ)}`?>lIbb43v86x1_;oaISD296X+vlE*gEL3^;AlG81K8 z=04=5r`O9o27*N0qm+3Ak(GI4*lF3qfa>-rWgCk}NfqF7DWxpZR^n00F2-U9$SwOj zj_uIRafp*&Fi^_w&=Jzlf(NNiAKv(vd^MvNq%OcZ6CcsZQyLJk>mP?1zpD*Dg zKTbwo#t9wWG<3Fd7;uB4Ak=d7?_1e!98O?RJe>*6`eIj+@dap@$UEJ;xP3n7hWXx? z`1XKO?o$Y^+^@zouG}xQ_;NoGrfx%~m?6w^J4BfL&Vo{Izp7O5_adL=j)4;063d+h zpXJWVhRO*zlk`P7u8ftt_f{8T*$d4&-JRHc;+TNTJKO>+pBaG5XEp>_o@S{DuzW-9 z6ap-dIhqKtJfeINVEHLHp#aO%0aAeFzrYCvSYE}6CcyH4{(lKjX#5+t_ID;xa(M=| z<+TD^LnI*n!sRpFzucyAtbIX0Q31SFC}8uBDlMHEa;hM+?Fz-wz5-_399u7I$p7LKRl+DrIZ0qREb_D`x($yXnlD&l2pO2sWkkFSW_VdGvIDa4A` zWmHP6vsSG4b1u$StQN)W_U=})j(=?vJclmenEr3jl3$!4W9Hf|-U>f9AImsSLG){*IT0(h^&k?{i*>v+A108Nvik)c@7t6+PI^xP`QBcRW5mRdz(=PLM$ol@m2 zZikru3RG8lW}33&o&L}Wd(ku56M6KED@=)3Mf6#%h|Wya!epi@9#zGUo0$;-wg6zM zirz@sfSsz1aZ0~k^#h#H?Nmi#NcgJCfsX-tRm{kQud2V`gnU&6JHl7hOD12{(hy}e zE`(R*SmD7}wTvcT0aV6+<}G#=)1TE!u?ttjtdV}k$MrepU)6$eG*Oj0yE$JuiXSf& zbkhs`{QPh=fVXy0NF;3UZcVF>{HmfJ2qg4NaDyzqf|}#!n;!y|l&-9FJv0tASt(=!KOU47O?< zbDqQy3_;eoiCa~GPY9wEU0<+|*La~SHOEN^Q&UkLZCm(*=bFab9F>}g#@ZA!Cz&+^ z8LCD$lx;A0!#1%2cun;FHdVBVe9cyrf6a!#UbCU;C!!-j2DDT2L%BN`0;<_pn!D}8 zAg*T|9(v4%3X`RRa8omk@WPz^@PZz;)oqKoDF<3e%`HMc$FiEIv7>5mp9o@*g^ zYg3GKk6KQ_yMPcExZf`TebxHHh>B`qI%m;Wt)E0+O{nQwh|p`j*1dVHBtl6tM#Net zRY$wSGBK-lizDK^)Zd~ER+ZZDfVH#Oyk}wZCZAzYY8M8bwF|?^)J898{R*7a<^-yC z5V)<4__Y0bgybN;c0E46;5*)*H2kkPy!#H(m}*JBu}r8ext=p40^2_{)y;Xo3w%ultTm(_8A z`Z|Fqtdm2dUJRp7Q8cJi)S4YNyDqz}-gWU_2X4-*(~h;Oo+7JV&xZMr9C@Q-3>VSVRxnORxLAK_cW>6jojInk@uaQ6dUD%C-VV> z96WH_qCQ%F&nJ77dRcJff%Ac@TK1(K)YQvoJc&@R7F(A@QBQiHdgE~5xfX4Yy@s{k z>`N$|syaHCG;r2itmCYg@D7|{yxu3o@{`d8>&Z}E?_2cUdYBG&?qpS8y(HmTcI4ID z2?MChCkK^!=qQ~#L16VBQGN9oUDU(KVri_Yuii^AU+<-;4|Rg_unq(jRQ&&>KFB?& z5!bEp$QuCqxW0sC2O&ZW>a8k`nSyrm85LM|&_un!-`^is+~lu6qkt<`Gy<-mPjO*p zzk@d5O50cp{(=|-n(adlY4V0D>i0ve zRDUdGSpP$4vi=~|(d9Gqi7a&9`V&+~S06uU5(DO z#2pgMI)Z_i>;FziIJc|Y5OhZfbE*$VQvbF!u~h%55b_9yTmLQ~xJ*kRsrWLZ(!j?U zU>ev#*C&!NZjjY&BMow)(oS!HZ%`aZCCuv=;_fQ?p#~TR*hI681}%uJ0UvT{;Qq>8 zlnwC#>mtp`x*FebXtAede^rCwq)S492IJXueB=nd1*S;W7R2g0X&_rB$QH51BDb$y zfL=;u5LY+FVFTX{FqiM*a*Kd3pA(i8ogV8fmZP0@_9yJcQb)w4PpN z!lF^D%lK)43O~x_=qtEHo~Vl|mvQJDjppIS~h7+N(Qqy;%m`FLy75ze!k^)-zYNa2Ju(*u&hmk3lg zp*4lMH9e&-b2Q~EBb26iWdwfQqJh{r&fr@>S1FCA$&^M@bnIT2eOzBd8qM0`=&UNi z3<{jg*}!I-4blrl8qG$aG_}n(8_!As!KfaJV=hM9BP5O(nqkh;JEcB^)GSei1iNUq zOm*~OUbxvhT_94XH2YZ}$eL{@3(fuj3(fv8S%@m4Sx2+uY;H)QXY6H$jm@s(xNGwc z8;;R{pOI0T-Dfc-{LS!!6X!XOPcpe_&Q-+bw#YFoapl$KFwG0Guu$ZfQuqsU)gZ{` z?QnE9LkAGvyely`z)8PG{3(f_p-^V?Q4l~&eq~W zp+h#4wuJSy9MAQGmi=Y(P|HIY7hB$C%hLu;Esq&3ugh%zTiHI>@-OrL1O0w0cvWO? z>ae%9@>7-8zCv@Wth^7|wJJg*YgG``w8FsQNpq`;z}%`c2yayt=v&n`z_&v3M?})9 zg-$r*p;p`t-Kw`)sk>1L)+q1kB@M(GOYU0D7VcW7CjqUQ*KeJf4XoQwTNgzsz8(T8 zw?^7lC~nA zgwy7RI|3-q%dl=7@Y|dvgKZ9wpg&YczbD2^b}TTA*I<@`(E^mCe@*OjWjt-EgD#_h z;Z=+YWmgEK7;K{~q?ZNDN=2|QcntP6_bEFsC^pV!gNu?`un}BMgx1szE%7O#F3XAc z5-{-*%vpPIyT~zD@HZ0RKZfJb#;4#=auPg=6(+eo*sn-?Tt*RHLG&e@xNwq*NHOB| zP5~w_x-X4(M&(!NtAp3llLjM1?VaM|`lhz3wB3edx2p7BPG5aq^VMxn=>_7e+g?Oz zYG2(J((k?8HyG{VBilYV-5ad4oi~YY#~DJ~7ph}``{U*sQ|+?K{Qxl4F2K!HVa+YK zgWLve(!3Q(zepe2t{RSJHgD%e@A=kX}eq?igs8I8o-=KyPq(Mj}Ul#}T8-fm~pJ}s`BacFO!RU6vd z=K;p{d7PIuMD1%^5s^aIx6F#R4+ik|T@B#vv5=tw@2`70bk_Dj*7b)p9BSH+B^XfA zo}$@=ER52AF3+IK_I&?|(tZipYCoUVtgfPcBJq4>;`x+~$i%Opg>Mxn9#vI3_4XA! zSXj{T9A-smwLOfe{WECwN(k3Ah^j*xVC~=~Sl`;sfp6_lz7T$jW0KOL zIJ!@V9I9i`bIxo!1Pfh=`8yy}Ht4yRodN=N9eR>F?XiOnLvd}ay>?)7vBL!OZB$AJ zbT2W84qss}&7O!tZiCR?N5yycD;*H~h^#vB{Vqy}GoZQy1{Vv}&`F2ea+ACHJKSdj ztCQ|%SCx*1`8`vmBbE+CNF6cB9k2-!>{tp%vUU?Wa@}@2GDY68ld)^R<5b=OcO4UT zQvb`YeNf*Ka{!^f<7E=q@jR&Sh`hEZ^&Rg)q8*@YCI@>J+6a zowrDA)G3zqNf++4f+$v)DB$f=p`emFA=VQ%JKZ3govwh*PSP2z7S-tyEUI%p67$mF zwbN6bn9lw}Ojn5$I#)FAcP?Yx50d*mX!V^Th0eyaKb^aP#?D=gbW`UMMuU%-Zkkub zZB=@@iH*OeyXgEQs;;1fI-dejov#Q|-VoA<;pBn4OLu;XE*+^q1Kfo}Mwdwj(k@Gh z6r*OBbv*uUIcabeYUGR-RrOW+P<89Zp6c%LCH6IlL_hXLU=6K5<*0mh#3BayFB)4ld0PI@L z1Sk(K!wYroFL(Pu-dz!hS$f3#9%Y81b;TwGF|@8Sa(A7^))PHiQ=eUb6WB?x_O2V* z!s-sX9#EAYAA1Gk-Z>ms;2^JoCB9ct>3Uxp-eyDOG6uMp4+xcS4C-ER;SSGbK1RkMwtHz%(OvsM25X>$2o>Gy>v};4=?-{3R>*+d9l@opkM08m zE@%JUKQQ$n0TuY|KAHT2o$ir3JMUI-_jotJRRpyvCbzeQWZk#%4k28Jm)saJT~Tn+ z!@+(ycSuYjAn8HwH~k0a2?6%#r3tVHpQP zJ?^me9fQUX((5#SP+s%oLgNQrN#mU3F@>O^4>&rn_zyJF+&{p|jE?DpZz8!0bJER?kM9=m2j|@Y9|*wf1bE#9sJ~TG>FLjk@98TLU(Xzx_C~*h9E0Uew zB>=m336mWop6}gMmrrl#;yv;KSG_|tu6hq9n85~Dy`i&IBa@HoTLj^Kd~u{xm4Q}r4>BojW+0aT~$f!ano{n5y$aJz1 z@)3}SjAK(SL+NiJRzgB~p8D-|O2}f+o>87b3_-sdy-e&TWFLw9MO?~E{cY_^2p0H8 zb3aGO-)?%f#mprtCVpVQZ%$SL1$_$=7TM?vXDMv-txNj);$`+q-^#3JvO!nem%IJ@ zGR*JW$q;tmwrmPY`t}q1lvGGxWRwOrW*WF}Bx^4=Ya^Q1YA3RGl)|v3?~kg|KW7@! z)=z{E+WH~CtI^gk7tbK#ex*oTzha=RA1Qa!20Z<$g0y}$rA83j*J3N{@Yb&lO3#ZB z`(etU3$fqN(&TGMtl!sW=M!H-Jbx0;dwhuqv!BSD2vZ1?!tD1C&p>d0SpeuC06_iI z5Riv3`xk^{`fIOtNBjOo*a~v&UtQ!Vqh|j)sxqJ%6Se)DvUWS8`}D_>su*W~Oe>5u zQU3v`@-rpcABm0uL3*;ee=?ZsuYDGTq}zq6CixK> z`GdRY1@dmn!M)t%qw*+LydHv=;af+U!C`EYCKwgw<5+AR4F<0wp@WwJ^Y4*{t6YoM8_JuQS7!W^CE)}acVdiGtP-$a)-x|!Z^yKI24*&~5FCQ{oRfg_SNd9ab(Kc^IUZ74=A+jO! zJxPV@)kvLBNb|2sEytt_Bz3-!x|*b-+N2BKLaKmU_=n9-u%uxfTW(-WOc5vTAr0F= zL%8l~hGvB249#dbfT5KrUQjc%84sc6J$;;c*P+ecb8`-7e?v#|&^Y3Pd2wFOnn@2Z zRAx*=yIjL*Gu83Yi2vmQuCpB~{qXM|0PGEo!C_=-hQ^b<+|?Ec88)6EU*p%;jo8`jtD zCu{_OOgRKPYzQmSGYlJ#1G}xz{n=3`;3}M!JS+_Q8HVK4lr^}8BwylshLyuyIJi&u zCI-#A_F}5?;dq<)$YH-ovu{ZJH*PnN*WWUyKI|YN6~M`@#NjA{v3{5n7@tOTWwQ?( zz!Q8}2X(gkNi@d~M4EP>vAxUz23FSv5g(#!eu!7e&;Lqj7W5yk5jY7z|6zhBdMNNi z*w>VYK>y*M#DzNgD?}eDueJN|HPJu+H}sP8AD$QRhG!zY`Cq}83@@%arcPYlgg$Y2 zRa(n%^6}8e^#fEi!UsoMRT(Aw+{b7t8j)8o5LZ5;uv&BRO`DZ0}Y~kY*Pnhmc@^9~nkWBPRp=NMvFx;8WQ_fbmx7k%tKMkl_hNJ|Nju zAt*rNh=^_X)^2WDAEL7y^}d_pEJwjRjwyTFq$mA(+uBZ4s)>c-@-VMx_S|1p3uCjY{wlQU4!NBC0S?Pc21;9% zmfL6jy<$J?qf~crV0j6cbdIjpdCi!Q(L zq>R4~#NLAVm8wj@BP*s2Ob9>$-b?qEC$3<)j@d;FE3iN@<1uJ}EoTo&9gjh36B^;*z-spS2^|u{!3`;#B36Je zL@5)ZobvqPgq0*DfrOaGfCcplN%~Urgd;G92}cZLn1G!BtO+FZE-2vGG2sbL_(Ab^ zb$!lzCpt8O99A~Y@GwCLcXVO&|&m^Rf=lp0jo=IE}pJc9wPr?j$&JjrL zBOj4ieY%Q|GE-?EAqzFXyyXD0@HjY*kYl1D1ru?(`b zoyjGwwqv;|TTLdzk5BHb+m1HnncUf#m6kKPCApeh7b*cJM|g-~ITje^C=PW2lq3Ap z)cymCfVsQ3ntbV9H=B@7puQClO*DbZ}N=bff30*zA^NhCD^ zXFrngDeIu|DPO9Nxsj&Ep~oq|pv1CwT$`nV?J3(ddz~V$^_#MXAosZ0)@K4!u(x?` zB&0s&I!-=yi_eVmeO$kS>8b5;;PoIgYLe+m8q-sU>jh%VQ^%n+b&xZ43M=^pqy1bQ znAE!+;Zzqno62nwQ!!1SH^bzN$@QsgjUjL9XSlf<%9;9`DCZNl`V7Zr&Vr`yB~9Wd zxNT#q>{^<74Z@j<)Y!b$)`)oOBUPF9NRp;gU*P65nXXLZ>#nBx&G`pmFrtfTxf6#Y zL;${NjRapJ$(%MA5T{|g_Po`8`m9KbXRsJ+YCwdCE><^B{LN+~kS~ovYg!V4M5dA2 zXIcA%6^K5yT3r{lR`E!vPCq{FZ&jIoM<_)HF({p$0hCV9U{E@}(CTIyrPCV_NrX^3 zeISrb53wR4?&*Bqd-|kQlurLVkxveR-RbK!N<}EsPfDXhY_!h`t08>DUno4Sc|CJ0 zBt_>}Zf1S=I#Qmwk{f?q}=mzHr+Bys` z6H~$}A_fd=N(^BQfGkXQS%l$nQ6;RZ2Qq717}f$n-W3;y!Fz|TkO%3)`k?u*C2>8J z3&LR&2u*Yq#ubmS=|*r9wvczUZm#(z*HdGKSx zBG;H--F+hJJ=?LZ6Kvt94tSYyVc#w9MxtOr;4%R5On#tHbBL* z>fmUI;{jFtNK^5wzIuVEc-D}2s(98YR$_K!)=yeTnY94~&DtQ}xh0yNs>7MHG)}IY zq`1Fu>*M+Z=x4*+XE#=rxeC#9o(~I~JwPvzXkhkeH+tNQ#uYUt@2Z=<5?84o)|>qY z0r&@_dNPjva7RZB>zj@B4yOwSG5ZoVF#8-RosAL2>3$%F);If!SRZd96XSG2u5-NT z-XprQ)dO5+*Yz-`7y-@62j=JGGgTRRMpNY+q@bOj0nQw_Hm4qHEPO(8ddBvq0nh1$ z12Z=FX8$<@8=+{p*wmbHggeeTAK*wt6p4uR0|Rs9(TF($8*6J826S;hB@%WD*BZK& zImnlUH+|eCgTXih>NQe!udDXbqhq>^YXlVx#x7o4q`XF|h@YX~E7Q%Z|bm2W9p72gA zb9;b56n!Lj$MWuQ-ZkF=VTXpo!we0DPvuPrCwze>9Ku9!75<5?q41vs5FY~zUu$Y8 zY82)}y+|=j4}y!r`1nXWqg$IM8H3-Sy$P8vckKD*SI&^Kos2 zMbGuckrqb+Ow&0KKd|VzIrReRP;(2Q)a^6Z;?0WeMsv&C!Sviw{0WBhnky-wxmAH+ zZh6(QXsFdu%|*PEdUJq{&1C!1++J+fmCZOdU=;j?Uon_F*!kEx=l$DegDB_D5m7=R zb7xUfa~T}W{fLcCg+RP>7gM|uUtxl_37pQ`iDRFtL@Xnxe`%b~JF6E+1TpW5n^RP# zdvSh3^RWgG^Io$FB@p4ojA29^X^2=P78T)u(jpvUo?1aY7SuDos20&#bu8|v*_h^I z6KdE%Ys5HeY~CH{HzE{O`o712P5yjbo554$E*yWVN|bCxf1>ded0sCNo+7VVd5V;2 z40@U;Pm%wy33-b0CQniE&JVgbuAjse;s*CDaQam+JQR9WDd*CT5 z3{^O^ysJ}Mc-jJv8;{D)X6Cax!%co?>8(QXsu7=7^goiP_N0>Y>tUR^ncin2Uw*BWv6-cVO@_$ZEtM zFkgpGKA$q2h zQx%!)IbrW4aDHpOKnR@Q@tp+DM*`0|iLvzjAvi|btlut~Kaq$>tB$zQW^fBu=FfxE zaPsxwPH+6ozrvrb{8@wUJwIB4O^A4Y99k}dADF)aA0(g`ov(e(g!hn3)9!7;_YCCT zezP40NbTPF`r57g=B?+(tv9o@_l7$&826mWl1MXWLA?5#Ae|M>dl)sedkyhMaVW;w z97kW8m$RK6(Ur3+#qJzT6*x!wxVA#73lLT=*rY1kgCIJmQU#W6G4X}{V9^Wv$;Ta`g@xmJ z$7<2|cq3tOkAwS@g$o%rM{4iu<=t((G{0cD@EkAAPZlo3lCSZa0#sf^>Z8mr7%nQt zyV{F@c^9)9<1GffgxxIaW1V>|k{9+Y8Vq6=^(C>UV}Qvl8VhwSnkZjj%Zf8N6xSBK z?**Dz6rn0hpRtQ9TF6REWprSrSgq19oPH*uxM*(C_qcu`-v?QQwE)*_e*JF|p0kMG z$wnAn3At`IoL`i4IFCgS*^d_SZOw~ryiMC;n#y8_fp&2k6Yb*cf>yqSxVRuHVVZE_N#Q6*~#U#g6eHj%XJU zZGwpwgO-8zQ$c$`$Xu%`af*iaHxsSVC1NdIBKE3@_KBcoxOpHY4vxX19!MZ=HL3X0q~a3|0&FqvXE6%-cx4<$=lHeqaU6pUemuwB7TNR(gKnc9}SY?kzBG!LY^6lUr%~AnDp$> z>4Dti5sfUpz)5KQZ5)qm-r=8z=pT!WN5_tTuBY;~k445mH$E2W^5e%MtjW0k>!0gx6MQV_-1mr0QUmK+3*J-eBqt0yEP_vY; z>_~W_S290134}}Yq0(Z1LRwl8m6l@dg^;u%TmRzZ(&nhN#vzq@vl7@7bTW{~|0L*^ zPC}*c1EkU-R*KXs8K0%Bdmn}CP-&pl;lR3dvtCD{34BWvZ*!*iT>1}uz_PTcu?%x~ z>Jiqs4CF4yt~2~Cdo87y@GkeqSu=eVYq>mku$<2wEHB}nBv(M^f~@hTg(r+|mbb#u z1rgFziI5=R}P|Tz($}tw;;hE4)F_3ch`C`6JYhO)m~(h4yq1>}5p-N_9mUR9KN)DhOF-yaY$G zqCNwCJdXnURx|~DEqt^D?Fv3Oy`r7*oy!#w0%{IHVYnn^CK#3>0tbGB>lMF-Fjx1! z?_93Lq+w+yu)j~FE$pw99Xl(t0PD&u=4ya!Q3w2$)ij*%*`%(Kys|TCT-ll+TALt@ z?_91#esj%|417E7$~jUolz>ON2{##n%oS3`gWtJi_g%S=_Mnl<9c(KT@(;+CY&31^y@#;%-fv%Of?QpY@>!h& zY_87X?larXKJ$!8qSaNIBwCG~bn!doh3l((<8m<6T9_2u(JfXFH9k?edK#;hLeVnN zx*9$jGF|;A3q_`@FM#XS$5qEC!_u4I%v^nw_st#v()o!(^!3$$L0U4lCZ-{&i9*Rs z);5(GjN+`I7|W`V2RnHpR;rD6-0~7R;zVpFaDPcMF&O}T}nL=HRJpqn@{ z1OZr78updM@v5?>gABTfVC|Ea89;yHJgqLFEJ6QFl$FdxnoDBB{5hOSyGluGO!n5a z);G&0^2vq7WM`$! z7zwjAgDIIc{Rl_r!I;#;s@5Rsf_|U+JB({WRb|5wI;l1PkF~cBj3Q~`hBuiQ3BlnG zIf6s5!yQ7<;2}5!cXxLu3CVIC5ROxv!|iYxTn~3R2(E{Fkni`ao|)ZE;Q5~SecnH2 zcV@b~x~!|Jt9xcJC76pXoKD{uoy!+(&7G~Nbe^ftT@9Nw_b50wcfCx7Sr3MMVd+%N z&&}Oud}Va*ajW#Aqcjd{%;4!jUZrpIH-q(lS5k}Y~7|d-p-rO_S4PJfzI0`?bj0pS;n8YlA!)f z0P4#y<%6K}wt-axB@CUP#-w(BfI;niBTyu@^Gll4&JSU)^Q(Z``Cx(5P?36#049CP zKooYSyPba$!kmBB6xV#1G((v4??nGWam|0OyZ?ENnzFzhhYv>5ZK@-swjee8TEIcE zfDw~3hX8y*X7F}F4gM6Dig{Quo9?@~eQKK}Rmn^(sKBC9Mo|dI&>t%#>9Qcq9HR@6 zcxOxK^@3K8F}k3G?!IW6C;RJzQL$h&M#X~B1UEogS8!s%IC8={cPy{CUl4(!3&sFl z5DV!oP_Hy(6T~aC_Oq`o^m3CE?S?1&7TjWwuc4F+Uc)skfF+CV2&OIgth+C4Y5-oy zMbL%*vZVuPEyS*&*pAk#_ZA|?$78Ad5Q^cA)Ph$KP3J-+9u3pEum_>^hfGmsMYph}{l9~FV z<{)BG^RGIaMZ;*~7s;#*>|GQK-C4Agy0hqKw*1*Lugv@}I%BHFBDfesH5T0vlP8bv zEqVgo9Ys^KC?1d&%g<7tP2^7*{-lDsEcPL7pOssJ$QS!5XY8sloSiN%0v0XKP8P}K zNHkpBAD8g&a$_EE%)$+@*hctg*yFL#B@?D+*1dy1M0FUbI% zT9OnMs8dTIu|EgM15r!hA`G=yQW|_&Qrc9DB`plKSklK(izO4#o@%iKiejk6l7qP1 z=Asr$h@Dc4B?p1>l5K2)o68D|S}bAqgKA;ib5V;W_fZJ7$O{a={XbHRKPywXf0h9e zf0p^GTKpMKwfM6=X_HyPpJ&0uKQEeQ3%mbKv-Rf#_1WJ)-{|gZ(=idf)EkGtv)Nku zEjwMB2GroI6|QEB4UqX>S`iIGp#}1W+@+P~Ovm(%^)X+dnd4@orF<{v(l-K&am`Zr zy5$*Q*~+z{`C4P+g4Qy|?MpHLT3#y+E!Q${0*!d=s#*~5vh=$9imW2uWjQVJE-L`e zEGrNbpTd>`V|-aPbk87kS!G@id&-q!26NY#kDw!%}d>Ijje-&9z#?lI$@o$?}(i$3rk?`NOZO%nCoM%!*V* z6tY^82eMi*ls`40IxE!V323fBs*ys2XjW9D<%skVx3i+PIYL)7bJXZ5HSlp#0@}}? zIYefKosc3_y{P&k{*^LqT(N?^t+!yoshGX(7CTj0RlCS))+dx!Tyj) zvGOWTsU9n#p@w>_N{LgY9;*;faee{;uYyj9fLCDz%(?-o`T;SAy-z4nUW-&sDPmrm zm!oD?jKo^27%Q!s9@9~ct5q;gWDMYnWg!b=w=w=$wODswvropwsza2fYR(5vR-H7* z#VRH|I4)LeI3eMyGvkDWuSQT|5WczrP8H#+d*GCWubzSvH7-`uKq|sl!|;)CRybpg zi`D4G7#C}h)kVzCaj{0GQEM_m-PWWdg3jY&4bol0wl$ap%D7mAqyi$a|M%l!&1|aT z8ao)X#{SiDv1S#=#hML7lo8BYzN%+!R@0KM&1YHCwMAk+QUH9;Wm8H9fNPOHSzF)P zlCBMBpKJL-l(l4Tf&g%BXAF^b)%f!*e%3zZ&wBn$Vy}J8VX?Nm?z^Ug48paeMc+Tm zAYA*iRRfs^v&NrNLoMa4J!I8@y)kQ?mm2CdL+fl-4d}R0V;yJEe0+k=cwJGm#yadz zGiwBiBW|r~w6JO*el}}#mKyEIqjkN&qa;bd&vnBP5w06WwyYZsQLGzng)FSMKzCnX z*@z3*t!4RIb4IxCUu#CVo?#Yv3AV0hv`B~Zm6_oBQ1rLH13dQn4y@i#=`i|Q-xEi? z(bxLn=xhCO^K+@|X$_1#1T5eBV_(^hH}Svu7BJQ5FK?jnS9+lFS9+lFmmlE6+5nBe zAnw0b8fg4g2x$CO$VB5Wda?07X7KaZ*#8-gEkxrm(Kt*rb^tyGJkdC71QHv5w2(lC zC$_Qm!IKRxZ*F$lA^Bg6WMgI^u`xf8*vQo2M$Eft=zzw?;y9)oXl$$uG&WjaXx`Xf zs+qjl_`iLjnRA$pztPr+)!w*>eJzUFs*L_dlB{%F`ooy~E%s-_&2PNIF|?7-ZfrdL zRdcrS1T%Eb1YvVrtXNU*RU$CQ(mM)QYRpiSjX>$j=8W&JkQ zjmaVb+@?P0U{g1C01vx~vA*USyve%Hrk~*oHvJ@h&Sal-yy(+%23F?~z^0|hzWnWu zakFVXQQZ$AZQ2j_wP_PtG1%X9TzB7WegSI}Ut+N7vN?g=ge3Y-yp`FEt=ZASS*5c@XYZIvx#5$#Q-%ZU^In4_o?yX&=yba5n zt8(ixUUuJ4ci+BAx}SinNSFNF*4fatt+FX=>vRG@E`S|ay5^j-+q#0-JmSxR%=lSj zD*M*0Xmv3)6L(v8D{s2>oK+a-D7yF{qEk@?%s&v$LV zZ)W~>$b#7pFErbMK+#1uF6|}Dw<8%;t(FJVb32glL24Xw+R@w0sqdHsqV@;k))M|4 zlbrgFySyoQ?%?X>jwedTW9q48#+_~~cl2fD)ORwvmz?^}Y}CM=nPCrhVjAcaw-S?` z2!&Lla3>b#16% z85-$bF#Ixq*$rL!e>{JI`Pf|^yV#P`BkryW>Fy4Lba#gV(cLu^&aBe{$0{Ri+09)2 z?v7^kv>Vn1q?uvM?iv462*c`K`z4DlMW|J zSbH#l3}Nl5gi{J@4=lYQtUZhgm9X|;fE&WvGe-#vV%f8SV%f76V%f7ip;-1nd?J=T z#|^RUd1i@)bDRHSV*dZLI=DA8``?=ur0-4p)%a`g_l&>xmLP&&vGp)j+#iagk?wx9 zyA3-DKgW9DPs6SD#w|}zPh9oJ-8#e*ee55DiwN_hl>2A$O0DLhY#FcA2aRxb3|A_@ z!adls_Z*6`|0-eoL3s|ef$|*a3FSG^6H0pk=5*&F)HpB*hn?Q(z$iCZ(E}6tT7(1K zCv68HpuxsVN%4VoAm{+1pq(qHW|U0Ma{9LehjBc1;|`1ir*vPv7({g7t~B6_a1X#V z?ObU&U^aNAyB`de1_v>z){CLm!IG?nt`1hujGsm_tGtb~TC9Nh8fAgQtkg!8k%YM`%_Wiq#&WT6%>G#<3uO zNZ!1DC@C5oa_2n@c|bdqMO@3F9FYE@9FnAAJ*1s=r%ySWDVjqVyodS-_(O=G6?j>f zJk%a+I@Fe^9coDkND?^pWOXS?-9sb5ltYmwQx1(`T`=X)Y%)cC(e2RhxW1&iLinJ% zlBZk`@m2MQ_PM|(!w$s}>SGJ)EfeYofhvi$!*06!;R|Hr;UrL?!&#s}hb66Z_!~ey z?9VpN;o0Fp+&v|m1`iiC&^Rm+-{A(J_;7tve7FYN2D!AgC}v;nfZ5?bCT52_8JHa& zC78)(jl<(n<*?9uc%j*mEQlQ5O6Y5N&jPBp&>X%-xc^#kZ<=u91+J`&9P!cJk4$BJ zc_bYUgtvCFom|yBQkK{s!Dm?AkI1^+kpk%I2%<12CRlxfkRw&l;gJT?A$-`85Z!lA zX$bB}Tj@|fvT~#=t|w8OkMyTD9~nmB9Qlzg=bES+>MQ^ zoVYUfSL3QI%gnFB{oNQ>YL^rG`Be#sQd0+4*47_f@8Gd#E)^^ z=U5qYVtcGUE4i6Y{8-1YOl%2$BEkPi@ION3jv?OJ`<&o^!SSyNp0DXWw!n-Ljv@Zs z``lW1J$B}QiV-k$j$tF@aScz0)~BDKN*w1h^zjr3U61DkZpXia(?6a@_uZElqJyd* zFCePUyLoW8n(XpCUYd!-h=1v3j#ts$Pla(@9uLFO!saoBTR3F3{dgyi%j50X8c`ox zJCDNSeD>-%AD%eQ6zlQHQk%OMj`!Dn_n%B@c+Njo+T5U$$LC2ow|X3(p~@+1^Zl*I z7xH|3Bj*wENHshz4Vhm%jxdCPT^gQ}hCLHB6n}F3DFkx-shRXY{!uk|OjAscasuY* zRBhSjaRNhi|9})2dnc$@CklYJ6U^P5s0W6gP@k~@E+^oeh)Xw|hR}LMln|Dm=qW6R zF*_ko6rAYH%B@soi+^l2Tx<>=aR7Ht{7xcI#IkOTs%v)_?ktpa&xthzxJoK5V>+UJNn&}>ST$4+H(2aTw(@x#P&_DGS!|T-BTlfL` zd(VNdr`>Q&q!T}#1l^p5( zBwp>t;G?3aJF;p%oX8v5PEQ3Mr+)_?r+-ePY{boVoj1rKhQI=zoIwiBcE ziU)3)aemS?1g8(mT?>JK#28c(yy2J5gqnE&OT7Oz@jm0h?yPk2ne<{S`9(Nayx|Vd zAVS%D3wWQYB5~H4a3FrB570W(2a}gGZGZr~J2O;wKlg};pBW1j&&)JYJcG&AKAX3R z;+eU!@F5?IJoBgSes-|5Sx2Zkq3R&^45m*MIN=^bo!$l+XU>9*GiObkd={an6X>%! z{ui6fhiT5%BR~*)wk;k1*-@b6>~xcov*TR5gM6{uLLPcJy8zUuG_X9o5?G#HX)^mP z!b)c>FN>1QO2lmT|HA11oF_;>_brY)T16mnuC$57xj+|a=c)=4r!d4(;(o4{kpMr} z7&x43Y;x+{Sl3o_|5r|(qvDZM=Pr>`=UzZ+=icbPhkB=^)Xsb9?ic(FPkR0vT9EU} zfYJG6)?_f^uCL7(ttmd2rwu-Ph7vIB$U6hAIFLGzf#f!S{G2JOaTpahXHSFR&oAcJNiy)c= zWoIb{^2K{>i<`%brxt==qTHZT-E|XW`Qz;7UfA4##O0r$^_SIj4o>W{Y%RY$0U$4r zN`MZP>++8*fv;r`;Q-0!QpFcv7U^AHLLiHzDmPhO{v`nrA92qc#XVo%$Qo2H05c1m zQGA3R!4>z*J7lNvNW9(G7bMTu85jJGS?HF+hq<)p6Qy+K#%$TJRCatlE5-B-B7jY1y22T5(%cR^pob`s7G2{9klwr zB+$+g8eG1MR;q33SLE|7S8kK;+ty%>Dx=i@A79<~BrQ<*fC`6)wN*k)omD2 zSGgzd>IT)0r#p4uQ_0dQSu8z4@h+8prB@Gw6_teJS7FUg%t;-H+V>TGSKkqjccyQ- zmcqj0S|<9HNyi*`m|H=?!fUmq9=g5OP<0F3uJyneyEZ~R3q*Bo7@2!*5G(ajU@f77 z&TCWXY1Gd4YcaZe+$rvlyY>XfduM4~`yg!rFfJJZ#?i>fA>jCewBq>ad|Y~ynz%x` z@98okp15G4=5Ru46c^&U3FNkH-8PYwaVXid3PN~=*$@5-SxA=J1*e3gmdgD zUU$FYrA1AoK1(S?IfsRTK~^hUs<|0KJ`M zYEm^HyY0aFc5ej>c-{UD_Plp;V;>MFCbUt;*2q6-^X~kNW1*{9?kooAJBv-R+}UrT zdFSqb63gAR5X;>F;v0a@?_v$g5X;?cy6<`SG>OG>w*cxj7XNj(q$!rWHD&4WE~eXP zPe@2|vN`a*I~KuR%O@r7E>wOOoV$x0;N3e4IE=2zxw{8I z-rWN+7nF0ndr6_GkRy-a92b-GcmLJhAN(#4Qrvw74A!Q}th?V!ZARqx;8YO!xUm6L z_Fe$(WJDz+5WiQ9qQ939ecj9F5d9Q%iZOSup_GOK;d?bz|JIl@5ec6eLr-$=H7mUr z<`AppM#;AV3vJ^-v<9W2ziB>0b*vU$EvX3wjDS;;vZQZ{rpwIL6DX;|rl$9stz3aG#klZ<# zl1%CSc(C{<8q9$~_u+7; z(Zk`l@Y90Kgs~$kCGX{AC(n|qXFPiH#r^Y0RAWvz#s7?mXGkDC$%B_&2+pjuqhG^}k3H{)_ix+cDXI-vN*R#eANFm4*FqOvKie zZEcWFQIm>)Cl|!c$uaHl{wUU7u4?mivl2H?_bG+oDWY3oN5kX6F4RH8GpjStWBW=3 z{qJjmBL?l?Pwe7T%yu;_A0x=Uoc0@FjO@2_+`5#5;&Fahna3s2(__RAhLw3-+R?;W z(_TnlkLyTjJ~U}ZeR~WQe;flcFM_!<+^D~grvZh>(<1uuPV9GN#^Xge*1$sx863Kg z#il>r%)ZyDzOA9l9NJ?{3{6w>_$UD$joD$)bVJp5q349q!{>IN@Vlx{G)VJtJf!)U z&$T^%4)*3n9vF9@coE4b-hlbUdulZrz}O-(#-9Y3M(GJmf|F5tl243MRcg+Y!Z-#R zp6Lmn0C`f{ba_ugb>A!5($j}OX-k(kIT%Q~L=oiKlgT)KuzA{jDHd|$$*+RbPeAp_ zj|sQ|IXziGyf=WFCmU|!X9;xkAaU8LyFabQ4A2w4z52OPiv#6r_Ifto`P9+{Cs{yy z+7p!?8EKuT1JTpdfmTmb9Zg^xz^Xh6d!iaV#b$6*4W8~LguQk@r3O#qzMuw2Na52L zy8H7aGQOY2JK8_f(EgbgF*FDgJ#?dMP?JT+%e zC@(6;3x6Q-;ya-B;ydu~1@uW0#4mE;qQ3$91$QF9C}e_ufpu%AH1LaNq7F5_2!1%h zPa*gzpzg(JAcbKKnZNi!cYoQDL*d2G(9IXtTSi_W{&yP6FV-9J1>0;v8y^#?{X}ZN zg%l<*&dnalXxNYtDL{D%Y+jnXn_p%Gl$RMzC@+h+KzSJ~q*X`=g`9iY6QsQy2JyWd z2GU;kMN6cf!0(qMzqE0ZJx|2($-w`moju#7XIPY%IyLbnXU#9y08}y`$8>}+Pl*gC zd0j3giSEYP9cJMb&B5g6=F;)g7Luh12_D9CV(IKXhKp5`7$9t(C|Z?Un`suX1&Rd%Qpxv7@gp(9xv<3rG#0p zAK2W`{!MGNf71(?y6>5eNfig)$o{f7XMpXSGgkN< z*~QDo{gH1Fj+38Im$&jX@mp?Ceyc&Kzgglzy|=KGG%&1Jk-~gij&}>`zL(ynbEs8u z+^faIC4+}sqB+@F0>yb-i*0f9R;^Gk!qECHg093ikrwss10wx^ z?HGP5Yx5Q!=G}cm-`_0+d*3ZImEj#+mZ1#q4v3mHNvI4Q@9&-g_Eo`6yIeg!o4{cdR7``w~((Af8PczH)IF)@hu#bvy&T#ClN z$MfUR*!T>1o87gc>FveJUh;qC632@hl`NV+IX2)#b4sxv!D(}z|t?? zLqN%UqIkqJUdHhEi5LZvJ_LiL51}CGLq}Bo&{0T|ImL%iA?d>?kn~|8Ncu38oJjh>aPET{&V4{Q_pyUP(uco6(ucoIl0JL_q90yZBz=^Z2YvL!-H*1!Bz?pR ztTRa;a|uahzC_Z;J|OAiXpr=A21xn{W6aqgmGL89%t*WPaS83p$CY+}Wmi7QwEPpN z<)0kW^2lDwu6%++rv?GHPmOSjF#{od8q5*+sec@PI=h${7EYJK7&ZZ~655qdzvBL{ zE_MaCOuO>wS7^s4?xx_)d!59te3Fp*(;CO!FWZ$*I}_Ly)22Atm+%?y_&SzP7dbvY z8F8mq?B24tdW_?xuK8!hygTMSel*?vvzKwh+uIvgFj|fmOMWhZt10!#W3c0Mc{V#p zBgU&nxUx1NedgAo=>9ZvEaNsNYm?Due(OlRxZHUU(C78+IAvW_*Ky$O>5)AMn=hpN zd{Xzl9{^r|zDZtx=G)UhBdWU}V2uSB9nGem*}IFvXDEb5Xtty@H<8KM>KQK6AUxG< znX=+13tMEJW0!o4W~%|nnyqRaeu7*eLzy&N9bI$x!Xkxc8;oPL(|gS{+eF-%s07Sc zodxjHc(0jen~C?D;aX$Ftl1W(;f3z|pgLlj`!{j%7y7DUyp>F|{q0m9-TxNKVYu%% znYB+MZq4@5sXXG*ZC!Iqj`EJ!vhP%YZO9tF4GHcrl+fHtqRj1kbXwTQ7Ci~%f=0J6 zmSaeXW|7acPT0ynL_u2=2rt}*vK?YMwo{UwwTdsl*4(h%cE3q+oNU0c)S=sCp&M2o zHMe<2GxL34*;zTcS-MpBeOM_8CmfpFE>_=cRF_wV;%#KSrz#14;z+TFR&zU#p7}N~ z&FvZMU?;U;XTC8E-br&u9Iv@&M`!NY!9n+wL>4l1&yV9bWui3qVg+$k%vdGY+*`7e zxt&9EANjwmk_!@eUy0_f6O&EEWD{iN4r6)0BOJ5lz6ZMJZoY;>b4SA9en)dthUOk; zxJV)mS!yj+P^h^-CDKn#q_q?-&9q$q3)1AS7EFNoaMD1%A5GJGlGj=X^s9BSg0P5> z@)B`P8;1J$TAQYg!AV)DvlfjL>|fQiUkD2NLrN- zah8`*J#qnrM;3yx><3_ZloDIv$(e%Y5yFP*0bVw2CJh_$w1J$~Ba9j@FkFCj1<`6t zw&u}K*F0Nb(M;amVgx=ON;*o$es&!G#Gpz;2v+S2x*^}navz@Ma<>g!SHP3Fu zO$>`?Kfv_tC!bvh)}G^80(?A?6iK+iN)3qpozEa?o`_*h2s;R2hpaOY!apX2PXggf zE31Uyh49^g;8h9`yh=$b9}v6{oV%JeB=V&R0yDEoYc^>e(?Y3|7j>6tdrg-VX?F)3 zjZEbbqyaUrML3+(fST8KGS+J|yG0t%NtdKUj%mdwFXR9siWrS=Aa6BPByhPbM zr*|1^-h6$T=1qI;g=COZ4^VG!yyH*v=5Bn=J0&{sPH81=ATe)fuXlT6EP3Z*c`j3R zyvyspPXk4Dyz7eU3~|tGEFH6hu7uIghyyimOk$o!aaON+W8oX2EfZy$H@u(E_lSoz z?`R@~jcxdWDe(RQ7}sEpB{<%gs9-mt=DpTJ<&XpD89^oSgoE7l{%mp62iZ@}$6Hcq zV2n@pMBF?=`{Gjq*!YA18=nwh<5R}K#;3lnC22~0eeg0g&8H=Z^l5Jr>4Oy~gGisg zLL~E!n$JiaMvg%9K_(nOCJ8=BNtsRl6cSn_;wDM(Iq4wbA|YIqY#vF#>gD}_yud3< zAbzT%xyJFL*6ED3y1$7>lGeKByMo9k!7CE9B;!Fr60BI@2R1heQWVO+B*A+Uv?OK- zuO*pmp_l{@MPQBUxj>r>Xx}04q$OF#`a4Z7Bw0m3mOn~z#Nm&UoJJedMkl#P?MreE z)Fip)FfAD*$*Cow${J8Wk~s44nXR!CloC2YZ z4f8(DuM|k~tLlcI=B&|NYA`#4yG9O0^Xm$X{kn<@+{GD92%}BEnN)x;zL1&Gk|MLBCG7#YNyoD0Sb@tK5bnwh zNK5)7W=8(ktX798%Kfly1_;H}FG~Rn~HEMC}z( zi$loni4z8r4o5GlOGiH&GY`!_CGD3#7Ow9Hc*X83i}PGK5R9doiiv>T3qO#Se|h5u zKNFz&SHWGir_BbDVHRO?14aI|Scze{e-j+|evCaiOQna7y6>x4s+NBro`C{?rtdU= zeAq+tAHsVU1)MGT&k}uS;WQS4d;arebo|R!({L=KUH0FEW4p6m_CF+W_pvG5uoGO2 zCI1srcoA&#KcoA;&ThTei3B{y1E?K1wH(>tI?Dd@?IvkfRsUXGMP3*43Ag7jzpNZ841xv?0tjn~;hb@J|@ zHTeKxJn#4BePEY-9NN8}!e@-M56h%Qo9ba1e`Qr%QYFpBD?LO`2Pb!Sj@Qw=5u zQ;lM=SL}Wmu2etZh{e<6e1yu*?^M8WrCMp+5W|(~uP+*|RNGj|t1hY^#BmzdL?%U8 zK-E%RBO6m)j>FGc-S>TH0!>KuM9S}wjyo0|kxAiYF&I*Nqe)+IMf5p*W;F?SQ^VZ8 z4;3D##x@}>brv(+O^rF;`%nlsbpr`^`a^5X3E`>(`S}n6k^cx#eE~B~62f$#Lib`H233W0MF2ujWhHVF=XJ3EJI3jYMddEy>-JaXx@(xrZ@@0 z*fRXPBdZS^odF+Y(=v=eqb)F*8K&dFE;a>u4k6Ex(38D#tyIgf4J2h)!%i%c*c+0w z2uF7~^v>KEtU$ezw)Bq~9y!QefMJfYnGu2A$KODA#-up841_YmKYZK*V8-l3%}~N; zY!pUd^%&IzaK;hsE87g}L+pzdO+!0=3|P%{&D&IrRZAvn!sEM{n# z%9Bf(m@mv!%)zC@N+~imWj7{f;WJh-g2~h!#{xrOnMO!^e9=(L)Zfv5kI{a%Yx^}E zkeQZJ-!f62m%U;SVdP|n*U9{=t_57<@W5LDIdU?uG;Z)4P+DdVDkEgZ)nQglC!+&b ze8e~cYiO=xCG!UYU^tB}n_572=dDm$Ku%yBkki@<#mG9Kxb9~=EHVx#&*Jj3u?fl- z(10Z-A4EdPC$mXwM-%#yfX?PTFJLH3plJbPaB=~P5-C{6VVUi z3fQRoxp`y52{;yToNglE93gte9tOt(z`=kAx|Rdm^lWyl{*z-_aL5hKombcv>)==x zJojmf9D(W64ahr7Ph7#7G z#t&c_KQ#%{W4H+?RSi=e0E*ShS%cY2QtVSj~3s8aq1*9 zZhMj1NC^&AKo zE@&0!SlQa*=z>jlbK4+A?8Y9tVOVAx!2Zn-HEP*pK9`O2xokrS(b?E#L;B84xMurV z*RtbTSs0aU^L0OMGAv~_z8FQzww8^TyEGOmb~>myKtvCS=t$3X0@#VW$#S~CT<&0s8iImvCzYJ<}&L>-P(r@RS;}GZ>^aQEp+>V9^ z!LpqD3<$>fWC-j{vE@8Ta&lf^u~#hKETQGRg9Ez#J?9}2!<5)^!kEhq@dmlXG(`~+ zbe@ZrE@Ft`4RU4URU&VYt1tn0SImm~6@Xc;Al=UkJ>`O4=fcya;AE~a+`1r~%+(z9 z zp}JX?K6Aq?c(;Kf=a$TV?#)0k_qv2A=H3q!b00TR%zfBEG50?}LhV!4a^DAv`2L4* zD)$ExocjflcwxyusyF11ahxX;+HVKyd0-O?Ih;|$svV#eF$14 zoi_z~&zmBmCptx)yjcuZyHP!P#9m;(`I4gFeCi{9kZisT#5`X*5SuRrVOawLROgcv z40aKLP5DaTXu(&)Y56L$A{&QEXy$q(XaOman~oFQpLVWB!`YuKW3N zH8daGq}PQ&oE!m{5(M~v3D&oX^?j3D`Cb^@%J)8IJh96UA_`XEu*{zfM|z7}KsSFz zLI+FoXBV~!xAK1vobrEf3Oau^)&a@+!@ewN(w)CEE2-wa*}S(f8wBJZ%@R|>4rUj? zqmEhu^HE2w03UVK3JgMv0)5!Rnb`#*9YeUlEY#R4%q{>=EzB;kRvNEl<0USQ4Q3ZO zDi!tsvjTe(F}na-R{@KuHW!m(A?f?Ct*F!`e4#!=&j_^Lt|aMzl-6vD&h zj+skgZ#GNhs|v%y1hq~9{uIuIBcHQ_DO{4o6fO#c3m4G+{3lo<#@H)d0qRh=x@o-& zS3-qdP`bj%hMDVPg~N5NXc{j9XUQOE2U8evr~fW8x-cA!{{&%QVLF(?mV+q_2jkD} z$&PWa986(282?=uwS~pO6sChIypEM!P^5z?Y&n?1a4-r*CkIpbzOEH9UIwET76((9 z4yLe^gXyU(f04AhU$V>?dqrT1{dWN^CkK;+4yH(9TB{*-hyb&1`gAw6J4f z7DW=N=yhhYi{h1!TG1NtBt>hY;vX0{MUhM@I>(5=i_+*7Z7&7}L=+unLYw$y17px$ zbQ!5Aifx(raZr&}8TFzj@*>>unMujPq9@3~qUYHG5xYk+o>^o(GCRh$X@m&PX)cTT z;%LlOj$)})`mGq#f5p<<(?f26Rt$4(|6OoF#o#9Wr#s|kB-M`5C>P`Mb+JxnPsQ3A zJrx@uJ;@4vv7x$FVxIbNpH^%IJ6U1!q}X1w!SOHigwxt$w^&Iuz1U0grWih=fgkIY zKry;Pxp)#*#QwM98UL7uTitM0Op(lH#cM$Ii&vM^%Al}#1y;9I-+J{C^E8%@qWN!g zd>Kj>?~bD{M!Mt!$?)Q^b!spchxIoGWAVvAuJ~lr2^WuL9hboE4IXLTvh4B(+p;slYfIB7Ppj;*Hn95ax zl+#w0cquY%LYzw`(Y12PI2ud#LG6<2OVW@{$pJ>~k{E5+@cmS3$LLzAKQv`6O3p5b zYO_sMEQwTwfG@e_>#A7tBrAz3mb^{|mApV87ZRyr$+xTsRV5 zk?6a$xRj|GIXnAfIiKd!N~>2J0>{#_E3EX-tT)RAM+l2rrXF5nhIoZkZH9IIt|k_dRN53Zt(w`CYICGs@7h ze2p1pT7ns6Mo9BcY%Uheg&AdLhz7D7?zGm*#IRn3OE;jc%shuymf5IlWxE-AR%RD* z-DNVPjH$+D9{n%OU*}fP)J~C4(JDi20+GWQB~G2_UiTAIMTHo_xwNEH{aKbKtgC@(tyt6BjVJ91;QkyDH;kfe>158Nn=ziB?{w+-}M~!UvR; z6SGk6A5c<`{@B58gKMwJF^;v^xg0m;Fbk>>$w^*07{79#U?s8UhZGWEmG>pe<-Gu_ zyv+p`rC&ZZZwWf(vG}2t&uGu67+oH7T?eB@LMQ31%a_8~E?-WjPy`<;;A;~+CO=N7 zVuMZj2D;z3d=HOSz6~(!VT|nZw0Gq%n3JaR@7b<6Dj5C) zxHs9K)zCJ5iX=>_C8%ZTulbfdaI->v_5`j}kUU0(*6h8R3s-`;N4dfv-7mFGxL#oZ zWhd8_fW}K)3{V=h^Z~uu()Xf76_D{zkmm^rzY+3m7sz<|l~!S!lx|?@YL-sTA{O~i zzN=lUuuqH-3o#p#(O7|T2$aqy4YUe(4Mnf;MgTpApej7J6g{$?CNu7!q{JT@A0(Cn z0E4mv5D%wCxMVmQiuLwoT z@I;BsIYCk}6QYlbS>QX6jP%R!5rd#&NgVi$J>XRga=@!jc-76=tYVWy@XXk(VlN7% zVn^2RXbB~XvDppWiqicuRtMGT^6@NNnvx*B*_}YlgD#}tqMTXK9S0n~@n!pg7 zReWeEx&a6_prTCHg2{+rTQqjB!w?nXFc0>}VLXeg1@oQ5T5wv{a=b-7s)j;07*m6c z)hX#mU4 z@GOUZIB7&MmL4nDW;!Bx84hfNc1jWk@5HDLmKkj@XSBiVbiePCTVBpNaTt68Iu(3I z3?QT%d=)hdA#oUd+nz~yfIM5JG2#w`-w+BQS4u)wRPrR`&n}S5-^cw_1R*tYv2qSM z&4S96GPqQBMx#<0pi!xUiAE(P&IFB0^~TI28kHL17$&)&O05ZnkY#zlQcprg63U4{ z#&ne?6JnGFai$6J7yEYt5$aR9gb-F~g$Z$|;JTF%|8jvSgdHRZsd0tfUy{>vtbD?y zvI}8PiN;F{jZcID{#N!>gjM##c_AUJa#}(GQRVtLn&?_}sERFS2Yz5?D)%sMh#FO<1v1QxlNwbX#!5a=qso&}!JerN#s$qs z<)3(&SuVxsRh|#cuRK4ZAC$cE4n#dOCU3_|FRLEI!TnQxXeH^TE6e_=%G^Iy`K<02 z(AZKv2&VEKaHR4Ra}HDa0V=E^(0G}Zw5D*X0RJkVHFCX*AIb;A$W(!I4`_T7CmGp- z)8Hyt!wtaud$lSuZ>UlX9ag~tl52-mg3)1>nr4SpsM7nL@^C=a3L5sg>JtKcB0&-Yk!lFj0|uM#2iK~l zqS2gG*u`khE?{mOtX7$1RVxD!)yg=Gy9Uz>lT{5aCSWjJMzvNrnItfv#MIpI84bwl zYF)`ke9lj+)>9z$BBWkZtBI*EBJ;ay5yBYgQnkraXFQl#4YNllCW2YjV#zF({I512 z*AEN=t1);iNReR zp?>w8x)!pSBQhg?G~7U9LT1irDmiTTON-}8g<4jKsbni zp?a&aFP*BLTUMBQUcEgKt;ft;NOm=w4ap0HLh{-JRQMhOW0#$K?cKnB3C3pUmld** z7O2+F=Ao7w1+x%78W+;Rp2cX2tcPpU*i$Nu3mLiVTBxLC8ljc z&SK^e@_=#)xeZ+kxhbc3!d45ph_2$SQOyT`jn}+uA^-Ax+&v`&Jb#8)SUw_iLq6+T z&2sJlT*Esve!epmy+%gDt?>=IsF7AqQ=*F+u(wWKSbahHYvdE<=gY{n8c@I*T_~~| z<(0^4!18J}s@R#8C7kAj<1Dh+a}ovB=ws9$%=&}v+3<>S)`$7b5yz7~JjsU>yy;r2 z>C2x$PFXy?yiDnHaI1r#kDJ|8JlbrvXj(HA4I0}#o#LUI9YABvcBHXpD|At_sSAzH z{<`Ks@TjKxMigXQbG+`Ct0Me$%}9J*3Ut?;rfap{@o|Bg7hqLt%7(p~S3pY5E73K{ z_1J7;P-hc4Qg#>#AgpW0b)gtDL7>hs20ZBChL ze{avF5UgD#5rSs~a1-#fc7H-|VL|U`Lhlj%tIYgr53@q~s)NXIA|1A>i73XT<_bh^RJS^q|$g1m9BoxbByy zx-}T2E8MQLS%`e3m|2_aJ+)tmMzau}IuEBXbr8*pM%U@i+sG>A;bf%Fy#H3K!N@wh zR3CNtj8L6}_S}k*bsh^NF*@7~L0O|A2^m_~4HVV&H2GCGxxufx>Fjw(MBVRj)F2Uc zbE*#N=0^v0^VSDv8lN>DmLIdkUZis^(2$q=a)cr@WTxejqoLDZm=Y!r7wH|Y?^->5n z=%pT(^+ewF%6++qdUer5y)d(fdf`S7_1fDDNDsYH{D<@~SkYULdzFLzzZ#mSD6@ZuooA=aLS?21n?mP@CgDwVdoxy zNHO$wBEVS$FkWD!g?=yr*GDKTtf=pAFG;}lzrj(Bfa?b+!1Z$haQ$5NQVMW=1nvoh zmxF-o*8$-A^)0|HOu+5zr3EmwqW)X~Y-mM&YDN7~_A&b_=JJ+c>+FfH}?0{f0PJtE& z?zlk>RtMe!52fRe+kG#MhBGquMjf`mc zS@qD!3q3UQGBIj|R8S&}P$3^A)u;kMHL4(>_*qrl6;O@p8K4>yRAUQNw=aMKOB+pu zU>il4THokLLpdAGiM9*W1t@+%92+e+0Iwt9b@pJzwMJJH0-o(djdLa&C;4RGwQct{Whj9HJc>$zpP78>}EgVxFj9UH30A-pk_-f z07|F648SY)H0IFFi{rq5OIb9jsOHek>l!y?4&9uuwo07vXpU`SE&C@y)#hDr^s-hz zz})80lVUl*#pd$JLi17JV)G%qXEBep5Wi8^2oLP(2g6U$`TI^upJ58Q;Yk|C3F+R!M0y}?-T_HJVjNa5{ zSR-f;pSh7{u*F@-z9naV;qW2hel`#6bBY?`2G)g3dU5g+wIUy$5B-JblT01t6kdtl z+{6i-ZHZvhLZEHuaHJqro0gI)X_*QwTc&bgx>-Gz*|L~{Y0I((rY(iZ0NN61SOJ>g z36Q8E;WIbU*0hv0p_am7uh=tGd+fw)c}myX1VUHrcnL7`eJ$@8H$?qg{)@Yb)xRay zTiXQkF{oD1fL8dlgt0LTGHm6e`<2WN^>3AdOmCGA{A`ti_gvJ!RY6fk7Up3gxYw$T zOvIkDRURD1>mjvP^#xD}c+x7w!IKI~{abZH^D3q?h0pY%`nQ6sYBkb%rJ$8e3tLTO zhofDv!SHA`4a1|=Pl6HjpcN)PB`*^rZm}?uu&vhVTI=+NmuR(DP})kAwmMKc4~5E$ zTmM4btzbAyRw1-_LIZ+a<6NtT#|I*ppvFs)`2rdM0nGDl5oMD_`qn2VyV`;daxoms!LD+PhL^%E#)jpRKwzWw^^#ooU9rU%)%_slboMa`C z)du0}k58uzc8q!J!7-~J`h>P=%t6sMnbEXuHc`RPKos}1ws{Og(Y6%(ZOd#|+wUC= zZJ;8`wn%%GzGdo4_>6nhwYH&TU|XzWl)mK^dkze2y8*{GU28wb1_oxu4;a|?q;W$S z*!BYMCT3vUYpg^E*!Cfgr_MvIt$3HV^e%1TUCQQk&`6xyC5Ob@VP0RhniFqvLu;4O zMlQ4~X8NgiMWjJNHV9+`3lf;xu9C$W6l(24IPlvwz=19Ek-0F~WKUzeHdte^VjXtz-Tw)UuGLj_sgZTB~6#JaB&Q*7kLJ&PB2q}v;; z_Ydn?-I6TsY~t5Dlox3)Dc|-QC~L1-$`P3p;XazTN7krpHQ?4BmbdH~hf*#*8$RQ{ zsCWC)C{g@rA5190=KiMkp)7IX&q=dac{yYIaMllZ^tu&{WoO91NoNRC*wF*3Wcx_+ zy!{V^=@ok(D%k;xc^#lqo%r~_J-brLj!;XvAu8F?_lqjoF(oT`*44F+hjE;RN?PyP z=qNkGI&x=N$Md>h`Art{7eQXw>IB^_ zzsW210=U)b7aa3+tp{H{62a$|$*DEQ4dGU&O<&|zr=6_CyhNvcLV2gl#c_U!hwGAE zr$fZ|Q1n~MEw%uc?3}8pB|EE*0(AjehB|&h-x!Jymb%kBwEW+B56493o#0C6&AMNOI}Wi5BAt%{_0C7l2(0r>ptKsprSoID znaK>A4IZl)44rhrpzD&`=Akx0O17s9?N1ljpP<#&)=2QJONFfX!Mnln101^`ysMZN zW~NI+92eXw6Au+xF&47Us7lc3dUa0|AmVp@X7O*l6RG0NUgMsR@k6h`p3tZ{4)rBjB0mI$(tzdVbT|Whi zUB~jLCVx^9lQ&{>2pr~H7}nL3_9X(zf0TF4WtMlv7A;kd5E$j2s=Sp|-pnjVVgcno zs$6{~7Vx`b=A+ur7yDI_RCZmBD71=PMvg=+}B$Zvy@C;OTy-g~+UI&$3FS}3) z*>odYyUB#Mn;&X)^JEQ+>FA|fDjdH`FWoY+P!y({>~!pw18UPPhqbYMD&J~HDAie! zYboX$i2Kr$vLZMqonZsJwINpBnh-z}#}GH($knYc0YCw}MIs>BHf5wk0o8X1gNWHu zjLa!a*>uBe;I(eY1tR0CZW|m6e+u1GynD)C#lY{e;AbsfBW)KMy3WBH3LE+Dj?pTJrKI}TkI7Z9M2!W$!3`zF@V`4 zCi<;#vB$4O-@0d*Ib%V-M~q^L;j*zHUxB8$$3iMZ53KH0xZ@Rj5vI5YHsSZsb*)!A z*jsyuGQ~aqF>Z({?s4mjrnm>(U9WUZW%PLF2JZF@0C#(OnB48@F6ez?f7ni0rLQx0 zd!}&aZqKZst7le|yFE*=dS2XW@HOuCgqMX!uFvglgBs$@kC#fo0=8*)Qf(W@NpM#NDfe1p%@b2ghBl&x1aR!UkIXP0q2 zvU$YJ#(UoCh#l_5ZMD4|+iFp(H++8YY&H*jO+2peDYbfY@b=CT{hW7V0~i$cu8JcJ zwQ6D1xyv4t-h9%ycf*LT0r+eGV^Uyai!CXYf5e?ts9YOwvFPl^^6hhmv0PNAcN`nW zML$OdzV|cTuUfj;vTW7|>r#Dkp&8!tBcGT4}3$_`%&1}v-I4Lczq%?rOzf) zQ~JodbDy<$a1)93Y8{+4rO$qVRv&oN`W(}>zSE7lY@c&P=bWGeyV_UwT=w-O5KLj6 zfFwq-Z)#xI_Zwo@Hz%;``>hLh5NO{*IPiEkc5nCX188+HUi*&0Yd~e>^}PTt_JxtJ zmd;*}EN<&=3!l?Zak}p<;MMn5L{~V9zDW93{S^Wd8T9i+Nk7l%=Qr?|4kddagPJ%m z;D+e2UorOM6?++)*pGKZb!`AXRA;mE)nFQK^fGRUCiWYMyNM?_{YJ17Cpi74;P}Dj zp|lmRq}TdkDiGoYUiDi@()-Pg!_UvWXEB`fn10(#KiF>_3Ugx|^*c-ihDVnd+@1J2=qK^Zt3xZ3N-df*R=FyMi4OB7+iGu(}u zOJL3>X}~*Ha>sxi@Hrb!vp})~eMPe9WuT_})l3e_4*V7ky6t}$iwR^>00pSC&pJCv9T^lo+gmc#}$R3Cpzub_wt_^hBC5E!|tca)Zm!2gS zk9gHU?6a;763^C%ZK%p%^q{%q+n`_L z@DmGYj^~R({Y5t%c(6&K4s1E2BhG-C03~Ft2=qGkqh0+iYx|$U~H(*)@ zVFFR>A$ULNg{}>4#~5u;Jft@`iAawyJ`)CL82k+oGu{C|IE$_gIU$LM!O-AZYS0em zitXTck}N{YA!&`4L&`~PI2wo;lM^dhqz20nN!<-$>TZZ5br)qkO*LdP;h0o}&)jPa z-yxE=7{Vbr)~foClTR68a6fZs9%TK0(~KH^JZpvxg>O2?pm- zthCn3b`vK>aZ(5v7=zO(2)inKDTiWFedtg~gZrX?<6s>+oIt?Np_9PQp=xOaLLEAT zLLEAdRU%o%8a-g~&;?}iltmm2Lzm$=;a2`J{$OnD3}xd((s&;m?{sM#R2R4I<9LPu z1LgxS`eL^)=5Rk29N#cx-|7sd?1yEB?1$w|!5`%P;gbF8d_v#D3b0kgV>PQ)n;`iK zA#E6Rdt`FXtA|ww%wdg0GYGR5VX|p^2in7U{n*Hn4%T81wg_L`K**cmA__uHIRq;Gfu&^Np= zFdbgOv_Qkl5s%@ez_;N=T=)iTha)Tk)8%cw!|}xZ$Rwn7_+^554K@vb4GkE64b2Ln z_6UThj2jcNX+$~{{$db5A{#Iqk8v4{W{Sv-tf4jw`yM#xJbN1P|*zg-|Z#>-Ay`6nob%Mn43c%}p$#LW{U)4>Rg zq@L3VjLfTRqwg{^F|rhnayG}8ytR=b#A770=OZy|a#CChZDf7k5}}Q322@8jvp0+N z@Ur0p3);xB%J^YKjrBGIY&Ll@dDvYAJ!pPM#%%9qv8R7)GNZb_zjXr`#?8Frxe{l zN@6tfUZJn$O8}z-L=$BAjn0LlVMahXTGCvjndTbpl;)xy69V$jgy7&f*1o`#(Vf^e zEA&zo42h1G9M9-2gtoeC?PCI3jgzg*Z)gsJ!i%CB`i; zPft`>>+E009B}rpW4PF+%n@{FEH2Er6j#|;Q~6#uTw-QrIy30ZSP^p0HV~+qM~!XA zPW|els27g@&f*?BnyNW=I0zj(Q1=USe6x<#r{REKl{Z1ld}{137%gMrQNwP_%|EtM zi^eX+@fUDtPOVeC9=ow1Zf>-@Y5?P(` z9%$8!t;Q!qtMT|mq&7YkT9uP8VvNs1jK=JBZYMk2#}`Ar*$lPDkK@ZH#z&BE1oJya z$M}_|sLWBC=g#LRkWw038hbjV5M78z45J zE6AD9!60YCAZeJ%87=WO6Yxycgfm2If-X=F2owPmmrd6uR^U$tuy#T`p~i!?6Oca< z)=o_OCDy8(%fv#k1ru|k<^YMwz@~|C>SU7|wni}bz0IiKkTnpkvc{O7G0;KpL@H&% zC{A{rPVBC05y1?pClv->lWGI6NyQDkCSh^{mytFRwUhdw)&aw1Oya7|q+#MRz`sd9 zkaBc7=~r1m{G8A|u&-lca3}o(Tqm6}a5W;%NytP1SAHjzTKNFSxn;7EbyB>pOdBFKwC) z;&G~#kW{M<6pzK9OG7S)Q{7tsS0MnsaA5q%)ph(6KpVv#*W;Gf&Z z401%YlrdWv5flC1D3kr{5eopN3Qb9bdMR$iG1fX}Zz-MzIvMefItfG~F;Nd2Aj%h6 z{3WhSjIB-Mj${Y9v#cSPLLw`p(zqKq!Bi-08VV&!V+G?l$3O(<=VB%Jio|e;D#yVe zIYQar$nn4+a=hW|*zqcMOyCDh;5P^y$VI-v2?tD6R>jT#-rLDWzNp$XI8hABi9uy6v7-%!|E3WXCjviMj)HZbKwd&!LM`1q+17hSpA{WX~pbRYgFY zip*VfQ%12{HYJy*RwBhyVdTW}Pi+m|nL3yadSeM_YHyG{ zwY~1wEEca)&5U#PKmxFuI*C|;)l+|>9gqB$4qz(QvZ9S|R%=r^6P>!lG%HgP+o=Yy zN{Dsi5)RQId}3US#-0&$h7O{?V|_lK8J&;V34f!D0%mkkds~cl;2m9)B>)6#q!K2v z|IqP9w+5%8dja`qAa8Ig8lOKx@;4EuqNnKE4^2J5`)K6zqMtiQ716R~F#0|FLfX(N zsz5I>Nx+eqZ%sEDBM&FVq(ZMT{<>d_vi>elAjM$q9`1WT`NX03|B?0;;89%P+nekV z0vp_+#oY-|+}&M@1}Lt<9TExzC|N8d1W9m;6etcY3>0ahxO;GSDbDx4=g!RTlFvR|DYTMgBe_cK{V^Mv(1Kn z=F@jy00;jVlaBW{WzZ&~kgXyF;LL;4&g`l*Z;`3_ewUvT*GhAACq?YeVm6B3SxHKZ ztevtz$;kyu&YIS&k<$(`Ar2?}cjE=GaI+XhJ0%L3oI#O7Rj`3azs5B^GL-@yBiKpD z14U8=DtDTlaI)d1IHWl(wJFVMDar7(q$oel@dd*`I4!ID48gP#AaYs>nIT|>x~c+9 zep+LI4+dGru*!25W?Em?>nrmFtQV>3@pc`kt($;8Y?`6ho|I2iN%4bZ^K?bIC z@$&RBtAoFhA8e z!&mtEOnyFF{7l)3mI(WtA)})i#lg>vLLLo8nH!l}EoaissKM80;4>QFhJJ0v48r!!psbf);zu`6P^iJ9qidvpZlJ2M;PJF^yuo|(%edS(%W=$VyB^rUnm z-;k7A_a4rN2ujH~KCLDn-yn{mLvLmD% z(LaQ9aJeHdZYB_5v~G{+X2j9q+XUb`0$gVSoZMc~AAZ4V@!`^yWJJ|WrhP=@G3+Cv zlwlt(p2VG=X%p6xQAY%3a3Ur^^(xB<^N7G~vvl4Oa|v>l=|LlYCOHvHSp>3kvml5t zVjIz@EMtU@->9jL}MLF7Z#-?+OX86ihL*X?to4d&;gHxowL1-6(>&y*r0bd2$B>Q}->aQRd_U8CzgXT!(`C$q2b|wfT+qCI z6tk#t-eC|v@36BAnj91`?*-pLv-5pOOkUg+b2Te9>;T9G;a6$1^IHJze6?>HXyu48*0PTXGOh>R_ zwt;rRGU0YHxn1y!ZjTyl_^ky@8ZOu#%7ehcJL(Z%BUXrdg_~QDM07%2(+o7x`GFuhzqzX^x;e2% zHwN5jM1XE^d*Des_cVpu0dN1)L6MYa^l*ciXokKFT%wsLi(YKXC3=k^m+0TcV)9XS z(R*;=m@NYMn*hXOqEC_XQ_ikRhtUZ1J#`r2O_PlN2m}kgOau!N2un*@h(m5*l5)b- z!ptbrR1hr8Yav+Z4+IPSo!u0Ih1Fvr(1>7RYa(cGA?R)*!1>gs%`ZfhvhWXuAk>9` zqn3rUoed2Ho4!O4ev#}iJgD23uZ~Alr?TSDD|oquSKvSvB5+`U4b?2X#^FLmcQ^OY z#=OhIPb~PxD!9mt1;@_!ED0=&FxXwZpRw5@Y|5}N8i{&~5OICqJt3oyMPn3**!3o$ zUOvN-F1iek7F{;StBcr4bAY=DXB^|0{$nssqYqHaDuH(~CW#mSCOzk3r=SD2#j6xH zhM0?wf$7EErnLCH^boM+#R#sv=E=s9$ndDD1?I_4W>e9>LYUvx1 zcPT|joP*S5NIC#H=vjtnrtvLvNzbxoWNKMmpjlSea%hwOg7LF#PnHE(*e3@%O~wB% z6W=COE~9BJyDZ~Oh-kSiWMA$JN44CW6k0vBlwO_*VpyI|Sy5%6c!{4p?TF^jBreZ^ zyoP55Q8yTjEk}ClKL)01OuBq5*;qaV)GQxju`#)=x5VqqXDP{(EDRULAz9ISo3Lgg z`{f(SE18h>xXX95G$R%l6P#&WeuSPxuw8(JmQxniOba8;<+o9wtgm922Y)Po;hJJu z!T#EqVp);)-=snwgc=wN;h6b|UYejX!^DfSf0&scW%^G7Dye!j)d z`sas~6p*jf&>B~!Fk9owWE9oPL=e?VU-E8Q1fZ|XB6cfNEGzTl_f7&_xr_i;qR&xN zEGv(Ku$AY)&dQSpJ1cKV#n@9UEAK%FaJG_`!9#fU#seY6)rpmz!=6`X z!ZRj|SC_=i|Bx(RT^IPW*y$2hFGUraYV~S7^EAuVe^4}1;wWUj`XFnW z6M!_!)mKHSLjCH8pnmm3mszg<%;IY1Z%wkVnx)8bjlaNHQwcn-`A%7iIqS3r!y)#4 zZcW;lmswK>rPniyzowb0{{!n|D8eMB%t1kTYr24rIOYJ>^vAoYUX}58G}cjooi&)@ z1SZ0WQZUeKt=Wp}s1)17m1S!#(FWGsptO9#8)MRU?Q~p7NvxNdTx0~0ySC%eYU7ct zEL*z)PhCq4F&%I70`#?5F}(f&$2Dtpn9|yZF!Z$t#n3_eS|lg>b%#-}Jts}Ah2%-r zeze{rs+RZb9P(biEU+%MZeLf3M!zm2*MzOh!M=4J6Nc+lhX%;&N|`lP=Ou%zb*(_m zdhhyp-5nS9PCC0Y1uyeZ>$q)l-56GL-vO~M3@&Be8l=D1t$|gpo1;4d(}1ycn*nQ; zz&e0mCjhI53)Wr8cpZB7z%=SuKC1zf($^5g`a}S`J|4iXj|UrH_YP${+4!P1_*kD? zBmf}m(FFx|Qe6q;wEjCcIj!$zm1^r*YOqUM>w{5iF{QOWl+s!sRzW5=)^G93i(fl^ z!ka+FzwXENw{G7$nDY|I*(eqN3XbKG9IpH8UB2uI*b8hZ{+_>j$uG?Dn6vU560r)` zly2avNoQ|)r8=Aq#n{$1Q+kk9IHChbM12H9`GL`(m=u70x-L(&bMA&w2hg;5Z* z0U>GsRuII75WqFY&KtsX`^E&afqTPzydNQLWy5NsSsnTVx-&vQMCh#fKt9qr2#AdC zY<5@D7(R><>PEQDjRTDl#l|e8cVk)r+L+d&cZ#>7cO#Ov?({a1k?zK(qyPvvB1_x9 zF66LrEUsy=4-RN0J-2bOz>R|9H_l*j%RE>dJDWD{wP{nl#GLZs*M2^}hz2!jD0-GN zl*`6Pkjo}7kqesZ#%H=?z&LQXDT&BMzFn{h(cY%1-po^N%8&PdLE)Rqa5%oHCb5c` zHnjkEn_9@3WuRvh;^h7#2xxeK=UMFdMf%m5Wt(OZ{R$KPrU(=LWM{i(DqNNE{L+cK4qr;5@*?iP%C2K=gdQC(lCPPu|D zCn=FF2U+W&t7+LZ8`oQIf#2`X6%$(%5)LTbnw_Z70Fc1lTAfs&!?kOe=|bdgoLyiv z53e?1joFcHZO<*4ThTlAAK??;6kcxYMqEf09XLeKgh_1tXU8KbP9DYM>ZPqW@zm(Z z@aqMOnrnr(#pkcS4DUewwv7B`t{mQ06~By?O`P*KI>2p>2t1yw>EFf)_-!%)pBFbj zg;!)#-iCyxe&F8B6^dGC%n|m-m0J3WVV6P?IXP_0y(orauxN01#d6z41~nC_h6r}J&=># z+Y!BOkAm0gZ_&V+o$Y6Z&h3AI&h0C38(stPQ(47(oQ5xGn!#K7-$FoxLS$^d` z&zP!!&Fisl-w~gcgo_=%0HS^y1FIdr%37^~RV5VggXnhnL5&+zKrlPt`F7;Rn%c+I zi=t*nNnqXqA3L-Z*(X%QA47KWE%q8SR z+FG~oT)`M)$9Y`Wp^X6|2y(mQDTK2Fo^)7aWuFUo5W!C6)^~=W74AedGwc8&MV=Q6 zggYk_p$DEKw#s-OVZ+dN2!QTfUyy$o$irLj{4=}~XBl>4hu6->9{ZGbK4rnDR?9`H zU8!(!caUqJ(yrVnwJW##KBZlVX?L|mDc3%wU9DIO-*m)2q+Q)-`k@^e`;>Og#S`p? zb?sByb--<((k_PNyBlrqlli_@_5dH@OUwJRF~EW z3F?SChBbyv%(1PSrA|q{^1t2L2huKc)D`3xD=(Bz`?)KG>3hi z=tuJ6W;pza_?LYX`FtXi2z`~C*jed|;kj=fKA-v!pgt}&Lng;Ldg=^_-& zk9_x0yug0s4~F+lKraAaxIY()@6RX1(Vy-|3~=BV9_CEh{@H9q`)9!J z_y0t@w>s3~c!KrK`&YycBeTFSAdJi^|CwRr{uLf!WUMkj)+WR^yj;PeAb*3#y#KY_ zJ|`UyJ?OA>f$9e!y#qKEHaH$b4YiQ+05@+O$VhjliW&Y{ZLU)X*okT69 zgd+@zMVuLaW?|_!C_OK!EhH;`0Hb5f#bj0h8mp$ug}R^hbf7iaInWrgKF~Op7e0Uh zQoQhi@n7-6wNY;_$E^nzRp9*&MkojN_=GouE)QY|aIl?jKQS9U1`{**5Aoc=e#Rqj zFT@ZBhv2CZ&++F}o2{Z+n@!Q3R%wcZk*s2`kM}EaVQZ|Ufh68K$TR8=uGbww-eztH zwsmkf+T6i?GFNgPcSrHQNDtgxl@=$nU@hx__BN}U=PiQwhzsv zcn*aF!=dTKU|F3TszX1cjsHD{e=6{gFa8`l3G|272zqofhqj>dM4&%(hzN`YCx>FJ z_xH{BvTPg+w7pRO?^NddzcU%{|1K)zH&yTJTJM{i@3CzS4kcQ>SM!v>|2O6-1^?eG z`Cct(`5Sxi{=Uo9!{7V4Hu&$u6!_Q`ROH`J8X zHCEdr0*R&qj$#0D>;V;UtUInDh(eHFGdCL^<0hj3;ryI)f_{B@ncKCJ+=YY4U&3n7fC&~Uy&-g(_;)9j;SMpVHw8}J&9!;Pc4Ln zld$92(0&I|2FDLTxyRq}&spF(eh4Bt{x?O!#m>iXQd`Gwfzac(+|t!*(bI{nz1K==a1z-G22t-CGCc+)ivU9!S>p#7>uUgF7>ma3}V$kOO);aU9n* z=n0u4#Hx4k>xS+ae-&Ck@rtrI@r?XD;4{njRD|?SmVnexrWX@|2u~)|9TRL2&&k}B z`s9q_08Tcw-d8o>ca-;O0UCAeCx;mw{7EOVotyw!oSa|{8zymUCc$G-+XQQES({m{ z7=EAJii_*oIQ=Y%vy;-5o#b%xBq9_ylA-yNr%CY*p$H;9c^)9SOZ6mnw~5Pwot%n~ z%PG4(PbDD$8I7Gv1FBA?kp&R|eF|f@@mEpvRLuZctdbYE{0^zgHW(|^Nt0SCa%wi@ zb?P_rcPf&QB4aJ5J9U814;ahoK;0>f3MN=PSlNcuV!BiJb^GZeia?BHO#9Pqnz&VY@Yy!ud^q7}gNO!uVZa?!;j(<6gsZRse={X6|xl>zNcWlN!x0{|8Tp6Nyc0sl-8;X^ZL zl)K?OG<&h7Gw2XtOKGWiL$=CMve3uEg#uu+PeQi)VS>;#r8m%>Y;&8yalR z5fp;0Dt;D$!p|1d?N@YPW*yI#)g2)ZSrdbX@mFCnXSx39Y+n#}Rt3-SNoSG24f!2H zI4hyE(UYDXB4)++{mu8|g?L%Ic{W_PU+AZihGn>ZwQ1w3ieDt?ZB|uGmMYK(jH;}F zpzSQi)@oBer(VuJWih-ur{PKp`yWY`n0-0-EoFW#9pZ{}7?Vs|Xf;`IbM7~AbMCs7 z;KcknJ(d}sd&cL_3^N4g^S*!*hZ&y79LxE3Vut6lQd-hZ&gVt-^LY(31QF+v0-v;y zaB3QG;xNPWogtiVvNQZVCP__L>@3a?6Eg(U=cgI6Ils{|!}Cx6-3+ma<^o1UA-_X1 z7eq1_(m}l!Qg|4K8ed$HbqE*8z=ganYi$o}1s@k+5tA0OZXMRWg`38B(l54Mwqy@> zVF>hkVXUdw3s|Kpdc6=zy@p8acOgu-UyNsrH7=~6RxU&ldz6J;RzQLG3;S7LIuYoZ z3lh0k^nx@@zP`-YTrzY4Zd!5sLE!Q9!3*LgEIVN8?qX(Kx!retU(74ZGEw{@#)ji% zf!oCqiUe9KxdSj%DrV!q@H3NQIV)|Zl-vc80+E+Xqo znMKwzuXm{cip(=6Z7x+N$V;Vw|57PS*5;zcOFiUm7a+V8;DOL3e=J$Vl*y%`hCnU_ zD}hv?Y%gKj@6s-h!1L06DCyE}(&ZMkUphg$&q(A33&V-Kj;ReH-b*iqZdu58=>wco zE@Q#b6+0-tVwZ({pzcaKQfCrH2N1qR?S{Wnh;O7pUg1uMD<#a1>&o|h1ASb9_nq=G zFK+l<;<&mkYT?QXLkm}Asq&RgM7!2QC{Vzazre^9wKV`)tSgw+6fb(^f)EHjUE%K3 zs}jsyki~Xy$!T#0S=1kF5aP4YGBC_*FXLWTn)qa(W-LDRE83ngrKwMYn=#J3M;Qs1T z;mI;uwfVx>q>mfw&NgyM3Z5 zW;|SC%sA2;GX~_u4AULXWmemA|3p*FQm8lPXLB4BvjHV<iqqfy}JGSPH(6= zMm81190UI`$K21~k3o9)`WOb^F?V1vF%QHxW0;(cd1#)$e+}KWa~ZUMtvFbzJvlRE zX1In3OgiBhH%WP4!*t2DM;r-UYpZhW*M0z;Yd^@sf3R{5DFX#(v2+xp2=c_gbQCcv z+P*$ffxFJ#R@XzFqo8_#yS|vrZ20}0Y| zfOX@tEbY7T2%5X`fSS8;hxM`8sN=%iqV^XAmpZ>DYu*G z#)XiZRg~NiJl=%QckXd{2)8ItwoBX`hlt`Pm$lvuF`2(P19iy!%{k7|G6=Y-mb{{o z-b9{Qz1!%N?|a?cq1$i2=IIeP|H6eu62?YGFnRL|nY?)cOx}b~abpq^zez*7vTq=d1Am%xD49%oc`YYBM26-C}T*?Vgm8M`$Ojs*xEGn1L$ zk#+-RZCggy0Emv6%`gS`<%<9f!$6IE^nuoWrX1JHs;A^gn<6r4L}%@ zDlqEXJyCiipUtsa2%N73*_f1~jT_rzE*XyUwyf2@&9&OM-PUSvha`vtmOmo|2E!x? zB9%2XxZ5}B@orN^%b>d3T%~+Rtx|?u?l>qH*vp;dRoGbWq}A>B)6gXDju!f=-v(C z-=oLdm`%6e!x5tPd*wm?z49RcUM>Uny_O2Lr!fQRJwzNp%522F?Wzm}4*&o4b01Zd zd+!_tc<(4^yLZ&;=B60hyZ4erexbel@u`TGU%k}AAk z%sEz?{C)LpVW{^$bs_H>ID@F)`^|OxgV!7i-JgSNk-L8H|3dQab8hKAjNVPZ?ARap z@{ySKgQVc#K~ht?4~puJ*<6(JpqeG!2OUtFru_hpRVLB?OE?eK5c`8A1ii#1oNdaq zAHcL{bC7SC_F9_u12OFfrfEO;2;n@;L@*D%0Oq0BB&0(zbkD55(ekh$yuri#@;*11 zd?-HGGGgm6G>GXTQkhRPv-^GsJP(^eOc*h$QQpH20--G-&_jDPgNHq!n}=g09wxR? zQg#>`=fgg_BYcsC4WfBC6(EiCxgO5O??YZ32tSNwK~~-)m3Q)1(iac65)Qn$8ypKD z^N|l_*~Y``EOwT~Ja~Evp3*Z8c*ND^kE)qOKB_`Ik1C+nqhcPwLF6L@I_Lu%(Rd!U z1ccA_U~#19o>j5MoAgRd z2=@34gY&t)D&eL<75>SCKh0qo&)NXRHCpYn?zl$6GLU>i+8ug-whWql7HW=1R95ruaI>wc<{kz8FUITk_gRuvg!g!{;2Qp54r^{Xh~dS;xV(oHu)mPj|6&h*okG&C zA^^+y^aXMrb9;fs7Y|@1I7XExdq9jY7!AEt-=6|^FTD(sUZym}143S6Oz`rs#*Gp$ z^XZQHfh>se?%ZA+rN0y|(4Jm4XM1|tm~ZRxt))6Hd4JgnHTlW#mqYlDT6q~Ql7QS^ zhVms?d-;nY33+CJxkt__e0d2!W8iEri&Y7l>(I)}>yvoCz?txG)J*%U_;~m#{-i({ z=BpgxB_&Vw3Z3)ZLgIX0mErp`@?il`@~RFgaj6n1418DsEWK*Q7hvgCPvUyj7472{ z`g6DTAv6201{2=kNr7lsuV(3v1vxP5Uy@>dwGig`ibK~|YKJq?EhAJg`D&ZURt^w- zbxgOvNnoVmUOgwg=jJNW*Qr^dxNd)q{L$+IvBw2io`VSAoY#L{z++tCdimpJ!f49N zH7-E7^t$O-odbf`waDdbZo&m7M^qlSlZ;$Y%ppO37Hf)Py8? zbg1bc#CCIgiDv(4$x8n;fc*YxU`^wPR`8ZV^gmswI{^Hrw*u&*QjJU_9R&T)BwU{r z=$i!18i=h(f{|l+^9}L5NdY`>Qn+HY3U-?vUEdo75Ay@T)tmB$vA=0VI6!A-gCqaE z+JyBH(|m&r-`qkljW^v`tUhi=;&SbmhuysiVHudzn{Zguo8_jXd?Uvmzgfs4b6Lb{ zZLqL6n`mJw(fj5%{JtmaVBY+xI~FEM0KU_P&&m_}N-X4U^-?}ZuHTKKDeP+;QMaIUVobOVQFR_ky*+Atxc5vm) z{qpbpRW$&8SI%V)Ru&kfzN-%|-!%rk@7kMEf7h1!fA>A)_O1!xyG#9DZ;`r$A@7Ex z#0z7D_inn>3L&x(%WBM&@4MgS?KX(x9makXvIP~CNmSG(3`t)o=G|dK)bGxkNnf^v z_wn(V4(okd!g`+)^u0%*D-yf0#QKkxIi5+wh=f{X6=bZ;`uj!1>f)<{N*cf4L25-? z@Bd)UKSJxF0{J+>H)aJkp9mZSuS!ZD>OH%H_t#yRmZ8-nsC)k!73TuN2X6y{;hER~ zld!x0fU*9Etmy7B&_y@NqS;v#+it6{^7Nq`iy(M*lPkpXp^?Z>rd2** zgz#a!oPqn{2i>t`6qNE|xKtj@%KbblOJn=s#4|Rw4|B}3Z$E5gRdysF{)7>JI0aRF zI0aRF_?u;k)6l=zhgw6uQuh9RxCaH!VN?6a9Y-G(3-C!FOA#ijesm-EBgp-@*ihWZ zzNGVG7l`v?7neBM&{%(}&}12;(ab)=WDUiA+yx3hZXt!{*|#5$uo3~DkGqk5ybu09 za?A0@_olEvz7;xNL0%u95W3YIK>eo#E@SL>^{u}=~>LYtp93Z!+Q?h|sdZq${>lfAeu zaL!fVJL8WX4-y*>B*_1q9#5?x|8oia z8js@@W~KmtpIft9tZe(|Ap{UlHH*&__~%if6Xj?d;Qt((}ay}yoxIC*%6Zqgs zcs;g+&)9YFc_(81e$o=a=I4WC^YeaI*IC^X7>i%T6=RDR0#m}ecPV)Xjr%jwOv@*# zr_mc|zn`DMbU(jCbNr0JdHH5&@G}mkT6sG7uDj`S-H~QXqHA8gk;>O>X_DfP|8@L< z*Ir(@2X5-BoRfPk8oXu;K&{lu2sB%df_S19P2Rv=5b0ss)3uVfaTSYuz<=KJG!N< zA3`RY*TAg!Ga0D8M%~08Oyp58nimG!D^D9+iHtTaM+<0PGguA{P?Zalas}K;6ajjz z&^3Ea3eamEp&ueKa3zYdTf$hZGd(r0C%WccP5A)L>n)jkYlNU0GTcgl-WlRfMk48= zdDjC!-s3akkNTcD>_PJmfc(8%v${FQ1{S?(U#~;vGE1j<&yWnBlwQcvSY+c_dcBmM zMKyaL1#f;B*K6MAl^(ofK&p3)bE5PUn)fHvPHDDgnsK<;hdl)o+ zcZR5nc0_GoRD4b~*&9HH_Lh*m9bLUh-i{sDFx_XdByaDoYuaCwygiV$euCufgHVg6 zYe(aaD-EpK*P)h=A$e|h(d^qz$=i>kHcc1vz;UL5DS0h1#Hb~=#HeL~7`1O$(@p4F z5fS506r%G@PaU7sqUkCgO$nxn3#*k4n6KHWi^Pk%_y2V)nJ zp3fkWp2vCa()@jbbS?f{O3!B!Yb^msK6Dy1LZ6*qk)F?=sFl&+$OkJ2HJ=j}NB2yQ zFl`XmTm*2%&jDQVD*{*iJO-}#KYT@c@rR-mlDv%GwD`fm6+hU-6@QL_EB=zNOE3OO zCB66;SoeZ+ijrRZN2u#5y?-b@UmIxiO#tcnA}b`)^Ys(w>Eo_hk)Ce`T}zPw=}pZS z_T*c_7SA^oBj8F<+Q5|nyLI9;_yki>>bij|K{#+F2sd#h_{GG9j7D7D zD-AxuL#46=I5tB|@WL6YRF;qm@l@G6sw`nTNHgKLro<9rGD@VGuwZa;N-SXsU32_S zi6yKAE)uo@7YUJ<6p1Aq{1u5M9E(yH3@#G>1WFSAWO9)Zk)22^A(BsDkyt`356}{R zAg)^mE=Sg{NX+paD4c5Ga#RK`M`aV2<9h>_15M;>5_5zri8&Uq?gFP%Nz8#r`wNM^ zr^Fn4Au-3Fro^VW`4ERXAQar%8H5^TX&-A{ajm89l>8 z=|*o6i(d|4@ylak@hfUz@hk0|PAq;^aRm{JUwuWsUo&9wYv!C`VCi9EL4q?5EVl(q z2(hST`)EskvrR1XL-z=lrFeK&u&gz(Y$le?&Y4O`et!{*M-=cx0AC^C>lXQ#br2!> zy_o70z#nxj(FdAUqWDmCBF1rv9Dv1!n5gVm%qmfJy!_Kpbs}sc(GoQ_Rh?)sYO^6G znkuTce;IqSaU?pSxJZO)5iQYq=PboVA`BS5;Nls%NNfieiQ}7GBu-{+olQ^FOoY)_L6Z@ONYT}jzj6N(eMmZ9!CT4&CFTrZ!)mc&ccLH9=NG&mTVB(Lp zz6QJOw8Xba)**|m(CcbOEdv3ma>*Rr8S`rOcX)>3j5}+ihW|mCSz$lrd zxwDLv?10x%WG+ch#axp9pe0HF&}+)Vl3?l0avY4KB|)@5ZQMkjByU9f)5g(~BXS6y zWgt1pA7m!UN&;9pRTlV!XXRXkmSn$0!7-D9vrh3nNnjL7(+CAdOG?6)l;nkTw$fYD z1f;;-`XZ_mWm3*xX-RXT6G@sCMJBpUOKMoPp(Q&*(@R5WJRU*C3x35zOV&mS zJ6R{-NY=@;q-2v&la`c>-4&ZlvNePS=D#xRNp>01O?J(cZZc$6r3of`?#w~`CPNcU zzMtziwd5T2r5uDC4(he!d1CM<8=qODP!&TYFA1WOmy|R0SVqhnVoUymdoG+CA&}pJ zEV}+r=jVazpq zMN-H;MLL8dDN>?3$9yTikzg)&tZ)P=W-Y}g+FFY56e%gn@liQvxU%*X9NXd}Dq4zZ zxS`w)TQ^qBToa5~bFHPgPPF@omLqvVi?t;f$ei&+>jed+cx$9#v=skP_9ptY_cE8+j}JY#=nyNk3se)0{Y~fqsUH`&LBHg@mOTv zCE2NJfb3KaL3S!+r-bZOTwr-RcvvjDQ?*5@jkJtZofWoJy?`xMFK48IjWIukl#ATKSFKSEyGPQu0)LoTwB7VCnvv;)m@BgNulCkE3( zk{Plfr>&)pAc}3!b=qadJcgDQX`}5C5Len?1MrpOkoFRCq}^}5|IK`lWw?0Xkxd}& zd0k6a)eueE#}rN4TjcUqEYYOHNF|nN(xp|d-%f5@!5-2hUAR5MvK)8ANZ$wSrsrTj{SZhheSg9Lr|EI{QQU@+emcwjWR{y1 zw_&9J1p-ZHaGzd6q4Z2YrFZ+dmth#`&jZ$%hLQfh;yyk0>uBkpncQbU_!G-8uu`Tz zu=(Tq&V34B%fP-nLrJUsaY|jw@I4=X&nbK@!w@xvuVp}2x9zbc4KhsP`$^8ZD*2iL zy505|t}eqJc&iLA@aqE%Q}x8sF&Mq!4Otq_N%d>oC zn0m%~V#;Wx84(uld;kN;h(sjvsGMrlGIj%oDuyyM27$qhK@thF!a`Okj+jz+;X0o|v`OBzoFH>rY zFfZPfaKTZ_ztfjTcW z`HH7hsu$H3ev{^sDT3yb39~6XfAa~y0dvV5j4MRf@*QNKHdmQT<_*RJPU~oyce%_3 zzmBuu`~a@Q(X}jg{`zuSN6V6l020G^vcSf(6hT*b(lnkd zwyc4Cy>juD9hR8AFBfxZ*%2h|`37~eXIFJde0G0>`0VAW=A16> zHTlkdLKOuE*)e$qzCTkl*+FHFdm4$&k=Yu5INeh5MbsA3hj~ib!g&IF5+-1sg?uc|6>PjDaY@uS`LPn1M~2E z;z7kZE>jda{?WCZelXx@0-$fmiBuYjf~cGr%j(L1<;(_3a%PkDXDlPl)@)jW8tc!1 zF=r)V9E{{_Oh$6nXX%=RV~Gut&enAAh1_ed37CJ^a`CuKE!R|BA9%#1mTRA3E4hwSgSpTJi3W2$rIvCd z$P+uy?WX|C!*49r<>s7W?(Cs~s;|jioNwU&a+d{Ex<|u=)B>;Y^)@=;-0H)_P+o2% zv&86fBNi4HBhR$leQh|*K+7G1WM^)quXe|%z$!PxxZG1HC^?1~lF2>GO)@-yS88av z!{}Xd&nEzM_Pb-ib?(*ZHU`pn<=#l>f5747-bsjC2@wt~_wFwo4kVoWA}lHQ#XI=3 zA2RrcfKVsT62k)WWQ7Rws4oOV19=cE?fE9Y7!F!fp6*OFO-$_)h3djVL>>-r@?aIb zmS++Yy-awlUbx+c`Goyi-_g%60r1h+^@6+m4C0%MMp_Z={n@qmKsGQI33%xTC*ut*z)g~0soUajSzJ{BY z;P)+n8EK}Kr|EXvghkTM^Nql@!5}Cf7hq}m#u2jH0xaez33)jo1CD5}P1phkH2JpE zY318Zk@|$+MBi5+JFdLCRwOMWlX>`K#{(3V2NM4lXpX0@__sh{T=8##AXbUb=1^dk zcy=Hv5UM-=!r2#E0pw;Rj+JLxfi<@JxZ8zmpNe&&%6a9)ufsU1K`U^8wJ?S&$HrM8 zhQGv(6u1jk3)~gI3d=0;hHq@(FN#b1giph}0(!xOxRSU>3k5S!UIo(tML}fL|MCdK z3uc806|5j7aso}koF3WYf;EIE$h9Cw#RvO?r-De_MEx*Xa+(EO>004$;}dN+TzzcX z6wC&oivR-!`wmrY$Ax+vI;0g85n7!H>AD6bPVP)wq9ZAYb9=Rd zuPvsY8B7%dCNPzk##Sf+t`*V&7efB{P!K3DgeXdwDTMqsm=V1c5)&^(6EEau;+)Td znhGH>JropA)MKitO<1_ZmxWqcf+*CH)jOJ91_p)Jx$tde{jH{_FZ37Rz$+9w2F94%|I*VN$nOa9E3ACQh5RQpXH+hX?&V-g zH0Qz&+}wk+E}Wd?0Gw;AD$QBuaSEgH6+Xq2QMAJOEy@ZP1MtGdOv(x)1{cZ-BS!ld z$_jTPWrbU@G7hms&{HowgKdgQ*(6rZhj+{PXLno_vGEpG!6s~|@HOIvp%*s8N_nOg z@uDXw;!96bBniv-gx`WEDe^6@Y`W(E2$trYhCg;ZKu0YPBrjN`9G)7U1n=lq#;X-? zV$fo{^A^izV`{g4U6!9j_ZxC702!$ zn{$S;h@yVR1F?vrDcmihX#O}YqG)kep+yv}gsUzrVzFrvMeFO1WB3k@Ry2V07i|L? ziZK3rRaN? zMHKVZwPHUT7E!D?p%u#y`ikXu(PvmhF?ic!4@?c47EugA#j&))UaET{Vi?^D1P_YCb%-PT-Y!!3T>WXKi)fLY{8hpaJMepM~aIofvECCC=9ZMh_6I2i;v_pmqBL5Bd+Esq5Kp}pw~JP3gMJcW8`QV zBbPXAT5Sn*=<5ANF^k1EsiT#+Mw2UnhF0Q@ds3#vJ1C%}7jTqxm@rDlGhmcVXTX30 zN@l_JkIcrF%)|Gfyktu%zGPFemy$)Gl#)f{JQz5Fk~L81cXxZic`z1dss)woA@w`3 zVh5Mue6QIwj7dt)1ivNWh)#r}8I@dvn|VYkGjk>X;>$ny(gF%(8k0?wFqOpr+k}l| zFI4g>N2Mj73O<~vrIozxQI&)CQr@_HJW|r7d_h_%U(b|usXTm`M^e(IY9L<>UsI}4 z75>SCKP@4wQte<8SrQOvFI<7{jl9$-5>aXxh$uC{g9vD%)C6dvlv6Z;flsN)y5rO_ zXuH&WYGM+%h-sxZ;<_fmKq(B2PK2@`MrfywRmROJ$;Fhy0JqdDSR&TWsq9;+e?U#? ze9W)W$A7N*zrp)OAnEkV+m%2fI-j~c6@4Kru)Lq z2+Ya4R%RRaW^1KqLnNi6Op%n1G(=Jw9W_M4BPF%cTTzWU>{jLlS$XeMX z09-bq8(^#$UU@p~tihC(jA3%BEW7~>LBV2ZU$(Gwneh=_ttnSLzUPq z3SmHHC&F;cPJtDboo-rD*`Ew6DvK1eBv2vcvdhtGI#qP!Q8i#*CFXWjA% zpoH=XT=OAn*P~V*$x(6Jt3r3!Z0ld6?}BQ!Jf3`~ymzyH^sR04Bc z@cLi&q_SC6$ZiOyf(-2|lz?z5P`kxSH6oC4wJv$%Y@jMST_9q9s;@`#4=g zzJP!}uwr{Rdp@(O2xlcK4rG+`<5LK%;#^+;CG?7O|4rx>_W;Ho5207w6V#H^conw@ z7b_ujU~*jaPpD4fh9SF6(peLEEVc*520P@`ZO>A00aLoNnODTP`P4DR@LAYW#k0oQ zQ(DD))B&M9h3and=t{XJ z1!8DjsTv-SKu4|Iccm8Os#1LxsPA&$j5^>>Ds`uOf%Yr)qxP@ihC$i97~G&Y7Vq`7 zD5KJB#+a4FiTi}#MT}V)&8KozU2C=%p`&vS{=md5w=*6{j9Hm`zN{Ft@_;yF%*sKm z!hoVOGT4>FG0QTJVqo5=GEza8o)5y!Dl%4iIcTW7kk2f?$+2$bKg9W6#~r3*FK2-z zRi+Dm9nyleFdtm`CatsbGhDCTBbF-O0{0W)BGh(+3)fX80bo}#&pXtrU=HbWFkn}a zb}&f-gen-^S9xYQkSa9@tx9=_ze;(R_ygkE;=$mn3Anf?0>Jn?XZTr-!VVzYiKaH-fdL{yt23MV}qIxbf+^Al{1C4w}&xQ|K7tGp!Dhk#GpRg%4Ne3Ct}6wPPoA8BzVbV^Ck;! zW`d9EvvkMR@d<3mGgWuu>tQR;fX(VF_-3_w1DRGwXje;P# z2Me7m%!s?jE|#)1PBrk@R;|W4qPr%NCpz?dCb}m?r()k4?{ux^cY>~_uYs;+QbC7G zHFK&;JP%B(S%vR~h?;dkM9n&;CDcUR{sjqUv|CdGlA66)zPGErwzl)Dt6EJsAIcUy z*W64=*8CNctO@&K#EJJ3ak>vEYGII4{~pe9(`t30 zQWaMIoPukbyGhiVM@DKzfRS2oKyHi>)hZ~ZmO2}n=+^3v>-`hb25RkbDW%q7U90_v zH{;{l80TN_lmKOGhp4htMeTV6%!f^4uo*y zuS67UotvasHLW_Yb*=6gvGuy9t=EOE-`K92R$b1>)XnK?T6J3xk%!2nY1QR8yRI5% zLkV@!vm5B@s*$z~E9mtGdI#xQTDv8$We&l=6TD^E6qFy{xYxPpa zBEf80^@>p<_42X2>-&;ZT5Hm@>Y+_iwrE=QMoPh<5M90g1ZVZ^Xg(mN-Xbv~xGMfY zI|GIP-OeEP`YF)3>a%gxXXC1m01CFs##JAUtNvvp;Z}bc@z-bQUw^*K2N)yX`oFtO z*c5e}upw*s%_AbL|H%?j0|$^b@NsLY#>llnGL`|F223>?PQqj4+MqaU9S}h` zD2I4i{WeFg4XP1vMK{3zGIDLuLCPsu-H5cCYvkGh!%WkUKAX>@98j^A@t^wS}uHf$)(lJ$`^7L*O!iLVnk+;E_-HEL@lof}RRaHAp3 zhNE4U!srfyX^1fH%2Y&n4J8CcgxBy0ATq*hc$=V$1C%#@yjJ58gajNiH++q1OS17D zEVbcl=$Mc0`XsdF#lv{6-*BU{Fb|R0zl4c0LTHo;G&agKDG)(_qjEsd2ti+M+}CCR z*{Bi8p$Hmv0nSGKfTK|l5h%snXc!{B?MzQK!ZAErqq#D=XT9~TCq)prG&#<-`;`%)7tEvpAKId8)XEi_lz?bI{zc>SPS9$xTAMX)e`hiatebuqlT0O*8$Mpqgg-H$gS6 z4j9!v1l6>9@K}zko0g%vn-&DYz~s0;`9H_i0Oq)VB(8BaI5pg)u|yV)yD0|i;$50< z6hy1h;+n!oUCv@9lhjbS=|OqF8&YVxJ63CL`p9Ul&1|fT*4m8zgRQk$5n@1VZPox+ z6~(2|TALxtl-Am;0a{M8D&Ufj9&D7>+N`nb_y3`_HtPo(oAr~{+AP%7TAR&hYi))g z3a!;AygA0)&Hlo5QP-MtYMJ9I{Ab6bC&nXwh(>D$4`YtHZA?O{Ipt<>pUtN+CD)u= zE1R32xYwE|qokTAioqZF)rZ}z9vCgAc@|fQ(!3~scQ*RX=4C*2^D?e@q&bF654)*G zs^VXS`kbC>-qVZt`iC7w+Js0ZNI{?Q7T~Bk97yx!y4IpMIYM$(anu|hMjlBXp*dF? zrwKssL_*KR$zJoztRd{(Ai5W3%-H;yu=fZ$ZjPbzqZ;n)wSbc0ED*E5^d%2DZ*ZF!QL&f(}|aDd5kFj zA_^mdX?a3v)QVtYqfW@4v*ks$#g+(59-s0FzXt_=zXR89U2FY2bmUyA)c5^GwaP%zw`zt92^SQk z=m+7K3};($9aO7+1lOt?Z@b8CM?h}X#sjkDF)dsK8-#0u$5yUZQ=$7-7~wr_5Yk9= z&-0G7R^eIk=L-M)ngxHNk;G{g4GFh`kA8|XVYOC^S^CROT{yl}Yqf`k_pmS`Y*lz4 z3xBb9kz1}?ONA$_@Prlan-!i5^e^{Xu|{s7Xq^NCZk@_B_|_OpJ#7G@T4&*!2W*`p z*w*=2NSzaR4R;6=RiScHNcK;)u7($(hTCgh52n|;p6tS9h2Ca`q3#{#|8*BG-DK-o z%8#_3OAK?(jYh3EP-h-~XFq(%eVAa|AY6!9I)0`JMk*6*3uh`1#B;X&g(etG3xPef z{SCij&+@lD$SMhFkZsjByI?kLuhDGUUWVDUJ*zvO544N~GHm-y46+eRoW=E$2H7q# zu5aNBRt4ZNG5Y*=nIer75!#g{h&*`IUWyLJ-AJ3Je4FCC9fRj~qfstKPJ9O9c1Te? zAL!0IPJD*twOc^oznE>O-D;BBZUtIsJA?u+@UOog4t^aj21Zr zEEb5ngjdmhG}1to~-P+iHo1KWRxda~OY^*eN9 zeOOS3z5pF;$<0XKhu@XC(heb6QDPHJuES4|NrxGxOgc<8WYQrzfHH{|r_@1bA+@O! zg6n|5Uj*0TloXPU=p8U8*%4Vd5n4wsbm*8)VtrKT2vxk?T^u(^c6Y=9%srF6%J!vfO5Rv zj>WuR42UeLiM+8DPBArIpofsP5LZ`!6~+p|cU)#Dt|K-MLvo8p6V?!d)9fQ$Vh5iZ1qUG~9qI@jQj9S<-tln2tw|G=eF zv4gZ9Apb7=I7aTA5LXg&W(2D3oXiY`J0n%`&som2bmnw==W=jJoy)5|MfLTe2LqhgoBtcdp8rIHlGd8AsG5=3LQ-~UbnLV#Tw;~FPf zx-JNR3@W>HhZwv3fZwJVjVxUkwBvs`cZ;a$3#ZHVCHL?G^Bw=Z5%F{hClqv278C~l zBy=&MSX`^Xzc!w4lDEI{txxzv7+9BsxQ^*skL@(D3Ch5_+&3P`X38#Z<2haH%GILd zjWaT}t|eG4)@I7CO$fjTR@3!+xSp=VVO(9?QjT5Qfw!*htO-I1?z@hM$#os2JKk0Q zi4%}#W{#p)?HZ(*3AnyO~JU~MBUDV z{2=QKx)ng7@30ar8-j!g1_|9tMsj@tq}Ht}!R5tG8+JF{`r;anctWwauaw^I=35VqxRPjI~j`3=n&r`vn^76$5dPsVyg-90<5JnkK3_o@Wn zy`q>+_u_Dd-SeUJUWs&Ax3tuCYbJw$#p zyXwH=V|oVle`Ewj8-O!l`8)goKS2SMJ&aRodW;9k9^*|D?BOIzf}2fnFu@*CxcQn1 z`h-71qwBE?*FIhAm4U5it!i{Vpk#R8C^>3nGe688y$PkqF}aXQR&zL zwr3N9EsmS6y#A|W@9FvVEZ5%iA5Rj-OkN%xd(WA&#l2?;8R|6&chg5qdCkB`GVv~>;dh^H7d#}v6a_U-Nd>p_Q8m08!3++W7h~9fOj8pHu zTCfoH-m4R?Zti;THIRJt>IVhkh;hf~rS5v~H3E9?H3oX`HQv;FFHE?6-VeR^n(5Me zuV`S%Cm5dM%^Ua_1fXgh)$5)37$E44QS9fX90T>vhyihL9&FV+tL|sxF1+3aSYguR zSSu!aSHR1?MtI!27R1%NmT6PHdlDk-p?46k|FWsxL0=0NX;Zz|@ba*!-fP6BdW*y9 z9R_m&B0t;Wf3qog5J2*?-T7~uf?Mi+NZ0x-!V*Ip)X@7hxjSuf_mJFCHg9CAAOv>d znNvpe(g%s^&r79xpF$95pIj8E@d;I}PkFut)IQZ*m5pK8S|e8NBYkThe0@jj)6^Bp z)KxuHpP__cT4bBB@)Ae%K|>0^GhS?jZw zHNjM$Juds{a}@TI!;2A0pYwdL__-&rV@Oy`tTxsMnWoQ6^P*xJ7i+FI#zxk+h-zeg zO9DjSl4c|83+MfLzsV9Cr8F{pkx1){dS>%ec$MQ_Jmd=W7?u$2D5GTONy8IAe(-<0=SDW z9z=_0TEBeknETZrO}_?sMXr#aKj2Y!_qN!j2=xY1DMX4+pngn_~H@Lfiw>B@72~37Efey1wO6Nw; zGR%er=7uZ-ON%Ta^T3iMA+Q)oz!^0l!4d{o4XjDqlh0*ofmnbtFteRUm;|;4Gvf%R zkMWH#E$~OyrMv^9aIJ(|H<@Y;JRvAlhYg#x@iLuG7V`bHaalSu+f1(nl?Hxl67gL12^H)-EDN>T}pc3O;OmulaSj$*yEQr zI`Eu8__~b_d;vBGArqSKr~kVl58kZ|dGMc* z;^03`Lmqsc#DUErewHB*Df91!TmhOH(o@$)cBPjeS`}AgSP`>R{3@9?v?(-0FFzE9 zIJCEimmfL`<~y{n?w8=9yO$q21#Mzz7z8^M{3VQ!HZe3}>|D<_0klKs>)HsrnD)@+ zhG`GoE~X9NHuM-xf~Gwbz3R}{?xsB~BTai)dNJ)`T*x<+ovXY11%zRV1;W=&dsrTr z_ApKd4QmDa9#+z{-(dwncMt?Qth(WdIpQCtHlo7*hjlmKbBcobPkF!Is=v&9zsqI+ z!w%@$@b`xO56=e84bLX=9!MQtnxq2Z@H&k5CNy!yHEIn(ZM^EDls>#StM(S9v+6{% zDuNEfdkv5IccsI7jYtT#N95z53{cmIlu*|Q2u##9B2DlZPj#^?9+918GMZ&_1=We8 zOfi-zXqG9_z_SRnKB63qt%D(k5nl0(HBRGUpvyYRspWWz}rd^j{j;$>Gpnx0&Ct`pc ztqehYzvtpaD5F5;B)Kup3 zM$IBjpYW%Md`B(9g_(#ki_nuh$Kekm-%+quc_6vGQ77@#NGssoP5he7&3>Gn8=VNh zj89x53cxctRc~~90`RGi0y%NzN4R>DZy6PjmI!ThF%W`fX?}@08LVc$)M#jQC$cq~ z=OK)Corf?v6WD@F8a)nGDp_pJIwSHM4PTR36P1h(XT@+)2~lk28<@uEYod~yP{|lC zJj?taDjAc?0y*YefE@F!sgg03_{Jnbv}meiOmoschVw0B>bX?HQwc!(n1QHR33f7O z1a6W8f-$VazSvo3sh=@3sGl)&h`=ZO8T1o`<{H#M*TUOD(9T)-1N{VbG9JjtBnbVQ zsUJ5T1R=8)-Y$846d#3aGIVfDbb!%g&`-Kw66Vx`7LeeeNMH?uRU}zrDT70lAhih` z6bGSkCfNru24Th|vlhZf zw_3(Q4#DfmvY2D=Hdfqb9+3S1D7(&ps*a|8fqM|~+B?REy`r&4QS7}NH4(eUUSeWm zif`-+2v|_A*if+%%c}{NSaNK!#I9Hq3wDzjdoSPf%${@Zy@GG@{n!Kd?9S}W?Ck99 zY&qjFuw_nwK*yb?KrIz8*WPZJwaSHE{6I?B8GCd(a z71N4JiO5e_O{motm8L#SIOqXo=);7wBv650Cg5fB=IIG9nFCQx^ua%=_2H%=n~8-f zn~8YwmyE%}JyIw< z%S~bxVGJkrWA&4Ivv@Zaw~Qf+kD~!rVHotTNzOn#cJQ$p?$M+Kc*B$C>y8}jV3{T@ zPb-=+X(P-0*DUi>TG5P22hm8A)VT{dQ6MRRvPp+>! zaxy?axudwwpnURRX&X>H`8y<-eOKgSvTQn;yh7S&@_e|?lQ9tF^!N3$A{WGfc67Ba zh4a?B&g3N4xLX|F8~ATCaPY#R$+*DTj9g4c#?)nYlJQ2jPf3pxfBra9rXoaB=x|O! zTqnnQcWXbT6!13m){^jg(%B6ppJ+=VGuzXB!%^t(@p*h2HusKtQLBc|i7vh>dfSOYK2U6B0eeGi)r)9yXGdhYg18 z!UkJ?OnNpNB@7da9Oqqq%p3*7mI~B7Ld~BueGncoDJ4 zY9~{tBDQ*HhcQ}29AguSc0^F<5ocwzfObSYH?(6a4gR}Fi>ZOEb!uJ!Pt9x9YHG*S z_tVghsSP+

    aO5mFleBKjd|xEIXK)Dh8}={imQArOy!uZivl}G;MaIWwRqKn;i+89qD1SBgJM% zDw`cin;n^k&5ryhn;n@1mLhL}(n!m2N5XLD8xF%AsSJ0#c+-(@Ov4`e(8!OY$C~S*}!gtu*40}{P2q3Bk1>kPjqdKATsFA2VO8Fn)A`1S;d+&*Lj~Z?` z@=>GAei}8-l^ZFpd{m5XpElDl{ZY5j=ux-KZW@g_wwV6tqPji0=)dfy(MA77H;wKN zjM#TO&e%#O3LD)WS`pouT9MlHM^8ZB1dnctS4KCDu1B4Xt^xsoR>ylk{M&8{Ivn{m zqni?6{%Zg4ZW_H=D*rEJ7yVzW!q1(mwIgslt5&mfPlFjxW%{R$X6K#; z*(is1+I%S7v_+;$P5a(bsc9RO>7TY0x;))5{nNRrYkF2wr>0jibZUAFynbs#Vw&Tv z7kbik*S^Fw%S@s>F?}-ATRJs;GIVPCn6!0j`YPnD^3W-~GIVPCK#FQQ&zgc(N5ORe zR;NIRqu@t|P7z1r>0||e@mw@bDZI4X~&E#0GyGmoaHi?y)T@VYZr()Z1YBn=cx5t!|{eUxL z$$$c1NbrRc1SK#=DMjg734(qHqGPhjygMgQ`mlavV26@1@4iITF<@oZC_z0dy@h%f z`@*cOawj`b&q7FCP|s?uPy?UgS{gf^78*0SS>Y7Mtg!?i>k`Hx6=RvT$eq8?S-VXr zx!7jb8bYmcK{1la+TkgbgKEw<}$FuM-46i!*CF4~F1>VT@#URw}`4 zv?-K8%_3&Y$)DLg`7^t;Rd?7`g=IE;F?TFoCG;`7izTVqy$RUc3^&de>jTNpMuZd* z;FRn5_W zyIDxK?#6=0qP*ZW_BSEv3@gE8zo=_%lNYHwv!Qdv-V>9|a`K&y*cUA4z9qq#j$0BC zjP^otXF*r-AfR=YN>#jy6fXyavG-7*v7sPN+2P{k4i~4}4wp_45Ah5o9#gKNv%aQy zoL@`USZ4XgK7e?fSO;{@((Q9%C>~gCipRO$cp>6(;=?Uzh{vh3kch|mi|!~^4B~N~ z5w=gV{=b?vjbaf+s%!P9(*Uni#Ccbr!s>!D?Jn5^CadVhn}xw1ojE)Doxw;k#o6{~X*1}hQdV)ZMsI=2Z~or{TJ zi6GzD$6$3X9HY5Ab^CmtTaEflu{!sp@j_UgoAzeYxiHxCPjNrg+&f6mZ1ynh`^L%- zYd}XY8Nh{wc^NJC<`sc3=1F*SUVapsmz#wwVYstAuM}AxTf{~LNL9J^Fs~j`Bb(jr zLaBL8!2G->VV|P-so3|_r={i%;L8DWq13#|ynPIw$h_&SOh(grbC^FTdW#a&y!Fg6 z1tnJZsZue-z0H`7op< zYZ7ZDu>zOjHY6s8#yrFUuP+I_kiZMWKBekx1HfW+^TYgKs5J8rkxSp$Cs4};4UnL) zi*T`_EjmJ}<$_S-g{b9%-guk32lDXSqThJk&;p#^S}?|D58okb2_;wnpRn{gG}?j~ z^0HtWYF&Vp-_q+WEu_vaSS3CoxLU9nna6=~!B4>PcuF*(79;&^^uYy31ko?xYr!v; zxd|_i79e;E!A;c)ofSa6TJRL<6?%(xGIn8lB3Y=B8ced>s6mS@l$}%y^Fm|`G1n?H zU}`NYd;B{3bPI9jZQ(}a29SmI1&29!)wcAI-_aWrBG%F_YBo5Z=PQrbE4OC*MPO3$Y@MmBeR4@j2Zd z-_xY{52-tab*ET$N31s}hF|AS@eG6Fc)4sdK0Tn~(_2s`#qsDXLUDYfG$@X5LyF@& z5i{f$-yh0yhRPEEInvkey*>V0+Ku>$Y!K-*@sX@C()@f;`~v2Hy?E@RnR#`}SFY+T zR~hyqp7$%oUlO4}^Wra%<@j@G>-dvIU}+vP-JzDLI8yu*kQU+1UcSgnca(i2G%WH( z7gN8DUcSh1Y^+{RsuyLms9qERsuu+a)u?|_2MIs zJb|7`lrvL_ei0O*^l=ini3Gc_zy>IVStK2O5juM5b-uAr(a{${$rfQ$TlR<@eT(Yo zi{LQG3+d>Kebemdi!m@Pdz7B+E{5Y=J`UV1E=Kwm7Y28W^YNV}UH0q6m8`L7aeWpE zW)b&sXK_*7s5 zDBF^Jh4CnX5o$>Zw8N4>l$s62T2h)symb~G`oE+KWVnnM?=A@@P$L4>HGxDJnlejpc1){2%c;Rw5Aj(N&%$x0Gy%7-$FJ>zkFXvubxy%SBe zWWRJ2$YRMZVkYgUrBld_M@!(^x?BuNOx3j3j<-a1#B zP~{z&a;`K1Lrp@cD{xbSKh+&F32n(~LIVVGP?Mv=;s14306|iqa#YOr&u0aw$O)oJ zP~-$zu}+wTrcS`f8r07^0cA{P6C_xiummDVSYq|Whw zl}r1iYUF1|?^!C>6D{RI&!wNGqID@Yw+8hqgS;fmVi+8_&X{S=cftG|bDUq1bFGF%KeG7E36rQ!10WOupK&Y!xeZeYGQeyBc4YVY(R9 zhOp-ds|1jkOj1H)9&n6Zc13%K7+|z2A6R;s9G@wb}?)i9zJ-H*LWc&b9o`W zP3;>khZ?UKefR2fCxuA&XOJ%kt)dcnpNfESIU|@(z&v za!eyC-Lcq3S6v<|8uXT(v7uitA7Yu_<=+zaOTt;A;9DLNT;ZcO z7_OkJy~5u-v9|(Nq|zbaTv1!$Q-6tl7(c>xYAp9ROt=9TbYB5ugrqhSn1DqR%nDk(tZZQA*EaKUE)Ln}DR#ked zj>W*{2+DQkc&g>faAx_&zJLH$oh^6+O;512vD7-&0IRdVmFtK_cq zRW(88DvUwZLM-W^v#x4{e!8jy*S5V=#)gsbGl z>8clEt5@C5fj4If=mTqOoSq@%-vVhkPps^%Jt(XFP}6GlK_=i>4bP|ARJ&MgH2dme z05Q(cto}f^uMMDiTiqO~t98wJxOz8OWxuKgW6u02j3-L-S=U!?d6T5;_?-BEK86m#wKw|6E$>Hg~t+!YL^TbCJ-h0?7H2S!AKJ(kSZv5%}nAE`MgwbHFyi@dcSN{3g5(ybdx zrCZk%(gv-Ln%DoW(t!>~t?Gu-5nru=|39T$cUdXjx|6hK2kpBa)@OZ3*y~3$XZ%vY`p$q?*DI{=fhyMbFrx_TKV=T|di^L?;pz}p41qVg z|9B`fAMn}0ThLZYeQ)OZ-D1jyPo^;^ zjFoyt4Tgq!=FWtTg6HgKNro52UCUuPz zAU9PYBnaDtcxc3^iEiO0<385g$eV&fl*T4({pDaGSB7ueM^J_ID3Klw`&_w$n^Kr# zN|+57i%%-3l21tVraLTu$K@k0!?*_1y&3%`xH-t$oXNmogum%9XQorRIe<>(=EBVO zjeP~Da&r(8?D9|e$cioO3p_B7+uYE2ArABA7I>R_#;_T2`JdABB;V%lNPXO0!_C7< z=jOqz3?qNtS(f4`J~oe${4c@B<}Y1*dVNkPW5)LT80h#Wr($&E{p&d@Qqw zWgyheKN`)8rrNv%=_)5yoA>kV&*tBynq-zg%JNnKgN0$ge$u4y1Ch#e66zcK8dBL3 zg49U2>w9TRS}Cb)0h{tdt_|GsiAyRdJc0#V&_uW|S#Oy@5DvFnW+TnDX%Ga>F^Jo; zoWyNe0vT zR|VyHh;_?(Pq7mIG2z|C3PEl4A@5uLNdW5I`X2i5*78KNwKy{{v#IxeH1r79nJ$$J zIJZ^>uB{b`%ev;&y?@J!($;z?Gnm5N+DwgVTib%Ft!>Q@N^b2z#3nJ6iPOg3w)Hbe zY?mKM+13Efwyg<@ZN~d;AM5t*ISf9xEd{P^)>iCo7>-0R+xE&)zAiv(XujpqZM&<; z*!F~=PfRkl`=&t#htKULkt*4=Xq*m2dx7QcRagtNS|W9{X;B!4Ra0)4qjB4NV`$ut zLAF7-rDrTY1}OrVysYAJl<)T07!J2bqPXie6c%5Hw9)2%T50=k%zUqXH-5Lt>pHnX5P;*50dwD`l$Sr_0Jen^f87^ zbuQuR)_yd-q#;wi(mQ3Uhbo!sy$Rael&OyCORAItmWR0?){ zD3HF68mez1Qs3A&=$-mOq~p4M$2xSnu+LTR)FFI%AvR0D?dqLwTS#>56xgwj{ZW5~ z|GeF8){aahZHGT9+hNxojhedm#~nG*A9v)1Ja-f{P0$XE!;J=_Kkg`pmNmZ0y93j| z9p4%<-O*f7)&sXY>UnYt-QLla@NaRuV<5TR0f($nQ#8?z@kp!Lk9I^TVegnhY%@$@ z?|>a_)YL>m4MRWjb=n}Noj)V((e1mk(l)hJV%iCNAumKsJI|#lrk$W}S60@#^MJ_@9Nj|j6F1TybCi2d{ zYp*ea?m8`$9|k+S4qHtUwnvRTyRH-5}B9_#kqcAGtVJFTGC1N`#E>)q%* zyK{N$1lXMiXm{rc^VkWny9Qs@kevX#J7KN4E`Ii`&qpad`lFS14+WPWXC%^Zk;b~K z;YA&h5rJ-|kmfC;Egwv=`jz-EV+?PliA|f>6hv0Ml>UlZW)|$pI{T zG82nM59-}hQl$PyEYBWw0|g5lxlC%0LWe9mj{U6Ed_poe`re4Xg` zVd}ImC-m%^iGH7KU)h%*(ED;LXp3=>ystc3Z67bg+ox_BU^&E3n&(JwgZTC}l3E%` z8|_oq<*`H?R|&Z=PifD-5xV_=m$CPB-yI5L-!%wh-!-fAM10_FmMgOP?;7>5OS6>c%vG`dJK2ydgy|gFt+rga_2e@KEpof`o?54-}%z)tdSN6hHhMTlPROQhg}S4zpzsv?hlKniIOAf_87& z1Kn6be^Yf1^wJ$I?#S1t4tybvDynk;W5(g5Qo$S)Ux*5JS`~aR6)a~37&!>-QNdQI z&Vlo+Mcu8-a=Pwl*;>AHb^sGt7*(Y@2Oe8=pnn-9ezmiNQk`F6AP?`%pxW-&Us>_5 zJJANe?sT=Cp*p|1I>E1qSMX{HR~v8{#Z;YxazyJOk7ylq9nq5cDo8yDuhdfoOw~Eq zj@2J*O1P%3>J8O7*yn9HQ*{nb6u55*_pJ-gP@RL*EY&#}`wrC+%{{nD(C{9=gKJ%A z4DJttd!ro>r4#PIOPl*c&57m^{fR?v{)EwS4)s*c;OYP-_lL#_+*gGA%2mC={UI1u zHlGX58y;fl|B!3h(Cj#epco_@fw$X8f`$IRS`in$!(W*YYJ8rQ6 z?BNVb`24r1LIb;exGiuQo5;D5oL_kCESu;Ke`9pS!x#=(DLdj}jC|4&53j*pnCOd# z|AG=9eqyTV;d`oiVE>LV7V>z?d|KHfnP9}7>?%hJAr*JGvPa%0)kpZ5mLqV6+2!54 z%8@$gDo5BMk2E!FIZ|JDwE0@B>=CSPSY73a6~H}$HZn^{@K$w|Bj~b6qm0AQM`V(J zgdW!s*Cb!|d4QIqn5vN$tF^GxLv^vEB}nkm0)RVOz$Iob^1^31TAjc(RrRW!5|crr zEb-F79c^vM^=Kzm1LcaZk1M$z{g0CC(G`X9b`_=?M^`foLOiM?-IdVPQP{@D&!y3i z9w!~g%`26UrZC4On)PD)MIC<8`RG$R2N*Svr6>KzxC8Adh7!+F^H?_2d+a@og~#5* zZ0J}nj_s)YSTUrJjcC>}8LW>5q2^;jmINX`Q3J%W7KG8fSh-0^=q&kK)3Kg__^*lO zbD?7pu?%uy=?5&Na+%~VM&RujCU4EYw3NbybG)qIANvW;bJ2;;MgWr z+}b1nojrDhJf46`9Xl&31=r~q_GgJpckG6tP-Gf`$CDx61bK$i$JJ$7Ed9zTeLM?G zE9E-QB5lRdI$oM`MZx3n2gCt9UQe!HKR%3wKAV{tOfq{av)MzA&(!TFu6nVdPGG&F zshSR)C#O(_<0q)>ciw2-3P|EcDA`J6x$>11^g?ujRqg0%OEH!$&dV+?NaD_rxGcGaZa>|KbG&|Pj+cy(nY@rWUb0)r%xzMh zJcNb(TLJznq;Xj9{hU>C%_4b%?)dNmx?QsDa7mtlT9cuiA6~G!9R-xUS_B00lM|5n z1_Dan%%%9SGT<5S?8#d>l}kQ=bl7H(XlKrIl8>SnC7&aX+k%62$#|7~m33Y4sEc@U zODYWeGB$ql8{K}YxEC*VJe5v&bnF3&Ph~VHK2?zNK1ETU%ISf{h=rW0A_dB#K~9ym z8YH3>^c0NXYq(&{C6FF%Y9v5iAopRbMW~n;o27QU2ySfEUNBmKNFza&lGfz44esKy=Tfm zcxMU&=r^lNfT%Oo19kg3?khM~gO4nDoW0D)&wR}1;|o5xsp@P|JkH$XV=o_E%{dba zp3l^kJ^^hx195-Ez{(k%$&-=Ai}^#X`~hbEx03HC)5|kzO`7nKnSz(q=rB#?t8tF` z80S>JjC1(7G4Y@EvGBh(^3P@^{_t`tzp9yk7Oua*pXFW=bB=PhtCf$qtjZrG`5_8^ zij|LUqw;4=Oy$Pko3U{rn)t@y>UkO*!9% znnw5d{AXz5^9vy2^WT~%&VOm3I3F%3I!P7h)shQXIKRluUr!dpOS6jeo1xzW=|TSv zr{s6UkfK{s`&FO)o#Wu|Z=&H#Fob>qcChnru0D%c$~pF+3#AIh5Dl70b$AxN*o%bPEZ;Qv(q3zL{Nnm?oW(ALGp$-U0uLi_>eZ?;(ILQ2M#ZmM5^dMJYB@LhS1R%GA=eG zIT!0*!UH~b=xD1ia(KEJDl!JG7uzF~r$a9GH`GMl*)I+;5mW%6&V7)mgT-;BZT!Oa-g^S6|P$1XQLKhLx=vu`b z6fVLw4;@WRZVQ`l4GNdCli*9-z<9~uMes{S@TFp&1h+KUyc8@@l?heZ1@+2+YUK&l zisQhgu1cpaG5&L@k2wxpLhHM;W{d+G+WgW~q#3&X3L7?hw`%iCiN*_Q^GjSpaE$|I zn_t?*Lj3;trR}Bg*aJPd^ef(FP2URtokhCfZi+A67Iv=c=grBnv9DM75m5(_Jn+p(1+mC_o& zN65|WDIc*Qx>U*l$~2`ffw5TV2Fyrq%6O!yo=TrW=Qkxvl%7ya36+M@r@+_g_Ngd+ z$}SkT6in25l$HUQV6f!wU@`#H?4+D!1}T%)PGM_fn}U05(-Ta=4wr7pr2UGG=w1-Y zYGq%iFEsPYI3#!&*JYpXKBbvg<{K|WGp{6gXl5eTm1&Kxe9uCh`dwKkb!-6@SCVu` z&kXLLW4W>)#YXcpZdZ<>Nv>QL0|eTyTokDDghJo%>G2`BD}RgOmu(MM9_se18|eyN z&5D!{qHe>zDIE5$<~MiyT!jJbnSo7zwLVskueJrpR~zHqEVS^|4g`36M;n;9iqQYn zDOAp@BN&9g`ju>nxH^N#q+PD^`nIbG>hzpte(CP&N~y|o2atmMnK@wY>M=5R^$?i5 ziingOb0m;X{?)4@2o`{6-;T6W?SpLmSTgaYZbiEjj#R4$5cMLqvC79X2sX485Lh^?l#O`Qy2ac^H4K?oaBEj z!|=657W`Z@AB#Nll}0wnHS5gEwOwXD!aKKC7+X%2NI#9D|Xq?;6**FmBADIYQ2LA-%^&i1}oq~Vbf{YJ&mx$); zOO2L#j0)!=M>=)n_TufOir5 z?T>F6+3&_n1D#=)xVseTFK>DQcUKdEjAeHja=V)pl>xFKYK%<%xw=8qt0IX5Z9LI% z7vpjN!BE}1vIX*P3JYUt$c+wqK6iOcBfLFZfZqQ-?(PWtQ+`6T@09?V_sWQk0Gaoy z5+`Z9hY8iA!gL(&H4Ma~H_NHrkSy1f<-pFpk7<3voHiTtKNWohN%w|P@9zy_(N9>^ z5)ENS3rsDkW+HxXqmJH-R;qAsHrT&6+tkr}YXM%sgZTC_I@Wad%r#8f4?Q)S$CverM$*1!LlkTx4~9t0xiK~|HV2M*?do(K8eg!-Vgm0!%vuWAStLVHjL zX}SpQL32ZB54w^N(EFe-AxQ6ok^B#Gd@zahJ{SjjAAHMV7QM1W_h2zeT4oaaU>(6I zmj@VxALV1r>;cx99^A3nd5CFtoL3e6f?N9Fp|LuER|WZV_DysxXxT%%tsQ@R%S8_l za}gTBwZX;1+atE{Fpx5y{j-XcKdf%$hW&XBxy{JY>|bowYj)#@m^K;R_~GZsc{mv8 zvP6cduKW=8*0U?m#`#c);2|OpB7%n-DT0STKm-rPB3L3|t3QORHlV1KI8Ee7h+K8; z+3Rdn&W9L12UKE-M|PHY$r7r!&)$g7{xw5}F+@J%5cw!5IuIWkM0Jk_lD13u2VtH5 z1;GC!#L@>81*?x{5osCxvkgY~(SGEY{g*c0*Xa*i{lp6?ov!6r4BHbOh=&hed|_7kGG9K4}>5Mz$&*_0b zo+9J&3%hQA@rAJ|^F>}ly~qMeUSx5Fp58~hK%_5ZQRYQO;CxZW1E<+mp)oIwAl3^x zLhzzKG1Yfr`URM<;Qqqc+R3|TUdbZsi!tEgMGQprA_n4rf&Mr&3qo zrXgoQ&C8`OY9JN2T^h=taW;Tu;<2BXx4`SmTd+MZ5hoey4U?z-K{LMm%Un)*DKwYX z?XPn2*wD*cJT~NPh2N!+f^4SqCeGBW4?w^x1p9}2^Y~?)(_A-sRi9*@>)nG>hbH(!N%(; zVB_@^n8nv{c!xY>iRrriO-_T2*Yk;WzRAXGH#LNgy>@-m4Yj(33;z`xpyADXpy5qv z(C~&|>3mbj5apXn_%YR>;Y}UT@TQJQ!<+6bWZ8^2!`>mOe?`B;@Mv#X z7R}ZcDx%q1Ud98_EDy_~*?L-*MYDZ^5@(cU(QJ&}Yc|C0@o?D#Wmz;^tmMulPD~!$ zaGK3zSr*N9U!H?JH@8AcR z?jSpyy^LzAdCkp%2MmeTeM3RdCA_0eIl!9MrJ^SR;eX9bH`vsJzp>AHz-1yx$boH6I^9_}JqPN}tz!vav~t z&?hg_Nkc1rux_sTsLy|);e8siR2BU5F;l9&I&R(A3$^=v{I33`5yyBY!yAX<5kEpE zBiiHmw&wFS1>-XWoTDzsm&0AVb=)d3cI)tCivs)QkJfG-w^A;hFwWKejnea3lc<%? zYN-k?mgbXSeZzHXfFT&nxFHy~=mWkTDnnpgE^dF zVp=kSq-ofRiig#;S!y`aSoGm$82&U>YCKDgkHo@JoEBS9CN7#bmoMjr4Je2|i8CGW zkZrNm5DL(=3rNp_0q4--`eACM`8wjhW#qFDT3HPNj} zMNe;AXxs=zOu7=lnXW|G0F+AiJ`kQtPcDSebS;?ILI_O-C{_70_WA5A5ahVM!sLL3S-h9`L#xiW%`uSW4xMQ ze>O52-tQ|i?l%%W&~F%vSq)Fy;5QRy!EZhKo}XBAzZIau&#B}w6?^Uw3jCfE4$TkS zEVT5Yd|+mx`P~NLermS>K@dAMRL1Y35H0~iEqw-4sr(>0qeS|=QbIz6T6(o3131#d z2{KE#?a9#6k2Z0nAL1$zAvm}zKubRZ=BB@h$NxP;JpLtI;_=4Jbq$IwD0$Mh`V6WatNl$V<8mJSO~>4 zVuFI(RnM|`k+h0~#f+uEq93J}u?k4b*c3{Vu_=@!V+}(|GPc8yjZ&fqOZ0(UGY%KI zK>!(tQUDnTLI4^2dI*37V55>Tjny)a#qaN_QW>XH*D|6@4>9yn>RLYj| z1e7h~2~*iJ{+X7tF~Fr|%FpUE6-V`%3bT5*H4ZIPWnIfso0MmI0=6<|xPt%C>FI=P znIVM{mjXvHJP+BVqr|s zNb8w*(TbjxrGiN-rm|Y*KaJpkmc_@T-Yl?!5u+yeNJX)TItx`dO9}|j^0(RgS^lE< zv)n>^X1T&fveX|WWqBnAk>LR?t2a`A!(Ganolsf*K}%M*{VawPpEXEw%K&HAVjeh6 zbK`R2v(}TcIR2+)tznJy;f52Rm7HMww88^g)}KLs){`drS&s|&VTdT}E>v~Eo&2mR zLOxgOwXA5^?7a>0vo%L`*_uxc@DaB<8`eS@574s3!1u6Ends$R1wVE({gdmLZTJ6j z{j#S+t?68@AG%xibfh>tf(BZ)rydm39n5x>x!F!bJy5@6?4W;i2T_G%?Ao;4LAY|> zc0+MzW`_!UMf9^xEzD?}_;s-hcng%4y(rZXQq3M@1RJ#MHAz@0yy}bv!#nsp09`^& zPO^Uu+OmJ@Qr#$Ha*`d98kwAApXO3OW3rTBqyLb7E;|-wz$+28>?<$?W?xLqR;wwu zDEn5){{gL({Rfv)v_q_g&3KAvQt;1jsPQ^XLiQW@=OJoUQ5G;rCPQa6p*xiQ6)Z;% ze6?Q7;RUKWYUT()!qgd@<$%F3ILlEQ_2noXeGqa3WjWe12SUhU?dzdQhe|DQX5c!W zmSct&%gtdqUuOnH4RS0;TCHojj=+xjJ-3Sdmk@y2E!%TtxfxGY*j*Z~vSoQTkl-!4vMPDJUnoLQpzX$ELj&MM3? zdzz5zu+_)=x@hB^9n7ASvmIrevlStl5W;E$bcCF}q~|nZ&&kQ(I=6dhIY+oE{hF12 zEtR50bBdFYb1AXGNpQpV79m(K&~hTIJN_?4JA(ek?|LAg?ERo1+|GPxIe&pE$%(ki z_=67VWj1MD`FTa=AWi%;91YQmm$&Z0Bl)kKby!;Nea52U)oWA^mDtm|Wjd zy170hZr4Sc;U?}F;x2={RcYbf%x27`lWN!%D4ky*6HO(}k8> zbE%c|ZX0((X}KLNgjFIfcOIlb$cnQsLsq$qg1+2Ejl;uQZg4t@&7Hf8vV)2^1_7+Y z!>WVk4kLTH#}IssOLT#dIa(@r0`M4Dn)5Kk8E&oDa{ox|((1Xl5^!tOd87Op_wpn! zcBRoqx$j9u*ovp+zUitcNde~ZcLxlOIm>3r!|PkLJn$tZ<@9xCg!uBzLt3nB`J&j_ zN-6Q>S#P`$@#Wc^rug#cEaYef_=89%AwDbxs@Y$jOC&ANZ>$U!X>tdv12IOCM;-ix zH1ga*=1532FBAw)!C!>BgP)qgW8R!Zl-B_s^EzBS7EnCqElzM#fkR_(Mjyh=TbVVA zF!R#C;)pr=mhL=1@92nJ)&qwXCbYXO~+ zdZF=fZzEVo#|!9#ks)9x8YW=bG5=2wwe zz;&XNrVhaQ5G~-2NQ_XgQbT#jEngm1nlCe;@@2Lv4Ic}+0X$zR7dXhyCn|;7-K2LA z!@ty=ueD%mL`;obnATxLhR)^d1`}tsd=tr+ zuQL;RX#QnLt8}f%b@tFQs)y#^X1tJbGe1{3t#LE|ar_GRW^=mjG1Ky2AP8>4(DL6# zdVnSu0&q%7%l}Asgg-`86%Y@s06nn$kYM;@ORYl!k;_STfkNP_Ku+BeVfTWL6i_E9 zAhQBk?!r6iHqeR!^<;Wf%qFF^0!?h}`vufacHl42k@#6qcCt^o&4QSj7Z_}4b^+13 z0vsm_xQ!G3Pz#Jf1)@-!>w7OTOQ_5R)*x-S*|Fk_l`jUc3hZ|Ff;dE53Y=$+(q;v& z5bKr5VAV(k5b%w#18YGHi4n!nS_QM#K^zS%&e(kIiy-R2v$M54K<)( zE5g+#oO3n=vttibDx5fAee%)&AwJJMzBqT zj0z&~?bZemRzYkzGy{YMSL#}!zvu}Se1h~EEt*IQ8GkIqm0hinFOU?%WZDf0O=KZ7 zpCO4tSohHi<(Ff&@B<5#19?x(enxDu7@|aGg&GUW+AQyO2W>gkV+xHSU+P9v;)yfx zxb>LDRPaJcY8G6G<6NPw(MMGa6xz=gAhpRP4NXx99;`I5TMMX`aAu{YDfCd+3cvQI zQWaL01cU9uGG!`U8;A;5_h1{cD~$ceGGUiYt#EtNQ@ER=r*L1;Q@C&RG0lbp#9HC+ z2n|gyJdK2bp2EvW5A?k7PcBYjE(_m)wB&lc9;T-7ukpV#y99^>F|iHA7HH!lT2LBT zg3=5ug1Q3pdr-;-3M|i8BKE+lAS|$IWC#Ss!q_+?gax)U2n&RTF$6_5HHo0AW}yNG z4hh5~5^@Sukv-NfD@}o45+UX*Zt4L!1%?@NV*d`DXX<4jZ=KQtXA=fOc?*V`_gF4w z(E{N<6dA#gN8lwT+`t>;;f5*Pz&8dDMKT#Y6v0#@q8OxEq&bwQ2%-#8&VLXqRG`RL zNGYtS$SPG)5zdQ>{9tNT5jcvXRYed_5Unb5!V;F7ps452Dqm-27~G-*kcR168G4kF zybIC?FD4ot zmEg}1PSK046GjqX=TMPjda?igRRLmhOdkNx%Lb$FMgyAOup4T%22v~bJJJoTf!u;} z2749PwcuEia$lult>5DULqZOMe&zF(+@3C z0=>P&DIe^=(nMi$IsTNa?THXXmJDSU6ZU1AVTVhsqQ z&FBtIDtRh?n$o0_a^5A(o1B(%K$A*R1^%ZdEo>-!l`3ZORjR6h<3xw*D5B_Du&?UgBSaZ7h+7yFd$@f zD&#ThW0}@6fAg0zt!`8IGKlf+4SgeWz(Yzmi5scvwoyF%H{-tWgYl= z)Uu|jLfvKa=~}t662B>1gpkrv%a#GVWy?sgi#RdR&ib)5{`uOaq*ky?H9^@qQs*=R zPP66!5oIATVmLw!7=_C|hZ!$x-V>mevEJ~3qO#mZhl9m_w!h*16k2A}db zQF^Bh1O)k;$bxuqMGK;@TmJRi$b#|^8LnM%*R;@>cuqNjLXaA|ZA8<8WS3D;OP~sB z?12jH9n_iC_LOSTX@g)Noxee^f`$pbA#8`BZ;<}r93*Hw2oIV8!h>dj@Sw>goF(QW zT{Bugh?X%(U7HF=IA|*iSrfh>glchx@go=M*6vF!=swXuCPgnTik=u0Rlvw=E~Hh+ zh@QQW6ji`M1g$~^vvdW_E`|OIwGDZLx(bbujH{@%3T;4Lg*K+kQvvgB1u%kiP3ZMD zU94jU$f~diTvu2Gt}DzoxUK;GtZ00pNvrT9@&0JxJw?25gDSviR)9nBzg?*cfBY|3 zs$w=&l+DAHs+cYMIDM&#($Op6vK`jsh#US7z7$Y7;(q*RUrHIQii|{5EK8+{K7rl~ zekwvB6`LBg#1G-@xnk4!FVLr;H5GAf4cmyiTX8t_sp24t!Sb1~j9Rg&p(Yi-0?okY zm>VLvSsFfx)9v7X{DSzFHmj6-ACKQHyVA9aOBo2MxQZ0|I|I}DnWzgg$yN?u$9O)cvOO)>l#=pEoNS-p`;Q*D^+r&$N5~X5=_y&j4}jNqA9BM zQ)F#5JFRq-IT%nXoyI@7kwvR?8SJU}01Oi}(wcZVvl;W{N-rp^O81HBzGW-Jd5Q;1iT!|Io6;(OW-(Uz85iv-22!ApB1YvTbOs8ZQ@Av#c{rhBVbY2s>il>CUlynA5k z=RP;9(w7Jr8msat682EJ=4MrbU$)+KzvIhl2Sn!G%vJOPQ2k8!5yUI<Ll%qQe`%Va=)rF{9V;yF56Un z4+wlb+AN6!eASX5sA`DR0|l#En}k>W0KKd#`uPIa=}y#LwUyK@gFsd6-g1-!@wypq5xWs3uWcfJjb)0SYiDtc7a zdtkPTFnbBV9uNnzs(B-2Lqjy+tPI=XwQ4!);(_l2;!z5ZK-6BXq^?yj$0eL<*tAfs zru*PnO{NRg>H}-FU}Ciz4zjA&2C}NAKIeexc(o3?W8pK%r5bPNQrDho)gZ)bi^WN) zhG@_NuCG?ZxVZ3HJ^V9EF5A+oB{GL4dAE^PZNCVw8g9?fs;xIYnQG+Uv&Gy#9mu8D zYFOr3XuzJr!m0XQ53+xVAE%Vu-Ix8U{aqLt56H!HX>qdokkx>T>M+Zg;K~wZb-2dW zOL&3g>H)Hcsd^lYWCd^yUjjoHYvjj2J1{S*@jgVp2C}Y!CEkVmAz~H8GtIgD<>m_6JzS#? zhoc%8^cMK|I51SIrm1`fom}$JwG!4HN;;l8askzQ&e2}-7ztnJq zU%%m3gv6535;dRT7ea+^nWWuRRmfWtej_O~*? z)t+MxJhf$KYwekYfqRi~)j~+%MSr??H3#e>-Yd;od8(5I@#da*U5&?P$wM-ImLaob!2BlodRgV zIt3zMbD=l3B1f`12xHb6YPhgfRkKWCCaknTbImWF|-oL3qqW54{M%yeMH` zs<9wsK3KX=mO_@J{X({y8W8dmRVriyF@5jC)xadm9aUXK5HauMXCFL*#%R;Jp-2}D%ys(%bKU+TLSjx3%<;fn7qRLz zF>iW@)c(~th9hiZt?J4=pf2YDb=~FxnlhpF3XqI?0Z{vT2&XMAY_Vny-zxdgaYUyLz<=XqJayB~k*LS+A7~q$5E(8aIk+^)Ne5*atDx`$p>j61}zF zP`q>XR+l{01Sb|JidF4X1!O!Cj&~WsS;`33TS&|%F`+Tvn@|##tM@&jzPF$vf-r1d z#w*OQ5>Anb6cRzg-bgJk`0l<3VHnEl`{B)f$gF+=gLTauy2!rye`w4Kn&A4CX@cux z=U&1-UuRC3;QBPbYjmw4Hw;Brzyl_@{tn}XY=t^g4`pq5n5MM;d8F$Y z(@wHV4u|#cljQn$SlLb8k=Wd7OPbOKYHvQ6ZD2zt4$o^15U;~r;U%E(PHT|gkX3_n zMAU#=kQx-VWEIX&nGzf$dm?w)qHtWZ)&|_E)ZnJ) zfZqV0)6p6{kpaJ9Mvno%Av`sMp@zj!s$ns6z;6g2C$YI%qv*RaYi$_9f+1m_L2DW! zRQG+DHQ+ZKK++rbV1XVknLbro+YlbU3uS1Gaf7+mP!{7GMi45(1@#0`5wt`@xT%Tw zNR`$Qp#uRoED$1{vzk-&8g8fRHN>1RvAM4^7gVoNbtKrPrU_KN_m%23YHz#{)oX-P zRcWYRqn<33xfS4tAdQ4{aYK_*y+&inU8B*ctPz@f)h|}VQ1u$cifIPLjiQlx1FF|( ziKyOHLPaAjGgPn920^qM3^!VBF&uVJsa~Ul1UDrg8Z*I!x*|~L2zAZ{bzf;sX?ctpxMd_@(YxGXbsCB)efCpfF7! zoF-R|saKOCps0yDlm~z&^$Ab~|6s&x68cX;$tI!h1Do5ztE}%f84nzYq#>|ruJ1M( zA05P?WE1g!n+$?ygPI&`wSNdo0+nNJ(|-|^L@c$*Jn|qd*F@$OO&CRJveLDp#RX2t zunG2xtonu0!La}_pVr84EpYN)H?7HS7E~BH{5H8SCK2+&K@ilXOk&gG?>31*()4`` zNz)I2r0EA{Af{#pqg6PuDdKUfZjg*`Nd{PI3WrNj z$%K%om_lPF(uOpRp$%z@9pbBg@pa~g4Qcup(gR&<*_Ae=sInnVUl}iCPgpa%%ZBJ$ zGu~hscCd%{wB_!BuV#e^lD-uRltp?U@sks*n0vyS!N{)j7vVMIHp*tTqNXVMH*3Ni zbmnHQ@lPHIKv_MnX>{%v#I7}rLbLu<`)1t<+}#pF*ss6>^V|$VSXYBszV^TZ5<_D; zu_HB$LYj{l(4`(m45-;czDC5h*+!6xJ6)9VYqm=&`WaGcwwbh9{i{CS98f$QBN@k{ zB2hb3r`b&aKMwPQA~%CcT6fjpLe`#pa8j^{UVC$YU2CzDANAInXCr38)jR;Wng^J} zQFCk-T*qC|UL;6FaEud?=GD-to2x4};T<%WeS*#LeMPM~7W>_(1QE^K2@$NaJE|Nc zVW;MZHm~z1=q)nX{2Dj%x(0+?{=CZ&7sv=$iKkY$_rX;LIEqG$6%ke{Y(;m2Ci3rE;4jYd5Bi2I5 zA37QKz^#m>L%1t6)LBlhV$)iTL^X#*;w>14R=g?SUC*5U#) zDM+~qGR%)6ft%RU*XRf>a}iO?jA*2m8Lf^G-V-O#!B)$H06&Bt(J~1C)Ie=5s}do) zM$2IQ!wzOg#WL0_4PzJSOw-V^CEKHA2bTAB=7DKw*$b(^uC=Cn5yp?A`QXJ@#tU&T zT8_cn)Shk2$t>j83dLt4&9RID1l4k>aIlD#!44%Av*bzlqUC1Oy=eIZG8;h@E%&m2 zVUIKZ#XPp*#DoW1k2RFBq0KQwZWiuG@ml4NuUnZF`WwwxO5s=*V|g zyTX38?I)R^G82K%4Nu&o6K%iKwU6ExGu0MBafMBS8f|A0AUYMc#n6Qo>Lz;)j6 z1mbP`lW2-;VQafr*E+ONNROFF{}L*0k=h&b??r;2WwsTk_8|Ky`fhs$f!ZD6V=*7Y z`DnyPK9JE)eei^M;AsgN?Xn0NA=0y=eLx-*=4;?xgG;|mwG${Ynsp9##%ZxXDyxDp_Wd4DWguG%X1hc z)oB2$NJ~ln}mM>Dmxbdm7O({%1&<#Dm%lY2bCdmGQ2aEk+sfc3@SS} zdk2-ByP&U?Wi21&Wi1~SVtag41AKnOFM4So)d!UyVX)ZnB%*u|uZ4Z$*W1AMM;*mK z-k6H*k1$L4Xrv(IO}*MjgSg%6;~luDSNj+tk^q>UE-2Hbr>=$aP*8L|JYaUZU?7nf zVs^TW!CNaz-DNI*r8YZV5(pw@r%R&l*fJCyxyx2k-DMM~?y{cmtp3a4q{~rLYF!R6 z6P$GUjhuuPBh&$;6q?E|x7GS+mwT|UUG7DnQieMe-p`hy5Nv3E{PV5LY&#)e++&m% z`+W0(!BC7#q0scM-+}IEBMcvkaa&#pgQ2vx7K5Sp(qu67IYETMt_bXGZ4CyyW+Q`L zGl9XbethS_VAtX%gIx18Ryzat<8bvJ=F& z75>BM+YR$`ETJ2&ceko!v>SJmbb|x9t%3)m-C7HyDadSqOm5HYhVyeqOX8i@t*0?m zcKcKiF-F_1zvT{u@j5DkPa?Q$sO%tvcehy9C?jpRg#=s}-55R<%j;%!$H7hVnB9<8 zw?FZ&Hc04>O;-GjI?%zdqQ_3(iaYw8Bl$b_H+t{gOOc@N<$$+)IroKv?pSK>j=Sci z-tLX16gOmacO8ld4}~g%jP4(k49KSYC#2NXQXK9-q?zlE4%MSFSG>E!>FSQz4i^3+ zMtPCU1X*RMZ&ZW}!L;t1#lzpADENLL5&oudmq&29%|atag~oKGGWPg@u4WI!9=BESb>@eD^>~K#M%Vg$ zO0{XE^s6V7MP7)0^$c*=ub#!z)UTdZ2txhpSr@4VR;Q9o{p#77EcEPvs(Zp|`FWa$ ze)UxM%YvDn5b)1GLux%oQ@_Hq5$Y49@odYU;V>&b)n{(eJA2L-q;m)tMK}v75v)et zG|*_Bo||>8_gW+5(rYT@*lVh}GSN$76us5}Nv|buBk2XFCSug2&(m&~URPOvFRpa- zI`0Z^aK}2aJtH>swBA|cCqkV;Q}3EW(|mY>y<0~8N$B3RqrC^qzx@H#8)KatBi5JI zA0R8nZ9AcwpkhnAL`Zrk0cu(ilsSPO(t8_zEfBr#&DGi7$+E&g?AM4L+<38Jm}1Y^ zRKXW4_(JaXLBT$GQx!aG6CkCMeRvnC)`!Q*`;@l2dBl&3b(}mzHJ6YFx9VrNv+|6m zzDF(W)00}*r$4iOoduwUeRQN>bgl0NDpz@>g?-K&FJ!{gC&i_OaEML2*5?)rQSbUZ z!hbe*z3b~BoqhdKSzmA6u``#YA{?Rm78AP$k@XEgW;HZXUo5CX@7^a=08$OZuJx4} za$m-!`-WHyhjUvE!MhXOlxyfLEC9eg?>n3|ig^3t8^&7SQ4(@uc}y8x<)t0WkW*io z^7fs>@^f4jB}1|V+(1BbgS{v_bGh`Ak}W{V_B~9=_DyECud^T|+wXlOM6179OUYJN zlI@4?Brim={o14{*?yf^h>IlsdLs?Ri18PRx(X0|Dg~_f9UnD;gR7z@ST_VpKJvF zE)b7+NT&ZJ`Bn>JMg6Ctn&q$s{bQrg$b6vx5-V@DnfGIq`11X?=-OAu*%bZvA^nE9 zG_JvxZ&z#mFYxt!q?aHuss}cI@BncC*J$Gb{-|?6CKK;~JO3eD!4jygDaPZ7J!G8nr zd)@KNSnxIYCl&|UgO4JehsvBYd+*>oQqOIynh*Y+#nXv#x1>Z;pOMs8;B1IGwZO8k zb;sV;{IIPyM4eHP`Tmfi`2DxR!jK9een8WO`^p;vJd~ zNQR<`NR>OoLra6

    ;7E8(LQi)?&f(x?^7hf7=u+PvKbE4`h9)Y-SvH(|tbnC);@_ z&OHysM^eGhQ0OY)grA`^2{Zv$Ohip7AvaMFF(L+}089?$t~C#Jo;gkS_znFV(jTUl zlVGBTX(VeHPty;5pvbc5M-9Vrf>C4B<1qLF!=!D7b%E~H^dU{d`ayC|KVljym_`HB zuwiduLeme6f+U8`VC8B%5X;RJU{MoRrZxb{-o#;Rb?x&v-ULi0;8{U_lR)Pb@+d@I z5OG~gAq{(^Ys2dqe)n(<{14YmW%)nWzB;^$YkPYFIRhuj!M#`rmLS0b6el==V8PRt zA{BnOx3svEAR!46BqRh2ZY}P52zr6GxU`p+;Lzgk-}|nSGY4q7e|&kKeKNCU?PYtd zwPj}d6?W^SU)lF745!Wg2eOy`@t~&vB)J@i4*L()xN5E_S$pn36L@yf)wI7nZrJ|; z`tNUf+_1i;WCOf3!~uOkc|sph63_=ADx%Cx=q|bG@tC(lMh~bbWWWXw;1=O4U|=v{uuIMPWF7m$!WtD1ydJ>URq!0BsU>N$zmZx%v}B++m_9IX zcK)Ct9#Ll(Wc5Hua7bm&N(LeZ7|7G-n1E~kdth_+KCm%cXy}S)O@#uB2X-dlz8DY# z)8}wIZ?^$4@EZ<}_Y8=Eqn)-v1%&c}SV=@Xp?u(WP&E(%x^+Md#1a|s z7A(M$ftCkQG#jrEib17;)t~^7Hb`4Mf{X@zOkxHF0lz_5h9Q0?A?Rw5EGfxXkZpqy z(+nv^WgQejK;xxlB3oi|%9d7@8HBS@gX`(aI%pN}8nnuoISjfcO)s(OxpzAq3`$__ zy1At0I$bt6luZYJ3DgJ6D%Idm0A(COU-9Wu5@ zrs-csTio&VFR5V3L&Y5rfz1$iJmd$`J7g)`@enLmTHLXIxN3-;4<53Eo$WCFUJSpr zeF0gBX03j&EWfL58*<5oCAWo#+?U{weY|1`@EZz~h&BKHE>hiszoFRi6a0n-6ThML z&~|8LH~jbpl%cJWl_;7!G~|+TuWw)t)eo?^Hn6mcvS~V$o2Eluo2Ic@F=xMuESRZ% zRT1C}9Y=mbIzy*uqZXKEW^7@k@FahEh1pPeJuPGz%451imlAU`WC=wMbMGMjyKRIf zL+?S!hw?hBtSC%}3wIX5q%LSn_vRB%4Q?;*Bi}@q+eYbJ!_gbB`&V zJ~s_d;%7x|!?t1uQjBL4ho!>~4Lb(*58F?1AO;_H@*NL63~Ob>3+kg}SO)vcknx&< ztEWJhGm+tTj?4+hUNPpu#%`q`JG>&19bO8JhnF&ujrmjC<{QqjkqB_Zv0T1qG9tO* zSXTa}DpY6qXmSb^U^$9QQMwfIKRl@%=VrrGxCl0UE~}|2#cMllBMKvxaN0&y=G?5h zHa8oAl_|-Px!H)i@12{Cz^dD*%6K8GZA4oneA_7IGP~s5Y=oHW5nn)#BYHS}j`^6z zkaM#U+KN6%7=dv4SOsuo#1xsEJpkRvvyGUchx8+skrgA-z={!RE><+v=4K;yvbjrQ zcw!1M_=w}|Q8+n*2Z=`fY8+r2@r3m~-10;>atY~C)xGUGOvyn9cYh+FH z01;GTWHYG5NICaBGK8feW+`YI*%P*@Q*=+Oj_`wJwvpc=&DAy+N7DO_94sf0M#f2l z-Z(TQiz*`*nS_kw{^ZCX6V7Y)Xe0^uF$gEuQ+%~e#F2+s@sJ!r8hP63b6hcxAdQsi z(MV2@M!Kd)F_&OiA&OBdc>{rs%B#cH141fKZYs|xUz);EWm&AI_(FL`#Uo8~+G2)L zdCqIfGisrpA<8pq#e0=!)LK@e@{HPvbO@aOU6cp%8+F9#bE1XFZ`4U3JL;ryU}V$< zmVmXR?#X!PgMb>AZyy;Mor8KaIt!YQ&f?OWhML}t_5~dMs~99NALsO=Yalg*79(8O zrr4t!F}od74`lytn6=S8ncW|0JhJ~Vv!gK09z9v`9-YFDQ;b6*qgR1891_9E82z&# zb_kpty_eLOBSWX5F$i_CGM&+15W^0n-fk(`08j0&9c1o<)2DQX@V|Xrv9V2rQqRXkjHa`INj}GhzfFofGavOn~>) z?sZ2TF+po#I%3cjkw#qCAvBIycL_h3=%3_^3?sIK8pBOQaLh&=GQzruKZTZSq$R_R z7HEFN1GTV#o`Vfh5;-oJ|TIA;@2O@dKG4kv9 zo8SOg7CDfRGP`+1YDV%}nO{UEqWCWLIdY!#G@CtP7saB3!N^(3Mf1qL5LM(sL$;AH z&$?_Q&m~-(Xn`diONJUV|o9% z$aZWAld`b^plob_A=|M*EP0P?$70P`m+jaNkgayF%XVysw`3cN3efbicv*e)QDZ=k zl_+Cu6fuo(!xU^7i_f*##;$-Wj9md$7>gw!QH8PVowji~^@w3?I+0B`rlVsK)}JjY zbFi_0ir~Y5hi;hNVuo?0$)s^b(0p7G)8Iw_qKR`{Ee(!AcK9@TrP#Rk(uk)E$90O6 zUCrbY-Vn|wrVr~<5y!WKUXAZ23&ZGUJjVaIWN*=NjI8lr^x(p~M1A9NE_y;`Pfn%B z4@a&2J{T?IBMF}kV_Xfj-H7pv1dCZ9WBe?W`>~TX?vLLkAlwF1coIS!0>x<1xiFr= z%J^T6hdsyNWQid$od;TX6S7EmuUY@Kt2=&<6?~Xb%-S$KN#2w(0qgG*M(J8Mp$*$l zXo~g|TyGkTU9GqOmwWp}L39F$))AdBg$<{OtzdtMp5HWcgUd|EcD4+m7#aCpTlHjOJ$vx&uQV~|Jf1~izkAY`6pdgq*_Hu1Ndy>m6%0pDKK~u=r5NWdEl~7xmJ`df z+G|wX<;`)efLco}(ClW1LO~!_VJ9NC!0MD9p-gN<`A@8!fuBH#wXeBw1zSI{Eezts zo(Q2Q_LOR$Kn@czsj&=VpfItI)8~AUek@jh<-df{6A?yFoF%qoB37VJw17k>CJ3Zh zLK^P|iK;LWlU8tA1UZpwDHB&2sxa}OG~COEJKY+-r3w(~#M3e&CO%?44cIFJdzElG zi;@KpqQ(0F_h`)JDO!Y2(e-gT6@DeUJuc2ci=w~4MLJwT^k`goUB(4G=t(|*m4ys+ zCC=rLj9EF#Qv75EB6=H8cpxZ5Z-Eol?)A|Sy~U!Jrcm~A_an7P^=ul7 zJMC;f?|AHAn+foa$1k+$0`KB@CzBrDE#;leb*xOBw2K|#QY?kHN=5h!+l7=PYsapf_=U^2Z4siCb($xN)nUJ{ixma`qCp2@$RbOMf;? zG1`pMKQOoP0D$&uya3_ohA z1?IW=Q8GLcbCe6)*{rVCscfqz!Zl_@h!_$(!jWkAy0K5}s7b*U`rJT`fq-*JYcT@+ zN*rOhyTl}+U^2v!80#hut1uDyXwD!}md_Ix5XJ)6&^`}$hoPN_07iy(;t5Kq4CF#4wO z9GVImPxDmllu+pVl&%8&YxeV{T=qggQ$BI)$8>=T(ziGn<) zL>ZqJn3BR0qOt}XTaPA2xm3&bX@Q$4KIrth+RPspCyC1yU;NwS9tp|1XnsVO)*HN?bsY6rIOU_ACV zwHHgQ`euGMV(Jj$Gxb~6cfB4X)}{p?Q{zYgF(AcP!Mdr7bx;gGaQ@N=KKe6in7Wp_ zGZl92%04xv6m(}=AQDW)%>Gc2cs**E)NrolSCc z$WHs*>2sZiZd!k$K8?q{r+v*lH^rG2C5pqs2o^$G({P|4it`&=MIfc>V{Y1V0W=Rh zm^RNGbJ6=T!)9}w!@ACsU(~|v%r7HIfqqgDz~d#j)RrWu`}9V- zg-!|w=1JkAEo^|Lv+KWu=}DYf&z)}H{&y58ip5AbIEeY%C*MFCxmvm3MxlR(VyY@eMLIfs_Qx%LVcNzAoDuEZ8E(bfkG(LvF0#+2!ztT2LgSbpPD|5+0jUGI0AKE zObEN3o`7zrCq#cIOu&7IEkHpvbn+)Wm}NTyySyXysHl>Cv1UXEZS`#EhXO~pbb!)MD-NR~y}WG>1k zV^P*!sgj#Qsghf=x6Wp7vXzqDjtyWoEDhLOANHp0p(kVMEv12cIWQShznlHp0t*z^ zCEiY+!7HIUnZqY}p0TEqyoM$3Qk}e;cxYcm#28Ngg=|hfOsM)I~186kixCA@gvBQ<5G(>CKJw>4AF3g{~= z{Vz+cd;Tf+Q7uAX%xFm%!qgev*EY$mL=ZVZGL%=o)+f&EXfQsKy(Ay$z1T_t{W=czdi ztDNe^4$)6)QC-_`>4g-ajk46rKsB{;^mi~FscoQnF&Js!VrmyiDfM&Mwlb)_3~?!83h~zV5QGyN3UriP-F|!LR`vk0RokA5p|JbD_b^T&DAh>1tDKz;Y%6 z^y_%YV3&cwKt;W!h~szBG@hL$)M40XLwC225S^UPj!%`^M5 zs+v+7u6gEeqytXdtVDR+ggW@ijEvv(3<>LIUUa!;i!+{igO%hv4zsk!@-P@@DMH6f z_VU>2b7z)0aKPhP*-X!iLffpoL}^xc4&qs|l0Pd-m@%s-*f6VSe1@jrv;Iv$Y>%hG z$aR;DG$K<ha6`A$bMExKTFsTOp2u+Yp^@u=ComX8zWeq^9A6L^f?e3f>my0y3M;RZcv@J+q7e`CA6K6G!XlMJ8HtN@T7sHE$vUC?LLdt6o1e* zF99jZX`4St0c}_C1KQ@z*E3|gFmD-)vXkpTVcvG!y-Vr5J#4~7rg^_0;Y(*Ai(?rS z&$~)Q=UoKF^AKh}bUpvp2syV(pk*c~=e%c7uX)d4gXcX&tau?>%3&9B2Npg6w+QJl{u z()o>8%@hi_HophCHvdcJt0@8C+Jc5i&78Is&%liMmm1d=e4%G}dwZk!dlntkxwaq% zchM&q{i2@*^4@`S#@!B<-7xOX@b0E@cZYX>>URsha2M0TxGT=Gzl^)uxQidI_qVV+ z?qpK;2>mVmhBfc>z!MYJDc-_ZBAgX6TZnnf!Ufi65f&~=O~mj4-3vE6eI9)gfQ$da zR4sf%bGj%W680(+_@J(Sq+${GR2CsBe4HD{JljAEc@H!G=rp#lEyFf-k$`B0(soug zStL6pi#}zu4gk~0$K`5Zz!vp|ywq{avz?|QW5IwqCe4-)>Pl)kmwVTqGY+C$`R(Hafx9zTGO_ul) z^pXN-y`+FE@a5}-0A@)|L5yIQw9>h4IvMkYLPT~6kc9?7R!g=RDzxNhst~ki3BBD? ze6<7>msSvv;?R~hLLW;JXIXV;X{-0@jVB6`<8J)x}jE6fSEm%eqoKoV5`b5~jJ5 zUIuwzPaHtSTn1OLY=$W2vN2MPJta!pNo*VSR!{Yb^>RB=|ARmKr0P~y-Jn%<;gTJh zr=|QSmSYi2&{#&>khWCuAg=d}k+bYCtr)UghUGB4a3QPISpJbwV|hNa#&UnD;Z26D z2R_v}c9%Ct!V_DX8_*_B%XxftdE59GIg}h1aMg<<&%nhXTnxB~i&$JlUc$v(TqGi% zUcMd|b1>UjegGFgT*bwCTx`X}bNOvt90V;ZVBcv#c!^~h>IYU2R@CHAM{saOKa#!T zUo8I|6~BN9D}FJZam-#AUi77ePkTcDyW$3o;tGTx&x5n!5&LrRB|m@@KiqWMHZpXM ze~q8aPTP-}^o;D;A=@9bAy@agxGTnrhG+S)2JTGH@?$&R8J^|GzPvL$%a7xDXLyz$ zXYtPPEI)3-o#|PA{E20TXZi6u?o7|J(t~$?WDFR;G9PQ+B8zxej(2iKns+U5XZoO( z^hodepp`>Os0yW8IUXrSvBV84r&G2or(D3#B&W}dwdN>f^+iZ46zg8r%C%tb${(FR zFO##o#vm;BN}keMX`a$rc^p;t=inaJ%5(7_adfVPUardT0THeIQ`6^__aVxa_YRSR|)mQ_*Dg?k+g(O_l zf%kq7@E`#`h`@)Lz!5O&n6HYBFD}57QQ;>6K350M7xArHoPZfBwQW`Udw^FL;3r{M zR$V8PSDk0gvsz6zyRzz;l;36fpIW)Ogag`ELs8cRvHR6tTKB7SqWjf3<6n9!-WdO@ zVbxzaG5%L$N#VuM;PYzO=@LpZ%Stkq*I;`8@+$|2^_pzB9E1V#c_#1wZA2R*7$*$^9QXbt-M z?BvUO6@9E%O@klH)B9k|dc?t2a}hr6F-P3`N>Hu!)i9>l2N~+HzCNmI)@XfGY=}c0 z)+07vA1~^#ei$hx#7GTdeU{IJ(bP^Fu3x}%QJ3{Ah|7xjpR+01z@qgSLZU9~PvL?C zZ#|?X>aqd5)S@mM3gUtTZ$m{u=fK<06c-$L8@l2`QG`pSLLo48)$_!#n`Y7mzrX1;A3Z4nED5wOMh(m-S_$1MLPR879{&O<^ahXbC~RZ z+uv>s;LL4fWum91l!v$7cmxTDw>LM1J4&D@g}2>!Q_qmO{6=iB8{XEk2DkAkE74PJ z@BwB%^i-O%Y$^;qHx)KkR5n#borX}vP4yU(M>R3D4tMfu zKYoyAQ+rkt$!?OF(Wb5h($y84^I=BzIG8;W+C;F93k7CmZa&JWqakN>Ht_)erWBKD zvSI***|d=zqOrMR&XF`x!{)66{+nKcWtC*|z1fpU zqW)$d)+d3R3-Ah>wAr8B+ss2Bn~SlU$-S1ysZJ4YuFHHir2<5_IRvS#)3$|A^hD#m z9Tef_FZ2vqve?WCuNg3Hj>H|%i~Ukj!WDU4&t^=0w^Y|KJLYtFUc!*vd~W6`j9&J3 zmsz@|ZIP$^HopV|Hor8P7QG0wW013@Fsj}|n=Pf-h8N|fu^bkQ{ZdnAK8Ude@m@us zzlEs*(p_K`&nOJ&Z}~*ekk9jM`5L*}t2-6skLKMHLgL*_+_@98Whoo$YlB-hk(pao z0^Kbu-O+{X*z&W}VcU5D7iVxWp9EaO#cD`BGa2NLZXi*8goK^)txohCKL$TQm$MMb z5OlXP?2BC7Bhz@k*<&krmrdli@)(wmyutjf|HsxkzFXy07hAsrzFWUD@r~W5Ek0~b zayry@Ky&L7Tzm!!wywj)HyXa<@j@ugUW6xY1$!$2->v(Q4moYxE1}~_e)u82P&dgC z?b!MVxu$k(Yk<26Pyfc?n;Nq%lpsW7woP+7vUosaw#_m$W*e}|;-PEIHaTy(jqYdL zE|VnDm>^`q+-|%2&K|MF3vufkwH#TpqxyCmlfE5{wHC+@S?G+1b+)~vu(#a-U!=iU zV@KEm%{;1eNpHDU-x0RdA<*0e%8TMc%6k=}G8nv_Nb&#g;9ESFcF5rEZS)MWpxZkk zS7)%rf^LVBZ~r}0BmDL%g`a-xt*_IOwP%k^vya2CZO0SM+YjnHXWM0Nyq)Jjwnv#< zjP=tT?DlzV$G7IpKCYRp*~i0^w#m-$_Ejt!h<3Zlp6xrJt=l)b>g(pEG-qVne-@fg zu~bc|Lb}K&=nGz@1^P1U^uhQ`hDP6;_tLjRWhK(L!w2;3C2aY>}iQ|rXz;Q=S=4mupaoo{{IPU1gQZ=P2aNN-w2^N2sOvVanIPQqnGX%#S ziSNe|(}i6gJSn$h0n$>d7u&I3P+85+mZP()rXAMY$Bu1~#g1(fP(ej^Ty#3TviLb| zJM&>I?06un2h6|Cd|sCvyP!O~e4MuQFvu+d z_JPA{7t}~HM5Md$mg4set6exwnjV&g+hMz!3Z)R>t_Dtr_ZF~rS9@8mTL>jXo^4kb z-AL`?)6=^?laPe<2O0Gv8Ip|q)Znifk_cCJ&7q3yN@Ck2*Pvw7OCW0r#3U6lZzwYN zBK^mzXS+@bkYj9dm@P~_YvHsxm$J~g2Ap&L;B@$WYu$cxVw)flf9AC9!|5O;;hLr*>DY0X3{jEvQSVie^zp1DDw3XJs7N}L z-NCP&rY{r~SpqtdXG>qEt4R84Vz}B+k@N#b{S%@hN8Ya@>9@(S^eb$8o0@>pW4($1eEvzcCM_$>tR{@9jK)l(eSXE?iHjp}5RAg^OwnVMH z)me)wvNxDlkkVe+@Y%}^pS>;K?qF{?RAg@yRAjHYzr42xTY_7A`&(3GZwgdoZwis! zo4}r8Sj(y+d*=Zke17#h{(Zxa(D}YdHrO`|4R9XQ+Q3keeQ8pIJD~fLO(wprBKy`* zMfPnbST&_ORAk?NBusG*45f;2;SN@0ALezEAu6)(_Ip)i-y>GC(TeQPYN*J5NGtmr z5WPQ-sK|1ljXc|a9Ly4Xu-^|D?$um-oo&0D)XChL zK!y;ARYkPE4s>Cw18vaiKpV5w+dMh&HF9?AFh%i!Kggna_+_>0`7x!@+`VqAxBS3_vdjF*TgIB5SrcD5Z;9(Z#P{I8Sg5Ad1il9$!-J6Fp>seZ9-$v) zcn~3;WQYt8-aziV0oK90tmFwRdZ?N&ewsl!56St7L-o+fA;cFs_l%S09@4hZ^&P@A z>d*kL-W}?~o!Ud+kj01ku<~bam3g}B&=@2x61NBGIy@OYAC5&o z`{J<~I=6Y+W;&?DtB~->K!PlI^KjzfEzCZMgnjIUTU_kt`R2o?8{sDdoIQLGoIQLG zXdj06$#s=IV~+GwU2cFMu_NVBJQ-i(88!BNgs;Uql8aS6L_4&yH2Eg!5r5&|k!o1T zJ5s^v$lW8dKA2htcl8r)n_rG!ffI?#Pm!&sSM;Osjx06?eI?+Il1Imz)w|y*-rtk>ZYZKYW&p51A6~cOF~ssYC$!Q zu0h)5wEcRRsxePfjiYC2y=MYqB0PB07q{32 zT7C+zEHM=5SOJ1kwFe@P@wC7(OziW#`aehn`hBdbHooOigwrbuLAEHj9jm73En2e$ zoJ^iqV>mL{MO$_;W~p1lKsF3U>ZKdfWBsWo$NE;}k7?Xu;{oFWvc>@71;ez2Crzi` z9)qtwmZEr$LBysVv^cg~*vTbFPzlfo6GWAN;G zEFe|(Dw?iVXpEG8#5F9f&`AkoaTAu#_d2h}%jpfIu6MGlSXVFw0UrcEn|B*%Y8{#S*WAJ#oY#kr}g~%Tw^5*C!vd3&r z+ljnTy%U9?4JYu@mF35x3lWb7YKeg{qBS^z#Hp1##$;D6)Vbn`%Y$Y+D^hY z=?5I36(?bp@>~GwCkqjE&DEZi2=yc*)RUG7^@YZolg->&(~8=7vM192DaPw8MKUM9 zA%JfZ_UP@#S=(_3F(tE1*iQM_AA+U z@)&C!Glx&iOLTk{S${bl`CqzZ3AZe*PRUueQyyq_%EQ&_wbtqsmiDZz+9(*Xrz)eL zQw<=_Q%%6{Q%xw&i3=&IQw#dV@7K<)I z)>%IQIa?(Ye)#_3vp9)}!3Xzowk2=*R)}NKyGZ3(eAh|q`D`!te6|~UKHJS?X!Iei z=d**{d+wz5jP)bkw4OcBhUXLJWmYnQ!)KqceumR_&WY*;V= z!?T>Lr%B0t$PJe7?_W2ep?dCfqI#|idOX*~L^bA94b^ksyQA8f`g?9HTTGE)3IB9c zcOZ3(fZe^agPGSX|ic zbQGSxVw=$1&lF?Kf0qS_Ye<- z>M6krZ#iiISf=Dg3OIhL3NciGA(me+;jy2=xW3ey&|1emf+#Nyf}XLbaTL%cg!Y9e z<9~_=erAKAmu3q?H2d&*e#A=w)~%7eg<@A__w<&v!AzjiHyZGgnp{48212|DPCo1>uP>^hzQC9Mu?lR0(UMoyXajgJKuOV_MJlPB}F#xXlVE|n7lL2t85(dDva_T}mB5zFroJa-Hw!yIw&$ZqJUdmsR*o!gZ_=T*rfi2?)lt@cKp` z(taZc*lfg8n2;HRFnstkjF1N`(YW3Ewu(r=hrcl1OWcD<{^F54{UN=-Fz3BhTlb!S{VC8c0`I>ry1eI9 zu$mpbVF!3X=2mW(MOl6-JZYxb=Ucv{5B=N%eI@RJQMZDTv=>y}f;#B7>Q*O!ztt(> zu_nM<;Igpg)?Bj11z9)V^~KiQj(6Fb+uZiQono~$x0hlt-d>8d?;Trnd!;6h+Z5I9 zm4>aky$jv_PqyavL1G9t-;PK6S+g~_FA>@$5&Rt=P4IUL(bn7%KHz^vjLADy!S6d& zWlWx+^4zJYsG&~VJ*j6nV5lMo(_j;1MS~zrXDCKakAG)~L&n1T$a61??_u`$7 zlKcn^d>8lQwU^r8pGYjl7~fAs!~2Qyc^uTgzk&6E$9+6xy!=#y09?Jq?Sqn-7Y~fd z3rL>Cf`!y_=JFn2#?jDu(30ppXb7ke8oJO))zEqHi90&;H3mKSH>>|!81x`nW6*;| zWYB{jh-oM;4j>&-Jj1Duvb^-*1UT{FXL3R^)3$L?KRA!^{NRNkaTNsNl{Su2&V;8# zcHRN)+kg)B+-4D0qdoIS!}J?@1IS~v9ecqDuKXS)U*AIqHg@g?y4@$clf)eSs`_j=>>0>O{p zIBiezV$3|3F#|H6NJxmHClJe%T8d|EF)4ybpVT2ffcT`bNExpGNn2jQ|2&b|#*hWYPbvU{pb?(VFr|s!! zd6)i^eNIQ&j&|a6*udw6i4W9R!$;oY^yD`2!78i;ANKf)`ty_y`l$ySSef$_F61fp z;q&5Oadg$&3tc^}s(1CYHtPeUr)`mb)~Z2Hs3vye=@KZy(+E7;w|(MhLlTDLq^1w7q!D_~_YTq!Z>`i}f)JCSII&Jj005 zZNsxSEPLW~1T=Ff#>C}$Hl1J3X-MBUad}?Sgz&sPxbnPw!VAs!J#WMk44UUHaq+J2 zYoHt8=l>$-p7&zoUM?Fl8;fVa=sDI@%X-Pl;^&h^-+1!%`E(I9=Ofwz8hnN3FBXVL zebLF~QD5``hr}4F*YwwYR2ZpMOw2LH&`9wfAI>t6)$a|?j?o-1{MYRG8+s; z2gZpnvH$UMz2ey#)=b;3c)6c-H){Mbr>}tY@-!6b%iKY?uRYnVW-(s}e9&S7``2w{487*Z5?_aXl4-@q9wa%Y`WU`l z5*WW8tYIuei8E19v|kCyBDzPNjtZY;GvCi-fn>Y} zgkPXw>k1398}Dbb)N+kH{iQbYYVJ3)sW)Ktn?+=`e#qs`FYNctevtlVziTitxWbOv zn`au&%)m-jAScZLsLG9sPW(u4aKWj1$Rw>VF7kuH46Ia-=Dfv=?hzZ*1f+iqtW=K} zprU$20IElX3l#=d<&d@3g^CtbsUA3*gCDAw>Ty-nOZB*mF`|0FEES%trqrqJR5Ld~ zYU)(8pU1FGc!;0O$mphLaBE4;`~`B2l`1v!7*^C)syt9Q7h6l(6cbWbGvh4>3>7GP z*_>1}Zz3%CWHoa-5^QI}E2;|V_(ar@Ni2Y7Wviae zovLjstb^*=38}kfolN!QYn@cjUKj9#AU3eJ83zDoPkcmJ^^7TspP~AsR`nd`ozN zfRV3-kpz23zz)RKEy42!@x0`QCs6_C#phv%RJCCxBd`k^+luHDWYvbf^1#|xkyRgE z9idNCZ5^2>JhgoRp4v#g$x~ZDmV&3Y!SCm(Ef!_#J+Skt+LBOrEVR+K6hzqeBOSJ~ z*mj1f+fD#=+fM{*WwGsdDZBL?COZAdnT`%vS9s_>&!| z*lie?c1S?Y`VzfxVA`|3Z(t&-QtgF+x4jVXwo}(qm7=(+pvPjWy_6f8_K)>pg1+tb zk)m|!>>;4e9%4{u$K2OKoxPt>*W-QE*%3CV_Bo)=zLtn01_gU-kvjVvq0Vb5(DeG@ z5`M6~88{XtUb~#C_X@plufyou>#%+pO!Y#17g#$86|ykBCs&>QRSRXUHE&Jn(15yA=8`~RZsEEviH2zU80ct+K`x-{{> zhRZBYN456GVQ5Qtx?dcBKMyJ)0NcZ>yVL zINk|$b8KL8MOYvjS%6P1a&VPZbxeYSpf5-D-C51}iW;KBvFZ`q*09;FdZgESM~`G} zLv?VyP<3Fv5I-(KjMC(n&93ubmtQ3g(rkqhIvmIhEyz|<*qbdF?9Ep8J?zaELj8J| zz1a}SWcy2JZ?@j(JX>#rz1b${?9Da{*|R>x-fXk}j=lTA-fSnB+}MjOoxR!ilJ;zy zz+Uv_s9F4j>}A`Uz5gfnl06ThmDw06(Sl|7Lc%-Dgk{-_u3Dlgei{d9hJQr(VlK$~lsAA5Vz~J%3Gzsl;b~4M`8s)vEd;vk1MCwax znsYc(gyI>2$X{NBtmed*Db$<{A9GGKVPN4_>tntS1Cq_T+^Obj!DGH^PAoQRm}dy) z=SA8%w?be!x5f{~sJe)&qo{Plu!`hX@+Q~jt)?J3A4vO~Z0P!kP;57>7d$|3xj}C( z*e>ZSR~gpL<;T1t%rm)!KCp7YHDSYgj-aB?>`;N(UaEpT$T7dR~i&eu*g&m1i5tGS0F zje=jrqzOn89+qcn-;pjv{>+*#S+{YukXIlj_Xd)Zdksj*y~2$Y0>wzkjagRg3SlSl zIW;v0^ntMcBm}y(+|OZ)a$^a+&JBLoQO)B(3Y8!^PeFndb;{#g5!t@-eGqg8BZ3lm z{yagrI4B`dHMr`X&$jFfK483N)Q`Z z5D)$En@&S`QeVMwkyFj*DFVo|%7r5~O4U4@OdR(bIARg?LpXvFc`k!Pd9KU)7C4mW zJ~<>Pzb3`7sTOr57I|$*FNITi#jrpidHM2CHSaC7$a~GLMg6+BfwYeU_pTI>s| zn-42nuuXicrJAoJ#znM^O+I7ouguz5fY)jdaw&SgI8<>8pYzQimf%aid8`OU&$mVt zJ>MVf8V``F`7S3N)wC-g&L=^;&|iKJr&>_rqWlhWCVy!#DSt`1EDTqbKPM>VS0&&k z(w163kE!ObisHw@-ux~h=XXk5iaP%$*R#Od3o6z8KNCxK!Ph#d`7f{w#Auc-z&u@1 zHTxtltyJ^Ba;gQMYa5zs0nRfDX!8tET;MxW6NHNxrgx$P%j;(u>lcWzMhBKczTQ?X zu!c#G4iM{?;q4eFL$3mhiF1J&7!Byj(V(6Yz*}G#3tQzeOaRK!AkqxrEwx-U>d#Zd zQWZF^v!;No3lz8l))e^FjWrNzL6wX3YQbels}xUsi#k)<1dn34+mM!sNE!4M{8>{c zB3tlR@TVXcT>B2@e)xv*CWVfz;4^5Mhr&rS=0BjiP*$c7ajsC-f8t!BT7Xf@jdO)+ zMRXzO3W-7$$`7WXCr85}uBghw6)W!m%+YYW8C6+oahMirPl{yx73vCIDAYB6fIN_^ z7WzMOk^OuR0KKv*5LTh#xGbspJ?fO}G2-Nn^0hy;&}4n^6v8NiRo5V|B?k*FBm8Bq zc#Q5AL%tBKSFISxs1U4IEzb+MI71*>H}3A0$3)aZmk8(*Utg+za>-LZ2nlDxAnBjI;_P zY%aW5@r)S@)!_Rp)xt}ijz%Rh5DRZ5m4!C~hr+9wX9fy*)J83QT>|Db8!RkR7!}q7c9B5B zjut;xqzUfzPot|vIter!tx}7$cFCfb7Wxz!2n34^A%cW9meAgn!)S85NFrYRtQJXT z6%M2#IJQ@0jax`lWF321=N{4&ImyhE64Dg856PizQ4m;EwT6d9vo=Il_D1~i$4@?3 z*rJ#kmEM#ER2MA?s*7r?DnOzroQP0ew6;(!AxF{nPPJGRLyn?7k-juT4mQBdxzYN% zkY3TjxGKr4(UOHFyP{a6Y_uK%Ey_nA)uN2~i%w%TQ=kO85^1|NErylfR*7E$-=5eX-Jc8<(wEE^I3v2BeCI8Rn`uqN+wEVStOrGJVJZ7mxiX16+J9 zV61gBz{S@_bfN(+zJw$dPX#a0lcVXg54bLXax|;^KGy|TQ~aReYKmv{5PAjpE$C2j zaH7%r2|L8sEQD1uwkh9ZbbS%M>dNHH=+#$?ULktifnQK2Uqr7TQYOg6Hx%OVZ7-1_ zknn}(G+Ixbe7}MWeX$H_ks)Q{`z;ja3sLD3Em#Vvm*~zGB|4);iFR%+^!T{MP^p09 zJ8B8b@f}X1fpduj;!HScQf(IDU_xN+*%H}=PrIwsy@e|4osP!KL^VpRg=f(2^+>XW zwpC>LrWyu%iQNFofnI`#-PIC5vm+X3w}D>b5}1$ZK;Nn^@C_yG{J!P^Ce*L)X$$SxHsTegIDO^uQ~hoYmEN=>am(>XgI&} z>xv%zdKx|YVJ|}Kk<&cg#QRM^mDwH$Yy1)=R`pv<99Dy!e#?mgMCG>y=95p6seWe& z@i&QKiP1emq%{4WI@MCkGlx3WlBq~(*08ALVnbI;9??i8(j_kgKuOFA8m+g6MWu2A z5T5fj!=h5fkx~3Zqq0=-e;Spg!T`)DBsY1Mf;@kat12An%`kkV9^-FR=u35^|S@O(|W>jYFl2MUJ7} zDxHTMDxC#(3q3hP)_lNj0hA-;(fjNc=+vhbddLk`E!Lr2P#wcYzVvJIz1goei^$`)4?Sb@#Q?0}oA0|A;PiADq>lqRemQ6*jx%FFi zJuAKw5tcp3CfP&L_$1P=2-xtfyyo@F@^MGC?8OWC`LEN_y1F@>83>krE+ZK zH?8{+94v(YBx{J}AJ1%zbN_`{IYczC?N9qJX7)y;eaN0`W*=yXtmBRN0$y5P(YRv_$kSsd@{%aazPUUuw)SGqkoW6 z4alQK82SU4l@%QAR0Cj6L;bj?7EoT;2z3r9gS@_AV?ZskF**}1SwM57&u9<>+RHpI z;NQ3$Ai)VNIgbwn3?e3xgcWPT!t%HV3lC@*@khWsr&_MGC!I{d3ic2B12)mR2VhYx zv=(nqYuXzi+8aRa4X|kMP;J3K0E-2!xeqUaQ+QHUz8+UC=jC*?@yQCQmCMC)kW{V^ z(ExhoDu74j@X)VXt}+lUSHnQGTooPBayVBnxLxthKt7k930oZgL z!0-y4;6W>Nf~Bv}R#2u|Rrm~Ps=m!o;d}C>!q>pC!q+ZS^%aE8R^zo+B5tT$c+xmn zKP-7wn2j!cgt`hdq4wIn9;j59Y0-Lq?vmIoCps%3-wNvu`B%U?ktk|~bdjaR9Tg6t zN(Pm_!b!mvysWsDdr1|GgTRV`fK#y~sH{k?_$eT;Voji05y}J&WRr>wk%sC7R+PD7 zMa~r~TIPy6ffX@{Vk>t7F-R(6+9-NdF@e&pNP0O)Dz2n(E2fkC(94R4NP=Yj$}HhX zMedbVycqu-VnK+i;scgk#07^=AD41zD_Y5GcvMdf%q?s|{XhrnLmdNs$rjiG$x{O> z@B^M|U{equScm9&NOys4Ab>ywuCP0Niu)n%+FK-WdIg@}W(zg214R+oodBTop$OE} zKy*~8Ew@4g@j6j8FakTjfg=cU5FrxSXc_GK`Qg8K?otgLho~$N+7VidFp>bHfX?v1 zxu8C9uCZAchyYci<_y+ahD7CZ(XSt8(5y}+e=1_7;%Ho{xJwcFSOQpAsV-RutSU7o zRxTLYqY1#FQfH(D9fwL^39!!y>@ydz6mW;YAX|}xZo<;!Y@%9eI;&5Q{toW8(t1?c zp)JW&+QB86N?74(U0qFS00&$dJ3*Broa)D!=~rK94!Cl%o*@pnGWNGz4!H9B9dPBn zY(n2t`6$w9(*Z-pDxY;a!Zu;hSH4MFDqjT-l`k;Q9Q0J1%CALjKviW#L}B>;om$05 zMpGDDAs(xepPsl1WLu>YoZ-$M`sP)YD$EAws^H_EmOY#*jlqU0jolq|l|IbuBM!RC zSnvfytV$dlX_Yt(iYn6x241*k2NF|dDbkNtM_OeIX{fRRG*rQ$x6lB+tC9{nsvH(N zpqW+nI~^U@k&bh^`V%~{jJ`yYB_+fS_9y# zHZZ_fg+~zZRYQeMGCQw|V`Ek4>+8u?QI)g1syMpRah)knkX&`Y1*e~#YETs+ zx!NKEMdP4cY#fwL#(lLPfnl{D4KG&hKdb~G)&7DPD>5;{HAvp$#ej2A5#kJy1i_Mq zZ4$2)REw7aJ}4OAgMtmO71V|$8OZ8{i+vyPTCku&-;g>YJxY)s#-0#jTZFHT{2;zM zPYuGW^YG*1H!U=bOwa;iDg4$Q5T~6%>j1o&hUXfLSM6T+KS66W@mRN9f)2uJ1s#DX zg0w|U@IMGHTT~%PTf`Lq69ggF{FwGI=ss(|Fcc@~v0l46U%;Va}GWTm37*ss692*+CGCVKqChqo1li$*I;j@4=X?24*T9*9ko}N`nzK zN*i;v8chf`2w9&neQ0h~Ajp7-;Cp(be&RxfMV; zy0&}Y+zK&&jZ|ZvU1ObSbW@7B#x9UwV=E~&=h=|d-%L1bz}nZWEUc|@mpst8^OW3q zYWUWgc9y{U)x;DkjBmWtr*)=pg&b;@(AM>9He_YsP!rCw<2stpnqP=`p_(;&un@zi zCcmbkd0phGHOFY)p(gdSW|U0#YGOQg{M4N8)#OV|)tY$p3_qp<$8^DRG*q+ZF;s3w z6luL_#%p3NRZIvdw`>heYtJR=nh)r0Y9dq!+oYy6gtw{H7OA6Ct?f&1(^&I1wfgB9 ze7}%dYp~1Pa9!cF!bj%STBBHrOChylk!HirAL1I27B|$QqpmeqPWGeATC1Io?xnPm z1MZ<39(2YqsI?s-R;}Y0`L&#=(G)n=`i+NxYhA3*>sub+V{IS9zSZ_3Gis{{$!cNF z)V-;Pcv-8JtBtpcAlz@Hs42mqug+Mc7^m7`0f>m_n{qNE1Kvb3guXiStn>jjjlMc? zGz}KmL0_HqNL#Efr_Mg&QD-+OtFz7N2)CISfTlV}r0^7os&f>Dr6=Lg$@0@_%Q-CT zKxp+k$og@eKiQJC5W|I+#=C&jI&XLdvsO0;Vbt|O2X$3evvyFopf9qEfHQUdgfoCq zwuyKxT|sESrYCiOB0@h2LTqx0P2NI? zlsp03TC-ujTAZ5JYsejydjCQij<^G-8ss@5wcbemIU=>*RAMG`{d#kGDI>hzMvRqu zOPr2RcIl4{sr5vFW|vr^z#~JXx84Eb0%6pXMf!SNq_2lXdUty3{Q)`DyKcy#o)7>z z)WZQ==-~p&q26n!TE8l>uU~>kee3%ZGM6sve_R4TeE_0pSFwSgxB@%neci~1Sl z1@Nu^fIN)8Z4Jk<9|+7EXu}WS8enoMm^IJ_Sr~h6PzLFH_S~S0^xU8~tA6I*GmEED zat&sxDUC2N8=giw?^N;Kco?2H+Q4jhU(b+%+3?wW2WBv+Ym`}q{DTW3m9@%0IKYs9 za092~vpFLFVC;!}Hb>+i+zYq`hvD9ofACjQ(Xv?s`4c$e@Zd2r>S@);)8L6vf#68i zx2k;b6d1AKnc!wH;<6rvL2K|r(i*&i91q^$i=QpvWbiJLA*@$09956P+A;^2AN-R@ zGK@Al_*ZF~LHif{r`GQiHo=_VXktoKO=%2XHi|@==v14efnf>%!4HgFqt$u_Urenw z+Kya2PXYBN`{cb~Sdh@}E}$$XS?*xq4FlNdE&*f#D;m9Ys*Uly-WWXRZW#E+o)wYl zX+&_1a{{}YAf++Bk|W2}^)r8Hzzn?Yh5ksur_>^U8#hF1j)+=2=Y(Tg)V>j0{fM+rVffbg2-}Ld8*?kQ@k!a2W5dgA zXdUX>zFcEimnJx)5L3=YUz5ye+9b1lat{bK$xWbcO*iNZvQ5eo?Iy)oznJNvV|Qz( z1e$auW6*gM=-KBZ5Fj)eXwnl!Nde5?s?ZsNBgaxTZbHfu^5cz)u%~Ge-vn*EHR*TuotWdj+wtqhK_hG%mLx zoseT;*tbQ3Qt(+Z4Lriyui9cTXWfa9V)hEUWbWhV|dLxStLOhlb6HTN{Qa zrIW|aD$w^etH$2cl&0Wu^SVfloN8CRWI{=puJO2e7d=CG-2Aim^0+yc%DYy~8H)Db zBf(z8ToxsQJ~y94)SA<1G>6gXUCxay&6gT%X`YJ0R$xo>^*#8|&jYqXh|+u;$4T=8 zNO&a1GK+3br`h}`_gQrF+swQzv*;E+X8hQq7?Eg^4}~rAnf!@qrtzl*c0GHyG8h}4 zlt%>70wHYga-uCQ+Oc7~xaQa?2R~cVmqOP*=xK%p{9gEw-}+3}^v6n7AbBS0JQ?+8&8ZMA~?PkA{vcAGhH0 zaSPY-aZE6%!4PSg)#>Qd-9=3SBGR%rQYmZn*0M5L(z3z@{FGtOrd(JZOIa@Dxn)<88%A_X_>n%Bfp*I;fuz3C*m9&(?NUUZqYNa3lmzx6+L;hwA5vDwK180eiK$Cx9s=ZA zd1(rZ8$KVf?@(Fr*dX|3LWMfNZsZENC?ylVtSe_^OgI zNw##MpIeJ^ARu7NuLhWtWJ|4g1OpzmLgXquYIT|&%7RQQm{on8x8gQJD{~v6H6lG3 zk*$k}S19v=B^eo`frWR zW6|W+GX+*M8)6^XGDacO){7z2)~gJewqDLgV1DauBGUlMv~{{u4b7X0TO6%H`qvTQ zL2H~&6dtrb&lXgj*0-3Yp^q0RsjVLwhj>D5R(vTg_#DnULQ4_ni_GB^HnbX$39V}& z6IxS8CNu;!^aDDf9h_>Liu|sn8k+2M^bN`i$%kTE0wkpG&{gO=bd@L_L>qcSDk)Hz zP((DLf4-x3mW^!>P#*fHRqZT=vg_R@7rM`-tDSZ(piQp$<5apfS;*&59{fg6j=oFm z<}*GPDAwbW0OsiXrxz7Mfn+VU-c~zEp$#Z#^9|n{p|-&S2?!T*+q3|=ZCb?tsi{UA ztO>bPLs-2|26h|FLVK43Zf!6NMPqHXq)j|q$BUV zAlEinLk_yyRy-#df#;H8qjWpP>+q!IatfzycQnr}Txi=Bp`Lb62lfy*UA6IHE-rFR zw1v-=G0}Fk;5D563?xlfztwgMw9<77r|mpwW!vS3R<^~Wk_?fyeDRZh0KBc!skX~1 zTGyboIm-rLC7FifC3dMloZGCSkJ&yK!iWXFQweMijA`gAv^^wgn_urUyz zpwh7>Q0Z7R(F36n*xs=n*^d4@c6K`YeI@;Cv9fM(Qku~#bsPX?=s1e?hM3CG5%TTy zsXqKVGD7Q^Yz)7Sy9hT3S-&!UNN62@{U@Pyf@kUE;U=_B9@;Uhj*o@#8^jFrz3&Qq zP-p<=_%8f?LVMfc&{}pXt@Ec-1&u!#Ae};}=bidE)y~g!>N{5e^_?pi)OYTvQ{TBC zvip6A`p*6SiTcjTfRXG*edlCNWjo81u=8k8kDeUg=ldY_0Ot6<+y6v8RJikYT~Rw@ zD+$zBNQ)sp6MD!1Cs9nlaLS6j8pe}wc_xE3{XTV=| zX+r-6we8Xt5W7PoyTE%(T<*T(kW^4}vR%F+ps%98yNG{?YkM!$J$9D_c258xvCm~5 zKj^Yvx?Tz7y2xyCQgK;2UnWbSU3Q2;WZ@<@McmWnux=2gf!gH{eLB(QjsUvKuCKai zxPmd1feCwNG;aksT@lMj;9-uS@T9z4BIsI_A#2xCELKyRVTqvIr%2GC?$PkGiO_8> z!*s)BPcmd%z8f~bjAa;wcVpV8sTb=KYkW5Zw2zk^B79Eb>Kp` zJw(3S4q(s?gboOG<3hLna`>2qu)qUCK~J|cxCkfS-TvU>VYjPvBHiu-R`;AmarM$* zTsQ194hRL~x_fEnTo~KEkWtDl>@g-FOMB z(fvE5uQZ)U)FaE5-FYOsdr#Idt(zaK!ZdaN3hL1PE2m>%D3r3h?BaIkE^hY$tZynM z28vcoTlx`wRMO;&`b)+8;~k23t=Eco-N}k~yoZQ@qD-R=g8NE8a7+D&C84Dc)NSDBe4h6mREV z#rr?_{}bB%a!>I-{-xsm-@}UcU-cF5TR9c)+h~91km7y6wc`C`wc`C8d9NlY-fu=J zKAA2lK92K>Pxg_DkKZ4PPs!JcPw66xPnoPp4-}t(7{#Yzf5oTjV#Nn^U@87d`$5G5d)DsIDrD#O(tcZmiH9!J{ zUZo?J*jvPgq$hVNn|8U)C70d_q(Oj?1*J0+f2XY)NVm{6c=5rW4kNm)VPQJ-}PEBGyr@`wC z>YN?PeEu;ro$4>9(`;qBZtpUk_8z1kn6AeYOxLp?QVY{vlgf0u4NTYPJErqJ#&p+a zGu?G|rqgd`I=qjjyHC$_kEJo)n2Ss|r4Q515}9tnzfAY!&rG-EEv8$#jp>%>G2K%d zrhCJm>E7IgdsQEmH5h^X$t0vSq>oi1o;@L=R2)Pw*H|Z8r!j(;QwrBc8ZcS22Gia3 zljU?}>Z7qvu}9IV{}=MIfE#5#lH5RWwNO;|0eaDoew>by1?g>Kfl z#EzrU-)?+Jk@FZj_>l4>dIGzdRw5apAcH4w6}vH@fF6V&DfFarp`r~Vo0BZ)Et+Sutm6VG8D(ImP1}!%SWI>0h3BgPl#8m!F>=wqDf!$W|H32FPGp2h7Hhp&x zPz9BB9t2*9d$@&;7K{El>qneXQZ{s}`EG+j=jEPRw{ zAOW%E|DeM>)PxR9sMteA5PB&nEYcv|h%^CZ*Ha5D!XZc%yHFMKFTx%W4xt(@`B8MI zFo*zZf4Ua=y2hg6m;fvqZoZ%H#H|bIz??;a;nScHoabG7ya=UM5XTH8tXMC-MkV$@ zDagVpx@oK{tVlEvvfuCYFgBLj)f4x~Lo@&%w^vxUa`ob_cYC;1j-c{mir za68lr(@2>44XXYf($7$(CnhN{*AmSBmiC0I{Mfc7KjX^fP&^|$6ejFTE-*GxKD&?$ zM@^&ZLFIy#M(ZWGoqb;ie_Qf%r@y`T2l?B3m#FDpqehmc1QWNvxl2$;DtY-`oXZ1Qm)bp=2_m_h=}prpG*b+T&C%$u-0$T))aLzuDedrdH51Qt z_WL)fVW{6PwRg6|YKhumbqTdY6t#n!p1U2~B_Iv)z1so%O}g~^)%%$4gIj@0b6qAN zI)5;f_4s5E)4hEPo#%e0d#@W>3Q_ihyMcgf!0}I`zQ!8MM&M!%?jp^9MijB|I~lXD zVJ!SL#?mJ+JWorQ5)L=WK89<(c&&Jyc)h3>ZxH*6H;OljH;cE3{lr_v+eAO{cJU6e zzc@e~C@LW+bwuRc$c2%IR3eBf{j{gXnr^kT5s^zZ< znhWSFk*@&i?}Fm(FhIv?tQKn?pzlP!1L)l@=sO%bUSrL)<^!4-nF#1$7c`MWCu*!# zYXP8nk$HgL3hznZ9p_4V%ENc;H1oVqwv_`a15e4FXC{joMMHzCBC_)LRwIz9|Be{%GJz{R`85Bh?21NCBM)^XjEcx?r zQT@gHX-!9nVk@Q=dc{IMjZeYL9b9V;Y{K=L2<{=|B74cPVp`(Pt3zUT#_Y!m-DAph4bOhVSj<6Z3>Hozk9ZVU zR@poD6yCd8@0ziLgbXXIDH9UpL~b~#TtEMCmf2!!-}Y_p|QbK9Pz#9cCTa17&|BS zOI5&cv5Q^uENPdoWqFo#ktZnjIb!~Dd+du;!KLrJZLzN+e>HuLv5~Q5Lcp=uL=uGv z?gvQ*v(k#j{RmpY`bslkB4IS5rNQHY%!?7$@<>92)?nu z9g6LcF-{Ohcz17%F|p@_kwI}9-#Fc&xE>ra&X*8Zd*d17ZitIk1;yPqAdb3GoIm{x zY>&gEN#=GM|%;J6}Au&O<-vXkKYt^~)#ZDql6M}^k7Q`CdBR`ZCs zzvKQj{X~8Far9Spd~eE7UykpKzskT6KM>dA6BH=;@WcCZ{5__hgwgSa3GoJ@H6HyS zwuSD!QZ?~oRq=Sq5AS6lu8fIa85+NmUyftO__4SFiho@=6aP+pgepEUG+rLw$H!NN z#>=DiL|{b_*2jWh{1;Xe-EGAm1NFLdCV`oHsZ2M7nr`3(gH88^nsB%X*i2?dQ!muQ zr0=Y0f@!MCv>?>9fP+Fz?}wV+=aMmmV ziT#qW{YwyykVBpL0A*OWZru{8IU=uxjJsJPZpU3sk+=ZYitLHcQ~5~X>|==%uDj}y zSe&#(6_Qw$h@)ZF6atS2^u(4hmbl58Sm)50M)Pr_awr=Mr3NPMZ%_OPr7KS-e(#rf zz?y)<*2Lo|nZoD8d%gPCKP))$Pr)zolFLL%*Ey4PM08CtOmjNvp2JD^BAakEt0WC4 z%56y)HcaymB~8PhS7DXp5lPFFo)i7ZDx;v4I_WLSFl;tWiooABCT^7^TCz|qk+cEV zUA0g8Q1t5-lJrH=Zj8O$9Rr`TM zsMyT=^cZn(sEEk~`afc(ScgxN9TTx7D^WEtMb}?E2CIo@oFW`CVH^L7fWLTA`WO;Mcy;5ds1F)ONl}GkL@X#79EUl+1O&^-3=UN1(8A8(x{1T%`T2E3aZ6qn=Oq)n#$E3|+Y0Fe;FNCJa@j4_e zIW#Sq*FgA9TgGdYa}%WP>7P~$b<(yt(-2Tx>ZEPEx;kkHnNTO~7e$?PUuSwxD)Lrm zaQg7JbUajtI_WF$$E8ks1Pe}27W~pJ_BeFqL+Ldn2z)tZM8+K%{*~j%m&e2T)ESRb zhI~1L@*d<_#yl#R0QcO-GM>e?;?Nl;Tz7To3`^xWO-RPcjB`xWyK@fjmvN!8nw}k1 z>{W#^%Z*M8!bWnkYbJi$GL(f_9;Z&hY@mgk(7C7#s00tDvuCoGr-i?>qM*E-~DKKHV`=7CA?up2F56@RKjENd*$ z9+P^D=(NNVeVP__SW<|VQqeuBw@AL0f+Ln3z*0gj#iT;l*{h`@^Cnf0rFMYjYm$T} z+?GupmW@PC7KcufBNP2f)gg{cza36X^MB~ad@b!n>_?{sTdZU;DgSea1tYDCxU&oK zE*gYdI*99KvscS+nG7ddS zE_ar!p}twej%3|WRYJ3{-@jsSWS=h5W{t?2Cj^|#8ZRSFAtV?xYl&~xvq!SX0;u{t zuiCF`)t9r(RP}8cX$>K*4$4aP&9WWIvdD$lw+q9c?^?4UtC?!9m67mTCz#d-Wo`G( z`szs5XL9LoUiG)GRrhB7PE`?1Nix})a)Pq{^tA~`vM%sa8_Wq+`**2o>tVYSRc+V= zfT}jWBDSV5$Trm1HtdK^wvtV@l7H8#BWw$(s%#~jY^ACo+cIBU=n>mWnc$0@>%Cp8 zzG{D46Jjg1(M#+Yy)fVFu&qapTZ3#{(2%yT!t$n*f$Q~a%YKktPoIq;CH*}d357LTTI&kb;e5W?Ab4Q@Ss>hb5ecwYjS-r7>+Kuq9bREf?u{xcI518;y{j^{S_JQboSoB zY^RWYH2XJvJ_CCYV4c(1$0_<||Dn%5<x!WV> zJ3{}qBgftBXL7nWJ8y%WAN~(*kaI!svv-%E>$qM0>@#z|A|36^6dk)*Cdj_V*B*bwj;Rp(m_31ai9ubugk7wN)P~sY_M*-% zVJ{)m2ia?U?Vp4(dyCV)fy8tT+$7%@9d-&0@*rmSoSstycjd7w_fu|q`{8ywh9{Tl zbFbm14`|CB#!a7#*-R##j>cH->-6(-7|VUunY-ANJNJUzSG(xSn<4j2xxN?dYF!~W zP4LUL%gvCBnVH-ba(64uklX6a{fw?cg$;O zr4Jug%Ig`Fcav{k|08*5Z?r`o)&VN^&go*NyvIr&*97Ig?VFbr#`0pFd3;Q9S^Y#_ z8nK62@=`kFYi^1><&%5v8AMmAmi#1c{Jg66ydr3%_HJe2@-??~{;4i>x>!2@Y{5lt>4M(v1>HI= zU4U_nTe{$BZs~$GZc7*BK;8nWqaf35=>l69F5J=ux&H@C7i<^&3UiB=nlXjxEU0juZ(+T@uvR8Kys$yr zwc3`#1HzcX&#~}a_*?(NlYWJ#hr_qbXD@HGRgB!gl z$!+waN*KMUw4(?CUm4Ad%CBVfqN@Lc(Tny7enmgaMlU)o8$IA;F?tmb>%~LCwD_(g z#boFdIjk2CR=CPxLka7}205%3k5F{%B3e-Kg8s#e^~JdTfi0P__?43T`SD1_vF*jH zJ1tPWUa>$i)<4j}iy@Q}T}$YonUY=|B{Xf9V|WRjz2xdq?#V@o@BeOrk;anID*7%bU2Qs=dS`f|bY- z?D4izHCM2-pIgDwK*&%!I*gS*?kvS@vQq}$lS{{X@Ng?zI^lm;Hn{XT!LRfUxw%W@ zi381~O0n3EXjWPqSlS|#?kN4dGnAEnNujKCx4!giht7UT31#O?_jrgRN3zm=9D%U+ z>y?Zg$x8QoAoEC8`eS*RI;8Y?>1oftUHY%H^eo9lefvZi0z4l$N-uTD*Rl~Vbs?r? zU1L~K*|q)4ZtyGXD|fjvIBqVs-!o&`;BtI*1LBp9X)k*WY?KkD42vO%bC0)`WutJd zzHFnrJ<9eF`qv$0J6+9wrfhc?_B_s&?fpNrLD@foU%6IpgK{*!+y>>NsSUudd=~wL z94QZ?0=dhTPxsPN>2l?B2rD7k#a;4F@-No4lmDe_+Ij~Azzp* z&#icu8>hU!y&T@)GEVsqWSr{ zVkJZb%S+tK=}6X zUCi9qRgA44jsO;p(-lAw%;bMq8>9_Xe7{{9?XX}Pt+g>Ad~f&<5yO$=nySMO@(h6& z0^1ng7BO6n*X6>0F@*nOzGg`HU)BcN*&m@cM5s+WheX_H-Nf_#4H5m#eTPKcXWfj2 zzO4ZfBO<0m90wV5FCjD{0M_Rl_#&3@LOjfiz{ks=;!^C*V-fGtwGTCs!Z#u&;yArV z9g$*)NHAaHj3{vE3fBDtY27n1w?%tb(AGN%JWa+aDy1!K9{`BQttx&y#X;&OhqhqsWQ{|pr7TYU&9ND z{w4yB@}$2#7B6~&{w_nz7ewDF(?10gL?7cp$@eUE9O&;0h}FgV#U2I;^9Ug{mL3oB zjvISFFGLTDeUyL!++wlQ=-TLEz1SyX4^zO1ecBMa%pBm1#eG)kV{$9TrW#@s&BoSP zJIVs7rEiO^GmoHN75fRHwZ>vVC=Fz((eU`<G|wO}yG-13arl79TP*HnL)^=zq#<$dT3g9Y_{6IWaTgJu z;`=&uWfss5xGnx6IXuOWqoUUMx%g8cho_E!_*de?O*9mkR|=v0;1J%X@kzW8Y~wA& zHi@@md@&(<2IKf@lbW+_G{kQ-B{}0ib?C}_Z9}r)reu+(V~sWzs{jlj(;?O9u+4UF_wmRha`Lt=}cT; zo4TNm*%b3}Ok=neD?lrhq4g8Y2q1I#Z}?k-DTI!mMdB}xbFmzyI`M@GlN0MAUc@?i zEY%T5MPve(_7#AM%KED@>WQe)8NN(J2p6bP7<)uxJthrg#;9kalC{{TfKm}V^4_Mu zrkNV+acK~M6;U5+#VIb}1`eF9v7V4{vP9Iu=$=~9T@!oxP;;)vdQ!TJ8KVb9kJBd1 zP-;fwI0^vgYpkavd}%j&NwirjPIUoa=fEd5*59SO0W69BK`Tyk0r7YiH5X~De@KG? zJR8$roA9&(jKOh|04~v3PfIu!A!bC(a;-Ss1*Bzb(X>osJtGYP@coz?ZGy!G%;3Nk z8tYkUD1cwa_ScFoX=6@t;7X14oOCaCjg5$vwBk&qX6#cO_>9JSUNQh!A17$VSuWtW z9Qd5Z`lo~i>bP6uR%jERQ-E=gap3bB>tE9S0IrVvS1ZnT0b4lmMUC}u2@l`nZ;qd& z73V0xc%KcN-pxqu&Y;OiReMd@Me z#OY}osTJodK+^yYd{blnR~iQ30#lSWlD7GhCzxn`Uo?ejte2!m0L(RgtrZuzfU+m7 z(nw4i4&blmJG2Ql1!z|Dn(t^NL3$KhWu7pQvkOx8S$1K-m~D(NxWM`PZi#p8Sh zn9qT$HIiDwCyUK{6YkK83thl79Jod!X{0BZG2w}XD6P0i0Vd4nzzB`hO&S4UZo+3; zaj^?n%YjiENh{$Tn1n-#y|oF)UBL4k7^9K8OGai)9Gv*1HUY7f8zFHN2gYfn9@0nv z!xD?M33)D{nFCE4si%ZD2@_iqTeTv+6G7%n{E7n;G*T~VG=LY9251v%6=0H%1Cun; zHPRSnObSR^sTG&HfKxe8)JQ(kSOC`~*|p*_7ch|nQ#F!K!ajwh%}K|#;&K;|o*{{* zbdA(o3d9DE9?3ykafJd*mK)omk@`qDtu^_n{5IuAZGwxZc#;G2HPQ_db_k?AnDUlZd{(KM62gIn8mX@|1;Esl zty%!Qym$l*xF5p}atkFofNjPsX&6L)x6<>4#3plV&Bl$_Q0sKDgk`|lA zs89$^qsQ5zX@f?(U7Ev;>9?dW(~2)C!1Uo9*r1W_kZ^!v`g`f<4llca*&Mi8BlVZ& z0eC2*w^n?`1(dr(qtH!SU}RCFFPlC5>Y6>s?=)c?tfm_srjnjCW?Y{!VAFO%e3g$f z(s`6>q(#zFX3Tgl<6W)z8Zp@?gl2@%-#azZVrdy*=8TVo@IHV^Heq0fJv1YYgKy6$ zk`5B-+cO%ZkLdzK7f`xMSw@yIpsQrklP<}!_(1%KR(jfKS!b!sydPCXJ_K8ucm~sD z%XSpv#6P+_v+Tn)-)6dzSq@S8A4~DUYR07nQ6rw#-!BAPe&^dH{xn$r6yM<6dNO+$ zGJC8^z^?q^(h4>#Q^=8YklIy`#U>*bsp`sCT& z-*^(hbZ=`W9?I3+)0TM`{?NA~G(?>su*pUei)L7oQ^IxtCaw}fr6_34r*u-GR11CRABu1{4FyWDmt9(mRAP`y!m&X@vO!|LBr27G z*t15dLHa`a9d*RFL2Q$o*gjr}8I$xQfZ-3zB+1I0@L_Hl94R0jHb{rvlxfM&DgEZq z)!nPC%g|QKT~Z-BQqD33=Jy}}5jFI(T)&?OkD?-RJXW@tw z*Up}-WYQojy)`Qp(w^fxU!1gAq3%bI6(znVdNfNS6hhBxm9P04W>%I5CSMTE!V$83 zH9V`tkX6F>-_f=)Ogv!)5zY@&ya)wCjagf=T5O+^tmK#KtZh6)3VezDd$OHn`MyP+AxaKgMug#acqWgdf6;s7T!VtTKIC?Cy z8@`7RafaG_{~IIvw_&!4Hte^h-b&T{Z4)Dg4YMt?DXuP;EfZJ2FW4TzmW9EsHeZOf zkDpq0MW)!M2_rz7HXHUEY#0zXvE7E=vEdQ2%@u3F*0$s`HZhzQR$yiB(Ur3p*x3v= zo4W@Bgf2rL+oUK^IefWFx*#tx+BO5X&S0x^`=&@Am)F~x$%M*OUwPuQP|8E2Ja4pp zY1^HR;p=WX%31`-hx?L^*=9 z>);tUdiF`=-NT6-SB%-`at4Cc1z}*$wS97WI&<)Fr6GDq4sGJhxy6uk%hmc6b+BDp z>1AWi-8uK>EGK@E#4l$!&wyXfNaUxGM=Q;i69|x2dc~OYOwJ2-x(gPgc$F}op(@lj zy{bgnE$RTj98={YDD9skiqXsn7Y@n6m>I!lFH%(^#6uE<-JI=8YBA)rxUF@Q9M~xk zl(M;Q{K{)sAlj6)+)l6EZJIF;tYJU)hInXp2$K zPdPs`&Aq(y4$A3J`R6!e+S+msf$Wx$oIi5@WEwf1bAA`vbN&Y8V9ZQX$*ze?yuwb` zy_E?p$bM~qdp}=$zeDyLP~ifEwfmj1-`=&4c6p3yA7EdBw^8gvi3!!A2P5_e+wJ#L zfxH>r9(>3?g=o52qdR+S(Wh|hZ=Zv;VwpJ2=66?yqo@1XpXY7SZpV(xO*jR{&;9`~ z7-UaT`P-w#Sf@P!kh{^+uNv((``TQ(_cw17LhUr!<0GfNo)@CU?OOr#Y;pTXxyk&A zihYN{zC*9!44gc@ptd(9f=BDQs=V_=JFz3jn^#G4H9o=knuGTa3exI`4I!A(D`s$uS0;N`-Y0oj_UhtYaoBM{BmD&aM;__(KJoOf z%Q2#V8J6ESzpsZM<@bdj<@Yq?_jLQwuzX`aLY&LhphvzDIKz=1Fyuermf0(?ttp}Q z$sa4myQV)Bc1g6#N8p)xr=W3rYu+ag-ByRoGcT7);Z-8YT-N%^@2umCe15km8mAtCp~{0+Pi4VO;=!OIu& zKPl+TJu&}FL;jbtFXZn}_}J4I$Wil88}d(!vS%qj>)ixS*A1>f>QSf_yQ4ZHg9e~I0%GAlYBh8yPvKy78(nu7VRVMOb9Kc6$s9~ z@OfUSQL77S%~(DRnH44xBF0|y*}}C{F85yn`*+x=_*JOAPhPMuJW#Zcp9NRgZYXS* zB`iFV(ArhPB8#EOa<%COHE>a#p{VX^2wLfFW6_UA$BKhUE<6V<`pKn0(Z9S9ZCb1) zp!^)P_!heMTzW6Qvp9(N{o)~p;vur2#g8P+@f1`my<;p6DPB@sMYXZQUp&>truYS3 zNNnB!P+8$Grdg3Uo1|j-W}-OVP@Jx?$;BIa%22yd!mCKqyT;<$;%z1OQf(dB)VbMw z%L}n?P)yDsf9sPK|3WOW_JigqzDSjN^QMuTprlvHyrUqgwn%(A3k!aQ%5?-@%T zEE!uuw~FScgwT?QTr5jw@k01t3C)d7!#pB&$#W$MGU=BMB`+(a-$_{PP5OOfNlHmU zX?G%B0MfLA#ht6f!3&A>egJ9ZBjp+;VwW5!?JkpUHhTsA`KqovC^xl*H{)F?|@8kFFA(|WgT_YaJv&y=nz{ej5gxlyV6 z@n&fpFGTZ};y%Rn+^Dpa5cS~cdYWFksq_b#O|zl2Sz+^8!d!2u*BDC=mYynGOtoXc z#_5u}tQ#+cLCSmp^y=$n*Ox8keZA~vL)pzT>9Roy-+7Xzj#4(lP&PvD>t&Nc7%P4p z#ogD#jb$s!-YDxJ?r}nB*;8)r@w||@lak)tGt1vcw*jad#NX913?@ zAreg%Z|)Jsvfs)sloJE<>)?LO#l8FyUI^~xbW`ZXy?k7`$jw?FY$y+wxtGsQ)Od2& zN|DC$jPjBS?q|_LXt~8rx|SCb>CGS=|F4G&mw#H(otw3Mr=fhOLi)Qz*QQhM7-ZJ+ zBZl%LvSQ`((qxUdVo}BlpNiY)`4}^Y3858kSF9Mu3*kEzBRUnUpcit<<1No9E?P0G zqL@okvA|HVK$fIpWx|`DN|GcMYYY`@WJz$Vd4*seZLFxMXso=ABzYB*RJ!a?@g*;W z9r&85mx(KWsKjylMBZtra4Ot?OH^OR{gR>LlFYplD_m&cncjAYF;)(!e5kUCxW6cb zRt|J=ubjjSVTZ~Y1jKSQ;#K8JT+3esQS4CpN@Ww5q%zD<8750o8J@7At0a}#hRSS3 zlC@kC`6YU{qsJO6KdRib7KT+I^ti5sVMDBKLZ!@gD zO_pTs-3eVLqH)HxQ`RnCyN4*fEQGG5hXOpjt$m*tg3VgG)m0Q;n|T?Vg0*{OHf4sj zWeS_Rga%KAwNkus?RRUBR?Q+xZ-LGCZZ;QrAzHPHX8B&NT6Im;EN;uHYYkP`%A~7q zO^Ea)O^sglkfG`!*_KsfuVhP;v1)!*XcdNcX2v>b6<)8Gm8@FL3sEiy+N$uX&t;CW zhN@VFV`@VFWgN>5RpkoD&77kg+TE>ZHdcLI(m>lUwjdEGZe38(z5 zTjFB5?gL&(EMq)arr=tcB(BTFb^Kw@USV0a?i-n9onc*_Y>0KuiS+GMtPNHuBTk}m z-TrmItf$oyvjr@_bFo~n;)Q6{^*uXT%B0u(t{=%sukUME-&ZERzJH?Ln{<+K{kZkB z*H@#q>0TjpeW084GrW*UzjPVtH`iD5=3D=+Vg0)b=@^r1ec2rj*XJA7=kw-st}k)u zK9hH{yBjarxPHU>PipAq--L5!)^Bw4-p32kC)U#h#zaq>_pyH=eE@D;t(Sm#8?#jMd|-OI0D&v#J*`jqD`C zUDeC!jg#tyhU$e^n@dtuqApSWnxXnNuAyJ`Th?U$K%zRKtvUwWR>x9w-<`LCwNUA}ENsq{EG*oYtZzZe0t^W41TgjM6qU613T>Y)*t>onxSg5G+ zsX@4M-6#6j_=x6VHTdsYHq6xgzEJ&l7^^HueL`?%P zgm=_56Hp!^YIfn;M0@>kf3gq@cgC9UYo~B8tvP6@IVgKa&94dndU;39rPf+3Xnr}` zSnE?O&+TjVhFbmA8XmW(DaP6vwJT~1i1%$mXzfh!ye#c7es?b{dM+htsv^T2p=UhL`yLX?=#FK7(@{RR596zdldIR+0KzXMKf3_thH% zz+yK}iSQI8sQxopzJ8~ney50+?(yDx{UK*Po*8}h#ye=jdFGc`Ydv;ref0rqku38_ z1`ygOSy*uWdHKo72DM>>T1-NCac;mu?^kbxu?_dNZWu)M-2KXL!)V)2V9~lEgv#4C zEWjT#KVn7QO-=p+vU@41qDz#AnP!oRw8VlNamk8%N{eyB>l;=zkk!OQ{HQm?@C;mV z1Kss;nb`&_E?sTHYoohu$ZdE@2-;BWyJ4MkL%BoubwTI`M0C6W@R4WCJg^EN`O1#-&stYC)F@8{gZw8xpNaeYoMIq2Z+5vJF@j-bHU6Z_ETU}ZQ2IW#Uu!)-ZYjnteaZBX*&MO z3T;}BOIZT8DGb-L4ysL9P}RteBZO|ETc~|^ZrTXAhhy<4V+h2I>G0JdUClwJtHtiZ zx*kYxAW2BgOjrK_({03F(v2e0Urg74t^5t&G2NzXm~Qh~rfYl;>2IdnI-BX5wMfZK z*MhD7Ed@;HSb>B+sUJRoRD^Vi={{P3RL*qUe36ov?qeUMXOIpv-S(G}jx*gS*zx$u z&rJ7eAksFb+c6BOjOjk>hZKhN2h)9t`d@+$jxN{j3`aV{bYD$ny04>|ZdV4=?S2V~ zW+#u}0lsn5j!pZwt`tPXM4GqJScIJ)6-KrR=h(rzWCs3^9`^(0an9~FS}Di4`OVEA zY{qS;3U5aMeRDiz@FZUI)>2HDoDj&AxMjwcC%2%vRAMSh)LUMmOebY@>@9BspitgI_aH9HxKyao6{zJJw;b4VxUmOO zOGAlz%SFm`QbW9MQ~{t+lTW~;b$zOxXKd6pUe`E?YOh9#y0I^1XbWf~jR1J?$Sp@c zqm_z{jSCu|ZVVNeDw1aH>c-HR=K{<&VBHyfv69Ssl@cfUBZ0k#xd445Wd3e5$R;o2N z^=$HMdIByKt`S0;+>d^m1~)wcS?QnLkV0_NPWodJnr1aU2jbm9do=KQ>~4Cp={cFSVs+47j7I`Ziw#YS-DI^=y|L+~ zrkJLas2_PP2)yhjU~W3;BEVfyFgBq`71EU3RLr``Ptdur*yqz!YG^7IGu*BwRWsU> zL#kjuL{pWasmjfh-s(Ej)aaqf-im)*^9jCfr}7~d+_X&?*mU5|rd`ga&mFpbpFk{e zNYg=QQwQag$L?EIep**y(yewG)KaxMc*_MN9g|v{BOSW$o}m%=3@FGm3)ko?ZDI=C*^Jw~@8~XA1#5GS z7UK1`pypiP=4x;&M=CTl7kZ1vht!Ir*hkY`XK1c-i{m+e!HsIOqj@i%F*NTmH17~I ztw&)4u)@UcBigRA)!6)V^B)d2ib5&&n}jwWbT|1qr5L7bq44Y-$OL1Hju3>Pmg~b< z%Z-MX8wanNuu;p)6NXtVlk1>tn*T8wg(DDS%+Jo;)^(?4mLjRVTceYG#ZJFfI zeNU5D(b%%I1-tcHLWR~A>;m}S9@G*&pvBgwCC%9qkNmTOZ%dKB#ZDlE6x7hSlu|j5 zMWUzfm@u}~wtNj@TZJJl+l(#yTFxNj6!a}eI;$I@fq-<25RBiR!VvuWYNaMBABZ&E z!A3tzs=tpz$=N9P-2kp1S3s~1a^tUH9~4g~B+V$e12UobCJY<3*g!w-_L9R8ieB(= z5DG+uh4do6vB*Y6AjNrx2;`GFITMjHdHV(h3Va-ojl#)i_z^8Kf00*km65L@4D#4P zSRU*tdcZ%G5?3FidqE(=9r0U4l#9IC^4`Ls6$Gtt>qu7J3~Ju~jlymH@$>ba_}STt zpHCgS9}aUrK;|c;bG%s&;j^`D6t*J%a5xAT7YD$o*Z0BCHBS5pD31|*adoR6KbYzM za9HsTWN#-Z@~X)LiA{UEjc=*Nusq3lzwGN^NUgJ~FwX&$9aaF8pYT<25_C3PMi)HxXwh+#8P>>+#6=>25j z(OD*MCHGa{!m$B5NRBl6ZwDKL>AFY5A)ukGJLrv3c@$&3 z0sfdZcM|5EZq9@>3TYCE(oo5dzC?c3A^cz`(1FD~h$Azni)`d&RQqY9 zw{TxzMQt2%g52AI_=ytm16z(sX6~(?$feK_gTIy|_(9-2a6sPhiJY|y1HR?+BmlXD zCRfX&YCO-wGBSA{=HgpFQC0+l2WUvRYNSR8CwZv0<1h-FKr@nP5J8Nm2M%f-opcUtbu-%I5}=A^$2$vHM|lhohY6GHl969iIs>N z;}#18@f+5GA6W6ghcL*vRV3O6B%0vr)LN+pN{&lF%6G8w=OL4bCj!VOf|n9S#%+{A zg8OC;w_HGJ1hzYhjQgB&N)*AR$88tIjd8n(h7vc%9pzdbAWaXrd#@5V#vOC$oF_aS zSdJUx4gmRg>ZE}_NY`B+Hv(@4y+HkCaU+n5hk3@0KzzrA1rB#}CZaQt7J0{wz^CEw zflC~^R*Moh0-x<7n-Vty;go^#o^d149Ec)|fS+8XeC8210t@B15m?p%P>Dm=c7rQ! z1Xgrmz~jaVpw$rCDhfA&wN#DgmADaD>tQY>ZUj=JRZ-js{0M2Mciag40UG6&#Gnfus(l*iFYmZ9o}o(y{)5_2Q`|tW8;_B%O@0EdOdB!Fmj~(bHv@URo{(LA zbo?!Z4VN5$x2p@#L`>`@FLcuJ zFTuISha;6LF=2c%+iTe8*w@>?L7I-CsyFgjnYVr3cd8vV%0Z;9wIl zZ4;+87vjWWra5$nUh!ynxxY;q4dmI>-zL0*6n1%koA5r-TXk7~n~;iP$+N#ruo0%s&6$Y8 zJtutV-QOmB4o{h|&7nK2Rr=e6FT2R5^tTBIf!N_XnHB9w1IL78l^aw7GAbuBScyFJ z3K>DArXQpt7>k>2qMFS1Ff}D(bpowd`c9>ukCJ1-oS7IIbO>^ivx{*@cmnW`;30HV0gm_LXZ6IS|Mm!Pox1ev~k~fjNPCU@*u0aApAOrn#uNuf^mSJS(plgwC z^7NCSTOe7`EuMZ7G!iA_ST|*4p)f&h9TedN zf*pdsNBSA7P)=y7+|k0{g5WH?hzzh$QM`l7xZ>x4anV!p;BH*5OC;ANZ@FCe)-YJ` zok#}s8JpXtWQ*X3-L_ao<3lh$#L9xvtAFudQvh!}i=5Yoz$@>EcgU#m&?k5eP?v~V zc*7313eKb2m>vD%Pcj8pLZ;wKZ75L!n>?leT`CLJ`Av2e;LmOH7@`9HAU z4yea^Ay&%w6V(i)S_hlF7|2-LLXMUKmHF1BdV+ugk5-d5 zRotv{wX{<{rvjDG7jR|{=Q7!kuqXQfd$Nx=Hon#@+=b%Dn2d>KIOGNp<^U1PE0E_) zmpqdnyn;M<-$2>rRJnR#We@6olc!Mcn>-8HVOr@c*kJMsBuu>~(;I)Z_=-#SE%dPWx&NYtfhqVj0DgPXE%uaa39OZNf#;MvkTBj&34x?oE5=p-PC=(U zK@gXqeBdKfOfhm(Oqoc{GsOtOrWoC(;E{*F&-oqEpNaGg(ppfV#W`HM*EMndyaM7r zJLN4PbzPzZLIfdk#&Pl#c#6b1Ldp z!nz1^g$@*Ap$-(11JO5Yr5|9$khMr3IoQ-M$UuDgD5R>>iXmUhAb3>gQ#{nz4Q%&~ zUq~zEJeQ9`{_rrj>rPXSS|JySBAI-u4oOc_IOSoV>=0A$AT6i%g_cwMcA7m!O%pq{ z6Qy@MbSI8LkE!?J;%pl(hBAt|VAIIB@*Vk9dOb}UA*N#LMWD`x;dkUyFL^f1 zwB8;KgUc>=?a;8=Nt zmFG`vl8V-s&)u5Grg7v3$Ai>1bkHBj3-Pp7voz|azoeb)7%rk(yCRd$w!-Fsn#thnqKL8 zddc6T)=Ik}_l)I8YmjKF!EbnGtnd&!mLL$8{wcF2K2byGo?+r+>zz#Z+Y3lvG2O9MNZ3Vk{28V@QN?tp#xvdTA2Z$Q+mZG&-I>wgg$LnINH;SO zX_AA@oqUIw=MfdS;y}X$^$4Log#?Sw#LLx8jlb{GHOY*Bi$IFJ4cM5l5~A`IWsO#9 zqskFT2@W=EK2YSn0w_pU3e>2Mkb|r6wwVxX{ym5*CBWCua?!Qd-BF6^JYP5K3p5297&Q;~GI)E44$&S&NaL zaj@C`qzkDBrDwgV6!1qYv)&`6@xlQ1$N&~gIhP6WS#jno7H}KO+5^h9pOsBCNc&j@ z(0IzkiBMqEZb}LZrE$~7tsHrhqugj5(n68_U|rl;q2#h z2m3i#<#e;3)AI`KSv#m2mkIU(q`!DNwQ{J^YpmMaC=nTOmIS?45BHJ4fE*skVYb1I1aL4@eWY2Ikr*7HJO>vGxcOANauK8~_`s+N?{k?>O&xj+)B zIhO@}6$pSN&Ti0!-4@&`3?hKqpRUC+nu;tiU@Ee}APWIa2=r+9G^V?-6zLO^R3)8P zju_L4<;X8prBC7dqZf6{QeW{%L>gZRZ zUm+O&af{JIkbg!-w?-e0z67g_Zv&u?K0_I@R`g%^>%9Pm3KvF(o5NGWKSzc5K&lX) zM;ZEJWH@AHxD~qZUsn|K3bdq1$U~IVx8Lf12WW@G}&!ZngMtlQ5>WJ@o2B9~i zy%Rlxd|Rx*q+lE`(ZIKT-bQh0^l^C|# zBaOH|%?B-cad}_GCT5HrAMK|KiJTp|2r-MAO&AopsE2>#bK=_eNc7%|r~Mw?foOa?GyQJYvgAr`_UMAAnFex z;C`I343VN18KM^PS9NZWde8ipis2Yi6U;Tw)Fccz6jkfc{X1G8^$Atvn^*QaqwsL> z;@5KAaP7gTW05M#a4P9v(Kmr~w3;1?#*p~$XnbTF`_ZF^Xr+HgnpT*eHPe(xT#p~M zDT-&%My7bOTmqCB&P-{9AY0c|h-(~9#+Rt@yALj4G?km*Qw5pULw3`qHdCELcPWrR zF+FYC!cE!v@oS^03CB^E2e;QT%yqkm#q8(%ryPnmip^IH-=rXX%0d|`0X*^p#)a&Hvi zuu%P6XRPTK~zIoc4?dc(Z?FLk$+mb&($#mEA4Uc;C%-fip zDB_C@$C5LF6h0`qQ0t#ugBDBvF&dkWl8?9H)2AM_{gcm#wff|XG7o>z*EisVcq?+Y zd&Ikf#K$3nI72TQWjNpG7RJN{ZQ?9XDqb?+P*`z!N>BPM=?g##A0)2Q`in8*CV#Pp zWDvKtiA|oh{l(8AgSbcL;V*WO41XX887|;M8Yv~XUJFT5KGmnx$yj7Qe695Bwv^9M za3y1q&lywNQr8JVDZf%>yyup3!jN*p?R>l^gt1grTgrv25aAY0?Uh%}zkIg-RR?b^09AL79`Go@W83!v1cr+OQ)DIp~7?zD#??-rL& zr;XC5JtCvhH26r`7?4=og=0|KtO04y5sw9@)8_GyzUb2yIeM#0d(nh~JfA$CzU@L0 zHf@zY4NgN)rFGKYF{E|c(W?raJuNmpKoycErR6f$7FD8>Z%E6>0gC8hX;ogl_``yV z3Ko>Mt$*65gt}9owgV`y_GEmV(Wk);HKX}#M?egaUlzqkllEi!Fjc_uH0nJ`{%NPh z#()#)az{zOYosxKT>47vf=Uko*mh6)yrA?~`=`Izksd~QWBLcVLwbdzr>AE!O++{7 zyI;6HJ*VP(L>d;9Ue`Z;Tc7l8hteB>9BxeiGW{8Diw z>8(Tb>4ykWL&n=pPZKfNlc;#Yl#8z;WeEK<`t-@@b2y_L(2|T9H)V|F^fK<$XAJP9 zm+`pDKjYpZ`i%PtvD=mDP0g5`F%vArt<+qyMRwzRu}ds8d%!d!<5~P&6VD}ZO`VJx zuP|X!#yiH0)frz2!5JoUvy5u`u?@<|67(5qj^5o`da*ZD3^J66f&Lk5l^G`gpf9c2 z?ykI5fj34a`e%H2B{&l@sEKw783@}##8|q<>1-K4SORbkY9C^285|~9Zqr-(${gJj zfa@VP{E3TPX=YO`A(q*o5&o9E9LpbIa|^323p4KoE|!WdPvI|gB`y}4i}5Jzo-rCN zt1|Dz_haKNNldfm6x9|!u!vxs-;=x%--qq3#o=Z(e4-%mAxa zwq7QAjAFga>6cqCbG}up4#^D7e7VzlnXkI7m$}-}yZcea3@+3r?5U7ex>qj^LQ#N@d(Sx> z>f0ISX$s&pX?bTO_An%jzrQ*z4W9k2G>q{ z<_g*cN$(DjvWSaWFJT7N>w!Luc5>m&+$4jP)TwnROWM#yqmoprm(X*$nniMz^=(qQ zr&T=!<)40%8nS$ZF*yBrWKdS$0a*|GW)0G3-6GQnV_EmMW%+wnmwC#A%`wLMXN~BS zHKILhIB-@NvjVeD@Bp6mgFb7&9Kf%I82(w#HAS2;I>W+>1I(Cp)`nXONNm&SZGs1; zt=AAw#30)MLV8edyQ|X>r)|T$w73P|t$oz?vP^G+-Zrk2-UqfR==SmS@gKcywoKxj zZ8@sbO;~5-B(+?!*}`naGOcL6Ey9zQ*+t9WmbRwgoQ)n2UzHBmu2zpP_40v{+rhRe z;vrAhk>zn8%gEk{ezOa(#BL>nu$9T*umP;tZEN^{3b zD^c481q5N3VH>!!GOWX}i@^nLB{Keg5z{ckWr9 z2`1JLu2-9RIi z@h0v*<1G*W8-vltFwisJA81r|qlaT!RUO6$ySI67`o`Ht6TXXRglB!@qCtdXO@|R` z?QzSDYejS(Ft1xi@-RLhXx!DE;XPi41C4168x8GE_ZhSPmGcN=iSdjmfrEj@y6y;% zcoB{>zOHS(&-m`YB8oP;Lyf-?W8Ysfo)w)w;}4>m^r*Gy^qKku8h;maJx-sguhP`_ z`aKd2WePOkgJV_iFex!iur&lS*rvObrn^L^&-8E)T9VUeiVHPu7-)JV(6pRMh1oFE zlYyqqJ|T%-py^qsLUHd+qOlT(8n)hGdchtMcz-My}``^fo8aRUJ_%><7DH^ ziliw!dGoM9^I#EyFCwahaxdA^jfWUHFpk=6tpu3MpAGKo(xYsN-SnlS(v)m78gIwSv zEwe4Lw06r8e*DNRt5_6^FP1fkdlnol@l-@yaInzR1<~IVSIGDX%ibc+FV>>96i6#m zmcux*-eOc*jK0ROlxy2MEb#gUy&i384Y3>_XgTh-yoPvFgypmqXT{xRjixckI$vp> zFRndVpAgrctn5SvT6^lW+5quoptX?zJ!?-^%xeZ!idF8t_GEQi|0LAsxlZdP0_6t$ zH3Z=ygeMRhxB>qR;uPEnPBG{Jr?_b!>em;6^NWZ?w2B*0*$>}S*oIe-o3SYoAm<;) zvxEdZKghu%@W)sP{TSsc0MU#x`F`f{%nve8qz*eki!uHDgg&aIhmvB75A&H_a58C(K{}RFZ&PteF`Pdd332gn z4N4=g+up&O3bB>e1MBAsggzD(kIm;o^^f=9siNkj(hDJ>|We{n)G(k z_e{H!jw_RnYu^<7F$}npPCFGhzwA!>8b5R@6-FyMxI+xWKu#_MsP?|U_oMyGh~Ps+ zaPQYF0)l%{1@8$OdoL5gw@@Lh*NJ5Lh<&pC%lbzrhlM07LzBZplJDBdCEw>tz8l0Y zWsIV-Ry#9Y$=IHrJkyn|qMQI^oVFeo9kDCP^I5m*Hd#nsoQy-n?n*A<#wAy3-;Rt; zb|s(X{L{7*Sw128Kfra-m5llA&6kjfW3sGGTx{~6DKgHV;fAM_(!V1GmS*rSab?(A z!o}hvYm+$t^n^8jmT>-u6fik>S8&S1)+ZpR_>{Fk{@ebz&J@_w!A34RCB>bR4hnxn zq?l4y@!>zDlo9~+JEcmQQst3vM@pNB=0j^THrK|d{2xQ3AD23a>r4$IR98|})SG(? zJ~I4=RE(1hW9nvQ>Siy-R7@klSn3N_EismwOBmDqI#Y`X+x1Y9nMtixrq*hYu}1Go z#ROq+Yey=)>A|~1+Lmw<-fBU7i7EACW$MQgL71??yAo1=+{vYW?@D#|5bJd~Cvy8k zmHR`zI<|iTfpqPMcRZMEWbdlR>{s($`(r3qF7#9Fuh@S$y#?B&AtjgXf1O3p#rD68 zcoyEsgno1DeQ1!%N9_MBy(J)af7gCm<$Ql3 zy)HILS_c(N3+PDuixnerqz_W257IcP!=;ZPW;)X$lUr!>e@|ibXZusq!03N)+nK&o1la2X@U?ABdOp87-Q?Gqj%gU7b+A%QmSQP% z`2MQ&zYq9l9-tO*;vzdRkVVkp4-7$kk9d6cfzh~6`-v*=>+lEe%sk*9oe>w3u{<~vSwKBwYVzK4LatjH;JWx)@*mG3E_EYa=iW)ZW>w6{Y*S^wq6 zW&H&KsY0~#25Mnbwc&2<6kr&jeV5t6GEO@MUrvkGt{SA>;L<)u$lY4h`qly6CvI1` z80|C2c#bk6W7*j{8b87SQ1e)A9WXoGS`5{<4v^%$#?L%HLi>jHM;Jrx`^cgda<^Oi zS&vez@pPk=y3rolC+MbQIeV&GH<8Lod?x7DBYDkK-D2Hrj-%7xK%MW<%_hX7b&Ch; zW_MC#*b=u6o#WO4fnrSjzzDbmp{ob6YL~7Yn0N_}^i21vQunG? zO?0nOzFYSW5xfpo25?5HJL3VEs{2vr>dw6jfZ+befjU>04w2giyLCSivOqCLE1~S{ zC#$(rcNMjB{0}PGGG(?*`yR9B?ra62z)Jnd&g@$W$g3|t;L6jhg`4nBOjt84nQeX5JCu&3=xX6+W;JpjSLQzMp$YBC-Kxyps{KIl z$09~x?n{J?d{*m7aKOYzbr2L>Laq%I%pJK{K^;C*s>OBqjLCHX6WnMoCb^(c<+bO% zr6&)JNRdqQK4no_v;LZrPY@lS8O}SeU)Co!?>A)a`-XMf*!=$aH*@|gs2uOg4|FO< zJgd$h6Pm9I$-jSKK8~ZwpG@y#Dn=N5+=b*X9hAQmSql^L=i_HiN4~m8iPb>&o3)vX z&tFG(`=fgrk%;`w`M=4c^S6iOzceuaC3pS~Kx-oMQ}PcprOVeU^R?QOtUWqtMR|lF zFu#n-Fd>?|i)Xbk7^ldc&u^#fj(oKC2t)V}`DpGDhJ^e};O@tc{7#BV{72{i8KUnu zP~Xq3=Ljl7f3sdZOjLiHQh%G5upaAIAgsruga1i5Mn8k^(9flUav@Mv@Mys{;UJ`& z#dZu7=vV|AUSOg`(M2gZN-cvWBrDnhR~@-21;>SheN-U@m&O)cbQiz^1mUzd%lZOW z!Bu`-A*cN)w(#Y`bk1Kx1FMb?F4S60e%P>A2=xydkWhF6i+u073gN&7`Ro+a%)+mf zg6{sdDw zK9f`IGUXvQ%EvsJXwxC3>5wQY6D)f0s7}*|_}O+%&H8h(=E>&!IR8DxBsxC99KDk> z&*(HiK*c4|sLcz2)%=LtybS3R#WPgQ-UHV~HwMp=&5xTke&OfM@OgqK62LaMcux!Q zznFsf%P3W2|oC)9O}Q-6Ee>tVo5t7+l0#cTyKCg4-CfAD{S`m{1gkpW9tU zqo}~O>|LL?TUAAlqIw(lhjE&3iMOJ+SOmNk9Y@?F(jsQCeP#h>n~x~^(N^xK3bFMa zYwP1K!oVLohL|t9Y8%9lv)!!yIK~!E+}oxrZPP{WZP2yQTZ3(z*|fuL+eJY5B8V=* zmW7`KE?Y7c`2Xd8pvqQdYp{LBVfPi*28e&#QHs*TLK~h~a@tc&wzd(A5-2yT2|ifDnH^>j1jU4UJCXHSTZQsRbC2a&OQ(K z-E@tQurIUYz>8g+eVxnxh*NRTsloh>FG3Hr>A34R?c?i{<;`V_EPXkFG zKVhuO{)$~=ujjQ;4jNiKYmMVooE?w#dui5KuVz)A0yxLZg>fo-iQR6mMUTjuk0hDB znj-8^><71h0BVE7E2r{VOT6VK2~&|avvL`){mfhLF5zCJZLZwIYd;s$ z&|e-@RVG&^JIL0^Dh2UZCaY{gJYyIb*~C?zgm!p3K_yIdfUgq>Vcn9LIvS<)ecvGEU8Un)2^MWjI4S)TrQ;K+r1o8;Tvj?R`%1QP z@_@>dyfD#Sc@pee0xG}d1!YI&w}?0b@SIw>6EJ@6%0DSr8V>>-qc~v_awc{-LaC@Y zQ?MT40vt;?0ZX-xwH*!&GUFW5q`Y5cva}UhxL@V?yJ}#S5%SH#3+#@6yqaA#m?a`z zTzRee%*;{PYhj((-HLhx`AcyhS)wXKS`)HE3RUZe) z+sf*fdWdgHvkHYCK2~N0I8kSR&HJ_N?J*@OXI_S99Y|u12n`k$2+(DMOVt zLq!UZ8<^n~Va=Rk!Yu%Y>}RTK?x<1LYB=pzy=6aJn8T@Ro~_y4%}PWIbCH%(lfehT zAh5ml!U9!|u0~h800?C@72+>GSMeU=9?{pp$MSac8tg*wjtP+bOp-jlDzSh`zV?ot zTy3zcc8F6k;l=ApzII}-eqI|6ko%Oi_jxpK4j0f-I}`A^7*k{cHDB|>YRM7k*V+9zxA394OO z?Q=l+tg`l59|uTCQr0H1p$`%RC!Av9WCU8ph13_SYIU{x`gxodk`YG&W}Bh$i-o0} zs`g^-&mO6dgvQ4S%Q#hC|GJxa?I+N9_)M^`t5kJE>W0+QfG(@MU;LHH@W}~D>~&9i z#Xgd&OF_DKsD#|nG5CnO!}T&I_qvn#RKwe@x>l!R;+5;ly^f|Zj7N`st?L5FH_Ezi zSgl8bYt5yOI=ISr-hiQ27Et#jFD!P~Jqe8e1k{;0Ar9qB-E|g9@T}>mxPEorG=7Du zKA?VB{Ty&glCSUQm3;k3mWXsw^7W(Y=aA&>m}@a;kb$y{((ZKPEhmw1)bl{Jw9*F%YufsH$(T zZ*QO_XIcGc;;&3r|9^;kRK8(=SN3MEAqeSSCjzp^Sj|T?L^otI**C1+$u%r@HOzM^ zl-sT=`-Tm@WZ$q8AlsD<+dUe$7T7x)Fwa(|!VJp-8V2yfqwas1Ze4aE%~fLRiMLylMc_>cr8(x1qBWy1#~{)Q&ttW!4B zbz=i5uPGZ|6Kf06F{fzKL{2e@6cFOyq{3Gm?1$HJncp$-vuCRQLOj0nyMd6PL?{XH<=$jpG{M24T@(YMj6# zQbih-jc@zSXq>_~hBroX-t*w#Z!|8%Clz84rYRez^==dI{&==b(70G^8)=z<9QMZL zu0||^-!-1Lfn8}_)vXBa{Nm3wK1#V%@-dfqFCy!{M!~k3H?C`}@{4VJsc|1xU~%>? zWI#|Fu$H21OzF)UZL@YYW)X4^P3-0o#yZ54-x{s%#zN%1!=!-%+-hMQTdZnq2Eqnq zV?%F*JByRC>jzJ=NOI0y-Lz}jwQo?Zv2I^#p&fC9{1jXmMPDn8xG-% zD8Ywr5oX{u5appsu0vSny?dwo(8Ksif|H)0Iuv_o%^~u7#R=4*`CcN2HnU_9Ike3~ z1di&V7jZATCerdk#G%wfr}&sdnRvK-=jZGdk+|VLAkI~ zb?CE0=bL5`Vm7@w^tnX$3QH!s)W=1A=bHN9zWem1X+YB~)U9c#uz-j)O>#A%Zucy9 zH=%C#JO&!OR84c69%*9p7BLeoN!YW4O zJy#P}%kDYsZi2gU&l@1JTh(-~>G#8H2@9L$G)cb0;XW)GL}=Hqw<3p!;ofVYSSuYK zeRwU19KKW7NJI|Lavh%MR7@V>J{*UiJ77{L{lzKno{!MTDegi4zDJAjE2o%D1CShn z<5h^gjEQ*&rbHP0ZqG#c18!d_ru!29AHB-5qIr6Z5EY>>eGT49kntlBOli+H2=BYY<=Kr}fOP_DoCKf&a@W zB}+;Ye|bJh19&cN3wwdiFR27E|Fn3t#ix8cc{ZQ!NlC)INvlfRicdo>MUnt5BLkDP zgV(xb=x0e9r(()*zqELF5|&!0j8EIzk@P8UA~02Zd0Nu1d;9J!2T@HKAD{G_x0Uyf zV~JRN-HV!e7oqmX;+|fc(EiHpU4#2HJoKPf1;s@UK4xzs_4~bv%Dsu2pQ)4YEdnKz z*vZ930R2(4%9Py*R8{JC9FOIYsYsm+XM4(@ES2K;BMB#J-BD<&#C{$L_c?GH`(i#l za7NpaxQpY8K8AGtG6FL{PdtX#88DtD{(#-f{!Hc@lWyiXp%Ks0?#33#W0aOb^L9T! zp&%;hNYXnQSNP2DSvz=Vx#dw@(mU5!?E+D#oM#xiK`sbUd$;V}xpyy*S?*gvDcg%b z;u(Kv1pq+B4N?0__Eqm|qeAZ^MYgYPUmKOcAGIESr5^8DoJ^&>H0>Hc zJxq zbo41NaC-6efJ>qde0JcQ3>i^|oxom%?ff&nMuF zE{ZVS`OydLttV9XAi`$|Fg5pvBFsW~0-*rmG^e=lW(1g^`!Wz(f#C)}p&}|%n`y~; zF(ec1BYM{O?IRqF%52JP$@~zFBg;IINw$IhpimW}24=Q+RIsmHsEpDK*No9jLt$+f zO35@2Xr{69UY+1$G!OG(nuq0rBTBPfvs;r!npnlkrfJfAWl!T)E>uNnG#b6eE~$p5 zNJGs{f1)M=VF?hH$c5^ttoyTOWEG;UW;F6;S+Q9(QKmmp|M>_?q74Rd+?cF9*|@Bg znLDsO;R$8d6TS_AS-Z4nR~+CNC>^MFC7{gxusV%qQU>rphA)$6oaT~u~l z_R8#i1RO`e*_$asz}YnZdVsTEx*l+SRL;7bE%aR3FYyin&UunOWQM88+2I5BHTV7Z za*F#OM@U6L(?7r?L?FC?K%(snyX7zJ753w3Z+Y%WdFD?{Abfo8EfCD9v>*J1eL@;C zPvrhC&%8vL70AT%4#S?bpZtYnA)SlL+m)9sN7YG`e0<)1WKKzM^A}Qt16&jxXpD1o zhs!fB!UJ_YKnjE>El3(5Mbq!?FBdYS^78V8d|Efq!pz|b@Ii`@F6Y4xdnE%ZWQ+KS zyw~y{!rMx3@u7L=g7QALJm81DM|sDciU$+o^RSd{S)YdCAT)naP~P7xGa>KKom}2k zR~}X|A54%|iQ@Bbgcr z1t-g2MiJsR|IzDko4+Cd3|{})!iVP9h30F6@^^|1=Wll^9vU5=zt4l23(2n-m|p?% z7FRwz%ZEmb3k_EEsgV35NPjOO{~i1|UHM0QWNRWwGS*r!mlc)&MgF%1Tft7o5XRh} z6d~sHWLrE+CW%ttzhG;hSpBVf%#7IsZ+Lk6u`Ycu2sph@z+?4y>+j{nHxcQh9Qts# z{(cnrlD(UFy67Mmt)DSSzcOAQ4Mt8Uo$Js)g6u!KKQPCsHu`n^czt|iwEmev`hD^G zom6(OyhERQZP^HYX2A-)^^?Pg7EB2(P=xBwhw333y~V8;h;l|SRk`Rbjt|wpf%GG8 zJv>pQhq81h#|7y{#YoV9i2UO&{oBZQ`r2OaBDrI;93Q0r-SQAr$gTf{P{bGXAr(r0 z4LJotVot#@F(=HUT*#U3$%zzm7EsRq-|@ax!6STF!Fsu%jVjD4EI2e6!q3E5&&djl zDZ=^F2Yh@@QP_<8%tB(DD?EYh3_rT(;|rn5_-I$*1*B=o=R}&&kEOBx2D}l%;6sBI zvBF3p)VJM7P~r)9m`fPrRD{ow>KiRg4i#312=@gE_X}BYdb$Kms=@{6mhf1Rutw0Z zv;>wGA-q^r<`*rz4NQ1BNjTXhyhj;cg^;8iA$)7D@QW4x&(M$a&vGyu5oEYQ$c8w( z3}FP*VSuWHufq!-OG6A>1{t=THLP?hB8JBsa5#uik@iz}Ey0&W3@;mve6*n<)X?rW zGy!xOA7pr4I1cs_3_tDU4D^<;;oGwY_~{YD6Yn6l>75Z&g<H7+s2FQFY*euf$31sazG8~YhvA`4=?9a!d^HDXpDF`U!>0L*UVHsV0UT=^*h z8Ft}h)+ID!H$MNJaS6&E%W4^KOfhWYJkiK#V{xdl&TT9gxi=mZGKqWRr+B^O<1XU| z#H`dXT!irpv&}Eoc)|EHC%!205&D?%_bwyUF$geTeCyAk)L1jF~AV-VnbvzUp31a-XL`arTnc+s ziFZJ*ngu?_?9Wd%uQIRdA$aquVDmsx@aBmCpL5oXt|STGOqzI&;LX^Kyo)pM`QE(B zsZgmPcyk5>?}WI>Oq)-r-$$7LYn>>I zwM@ebAPz945e)iZsSCEmifmc75L-c(=S6k4XbHZKt@MV4^{jj`=ST{C>0>g7$ zwB^iLOUGFY2&&GI&VXmjUxAk2DBg#s6mV|s2hJm7tV8*;)*#A>woVSU&I__WEb?o; zkLbl)XEV!!r#nH`m4+{%s0r4s*kG`!%lbGKkQ6E2`jqEEj`g?n*SQGm>7q0~#`-Nk zwP`eyEbH6BKPktXn0;PEa(L+M?*` zvqf{AifJvVQPE4NktZ4%8B>(U#}^q%uxUR;Mi)7PiW#5&pH zkUb~fwoWuKoc01Wl`R9Q-D-iRdIs{h)$;MSCgL)^Ei&46EXel0hsaqEkqgB;_?Y4V zB2qj*xOlKgq?oMRocQAVyhJXN4JlqjsqW%U9$K*FWRS>ofZkJh&#?HppyHQAYg?Qx zQYbDg{oOydxUu*sEd3hWI86&F!*p)`|^DGekZO4kOL z28%qD(oirbzI2wChfBmm>C4yfuoDean!}*K2re~ypbv@AuX~{{Gw2J~KyTwBW6SO? zQ~8FZvM5o#%ixzlz00V1FeH_|6jG)gRHi*!mgrPWuZb_iD(!WKq_R?n+Aq4yv6Cxn zJ6i_jonE8uB6$fgab=%W4#%+*d5ZKXGPUBLy&QZQMq&zjKe7~r=a19w}0{V_0Hk;_PjFj6ENNp1ta<-9&t7MiXA48fs99<9jNxO3cV0`Y~yRV`y;Y z*P>QbLhUhlICz5NwErQUaNJ9ze4{qH-fk{ZHOTSkS;u@M@En%Pi!j(8xrCj#jLF`q&TYTYy5$rK}7I65VUnUj`TwC zZjj>x(Fb$~2>CaZ}XZ5QRu2;W^s;b(5_~@#ppsIGU234dILVVQ+UTv%Tti}dyt70Bi zLe(!Ib-AmGvFRgK&4*O?3981-4btwa#_krXMD@6u0zSHWYG`$oyBbausao|6v9YTc zd&;b=8No%=jK(w1n3|{g_!^u@#9B6@#$NkhKDy>mNX?O;nxi7-8c{(bYQC(!h`jTm zHNUxQE{d3Ieit#<_7ySLDryt>nA$izWL!l!)8C4yeX-V!q_>fT`gs(nE{qhYE+M#X zs;EG9u|P2AY#mGkDG(dh>(Yow4+VM-X0h%Kcil0{iKzRiUXOD|>ON-;R`&yIu!QpAV@>XGN zY&7KD45ktqF)wXw?`mW{Olo{CqVb(WIJBywZ z&coO%Fz0hg9MOkw#pk|5x(<(UD(2qpn>ZYvbR?UPK73#3;RQj5RibVkMkCCG|R1o*Y;g%E8!#iF+6qad_(y7?>lw`1m6)i&Bk*LwZEuJB}2AexqE-jyn2N z^T?J*NXBT2qnB`0TSeMG5O(uDl*-9?S@Xj_VK>k1HZ^a?L>R)RuO0hqf2DgqzWD{I z0kB}hM>Hq5JR*y2&T1CW0Oy!&6Pn9*a?LhZvk~n6?2|#WBc!=DsJWR{rn9-ushBr4 zzWH71LRg!MXg<+=iH~Xi1T?-xWuW$vG0j)_pyvM*a`E1!tK~LA*V%&k-@K{rmZ^yS z-O(}|v750XlpEEursY{DH!TEQX@3(EsctQqVgi-`{aa{(-lI}2Ww;l)Y+V!Dx_40PHe|+k zwQg`KVuy*VN7jQ}eCsoi9oCJydmR_(%#T(r!hx>V6e=&RK6uxDB3cb?7CySQD5$lL z$u6O_2IVWeT1%q-H%C@>2E~0{v6cCd%*F1kk&uC zS}{@U4&H|OEPSzh@rl==ZTN^~TQI)edOHJuC%P>rsBMJ^-nI;1h+W*(h5@Aq_$EgE zZGdlU!+fO;YS~6=S&{y3WOQ3uP+Kj7?`o?g!1%USRz42p-*a-R&9d0G(`_!!Ke2;p zT3B00blb(Cw*QEeh;}&v;R~z-Q1%Xd2sWsFG+WEVd^V_kEbH;^cI-Qy*A> z4sCA~P+noc1bo7G{e~Vub-42?aftq}6vLOvlpnz0~v1ql63zkBSMjOp4eBr1}<0*)t6= zr+$J8`NiUHFTw$IYcrwdgAmIUvSIVV4nDl7Snxdue%00dXh7T?irWiRrcua4nVqPD z+MR&Qx9s-I-Bc;{NpvPPe2awvY{Ed8;QRp7|5()0{tgkJwzhy(h*AAJ;hIioU#tI* zkccfHRB=d|9!Mz==kzh6IMKL5g3G7~gEt*g>>~nui!tf@f)}nZPjkLL{nx11l!5TnVg+!0H&-KmP{y34y&OfqhS4ZU#2< zU%=w}5E#Z0v2Jlg02X&M1B?D&U{Rc6$r?PMeHIU3|AVJ=^jOu8Q#`nwQ#>R`DCQL5 zN=`9nGpCq)oKws@#3>dyImN=0oMO>l2Fr2%X)i*f_HQ+w-zF;Xp3qh7#z%g{z#MeBV68Mb3BtMR`pQnD4qDvZ&*MeW9`?S}SUzS@6uoQ~J|>0~;8T_4nE03I!>GfOfnbw@^J z!j`}kVM_xUqyl=d+^NodH}hoX86IXi^K>RXR-->;pF&ye7s)*7d9Zw=TsW=H{3`QT zO@9>5dW(GcQ{5P=am}lV*6CB8K@bfi69s_0h&P)%)Ocj38wN> zP>az#fM>`L$b~a%jasu@^E6;Ia{)75g4v>Zx;M-dfO$eLe5Tgy)Ev;50h0)us@WyM zK6gYl=0mYEBZJC4j-~&QqUb8uGvB4@n|#?*ZmLx$uQr^NHrX<`1e* z3t-4niZZyO`9lQp!Tbi8-{itq>MSnn=B(e4t+Da(S*#66Zds#QA|6O*g(1^31ZLfj z`=0v`@XTD5^_z@dCdiuS&YI~|EW4U9+7C<9S-bG){8?AllSsPYbHK7*dBpEP3eOI~ zf)+Ru|mGHq~X}9pkJ*cNS)PpfwB{(MPYu>wPrpW?^-7 z*#$a)i1)r4jqN@}Lm0xvWW7T}P1YCjStm)&(vN9YgHu-){Dx&0+*w%Kz$y6BJJotT z`~zGG#+t9yS$}8;XxEXPWCN?G}k_I!h$7x^86AF?%;pjJA%Ety602 z#M){x3te%*t$htY`fJF33$ov;wI67|)lCOB&1#T6A(1`D5{c}kZe;(umTZKsk8V2K zhN~NnBL{AF>uzu=Rw~4OVfx|Rfn;he-5p5u0}oIDoXV1y$;IfVAQ`i}m40%;rPf93 zR_RiS4{V&(#d!J9tz(I>KswC3yxPf{8ND?^_p~mRkJ0S{Cafo~OqUC8wJt+v(H%x% z93-#Hln|A(G$d2k_=vi?u9_dGtJcBFF3m!C1L41%V%Y?Q#}IN5j&X|RmpH|WjR;?J zij^A>Y7x4C=0-oEORc-4`&IweDBZPI?H6_SZP}x;mFT3h?1|Y}Kxco@MgWsl%O2&k zYTv1|Cuh&iUQ0b1RxNvqmu>7FS?hx=Ahxp~;g#8s$c69K*&DN8$j&7gShZ|SI7Cg& z&dko0U_{H2t>wpOYvsZ@b#`HPP4+RskX6gZf}sbdJ^NU1nAiER?APVOd3E;jYvshgzGgTFx>F<~f!K{mt2fOpjH| z(cr$9Rg1~7P`AmkD03`gx5=?P6{}x&=U_^{`ouNe<}$j?PwJeOoD;bth%Agm4(4v2 z>V3l!iR{^KWUpL@Y_30%&GlF2`io@g=!QogaOd8FA3C7j^AyQrn~3Zsb#6%RLr`2W{Du18{;FJyZm}&w=l9>l(}0xWS<4SI(P2#_-VN=*~{wOl-vS6jSgfa za#JO;MJ$oXVr{@HB9!Z=DwHvA?Lp*iH!v3azAz|9vzpEi`O7>U9Q|O zC?<^_DkNTY<^D{G(mGr2&v^s5*u0T>w`1u6CNg&(W>$HV+OxGduIb zk(ztpL9)Pk%Lq|?-gW>zu>S#HJ#z-H&U+F#bMmlcbD&7%EDvin;4BXd3wf2Uyb_A} zI19>qolV_cc^HBSDO`T`a5=99Cmn~M%llS@{tuupy7Ip735~rxeO!51i0xLdynpg< zV*_4(SZ96+vOHX4;zI=T*D|iddvi_o%-442r!ojD>}*%Q75C>*&|_yyM6`!H^J`e4 z6ckFxKLaLCx$-|C>{7jaK#?NQxz2p5N$!CrNU$US3hrYk=m$z%;Ek)*c@we4=QiG@ zC$7iIh5xAall0T{uaK_5kn8XA>WV&^CBl&F7x;8VGUWPY`d6^^=Mg?Z|2%f?>`c(_ zz|Zys{Zsgfcj?zV6>AnttX_K~7k*aj_v!WeH-H?5U!N=ywy-oLdkuet-loTQXY>{P zIDM@yfK#l3SzlF%@Byb-%_B@j*n(i<6psWV9N-l2GZbs!h_9(Y=mavD|6kPwih@AH z-J^8f({V_p(vm+pa2HH;C+gvzb_ZAstdj^__I&}NV3oc zSa=l8QDNUgOb6H>l9&%!*qriA(Ro0ZQczH~XIWtAd0|(d5vPB9cBtdfr-BTZd4tSlxa?G{U)IlX%HtmmkQ?M`!(YZB#tEc( z=o^N=y|prqF;1W=;m_MQjN^Evah%-HS8cq@IKznVMKS-#c((+z%=nlHLXu#;!nl$T zGp>{y0@TL!#^;PWz>t4r+#tcE8_E5qKM5w2A8*W*8~Uk@`9_Da4KUREjCu*C$=D`> z_+XBJ&JnqxzuNeQ@iXHkqJ!RNd{ct?-bns7{Yi9w0L%|^!wqWVFQ$H`;Zz^^M@D)C z!DfA?!KUFNhy-IA!iSlL$PEM3rctJQOo_-Q|Hu>~!KhgxhHg_gkHNGY1$*_l7!> zOk0#DkHnWsGpAzX3bzSedLzBg*TX+zWCyBEKbrnB&jB{_k4zW5wKWf5 zi6CnZ^pQ1(UWcrCGLbb;R+=Y^WXo$Lb?8QFw##|xuKLitRxs^E;bd0-4lA^^vpr&`O!SRNxGS~e;z8+HA$V&7qbrQ7tB z%kqKS7(Ci@6SU_hwI$n9U>yfB>H6a$vy`$3h6+m+;+~jv;yz1 zS!nXoOK~GCC#~by#ME*Y_4um8a@wibT<((wxiu~ejLqh(3Dz5>dU)L$?9p@69=**5 zx#4EDb)q!_`!UhPF!a_ty-jSL$r54Gtn_YxhaL1oFopT4HO_hzhTgi;sn`;hV0{8x z_%^#}3*VNo?k#EE1aDVyPL#rv+9_P_~4DZ%;?kdC zh`MNb(WAvDM(N;-fK>x^JB$n=>Z1Kcnj#zQnXJfKWFyA#hXO;8j|p;-hBr*6q`q>) zt?HukB4^Q;Wc)Ay6jgX@Rdk~0ODcmu?*LGQ_YI0ZV$RVqxnY>P$W`>KtuG+SJQumW zkT%ZNR|F(^uwlR^H$E+l{sm+x>tc^K8S?mDrZCl?P<}tuLCO3>!+qT$VD5gr1b7Z5p=a@;i?PrOw9JVZEdNkf< z!hLTox0M!8_K&sI+YWR7qWbX(Hta&MwYzLboQkc9K1B<%onc-?hwUR|RK(lPLUCxj zne8LnPt0x<_W|IaZriWO&+OGxiU$$4j^d#NdrfaC9?f?YV|V1%3b`RjU3`CWOmPyp zrQTBffVW!3i&!FhOYsV-me_eAezCU{uPIK#rpt}k2>B9rKt7jHjD^MGXI;flIu%bW zm+B$i$PK}2oOmP@9|tn%dNI6dQGUfXmWE_%Tc+#9rNzgA+`*44ZqN;cdZr*?B|ZKZ zPOqliOC3X`k(j=fN*v~)g^u<0Tt&*=>{>?^*TGGzLV7@6H4wb2}gU&N**c+ zCtCOu^_$eUI74c5@QK@$@GULrnn^*etd~VZn#}tQc==c@+n}*e<`s`Fege-ko`$8 zAMs%&AIS~l)Foe*TrQOXhB`>eR}#!0rLx{Ie*@-kx#13VX+Y`7(kVm-9i+6M7p8P# zDV_uLpi?@D4=bG{H;h-8K2RE4x`yh54pRD{1hc$!O>dZ0fLSFsOi-6@DBV^1HnPco zDcvZ+>}QGSAf>E>h?-P-oemOHT0=&(v_@H4BaY~$uR0Y^+1#b=_^FW;87~Nu9vYMw zfhMX;-!J{Tj66&7UrMpNN)&zRMV3fpY3a+Oz-4~8@6|73$_5kJvcbx-!6MnRkxs?7 zVeYaq_!)a$vUjS>?kbBa(*hg$FJ+R)TDFKKf^1p0ep5zMi)+a4W@L9O%XWLnVzAw& zb(f{#$9P?`N_AOYS$X+MU?cyfEZ*Sg z@&?LVMTj@A2Z8yM+%QR9{z>^46{{fw(K#vqo<$&}@}GP{D*y93LaOkuSj`-giraQ_ z6*svn`a2a*-|wq0b4V&M?R6fE6%GmU zTPzL9l1Z(2r{a4cJHd~uIIX*hQ#?5X;W>nA1UIL6>K24(gqILtX18rc=-?Dj!~8y- zk8qh&JVTvq0Nx-}+lSjj>V6xg!)wv-61tn(>1unFeYSlOEQid#z`lrhz#mL4Yz>)O z`)p|`-EglO=ZkH(GEi=KP+b{RIk_^1=)lxg(mp6Q3{*x{($tOqyu4M; z0L%=z;URV9{L1x}JE=Y}wUrAbn5QatiXc9irvdY{+z_s=e4#Sa@e;Dh)KW6?ik>9$eoHE!_somtr8sQ-;OYs1Ez0>?|AKa$GvzO zxI4wC>3BA{y5LSO#xa}vrDJ8hW4`FdX*;QRI<^wL+wlxxmb!<>a0|ugoe^qBk|WpA zL6v~vcI@?5!coE!Q3;2`R|y9-Zm&wjINoE#-%~o?6D_FY6VUtE?SM7g@l9{C1{KIg zsvX}uey^GjY-G3{(gIvnKb8oxRq!CZva1TZ4%whVf~peEUpJUW zK>l1+8Av)4s$RuD@J3e^R*n;#l7)z^db8>@=dZzrOziRrt2z^1eRojxH0D?)R7c`a zu7_OJQ+t5KSECulZH?7&HP8FSR&T3*4k)0Ow3Dj(1#ur$wT_^;=xR$yb@ia?>aOZy zr();Q`06?;cg;J4)vwp=kcIzPeH?`bkFWlg=DpRwxT`M$%W+ZfYHq>lT{pREZs^HQ z4UQ~4usgNeY0RSDg`cazWIw?PL^bofYGx31aU`jEl+xWb8whvrw!lb&y=^snI&1b3 zD-kvMH8@^`kYMIsQ|hiU6O_-)JF)WHQ3Dq|LE7lGI`0rR$p29LFoUbT6{lYfbk_#- zgli|bTKL%A;TpM^+9=*t8;xYA+%QdDyR3FgT_dRk#)VqR`qe(o5-~2+f-|p5zzT@2 zckL^6jhLv`COZ|oP9@ap!9b3yHj`pf%SYFK7F2sqZ0OqWP@=dOu>%8L!WaYtr`T1) zDR#fbDV`%_H)12D`f$kMaZWB}Jg2**$B@>~-!RLt(6B~*IO%XI=5}Hu_#0*$7IEss zrw@1Vx*C)p6w9LGdT zaGYNs!%OPsXYhX&qL4KwvR@dZ=KY9k-eEe29nxHYZV0O;&|)(xMsj%o#~bEO;OHj? zKg|MfnC)&BoQmgH1T-Jz46_oNk7GCWJFaFdd_6x;Qq6$oZ#lz!wS2?rZo|PVvX)`E1s4GUEo1QGnPj)Xr|>e?GMCbe*T4hgT2@l} zt&$|U7PNGLZWxnaOD^ukowHmE2ABYGt1Q>@A?`(9n7_hm*$?!1!z@<|hQsH-3uu`_ zm28=U$j<>Sb5Zk-7VM*b{_lX6mAqk2XA2gOUg#gt@*G6d)$$x7!vk7!dBeQ3E%0w& z7#Gmu;0>|gwLsNhm>kgZA#a%feanZ4MD}a`%TxEEa>Gh>OJ~cUZR^M973hX_i-hUr24=+*}ZwuWJU^iXB%P~A`xgkdqKY<)Pmb-v-104@Mo z&na7<6J=*uh_@qJGnB0vV#7k85ieJ^mP??BA5*p->n2CT5-N0F*?L}-rC}-JZGDw( zeWjhqh=(ZKLPVJwmQ#MTvMpNLaLiVf;P$Liw{32FsqJ&BBHXw(X%kIbR@>)d4Vea` ziZN{kd}!OzL2cNa-&UY(E08#jZ^NYdS}R0EKSpR(wzc-;ehvG z`@uV?^k3xUwEv}S|4a0(0NdB8cv3v6f)3$ZU?;Z^ zw|lxVROHDL8S1t{0_jcHXXu!Rp<~35XUiJy;3~W_lNiDikXPca%g__VP#3~)PHq9s zL&+gT6f1n9+Ti{lPZncnnjD2ZO@-a_f!8t=f#eYc(q9#X+wttBANXg}!f6ZivpL2GQF8L_(#Qy$0lM7y~1%bknjwT%U*M`W2D#7u`IStt#223F@i z$W~l{P2PbLmz|0|T}uJP#HxM*wN?*i?==z@^}XOojgbi)!DqIbF|$Qus#kNGI0%;& zd5Ma^9qU#EeBo^g@YP#Yg*tjSLu3SJOhY5o)Z?n@vbsdFI$?;t%1T#$NJ6W` zIUz`D$14qq%uUA4I<)un)ii9S{ow7t)1M?o01wl5T$hIuqC0&*F+V*6B&TOc0}b#` z7jRS&bnYB(ZG?ykW_ms0t0a7yt$3itfZrqF_aqU!5c`}ULV#h!K)O(|8U0XfMnB0W zLjc_#d(rFn&_ukrh(Zsr^5IlITpH}a(~K1eUoxI%td)40u^l|k*wTZi8EFKZ)}5yr z1q6XsoAJ*7AWamY3v-6is~j^fJGq&7!%Y`NjPX#;nKu$!GXqe+nSO*z>hIur<}E?E zjAxSqD8kHPPQ~6!Xq1^#y~jM@9;SKbF2?@MnG*Xmmr*f#*9T`Xc-w9!s~+k#b2HWJ z8vQ9D6`1)lm>t}QsP7NOwtM8^Gr*f8sOa2J{BVXV!Si1@tV`tM_UpYiJ8q zVAgY(_A|dJ%F%iQbew1 zqXRRpX0Kpadh8=(SQ1J7X4AVcvx`V3v-41y*;xc89W%wDqt1qFfGc&>*(H0JUu=kj zXM|`oq&OS)teX_C>ASOEL%pYn_B?tdkVKE%LoaAVk0wg^Ms*}rCK?MK9+5;pO1PsJ zP|*dFgCtJLk>u^@(bw;_QaZW0jn}aT}Kg>5UqONmt zC<$#f$HaIkq+)tXyJldVV|8+|-}WQLnNvYRB&eeds>y}hx*jb|p3IyNS;JE1dz6VL zor7my?EE;E#?3iPnllG=o$Ck9DW^U{uldcT&VB}6W$w+uGdI+0Nal_rdUHomks&?k z0r%Xy0M1_N#r;%-(|*M4+}%`=HRRkphi}-6Vo}R)p&AooC(=s_MK$;9wp+m7bkv-s|WQ^L_-M^G9O|c=wK&%2P6|3mp zn_|&5Vi&UB6pQ6Y)|+CnoaZGTf$Zf7FY)0&;pcJ6A&{rTf5de^Q5U&M0XJgYqwujQ z-I!tDu@VbbGfqk%+*tT_-TGfT9tirKMRF@t_V@2_gEh*uKP4Hn{`U}Gk%f2tU=S{2 zm~Rc4!bpH~!nf5y{fwaHDju~0K1K#Uex>x(3uy+(bp#M`vHM} zz|8A{Q&bk_H3muFkRmT2WjG@@JgLV06}-yW2jMQ7HDJvUNjMe2J8M`tz>|fQL)_6k z!82>XR9aj+MDlPd#9purArrfB0##w*9pGW%9a0tKhNnPpVJ!l@*+u7pN_!C(84}*{ zB(S*&UTy;`;yMxX+=zM3%9Bz9#8wXrde z=@{MCijFV(mQa8%q$1@wA;tCc1mP4Z!J;pC%5=*O+t473%Mj2g*vEqg zxr_@MWU5jVr{>4qq!^)4BoY{hUXR-CLxdilAZQ+9AZaH(a>9i6notM%)P}xBk~Y z#MD;^Zr_;)h+Sk%ohNdggiF#P!u1(=L)>xz?Lkjr^~a%(~>O& zzMjA{22n|?gSjh9^k8a9ikGP+@HRxI@R~3Nz$j*AmRO{Gth|c(aHEkwgJaI#l6Q&E zV~o%nM5wI?pS}Yhr5TT#3#`ISAV9Pf2j}1_2co5X4@7iez*4+a zhU*y04W``g*q7ep=94Y@HZ$2g-fbS#bYoz>_z4=B4AI(LeEsD{mmw7bODiZms7WjUv4wCASzrDJO zE(vrAr(Eh}tGXjG*JEJ$vF||gG0_KwZa(%t=_YjO zG0_LbfJl0~rZ3w6F-$zPWf>2%4qQ*dSu+Y@2fKR#ci+({vE~CBv)6ng4hGa`*8BrH zYwx4Wa1dMDkMRd$YvI5$Vry?<4PMRoUprdL5Ax{|9gW zUySK{S^oMF-u(4LJ^AayC_f#aNdW!zbEW)Q-u#se{sA%nMJa!mH$R=h4;S;rBVQoB z^_a{t{?@lrzNjec-$VvB)ZqFdHR*ax`o;6hXoTGmz>s6C*??6TO)Ls*z~eL4tyvnk zAyoAJHiSXC8^Ux$C*UX2u-20rO{vj)iV4Gf!T^tuhQSSZzNCpo>uz|0+GfLMDggJm z=Ww=R2l4Q-!~>=;A`cmi2OL?5Y(2t{^kFpoT8NxQHt=*e(*;4hfjV6Ux)k%{K%Z#Cg5X9%ro6|2U4X~^G#C`6MYm; z{H_nmM^bt67dAoXH!a7I^d$Q4X&&e|t)%3Q2nm=|VHrUj!8h%q`8IvYnh%y` z)2Aq)hYD>v?@=K_{$D4zc?_GKZpJ{YAAo|J`%%Ft+zcfPws`{j;^t@R648mvB;+n2 z8?kwT7xm^j9@Lv3WvBy~4cUBv<^Mm%z5_n0qI-KbWhvqY6)dPhf}#`ys3^Qjs8JI& z_KpHp2)!gUDQTpan`{c%CB2YB8tDnJl!PV-BG_d^Kn1a&h^Q#v^UU47y8-_1`@wH+ z?#!HX=CtW^XW?ZtqRHlr2olGfH$C0C4Vkgd!Oo0gKzyOHg8^FlwM5=7k+%@JsS7e$ z+>fd6Y5YBboH0weMl$30aeI8Cx_U9=c$dlCUmTRqbV2AY9QQCI>VYC=_GA%`yO@#U z1<_|d2%nfa2=dRo8vs)NnPcP>?pvfyvKTTt@5YON=xWxAna>~?T{z~MiK>?V42(H* z7S{k~V%0~AH8YlC&5VTUW`;0L(+QjNnPw<>X1QH~GjW6q@gf4}bODAvXX0oB+LO;@ z!B{Gvc}C8NXYL^&$s96$4Mh<58z#x^kD32iL?Bi=rm($XLl@|#-Wi9t-h=|jf%nk< zfumSh_eSJ-+z*UDQ*lGEKmN{9mnH(kNOLLe z6PQFwv805lr{pUT<8|;QXI!?g8gTO*po(SD4e)|MxnB@i4JiW42(78hd2krmhV0W) z{J@V0Ma&LK{9pNEWnpqx@W|oJPX4b8$G_wXnnjeuo z9ti26Jxi{e&3X#7XQ6v=;tI59y#}9|^(J&X>m7SdnKhM|Fxsqz(rAy;XtS1E#Oxnj z;gz#u5E7kh_$(8-pOwxMlq*UoB5}2c!9wCJ^f0Dn-37_ZJ_e&dlHZ5$qg2W)sQ`i= zQ$fk*Ir#VNJ4opt$tJTeXq0AO<5Z<*|Htl;vqzJ!*$)7CHd+K0t62o)&wkudsb{~0 z_$pccZ1geGD6{31W%fLx2VRB_mS;yGe4-j+_68VY_6BK)*|n-6X79uii}lBq35)!LeJSP#_3H9Ct1YYDG2Xc#Jrj4 zjFP|wd#$;PYzcDuK6e>XuUtWy8%7|xf-*Nv+LC6Rn}pKlCTY`g7;rAu9OUmDFax1j zu0_t>X1D*`trD?CKI@2Hr=dGL!rc9GRCzy3sY5two4n8chB)8I1r$l+G~=f=8qn9= zvlhd8r@eS>EoGiSUq7!e(dM}UZJwL+TFN|l@;v-(2%dvDq?&gxn>gJ0&0)g4CyDx` zM17p7kFT*0P#8gYp3T<0*Emd=H(hU91a;3tKR)lGMJ(t`b^ofWdp^u66QsK5-*{DZ z&%c8}Qr+|KmFM7D^86=2eEt)ftW3HW;aREU`Lpago3F`8aid1VikQh_$iC09Qlja2ekl|+UmAIS1<@*;bv%DJQsl68 zz8tpBm%~d7a1h}Kg9pX*%pg#Lgr)i_eK5H-JC^(0JLaO(l2W7x@feG zE*1@KSHI)pbXscBD1e~J9BR{w%}A|BLJBW6YHI*TFirK{LH=nj}B zNDjS%?j+is&NdH1zZdi_Z5|{~MFl-2+qiaV)u3Ra29y1ug+yKGWYwUBNLWex1%=ao zL9u#MFzgpR2O-!ZmcCE>{jAzAIN6pU?H8PJRr>|!5vV)sUvQ;X|AKddc<@e5RxlG> ziLh7dJ@_ZP-hp;HB-J~VA$OKLmm)!7QigC8{l7}@rFS!ADlWlfhl0hmN_WHi0Mv|68 z_9X?(D!8%$E0VFDS8(H1Y`dLkAxv=eP23~xg%wLUmBp+_oc7UUzXw%)+O+l zr5NNaMSH#M0R82(>MzT#wIxV@S$0Dgf04(1;kV0fCy@Ji46v4sBP+|KmoFP3--n=# zWkWQ5VS18tKBq-!KSac-%Cg6$g(W=qVU|tQ-~$oEv1E)~J|g8I2(PFjEt^KjX>0PA zauTu(SIywbW^LJf+9?BhxLjr|V}|31D~tqXY9Cy46-6ZzLAVIJ<(C;Hvcg0~Q>_)T zbc>z@U>i`S^g)6Ow0e2$UhMI2Tk!X+j3OqE05q3$|6?u zQf;`R571WhvDt9NJtVcFAJh72q%<3@xR)9CY7G8gHeA6uz=|<;8?JaVs_vdo5zsK|0kBs#AS{T|Ai}o$76r~kbZX(XcE)+FZP`6edL^!LHynJTo<+LR7EitWKFx9opl@}=D1)E2& z>LsB$Y*_hkSC0mPRZ>O&mm9C*;i^@)+ueB8Fp^p|n2Ccm>st}SY`yg6%bOy|yUGV1 zyeg27CkNm$k-%8k0x+XbLv^d3k-w4vjjVcKl7E}8)8*@%Ea^?HBu(eijaRLbFmnhq z$JvcnLEWqJ=*FuO>Bg&YuwHZHRh!_(t2Rm0N}^V3!?Mi*PPTW?wpH(qrF z;R}lhp9x=8?!dzp30MS>335eu)fuE}E4r&LAZDK_Pf?r6)h>j0g;rK~huo`gwzq(* zZzMOXuZM0{_p%tuk7;s(`PGA@8_9L?)guvKuC8FLW(%`=jB*pPa8jWBn0+yP_3O-e zeN8^<jyx{6dW{`aHX*AM2#Vt@PM{NzvJUE4y^j2= z+kb@0AryI4xBu?v3d-uukoH|e0N$`vwEAnTNDpLh$0ftnSSTt##?_QHgZZ|Uz2}-R z5M47;o*4$r8mx|#9~+F9AfbMrg;&YWWzH(eU;|Q$xkirM*A$RI7Sl9ULhWm+;d5*1 zSWK(bJ)!Ce1>V=}mE8;O&Byzv77?P?O~hLVexU>r1DqyAj`2cn23E-R#L~u(KnWRw z@G4P49#HieVpo005}G%Jst=K>*YHSr4R{I(@4zDhG=C(iM2iUhm@9W7*$DWa5<=LH zFN9P{TIHlwbh&&XEf6harxdLdZ&4eC%+c5VXCaZt|o+$SLN-H$r6h8S*=E zeqoxXG|C=o0EeNxh(7d5J_eD4&|3f;+K0f}QYlAKq3T*5GjVoGmL7^dWo!YeTZEz0 z?A(REZqJ`B^B&3QMnVHG>ZyiQFiCmj{KMWAx!vrCdndK%)*l7 zep^_fy*h_gGqrjR54eUkPz4+*qV9z4WCR)uJ1PtRm;g8+*4635tWaXuX}c1`u%{vY zJ?w(RDZ*V*SEs7`ZQ<9VxbSP${kCu~M!eS8m$U3Vg%4-?aLH3R46X4Lj@?|zQ}|2d zDf~I`6#irvp0M1wViHp4B81?x#=Fr{;#*3@=Aj3cU!>zb+LnV%erk0{Z9>E2n9PEIzwiiQ6VlUasU`% z07Qi2Tp%DK?vM}>!<4}kE#iJc+^?yI5DzLtWY*Kndb+C{F#m0p!aPMDYl{dYSeWLe zgh){#vK86WMzDj5s0@ka(8TnzAViA_u}hKj(1??SIH?`-C&VQQvGy7TAIn2sHv?kr z&Dv@-Al44xRZJ^(3&RIx!mx4}!V-in!m!F6AzT<%_eCfYhS;x!A?`_Gi2qs`(oP7& zdb2QOUn2}T^MoO9xG?1ZEDS~cg`pVfC1-`9yipixkiRJjX1mG7v<8M=`#3^?MMO=z zLm3V;azu_?+F{15zv9#tli1|)3rPGrf|~Oi-6NukuL%$;VDUDpA(JKwk+Af zujQ0T>)_X3LM%F|%U5YW0PjW=+vhcrx6=TTJV+mTt;JA#K>NG~x0%a4{X?l-?9i8rZpt)+5{o8fv|W`prQj z8VlRew>fCo>P7UeJdq!LtKO6V8qos~{)6xaXe10IAJIHcU~8ONZ=>JPXvk#%C@@;C z8b+hLm$%89k_h$|!eWbvy#?TE4U2x;iBhO7OL}Q^G=Q`k7M+gRl{G9HW1`qwx}!mf zE<>otxd_~np&ssxmb?1VTi_VcjTS?rm*$cjNkprs7SI((A4KM}luDjjkZTG^6VYe5 ziyw{oW(;<*F-#-frR?8h+~8O-ZpwWwxWO2282>dsi>^0Dw!$%kndZqftwdA;7vkH4 z$w=BUXd_}C!-#GszM$cy(}+HUIu_#xL4O!ISX-A zut#ibMlorSCI2%SqkAQM$aL3O`d|D`$`7!$QcWE_}rNjBnK7 z7%|_I+z%wziI+d{QUY?Wu%!H|fI?159n0DttLKLYv1soaOY|lMJ`fAt$BwXwgsJoa z*;2)7m(L&zDv?>z2V#AleIWMvtNK9f>qPN@K4afUSm^8nv2s=zyBt0cyVzoA9;8`> zJ`kHO2SSi0HV&CDLTj;w;9gx^F8-i9JIka&v(c9Y#=HLv@QdtZ~NO*u^d4`okP?Hv{K^%iJRFLAXWS zy%s~uZ86WNZV?CfY3AK7azSxQ>Ligo7lE1eF&-E&)qQ&7U|JCEjG#4t&ke?B|)SHziNP`#T817Lhm%uCDfl z3GX^u$OQD`GE4S_2_cT!VeboBeWD12Yt!(WU@>f-48KjtVWmzmLw5<79dDkj`7P@~ zg8F0H%&cH0te3D|s|QFE32m|-Bz$P6C$~@%z97mcUFpe!eq{!Hee+~(`AQ~;#BLNk z(V#Y@iG5K!68kFmtKOLCMGPoPdLxx>N)dWf3KWw#65%0)LddM#kB2KF%wU34N232# z)sgrtf#heAi7#6WTb_qH5@(Xj#CO4E;#8(}QAgrR`}`zLo|6XX2!q8`8=bUv62|69-;fXd!@wy6ka9AR)TT3~Gto_N$|PbZ0tS@IKp?6EmL%<75+u7b zi}3izJ`!{wh|*mLr77KIuX#{!GJ_I+Uq&bx`Y81Pg_jawutPb@qqZ#Rf67w;vJF_A zY^gw1O1<O&rG1d~j|#GX zj+N|66gPBq$yi%SzFF(&AW*U#`6Lg9ZzcD$7`B-;f#6xm4-CL#GPG+e|RAX`+GsBpvm6~`MDj|fN zxFnbGwO9h@6F9RAu!iN_^5pEq!rfAKRmpoPRSQtek}L^)ELm}Cr~nR&BzJIaC;5Bk z>P=ZNLo$YsDZLOTL8r2IIexVUseNoY$b_ct3mYjnF_})8ayx5R%ALwX!eDs?Ax{{# zVfwKh)9)Sk1If+Bl#60g9!G#>(t6#YjP6pCN|?JA0i&6eLbWEPIWb6Z=D{GSRRszYIWE@~I?7SUTHQrCF8i&LEjf0t{8Iv8G@iBW% zGEQJ7*fPFIe~W&QSQ8Llr`?Qiu_hU3nvSV8$+(Ens7Xa&-582sw20IevMy_qG0che zTw9i`NyZHT(rS{inJ8D(B;#J9uqGLgA{=wBNyc+hpkLr~_;TN{^IJ_I)Fk8I1Ms*6 zUQ^Zf9^RHJEQU6=_o?>w-UsiuA$%ZfQtF+|C(3Xs9#K&F+Pc|lQtGQvW9rK+HT8LB z`ZH52)n1cQ<#u-Jd;-svz<~sw-UV30x_V7YRUlPrD5bL3q||kil`Cpe>IT-NRE)dZ z&`%Y^45=1`!*KDQ(5b9RsoNY@Nd3~5gG{HIl==;mS(8#vuqLJcpo~GyK`q*GMi_P$ z3q!j%0-X{ysT9Sep>0d+YZ1G9qUD!0i3?PEH&eN3lVE-b!dh%Lq7<}@Zl;Zs$l}kd)lf^jiy#+J&iC;-js%yadr~&1HN^yqZ@4}(7S5L><%Ga z@xIC;)OT0LVvwrMve#weVlmtAG$XHuSB_zM9rA!bQz@GX_wLBR1!@~%%5`W*ccn3* zMrW#kz1Gzrp`aIDcC-4eQ|H)lnRW80$+{z`rt3ZeOqAv+aNKo{c{eh}x-)_#{}!fl zU}kosvt_yx^Peu5J&^LQZOH^avIVkcZbE3chrn|aze0vh2aNuR@T<1ZB8xxgjkI&NMdVFl0%Dg~-lf47VbX(|2}0-2=0b$&b_D#A zRKh^Eh-_C(_hcqv<_v|IFca8qB91%=XbJ>bQ=qDFxRJW>Z{o6*DJrpbDSIDN78x)Z znP#-D+ct_2&fjE43Dj=F)PDCD+M#*1^6?xVK62kGOs(8&HZ}LgV;7;f5E^7s=qil>1N0 z?QC;1zEiP(QD8=QXU3-tr|@SW0ZC?v{GtH3=7*RhI4Ceb&f=N-yj`Pa4Bw?j&GIyw z`2*<5{DDKGkldUF_RVEr-<(H$NN%pU8v8!TsE6czT!^(DlCQrN4>M1%n?E6uedMQ| zB~mo=0Ty;Z^NOx|H&)~ME#ba(Fom4;?hs?WKJ%bDPFa650oQYJc)bVdYr2x> zzt;~VwEBf6G`s#m34I@-G4pqVhHUGxkWB=;|5XUcI;VCcfTK_iW=8wKZ!1b|Y zBawtnvX>;`b&_x@2`61am@8m*!qw1IPuUf(-wMDuV(cOYt+@VkzLB0ho3Q>{D_*Sx z)5MyHls~zt2i<0k1}9nGP;i#_aXjtRgqY}lr=1?T#~S-p&A@9)eGB)Jz2cU9n;a$(@Zb@ z3-w6OgtI7YoQnS$nMSL&`wRKC30XnU4WD)D)iMj^36iXzm;udXU6O_V4b5czPEs1* zFikd31Y}<)WdybCUPOXC*|*Eh(QAYc-qGJ=e<;6W%Em&2jhF09Vve!bj_hZMIT%R` zSX_1p7My9Y68%5u#F5>Of77*at4BK&T#aUIm20g z&fP%Cxm$UdU7@LgddL}#@G4zAXR?mDPmrOUw}~iEkmSr@>I_Y2;$RA&Qy_7|I8@ES z=alwpk+XxCyU5e-%mY}-k>y%R!>Z9BpFc}JN$osjx{lk_xh`<9Q~3KF^PsBSSE(x1 z>2kTjmm4O<&5gHhJ(*&OCkzn&&6w%X{7~U!H8AZRX6I4f*nxN;>liJ>OZr zybz?+s`ohM#WFiqC6+3Qk%dx;T0~BB$(F_f3!vTeT3Nzw3C7cdd6q6E974*!wi3Q% z_Lpi2Cru|+@5?(&vXa_3xKw^mx>Wvkdec^PhWXHM{s@cMV8wVr-M+|oTDs1MFUTx8 z5y+W$2Q>j_~U=cy&&jUn^;qL6i9fDC1{sRax#W$jn_t+@&GfTZbvBkI14v zMJ~?qgy6u2`WRq8xe& zI0chfa>27Gx!_r?wy`BBn1}A6-~%kO7GQ36=q&uYVD;6y2NYTmX%R)Q>%d4sp%)%o ziCRZgERd+EII4eT&%)tL!G3$sQm{|*!Vy!!cJim0fn|Rw>y-Q;lE;gRuIFs7;8%pd zAfrEW<*i_a?j%ykxlF;uE<`wwKFk=LH z5;3f4e|&_1s|W~I3R8LQc=%A*2lEH6Pc!i9ac{v3G72$XIdqnV9J1@X5KV*BccGkY z7XAf&7yjkYw>$w>^frBODSODG#ZX?+EYeAM6ip(EFT(kxLob27BCMPr{27JY_P1=i zNqKU>R)h({p_fo|i^`~nqGGBFHP^|f`2lMYj$IwvrWRG(X^-1_;G$a9^Rylq-cZCw zx`>T*k!mk;w3}r?Aw{ZfWPeixY8$5WlwHw}gg%>j2o;@N{6j9-ffTzV+`;C%_&V8! z6psV(;zmMCkLM_@UWSd5nb zU}VRe|3`&l!{^X8 z3DrQB8niY7Zn6Qhiz72s!LU(cb4c5E;D-G=f?&ts$PB&7f*QI3KE2@&i)eU(ZK~W3 z-0&@06x-%<35+ANWSd&j%ehT0>37vOwZw}kea6FnCByA)YKd%EO2$Fxk}(#;(NUVv z6rmfhd}maS9L`F5}HX z&Byfv@aPGC%6k&|l8qlQUp~OjeEBd3Pf~#Lmx&-(_sX9GTKQuR08Ob%K~5obp5vn&me*49)0u?!52BE%+@ z7RZ!v@b|)1Wo;Wp& zs5_M&aIH%9TspX{yn#p%tMX3AER;tQs~+Ikr*Z;xK;gQQ{C0@cVVHH=Ytj2RT>7fJjK zgsGI`J6z!>B>fHj%$548y7gOdjY;*VbL~~J3hPcRO|^JthOH`QWjQx(znx0Oo;2oV3K;RtdcnsrfMyhys!sBah0p4TE z1dIZJ!Ugmrr7nU5A0R>J)wnaHatp#3mCD;Hm6u?@8b}B~xC)i`u1e)Gpv+RKB&k%w z&~ntESwhQk6)GuLrLqht8MaY=%?4EYnrvw5p#6MH%?>J%qU^H;vAQ@dj{laU2y$Ng7o9+bmBvvHZg>D)N zoK1s>qg~2QNXWbC8Ck74Xpq#WLv5Qd=!DvCpN7;Dc~EZCVx(dOgkIdM|Y@);3a%t#V#U=q864`y664BImHpqiVl{N7a5K zJ&LEFh;>daL#7OOoGi7Qs@seb z>S|d+3=d5abic|M+Pb=(*wRL|B;$lJy&CAyx@%r&K ztkPFMZiT+D?h@S;O01V3c+}qn*R5xJ{#e(GoX7rzbgV6WI+w7IQ{nZK;k@;um}ZBi z2mdHI9;k<9KTRdrfIP7;UBpkQNIk9sb2}p)UT3rN@68Jl=>J|jda6$ zBf|GOdQm-22|>F{=|%O0-h9Z3Au-UuBTJ4Whamb1oT&awn-g7adN>Z1rT!ekKhE>I zhMwfPK~IX%kDa2U6O?5)^n>9Vu9Jr2IW>th6#O&{)utYx(12-Y=lCA9g01P+4y`pz zpg%RBRuDjM+BOL>%#j+VT0~2`@6`Z5JaNY;yugqR-w6@w zjvuhXaeMrRhk!Rm4TBpVg5qP}=RBw3yZ<9I{AP33@7TZgmGwF9UA)s)OO)UqulaoycaSyqLJ>r6n6{SANO=` zkzj!tp_E2HDy2VOUdu^B5(H{oq>d8EUE^vfq;WYFvX-aFkK`1<1Wx9qo-=#Gpxa^4 z#!Q49i)e?_2;~txV9>@ITLOME9kC{)Y6fj=Bj98ZKFY#AN9;=T(n9S^uZ4LVQHvWL zd#o^T$^K=04xzAuNXPJpY@oqS}Cz z;k&o~x36-H+YD`f>pd7RFUlpv=9!cU>S|s_e5uV+x!a*VBo$^^Iu%#Ytboq84Q#YWt_9f~qaKBd64e5TZpxb)P=6$EOq_+ReVy7d2QD(QZ$1q@x>ueCsRzgD@!+!_bZLP>^G>;Iek zp`QUM!>Nw$;{VS9TT!K?1GXMwC%HKpAz!#BWN6=4Y%YiBn+v7ra;Yx;R`t}y<~C+v z(g~f+L@T=alN7YqLZm+=r>C2LrGB6n=vWVPZ2pVpu>Zi!mfp+-fh{+YfTLM;d|LtE z-*OK!>HAy8(D%2Df{Sj!YLm0?b9;Kr6Qneml%i)sQCl#@JpC>hfoZoafV*x9vits) z5TXlMe@iq%8GV0?JeIr#0}lE=^|0kI!f|*VuFT_4qat>~{$=%6Sx3mvR)aSm+Vqdb zZM_GcwDn;);ns&C^;R?nKg@v>ZuKFhD}Fo`8P8b6_Iv4sTVEmS6gc5l456eGZk=rr zmK$wOxOF9@+!`#UG^$)%cMo)n zk_>0O{)ZESl;O;K|G!SS6|Nzj(9)C2x9mXpq>B?;zJ}-)3{GfZx~AO;E$5hl5wOh( zx4Cw4!fj}xNUbMc2K(Hwg4Ds+c+A>{xde)pmgby+uk9$D_pWtsF;z& zL`?+d3#t{irP(ppUlp^8Uu|L{0FT~Q4hVYmw$0S&wkCM=woOFWdT+Tmylp?^+SX2T z(xbP128EthJ$f7WrndcV_vr1?AL-HCdmzZqd$-@f)_l9{=VfcYotG?be;J6|$J$%o z?W4&Hd~^E~a@6yJT>soY1M{2hGsxZcsc7G~zeXr+hnvMLu!tRhxxr(%b4DZ|e<|NnaIj_Ed!-LXLS+dCpC70kLLQx=;H#qEgiqBvTA zM?RAXCU=u}RKZ9)N{OmjA6nh91!mf@-EQ9<2M9p>?l_8oAH~JfO8f4>(Am~o@6^E( zJKbT4olvlBJ9hR(1ix0cR6r3sXTTCW!8QEJW{I6q#D*nyni>9=C3c$sn=%bWkh5+G&xCGY>o5*()N?0~X%o|MXh(s!PPP?xBzofj;k z?K&!}P3Vx*){QxAU)q4trv9phech!^9+qk2%`9z$wP~H^^eCroEEL@4kGj$34@uf4 zSPWI|>Z4bgv@Pq_v@X?OO*UpDL%S$a_LT^U2%if3r(x}@Ahm6$v^~X^B~Q?|X9CDJIm61R{S%J%Tms2e zrS^IlzrCJ{ZRgRq_6qH!3?m4e1^L*?xp%wVk89sYxP2O&-n5f^eTDEd4or7Pk@8%2 z``1ovVQ*LFAd^e9hcE|*y4(L^GTnKX(A~-B4R_<&P4VNOVd~WlyZCcCyX-%gvxyfT z?D~(q&S2N0ia$Bu^)ew|)`l#Ect?epuRI|kLJ1M7?e!5NNrf;gPf7^hsIjX$u^im- z;2$B>3nF$MP@a+ypA+J9O>RP1RT^j1YZZ3=Nr*qS)1VBsNoejr@Q6{gLU2d5TncKyr zh!-Qm^~%$>%m}QCm~M<|cgt+d+#x2d9kkX@uRLSRT>CI6oQP?2%WTTriOhc^pVlkS z+AdKnIXH+U zf7SwJ<)er+YjqMcw7YPGS55SQnmL{|i&eZDY^{P~%^HbUDs%&C;(|rZx}X{?3fH7q zYtYx8cl_*+Mn|8ye^O0(O?546k@70FP_vg2YN3XIFV{lNXSIiP{yHVv6i_pjjtZhLH!ry7pXC9bT_eR}Y z_0cT|oYn>Uh7sfhDsPA#L5_F#RL!{`(>+d3bU_G2(?z17sU+$|NuSdImVXW|}f31Fz z&cFUG-QfC}uV{-h>c))So&5lY1To6ZH^c4_XdrSp6xLJ#*|#?s?yyzd|~n`co=<6fHm2 zo}Vr8+oh0u>a_eyd;SiIul|(Ep0Big%)Zp}aj;waDVDviTK+$_{Jq!7{9B=83`zFw(+A)U)A7Au3b*ht3B&$% z?@#P!_MV1f_F{hV*O!_j6C8adN^=X}GmQg0sBxc*{dny@tR(++ku&vu{V+h=cjs|D zJS~R5hj!ovW0b!xIyYyCXRkmXBj?R$`Sh3p$k^d~*=c!}uG5ZwnaQxSqB+`Ifq zuzj;_A4Kkp0L%Nr$nw6`7|HCz=I7r-IRwke(ipdYH?~hM`0V2+1^dvf{dG};xNOj) zj_mjGGP8YH2l(qt`#@Sr$Nc$ls8wc9?<;RELL&YEdX7_{-&sYo>mj_zJehNrW1@wMB!tK<} z{$3oY?Z1IQK;C~RkoT+i12g>|JMvf}M?WZ$eUb6LM1F$i-2a^YyTkoc2u^eEpUVub z&hKAnrxPieXqR*n0a7jLq)Iww`s2 zWux;JGqh@c;5|DXS__O%jHGpAd$Z z9u;w+h2M9>NefK^SIV6o!TG3&XO}xPF=}{R4b^sxbV14P4<` zVK_fh82)$&p+Oifd@c-sCJMt}wZd@mc}W|iG&k34OuLk6lTi&r+=M8zU=_`Bv;v@3^1 z=u3Q$g$0~in$R~w<8}U_({-Mq>XCA5D4gfg!@(kSbw?ZQlD-=4v4&*8~o*M;32 zJ{meJRK9iAF!<`FqJXg4uqH>Z z9@Yk;+m45|An#wT#h4Vf*DLJ!fUu*z!;W@_9kO_c8~TKO&JuK2opy$u?j3fzGwdV* zLGRbjupjxV(Yvf^47(6M2%pS`{mVi-!}Ww6`$Kqd{tXJpzDfA)$HTF}>%@_N_z>Ok z@R3Z@n?9KwzA=1L#NV{qS*kMp5F=D&_-FX*u$0>9gddCe+hsy{=cMpXukec?|BE&J zGzvTG*sbav(JNR)xLd<7F})kdEIGB}w+Ihs*3Sr^i0dOxxdlY@kGKc@#5XppM2xUT z3?W{U>^X9ZgkOYj?}+C*BK#~Kx|gjHFEZ1a68eXTDG@oku_Geh5&a|PmY#=G-W{<_ zc^jvOB8ogBHg!al64xi9HR2=P#0Y*Q|9!*}(&-cNHFH!;_(%Mxvqqd_y54kT@>`@6-%rH7MVB5w*7 zk-e>vJ(;fQC95tU`T(gGcph#Z;O|V8j%$VjK z{*eJXYb12!f(yBhPL7-!`A%dUxK`ew43V=Kp$w7p@mJw3El0He-aj%}=M}kTsSuG% zt&zc?v40lpcjO8l=5Z`m^b=hEh>WmCh7m@tbvzUqHKq&Da8%PzCr2hm8Y9t;=#=+l z`DR9B`MFmszZm6j@rtY_`4VenvBksnDV2rt309qqIGzA7a)rB+2qJCB9BF3;-*vHm*V`yh!p3ytBLcc&MV5@ zGxAT$e}d>b>ZDz;N76lHoawu&Iw)jK8)3k59kF%9mayDc<~LFGC5R}fQLJx z4g>JMm$lTgYlJU&fvKYocM9YMy@HZqKsl5xyH*IFs4q#a4XFxtFVqshRAJ>Wa+Y}z zCi+I5UsOl$s9#P*p#gT^aXjib{CU<{el#~xe@5en2BLMk!O`8v`A7HD4T&D0H+?xd zIwm?H`WP6AuR%Gk(Pl>I9?=E(3#G{JNUd`^pXjpaW1v#08yLOQBf8ZZU2pNwKO7j1 z2~O#e9>F5|(>~GYF7ywpTNn2Bf{uGcZ~AI-Om0kJEM{c7_)RP=rkW9&Af^d_qYul{ zVs^3Q{H`U(d>D(*OJWXs#C&0m`2`U&;c~ak5iH9-zWA_ zN2XmWr^?0;R(b3Su&?%secn-$olqCpzfpg_o*es5Y+zysbdhw4x`+*Cgqn|CN%^(W zhT4b4h9`F5s;Ss0i$}M*pjhk|#HLwelNi$)((#_L>IqhBY!Nd8W7X5EpNZI_*v%p! zc6aQ4N7oqYuwY9k;?OoE0ZJQjyN#X-4GbpL_dzkkBr7`kAE7UHRBdDN$+DD zy>C={KZD*6);RdHlX!k{7lLt>Sx4MO0y$WV_lWnyH$m~YNK)|wR8sN7C8>DaI3NFr zHD2s(mg5r1JPfJHU9KE|iTiMq- zNT2wR6MD1oFIad`JQ$Dvt|R_<7wEC4;x9;M5>Q1F+^z8#WH`w+&M)B=&xGkJBMDO^ zBMG>bS5;KP(nNPCDq)S34tI`$kFlo`j4HuG5X`kEfO{u`ehC#wZs$^aYJ(ajgGLyIy*%oVJ^JUEV zW3FmVl)BcNzL}i#Xws7k#_c)rx0PC#@t#Sx#lfVx7LT46 z0+T|eB<&(;Zc>!+Pm0%#O3FyeuTdi^nyi{a<=!q$$zLc%5&Y6tF&|gZja-8t5CtpX5hU;-Svur=(+8 zlOMBq^m;5X`E^Qx`FHYT$nY_Cr8D7>aQdMX2=gFTtlmA>*XEJWi;3@*tnc^0V`=PAK=og*J zkm^j~b%X4l?AH#6=aN6CI#Ys*Bf{S}K{v|y zr1427d5ur1>NLJ@SEn(^YMe)GCv_TQt;PtZIjPh5q*SLdzr*+>vW}|iG}anXi8Svt z)~f0>?$y+3JQggBpID6;dODRM)oJXwLY+o@X$~70PaZd7+-n$RE9HXmf^#Vs)KXFn zvJ}>V)Pcbw^=518^;eYgd+J?RmU4kcOU>*wqNO$9dvzceTT^q1>})h!{$)n9v36Oi zO)Yv;$KpJ`5}OfyO)r~S~8hKl5o zt13C|V%kM#@)uPlr>j@Ov_r}1LxM$me``9rPNy=YDbt5tq2#oSRC2oMcp7@(-Z(}N zo!828S2?U zYsPdGUKN-TL?uO!5gF4nRtf)%Fx{w(gp33yc{37Jb!L><)tS*?&8Q}}lR7i@TQhbs z%}JdZ2~wRICp$6{koAkI&W!UJ=bg!)SJk<$mt^EYsB_(&!D8Jl)^#^@DMPAr9q*v+ z+R$X2r#jcA9?v*$@wo13s&ieQb)A{WUDT=OU#?D-HNB~Ga^}66_nWGzPFJck^HD~q z&djH-qRz}0Ow~|l=DTV`lQ|WIUkc2`F-tTww~EZEnX83=X1H!tW@2Wdlf0RUsyZ`E z?dr^Iv}R(6aor^+b!Hy0X6|O1lR9y-lubb9w;h>@7LV)4sp`!9Bl8bu@_(r6G+iqh z`3MN6dxCMxlht%nmolU}O+&6wXXYPNr)k~s%s)^F7RZ5IWW|+DV5W;Y)%?rVsj{Xw zotSKX)jTcxK`1c3j_NeeV}$B7FTvk|=qwJ&X(66EAM@($2i*hA@#bXV7J{`2EHd^p z8%_KD%o`zr8HZTR^&Mt7-3>G3yrJ}zSYtv*&dmMDY`2=XA~Qf{mJO4$h;!zTx=4q$ zEr;(MExT9vm_N>X$z|-R^&3dnbNwc{s0otm_XUgfJFV+CUqN#HekU47N(698ryF}~)(F$Vjw}rRZq{<6|^KV+db>$9Aw zsh#S(w0>5q6C~$eK3VIsF1iF{O6NoBTtrOb#`POqqu91V5~MO>qOQGo9{y8<5?$w z`JN+nite