From 9a9b75398246366b3712e9284920fae5a7c10318 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Tue, 11 Oct 2022 18:11:49 +0200 Subject: [PATCH 01/53] l10n --- lib/l10n/app_de.arb | 1 - lib/l10n/app_el.arb | 1 - lib/l10n/app_en.arb | 1 - lib/l10n/app_es.arb | 1 - lib/l10n/app_fr.arb | 1 - lib/l10n/app_id.arb | 1 - lib/l10n/app_it.arb | 1 - lib/l10n/app_ja.arb | 1 - lib/l10n/app_ko.arb | 3 +-- lib/l10n/app_nl.arb | 1 - lib/l10n/app_pt.arb | 3 +-- lib/l10n/app_ru.arb | 1 - lib/l10n/app_tr.arb | 1 - lib/l10n/app_zh.arb | 1 - lib/widgets/about/app_ref.dart | 6 +++--- 15 files changed, 5 insertions(+), 19 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 4d7abfcab..8a10fd97e 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -307,7 +307,6 @@ "appPickDialogNone": "Nichts", "aboutPageTitle": "Über", - "aboutLinkSources": "Quellen", "aboutLinkLicense": "Lizenz", "aboutLinkPolicy": "Datenschutzrichtlinie", diff --git a/lib/l10n/app_el.arb b/lib/l10n/app_el.arb index a9d77008e..d212e8f7c 100644 --- a/lib/l10n/app_el.arb +++ b/lib/l10n/app_el.arb @@ -307,7 +307,6 @@ "appPickDialogNone": "Καμία επιλογή", "aboutPageTitle": "Διαφορα", - "aboutLinkSources": "Πηγές", "aboutLinkLicense": "Άδειες", "aboutLinkPolicy": "Πολιτική Απορρήτου", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 13901991d..24e1a4a56 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -437,7 +437,6 @@ "appPickDialogNone": "None", "aboutPageTitle": "About", - "aboutLinkSources": "Sources", "aboutLinkLicense": "License", "aboutLinkPolicy": "Privacy Policy", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 936e600f3..1a348e6fb 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -295,7 +295,6 @@ "appPickDialogNone": "Ninguna", "aboutPageTitle": "Acerca de", - "aboutLinkSources": "Fuentes", "aboutLinkLicense": "Licencia", "aboutLinkPolicy": "Política de privacidad", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 4e397da56..391229e97 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -307,7 +307,6 @@ "appPickDialogNone": "Aucune", "aboutPageTitle": "À propos", - "aboutLinkSources": "Sources", "aboutLinkLicense": "Licence", "aboutLinkPolicy": "Politique de confidentialité", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 9f8c92407..b68eb8d60 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -300,7 +300,6 @@ "appPickDialogNone": "Tidak ada", "aboutPageTitle": "Tentang", - "aboutLinkSources": "Sumber", "aboutLinkLicense": "Lisensi", "aboutLinkPolicy": "Aturan Privasi", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 1e68520d5..c0447d0d9 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -307,7 +307,6 @@ "appPickDialogNone": "Nessuna", "aboutPageTitle": "Informazioni", - "aboutLinkSources": "Sorgenti", "aboutLinkLicense": "Licenza", "aboutLinkPolicy": "Informativa sulla privacy", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 5304060f4..fb568bf75 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -295,7 +295,6 @@ "appPickDialogNone": "なし", "aboutPageTitle": "アプリについて", - "aboutLinkSources": "ソース", "aboutLinkLicense": "ライセンス", "aboutLinkPolicy": "プライバシー ポリシー", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 64dc52ed8..b311241e8 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -307,7 +307,6 @@ "appPickDialogNone": "없음", "aboutPageTitle": "앱 정보", - "aboutLinkSources": "소스 코드", "aboutLinkLicense": "라이선스", "aboutLinkPolicy": "개인정보 보호정책", @@ -315,7 +314,7 @@ "aboutBugSaveLogInstruction": "앱 로그를 파일에 저장하기", "aboutBugCopyInfoInstruction": "시스템 정보를 복사하기", "aboutBugCopyInfoButton": "복사", - "aboutBugReportInstruction": "로그와 시스템 정보를 첨부하여 깃허브에서 이슈를 제출하기", + "aboutBugReportInstruction": "로그와 시스템 정보를 첨부하여 GitHub에서 이슈를 제출하기", "aboutBugReportButton": "제출", "aboutCreditsSectionTitle": "크레딧", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 2433598cd..f92749657 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -307,7 +307,6 @@ "appPickDialogNone": "Geen", "aboutPageTitle": "Over", - "aboutLinkSources": "Bronnen", "aboutLinkLicense": "Licentie", "aboutLinkPolicy": "Privacy Policy", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index a13b8e424..7274b6c0a 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -307,7 +307,6 @@ "appPickDialogNone": "Nenhum", "aboutPageTitle": "Sobre", - "aboutLinkSources": "Fontes", "aboutLinkLicense": "Licença", "aboutLinkPolicy": "Política de Privacidade", @@ -452,7 +451,7 @@ "settingsPageTitle": "Configurações", "settingsSystemDefault": "Sistema", "settingsDefault": "Padrão", - "settingsDisabled": "Desativado", + "settingsDisabled": "Desativada", "settingsSearchFieldLabel": "Pesquisar configuração", "settingsSearchEmpty": "Nenhuma configuração correspondente", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index d82fbe696..fff690d5f 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -307,7 +307,6 @@ "appPickDialogNone": "Ничего", "aboutPageTitle": "О нас", - "aboutLinkSources": "Исходники", "aboutLinkLicense": "Лицензия", "aboutLinkPolicy": "Политика конфиденциальности", diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 51da7c382..8ef070f15 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -282,7 +282,6 @@ "appPickDialogNone": "Yok", "aboutPageTitle": "Hakkında", - "aboutLinkSources": "Kaynaklar", "aboutLinkLicense": "Lisans", "aboutLinkPolicy": "Gizlilik Politikası", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 234b46dfc..e4cb6b1f1 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -307,7 +307,6 @@ "appPickDialogNone": "无", "aboutPageTitle": "关于", - "aboutLinkSources": "源码", "aboutLinkLicense": "许可协议", "aboutLinkPolicy": "隐私政策", diff --git a/lib/widgets/about/app_ref.dart b/lib/widgets/about/app_ref.dart index e8ac7ef89..f9c05ac66 100644 --- a/lib/widgets/about/app_ref.dart +++ b/lib/widgets/about/app_ref.dart @@ -73,12 +73,12 @@ class _AppReferenceState extends State { spacing: 16, crossAxisAlignment: WrapCrossAlignment.center, children: [ - LinkChip( - leading: const Icon( + const LinkChip( + leading: Icon( AIcons.github, size: 24, ), - text: l10n.aboutLinkSources, + text: 'GitHub', urlString: Constants.avesGithub, ), LinkChip( From 59fe826e2431759fafc4d64a561bc98bef68502c Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Tue, 11 Oct 2022 18:30:23 +0200 Subject: [PATCH 02/53] #347 widget: option to open collection on tap --- CHANGELOG.md | 4 +++ lib/l10n/app_en.arb | 1 + lib/l10n/app_fr.arb | 1 + lib/l10n/app_ko.arb | 1 + lib/model/settings/enums/enums.dart | 2 +- .../settings/enums/widget_open_action.dart | 2 ++ lib/widgets/home_page.dart | 18 ++++++++--- untranslated.json | 32 +++++++++++++++++++ 8 files changed, 56 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0dea5d4bc..c1d9a060a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added + +- Widget: option to open collection on tap + ## [v1.7.1] - 2022-10-09 ### Added diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 24e1a4a56..63c3eb9d1 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -216,6 +216,7 @@ "wallpaperTargetHomeLock": "Home and lock screens", "widgetOpenPageHome": "Open home", + "widgetOpenPageCollection": "Open collection", "widgetOpenPageViewer": "Open viewer", "albumTierNew": "New", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 391229e97..33e4ec23b 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -176,6 +176,7 @@ "wallpaperTargetHomeLock": "Écrans accueil et verrouillage", "widgetOpenPageHome": "Ouvrir la page d’accueil", + "widgetOpenPageCollection": "Ouvrir la collection", "widgetOpenPageViewer": "Ouvrir la visionneuse", "albumTierNew": "Nouveaux", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index b311241e8..c67b589eb 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -176,6 +176,7 @@ "wallpaperTargetHomeLock": "홈 및 잠금화면", "widgetOpenPageHome": "홈 열기", + "widgetOpenPageCollection": "미디어 열기", "widgetOpenPageViewer": "뷰어 열기", "albumTierNew": "신규", diff --git a/lib/model/settings/enums/enums.dart b/lib/model/settings/enums/enums.dart index 79f4cc1e7..74868f0bf 100644 --- a/lib/model/settings/enums/enums.dart +++ b/lib/model/settings/enums/enums.dart @@ -32,6 +32,6 @@ enum VideoAutoPlayMode { disabled, playMuted, playWithSound } enum ViewerTransition { slide, parallax, fade, zoomIn, none } -enum WidgetOpenPage { home, viewer } +enum WidgetOpenPage { home, collection, viewer } enum WidgetShape { rrect, circle, heart } diff --git a/lib/model/settings/enums/widget_open_action.dart b/lib/model/settings/enums/widget_open_action.dart index 804b99b46..333be5fca 100644 --- a/lib/model/settings/enums/widget_open_action.dart +++ b/lib/model/settings/enums/widget_open_action.dart @@ -7,6 +7,8 @@ extension ExtraWidgetOpenPage on WidgetOpenPage { switch (this) { case WidgetOpenPage.home: return context.l10n.widgetOpenPageHome; + case WidgetOpenPage.collection: + return context.l10n.widgetOpenPageCollection; case WidgetOpenPage.viewer: return context.l10n.widgetOpenPageViewer; } diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index 0eee4039a..3f84fb4ca 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -106,6 +106,7 @@ class _HomePageState extends State { var appMode = AppMode.main; final intentData = widget.intentData ?? await IntentService.getIntentData(); final intentAction = intentData[intentDataKeyAction]; + _initialFilters = null; await androidFileUtils.init(); if (!{actionScreenSaver, actionSetWallpaper}.contains(intentAction) && settings.isInstalledAppAccessAllowed) { @@ -123,8 +124,15 @@ class _HomePageState extends State { // widget settings may be modified in a different process after channel setup await settings.reload(); final page = settings.getWidgetOpenPage(widgetId); - if (page == WidgetOpenPage.viewer) { - uri = settings.getWidgetUri(widgetId); + switch (page) { + case WidgetOpenPage.home: + break; + case WidgetOpenPage.collection: + _initialFilters = settings.getWidgetCollectionFilters(widgetId); + break; + case WidgetOpenPage.viewer: + uri = settings.getWidgetUri(widgetId); + break; } unawaited(WidgetService.update(widgetId)); } else { @@ -181,8 +189,10 @@ class _HomePageState extends State { _initialRouteName = extraRoute; } } - final extraFilters = intentData[intentDataKeyFilters]; - _initialFilters = extraFilters != null ? (extraFilters as List).cast().map(CollectionFilter.fromJson).whereNotNull().toSet() : null; + if (_initialFilters == null) { + final extraFilters = intentData[intentDataKeyFilters]; + _initialFilters = extraFilters != null ? (extraFilters as List).cast().map(CollectionFilter.fromJson).whereNotNull().toSet() : null; + } } context.read>().value = appMode; unawaited(reportService.setCustomKey('app_mode', appMode.toString())); diff --git a/untranslated.json b/untranslated.json index e034aad2b..e5aded61f 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,4 +1,12 @@ { + "de": [ + "widgetOpenPageCollection" + ], + + "el": [ + "widgetOpenPageCollection" + ], + "es": [ "chipActionFilterOut", "chipActionFilterIn", @@ -8,6 +16,7 @@ "filterRecentlyAddedLabel", "viewerTransitionNone", "widgetOpenPageHome", + "widgetOpenPageCollection", "widgetOpenPageViewer", "viewDialogReverseSortOrder", "tileLayoutMosaic", @@ -36,6 +45,7 @@ "chipActionFilterIn", "viewerTransitionNone", "widgetOpenPageHome", + "widgetOpenPageCollection", "widgetOpenPageViewer", "tileLayoutMosaic", "albumGroupType", @@ -47,6 +57,10 @@ "wallpaperUseScrollEffect" ], + "it": [ + "widgetOpenPageCollection" + ], + "ja": [ "chipActionFilterOut", "chipActionFilterIn", @@ -56,6 +70,7 @@ "filterRecentlyAddedLabel", "viewerTransitionNone", "widgetOpenPageHome", + "widgetOpenPageCollection", "widgetOpenPageViewer", "viewDialogReverseSortOrder", "tileLayoutMosaic", @@ -80,6 +95,18 @@ "wallpaperUseScrollEffect" ], + "nl": [ + "widgetOpenPageCollection" + ], + + "pt": [ + "widgetOpenPageCollection" + ], + + "ru": [ + "widgetOpenPageCollection" + ], + "tr": [ "chipActionFilterOut", "chipActionFilterIn", @@ -102,6 +129,7 @@ "wallpaperTargetLock", "wallpaperTargetHomeLock", "widgetOpenPageHome", + "widgetOpenPageCollection", "widgetOpenPageViewer", "menuActionSlideshow", "viewDialogReverseSortOrder", @@ -137,5 +165,9 @@ "viewerSetWallpaperButtonLabel", "viewerInfoLabelDescription", "wallpaperUseScrollEffect" + ], + + "zh": [ + "widgetOpenPageCollection" ] } From 71ff42997b8586a2e650f8c0afc5eba0389a33ae Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Wed, 19 Oct 2022 00:34:39 +0200 Subject: [PATCH 03/53] #105 mp4 metadata edit --- CHANGELOG.md | 1 + android/app/build.gradle | 34 +- .../aves/channel/calls/AppAdapterHandler.kt | 18 - .../aves/channel/calls/DebugHandler.kt | 31 ++ .../aves/channel/calls/MetadataEditHandler.kt | 10 +- .../channel/calls/MetadataFetchHandler.kt | 384 ++++++++++-------- .../thibault/aves/metadata/Metadata.kt | 11 +- .../thibault/aves/metadata/Mp4ParserHelper.kt | 202 +++++++++ .../thibault/aves/metadata/MultiPage.kt | 2 +- .../deckers/thibault/aves/metadata/XMP.kt | 57 ++- .../SafeMp4UuidBoxHandler.kt | 7 +- .../aves/model/provider/ImageProvider.kt | 223 +++++++--- .../deckers/thibault/aves/utils/MimeTypes.kt | 14 +- .../thibault/aves/utils/StorageUtils.kt | 36 +- android/build.gradle | 2 +- lib/model/entry.dart | 51 +-- lib/model/entry_metadata_edition.dart | 86 +++- lib/model/metadata/enums.dart | 29 ++ lib/model/metadata/fields.dart | 24 +- .../enums/display_refresh_rate_mode.dart | 2 +- lib/ref/mime_types.dart | 52 +++ lib/services/android_app_service.dart | 12 - lib/services/android_debug_service.dart | 12 + .../metadata/metadata_edit_service.dart | 29 +- .../metadata/metadata_fetch_service.dart | 2 +- lib/services/metadata/xmp.dart | 4 +- lib/utils/constants.dart | 127 +++--- lib/widgets/about/bug_report.dart | 3 +- lib/widgets/viewer/debug/metadata.dart | 30 +- .../viewer/info/metadata/xmp_ns/misc.dart | 8 +- .../lib/aves_services_platform.dart | 2 +- pubspec.lock | 130 +----- pubspec.yaml | 8 - 33 files changed, 1077 insertions(+), 566 deletions(-) create mode 100644 android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index c1d9a060a..75253c28a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. ### Added +- Collection / Info: edit MP4 metadata (date / location / title / description / rating / tags) - Widget: option to open collection on tap ## [v1.7.1] - 2022-10-09 diff --git a/android/app/build.gradle b/android/app/build.gradle index a26f23c51..3bfc8dff9 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -148,23 +148,43 @@ flutter { } repositories { - maven { url 'https://jitpack.io' } - maven { url 'https://s3.amazonaws.com/repo.commonsware.com' } + maven { + url 'https://jitpack.io' + content { + includeGroup "com.github.deckerst" + includeGroup "com.github.deckerst.mp4parser" + } + } + maven { + url 'https://s3.amazonaws.com/repo.commonsware.com' + content { + excludeGroupByRegex "com\\.github\\.deckerst.*" + } + } } dependencies { - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' + implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.exifinterface:exifinterface:1.3.4' implementation 'androidx.multidex:multidex:2.0.1' + implementation 'com.caverock:androidsvg-aar:1.4' implementation 'com.commonsware.cwac:document:0.5.0' implementation 'com.drewnoakes:metadata-extractor:2.18.0' - // forked, built by JitPack, cf https://jitpack.io/p/deckerst/Android-TiffBitmapFactory - implementation 'com.github.deckerst:Android-TiffBitmapFactory:876e53870a' - // forked, built by JitPack, cf https://jitpack.io/p/deckerst/pixymeta-android - implementation 'com.github.deckerst:pixymeta-android:706bd73d6e' implementation 'com.github.bumptech.glide:glide:4.14.2' + // SLF4J implementation for `mp4parser` + implementation 'org.slf4j:slf4j-simple:2.0.3' + + // forked, built by JitPack: + // - https://jitpack.io/p/deckerst/Android-TiffBitmapFactory + // - https://jitpack.io/p/deckerst/mp4parser + // - https://jitpack.io/p/deckerst/pixymeta-android + implementation 'com.github.deckerst:Android-TiffBitmapFactory:876e53870a' + implementation 'com.github.deckerst.mp4parser:isoparser:64b571fdfb' + implementation 'com.github.deckerst.mp4parser:muxer:64b571fdfb' + implementation 'com.github.deckerst:pixymeta-android:706bd73d6e' // huawei flavor only huaweiImplementation 'com.huawei.agconnect:agconnect-core:1.7.2.300' diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt index 5a9ea5ace..2ce5db3d5 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt @@ -50,7 +50,6 @@ class AppAdapterHandler(private val context: Context) : MethodCallHandler { when (call.method) { "getPackages" -> ioScope.launch { safe(call, result, ::getPackages) } "getAppIcon" -> ioScope.launch { safeSuspend(call, result, ::getAppIcon) } - "getAppInstaller" -> ioScope.launch { safe(call, result, ::getAppInstaller) } "copyToClipboard" -> ioScope.launch { safe(call, result, ::copyToClipboard) } "edit" -> safe(call, result, ::edit) "open" -> safe(call, result, ::open) @@ -187,23 +186,6 @@ class AppAdapterHandler(private val context: Context) : MethodCallHandler { } } - private fun getAppInstaller(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { - val packageName = context.packageName - val pm = context.packageManager - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - val info = pm.getInstallSourceInfo(packageName) - result.success(info.initiatingPackageName ?: info.installingPackageName) - } else { - @Suppress("deprecation") - result.success(pm.getInstallerPackageName(packageName)) - } - } catch (e: Exception) { - result.error("getAppInstaller-exception", "failed to get installer for packageName=$packageName", e.message) - return - } - } - private fun copyToClipboard(call: MethodCall, result: MethodChannel.Result) { val uri = call.argument("uri")?.let { Uri.parse(it) } val label = call.argument("label") diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt index e056cb3af..9135f9430 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt @@ -18,10 +18,12 @@ import deckers.thibault.aves.channel.calls.Coresult.Companion.safe import deckers.thibault.aves.metadata.ExifInterfaceHelper import deckers.thibault.aves.metadata.MediaMetadataRetrieverHelper import deckers.thibault.aves.metadata.Metadata +import deckers.thibault.aves.metadata.Mp4ParserHelper.dumpBoxes import deckers.thibault.aves.metadata.PixyMetaHelper import deckers.thibault.aves.metadata.metadataextractor.Helper import deckers.thibault.aves.model.FieldMap import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MimeTypes import deckers.thibault.aves.utils.MimeTypes.canReadWithExifInterface import deckers.thibault.aves.utils.MimeTypes.canReadWithMetadataExtractor import deckers.thibault.aves.utils.MimeTypes.canReadWithPixyMeta @@ -38,7 +40,9 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch import org.beyka.tiffbitmapfactory.TiffBitmapFactory +import org.mp4parser.IsoFile import java.io.IOException +import java.nio.channels.Channels class DebugHandler(private val context: Context) : MethodCallHandler { private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) @@ -60,6 +64,7 @@ class DebugHandler(private val context: Context) : MethodCallHandler { "getExifInterfaceMetadata" -> ioScope.launch { safe(call, result, ::getExifInterfaceMetadata) } "getMediaMetadataRetrieverMetadata" -> ioScope.launch { safe(call, result, ::getMediaMetadataRetrieverMetadata) } "getMetadataExtractorSummary" -> ioScope.launch { safe(call, result, ::getMetadataExtractorSummary) } + "getMp4ParserDump" -> ioScope.launch { safe(call, result, ::getMp4ParserDump) } "getPixyMetadata" -> ioScope.launch { safe(call, result, ::getPixyMetadata) } "getTiffStructure" -> ioScope.launch { safe(call, result, ::getTiffStructure) } else -> result.notImplemented() @@ -319,6 +324,32 @@ class DebugHandler(private val context: Context) : MethodCallHandler { result.success(metadataMap) } + private fun getMp4ParserDump(call: MethodCall, result: MethodChannel.Result) { + val mimeType = call.argument("mimeType") + val uri = call.argument("uri")?.let { Uri.parse(it) } + if (mimeType == null || uri == null) { + result.error("getMp4ParserDump-args", "missing arguments", null) + return + } + + val sb = StringBuilder() + if (mimeType == MimeTypes.MP4) { + try { + StorageUtils.openInputStream(context, uri)?.use { input -> + Channels.newChannel(input).use { channel -> + IsoFile(channel).use { isoFile -> + isoFile.dumpBoxes(sb) + } + } + } + } catch (e: Exception) { + result.error("getMp4ParserDump-exception", e.message, e.stackTraceToString()) + return + } + } + result.success(sb.toString()) + } + private fun getPixyMetadata(call: MethodCall, result: MethodChannel.Result) { val mimeType = call.argument("mimeType") val uri = call.argument("uri")?.let { Uri.parse(it) } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataEditHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataEditHandler.kt index bda1f0c97..df2c1c86e 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataEditHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataEditHandler.kt @@ -68,7 +68,7 @@ class MetadataEditHandler(private val contextWrapper: ContextWrapper) : MethodCa provider.editOrientation(contextWrapper, path, uri, mimeType, op, object : ImageOpCallback { override fun onSuccess(fields: FieldMap) = result.success(fields) - override fun onFailure(throwable: Throwable) = result.error("editOrientation-failure", "failed to change orientation for mimeType=$mimeType uri=$uri", throwable.message) + override fun onFailure(throwable: Throwable) = result.error("editOrientation-failure", "failed to change orientation for mimeType=$mimeType uri=$uri", throwable) }) } @@ -98,7 +98,7 @@ class MetadataEditHandler(private val contextWrapper: ContextWrapper) : MethodCa provider.editDate(contextWrapper, path, uri, mimeType, dateMillis, shiftMinutes, fields, object : ImageOpCallback { override fun onSuccess(fields: FieldMap) = result.success(fields) - override fun onFailure(throwable: Throwable) = result.error("editDate-failure", "failed to edit date for mimeType=$mimeType uri=$uri", throwable.message) + override fun onFailure(throwable: Throwable) = result.error("editDate-failure", "failed to edit date for mimeType=$mimeType uri=$uri", throwable) }) } @@ -127,7 +127,7 @@ class MetadataEditHandler(private val contextWrapper: ContextWrapper) : MethodCa provider.editMetadata(contextWrapper, path, uri, mimeType, metadata, autoCorrectTrailerOffset, callback = object : ImageOpCallback { override fun onSuccess(fields: FieldMap) = result.success(fields) - override fun onFailure(throwable: Throwable) = result.error("editMetadata-failure", "failed to edit metadata for mimeType=$mimeType uri=$uri", throwable.message) + override fun onFailure(throwable: Throwable) = result.error("editMetadata-failure", "failed to edit metadata for mimeType=$mimeType uri=$uri", throwable) }) } @@ -154,7 +154,7 @@ class MetadataEditHandler(private val contextWrapper: ContextWrapper) : MethodCa provider.removeTrailerVideo(contextWrapper, path, uri, mimeType, object : ImageOpCallback { override fun onSuccess(fields: FieldMap) = result.success(fields) - override fun onFailure(throwable: Throwable) = result.error("removeTrailerVideo-failure", "failed to remove trailer video for mimeType=$mimeType uri=$uri", throwable.message) + override fun onFailure(throwable: Throwable) = result.error("removeTrailerVideo-failure", "failed to remove trailer video for mimeType=$mimeType uri=$uri", throwable) }) } @@ -182,7 +182,7 @@ class MetadataEditHandler(private val contextWrapper: ContextWrapper) : MethodCa provider.removeMetadataTypes(contextWrapper, path, uri, mimeType, types.toSet(), object : ImageOpCallback { override fun onSuccess(fields: FieldMap) = result.success(fields) - override fun onFailure(throwable: Throwable) = result.error("removeTypes-failure", "failed to remove metadata for mimeType=$mimeType uri=$uri", throwable.message) + override fun onFailure(throwable: Throwable) = result.error("removeTypes-failure", "failed to remove metadata for mimeType=$mimeType uri=$uri", throwable) }) } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt index 7df4f8f25..0f053d2a4 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt @@ -126,6 +126,8 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { var foundXmp = false fun processXmp(xmpMeta: XMPMeta, dirMap: MutableMap) { + if (foundXmp) return + foundXmp = true try { for (prop in xmpMeta) { if (prop is XMPPropertyInfo) { @@ -148,14 +150,66 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { dirMap["schemaRegistryPrefixes"] = JSONObject(prefixes).toString() } + val mp4UuidDirCount = HashMap() + fun processMp4Uuid(dir: Mp4UuidBoxDirectory) { + var thisDirName: String + when (val uuid = dir.getString(Mp4UuidBoxDirectory.TAG_UUID)) { + GSpherical.SPHERICAL_VIDEO_V1_UUID -> { + val bytes = dir.getByteArray(Mp4UuidBoxDirectory.TAG_USER_DATA) + thisDirName = "Spherical Video" + metadataMap[thisDirName] = HashMap(GSpherical(bytes).describe()) + } + QuickTimeMetadata.PROF_UUID -> { + // redundant with info derived on the Dart side + } + QuickTimeMetadata.USMT_UUID -> { + val bytes = dir.getByteArray(Mp4UuidBoxDirectory.TAG_USER_DATA) + val blocks = QuickTimeMetadata.parseUuidUsmt(bytes) + if (blocks.isNotEmpty()) { + thisDirName = "QuickTime User Media" + val usmt = metadataMap[thisDirName] ?: HashMap() + metadataMap[thisDirName] = usmt + + blocks.forEach { + var key = it.type + var value = it.value + val language = it.language + + var i = 0 + while (usmt.containsKey(key)) { + key = it.type + " (${++i})" + } + if (language != "und") { + value += " ($language)" + } + usmt[key] = value + } + } + } + else -> { + val uuidPart = uuid.substringBefore('-') + thisDirName = "${dir.name} $uuidPart" + + val count = mp4UuidDirCount[uuidPart] ?: 0 + mp4UuidDirCount[uuidPart] = count + 1 + if (count > 0) { + thisDirName += " ($count)" + } + + val dirMap = metadataMap[thisDirName] ?: HashMap() + metadataMap[thisDirName] = dirMap + + dirMap.putAll(dir.tags.map { Pair(it.tagName, it.description) }) + } + } + } + if (canReadWithMetadataExtractor(mimeType)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> val metadata = Helper.safeRead(input) foundExif = metadata.directories.any { it is ExifDirectoryBase && it.tagCount > 0 } - foundXmp = metadata.directories.any { it is XmpDirectory && it.tagCount > 0 } - val uuidDirCount = HashMap() val dirByName = metadata.directories.filter { (it.tagCount > 0 || it.errorCount > 0) && it !is FileTypeDirectory @@ -177,157 +231,116 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { // directory name var thisDirName = baseDirName - if (dir is Mp4UuidBoxDirectory) { - val uuid = dir.getString(Mp4UuidBoxDirectory.TAG_UUID).substringBefore('-') - thisDirName += " $uuid" - - val count = uuidDirCount[uuid] ?: 0 - uuidDirCount[uuid] = count + 1 - if (count > 0) { - thisDirName += " ($count)" - } - } else if (sameNameDirCount > 1 && !allMetadataMergeableDirNames.contains(baseDirName)) { + if (sameNameDirCount > 1 && !allMetadataMergeableDirNames.contains(baseDirName)) { // optional count for multiple directories of the same type thisDirName = "$thisDirName[${dirIndex + 1}]" } - // optional parent to distinguish child directories of the same type dir.parent?.name?.let { thisDirName = "$it/$thisDirName" } var dirMap = metadataMap[thisDirName] ?: HashMap() - metadataMap[thisDirName] = dirMap + if (dir !is Mp4UuidBoxDirectory) { + metadataMap[thisDirName] = dirMap - // tags - val tags = dir.tags - when { - dir is ExifDirectoryBase -> { - when { - dir.containsGeoTiffTags() -> { - // split GeoTIFF tags in their own directory - val geoTiffDirMap = metadataMap[DIR_EXIF_GEOTIFF] ?: HashMap() - metadataMap[DIR_EXIF_GEOTIFF] = geoTiffDirMap - val byGeoTiff = tags.groupBy { ExifTags.isGeoTiffTag(it.tagType) } - byGeoTiff[true]?.flatMap { tag -> - when (tag.tagType) { - ExifGeoTiffTags.TAG_GEO_KEY_DIRECTORY -> { - val geoTiffTags = (dir as ExifIFD0Directory).extractGeoKeys(dir.getIntArray(tag.tagType)) - geoTiffTags.map { geoTag -> - val name = GeoTiffKeys.getTagName(geoTag.key) ?: "0x${geoTag.key.toString(16)}" - val value = geoTag.value - val description = if (value is DoubleArray) value.joinToString(" ") { doubleFormat.format(it) } else "$value" - Pair(name, description) + // tags + val tags = dir.tags + when { + dir is ExifDirectoryBase -> { + when { + dir.containsGeoTiffTags() -> { + // split GeoTIFF tags in their own directory + val geoTiffDirMap = metadataMap[DIR_EXIF_GEOTIFF] ?: HashMap() + metadataMap[DIR_EXIF_GEOTIFF] = geoTiffDirMap + val byGeoTiff = tags.groupBy { ExifTags.isGeoTiffTag(it.tagType) } + byGeoTiff[true]?.flatMap { tag -> + when (tag.tagType) { + ExifGeoTiffTags.TAG_GEO_KEY_DIRECTORY -> { + val geoTiffTags = (dir as ExifIFD0Directory).extractGeoKeys(dir.getIntArray(tag.tagType)) + geoTiffTags.map { geoTag -> + val name = GeoTiffKeys.getTagName(geoTag.key) ?: "0x${geoTag.key.toString(16)}" + val value = geoTag.value + val description = if (value is DoubleArray) value.joinToString(" ") { doubleFormat.format(it) } else "$value" + Pair(name, description) + } } + // skip `Geo double/ascii params`, as their content is split and presented through various GeoTIFF keys + ExifGeoTiffTags.TAG_GEO_DOUBLE_PARAMS, + ExifGeoTiffTags.TAG_GEO_ASCII_PARAMS -> ArrayList() + else -> listOf(exifTagMapper(tag)) } - // skip `Geo double/ascii params`, as their content is split and presented through various GeoTIFF keys - ExifGeoTiffTags.TAG_GEO_DOUBLE_PARAMS, - ExifGeoTiffTags.TAG_GEO_ASCII_PARAMS -> ArrayList() - else -> listOf(exifTagMapper(tag)) - } - }?.let { geoTiffDirMap.putAll(it) } - byGeoTiff[false]?.map { exifTagMapper(it) }?.let { dirMap.putAll(it) } + }?.let { geoTiffDirMap.putAll(it) } + byGeoTiff[false]?.map { exifTagMapper(it) }?.let { dirMap.putAll(it) } + } + mimeType == MimeTypes.DNG -> { + // split DNG tags in their own directory + val dngDirMap = metadataMap[DIR_DNG] ?: HashMap() + metadataMap[DIR_DNG] = dngDirMap + val byDng = tags.groupBy { ExifTags.isDngTag(it.tagType) } + byDng[true]?.map { exifTagMapper(it) }?.let { dngDirMap.putAll(it) } + byDng[false]?.map { exifTagMapper(it) }?.let { dirMap.putAll(it) } + } + else -> dirMap.putAll(tags.map { exifTagMapper(it) }) } - mimeType == MimeTypes.DNG -> { - // split DNG tags in their own directory - val dngDirMap = metadataMap[DIR_DNG] ?: HashMap() - metadataMap[DIR_DNG] = dngDirMap - val byDng = tags.groupBy { ExifTags.isDngTag(it.tagType) } - byDng[true]?.map { exifTagMapper(it) }?.let { dngDirMap.putAll(it) } - byDng[false]?.map { exifTagMapper(it) }?.let { dirMap.putAll(it) } - } - else -> dirMap.putAll(tags.map { exifTagMapper(it) }) } - } - dir.isPngTextDir() -> { - metadataMap.remove(thisDirName) - dirMap = metadataMap[DIR_PNG_TEXTUAL_DATA] ?: HashMap() - metadataMap[DIR_PNG_TEXTUAL_DATA] = dirMap + dir.isPngTextDir() -> { + metadataMap.remove(thisDirName) + dirMap = metadataMap[DIR_PNG_TEXTUAL_DATA] ?: HashMap() + metadataMap[DIR_PNG_TEXTUAL_DATA] = dirMap - for (tag in tags) { - val tagType = tag.tagType - if (tagType == PngDirectory.TAG_TEXTUAL_DATA) { - val pairs = dir.getObject(tagType) as List<*> - val textPairs = pairs.map { pair -> - val kv = pair as KeyValuePair - val key = kv.key - // `PNG-iTXt` uses UTF-8, contrary to `PNG-tEXt` and `PNG-zTXt` using Latin-1 / ISO-8859-1 - val charset = if (baseDirName == PNG_ITXT_DIR_NAME) { - @SuppressLint("ObsoleteSdkInt") - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - StandardCharsets.UTF_8 - } else { - Charset.forName("UTF-8") - } - } else { - kv.value.charset - } - val valueString = String(kv.value.bytes, charset) - val dirs = extractPngProfile(key, valueString) - if (dirs?.any() == true) { - dirs.forEach { profileDir -> - val profileDirName = "${dir.name}/${profileDir.name}" - val profileDirMap = metadataMap[profileDirName] ?: HashMap() - metadataMap[profileDirName] = profileDirMap - val profileTags = profileDir.tags - if (profileDir is ExifDirectoryBase) { - profileDirMap.putAll(profileTags.map { exifTagMapper(it) }) + for (tag in tags) { + val tagType = tag.tagType + if (tagType == PngDirectory.TAG_TEXTUAL_DATA) { + val pairs = dir.getObject(tagType) as List<*> + val textPairs = pairs.map { pair -> + val kv = pair as KeyValuePair + val key = kv.key + // `PNG-iTXt` uses UTF-8, contrary to `PNG-tEXt` and `PNG-zTXt` using Latin-1 / ISO-8859-1 + val charset = if (baseDirName == PNG_ITXT_DIR_NAME) { + @SuppressLint("ObsoleteSdkInt") + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + StandardCharsets.UTF_8 } else { - profileDirMap.putAll(profileTags.map { Pair(it.tagName, it.description) }) + Charset.forName("UTF-8") } + } else { + kv.value.charset + } + val valueString = String(kv.value.bytes, charset) + val dirs = extractPngProfile(key, valueString) + if (dirs?.any() == true) { + dirs.forEach { profileDir -> + val profileDirName = "${dir.name}/${profileDir.name}" + val profileDirMap = metadataMap[profileDirName] ?: HashMap() + metadataMap[profileDirName] = profileDirMap + val profileTags = profileDir.tags + if (profileDir is ExifDirectoryBase) { + profileDirMap.putAll(profileTags.map { exifTagMapper(it) }) + } else { + profileDirMap.putAll(profileTags.map { Pair(it.tagName, it.description) }) + } + } + null + } else { + Pair(key, valueString) } - null - } else { - Pair(key, valueString) } + dirMap.putAll(textPairs.filterNotNull()) + } else { + dirMap[tag.tagName] = tag.description } - dirMap.putAll(textPairs.filterNotNull()) - } else { - dirMap[tag.tagName] = tag.description } } + else -> dirMap.putAll(tags.map { Pair(it.tagName, it.description) }) } - else -> dirMap.putAll(tags.map { Pair(it.tagName, it.description) }) } - if (dir is XmpDirectory) { - processXmp(dir.xmpMeta, dirMap) - } + if (!isLargeMp4(mimeType, sizeBytes)) { + if (dir is Mp4UuidBoxDirectory) { + processMp4Uuid(dir) + } - if (dir is Mp4UuidBoxDirectory) { - when (dir.getString(Mp4UuidBoxDirectory.TAG_UUID)) { - GSpherical.SPHERICAL_VIDEO_V1_UUID -> { - val bytes = dir.getByteArray(Mp4UuidBoxDirectory.TAG_USER_DATA) - metadataMap["Spherical Video"] = HashMap(GSpherical(bytes).describe()) - metadataMap.remove(thisDirName) - } - QuickTimeMetadata.PROF_UUID -> { - // redundant with info derived on the Dart side - metadataMap.remove(thisDirName) - } - QuickTimeMetadata.USMT_UUID -> { - val bytes = dir.getByteArray(Mp4UuidBoxDirectory.TAG_USER_DATA) - val blocks = QuickTimeMetadata.parseUuidUsmt(bytes) - if (blocks.isNotEmpty()) { - metadataMap.remove(thisDirName) - thisDirName = "QuickTime User Media" - val usmt = metadataMap[thisDirName] ?: HashMap() - metadataMap[thisDirName] = usmt - - blocks.forEach { - var key = it.type - var value = it.value - val language = it.language - - var i = 0 - while (usmt.containsKey(key)) { - key = it.type + " (${++i})" - } - if (language != "und") { - value += " ($language)" - } - usmt[key] = value - } - } - } + if (dir is XmpDirectory) { + processXmp(dir.xmpMeta, dirMap) } } @@ -367,13 +380,25 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } } - XMP.checkHeic(context, uri, mimeType, foundXmp) { xmpMeta -> + fun fallbackProcessXmp(xmpMeta: XMPMeta) { val thisDirName = XmpDirectory().name val dirMap = metadataMap[thisDirName] ?: HashMap() metadataMap[thisDirName] = dirMap processXmp(xmpMeta, dirMap) } + XMP.checkHeic(context, mimeType, uri, foundXmp, ::fallbackProcessXmp) + if (isLargeMp4(mimeType, sizeBytes)) { + XMP.checkMp4(context, mimeType, uri) { dirs -> + for (dir in dirs.filterIsInstance()) { + fallbackProcessXmp(dir.xmpMeta) + } + for (dir in dirs.filterIsInstance()) { + processMp4Uuid(dir) + } + } + } + if (isVideo(mimeType)) { // this is used as fallback when the video metadata cannot be found on the Dart side // and to identify whether there is an accessible cover image @@ -447,9 +472,9 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } val metadataMap = HashMap() - getCatalogMetadataByMetadataExtractor(uri, mimeType, path, sizeBytes, metadataMap) + getCatalogMetadataByMetadataExtractor(mimeType, uri, path, sizeBytes, metadataMap) if (isVideo(mimeType) || isHeic(mimeType)) { - getMultimediaCatalogMetadataByMediaMetadataRetriever(uri, mimeType, metadataMap) + getMultimediaCatalogMetadataByMediaMetadataRetriever(mimeType, uri, metadataMap) } // report success even when empty @@ -457,8 +482,8 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } private fun getCatalogMetadataByMetadataExtractor( - uri: Uri, mimeType: String, + uri: Uri, path: String?, sizeBytes: Long?, metadataMap: HashMap, @@ -468,6 +493,8 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { var foundXmp = false fun processXmp(xmpMeta: XMPMeta) { + if (foundXmp) return + foundXmp = true try { if (xmpMeta.doesPropExist(XMP.DC_SUBJECT_PROP_NAME)) { val values = xmpMeta.getPropArrayItemValues(XMP.DC_SUBJECT_PROP_NAME) @@ -504,12 +531,18 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } } + fun processMp4Uuid(dir: Mp4UuidBoxDirectory) { + // identification of spherical video (aka 360° video) + if (dir.getString(Mp4UuidBoxDirectory.TAG_UUID) == GSpherical.SPHERICAL_VIDEO_V1_UUID) { + flags = flags or MASK_IS_360 + } + } + if (canReadWithMetadataExtractor(mimeType)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> val metadata = Helper.safeRead(input) foundExif = metadata.directories.any { it is ExifDirectoryBase && it.tagCount > 0 } - foundXmp = metadata.directories.any { it is XmpDirectory && it.tagCount > 0 } // File type for (dir in metadata.getDirectoriesOfType(FileTypeDirectory::class.java)) { @@ -565,16 +598,18 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } // XMP - metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach(::processXmp) + if (!isLargeMp4(mimeType, sizeBytes)) { + metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach(::processXmp) - // XMP fallback to IPTC - if (!metadataMap.containsKey(KEY_XMP_TITLE) || !metadataMap.containsKey(KEY_XMP_SUBJECTS)) { - for (dir in metadata.getDirectoriesOfType(IptcDirectory::class.java)) { - if (!metadataMap.containsKey(KEY_XMP_TITLE)) { - dir.getSafeString(IptcDirectory.TAG_OBJECT_NAME) { metadataMap[KEY_XMP_TITLE] = it } - } - if (!metadataMap.containsKey(KEY_XMP_SUBJECTS)) { - dir.keywords?.let { metadataMap[KEY_XMP_SUBJECTS] = it.joinToString(XMP_SUBJECTS_SEPARATOR) } + // XMP fallback to IPTC + if (!metadataMap.containsKey(KEY_XMP_TITLE) || !metadataMap.containsKey(KEY_XMP_SUBJECTS)) { + for (dir in metadata.getDirectoriesOfType(IptcDirectory::class.java)) { + if (!metadataMap.containsKey(KEY_XMP_TITLE)) { + dir.getSafeString(IptcDirectory.TAG_OBJECT_NAME) { metadataMap[KEY_XMP_TITLE] = it } + } + if (!metadataMap.containsKey(KEY_XMP_SUBJECTS)) { + dir.keywords?.let { metadataMap[KEY_XMP_SUBJECTS] = it.joinToString(XMP_SUBJECTS_SEPARATOR) } + } } } } @@ -620,12 +655,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } } - // identification of spherical video (aka 360° video) - if (metadata.getDirectoriesOfType(Mp4UuidBoxDirectory::class.java).any { - it.getString(Mp4UuidBoxDirectory.TAG_UUID) == GSpherical.SPHERICAL_VIDEO_V1_UUID - }) { - flags = flags or MASK_IS_360 - } + metadata.getDirectoriesOfType(Mp4UuidBoxDirectory::class.java).forEach(::processMp4Uuid) } } catch (e: Exception) { Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) @@ -662,7 +692,17 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } } - XMP.checkHeic(context, uri, mimeType, foundXmp, ::processXmp) + XMP.checkHeic(context, mimeType, uri, foundXmp, ::processXmp) + if (isLargeMp4(mimeType, sizeBytes)) { + XMP.checkMp4(context, mimeType, uri) { dirs -> + for (dir in dirs.filterIsInstance()) { + processXmp(dir.xmpMeta) + } + for (dir in dirs.filterIsInstance()) { + processMp4Uuid(dir) + } + } + } if (mimeType == MimeTypes.TIFF && MultiPage.isMultiPageTiff(context, uri)) flags = flags or MASK_IS_MULTIPAGE @@ -670,8 +710,8 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } private fun getMultimediaCatalogMetadataByMediaMetadataRetriever( - uri: Uri, mimeType: String, + uri: Uri, metadataMap: HashMap, ) { val retriever = StorageUtils.openMetadataRetriever(context, uri) ?: return @@ -862,10 +902,12 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { return } - var foundXmp = false val fields: FieldMap = hashMapOf() + var foundXmp = false fun processXmp(xmpMeta: XMPMeta) { + if (foundXmp) return + foundXmp = true try { xmpMeta.getSafeInt(XMP.GPANO_CROPPED_AREA_LEFT_PROP_NAME) { fields["croppedAreaLeft"] = it } xmpMeta.getSafeInt(XMP.GPANO_CROPPED_AREA_TOP_PROP_NAME) { fields["croppedAreaTop"] = it } @@ -879,11 +921,10 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } } - if (canReadWithMetadataExtractor(mimeType)) { + if (canReadWithMetadataExtractor(mimeType) && !isLargeMp4(mimeType, sizeBytes)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> val metadata = Helper.safeRead(input) - foundXmp = metadata.directories.any { it is XmpDirectory && it.tagCount > 0 } metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach(::processXmp) } } catch (e: Exception) { @@ -895,7 +936,14 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } } - XMP.checkHeic(context, uri, mimeType, foundXmp, ::processXmp) + XMP.checkHeic(context, mimeType, uri, foundXmp, ::processXmp) + if (isLargeMp4(mimeType, sizeBytes)) { + XMP.checkMp4(context, mimeType, uri) { dirs -> + for (dir in dirs.filterIsInstance()) { + processXmp(dir.xmpMeta) + } + } + } if (fields.isEmpty()) { result.error("getPanoramaInfo-empty", "failed to get info for mimeType=$mimeType uri=$uri", null) @@ -929,6 +977,8 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { result.success(null) } + // return XMP components + // return an empty list if there is no XMP private fun getXmp(call: MethodCall, result: MethodChannel.Result) { val mimeType = call.argument("mimeType") val uri = call.argument("uri")?.let { Uri.parse(it) } @@ -938,10 +988,12 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { return } - var foundXmp = false val xmpStrings = mutableListOf() + var foundXmp = false fun processXmp(xmpMeta: XMPMeta) { + if (foundXmp) return + foundXmp = true try { xmpStrings.add(XMPMetaFactory.serializeToString(xmpMeta, xmpSerializeOptions)) } catch (e: XMPException) { @@ -949,11 +1001,10 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } } - if (canReadWithMetadataExtractor(mimeType)) { + if (canReadWithMetadataExtractor(mimeType) && !isLargeMp4(mimeType, sizeBytes)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> val metadata = Helper.safeRead(input) - foundXmp = metadata.directories.any { it is XmpDirectory && it.tagCount > 0 } metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach(::processXmp) } } catch (e: Exception) { @@ -968,13 +1019,16 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } } - XMP.checkHeic(context, uri, mimeType, foundXmp, ::processXmp) - - if (xmpStrings.isEmpty()) { - result.success(null) - } else { - result.success(xmpStrings) + XMP.checkHeic(context, mimeType, uri, foundXmp, ::processXmp) + if (isLargeMp4(mimeType, sizeBytes)) { + XMP.checkMp4(context, mimeType, uri) { dirs -> + for (dir in dirs.filterIsInstance()) { + processXmp(dir.xmpMeta) + } + } } + + result.success(xmpStrings) } private fun hasContentResolverProp(call: MethodCall, result: MethodChannel.Result) { @@ -1161,6 +1215,8 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { omitXmpMetaElement = false // e.g. ... } + private fun isLargeMp4(mimeType: String, sizeBytes: Long?) = mimeType == MimeTypes.MP4 && Metadata.isDangerouslyLarge(sizeBytes) + private fun exifTagMapper(it: Tag): Pair { val name = if (it.hasTagName()) { it.tagName diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt index 635148196..8a2952972 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt @@ -42,6 +42,7 @@ object Metadata { const val TYPE_JFIF = "jfif" const val TYPE_JPEG_ADOBE = "jpeg_adobe" const val TYPE_JPEG_DUCKY = "jpeg_ducky" + const val TYPE_MP4 = "mp4" const val TYPE_PHOTOSHOP_IRB = "photoshop_irb" const val TYPE_XMP = "xmp" @@ -121,6 +122,8 @@ object Metadata { // It is not clear whether it is because of the file itself or its metadata. private const val fileSizeBytesMax = 100 * (1 shl 20) // MB + fun isDangerouslyLarge(sizeBytes: Long?) = sizeBytes == null || sizeBytes > fileSizeBytesMax + // we try and read metadata from large files by copying an arbitrary amount from its beginning // to a temporary file, and reusing that preview file for all metadata reading purposes private const val previewSize: Long = 5 * (1 shl 20) // MB @@ -134,10 +137,7 @@ object Metadata { MimeTypes.PSD_VND, MimeTypes.PSD_X, MimeTypes.TIFF -> { - if (sizeBytes != null && sizeBytes < fileSizeBytesMax) { - // small enough to be safe as it is - uri - } else { + if (isDangerouslyLarge(sizeBytes)) { // make a preview from the beginning of the file, // hoping the metadata is accessible in the copied chunk var previewFile = previewFiles[uri] @@ -146,6 +146,9 @@ object Metadata { previewFiles[uri] = previewFile } Uri.fromFile(previewFile) + } else { + // small enough to be safe as it is + uri } } // *probably* safe diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt new file mode 100644 index 000000000..21c7f0967 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt @@ -0,0 +1,202 @@ +package deckers.thibault.aves.metadata + +import android.content.Context +import android.net.Uri +import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.StorageUtils +import org.mp4parser.* +import org.mp4parser.boxes.UserBox +import org.mp4parser.boxes.apple.AppleGPSCoordinatesBox +import org.mp4parser.boxes.iso14496.part12.FreeBox +import org.mp4parser.boxes.iso14496.part12.MediaDataBox +import org.mp4parser.boxes.iso14496.part12.MovieBox +import org.mp4parser.boxes.iso14496.part12.UserDataBox +import org.mp4parser.support.AbstractBox +import org.mp4parser.tools.Path +import java.io.ByteArrayOutputStream +import java.io.FileInputStream +import java.nio.channels.Channels + +object Mp4ParserHelper { + private val LOG_TAG = LogUtils.createTag() + + fun updateLocation(isoFile: IsoFile, locationIso6709: String?) { + // Apple GPS Coordinates Box can be in various locations: + // - moov[0]/udta[0]/©xyz + // - moov[0]/meta[0]/ilst/©xyz + // - others? + isoFile.removeBoxes(AppleGPSCoordinatesBox::class.java, true) + + locationIso6709 ?: return + + val movieBox = isoFile.movieBox + var userDataBox = Path.getPath(movieBox, UserDataBox.TYPE) + if (userDataBox == null) { + userDataBox = UserDataBox() + movieBox.addBox(userDataBox) + } + + userDataBox.addBox(AppleGPSCoordinatesBox().apply { + value = locationIso6709 + }) + } + + fun updateXmp(isoFile: IsoFile, xmp: String?) { + val xmpBox = isoFile.xmpBox + if (xmp != null) { + val xmpData = xmp.toByteArray(Charsets.UTF_8) + if (xmpBox == null) { + isoFile.addBox(UserBox(XMP.mp4Uuid).apply { + data = xmpData + }) + } else { + xmpBox.data = xmpData + } + } else if (xmpBox != null) { + isoFile.removeBox(xmpBox) + } + } + + fun computeEdits(context: Context, uri: Uri, modifier: (isoFile: IsoFile) -> Unit): List> { + // we can skip uninteresting boxes with a seekable data source + val pfd = StorageUtils.openInputFileDescriptor(context, uri) ?: throw Exception("failed to open file descriptor for uri=$uri") + pfd.use { + FileInputStream(it.fileDescriptor).use { stream -> + stream.channel.use { channel -> + val boxParser = PropertyBoxParserImpl().apply { + skippingBoxes(MediaDataBox.TYPE) + } + // creating `IsoFile` with a `File` or a `File.inputStream()` yields `No such device` + IsoFile(channel, boxParser).use { isoFile -> + val lastContentBox = isoFile.boxes.reversed().firstOrNull { box -> + when { + box == isoFile.movieBox -> false + testXmpBox(box) -> false + box is FreeBox -> false + else -> true + } + } + lastContentBox ?: throw Exception("failed to find last context box") + val oldFileSize = isoFile.size + var appendOffset = (isoFile.getBoxOffset { box -> box == lastContentBox })!! + lastContentBox.size + + val edits = arrayListOf>() + fun addFreeBoxEdit(offset: Long, size: Long) = edits.add(Pair(offset, FreeBox(size.toInt() - 8).toBytes())) + + // replace existing movie box by a free box + isoFile.getBoxOffset { box -> box.type == MovieBox.TYPE }?.let { offset -> + addFreeBoxEdit(offset, isoFile.movieBox.size) + } + + // replace existing XMP box by a free box + isoFile.getBoxOffset { box -> testXmpBox(box) }?.let { offset -> + addFreeBoxEdit(offset, isoFile.xmpBox!!.size) + } + + modifier(isoFile) + + // write edited movie box + val movieBoxBytes = isoFile.movieBox.toBytes() + edits.removeAll { (offset, _) -> offset == appendOffset } + edits.add(Pair(appendOffset, movieBoxBytes)) + appendOffset += movieBoxBytes.size + + // write edited XMP box + isoFile.xmpBox?.let { box -> + edits.removeAll { (offset, _) -> offset == appendOffset } + edits.add(Pair(appendOffset, box.toBytes())) + appendOffset += box.size + } + + // write trailing free box instead of truncating + val trailing = oldFileSize - appendOffset + if (trailing > 0) { + addFreeBoxEdit(appendOffset, trailing) + } + + return edits + } + } + } + } + } + + // according to XMP Specification Part 3 - Storage in Files, + // XMP is embedded in MPEG-4 files using a top-level UUID box + private fun testXmpBox(box: Box): Boolean { + if (box is UserBox) { + if (!box.isParsed) { + box.parseDetails() + } + return box.userType.contentEquals(XMP.mp4Uuid) + } + return false + } + + // extensions + + private fun IsoFile.getBoxOffset(test: (box: Box) -> Boolean): Long? { + var offset = 0L + for (box in boxes) { + if (test(box)) { + return offset + } + offset += box.size + } + return null + } + + private val IsoFile.xmpBox: UserBox? + get() = boxes.firstOrNull { testXmpBox(it) } as UserBox? + + fun Container.processBoxes(clazz: Class, recursive: Boolean, apply: (box: T, parent: Container) -> Unit) { + // use a copy, in case box processing removes boxes + for (box in ArrayList(boxes)) { + if (clazz.isInstance(box)) { + @Suppress("unchecked_cast") + apply(box as T, this) + } + if (recursive && box is Container) { + box.processBoxes(clazz, true, apply) + } + } + } + + private fun Container.removeBoxes(clazz: Class, recursive: Boolean) { + processBoxes(clazz, recursive) { box, parent -> parent.removeBox(box) } + } + + private fun Container.removeBox(box: Box) { + boxes = boxes.apply { remove(box) } + } + + fun Container.dumpBoxes(sb: StringBuilder, indent: Int = 0) { + for (box in boxes) { + val boxType = box.type + try { + if (box is AbstractBox && !box.isParsed) { + box.parseDetails() + } + when (box) { + is BasicContainer -> { + sb.appendLine("${"\t".repeat(indent)}[$boxType] ${box.javaClass.simpleName}") + box.dumpBoxes(sb, indent + 1) + } + is UserBox -> { + val userTypeHex = box.userType.joinToString("") { "%02x".format(it) } + sb.appendLine("${"\t".repeat(indent)}[$boxType] userType=$userTypeHex $box") + } + else -> sb.appendLine("${"\t".repeat(indent)}[$boxType] $box") + } + } catch (e: Exception) { + sb.appendLine("${"\t".repeat(indent)}failed to access box type=$boxType exception=${e.message}") + } + } + } + + fun Box.toBytes(): ByteArray { + val stream = ByteArrayOutputStream(size.toInt()) + Channels.newChannel(stream).use { getBox(it) } + return stream.toByteArray() + } +} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt index 8152ba065..711d62cad 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt @@ -204,7 +204,7 @@ object MultiPage { Log.w(LOG_TAG, "failed to get motion photo offset from uri=$uri", e) } - XMP.checkHeic(context, uri, mimeType, foundXmp, ::processXmp) + XMP.checkHeic(context, mimeType, uri, foundXmp, ::processXmp) return offsetFromEnd } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/XMP.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/XMP.kt index 24cb4ec40..55596ed03 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/XMP.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/XMP.kt @@ -10,16 +10,28 @@ import com.adobe.internal.xmp.XMPException import com.adobe.internal.xmp.XMPMeta import com.adobe.internal.xmp.XMPMetaFactory import com.adobe.internal.xmp.properties.XMPProperty +import com.drew.metadata.Directory +import deckers.thibault.aves.metadata.Mp4ParserHelper.processBoxes +import deckers.thibault.aves.metadata.Mp4ParserHelper.toBytes +import deckers.thibault.aves.metadata.metadataextractor.SafeMp4UuidBoxHandler import deckers.thibault.aves.metadata.metadataextractor.SafeXmpReader import deckers.thibault.aves.utils.ContextUtils.queryContentResolverProp import deckers.thibault.aves.utils.LogUtils import deckers.thibault.aves.utils.MimeTypes import deckers.thibault.aves.utils.StorageUtils +import org.mp4parser.IsoFile +import org.mp4parser.PropertyBoxParserImpl +import org.mp4parser.boxes.UserBox +import org.mp4parser.boxes.iso14496.part12.MediaDataBox +import java.io.FileInputStream import java.util.* object XMP { private val LOG_TAG = LogUtils.createTag() + // BE7ACFCB 97A942E8 9C719994 91E3AFAC / BE7ACFCB-97A9-42E8-9C71-999491E3AFAC + val mp4Uuid = byteArrayOf(0xbe.toByte(), 0x7a, 0xcf.toByte(), 0xcb.toByte(), 0x97.toByte(), 0xa9.toByte(), 0x42, 0xe8.toByte(), 0x9c.toByte(), 0x71, 0x99.toByte(), 0x94.toByte(), 0x91.toByte(), 0xe3.toByte(), 0xaf.toByte(), 0xac.toByte()) + // standard namespaces // cf com.adobe.internal.xmp.XMPConst private const val DC_NS_URI = "http://purl.org/dc/elements/1.1/" @@ -94,7 +106,13 @@ object XMP { // as of `metadata-extractor` v2.18.0, XMP is not discovered in HEIC images, // so we fall back to the native content resolver, if possible - fun checkHeic(context: Context, uri: Uri, mimeType: String, foundXmp: Boolean, processXmp: (xmpMeta: XMPMeta) -> Unit) { + fun checkHeic( + context: Context, + mimeType: String, + uri: Uri, + foundXmp: Boolean, + processXmp: (xmpMeta: XMPMeta) -> Unit, + ) { if (MimeTypes.isHeic(mimeType) && !foundXmp && StorageUtils.isMediaStoreContentUri(uri) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { try { val xmpBytes = context.queryContentResolverProp(uri, mimeType, MediaStore.MediaColumns.XMP) @@ -108,6 +126,43 @@ object XMP { } } + // as of `metadata-extractor` v2.18.0, processing large MP4 files may crash, + // so we fall back to parsing with `mp4parser` + fun checkMp4( + context: Context, + mimeType: String, + uri: Uri, + processDirs: (dirs: List<Directory>) -> Unit, + ) { + if (mimeType != MimeTypes.MP4) return + try { + // we can skip uninteresting boxes with a seekable data source + val pfd = StorageUtils.openInputFileDescriptor(context, uri) ?: throw Exception("failed to open file descriptor for uri=$uri") + pfd.use { + FileInputStream(it.fileDescriptor).use { stream -> + stream.channel.use { channel -> + val boxParser = PropertyBoxParserImpl().apply { + skippingBoxes(MediaDataBox.TYPE) + } + // creating `IsoFile` with a `File` or a `File.inputStream()` yields `No such device` + IsoFile(channel, boxParser).use { isoFile -> + isoFile.processBoxes(UserBox::class.java, true) { box, _ -> + val bytes = box.toBytes() + val payload = bytes.copyOfRange(8, bytes.size) + + val metadata = com.drew.metadata.Metadata() + SafeMp4UuidBoxHandler(metadata).processBox("", payload, -1, null) + processDirs(metadata.directories.filter { dir -> dir.tagCount > 0 }.toList()) + } + } + } + } + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to get XMP by MP4 parser for mimeType=$mimeType uri=$uri", e) + } + } + // extensions fun XMPMeta.isMotionPhoto(): Boolean { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4UuidBoxHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4UuidBoxHandler.kt index 35f3e0914..d052d9ff1 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4UuidBoxHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeMp4UuidBoxHandler.kt @@ -4,20 +4,17 @@ import com.drew.imaging.mp4.Mp4Handler import com.drew.metadata.Metadata import com.drew.metadata.mp4.Mp4Context import com.drew.metadata.mp4.media.Mp4UuidBoxHandler +import deckers.thibault.aves.metadata.XMP class SafeMp4UuidBoxHandler(metadata: Metadata) : Mp4UuidBoxHandler(metadata) { override fun processBox(type: String?, payload: ByteArray?, boxSize: Long, context: Mp4Context?): Mp4Handler<*> { if (payload != null && payload.size >= 16) { val payloadUuid = payload.copyOfRange(0, 16) - if (payloadUuid.contentEquals(xmpUuid)) { + if (payloadUuid.contentEquals(XMP.mp4Uuid)) { SafeXmpReader().extract(payload, 16, payload.size - 16, metadata, directory) return this } } return super.processBox(type, payload, boxSize, context) } - - companion object { - val xmpUuid = byteArrayOf(0xbe.toByte(), 0x7a, 0xcf.toByte(), 0xcb.toByte(), 0x97.toByte(), 0xa9.toByte(), 0x42, 0xe8.toByte(), 0x9c.toByte(), 0x71, 0x99.toByte(), 0x94.toByte(), 0x91.toByte(), 0xe3.toByte(), 0xaf.toByte(), 0xac.toByte()) - } } \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt index 3503afe89..5a62d29e6 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt @@ -22,6 +22,10 @@ import deckers.thibault.aves.decoder.SvgImage import deckers.thibault.aves.decoder.TiffImage import deckers.thibault.aves.metadata.* import deckers.thibault.aves.metadata.ExifInterfaceHelper.getSafeDateMillis +import deckers.thibault.aves.metadata.Metadata.TYPE_EXIF +import deckers.thibault.aves.metadata.Metadata.TYPE_IPTC +import deckers.thibault.aves.metadata.Metadata.TYPE_MP4 +import deckers.thibault.aves.metadata.Metadata.TYPE_XMP import deckers.thibault.aves.metadata.PixyMetaHelper.extendedXmpDocString import deckers.thibault.aves.metadata.PixyMetaHelper.xmpDocString import deckers.thibault.aves.model.AvesEntry @@ -37,10 +41,8 @@ import deckers.thibault.aves.utils.MimeTypes.canEditXmp import deckers.thibault.aves.utils.MimeTypes.canRemoveMetadata import deckers.thibault.aves.utils.MimeTypes.extensionFor import deckers.thibault.aves.utils.MimeTypes.isVideo -import java.io.ByteArrayInputStream -import java.io.File -import java.io.IOException -import java.io.OutputStream +import java.io.* +import java.nio.channels.Channels import java.util.* abstract class ImageProvider { @@ -350,6 +352,7 @@ abstract class ImageProvider { // copy the edited temporary file back to the original DocumentFileCompat.fromFile(editableFile).copyTo(targetDocFile) + editableFile.delete() } val fileName = targetDocFile.name @@ -457,11 +460,12 @@ abstract class ImageProvider { } // copy the edited temporary file back to the original - copyFileTo(context, mimeType, sourceFile = editableFile, targetUri = uri, targetPath = path) + editableFile.transferTo(outputStream(context, mimeType, uri, path)) if (autoCorrectTrailerOffset && !checkTrailerOffset(context, path, uri, mimeType, videoSize, editableFile, callback)) { return false } + editableFile.delete() } catch (e: IOException) { callback.onFailure(e) return false @@ -524,7 +528,7 @@ abstract class ImageProvider { iptc != null -> PixyMetaHelper.setIptc(input, output, iptc) canRemoveMetadata(mimeType) -> - PixyMetaHelper.removeMetadata(input, output, setOf(Metadata.TYPE_IPTC)) + PixyMetaHelper.removeMetadata(input, output, setOf(TYPE_IPTC)) else -> { Log.w(LOG_TAG, "setting empty IPTC for mimeType=$mimeType") PixyMetaHelper.setIptc(input, output, null) @@ -539,11 +543,12 @@ abstract class ImageProvider { } // copy the edited temporary file back to the original - copyFileTo(context, mimeType, sourceFile = editableFile, targetUri = uri, targetPath = path) + editableFile.transferTo(outputStream(context, mimeType, uri, path)) if (autoCorrectTrailerOffset && !checkTrailerOffset(context, path, uri, mimeType, videoSize, editableFile, callback)) { return false } + editableFile.delete() } catch (e: IOException) { callback.onFailure(e) return false @@ -552,6 +557,60 @@ abstract class ImageProvider { return true } + private fun editMp4Metadata( + context: Context, + path: String, + uri: Uri, + mimeType: String, + callback: ImageOpCallback, + fields: Map<*, *> + ): Boolean { + if (mimeType != MimeTypes.MP4) { + callback.onFailure(UnsupportedOperationException("unsupported mimeType=$mimeType")) + return false + } + + try { + val edits = Mp4ParserHelper.computeEdits(context, uri) { isoFile -> + fields.forEach { kv -> + val tag = kv.key as String + val value = kv.value as String? + when (tag) { + "gpsCoordinates" -> Mp4ParserHelper.updateLocation(isoFile, value) + "xmp" -> Mp4ParserHelper.updateXmp(isoFile, value) + } + } + } + + val pfd = StorageUtils.openOutputFileDescriptor( + context = context, + mimeType = mimeType, + uri = uri, + path = path, + // do not truncate + mode = "w", + ) ?: throw Exception("failed to open file descriptor for uri=$uri path=$path") + pfd.use { + FileOutputStream(it.fileDescriptor).use { outputStream -> + outputStream.channel.use { outputChannel -> + edits.forEach { (offset, bytes) -> + bytes.inputStream().use { inputStream -> + Channels.newChannel(inputStream).use { inputChannel -> + outputChannel.transferFrom(inputChannel, offset, bytes.size.toLong()) + } + } + } + } + } + } + } catch (e: Exception) { + callback.onFailure(e) + return false + } + + return true + } + // provide `editCoreXmp` to modify existing core XMP, // or provide `coreXmp` and `extendedXmp` to set them private fun editXmp( @@ -571,41 +630,31 @@ abstract class ImageProvider { return false } + if (mimeType == MimeTypes.MP4) { + return editMp4Metadata( + context = context, + path = path, + uri = uri, + mimeType = mimeType, + callback = callback, + fields = mapOf("xmp" to coreXmp), + ) + } + val originalFileSize = File(path).length() val videoSize = MultiPage.getMotionPhotoOffset(context, uri, mimeType, originalFileSize)?.let { it.toInt() + trailerDiff } val editableFile = File.createTempFile("aves", null).apply { deleteOnExit() try { - var editedXmpString = coreXmp - var editedExtendedXmp = extendedXmp - if (editCoreXmp != null) { - val pixyXmp = StorageUtils.openInputStream(context, uri)?.use { input -> PixyMetaHelper.getXmp(input) } - if (pixyXmp != null) { - editedXmpString = editCoreXmp(pixyXmp.xmpDocString()) - if (pixyXmp.hasExtendedXmp()) { - editedExtendedXmp = pixyXmp.extendedXmpDocString() - } - } - } - - outputStream().use { output -> - // reopen input to read from start - StorageUtils.openInputStream(context, uri)?.use { input -> - if (editedXmpString != null) { - if (editedExtendedXmp != null && mimeType != MimeTypes.JPEG) { - Log.w(LOG_TAG, "extended XMP is not supported by mimeType=$mimeType") - PixyMetaHelper.setXmp(input, output, editedXmpString, null) - } else { - PixyMetaHelper.setXmp(input, output, editedXmpString, editedExtendedXmp) - } - } else if (canRemoveMetadata(mimeType)) { - PixyMetaHelper.removeMetadata(input, output, setOf(Metadata.TYPE_XMP)) - } else { - Log.w(LOG_TAG, "setting empty XMP for mimeType=$mimeType") - PixyMetaHelper.setXmp(input, output, null, null) - } - } - } + editXmpWithPixy( + context = context, + uri = uri, + mimeType = mimeType, + coreXmp = coreXmp, + extendedXmp = extendedXmp, + editCoreXmp = editCoreXmp, + editableFile = this + ) } catch (e: Exception) { callback.onFailure(e) return false @@ -614,11 +663,12 @@ abstract class ImageProvider { try { // copy the edited temporary file back to the original - copyFileTo(context, mimeType, sourceFile = editableFile, targetUri = uri, targetPath = path) + editableFile.transferTo(outputStream(context, mimeType, uri, path)) if (autoCorrectTrailerOffset && !checkTrailerOffset(context, path, uri, mimeType, videoSize, editableFile, callback)) { return false } + editableFile.delete() } catch (e: IOException) { callback.onFailure(e) return false @@ -627,6 +677,47 @@ abstract class ImageProvider { return true } + private fun editXmpWithPixy( + context: Context, + uri: Uri, + mimeType: String, + coreXmp: String?, + extendedXmp: String?, + editCoreXmp: ((xmp: String) -> String)?, + editableFile: File + ) { + var editedXmpString = coreXmp + var editedExtendedXmp = extendedXmp + if (editCoreXmp != null) { + val pixyXmp = StorageUtils.openInputStream(context, uri)?.use { input -> PixyMetaHelper.getXmp(input) } + if (pixyXmp != null) { + editedXmpString = editCoreXmp(pixyXmp.xmpDocString()) + if (pixyXmp.hasExtendedXmp()) { + editedExtendedXmp = pixyXmp.extendedXmpDocString() + } + } + } + + editableFile.outputStream().use { output -> + // reopen input to read from start + StorageUtils.openInputStream(context, uri)?.use { input -> + if (editedXmpString != null) { + if (editedExtendedXmp != null && mimeType != MimeTypes.JPEG) { + Log.w(LOG_TAG, "extended XMP is not supported by mimeType=$mimeType") + PixyMetaHelper.setXmp(input, output, editedXmpString, null) + } else { + PixyMetaHelper.setXmp(input, output, editedXmpString, editedExtendedXmp) + } + } else if (canRemoveMetadata(mimeType)) { + PixyMetaHelper.removeMetadata(input, output, setOf(TYPE_XMP)) + } else { + Log.w(LOG_TAG, "setting empty XMP for mimeType=$mimeType") + PixyMetaHelper.setXmp(input, output, null, null) + } + } + } + } + // A few bytes are sometimes appended when writing to a document output stream. // In that case, we need to adjust the trailer video offset accordingly and rewrite the file. // returns whether the file at `path` is fine @@ -807,8 +898,8 @@ abstract class ImageProvider { autoCorrectTrailerOffset: Boolean, callback: ImageOpCallback, ) { - if (modifier.containsKey("exif")) { - val fields = modifier["exif"] as Map<*, *>? + if (modifier.containsKey(TYPE_EXIF)) { + val fields = modifier[TYPE_EXIF] as Map<*, *>? if (fields != null && fields.isNotEmpty()) { if (!editExif( context = context, @@ -825,7 +916,7 @@ abstract class ImageProvider { val value = kv.value if (value == null) { // remove attribute - exif.setAttribute(tag, value) + exif.setAttribute(tag, null) } else { when (tag) { ExifInterface.TAG_GPS_LATITUDE, @@ -864,8 +955,8 @@ abstract class ImageProvider { } } - if (modifier.containsKey("iptc")) { - val iptc = (modifier["iptc"] as List<*>?)?.filterIsInstance<FieldMap>() + if (modifier.containsKey(TYPE_IPTC)) { + val iptc = (modifier[TYPE_IPTC] as List<*>?)?.filterIsInstance<FieldMap>() if (!editIptc( context = context, path = path, @@ -878,8 +969,23 @@ abstract class ImageProvider { ) return } - if (modifier.containsKey("xmp")) { - val xmp = modifier["xmp"] as Map<*, *>? + if (modifier.containsKey(TYPE_MP4)) { + val fields = modifier[TYPE_MP4] as Map<*, *>? + if (fields != null && fields.isNotEmpty()) { + if (!editMp4Metadata( + context = context, + path = path, + uri = uri, + mimeType = mimeType, + callback = callback, + fields = fields, + ) + ) return + } + } + + if (modifier.containsKey(TYPE_XMP)) { + val xmp = modifier[TYPE_XMP] as Map<*, *>? if (xmp != null) { val coreXmp = xmp["xmp"] as String? val extendedXmp = xmp["extendedXmp"] as String? @@ -930,7 +1036,8 @@ abstract class ImageProvider { try { // copy the edited temporary file back to the original - copyFileTo(context, mimeType, sourceFile = editableFile, targetUri = uri, targetPath = path) + editableFile.transferTo(outputStream(context, mimeType, uri, path)) + editableFile.delete() } catch (e: IOException) { callback.onFailure(e) return @@ -973,11 +1080,12 @@ abstract class ImageProvider { try { // copy the edited temporary file back to the original - copyFileTo(context, mimeType, sourceFile = editableFile, targetUri = uri, targetPath = path) + editableFile.transferTo(outputStream(context, mimeType, uri, path)) - if (!types.contains(Metadata.TYPE_XMP) && !checkTrailerOffset(context, path, uri, mimeType, videoSize, editableFile, callback)) { + if (!types.contains(TYPE_XMP) && !checkTrailerOffset(context, path, uri, mimeType, videoSize, editableFile, callback)) { return } + editableFile.delete() } catch (e: IOException) { callback.onFailure(e) return @@ -987,21 +1095,20 @@ abstract class ImageProvider { scanPostMetadataEdit(context, path, uri, mimeType, newFields, callback) } - private fun copyFileTo( + private fun outputStream( context: Context, mimeType: String, - sourceFile: File, - targetUri: Uri, - targetPath: String - ) { + uri: Uri, + path: String + ): OutputStream { // truncate is necessary when overwriting a longer file - val targetStream = if (isMediaUriPermissionGranted(context, targetUri, mimeType)) { - StorageUtils.openOutputStream(context, targetUri, mimeType, "wt") ?: throw Exception("failed to open output stream for uri=$targetUri") + val mode = "wt" + return if (isMediaUriPermissionGranted(context, uri, mimeType)) { + StorageUtils.openOutputStream(context, mimeType, uri, mode) ?: throw Exception("failed to open output stream for uri=$uri") } else { - val documentUri = StorageUtils.getDocumentFile(context, targetPath, targetUri)?.uri ?: throw Exception("failed to get document file for path=$targetPath, uri=$targetUri") - context.contentResolver.openOutputStream(documentUri, "wt") ?: throw Exception("failed to open output stream from documentUri=$documentUri for path=$targetPath, uri=$targetUri") + val documentUri = StorageUtils.getDocumentFile(context, path, uri)?.uri ?: throw Exception("failed to get document file for path=$path, uri=$uri") + context.contentResolver.openOutputStream(documentUri, mode) ?: throw Exception("failed to open output stream from documentUri=$documentUri for path=$path, uri=$uri") } - sourceFile.transferTo(targetStream) } interface ImageOpCallback { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt index 6f7cf280e..af0e471c2 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt @@ -104,28 +104,28 @@ object MimeTypes { else -> false } - // as of androidx.exifinterface:exifinterface:1.3.4 fun canEditExif(mimeType: String) = when (mimeType) { - JPEG, - PNG, - WEBP -> true + // as of androidx.exifinterface:exifinterface:1.3.4 + JPEG, PNG, WEBP -> true else -> false } - // as of latest PixyMeta fun canEditIptc(mimeType: String) = when (mimeType) { + // as of latest PixyMeta JPEG, TIFF -> true else -> false } - // as of latest PixyMeta fun canEditXmp(mimeType: String) = when (mimeType) { + // as of latest PixyMeta JPEG, TIFF, PNG, GIF -> true + // using `mp4parser` + MP4 -> true else -> false } - // as of latest PixyMeta fun canRemoveMetadata(mimeType: String) = when (mimeType) { + // as of latest PixyMeta JPEG, TIFF -> true else -> false } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt index db1bd8e80..078fda691 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/StorageUtils.kt @@ -10,6 +10,7 @@ import android.media.MediaMetadataRetriever import android.net.Uri import android.os.Build import android.os.Environment +import android.os.ParcelFileDescriptor import android.os.storage.StorageManager import android.provider.DocumentsContract import android.provider.MediaStore @@ -17,6 +18,7 @@ import android.text.TextUtils import android.util.Log import androidx.annotation.RequiresApi import com.commonsware.cwac.document.DocumentFileCompat +import deckers.thibault.aves.model.provider.ImageProvider import deckers.thibault.aves.utils.FileUtils.transferFrom import deckers.thibault.aves.utils.MimeTypes.isImage import deckers.thibault.aves.utils.MimeTypes.isVideo @@ -580,19 +582,47 @@ object StorageUtils { } catch (e: Exception) { // among various other exceptions, // opening a file marked pending and owned by another package throws an `IllegalStateException` - Log.w(LOG_TAG, "failed to open input stream for uri=$uri effectiveUri=$effectiveUri", e) + Log.w(LOG_TAG, "failed to open input stream from effectiveUri=$effectiveUri for uri=$uri", e) null } } - fun openOutputStream(context: Context, uri: Uri, mimeType: String, mode: String): OutputStream? { + fun openOutputStream(context: Context, mimeType: String, uri: Uri, mode: String): OutputStream? { val effectiveUri = getMediaStoreScopedStorageSafeUri(uri, mimeType) return try { context.contentResolver.openOutputStream(effectiveUri, mode) } catch (e: Exception) { // among various other exceptions, // opening a file marked pending and owned by another package throws an `IllegalStateException` - Log.w(LOG_TAG, "failed to open output stream for uri=$uri effectiveUri=$effectiveUri mode=$mode", e) + Log.w(LOG_TAG, "failed to open output stream from effectiveUri=$effectiveUri for uri=$uri mode=$mode", e) + null + } + } + + fun openInputFileDescriptor(context: Context, uri: Uri): ParcelFileDescriptor? { + val effectiveUri = getOriginalUri(context, uri) + return try { + context.contentResolver.openFileDescriptor(effectiveUri, "r") + } catch (e: Exception) { + // among various other exceptions, + // opening a file marked pending and owned by another package throws an `IllegalStateException` + Log.w(LOG_TAG, "failed to open input file descriptor from effectiveUri=$effectiveUri for uri=$uri", e) + null + } + } + + fun openOutputFileDescriptor(context: Context, mimeType: String, uri: Uri, path: String, mode: String): ParcelFileDescriptor? { + val effectiveUri = if (ImageProvider.isMediaUriPermissionGranted(context, uri, mimeType)) { + getMediaStoreScopedStorageSafeUri(uri, mimeType) + } else { + getDocumentFile(context, path, uri)?.uri ?: throw Exception("failed to get document file for path=$path, uri=$uri") + } + return try { + context.contentResolver.openFileDescriptor(effectiveUri, mode) + } catch (e: Exception) { + // among various other exceptions, + // opening a file marked pending and owned by another package throws an `IllegalStateException` + Log.w(LOG_TAG, "failed to open output file descriptor from effectiveUri=$effectiveUri for uri=$uri path=$path", e) null } } diff --git a/android/build.gradle b/android/build.gradle index 42c5dc7f7..eddb482b6 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -7,7 +7,7 @@ buildscript { maven { url 'https://developer.huawei.com/repo/' } } dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' + classpath 'com.android.tools.build:gradle:7.3.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // GMS & Firebase Crashlytics (used by some flavors only) classpath 'com.google.gms:google-services:4.3.14' diff --git a/lib/model/entry.dart b/lib/model/entry.dart index a057462b0..3ee822edd 100644 --- a/lib/model/entry.dart +++ b/lib/model/entry.dart @@ -284,7 +284,7 @@ class AvesEntry { bool get canEditDate => canEdit && (canEditExif || canEditXmp); - bool get canEditLocation => canEdit && canEditExif; + bool get canEditLocation => canEdit && (canEditExif || mimeType == MimeTypes.mp4); bool get canEditTitleDescription => canEdit && canEditXmp; @@ -294,54 +294,13 @@ class AvesEntry { bool get canRotateAndFlip => canEdit && canEditExif; - // `exifinterface` v1.3.3 declared support for DNG, but it strips non-standard Exif tags when saving attributes, - // and DNG requires DNG-specific tags saved along standard Exif. So it was actually breaking DNG files. - // as of androidx.exifinterface:exifinterface:1.3.4 - bool get canEditExif { - switch (mimeType.toLowerCase()) { - case MimeTypes.jpeg: - case MimeTypes.png: - case MimeTypes.webp: - return true; - default: - return false; - } - } + bool get canEditExif => MimeTypes.canEditExif(mimeType); - // as of latest PixyMeta - bool get canEditIptc { - switch (mimeType.toLowerCase()) { - case MimeTypes.jpeg: - case MimeTypes.tiff: - return true; - default: - return false; - } - } + bool get canEditIptc => MimeTypes.canEditIptc(mimeType); - // as of latest PixyMeta - bool get canEditXmp { - switch (mimeType.toLowerCase()) { - case MimeTypes.gif: - case MimeTypes.jpeg: - case MimeTypes.png: - case MimeTypes.tiff: - return true; - default: - return false; - } - } + bool get canEditXmp => MimeTypes.canEditXmp(mimeType); - // as of latest PixyMeta - bool get canRemoveMetadata { - switch (mimeType.toLowerCase()) { - case MimeTypes.jpeg: - case MimeTypes.tiff: - return true; - default: - return false; - } - } + bool get canRemoveMetadata => MimeTypes.canRemoveMetadata(mimeType); // Media Store size/rotation is inaccurate, e.g. a portrait FHD video is rotated according to its metadata, // so it should be registered as width=1920, height=1080, orientation=90, diff --git a/lib/model/entry_metadata_edition.dart b/lib/model/entry_metadata_edition.dart index 7692ef761..9593add22 100644 --- a/lib/model/entry_metadata_edition.dart +++ b/lib/model/entry_metadata_edition.dart @@ -7,11 +7,13 @@ import 'package:aves/model/metadata/enums.dart'; import 'package:aves/model/metadata/fields.dart'; import 'package:aves/ref/exif.dart'; import 'package:aves/ref/iptc.dart'; +import 'package:aves/ref/mime_types.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/services/metadata/xmp.dart'; import 'package:aves/utils/time_utils.dart'; import 'package:aves/utils/xmp_utils.dart'; import 'package:flutter/foundation.dart'; +import 'package:intl/intl.dart'; import 'package:latlong2/latlong.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:xml/xml.dart'; @@ -82,28 +84,63 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { Future<Set<EntryDataType>> editLocation(LatLng? latLng) async { final Set<EntryDataType> dataTypes = {}; + final Map<MetadataType, dynamic> metadata = {}; - await _missingDateCheckAndExifEdit(dataTypes); + final missingDate = await _missingDateCheckAndExifEdit(dataTypes); - // clear every GPS field - final exifFields = Map<MetadataField, dynamic>.fromEntries(MetadataFields.exifGpsFields.map((k) => MapEntry(k, null))); - // add latitude & longitude, if any - if (latLng != null) { - final latitude = latLng.latitude; - final longitude = latLng.longitude; - if (latitude != 0 && longitude != 0) { - exifFields.addAll({ - MetadataField.exifGpsLatitude: latitude.abs(), - MetadataField.exifGpsLatitudeRef: latitude >= 0 ? Exif.latitudeNorth : Exif.latitudeSouth, - MetadataField.exifGpsLongitude: longitude.abs(), - MetadataField.exifGpsLongitudeRef: longitude >= 0 ? Exif.longitudeEast : Exif.longitudeWest, + if (canEditExif) { + // clear every GPS field + final exifFields = Map<MetadataField, dynamic>.fromEntries(MetadataFields.exifGpsFields.map((k) => MapEntry(k, null))); + // add latitude & longitude, if any + if (latLng != null) { + final latitude = latLng.latitude; + final longitude = latLng.longitude; + if (latitude != 0 && longitude != 0) { + exifFields.addAll({ + MetadataField.exifGpsLatitude: latitude.abs(), + MetadataField.exifGpsLatitudeRef: latitude >= 0 ? Exif.latitudeNorth : Exif.latitudeSouth, + MetadataField.exifGpsLongitude: longitude.abs(), + MetadataField.exifGpsLongitudeRef: longitude >= 0 ? Exif.longitudeEast : Exif.longitudeWest, + }); + } + } + metadata[MetadataType.exif] = Map<String, dynamic>.fromEntries(exifFields.entries.map((kv) => MapEntry(kv.key.toPlatform!, kv.value))); + + if (canEditXmp && missingDate != null) { + metadata[MetadataType.xmp] = await _editXmp((descriptions) { + editCreateDateXmp(descriptions, missingDate); + return true; }); } } - final metadata = { - MetadataType.exif: Map<String, dynamic>.fromEntries(exifFields.entries.map((kv) => MapEntry(kv.key.exifInterfaceTag!, kv.value))), - }; + if (mimeType == MimeTypes.mp4) { + final mp4Fields = <MetadataField, String?>{}; + + String? iso6709String; + if (latLng != null) { + final latitude = latLng.latitude; + final longitude = latLng.longitude; + if (latitude != 0 && longitude != 0) { + const locale = 'en_US'; + final isoLat = '${latitude >= 0 ? '+' : '-'}${NumberFormat('00.0000', locale).format(latitude.abs())}'; + final isoLon = '${longitude >= 0 ? '+' : '-'}${NumberFormat('000.0000', locale).format(longitude.abs())}'; + iso6709String = '$isoLat$isoLon/'; + } + } + mp4Fields[MetadataField.mp4GpsCoordinates] = iso6709String; + + if (missingDate != null) { + final xmpParts = await _editXmp((descriptions) { + editCreateDateXmp(descriptions, missingDate); + return true; + }); + mp4Fields[MetadataField.mp4Xmp] = xmpParts[xmpCoreKey]; + } + + metadata[MetadataType.mp4] = Map<String, String?>.fromEntries(mp4Fields.entries.map((kv) => MapEntry(kv.key.toPlatform!, kv.value))); + } + final newFields = await metadataEditService.editMetadata(this, metadata); if (newFields.isNotEmpty) { dataTypes.addAll({ @@ -160,7 +197,7 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { final description = fields[DescriptionField.description]; if (canEditExif && editDescription) { - metadata[MetadataType.exif] = {MetadataField.exifImageDescription.exifInterfaceTag!: description}; + metadata[MetadataType.exif] = {MetadataField.exifImageDescription.toPlatform!: description}; } if (canEditIptc) { @@ -480,10 +517,17 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { } } + static const xmpCoreKey = 'xmp'; + static const xmpExtendedKey = 'extendedXmp'; + Future<Map<String, String?>> _editXmp(bool Function(List<XmlNode> descriptions) apply) async { final xmp = await metadataFetchService.getXmp(this); - final xmpString = xmp?.xmpString; - final extendedXmpString = xmp?.extendedXmpString; + if (xmp == null) { + throw Exception('failed to get XMP'); + } + + final xmpString = xmp.xmpString; + final extendedXmpString = xmp.extendedXmpString; final editedXmpString = await XMP.edit( xmpString, @@ -493,8 +537,8 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { final editedXmp = AvesXmp(xmpString: editedXmpString, extendedXmpString: extendedXmpString); return { - 'xmp': editedXmp.xmpString, - 'extendedXmp': editedXmp.extendedXmpString, + xmpCoreKey: editedXmp.xmpString, + xmpExtendedKey: editedXmp.extendedXmpString, }; } } diff --git a/lib/model/metadata/enums.dart b/lib/model/metadata/enums.dart index e35f8c743..dead66e4f 100644 --- a/lib/model/metadata/enums.dart +++ b/lib/model/metadata/enums.dart @@ -32,6 +32,8 @@ enum MetadataType { jpegAdobe, // JPEG APP12 / Ducky: https://www.exiftool.org/TagNames/APP12.html#Ducky jpegDucky, + // ISO User Data box content, etc. + mp4, // Photoshop IRB: https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ photoshopIrb, // XMP: https://en.wikipedia.org/wiki/Extensible_Metadata_Platform @@ -78,12 +80,39 @@ extension ExtraMetadataType on MetadataType { return 'Adobe JPEG'; case MetadataType.jpegDucky: return 'Ducky'; + case MetadataType.mp4: + return 'MP4'; case MetadataType.photoshopIrb: return 'Photoshop'; case MetadataType.xmp: return 'XMP'; } } + + String get toPlatform { + switch (this) { + case MetadataType.comment: + return 'comment'; + case MetadataType.exif: + return 'exif'; + case MetadataType.iccProfile: + return 'icc_profile'; + case MetadataType.iptc: + return 'iptc'; + case MetadataType.jfif: + return 'jfif'; + case MetadataType.jpegAdobe: + return 'jpeg_adobe'; + case MetadataType.jpegDucky: + return 'jpeg_ducky'; + case MetadataType.mp4: + return 'mp4'; + case MetadataType.photoshopIrb: + return 'photoshop_irb'; + case MetadataType.xmp: + return 'xmp'; + } + } } extension ExtraDateFieldSource on DateFieldSource { diff --git a/lib/model/metadata/fields.dart b/lib/model/metadata/fields.dart index 1d5b54c4c..8628717e9 100644 --- a/lib/model/metadata/fields.dart +++ b/lib/model/metadata/fields.dart @@ -37,6 +37,8 @@ enum MetadataField { exifGpsTrackRef, exifGpsVersionId, exifImageDescription, + mp4GpsCoordinates, + mp4Xmp, xmpXmpCreateDate, } @@ -117,12 +119,30 @@ extension ExtraMetadataField on MetadataField { case MetadataField.exifGpsVersionId: case MetadataField.exifImageDescription: return MetadataType.exif; + case MetadataField.mp4GpsCoordinates: + case MetadataField.mp4Xmp: + return MetadataType.mp4; case MetadataField.xmpXmpCreateDate: return MetadataType.xmp; } } - String? get exifInterfaceTag { + String? get toPlatform { + if (type == MetadataType.exif) { + return _toExifInterfaceTag(); + } else { + switch (this) { + case MetadataField.mp4GpsCoordinates: + return 'gpsCoordinates'; + case MetadataField.mp4Xmp: + return 'xmp'; + default: + return null; + } + } + } + + String? _toExifInterfaceTag() { switch (this) { case MetadataField.exifDate: return 'DateTime'; @@ -196,7 +216,7 @@ extension ExtraMetadataField on MetadataField { return 'GPSVersionID'; case MetadataField.exifImageDescription: return 'ImageDescription'; - case MetadataField.xmpXmpCreateDate: + default: return null; } } diff --git a/lib/model/settings/enums/display_refresh_rate_mode.dart b/lib/model/settings/enums/display_refresh_rate_mode.dart index 050c37ffd..37c1d76f2 100644 --- a/lib/model/settings/enums/display_refresh_rate_mode.dart +++ b/lib/model/settings/enums/display_refresh_rate_mode.dart @@ -22,7 +22,7 @@ extension ExtraDisplayRefreshRateMode on DisplayRefreshRateMode { if (!await windowService.isActivity()) return; final androidInfo = await DeviceInfoPlugin().androidInfo; - if ((androidInfo.version.sdkInt ?? 0) < 23) return; + if (androidInfo.version.sdkInt < 23) return; debugPrint('Apply display refresh rate: $name'); switch (this) { diff --git a/lib/ref/mime_types.dart b/lib/ref/mime_types.dart index 669f59327..ef07f9959 100644 --- a/lib/ref/mime_types.dart +++ b/lib/ref/mime_types.dart @@ -136,4 +136,56 @@ class MimeTypes { } return null; } + + // `exifinterface` v1.3.3 declared support for DNG, but it strips non-standard Exif tags when saving attributes, + // and DNG requires DNG-specific tags saved along standard Exif. So it was actually breaking DNG files. + static bool canEditExif(String mimeType) { + switch (mimeType.toLowerCase()) { + // as of androidx.exifinterface:exifinterface:1.3.4 + case jpeg: + case png: + case webp: + return true; + default: + return false; + } + } + + static bool canEditIptc(String mimeType) { + switch (mimeType.toLowerCase()) { + // as of latest PixyMeta + case jpeg: + case tiff: + return true; + default: + return false; + } + } + + static bool canEditXmp(String mimeType) { + switch (mimeType.toLowerCase()) { + // as of latest PixyMeta + case gif: + case jpeg: + case png: + case tiff: + return true; + // using `mp4parser` + case mp4: + return true; + default: + return false; + } + } + + static bool canRemoveMetadata(String mimeType) { + switch (mimeType.toLowerCase()) { + // as of latest PixyMeta + case jpeg: + case tiff: + return true; + default: + return false; + } + } } diff --git a/lib/services/android_app_service.dart b/lib/services/android_app_service.dart index e9fbbade8..ee55f8dca 100644 --- a/lib/services/android_app_service.dart +++ b/lib/services/android_app_service.dart @@ -12,8 +12,6 @@ abstract class AndroidAppService { Future<Uint8List> getAppIcon(String packageName, double size); - Future<String?> getAppInstaller(); - Future<bool> copyToClipboard(String uri, String? label); Future<bool> edit(String uri, String mimeType); @@ -73,16 +71,6 @@ class PlatformAndroidAppService implements AndroidAppService { return Uint8List(0); } - @override - Future<String?> getAppInstaller() async { - try { - return await _platform.invokeMethod('getAppInstaller'); - } on PlatformException catch (e, stack) { - await reportService.recordError(e, stack); - } - return null; - } - @override Future<bool> copyToClipboard(String uri, String? label) async { try { diff --git a/lib/services/android_debug_service.dart b/lib/services/android_debug_service.dart index f657470fc..29d2b8627 100644 --- a/lib/services/android_debug_service.dart +++ b/lib/services/android_debug_service.dart @@ -146,6 +146,18 @@ class AndroidDebugService { return {}; } + static Future<String?> getMp4ParserDump(AvesEntry entry) async { + try { + return await _platform.invokeMethod('getMp4ParserDump', <String, dynamic>{ + 'mimeType': entry.mimeType, + 'uri': entry.uri, + }); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return null; + } + static Future<Map> getPixyMetadata(AvesEntry entry) async { try { // returns map with all data available from the `PixyMeta` library diff --git a/lib/services/metadata/metadata_edit_service.dart b/lib/services/metadata/metadata_edit_service.dart index 448c60bca..1ab75766b 100644 --- a/lib/services/metadata/metadata_edit_service.dart +++ b/lib/services/metadata/metadata_edit_service.dart @@ -65,7 +65,7 @@ class PlatformMetadataEditService implements MetadataEditService { 'entry': entry.toPlatformEntryMap(), 'dateMillis': modifier.setDateTime?.millisecondsSinceEpoch, 'shiftMinutes': modifier.shiftMinutes, - 'fields': modifier.fields.where((v) => v.type == MetadataType.exif).map((v) => v.exifInterfaceTag).whereNotNull().toList(), + 'fields': modifier.fields.where((v) => v.type == MetadataType.exif).map((v) => v.toPlatform).whereNotNull().toList(), }); if (result != null) return (result as Map).cast<String, dynamic>(); } on PlatformException catch (e, stack) { @@ -85,7 +85,7 @@ class PlatformMetadataEditService implements MetadataEditService { try { final result = await _platform.invokeMethod('editMetadata', <String, dynamic>{ 'entry': entry.toPlatformEntryMap(), - 'metadata': metadata.map((type, value) => MapEntry(_toPlatformMetadataType(type), value)), + 'metadata': metadata.map((type, value) => MapEntry(type.toPlatform, value)), 'autoCorrectTrailerOffset': autoCorrectTrailerOffset, }); if (result != null) return (result as Map).cast<String, dynamic>(); @@ -117,7 +117,7 @@ class PlatformMetadataEditService implements MetadataEditService { try { final result = await _platform.invokeMethod('removeTypes', <String, dynamic>{ 'entry': entry.toPlatformEntryMap(), - 'types': types.map(_toPlatformMetadataType).toList(), + 'types': types.map((v) => v.toPlatform).toList(), }); if (result != null) return (result as Map).cast<String, dynamic>(); } on PlatformException catch (e, stack) { @@ -127,27 +127,4 @@ class PlatformMetadataEditService implements MetadataEditService { } return {}; } - - String _toPlatformMetadataType(MetadataType type) { - switch (type) { - case MetadataType.comment: - return 'comment'; - case MetadataType.exif: - return 'exif'; - case MetadataType.iccProfile: - return 'icc_profile'; - case MetadataType.iptc: - return 'iptc'; - case MetadataType.jfif: - return 'jfif'; - case MetadataType.jpegAdobe: - return 'jpeg_adobe'; - case MetadataType.jpegDucky: - return 'jpeg_ducky'; - case MetadataType.photoshopIrb: - return 'photoshop_irb'; - case MetadataType.xmp: - return 'xmp'; - } - } } diff --git a/lib/services/metadata/metadata_fetch_service.dart b/lib/services/metadata/metadata_fetch_service.dart index 041d41383..56907877c 100644 --- a/lib/services/metadata/metadata_fetch_service.dart +++ b/lib/services/metadata/metadata_fetch_service.dart @@ -259,7 +259,7 @@ class PlatformMetadataFetchService implements MetadataFetchService { 'mimeType': entry.mimeType, 'uri': entry.uri, 'sizeBytes': entry.sizeBytes, - 'field': field.exifInterfaceTag, + 'field': field.toPlatform, }); if (result is int) { return dateTimeFromMillis(result, isUtc: false); diff --git a/lib/services/metadata/xmp.dart b/lib/services/metadata/xmp.dart index a6be54191..e56adec46 100644 --- a/lib/services/metadata/xmp.dart +++ b/lib/services/metadata/xmp.dart @@ -15,10 +15,10 @@ class AvesXmp extends Equatable { this.extendedXmpString, }); - static AvesXmp? fromList(List<String> xmpStrings) { + static AvesXmp fromList(List<String> xmpStrings) { switch (xmpStrings.length) { case 0: - return null; + return const AvesXmp(xmpString: null); case 1: return AvesXmp(xmpString: xmpStrings.single); default: diff --git a/lib/utils/constants.dart b/lib/utils/constants.dart index 3d11b7beb..d1ccb2b34 100644 --- a/lib/utils/constants.dart +++ b/lib/utils/constants.dart @@ -68,48 +68,59 @@ class Constants { static const String avesGithub = 'https://github.com/deckerst/aves'; + static const String apache2 = 'Apache License 2.0'; + static const String bsd2 = 'BSD 2-Clause "Simplified" License'; + static const String bsd3 = 'BSD 3-Clause "Revised" License'; + static const String eclipse1 = 'Eclipse Public License 1.0'; + static const String mit = 'MIT License'; + static const List<Dependency> androidDependencies = [ Dependency( name: 'AndroidX Core-KTX', - license: 'Apache 2.0', + license: apache2, licenseUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/LICENSE.txt', sourceUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/core/core-ktx', ), Dependency( name: 'AndroidX Exifinterface', - license: 'Apache 2.0', + license: apache2, licenseUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/LICENSE.txt', sourceUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/exifinterface/exifinterface', ), Dependency( name: 'AndroidSVG', - license: 'Apache 2.0', + license: apache2, sourceUrl: 'https://github.com/BigBadaboom/androidsvg', ), Dependency( name: 'Android-TiffBitmapFactory (Aves fork)', - license: 'MIT', + license: mit, licenseUrl: 'https://github.com/deckerst/Android-TiffBitmapFactory/blob/master/license.txt', sourceUrl: 'https://github.com/deckerst/Android-TiffBitmapFactory', ), Dependency( name: 'CWAC-Document', - license: 'Apache 2.0', + license: apache2, sourceUrl: 'https://github.com/commonsguy/cwac-document', ), Dependency( name: 'Glide', - license: 'Apache 2.0, BSD 2-Clause', + license: '$apache2, $bsd2', sourceUrl: 'https://github.com/bumptech/glide', ), Dependency( name: 'Metadata Extractor', - license: 'Apache 2.0', + license: apache2, sourceUrl: 'https://github.com/drewnoakes/metadata-extractor', ), + Dependency( + name: 'MP4 Parser (Aves fork)', + license: apache2, + sourceUrl: 'https://github.com/deckerst/mp4parser', + ), Dependency( name: 'PixyMeta Android (Aves fork)', - license: 'Eclipse Public License 1.0', + license: eclipse1, sourceUrl: 'https://github.com/deckerst/pixymeta-android', ), ]; @@ -117,71 +128,71 @@ class Constants { static const List<Dependency> _flutterPluginsCommon = [ Dependency( name: 'Connectivity Plus', - license: 'BSD 3-Clause', + license: bsd3, licenseUrl: 'https://github.com/fluttercommunity/plus_plugins/blob/main/packages/connectivity_plus/connectivity_plus/LICENSE', sourceUrl: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/connectivity_plus', ), Dependency( name: 'Device Info Plus', - license: 'BSD 3-Clause', + license: bsd3, licenseUrl: 'https://github.com/fluttercommunity/plus_plugins/blob/main/packages/device_info_plus/device_info_plus/LICENSE', sourceUrl: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/device_info_plus', ), Dependency( name: 'Dynamic Color', - license: 'BSD 3-Clause', + license: bsd3, sourceUrl: 'https://github.com/material-foundation/material-dynamic-color-flutter', ), Dependency( name: 'fijkplayer (Aves fork)', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/deckerst/fijkplayer', ), Dependency( name: 'Flutter Display Mode', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/ajinasokan/flutter_displaymode', ), Dependency( name: 'Package Info Plus', - license: 'BSD 3-Clause', + license: bsd3, licenseUrl: 'https://github.com/fluttercommunity/plus_plugins/blob/main/packages/package_info_plus/package_info_plus/LICENSE', sourceUrl: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus', ), Dependency( name: 'Permission Handler', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/Baseflow/flutter-permission-handler', ), Dependency( name: 'Printing', - license: 'Apache 2.0', + license: apache2, sourceUrl: 'https://github.com/DavBfr/dart_pdf', ), Dependency( name: 'Screen Brightness', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/aaassseee/screen_brightness', ), Dependency( name: 'Shared Preferences', - license: 'BSD 3-Clause', + license: bsd3, licenseUrl: 'https://github.com/flutter/plugins/blob/master/packages/shared_preferences/shared_preferences/LICENSE', sourceUrl: 'https://github.com/flutter/plugins/tree/master/packages/shared_preferences/shared_preferences', ), Dependency( name: 'sqflite', - license: 'BSD 2-Clause', + license: bsd2, sourceUrl: 'https://github.com/tekartik/sqflite', ), Dependency( name: 'Streams Channel (Aves fork)', - license: 'Apache 2.0', + license: apache2, sourceUrl: 'https://github.com/deckerst/aves_streams_channel', ), Dependency( name: 'URL Launcher', - license: 'BSD 3-Clause', + license: bsd3, licenseUrl: 'https://github.com/flutter/plugins/blob/master/packages/url_launcher/url_launcher/LICENSE', sourceUrl: 'https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher', ), @@ -190,12 +201,12 @@ class Constants { static const List<Dependency> _googleMobileServices = [ Dependency( name: 'Google API Availability', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/Baseflow/flutter-google-api-availability', ), Dependency( name: 'Google Maps for Flutter', - license: 'BSD 3-Clause', + license: bsd3, licenseUrl: 'https://github.com/flutter/plugins/blob/master/packages/google_maps_flutter/google_maps_flutter/LICENSE', sourceUrl: 'https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter/google_maps_flutter', ), @@ -204,7 +215,7 @@ class Constants { static const List<Dependency> _huaweiMobileServices = [ Dependency( name: 'Huawei Mobile Services (Availability, Map)', - license: 'Apache 2.0', + license: apache2, licenseUrl: 'https://github.com/HMS-Core/hms-flutter-plugin/blob/master/LICENCE', sourceUrl: 'https://github.com/HMS-Core/hms-flutter-plugin', ), @@ -222,7 +233,7 @@ class Constants { ..._googleMobileServices, Dependency( name: 'FlutterFire (Core, Crashlytics)', - license: 'BSD 3-Clause', + license: bsd3, sourceUrl: 'https://github.com/FirebaseExtended/flutterfire', ), ]; @@ -237,84 +248,84 @@ class Constants { static const List<Dependency> flutterPackages = [ Dependency( name: 'Charts', - license: 'Apache 2.0', + license: apache2, sourceUrl: 'https://github.com/google/charts', ), Dependency( name: 'Custom rounded rectangle border', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/lekanbar/custom_rounded_rectangle_border', ), Dependency( name: 'Decorated Icon', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/benPesso/flutter_decorated_icon', ), Dependency( name: 'Expansion Tile Card (Aves fork)', - license: 'BSD 3-Clause', + license: bsd3, sourceUrl: 'https://github.com/deckerst/expansion_tile_card', ), Dependency( name: 'FlexColorPicker', - license: 'BSD 3-Clause', + license: bsd3, sourceUrl: 'https://github.com/rydmike/flex_color_picker', ), Dependency( name: 'Flutter Highlight', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/git-touch/highlight', ), Dependency( name: 'Flutter Map', - license: 'BSD 3-Clause', + license: bsd3, sourceUrl: 'https://github.com/fleaflet/flutter_map', ), Dependency( name: 'Flutter Markdown', - license: 'BSD 3-Clause', + license: bsd3, licenseUrl: 'https://github.com/flutter/packages/blob/master/packages/flutter_markdown/LICENSE', sourceUrl: 'https://github.com/flutter/packages/tree/master/packages/flutter_markdown', ), Dependency( name: 'Flutter Staggered Animations', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/mobiten/flutter_staggered_animations', ), Dependency( name: 'Material Design Icons Flutter', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/ziofat/material_design_icons_flutter', ), Dependency( name: 'Overlay Support', - license: 'Apache 2.0', + license: apache2, sourceUrl: 'https://github.com/boyan01/overlay_support', ), Dependency( name: 'Palette Generator', - license: 'BSD 3-Clause', + license: bsd3, licenseUrl: 'https://github.com/flutter/packages/blob/master/packages/palette_generator/LICENSE', sourceUrl: 'https://github.com/flutter/packages/tree/master/packages/palette_generator', ), Dependency( name: 'Panorama (Aves fork)', - license: 'Apache 2.0', + license: apache2, sourceUrl: 'https://github.com/zesage/panorama', ), Dependency( name: 'Percent Indicator', - license: 'BSD 2-Clause', + license: bsd2, sourceUrl: 'https://github.com/diegoveloper/flutter_percent_indicator', ), Dependency( name: 'Provider', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/rrousselGit/provider', ), Dependency( name: 'Smooth Page Indicator', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/Milad-Akarie/smooth_page_indicator', ), ]; @@ -322,89 +333,89 @@ class Constants { static const List<Dependency> dartPackages = [ Dependency( name: 'Collection', - license: 'BSD 3-Clause', + license: bsd3, sourceUrl: 'https://github.com/dart-lang/collection', ), Dependency( name: 'Country Code', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/denixport/dart.country', ), Dependency( name: 'Equatable', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/felangel/equatable', ), Dependency( name: 'Event Bus', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/marcojakob/dart-event-bus', ), Dependency( name: 'Fluster', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/alfonsocejudo/fluster', ), Dependency( name: 'Flutter Lints', - license: 'BSD 3-Clause', + license: bsd3, licenseUrl: 'https://github.com/flutter/packages/blob/master/packages/flutter_lints/LICENSE', sourceUrl: 'https://github.com/flutter/packages/tree/master/packages/flutter_lints', ), Dependency( name: 'Get It', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/fluttercommunity/get_it', ), Dependency( name: 'Intl', - license: 'BSD 3-Clause', + license: bsd3, sourceUrl: 'https://github.com/dart-lang/intl', ), Dependency( name: 'LatLong2', - license: 'Apache 2.0', + license: apache2, sourceUrl: 'https://github.com/jifalops/dart-latlong', ), Dependency( name: 'Material Color Utilities', - license: 'Apache 2.0', + license: apache2, licenseUrl: 'https://github.com/material-foundation/material-color-utilities/tree/main/dart/LICENSE', sourceUrl: 'https://github.com/material-foundation/material-color-utilities/tree/main/dart', ), Dependency( name: 'Path', - license: 'BSD 3-Clause', + license: bsd3, sourceUrl: 'https://github.com/dart-lang/path', ), Dependency( name: 'PDF for Dart and Flutter', - license: 'Apache 2.0', + license: apache2, sourceUrl: 'https://github.com/DavBfr/dart_pdf', ), Dependency( name: 'Proj4dart', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/maRci002/proj4dart', ), Dependency( name: 'Stack Trace', - license: 'BSD 3-Clause', + license: bsd3, sourceUrl: 'https://github.com/dart-lang/stack_trace', ), Dependency( name: 'Transparent Image', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/brianegan/transparent_image', ), Dependency( name: 'Tuple', - license: 'BSD 2-Clause', + license: bsd2, sourceUrl: 'https://github.com/google/tuple.dart', ), Dependency( name: 'XML', - license: 'MIT', + license: mit, sourceUrl: 'https://github.com/renggli/dart-xml', ), ]; diff --git a/lib/widgets/about/bug_report.dart b/lib/widgets/about/bug_report.dart index dadbfabc3..027bc904a 100644 --- a/lib/widgets/about/bug_report.dart +++ b/lib/widgets/about/bug_report.dart @@ -142,7 +142,6 @@ class _BugReportState extends State<BugReport> with FeedbackMixin { Future<String> _getInfo(BuildContext context) async { final packageInfo = await PackageInfo.fromPlatform(); final androidInfo = await DeviceInfoPlugin().androidInfo; - final installer = await androidAppService.getAppInstaller(); final flavor = context.read<AppFlavor>().toString().split('.')[1]; return [ 'Aves version: ${packageInfo.version}-$flavor (Build ${packageInfo.buildNumber})', @@ -153,7 +152,7 @@ class _BugReportState extends State<BugReport> with FeedbackMixin { 'Mobile services: ${mobileServices.isServiceAvailable ? 'ready' : 'not available'}', 'System locales: ${WidgetsBinding.instance.window.locales.join(', ')}', 'Aves locale: ${settings.locale ?? 'system'} -> ${settings.appliedLocale}', - 'Installer: $installer', + 'Installer: ${packageInfo.installerStore}', ].join('\n'); } diff --git a/lib/widgets/viewer/debug/metadata.dart b/lib/widgets/viewer/debug/metadata.dart index e75435a61..831e0c3a4 100644 --- a/lib/widgets/viewer/debug/metadata.dart +++ b/lib/widgets/viewer/debug/metadata.dart @@ -22,7 +22,9 @@ class MetadataTab extends StatefulWidget { } class _MetadataTabState extends State<MetadataTab> { - late Future<Map> _bitmapFactoryLoader, _contentResolverMetadataLoader, _exifInterfaceMetadataLoader, _mediaMetadataLoader, _metadataExtractorLoader, _pixyMetaLoader, _tiffStructureLoader; + late Future<Map> _bitmapFactoryLoader, _contentResolverMetadataLoader, _exifInterfaceMetadataLoader; + late Future<Map> _mediaMetadataLoader, _metadataExtractorLoader, _pixyMetaLoader, _tiffStructureLoader; + late Future<String?> _mp4ParserDumpLoader; // MediaStore timestamp keys static const secondTimestampKeys = ['date_added', 'date_modified', 'date_expires', 'isPlayed']; @@ -42,6 +44,7 @@ class _MetadataTabState extends State<MetadataTab> { _exifInterfaceMetadataLoader = AndroidDebugService.getExifInterfaceMetadata(entry); _mediaMetadataLoader = AndroidDebugService.getMediaMetadataRetrieverMetadata(entry); _metadataExtractorLoader = AndroidDebugService.getMetadataExtractorSummary(entry); + _mp4ParserDumpLoader = AndroidDebugService.getMp4ParserDump(entry); _pixyMetaLoader = AndroidDebugService.getPixyMetadata(entry); _tiffStructureLoader = AndroidDebugService.getTiffStructure(entry); setState(() {}); @@ -85,7 +88,7 @@ class _MetadataTabState extends State<MetadataTab> { Widget builderFromSnapshot(BuildContext context, AsyncSnapshot<Map> snapshot, String title) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); return builderFromSnapshotData(context, snapshot.data!, title); } @@ -112,6 +115,27 @@ class _MetadataTabState extends State<MetadataTab> { future: _metadataExtractorLoader, builder: (context, snapshot) => builderFromSnapshot(context, snapshot, 'Metadata Extractor'), ), + FutureBuilder<String?>( + future: _mp4ParserDumpLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final data = snapshot.data?.trim(); + return AvesExpansionTile( + title: 'MP4 Parser', + children: [ + if (data != null && data.isNotEmpty) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Text(data), + ), + ) + ], + ); + }, + ), FutureBuilder<Map>( future: _pixyMetaLoader, builder: (context, snapshot) => builderFromSnapshot(context, snapshot, 'Pixy Meta'), @@ -121,7 +145,7 @@ class _MetadataTabState extends State<MetadataTab> { future: _tiffStructureLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); return Column( crossAxisAlignment: CrossAxisAlignment.start, children: snapshot.data!.entries.map((kv) => builderFromSnapshotData(context, kv.value as Map, 'TIFF ${kv.key}')).toList(), diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart b/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart index 90b07db8f..95e216007 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart @@ -91,6 +91,12 @@ class XmpMMNamespace extends XmpNamespace { XmpCardData(RegExp(nsPrefix + r'DerivedFrom/(.*)')), XmpCardData(RegExp(nsPrefix + r'History\[(\d+)\]/(.*)')), XmpCardData(RegExp(nsPrefix + r'Ingredients\[(\d+)\]/(.*)')), - XmpCardData(RegExp(nsPrefix + r'Pantry\[(\d+)\]/(.*)')), + XmpCardData( + RegExp(nsPrefix + r'Pantry\[(\d+)\]/(.*)'), + cards: [ + XmpCardData(RegExp(nsPrefix + r'DerivedFrom/(.*)')), + XmpCardData(RegExp(nsPrefix + r'History\[(\d+)\]/(.*)')), + ], + ), ]; } diff --git a/plugins/aves_services_google/lib/aves_services_platform.dart b/plugins/aves_services_google/lib/aves_services_platform.dart index 4c8f2ef0d..92b643e11 100644 --- a/plugins/aves_services_google/lib/aves_services_platform.dart +++ b/plugins/aves_services_google/lib/aves_services_platform.dart @@ -25,7 +25,7 @@ class PlatformMobileServices extends MobileServices { // cf https://github.com/flutter/flutter/issues/23728 // as of google_maps_flutter v2.1.5, Flutter v3.0.1 makes the map hide overlay widgets on API <=22 final androidInfo = await DeviceInfoPlugin().androidInfo; - _canRenderMaps = (androidInfo.version.sdkInt ?? 0) >= 21; + _canRenderMaps = androidInfo.version.sdkInt >= 21; if (_canRenderMaps) { final mapsImplementation = GoogleMapsFlutterPlatform.instance; if (mapsImplementation is GoogleMapsFlutterAndroid) { diff --git a/pubspec.lock b/pubspec.lock index 743fc4ada..dc2df58ff 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -147,41 +147,13 @@ packages: name: connectivity_plus url: "https://pub.dartlang.org" source: hosted - version: "2.3.9" - connectivity_plus_linux: - dependency: transitive - description: - name: connectivity_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - connectivity_plus_macos: - dependency: transitive - description: - name: connectivity_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.6" + version: "3.0.0" connectivity_plus_platform_interface: dependency: transitive description: name: connectivity_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.2.1" - connectivity_plus_web: - dependency: transitive - description: - name: connectivity_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.5" - connectivity_plus_windows: - dependency: transitive - description: - name: connectivity_plus_windows - url: "https://pub.dartlang.org" - source: hosted version: "1.2.2" convert: dependency: transitive @@ -189,7 +161,7 @@ packages: name: convert url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.1.1" country_code: dependency: "direct main" description: @@ -238,42 +210,14 @@ packages: name: device_info_plus url: "https://pub.dartlang.org" source: hosted - version: "5.0.5" - device_info_plus_linux: - dependency: transitive - description: - name: device_info_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.2" - device_info_plus_macos: - dependency: transitive - description: - name: device_info_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.2" + version: "7.0.0" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" - device_info_plus_web: - dependency: transitive - description: - name: device_info_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.2" - device_info_plus_windows: - dependency: transitive - description: - name: device_info_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "5.0.2" + version: "6.0.0" dynamic_color: dependency: "direct main" description: @@ -361,14 +305,14 @@ packages: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.8.13" + version: "2.9.0" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.2.19" + version: "3.3.0" flex_color_picker: dependency: "direct main" description: @@ -559,14 +503,14 @@ packages: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.0.2" image: dependency: transitive description: name: image url: "https://pub.dartlang.org" source: hosted - version: "3.2.0" + version: "3.2.2" intl: dependency: "direct main" description: @@ -715,42 +659,14 @@ packages: name: package_info_plus url: "https://pub.dartlang.org" source: hosted - version: "1.4.3+1" - package_info_plus_linux: - dependency: transitive - description: - name: package_info_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.5" - package_info_plus_macos: - dependency: transitive - description: - name: package_info_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "3.0.0" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" - package_info_plus_web: - dependency: transitive - description: - name: package_info_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.6" - package_info_plus_windows: - dependency: transitive - description: - name: package_info_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" + version: "2.0.0" palette_generator: dependency: "direct main" description: @@ -824,21 +740,19 @@ packages: source: hosted version: "10.1.0" permission_handler_android: - dependency: "direct overridden" + dependency: transitive description: - path: permission_handler_android - ref: HEAD - resolved-ref: "279cf44656272c6b89c73b16097108f3c973c31f" - url: "https://github.com/deckerst/flutter-permission-handler" - source: git - version: "9.0.2+1" + name: permission_handler_android + url: "https://pub.dartlang.org" + source: hosted + version: "10.2.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple url: "https://pub.dartlang.org" source: hosted - version: "9.0.6" + version: "9.0.7" permission_handler_platform_interface: dependency: transitive description: @@ -852,7 +766,7 @@ packages: name: permission_handler_windows url: "https://pub.dartlang.org" source: hosted - version: "0.1.1" + version: "0.1.2" petitparser: dependency: transitive description: @@ -922,14 +836,14 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "6.0.3" + version: "6.0.4" pub_semver: dependency: transitive description: name: pub_semver url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" qr: dependency: transitive description: @@ -992,7 +906,7 @@ packages: name: shared_preferences_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.13" + version: "2.0.14" shared_preferences_ios: dependency: transitive description: @@ -1293,7 +1207,7 @@ packages: name: watcher url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" web_socket_channel: dependency: transitive description: @@ -1321,7 +1235,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" wkt_parser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 40f1c27eb..825f08131 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -85,14 +85,6 @@ dependencies: url_launcher: xml: -dependency_overrides: - # TODO TLAD as of 2022/10/09, latest version (v10.1.0) does not support Android 13 storage permissions - # `permission_handler_platform_interface` v3.9.0 added support for them but it is not effective - permission_handler_android: - git: - url: https://github.com/deckerst/flutter-permission-handler - path: permission_handler_android - dev_dependencies: flutter_test: sdk: flutter From 1b1e7fd1e45e8203efeee9665505332f21602347 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Wed, 19 Oct 2022 11:42:36 +0200 Subject: [PATCH 04/53] settings: improved slideshow/screensaver interval selection --- lib/l10n/app_de.arb | 5 +- lib/l10n/app_el.arb | 5 +- lib/l10n/app_en.arb | 6 +- lib/l10n/app_es.arb | 5 +- lib/l10n/app_fr.arb | 6 +- lib/l10n/app_id.arb | 5 +- lib/l10n/app_it.arb | 5 +- lib/l10n/app_ja.arb | 5 +- lib/l10n/app_ko.arb | 6 +- lib/l10n/app_nl.arb | 5 +- lib/l10n/app_pt.arb | 5 +- lib/l10n/app_ru.arb | 5 +- lib/l10n/app_tr.arb | 5 +- lib/l10n/app_zh.arb | 5 +- lib/model/settings/defaults.dart | 2 +- lib/model/settings/enums/enums.dart | 2 - .../settings/enums/slideshow_interval.dart | 36 ---- lib/model/settings/settings.dart | 178 +++++++++++------- lib/utils/time_utils.dart | 6 +- lib/widgets/dialogs/duration_dialog.dart | 113 +++++++++++ .../entry_editors/edit_date_dialog.dart | 19 +- lib/widgets/settings/common/tiles.dart | 47 +++++ .../settings/screen_saver_settings_page.dart | 13 +- lib/widgets/settings/viewer/slideshow.dart | 26 ++- lib/widgets/viewer/screen_saver_page.dart | 3 +- lib/widgets/viewer/slideshow_page.dart | 3 +- untranslated.json | 25 ++- 27 files changed, 366 insertions(+), 180 deletions(-) delete mode 100644 lib/model/settings/enums/slideshow_interval.dart create mode 100644 lib/widgets/dialogs/duration_dialog.dart diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 8a10fd97e..cd8831aad 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -252,8 +252,9 @@ "editEntryDateDialogExtractFromTitle": "Auszug aus dem Titel", "editEntryDateDialogShift": "Verschieben", "editEntryDateDialogSourceFileModifiedDate": "Änderungsdatum der Datei", - "editEntryDateDialogHours": "Stunden", - "editEntryDateDialogMinutes": "Minuten", + + "durationDialogHours": "Stunden", + "durationDialogMinutes": "Minuten", "editEntryLocationDialogTitle": "Standort", "editEntryLocationDialogChooseOnMapTooltip": "Auf Karte wählen", diff --git a/lib/l10n/app_el.arb b/lib/l10n/app_el.arb index d212e8f7c..4a12ea214 100644 --- a/lib/l10n/app_el.arb +++ b/lib/l10n/app_el.arb @@ -252,8 +252,9 @@ "editEntryDateDialogExtractFromTitle": "Εξαγωγή από το όνομα του κάθε αρχείου", "editEntryDateDialogShift": "Μετατόπιση", "editEntryDateDialogSourceFileModifiedDate": "Ημερομηνία τροποποίησης αρχείου", - "editEntryDateDialogHours": "Ώρες", - "editEntryDateDialogMinutes": "Λεπτά", + + "durationDialogHours": "Ώρες", + "durationDialogMinutes": "Λεπτά", "editEntryLocationDialogTitle": "Τοποθεσια", "editEntryLocationDialogChooseOnMapTooltip": "Επιλογή στο χάρτη", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 63c3eb9d1..df0578d68 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -383,8 +383,10 @@ "editEntryDateDialogExtractFromTitle": "Extract from title", "editEntryDateDialogShift": "Shift", "editEntryDateDialogSourceFileModifiedDate": "File modified date", - "editEntryDateDialogHours": "Hours", - "editEntryDateDialogMinutes": "Minutes", + + "durationDialogHours": "Hours", + "durationDialogMinutes": "Minutes", + "durationDialogSeconds": "Seconds", "editEntryLocationDialogTitle": "Location", "editEntryLocationDialogChooseOnMapTooltip": "Choose on map", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 1a348e6fb..4eff26ac7 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -242,8 +242,9 @@ "editEntryDateDialogExtractFromTitle": "Extraer del título", "editEntryDateDialogShift": "Cambiar", "editEntryDateDialogSourceFileModifiedDate": "Fecha de modificación del archivo", - "editEntryDateDialogHours": "Horas", - "editEntryDateDialogMinutes": "Minutos", + + "durationDialogHours": "Horas", + "durationDialogMinutes": "Minutos", "editEntryLocationDialogTitle": "Ubicación", "editEntryLocationDialogChooseOnMapTooltip": "Elegir en el mapa", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 33e4ec23b..f0e8dc9a6 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -253,8 +253,10 @@ "editEntryDateDialogExtractFromTitle": "Extraire du titre", "editEntryDateDialogShift": "Décaler", "editEntryDateDialogSourceFileModifiedDate": "Date de modification du fichier", - "editEntryDateDialogHours": "Heures", - "editEntryDateDialogMinutes": "Minutes", + + "durationDialogHours": "Heures", + "durationDialogMinutes": "Minutes", + "durationDialogSeconds": "Secondes", "editEntryLocationDialogTitle": "Lieu", "editEntryLocationDialogChooseOnMapTooltip": "Sélectionner sur la carte", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index b68eb8d60..d75c0352f 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -246,8 +246,9 @@ "editEntryDateDialogExtractFromTitle": "Ekstrak dari judul", "editEntryDateDialogShift": "Geser", "editEntryDateDialogSourceFileModifiedDate": "Tanggal modifikasi file", - "editEntryDateDialogHours": "Jam", - "editEntryDateDialogMinutes": "Menit", + + "durationDialogHours": "Jam", + "durationDialogMinutes": "Menit", "editEntryLocationDialogTitle": "Lokasi", "editEntryLocationDialogChooseOnMapTooltip": "Pilih di peta", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index c0447d0d9..79709e726 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -252,8 +252,9 @@ "editEntryDateDialogExtractFromTitle": "Estrai dal titolo", "editEntryDateDialogShift": "Turno", "editEntryDateDialogSourceFileModifiedDate": "Data di modifica del file", - "editEntryDateDialogHours": "Ore", - "editEntryDateDialogMinutes": "Minuti", + + "durationDialogHours": "Ore", + "durationDialogMinutes": "Minuti", "editEntryLocationDialogTitle": "Posizione", "editEntryLocationDialogChooseOnMapTooltip": "Scegli sulla mappa", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index fb568bf75..4c75b8a50 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -242,8 +242,9 @@ "editEntryDateDialogExtractFromTitle": "タイトルから抽出する", "editEntryDateDialogShift": "シフト", "editEntryDateDialogSourceFileModifiedDate": "ファイル更新日", - "editEntryDateDialogHours": "時", - "editEntryDateDialogMinutes": "分", + + "durationDialogHours": "時", + "durationDialogMinutes": "分", "editEntryLocationDialogTitle": "位置情報", "editEntryLocationDialogChooseOnMapTooltip": "地図上で選択", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index c67b589eb..0644a9a14 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -253,8 +253,10 @@ "editEntryDateDialogExtractFromTitle": "제목에서 추출", "editEntryDateDialogShift": "시간 이동", "editEntryDateDialogSourceFileModifiedDate": "파일 수정한 날짜", - "editEntryDateDialogHours": "시간", - "editEntryDateDialogMinutes": "분", + + "durationDialogHours": "시간", + "durationDialogMinutes": "분", + "durationDialogSeconds": "초", "editEntryLocationDialogTitle": "위치", "editEntryLocationDialogChooseOnMapTooltip": "지도에서 선택", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index f92749657..271f254b2 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -252,8 +252,9 @@ "editEntryDateDialogExtractFromTitle": "Uit titel halen", "editEntryDateDialogShift": "Verschuiven", "editEntryDateDialogSourceFileModifiedDate": "Wijzigingsdatum bestand", - "editEntryDateDialogHours": "Uren", - "editEntryDateDialogMinutes": "Minuten", + + "durationDialogHours": "Uren", + "durationDialogMinutes": "Minuten", "editEntryLocationDialogTitle": "Locatie", "editEntryLocationDialogChooseOnMapTooltip": "Kies op kaart", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 7274b6c0a..db0575d29 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -252,8 +252,9 @@ "editEntryDateDialogExtractFromTitle": "Extrair do título", "editEntryDateDialogShift": "Mudança", "editEntryDateDialogSourceFileModifiedDate": "Data de modificação do arquivo", - "editEntryDateDialogHours": "Horas", - "editEntryDateDialogMinutes": "Minutos", + + "durationDialogHours": "Horas", + "durationDialogMinutes": "Minutos", "editEntryLocationDialogTitle": "Localização", "editEntryLocationDialogChooseOnMapTooltip": "Escolha no mapa", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index fff690d5f..1c7f68575 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -252,8 +252,9 @@ "editEntryDateDialogExtractFromTitle": "Извлечь из названия", "editEntryDateDialogShift": "Сдвиг", "editEntryDateDialogSourceFileModifiedDate": "Дата изменения файла", - "editEntryDateDialogHours": "Часов", - "editEntryDateDialogMinutes": "Минут", + + "durationDialogHours": "Часов", + "durationDialogMinutes": "Минут", "editEntryLocationDialogTitle": "Местоположение", "editEntryLocationDialogChooseOnMapTooltip": "Выбрать на карте", diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 8ef070f15..7b2aeda1c 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -230,8 +230,9 @@ "editEntryDateDialogExtractFromTitle": "Başlıktan ayıkla", "editEntryDateDialogShift": "Değişim", "editEntryDateDialogSourceFileModifiedDate": "Dosya değiştirilme tarihi", - "editEntryDateDialogHours": "Saat", - "editEntryDateDialogMinutes": "Dakika", + + "durationDialogHours": "Saat", + "durationDialogMinutes": "Dakika", "editEntryLocationDialogTitle": "Konum", "editEntryLocationDialogChooseOnMapTooltip": "Harita üzerinde seç", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index e4cb6b1f1..42c8e30ce 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -252,8 +252,9 @@ "editEntryDateDialogExtractFromTitle": "从标题提取", "editEntryDateDialogShift": "转移", "editEntryDateDialogSourceFileModifiedDate": "文件修改日期", - "editEntryDateDialogHours": "时", - "editEntryDateDialogMinutes": "分", + + "durationDialogHours": "时", + "durationDialogMinutes": "分", "editEntryLocationDialogTitle": "位置", "editEntryLocationDialogChooseOnMapTooltip": "从地图上选择", diff --git a/lib/model/settings/defaults.dart b/lib/model/settings/defaults.dart index 08b79553b..71a382fd5 100644 --- a/lib/model/settings/defaults.dart +++ b/lib/model/settings/defaults.dart @@ -132,7 +132,7 @@ class SettingsDefaults { static const slideshowAnimatedZoomEffect = true; static const slideshowTransition = ViewerTransition.fade; static const slideshowVideoPlayback = SlideshowVideoPlayback.playMuted; - static const slideshowInterval = SlideshowInterval.s5; + static const slideshowInterval = 5; // widget static const widgetOutline = false; diff --git a/lib/model/settings/enums/enums.dart b/lib/model/settings/enums/enums.dart index 74868f0bf..cf3f74edb 100644 --- a/lib/model/settings/enums/enums.dart +++ b/lib/model/settings/enums/enums.dart @@ -18,8 +18,6 @@ enum HomePageSetting { collection, albums } enum KeepScreenOn { never, viewerOnly, always } -enum SlideshowInterval { s3, s5, s10, s30, s60 } - enum SlideshowVideoPlayback { skip, playMuted, playWithSound } enum UnitSystem { metric, imperial } diff --git a/lib/model/settings/enums/slideshow_interval.dart b/lib/model/settings/enums/slideshow_interval.dart deleted file mode 100644 index ad9562d29..000000000 --- a/lib/model/settings/enums/slideshow_interval.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:aves/widgets/common/extensions/build_context.dart'; -import 'package:flutter/widgets.dart'; - -import 'enums.dart'; - -extension ExtraSlideshowInterval on SlideshowInterval { - String getName(BuildContext context) { - switch (this) { - case SlideshowInterval.s3: - return context.l10n.timeSeconds(3); - case SlideshowInterval.s5: - return context.l10n.timeSeconds(5); - case SlideshowInterval.s10: - return context.l10n.timeSeconds(10); - case SlideshowInterval.s30: - return context.l10n.timeSeconds(30); - case SlideshowInterval.s60: - return context.l10n.timeMinutes(1); - } - } - - Duration getDuration() { - switch (this) { - case SlideshowInterval.s3: - return const Duration(seconds: 3); - case SlideshowInterval.s5: - return const Duration(seconds: 5); - case SlideshowInterval.s10: - return const Duration(seconds: 10); - case SlideshowInterval.s30: - return const Duration(seconds: 30); - case SlideshowInterval.s60: - return const Duration(minutes: 1); - } - } -} diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 71a40dcca..b993c6bbf 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -219,19 +219,19 @@ class Settings extends ChangeNotifier { // app - bool get hasAcceptedTerms => getBoolOrDefault(hasAcceptedTermsKey, SettingsDefaults.hasAcceptedTerms); + bool get hasAcceptedTerms => getBool(hasAcceptedTermsKey) ?? SettingsDefaults.hasAcceptedTerms; set hasAcceptedTerms(bool newValue) => setAndNotify(hasAcceptedTermsKey, newValue); - bool get canUseAnalysisService => getBoolOrDefault(canUseAnalysisServiceKey, SettingsDefaults.canUseAnalysisService); + bool get canUseAnalysisService => getBool(canUseAnalysisServiceKey) ?? SettingsDefaults.canUseAnalysisService; set canUseAnalysisService(bool newValue) => setAndNotify(canUseAnalysisServiceKey, newValue); - bool get isInstalledAppAccessAllowed => getBoolOrDefault(isInstalledAppAccessAllowedKey, SettingsDefaults.isInstalledAppAccessAllowed); + bool get isInstalledAppAccessAllowed => getBool(isInstalledAppAccessAllowedKey) ?? SettingsDefaults.isInstalledAppAccessAllowed; set isInstalledAppAccessAllowed(bool newValue) => setAndNotify(isInstalledAppAccessAllowedKey, newValue); - bool get isErrorReportingAllowed => getBoolOrDefault(isErrorReportingAllowedKey, SettingsDefaults.isErrorReportingAllowed); + bool get isErrorReportingAllowed => getBool(isErrorReportingAllowedKey) ?? SettingsDefaults.isErrorReportingAllowed; set isErrorReportingAllowed(bool newValue) => setAndNotify(isErrorReportingAllowedKey, newValue); @@ -322,17 +322,17 @@ class Settings extends ChangeNotifier { set themeColorMode(AvesThemeColorMode newValue) => setAndNotify(themeColorModeKey, newValue.toString()); - bool get enableDynamicColor => getBoolOrDefault(enableDynamicColorKey, SettingsDefaults.enableDynamicColor); + bool get enableDynamicColor => getBool(enableDynamicColorKey) ?? SettingsDefaults.enableDynamicColor; set enableDynamicColor(bool newValue) => setAndNotify(enableDynamicColorKey, newValue); - bool get enableBlurEffect => getBoolOrDefault(enableBlurEffectKey, SettingsDefaults.enableBlurEffect); + bool get enableBlurEffect => getBool(enableBlurEffectKey) ?? SettingsDefaults.enableBlurEffect; set enableBlurEffect(bool newValue) => setAndNotify(enableBlurEffectKey, newValue); // navigation - bool get mustBackTwiceToExit => getBoolOrDefault(mustBackTwiceToExitKey, SettingsDefaults.mustBackTwiceToExit); + bool get mustBackTwiceToExit => getBool(mustBackTwiceToExitKey) ?? SettingsDefaults.mustBackTwiceToExit; set mustBackTwiceToExit(bool newValue) => setAndNotify(mustBackTwiceToExitKey, newValue); @@ -344,27 +344,27 @@ class Settings extends ChangeNotifier { set homePage(HomePageSetting newValue) => setAndNotify(homePageKey, newValue.toString()); - bool get enableBottomNavigationBar => getBoolOrDefault(enableBottomNavigationBarKey, SettingsDefaults.enableBottomNavigationBar); + bool get enableBottomNavigationBar => getBool(enableBottomNavigationBarKey) ?? SettingsDefaults.enableBottomNavigationBar; set enableBottomNavigationBar(bool newValue) => setAndNotify(enableBottomNavigationBarKey, newValue); - bool get confirmDeleteForever => getBoolOrDefault(confirmDeleteForeverKey, SettingsDefaults.confirmDeleteForever); + bool get confirmDeleteForever => getBool(confirmDeleteForeverKey) ?? SettingsDefaults.confirmDeleteForever; set confirmDeleteForever(bool newValue) => setAndNotify(confirmDeleteForeverKey, newValue); - bool get confirmMoveToBin => getBoolOrDefault(confirmMoveToBinKey, SettingsDefaults.confirmMoveToBin); + bool get confirmMoveToBin => getBool(confirmMoveToBinKey) ?? SettingsDefaults.confirmMoveToBin; set confirmMoveToBin(bool newValue) => setAndNotify(confirmMoveToBinKey, newValue); - bool get confirmMoveUndatedItems => getBoolOrDefault(confirmMoveUndatedItemsKey, SettingsDefaults.confirmMoveUndatedItems); + bool get confirmMoveUndatedItems => getBool(confirmMoveUndatedItemsKey) ?? SettingsDefaults.confirmMoveUndatedItems; set confirmMoveUndatedItems(bool newValue) => setAndNotify(confirmMoveUndatedItemsKey, newValue); - bool get confirmAfterMoveToBin => getBoolOrDefault(confirmAfterMoveToBinKey, SettingsDefaults.confirmAfterMoveToBin); + bool get confirmAfterMoveToBin => getBool(confirmAfterMoveToBinKey) ?? SettingsDefaults.confirmAfterMoveToBin; set confirmAfterMoveToBin(bool newValue) => setAndNotify(confirmAfterMoveToBinKey, newValue); - bool get setMetadataDateBeforeFileOp => getBoolOrDefault(setMetadataDateBeforeFileOpKey, SettingsDefaults.setMetadataDateBeforeFileOp); + bool get setMetadataDateBeforeFileOp => getBool(setMetadataDateBeforeFileOpKey) ?? SettingsDefaults.setMetadataDateBeforeFileOp; set setMetadataDateBeforeFileOp(bool newValue) => setAndNotify(setMetadataDateBeforeFileOpKey, newValue); @@ -395,7 +395,7 @@ class Settings extends ChangeNotifier { set collectionSortFactor(EntrySortFactor newValue) => setAndNotify(collectionSortFactorKey, newValue.toString()); - bool get collectionSortReverse => getBoolOrDefault(collectionSortReverseKey, false); + bool get collectionSortReverse => getBool(collectionSortReverseKey) ?? false; set collectionSortReverse(bool newValue) => setAndNotify(collectionSortReverseKey, newValue); @@ -407,31 +407,31 @@ class Settings extends ChangeNotifier { set collectionSelectionQuickActions(List<EntrySetAction> newValue) => setAndNotify(collectionSelectionQuickActionsKey, newValue.map((v) => v.toString()).toList()); - bool get showThumbnailFavourite => getBoolOrDefault(showThumbnailFavouriteKey, SettingsDefaults.showThumbnailFavourite); + bool get showThumbnailFavourite => getBool(showThumbnailFavouriteKey) ?? SettingsDefaults.showThumbnailFavourite; set showThumbnailFavourite(bool newValue) => setAndNotify(showThumbnailFavouriteKey, newValue); - bool get showThumbnailTag => getBoolOrDefault(showThumbnailTagKey, SettingsDefaults.showThumbnailTag); + bool get showThumbnailTag => getBool(showThumbnailTagKey) ?? SettingsDefaults.showThumbnailTag; set showThumbnailTag(bool newValue) => setAndNotify(showThumbnailTagKey, newValue); - bool get showThumbnailLocation => getBoolOrDefault(showThumbnailLocationKey, SettingsDefaults.showThumbnailLocation); + bool get showThumbnailLocation => getBool(showThumbnailLocationKey) ?? SettingsDefaults.showThumbnailLocation; set showThumbnailLocation(bool newValue) => setAndNotify(showThumbnailLocationKey, newValue); - bool get showThumbnailMotionPhoto => getBoolOrDefault(showThumbnailMotionPhotoKey, SettingsDefaults.showThumbnailMotionPhoto); + bool get showThumbnailMotionPhoto => getBool(showThumbnailMotionPhotoKey) ?? SettingsDefaults.showThumbnailMotionPhoto; set showThumbnailMotionPhoto(bool newValue) => setAndNotify(showThumbnailMotionPhotoKey, newValue); - bool get showThumbnailRating => getBoolOrDefault(showThumbnailRatingKey, SettingsDefaults.showThumbnailRating); + bool get showThumbnailRating => getBool(showThumbnailRatingKey) ?? SettingsDefaults.showThumbnailRating; set showThumbnailRating(bool newValue) => setAndNotify(showThumbnailRatingKey, newValue); - bool get showThumbnailRaw => getBoolOrDefault(showThumbnailRawKey, SettingsDefaults.showThumbnailRaw); + bool get showThumbnailRaw => getBool(showThumbnailRawKey) ?? SettingsDefaults.showThumbnailRaw; set showThumbnailRaw(bool newValue) => setAndNotify(showThumbnailRawKey, newValue); - bool get showThumbnailVideoDuration => getBoolOrDefault(showThumbnailVideoDurationKey, SettingsDefaults.showThumbnailVideoDuration); + bool get showThumbnailVideoDuration => getBool(showThumbnailVideoDurationKey) ?? SettingsDefaults.showThumbnailVideoDuration; set showThumbnailVideoDuration(bool newValue) => setAndNotify(showThumbnailVideoDurationKey, newValue); @@ -453,15 +453,15 @@ class Settings extends ChangeNotifier { set tagSortFactor(ChipSortFactor newValue) => setAndNotify(tagSortFactorKey, newValue.toString()); - bool get albumSortReverse => getBoolOrDefault(albumSortReverseKey, false); + bool get albumSortReverse => getBool(albumSortReverseKey) ?? false; set albumSortReverse(bool newValue) => setAndNotify(albumSortReverseKey, newValue); - bool get countrySortReverse => getBoolOrDefault(countrySortReverseKey, false); + bool get countrySortReverse => getBool(countrySortReverseKey) ?? false; set countrySortReverse(bool newValue) => setAndNotify(countrySortReverseKey, newValue); - bool get tagSortReverse => getBoolOrDefault(tagSortReverseKey, false); + bool get tagSortReverse => getBool(tagSortReverseKey) ?? false; set tagSortReverse(bool newValue) => setAndNotify(tagSortReverseKey, newValue); @@ -490,39 +490,39 @@ class Settings extends ChangeNotifier { set viewerQuickActions(List<EntryAction> newValue) => setAndNotify(viewerQuickActionsKey, newValue.map((v) => v.toString()).toList()); - bool get showOverlayOnOpening => getBoolOrDefault(showOverlayOnOpeningKey, SettingsDefaults.showOverlayOnOpening); + bool get showOverlayOnOpening => getBool(showOverlayOnOpeningKey) ?? SettingsDefaults.showOverlayOnOpening; set showOverlayOnOpening(bool newValue) => setAndNotify(showOverlayOnOpeningKey, newValue); - bool get showOverlayMinimap => getBoolOrDefault(showOverlayMinimapKey, SettingsDefaults.showOverlayMinimap); + bool get showOverlayMinimap => getBool(showOverlayMinimapKey) ?? SettingsDefaults.showOverlayMinimap; set showOverlayMinimap(bool newValue) => setAndNotify(showOverlayMinimapKey, newValue); - bool get showOverlayInfo => getBoolOrDefault(showOverlayInfoKey, SettingsDefaults.showOverlayInfo); + bool get showOverlayInfo => getBool(showOverlayInfoKey) ?? SettingsDefaults.showOverlayInfo; set showOverlayInfo(bool newValue) => setAndNotify(showOverlayInfoKey, newValue); - bool get showOverlayShootingDetails => getBoolOrDefault(showOverlayShootingDetailsKey, SettingsDefaults.showOverlayShootingDetails); + bool get showOverlayShootingDetails => getBool(showOverlayShootingDetailsKey) ?? SettingsDefaults.showOverlayShootingDetails; set showOverlayShootingDetails(bool newValue) => setAndNotify(showOverlayShootingDetailsKey, newValue); - bool get showOverlayThumbnailPreview => getBoolOrDefault(showOverlayThumbnailPreviewKey, SettingsDefaults.showOverlayThumbnailPreview); + bool get showOverlayThumbnailPreview => getBool(showOverlayThumbnailPreviewKey) ?? SettingsDefaults.showOverlayThumbnailPreview; set showOverlayThumbnailPreview(bool newValue) => setAndNotify(showOverlayThumbnailPreviewKey, newValue); - bool get viewerGestureSideTapNext => getBoolOrDefault(viewerGestureSideTapNextKey, SettingsDefaults.viewerGestureSideTapNext); + bool get viewerGestureSideTapNext => getBool(viewerGestureSideTapNextKey) ?? SettingsDefaults.viewerGestureSideTapNext; set viewerGestureSideTapNext(bool newValue) => setAndNotify(viewerGestureSideTapNextKey, newValue); - bool get viewerUseCutout => getBoolOrDefault(viewerUseCutoutKey, SettingsDefaults.viewerUseCutout); + bool get viewerUseCutout => getBool(viewerUseCutoutKey) ?? SettingsDefaults.viewerUseCutout; set viewerUseCutout(bool newValue) => setAndNotify(viewerUseCutoutKey, newValue); - bool get viewerMaxBrightness => getBoolOrDefault(viewerMaxBrightnessKey, SettingsDefaults.viewerMaxBrightness); + bool get viewerMaxBrightness => getBool(viewerMaxBrightnessKey) ?? SettingsDefaults.viewerMaxBrightness; set viewerMaxBrightness(bool newValue) => setAndNotify(viewerMaxBrightnessKey, newValue); - bool get enableMotionPhotoAutoPlay => getBoolOrDefault(enableMotionPhotoAutoPlayKey, SettingsDefaults.enableMotionPhotoAutoPlay); + bool get enableMotionPhotoAutoPlay => getBool(enableMotionPhotoAutoPlayKey) ?? SettingsDefaults.enableMotionPhotoAutoPlay; set enableMotionPhotoAutoPlay(bool newValue) => setAndNotify(enableMotionPhotoAutoPlayKey, newValue); @@ -532,7 +532,7 @@ class Settings extends ChangeNotifier { // video - bool get enableVideoHardwareAcceleration => getBoolOrDefault(enableVideoHardwareAccelerationKey, SettingsDefaults.enableVideoHardwareAcceleration); + bool get enableVideoHardwareAcceleration => getBool(enableVideoHardwareAccelerationKey) ?? SettingsDefaults.enableVideoHardwareAcceleration; set enableVideoHardwareAcceleration(bool newValue) => setAndNotify(enableVideoHardwareAccelerationKey, newValue); @@ -544,7 +544,7 @@ class Settings extends ChangeNotifier { set videoLoopMode(VideoLoopMode newValue) => setAndNotify(videoLoopModeKey, newValue.toString()); - bool get videoShowRawTimedText => getBoolOrDefault(videoShowRawTimedTextKey, SettingsDefaults.videoShowRawTimedText); + bool get videoShowRawTimedText => getBool(videoShowRawTimedTextKey) ?? SettingsDefaults.videoShowRawTimedText; set videoShowRawTimedText(bool newValue) => setAndNotify(videoShowRawTimedTextKey, newValue); @@ -552,11 +552,11 @@ class Settings extends ChangeNotifier { set videoControls(VideoControls newValue) => setAndNotify(videoControlsKey, newValue.toString()); - bool get videoGestureDoubleTapTogglePlay => getBoolOrDefault(videoGestureDoubleTapTogglePlayKey, SettingsDefaults.videoGestureDoubleTapTogglePlay); + bool get videoGestureDoubleTapTogglePlay => getBool(videoGestureDoubleTapTogglePlayKey) ?? SettingsDefaults.videoGestureDoubleTapTogglePlay; set videoGestureDoubleTapTogglePlay(bool newValue) => setAndNotify(videoGestureDoubleTapTogglePlayKey, newValue); - bool get videoGestureSideDoubleTapSeek => getBoolOrDefault(videoGestureSideDoubleTapSeekKey, SettingsDefaults.videoGestureSideDoubleTapSeek); + bool get videoGestureSideDoubleTapSeek => getBool(videoGestureSideDoubleTapSeekKey) ?? SettingsDefaults.videoGestureSideDoubleTapSeek; set videoGestureSideDoubleTapSeek(bool newValue) => setAndNotify(videoGestureSideDoubleTapSeekKey, newValue); @@ -570,7 +570,7 @@ class Settings extends ChangeNotifier { set subtitleTextAlignment(TextAlign newValue) => setAndNotify(subtitleTextAlignmentKey, newValue.toString()); - bool get subtitleShowOutline => getBoolOrDefault(subtitleShowOutlineKey, SettingsDefaults.subtitleShowOutline); + bool get subtitleShowOutline => getBool(subtitleShowOutlineKey) ?? SettingsDefaults.subtitleShowOutline; set subtitleShowOutline(bool newValue) => setAndNotify(subtitleShowOutlineKey, newValue); @@ -615,7 +615,7 @@ class Settings extends ChangeNotifier { // search - bool get saveSearchHistory => getBoolOrDefault(saveSearchHistoryKey, SettingsDefaults.saveSearchHistory); + bool get saveSearchHistory => getBool(saveSearchHistoryKey) ?? SettingsDefaults.saveSearchHistory; set saveSearchHistory(bool newValue) => setAndNotify(saveSearchHistoryKey, newValue); @@ -625,7 +625,7 @@ class Settings extends ChangeNotifier { // bin - bool get enableBin => getBoolOrDefault(enableBinKey, SettingsDefaults.enableBin); + bool get enableBin => getBool(enableBinKey) ?? SettingsDefaults.enableBin; set enableBin(bool newValue) => setAndNotify(enableBinKey, newValue); @@ -641,17 +641,17 @@ class Settings extends ChangeNotifier { // file picker - bool get filePickerShowHiddenFiles => getBoolOrDefault(filePickerShowHiddenFilesKey, SettingsDefaults.filePickerShowHiddenFiles); + bool get filePickerShowHiddenFiles => getBool(filePickerShowHiddenFilesKey) ?? SettingsDefaults.filePickerShowHiddenFiles; set filePickerShowHiddenFiles(bool newValue) => setAndNotify(filePickerShowHiddenFilesKey, newValue); // screen saver - bool get screenSaverFillScreen => getBoolOrDefault(screenSaverFillScreenKey, SettingsDefaults.slideshowFillScreen); + bool get screenSaverFillScreen => getBool(screenSaverFillScreenKey) ?? SettingsDefaults.slideshowFillScreen; set screenSaverFillScreen(bool newValue) => setAndNotify(screenSaverFillScreenKey, newValue); - bool get screenSaverAnimatedZoomEffect => getBoolOrDefault(screenSaverAnimatedZoomEffectKey, SettingsDefaults.slideshowAnimatedZoomEffect); + bool get screenSaverAnimatedZoomEffect => getBool(screenSaverAnimatedZoomEffectKey) ?? SettingsDefaults.slideshowAnimatedZoomEffect; set screenSaverAnimatedZoomEffect(bool newValue) => setAndNotify(screenSaverAnimatedZoomEffectKey, newValue); @@ -663,9 +663,9 @@ class Settings extends ChangeNotifier { set screenSaverVideoPlayback(SlideshowVideoPlayback newValue) => setAndNotify(screenSaverVideoPlaybackKey, newValue.toString()); - SlideshowInterval get screenSaverInterval => getEnumOrDefault(screenSaverIntervalKey, SettingsDefaults.slideshowInterval, SlideshowInterval.values); + int get screenSaverInterval => getInt(screenSaverIntervalKey) ?? SettingsDefaults.slideshowInterval; - set screenSaverInterval(SlideshowInterval newValue) => setAndNotify(screenSaverIntervalKey, newValue.toString()); + set screenSaverInterval(int newValue) => setAndNotify(screenSaverIntervalKey, newValue); Set<CollectionFilter> get screenSaverCollectionFilters => (getStringList(screenSaverCollectionFiltersKey) ?? []).map(CollectionFilter.fromJson).whereNotNull().toSet(); @@ -673,19 +673,19 @@ class Settings extends ChangeNotifier { // slideshow - bool get slideshowRepeat => getBoolOrDefault(slideshowRepeatKey, SettingsDefaults.slideshowRepeat); + bool get slideshowRepeat => getBool(slideshowRepeatKey) ?? SettingsDefaults.slideshowRepeat; set slideshowRepeat(bool newValue) => setAndNotify(slideshowRepeatKey, newValue); - bool get slideshowShuffle => getBoolOrDefault(slideshowShuffleKey, SettingsDefaults.slideshowShuffle); + bool get slideshowShuffle => getBool(slideshowShuffleKey) ?? SettingsDefaults.slideshowShuffle; set slideshowShuffle(bool newValue) => setAndNotify(slideshowShuffleKey, newValue); - bool get slideshowFillScreen => getBoolOrDefault(slideshowFillScreenKey, SettingsDefaults.slideshowFillScreen); + bool get slideshowFillScreen => getBool(slideshowFillScreenKey) ?? SettingsDefaults.slideshowFillScreen; set slideshowFillScreen(bool newValue) => setAndNotify(slideshowFillScreenKey, newValue); - bool get slideshowAnimatedZoomEffect => getBoolOrDefault(slideshowAnimatedZoomEffectKey, SettingsDefaults.slideshowAnimatedZoomEffect); + bool get slideshowAnimatedZoomEffect => getBool(slideshowAnimatedZoomEffectKey) ?? SettingsDefaults.slideshowAnimatedZoomEffect; set slideshowAnimatedZoomEffect(bool newValue) => setAndNotify(slideshowAnimatedZoomEffectKey, newValue); @@ -697,9 +697,9 @@ class Settings extends ChangeNotifier { set slideshowVideoPlayback(SlideshowVideoPlayback newValue) => setAndNotify(slideshowVideoPlaybackKey, newValue.toString()); - SlideshowInterval get slideshowInterval => getEnumOrDefault(slideshowIntervalKey, SettingsDefaults.slideshowInterval, SlideshowInterval.values); + int get slideshowInterval => getInt(slideshowIntervalKey) ?? SettingsDefaults.slideshowInterval; - set slideshowInterval(SlideshowInterval newValue) => setAndNotify(slideshowIntervalKey, newValue.toString()); + set slideshowInterval(int newValue) => setAndNotify(slideshowIntervalKey, newValue); // widget @@ -728,23 +728,61 @@ class Settings extends ChangeNotifier { // convenience methods - int? getInt(String key) => settingsStore.getInt(key); + bool? getBool(String key) { + try { + return settingsStore.getBool(key); + } catch (e) { + // ignore, could be obsolete value of different type + return null; + } + } - double? getDouble(String key) => settingsStore.getDouble(key); + int? getInt(String key) { + try { + return settingsStore.getInt(key); + } catch (e) { + // ignore, could be obsolete value of different type + return null; + } + } - String? getString(String key) => settingsStore.getString(key); + double? getDouble(String key) { + try { + return settingsStore.getDouble(key); + } catch (e) { + // ignore, could be obsolete value of different type + return null; + } + } - List<String>? getStringList(String key) => settingsStore.getStringList(key); + String? getString(String key) { + try { + return settingsStore.getString(key); + } catch (e) { + // ignore, could be obsolete value of different type + return null; + } + } - // ignore: avoid_positional_boolean_parameters - bool getBoolOrDefault(String key, bool defaultValue) => settingsStore.getBool(key) ?? defaultValue; + List<String>? getStringList(String key) { + try { + return settingsStore.getStringList(key); + } catch (e) { + // ignore, could be obsolete value of different type + return null; + } + } T getEnumOrDefault<T>(String key, T defaultValue, Iterable<T> values) { - final valueString = settingsStore.getString(key); - for (final v in values) { - if (v.toString() == valueString) { - return v; + try { + final valueString = settingsStore.getString(key); + for (final v in values) { + if (v.toString() == valueString) { + return v; + } } + } catch (e) { + // ignore, could be obsolete value of different type } return defaultValue; } @@ -758,19 +796,19 @@ class Settings extends ChangeNotifier { if (newValue == null) { settingsStore.remove(key); } else if (newValue is String) { - oldValue = settingsStore.getString(key); + oldValue = getString(key); settingsStore.setString(key, newValue); } else if (newValue is List<String>) { - oldValue = settingsStore.getStringList(key); + oldValue = getStringList(key); settingsStore.setStringList(key, newValue); } else if (newValue is int) { - oldValue = settingsStore.getInt(key); + oldValue = getInt(key); settingsStore.setInt(key, newValue); } else if (newValue is double) { - oldValue = settingsStore.getDouble(key); + oldValue = getDouble(key); settingsStore.setDouble(key, newValue); } else if (newValue is bool) { - oldValue = settingsStore.getBool(key); + oldValue = getBool(key); settingsStore.setBool(key, newValue); } if (oldValue != newValue) { @@ -797,11 +835,11 @@ class Settings extends ChangeNotifier { }); } - bool get isRotationLocked => getBoolOrDefault(platformAccelerometerRotationKey, SettingsDefaults.isRotationLocked); + bool get isRotationLocked => getBool(platformAccelerometerRotationKey) ?? SettingsDefaults.isRotationLocked; set isRotationLocked(bool newValue) => setAndNotify(platformAccelerometerRotationKey, newValue); - bool get areAnimationsRemoved => getBoolOrDefault(platformTransitionAnimationScaleKey, SettingsDefaults.areAnimationsRemoved); + bool get areAnimationsRemoved => getBool(platformTransitionAnimationScaleKey) ?? SettingsDefaults.areAnimationsRemoved; set areAnimationsRemoved(bool newValue) => setAndNotify(platformTransitionAnimationScaleKey, newValue); @@ -838,6 +876,8 @@ class Settings extends ChangeNotifier { switch (key) { case subtitleTextColorKey: case subtitleBackgroundColorKey: + case screenSaverIntervalKey: + case slideshowIntervalKey: if (newValue is int) { settingsStore.setInt(key, newValue); } else { @@ -926,10 +966,8 @@ class Settings extends ChangeNotifier { case timeToTakeActionKey: case screenSaverTransitionKey: case screenSaverVideoPlaybackKey: - case screenSaverIntervalKey: case slideshowTransitionKey: case slideshowVideoPlaybackKey: - case slideshowIntervalKey: if (newValue is String) { settingsStore.setString(key, newValue); } else { diff --git a/lib/utils/time_utils.dart b/lib/utils/time_utils.dart index 8cd65eb23..e1b398ee2 100644 --- a/lib/utils/time_utils.dart +++ b/lib/utils/time_utils.dart @@ -1,5 +1,9 @@ import 'package:flutter/foundation.dart'; +const hoursInDay = 24; +const minutesInHour = 60; +const secondsInMinute = 60; + extension ExtraDateTime on DateTime { bool isAtSameYearAs(DateTime? other) => year == other?.year; @@ -47,7 +51,7 @@ DateTime? dateTimeFromMillis(int? millis, {bool isUtc = false}) { final _unixStampMillisPattern = RegExp(r'\d{13}'); final _unixStampSecPattern = RegExp(r'\d{10}'); -final _dateYMD8Hms6Sub3Pattern = RegExp(r'(\d{8})([_-\s](\d{6})([_-\s](\d{3}))?)?'); +final _dateYMD8Hms6Sub3Pattern = RegExp(r'(\d{8})([_\s-](\d{6})([_\s-](\d{3}))?)?'); final _dateY4M2D2H2m2s2Sub3Pattern = RegExp(r'(\d{4})-(\d{1,2})-(\d{1,2})[ -](\d{1,2})[.-](\d{1,2})[.-](\d{1,2})([.-](\d{1,3})?)?'); final _dateY4M2D2Hms6Pattern = RegExp(r'(\d{4})-(\d{1,2})-(\d{1,2}) (\d{6})'); diff --git a/lib/widgets/dialogs/duration_dialog.dart b/lib/widgets/dialogs/duration_dialog.dart new file mode 100644 index 000000000..48ae0ad4c --- /dev/null +++ b/lib/widgets/dialogs/duration_dialog.dart @@ -0,0 +1,113 @@ +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/widgets/common/basic/wheel.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:flutter/material.dart'; + +class DurationDialog extends StatefulWidget { + final int initialSeconds; + + const DurationDialog({ + super.key, + required this.initialSeconds, + }); + + @override + State<DurationDialog> createState() => _DurationDialogState(); +} + +class _DurationDialogState extends State<DurationDialog> { + late ValueNotifier<int> _minutes, _seconds; + + @override + void initState() { + super.initState(); + final seconds = widget.initialSeconds; + _minutes = ValueNotifier(seconds ~/ secondsInMinute); + _seconds = ValueNotifier(seconds % secondsInMinute); + } + + @override + Widget build(BuildContext context) { + return MediaQueryDataProvider( + child: Builder(builder: (context) { + final l10n = context.l10n; + const textStyle = TextStyle(fontSize: 34); + + return AvesDialog( + scrollableContent: [ + Padding( + padding: const EdgeInsets.only(top: 16), + child: Center( + child: Table( + // even when ambient direction is RTL, time is displayed in LTR + textDirection: TextDirection.ltr, + children: [ + TableRow( + children: [ + Center(child: Text(context.l10n.durationDialogMinutes)), + const SizedBox(width: 16), + Center(child: Text(context.l10n.durationDialogSeconds)), + ], + ), + TableRow( + children: [ + Align( + alignment: Alignment.centerRight, + child: WheelSelector( + valueNotifier: _minutes, + values: List.generate(minutesInHour, (i) => i), + textStyle: textStyle, + textAlign: TextAlign.end, + ), + ), + const Padding( + padding: EdgeInsets.only(bottom: 2), + child: Text( + ':', + style: textStyle, + ), + ), + Align( + alignment: Alignment.centerLeft, + child: WheelSelector( + valueNotifier: _seconds, + values: List.generate(secondsInMinute, (i) => i), + textStyle: textStyle, + textAlign: TextAlign.end, + ), + ), + ], + ) + ], + defaultColumnWidth: const IntrinsicColumnWidth(), + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + ), + ), + ), + ], + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(MaterialLocalizations.of(context).cancelButtonLabel), + ), + AnimatedBuilder( + animation: Listenable.merge([_minutes, _seconds]), + builder: (context, child) { + final isValid = _minutes.value > 0 || _seconds.value > 0; + return TextButton( + onPressed: isValid ? () => _submit(context) : null, + child: child!, + ); + }, + child: Text(l10n.applyButtonLabel), + ), + ], + ); + }), + ); + } + + void _submit(BuildContext context) => Navigator.pop(context, _minutes.value * secondsInMinute + _seconds.value); +} diff --git a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart index c83656741..5121814f0 100644 --- a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart @@ -7,6 +7,7 @@ import 'package:aves/theme/durations.dart'; import 'package:aves/theme/format.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/theme/themes.dart'; +import 'package:aves/utils/time_utils.dart'; import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; import 'package:aves/widgets/common/basic/wheel.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -48,7 +49,7 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { super.initState(); _initSet(); _initCopyItem(); - _initShift(60); + _initShift(minutesInHour); } void _initSet() { @@ -61,8 +62,8 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { void _initShift(int initialMinutes) { final abs = initialMinutes.abs(); - _shiftHour = ValueNotifier(abs ~/ 60); - _shiftMinute = ValueNotifier(abs % 60); + _shiftHour = ValueNotifier(abs ~/ minutesInHour); + _shiftMinute = ValueNotifier(abs % minutesInHour); _shiftSign = ValueNotifier(initialMinutes.isNegative ? '-' : '+'); } @@ -198,9 +199,9 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { TableRow( children: [ const SizedBox(), - Center(child: Text(context.l10n.editEntryDateDialogHours)), - const SizedBox(), - Center(child: Text(context.l10n.editEntryDateDialogMinutes)), + Center(child: Text(context.l10n.durationDialogHours)), + const SizedBox(width: 16), + Center(child: Text(context.l10n.durationDialogMinutes)), ], ), TableRow( @@ -215,7 +216,7 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { alignment: Alignment.centerRight, child: WheelSelector( valueNotifier: _shiftHour, - values: List.generate(24, (i) => i), + values: List.generate(hoursInDay, (i) => i), textStyle: textStyle, textAlign: TextAlign.end, ), @@ -231,7 +232,7 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { alignment: Alignment.centerLeft, child: WheelSelector( valueNotifier: _shiftMinute, - values: List.generate(60, (i) => i), + values: List.generate(minutesInHour, (i) => i), textStyle: textStyle, textAlign: TextAlign.end, ), @@ -373,7 +374,7 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { case DateEditAction.extractFromTitle: return DateModifier.extractFromTitle(); case DateEditAction.shift: - final shiftTotalMinutes = (_shiftHour.value * 60 + _shiftMinute.value) * (_shiftSign.value == '+' ? 1 : -1); + final shiftTotalMinutes = (_shiftHour.value * minutesInHour + _shiftMinute.value) * (_shiftSign.value == '+' ? 1 : -1); return DateModifier.shift(_fields, shiftTotalMinutes); case DateEditAction.remove: return DateModifier.remove(_fields); diff --git a/lib/widgets/settings/common/tiles.dart b/lib/widgets/settings/common/tiles.dart index ceab95463..320b56f0e 100644 --- a/lib/widgets/settings/common/tiles.dart +++ b/lib/widgets/settings/common/tiles.dart @@ -1,7 +1,10 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; +import 'package:aves/utils/time_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_caption.dart'; import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; +import 'package:aves/widgets/dialogs/duration_dialog.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -119,3 +122,47 @@ class SettingsSelectionListTile<T extends Enum> extends StatelessWidget { ); } } + +class SettingsDurationListTile extends StatelessWidget { + final int Function(BuildContext, Settings) selector; + final ValueChanged<int> onChanged; + final String title; + + const SettingsDurationListTile({ + super.key, + required this.selector, + required this.onChanged, + required this.title, + }); + + @override + Widget build(BuildContext context) { + return Selector<Settings, int>( + selector: selector, + builder: (context, current, child) { + final currentMinutes = current ~/ secondsInMinute; + final currentSeconds = current % secondsInMinute; + + final l10n = context.l10n; + final subtitle = [ + if (currentMinutes > 0) l10n.timeMinutes(currentMinutes), + if (currentSeconds > 0) l10n.timeSeconds(currentSeconds), + ].join(' '); + + return ListTile( + title: Text(title), + subtitle: AvesCaption(subtitle), + onTap: () async { + final v = await showDialog<int>( + context: context, + builder: (context) => DurationDialog(initialSeconds: current), + ); + if (v != null) { + onChanged(v); + } + }, + ); + }, + ); + } +} diff --git a/lib/widgets/settings/screen_saver_settings_page.dart b/lib/widgets/settings/screen_saver_settings_page.dart index 217048299..b1c1d64e2 100644 --- a/lib/widgets/settings/screen_saver_settings_page.dart +++ b/lib/widgets/settings/screen_saver_settings_page.dart @@ -1,6 +1,5 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/settings/enums/enums.dart'; -import 'package:aves/model/settings/enums/slideshow_interval.dart'; import 'package:aves/model/settings/enums/slideshow_video_playback.dart'; import 'package:aves/model/settings/enums/viewer_transition.dart'; import 'package:aves/model/settings/settings.dart'; @@ -30,12 +29,12 @@ class ScreenSaverSettingsPage extends StatelessWidget { SettingsSwitchListTile( selector: (context, s) => s.screenSaverFillScreen, onChanged: (v) => settings.screenSaverFillScreen = v, - title: context.l10n.settingsSlideshowFillScreen, + title: l10n.settingsSlideshowFillScreen, ), SettingsSwitchListTile( selector: (context, s) => s.screenSaverAnimatedZoomEffect, onChanged: (v) => settings.screenSaverAnimatedZoomEffect = v, - title: context.l10n.settingsSlideshowAnimatedZoomEffect, + title: l10n.settingsSlideshowAnimatedZoomEffect, ), SettingsSelectionListTile<ViewerTransition>( values: ViewerTransition.values, @@ -44,12 +43,10 @@ class ScreenSaverSettingsPage extends StatelessWidget { onSelection: (v) => settings.screenSaverTransition = v, tileTitle: l10n.settingsSlideshowTransitionTile, ), - SettingsSelectionListTile<SlideshowInterval>( - values: SlideshowInterval.values, - getName: (context, v) => v.getName(context), + SettingsDurationListTile( selector: (context, s) => s.screenSaverInterval, - onSelection: (v) => settings.screenSaverInterval = v, - tileTitle: l10n.settingsSlideshowIntervalTile, + onChanged: (v) => settings.screenSaverInterval = v, + title: l10n.settingsSlideshowIntervalTile, ), SettingsSelectionListTile<SlideshowVideoPlayback>( values: SlideshowVideoPlayback.values, diff --git a/lib/widgets/settings/viewer/slideshow.dart b/lib/widgets/settings/viewer/slideshow.dart index 1c83f9f63..4849bf88e 100644 --- a/lib/widgets/settings/viewer/slideshow.dart +++ b/lib/widgets/settings/viewer/slideshow.dart @@ -1,5 +1,4 @@ import 'package:aves/model/settings/enums/enums.dart'; -import 'package:aves/model/settings/enums/slideshow_interval.dart'; import 'package:aves/model/settings/enums/slideshow_video_playback.dart'; import 'package:aves/model/settings/enums/viewer_transition.dart'; import 'package:aves/model/settings/settings.dart'; @@ -14,9 +13,10 @@ class ViewerSlideshowPage extends StatelessWidget { @override Widget build(BuildContext context) { + final l10n = context.l10n; return Scaffold( appBar: AppBar( - title: Text(context.l10n.settingsViewerSlideshowPageTitle), + title: Text(l10n.settingsViewerSlideshowPageTitle), ), body: SafeArea( child: ListView( @@ -24,44 +24,42 @@ class ViewerSlideshowPage extends StatelessWidget { SettingsSwitchListTile( selector: (context, s) => s.slideshowRepeat, onChanged: (v) => settings.slideshowRepeat = v, - title: context.l10n.settingsSlideshowRepeat, + title: l10n.settingsSlideshowRepeat, ), SettingsSwitchListTile( selector: (context, s) => s.slideshowShuffle, onChanged: (v) => settings.slideshowShuffle = v, - title: context.l10n.settingsSlideshowShuffle, + title: l10n.settingsSlideshowShuffle, ), SettingsSwitchListTile( selector: (context, s) => s.slideshowFillScreen, onChanged: (v) => settings.slideshowFillScreen = v, - title: context.l10n.settingsSlideshowFillScreen, + title: l10n.settingsSlideshowFillScreen, ), SettingsSwitchListTile( selector: (context, s) => s.slideshowAnimatedZoomEffect, onChanged: (v) => settings.slideshowAnimatedZoomEffect = v, - title: context.l10n.settingsSlideshowAnimatedZoomEffect, + title: l10n.settingsSlideshowAnimatedZoomEffect, ), SettingsSelectionListTile<ViewerTransition>( values: ViewerTransition.values, getName: (context, v) => v.getName(context), selector: (context, s) => s.slideshowTransition, onSelection: (v) => settings.slideshowTransition = v, - tileTitle: context.l10n.settingsSlideshowTransitionTile, + tileTitle: l10n.settingsSlideshowTransitionTile, ), - SettingsSelectionListTile<SlideshowInterval>( - values: SlideshowInterval.values, - getName: (context, v) => v.getName(context), + SettingsDurationListTile( selector: (context, s) => s.slideshowInterval, - onSelection: (v) => settings.slideshowInterval = v, - tileTitle: context.l10n.settingsSlideshowIntervalTile, + onChanged: (v) => settings.slideshowInterval = v, + title: l10n.settingsSlideshowIntervalTile, ), SettingsSelectionListTile<SlideshowVideoPlayback>( values: SlideshowVideoPlayback.values, getName: (context, v) => v.getName(context), selector: (context, s) => s.slideshowVideoPlayback, onSelection: (v) => settings.slideshowVideoPlayback = v, - tileTitle: context.l10n.settingsSlideshowVideoPlaybackTile, - dialogTitle: context.l10n.settingsSlideshowVideoPlaybackDialogTitle, + tileTitle: l10n.settingsSlideshowVideoPlaybackTile, + dialogTitle: l10n.settingsSlideshowVideoPlaybackDialogTitle, ), ], ), diff --git a/lib/widgets/viewer/screen_saver_page.dart b/lib/widgets/viewer/screen_saver_page.dart index 7389cc793..5b7b9848a 100644 --- a/lib/widgets/viewer/screen_saver_page.dart +++ b/lib/widgets/viewer/screen_saver_page.dart @@ -1,6 +1,5 @@ import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/settings/enums/enums.dart'; -import 'package:aves/model/settings/enums/slideshow_interval.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; @@ -42,7 +41,7 @@ class _ScreenSaverPageState extends State<ScreenSaverPage> with WidgetsBindingOb transition: settings.screenSaverTransition, repeat: true, autopilot: true, - autopilotInterval: settings.screenSaverInterval.getDuration(), + autopilotInterval: Duration(seconds: settings.screenSaverInterval), autopilotAnimatedZoom: settings.screenSaverAnimatedZoomEffect, ); source.stateNotifier.addListener(_onSourceStateChanged); diff --git a/lib/widgets/viewer/slideshow_page.dart b/lib/widgets/viewer/slideshow_page.dart index 2d23769a5..99acbb102 100644 --- a/lib/widgets/viewer/slideshow_page.dart +++ b/lib/widgets/viewer/slideshow_page.dart @@ -3,7 +3,6 @@ import 'package:aves/model/actions/slideshow_actions.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/settings/enums/enums.dart'; -import 'package:aves/model/settings/enums/slideshow_interval.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/theme/icons.dart'; @@ -44,7 +43,7 @@ class _SlideshowPageState extends State<SlideshowPage> { transition: settings.slideshowTransition, repeat: settings.slideshowRepeat, autopilot: true, - autopilotInterval: settings.slideshowInterval.getDuration(), + autopilotInterval: Duration(seconds: settings.slideshowInterval), autopilotAnimatedZoom: settings.slideshowAnimatedZoomEffect, ); _initSlideshowCollection(); diff --git a/untranslated.json b/untranslated.json index e5aded61f..8ac863c76 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,10 +1,12 @@ { "de": [ - "widgetOpenPageCollection" + "widgetOpenPageCollection", + "durationDialogSeconds" ], "el": [ - "widgetOpenPageCollection" + "widgetOpenPageCollection", + "durationDialogSeconds" ], "es": [ @@ -18,6 +20,7 @@ "widgetOpenPageHome", "widgetOpenPageCollection", "widgetOpenPageViewer", + "durationDialogSeconds", "viewDialogReverseSortOrder", "tileLayoutMosaic", "sortOrderNewestFirst", @@ -47,6 +50,7 @@ "widgetOpenPageHome", "widgetOpenPageCollection", "widgetOpenPageViewer", + "durationDialogSeconds", "tileLayoutMosaic", "albumGroupType", "albumMimeTypeMixed", @@ -58,7 +62,8 @@ ], "it": [ - "widgetOpenPageCollection" + "widgetOpenPageCollection", + "durationDialogSeconds" ], "ja": [ @@ -72,6 +77,7 @@ "widgetOpenPageHome", "widgetOpenPageCollection", "widgetOpenPageViewer", + "durationDialogSeconds", "viewDialogReverseSortOrder", "tileLayoutMosaic", "sortOrderNewestFirst", @@ -96,15 +102,18 @@ ], "nl": [ - "widgetOpenPageCollection" + "widgetOpenPageCollection", + "durationDialogSeconds" ], "pt": [ - "widgetOpenPageCollection" + "widgetOpenPageCollection", + "durationDialogSeconds" ], "ru": [ - "widgetOpenPageCollection" + "widgetOpenPageCollection", + "durationDialogSeconds" ], "tr": [ @@ -131,6 +140,7 @@ "widgetOpenPageHome", "widgetOpenPageCollection", "widgetOpenPageViewer", + "durationDialogSeconds", "menuActionSlideshow", "viewDialogReverseSortOrder", "tileLayoutMosaic", @@ -168,6 +178,7 @@ ], "zh": [ - "widgetOpenPageCollection" + "widgetOpenPageCollection", + "durationDialogSeconds" ] } From 5f5c848934199ad5b699e3ee79f758df0b845e27 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Wed, 19 Oct 2022 19:28:03 +0200 Subject: [PATCH 05/53] #353 fixed rendering of panoramas with inconsistent metadata --- CHANGELOG.md | 4 ++++ lib/model/panorama.dart | 39 +++++++++++++++++++++++++++++++++++++-- lib/utils/xmp_utils.dart | 2 ++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75253c28a..1b463c943 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ All notable changes to this project will be documented in this file. - Collection / Info: edit MP4 metadata (date / location / title / description / rating / tags) - Widget: option to open collection on tap +### Fixed + +- rendering of panoramas with inconsistent metadata + ## <a id="v1.7.1"></a>[v1.7.1] - 2022-10-09 ### Added diff --git a/lib/model/panorama.dart b/lib/model/panorama.dart index f798c7cf1..981908ecd 100644 --- a/lib/model/panorama.dart +++ b/lib/model/panorama.dart @@ -15,8 +15,8 @@ class PanoramaInfo { factory PanoramaInfo.fromMap(Map map) { var cLeft = map['croppedAreaLeft'] as int?; var cTop = map['croppedAreaTop'] as int?; - final cWidth = map['croppedAreaWidth'] as int?; - final cHeight = map['croppedAreaHeight'] as int?; + var cWidth = map['croppedAreaWidth'] as int?; + var cHeight = map['croppedAreaHeight'] as int?; var fWidth = map['fullPanoWidth'] as int?; var fHeight = map['fullPanoHeight'] as int?; final projectionType = map['projectionType'] as String?; @@ -27,6 +27,41 @@ class PanoramaInfo { cTop = ((fHeight - cHeight) / 2).round(); } + // handle inconsistent sizing (e.g. rotated image taken with OnePlus EB2103) + if (cWidth != null && cHeight != null && fWidth != null && fHeight != null) { + final croppedOrientation = cWidth > cHeight ? Orientation.landscape : Orientation.portrait; + final fullOrientation = fWidth > fHeight ? Orientation.landscape : Orientation.portrait; + var inconsistent = false; + if (croppedOrientation != fullOrientation) { + // inconsistent orientation + inconsistent = true; + final tmp = cHeight; + cHeight = cWidth; + cWidth = tmp; + } + + if (cWidth > fWidth) { + // inconsistent full/cropped width + inconsistent = true; + final tmp = fWidth; + fWidth = cWidth; + cWidth = tmp; + } + + if (cHeight > fHeight) { + // inconsistent full/cropped height + inconsistent = true; + final tmp = cHeight; + cHeight = fHeight; + fHeight = tmp; + } + + if (inconsistent) { + cLeft = (fWidth - cWidth) ~/ 2; + cTop = (fHeight - cHeight) ~/ 2; + } + } + Rect? croppedAreaRect; if (cLeft != null && cTop != null && cWidth != null && cHeight != null) { croppedAreaRect = Rect.fromLTWH(cLeft.toDouble(), cTop.toDouble(), cWidth.toDouble(), cHeight.toDouble()); diff --git a/lib/utils/xmp_utils.dart b/lib/utils/xmp_utils.dart index f594ea82b..481e85c54 100644 --- a/lib/utils/xmp_utils.dart +++ b/lib/utils/xmp_utils.dart @@ -49,6 +49,7 @@ class Namespaces { static const mpreg = 'http://ns.microsoft.com/photo/1.2/t/Region#'; static const mwgrs = 'http://www.metadataworkinggroup.com/schemas/regions/'; static const nga = 'https://standards.nga.gov/metadata/media/image/artobject/1.0'; + static const opMedia = 'http://ns.oneplus.com/media/1.0/'; static const panorama = 'http://ns.adobe.com/photoshop/1.0/panorama-profile'; static const panoStudio = 'http://www.tshsoft.com/xmlns'; static const pdf = 'http://ns.adobe.com/pdf/1.3/'; @@ -113,6 +114,7 @@ class Namespaces { mp: 'Microsoft Photo 1.2', mwgrs: 'Regions', nga: 'National Gallery of Art', + opMedia: 'OnePlus Media', panorama: 'Panorama', panoStudio: 'PanoramaStudio', pdf: 'PDF', From cfb05d5fce6b569d96f21551e56a4d38d90bf93a Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Wed, 19 Oct 2022 22:35:08 +0200 Subject: [PATCH 06/53] l10n by weblate (#357) Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/el/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translation: Aves/App - Main Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> --- lib/l10n/app_de.arb | 1840 +++++++++++++++++++++++++++---------------- lib/l10n/app_el.arb | 696 +++++++++++++--- lib/l10n/app_es.arb | 663 +++++++++++++--- lib/l10n/app_fr.arb | 716 ++++++++++++++--- lib/l10n/app_it.arb | 702 ++++++++++++++--- lib/l10n/app_ja.arb | 1746 ++++++++++++++++++++++++---------------- lib/l10n/app_ko.arb | 696 +++++++++++++--- lib/l10n/app_nl.arb | 696 +++++++++++++--- lib/l10n/app_tr.arb | 648 ++++++++++++--- 9 files changed, 6182 insertions(+), 2221 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index cd8831aad..0da4bca99 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -1,694 +1,1146 @@ -{ - "appName": "Aves", - "welcomeMessage": "Willkommen bei Aves", - "welcomeOptional": "Optional", - "welcomeTermsToggle": "Ich stimme den Bedingungen und Konditionen zu", - "itemCount": "{count, plural, =1{1 Element} other{{count} Elemente}}", - - "timeSeconds": "{seconds, plural, =1{1 Sekunde} other{{seconds} Sekunde}}", - "timeMinutes": "{minutes, plural, =1{1 Minute} other{{minutes} Minuten}}", - "timeDays": "{days, plural, =1{1 Tag} other{{days} Tage}}", - "focalLength": "{length} mm", - - "applyButtonLabel": "ANWENDEN", - "deleteButtonLabel": "LÖSCHEN", - "nextButtonLabel": "NÄCHSTE", - "showButtonLabel": "ANZEIGEN", - "hideButtonLabel": "VERBERGEN", - "continueButtonLabel": "WEITER", - - "cancelTooltip": "Abbrechen", - "changeTooltip": "Ändern", - "clearTooltip": "Aufräumen", - "previousTooltip": "Vorherige", - "nextTooltip": "Nächste", - "showTooltip": "Anzeigen", - "hideTooltip": "Ausblenden", - "actionRemove": "Entfernen", - "resetTooltip": "Zurücksetzen", - "saveTooltip": "Speichern", - "pickTooltip": "Wähle", - - "doubleBackExitMessage": "Zum Verlassen erneut auf „Zurück“ tippen.", - "doNotAskAgain": "Nicht noch einmal fragen", - - "sourceStateLoading": "Laden", - "sourceStateCataloguing": "Katalogisierung", - "sourceStateLocatingCountries": "Länder lokalisieren", - "sourceStateLocatingPlaces": "Lokalisierung von Orten", - - "chipActionDelete": "Löschen", - "chipActionGoToAlbumPage": "Anzeigen in Alben", - "chipActionGoToCountryPage": "Anzeigen in Ländern", - "chipActionGoToTagPage": "Zeige in Tags", - "chipActionFilterOut": "Filtern ohne", - "chipActionFilterIn": "Filtern mit", - "chipActionHide": "Ausblenden", - "chipActionPin": "Oben Anpinnen", - "chipActionUnpin": "Nicht mehr Anpinen", - "chipActionRename": "Umbenennen", - "chipActionSetCover": "Titelbild bestimmen", - "chipActionCreateAlbum": "Album erstellen", - - "entryActionCopyToClipboard": "In die Zwischenablage kopieren", - "entryActionDelete": "Löschen", - "entryActionConvert": "Konvertieren", - "entryActionExport": "Exportieren", - "entryActionInfo": "Info", - "entryActionRename": "Umbenennen", - "entryActionRestore": "Wiederherstellen", - "entryActionRotateCCW": "Drehen gegen den Uhrzeigersinn", - "entryActionRotateCW": "Drehen im Uhrzeigersinn", - "entryActionFlip": "Horizontal spiegeln", - "entryActionPrint": "Drucken", - "entryActionShare": "Teilen", - "entryActionViewSource": "Quelle anzeigen", - "entryActionShowGeoTiffOnMap": "Als Karten-Overlay anzeigen", - "entryActionConvertMotionPhotoToStillImage": "In ein Standbild umwandeln", - "entryActionViewMotionPhotoVideo": "Video öffnen", - "entryActionEdit": "Bearbeiten", - "entryActionOpen": "Öffnen mit", - "entryActionSetAs": "Einstellen als", - "entryActionOpenMap": "In der Karten-App anzeigen", - "entryActionRotateScreen": "Bildschirm rotieren", - "entryActionAddFavourite": "Zu Favoriten hinzufügen ", - "entryActionRemoveFavourite": "Aus Favoriten entfernen", - - "videoActionCaptureFrame": "Frame aufnehmen", - "videoActionMute": "Audio deaktivieren", - "videoActionUnmute": "Audio aktiveren", - "videoActionPause": "Pause", - "videoActionPlay": "Spielen", - "videoActionReplay10": "10 Sekunden rückwärts springen", - "videoActionSkip10": "10 Sekunden vorwärts springen", - "videoActionSelectStreams": "Titel auswählen", - "videoActionSetSpeed": "Wiedergabegeschwindigkeit", - "videoActionSettings": "Einstellungen", - - "slideshowActionResume": "Wiedergabe", - "slideshowActionShowInCollection": "In Sammlung anzeigen", - - "entryInfoActionEditDate": "Datum & Uhrzeit bearbeiten", - "entryInfoActionEditLocation": "Standort bearbeiten", - "entryInfoActionEditTitleDescription": "Titel und Beschreibung bearbeiten", - "entryInfoActionEditRating": "Bewertung bearbeiten", - "entryInfoActionEditTags": "Tags bearbeiten", - "entryInfoActionRemoveMetadata": "Metadaten entfernen", - - "filterBinLabel": "Papierkorb", - "filterFavouriteLabel": "Favorit", - "filterNoDateLabel": "Undatiert", - "filterNoLocationLabel": "Ungeortet", - "filterNoRatingLabel": "Nicht bewertet", - "filterNoTagLabel": "Unmarkiert", - "filterNoTitleLabel": "Unbenannt", - "filterOnThisDayLabel": "Am heutigen Tag", - "filterRecentlyAddedLabel": "Kürzlich hinzugefügt", - "filterRatingRejectedLabel": "Verworfen", - "filterTypeAnimatedLabel": "Animationen", - "filterTypeMotionPhotoLabel": "Bewegtes Foto", - "filterTypePanoramaLabel": "Panorama", - "filterTypeRawLabel": "Rohdaten", - "filterTypeSphericalVideoLabel": "360° Video", - "filterTypeGeotiffLabel": "GeoTIFF", - "filterMimeImageLabel": "Bild", - "filterMimeVideoLabel": "Video", - - "coordinateFormatDms": "GMS", - "coordinateFormatDecimal": "Dezimalgrad", - "coordinateDms": "{coordinate} {direction}", - "coordinateDmsNorth": "N", - "coordinateDmsSouth": "s", - "coordinateDmsEast": "O", - "coordinateDmsWest": "W", - - "unitSystemMetric": "Metrisch", - "unitSystemImperial": "Imperiale", - - "videoLoopModeNever": "Niemals", - "videoLoopModeShortOnly": "Nur kurze Videos", - "videoLoopModeAlways": "Immer", - - "videoControlsPlay": "Abspielen/Pausieren", - "videoControlsPlaySeek": "Abspielen/Pausieren & Sprung-Schaltflächen", - "videoControlsPlayOutside": "Mit anderem Video-Player öffnen", - "videoControlsNone": "Keine Schaltflächen", - - "mapStyleGoogleNormal": "Google Maps", - "mapStyleGoogleHybrid": "Google Maps (Hybrid)", - "mapStyleGoogleTerrain": "Google Maps (Gelände)", - "mapStyleHuaweiNormal": "Petal Maps", - "mapStyleHuaweiTerrain": "Petal Maps (Gelände)", - "mapStyleOsmHot": "Humanitäres OSM", - "mapStyleStamenToner": "Stamen Toner (SchwarzWeiß)", - "mapStyleStamenWatercolor": "Stamen Watercolor (Aquarell)", - - "nameConflictStrategyRename": "Umbenennen", - "nameConflictStrategyReplace": "Ersetzen", - "nameConflictStrategySkip": "Überspringen", - - "keepScreenOnNever": "Niemals", - "keepScreenOnViewerOnly": "Nur bei Bildbetrachtung", - "keepScreenOnAlways": "Immer", - - "accessibilityAnimationsRemove": "Verhinderung von Bildschirmeffekten", - "accessibilityAnimationsKeep": "Bildschirmeffekte beibehalten", - - "displayRefreshRatePreferHighest": "Höchste Rate", - "displayRefreshRatePreferLowest": "Niedrigste Rate", - - "videoPlaybackSkip": "Überspringen", - "videoPlaybackMuted": "Stumm abspielen", - "videoPlaybackWithSound": "Mit Ton abspielen", - - "themeBrightnessLight": "Hell", - "themeBrightnessDark": "Dunkel", - "themeBrightnessBlack": "Schwarz", - - "viewerTransitionSlide": "Dia", - "viewerTransitionParallax": "Parallaxe", - "viewerTransitionFade": "Ausblenden", - "viewerTransitionZoomIn": "Heranzoomen", - "viewerTransitionNone": "Keine", - - "wallpaperTargetHome": "Startbildschirm", - "wallpaperTargetLock": "Sperrbildschirm", - "wallpaperTargetHomeLock": "Start- und Sperrbildschirm", - - "widgetOpenPageHome": "Startseite öffnen", - "widgetOpenPageViewer": "Viewer öffnen", - - "albumTierNew": "Neu", - "albumTierPinned": "Angeheftet", - "albumTierSpecial": "Häufig verwendet", - "albumTierApps": "Apps", - "albumTierRegular": "Andere", - - "storageVolumeDescriptionFallbackPrimary": "Interner Speicher", - "storageVolumeDescriptionFallbackNonPrimary": "SD-Karte", - "rootDirectoryDescription": "Hauptverzeichnis", - "otherDirectoryDescription": "„{name}“ Verzeichnis", - "storageAccessDialogMessage": "Bitte den {directory} von „{volume}“ auf dem nächsten Bildschirm auswählen, um dieser App Zugriff darauf zu geben.", - "restrictedAccessDialogMessage": "Diese Anwendung darf keine Dateien im {directory} von „{volume}“ verändern.\n\nBitte einen vorinstallierten Dateimanager verwenden oder eine Galerie-App, um die Objekte in ein anderes Verzeichnis zu verschieben.", - "notEnoughSpaceDialogMessage": "Diese Operation benötigt {neededSize} freien Platz auf „{volume}“, um abgeschlossen zu werden, aber es ist nur noch {freeSize} übrig.", - "missingSystemFilePickerDialogMessage": "Der System-Dateiauswahldialog fehlt oder ist deaktiviert. Bitte aktivieren und es erneut versuchen.", - - "unsupportedTypeDialogMessage": "{count, plural, =1{Dieser Vorgang wird für Elemente des folgenden Typs nicht unterstützt: {types}.} other{Dieser Vorgang wird für Elemente der folgenden Typen nicht unterstützt: {types}.}}", - - "nameConflictDialogSingleSourceMessage": "Einige Dateien im Zielordner haben den gleichen Namen.", - "nameConflictDialogMultipleSourceMessage": "Einige Dateien haben denselben Namen.", - - "addShortcutDialogLabel": "Shortcut-Etikett", - "addShortcutButtonLabel": "Hinzufügen", - - "noMatchingAppDialogMessage": "Es gibt keine Anwendungen, die dies bewältigen können.", - - "binEntriesConfirmationDialogMessage": "{count, plural, =1{Dieses Element in den Papierkorb verschieben?} other{Diese {count} Elemente in den Papierkorb verschieben?}}", - "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Sicher, dass dieses Element gelöscht werden soll?} other{Sicher, dass diese {count} Elemente gelöscht werden sollen?}}", - "moveUndatedConfirmationDialogMessage": "Einige Artikel haben kein Metadaten-Datum. Ihr aktuelles Datum wird durch diesen Vorgang zurückgesetzt, es sei denn, es wurde ein Metadaten-Datum festgelegt.", - "moveUndatedConfirmationDialogSetDate": "Datum einstellen", - - "videoResumeDialogMessage": "Soll bei {time} weiter abspielt werden?", - "videoStartOverButtonLabel": "NEU BEGINNEN", - "videoResumeButtonLabel": "FORTSETZTEN", - - "setCoverDialogLatest": "Letzter Artikel", - "setCoverDialogAuto": "Auto", - "setCoverDialogCustom": "Benutzerdefiniert", - - "hideFilterConfirmationDialogMessage": "Passende Fotos und Videos werden aus Ihrer Sammlung ausgeblendet. Dies kann in den „Datenschutz“-Einstellungen wieder eingeblendet werden.\n\nSicher, dass diese ausblendet werden sollen?", - - "newAlbumDialogTitle": "Neues Album", - "newAlbumDialogNameLabel": "Album Name", - "newAlbumDialogNameLabelAlreadyExistsHelper": "Verzeichnis existiert bereits", - "newAlbumDialogStorageLabel": "Speicher:", - - "renameAlbumDialogLabel": "Neuer Name", - "renameAlbumDialogLabelAlreadyExistsHelper": "Verzeichnis existiert bereits", - - "renameEntrySetPageTitle": "Umbenennen", - "renameEntrySetPagePatternFieldLabel": "Benennungsmuster", - "renameEntrySetPageInsertTooltip": "Feld einfügen", - "renameEntrySetPagePreviewSectionTitle": "Vorschau", - - "renameProcessorCounter": "Zähler", - "renameProcessorName": "Name", - - "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Sicher, dass dieses Album und der Inhalt gelöscht werden soll?} other{Sicher, dass dieses Album und deren {count} Elemente gelöscht werden sollen?}}", - "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Sicher, dass diese Alben und deren Inhalt gelöscht werden sollen?} other{Sicher, dass diese Alben und deren {count} Elemente gelöscht werden sollen?}}", - - "exportEntryDialogFormat": "Format:", - "exportEntryDialogWidth": "Breite", - "exportEntryDialogHeight": "Höhe", - - "renameEntryDialogLabel": "Neuer Name", - - "editEntryDialogTargetFieldsHeader": "Zu ändernde Felder", - - "editEntryDateDialogTitle": "Datum & Uhrzeit", - "editEntryDateDialogSetCustom": "Datum einstellen", - "editEntryDateDialogCopyField": "Von anderem Datum kopieren", - "editEntryDateDialogCopyItem": "Von einem anderen Element kopieren", - "editEntryDateDialogExtractFromTitle": "Auszug aus dem Titel", - "editEntryDateDialogShift": "Verschieben", - "editEntryDateDialogSourceFileModifiedDate": "Änderungsdatum der Datei", - - "durationDialogHours": "Stunden", - "durationDialogMinutes": "Minuten", - - "editEntryLocationDialogTitle": "Standort", - "editEntryLocationDialogChooseOnMapTooltip": "Auf Karte wählen", - "editEntryLocationDialogLatitude": "Breitengrad", - "editEntryLocationDialogLongitude": "Längengrad", - - "locationPickerUseThisLocationButton": "Diesen Standort verwenden", - - "editEntryRatingDialogTitle": "Bewertung", - - "removeEntryMetadataDialogTitle": "Entfernung von Metadaten", - "removeEntryMetadataDialogMore": "Mehr", - - "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP ist erforderlich, um das Video innerhalb eines bewegten Bildes abzuspielen.\n\nSicher, dass es entfernt werden soll?", - "convertMotionPhotoToStillImageWarningDialogMessage": "Sicher?", - - "videoSpeedDialogLabel": "Wiedergabegeschwindigkeit", - - "videoStreamSelectionDialogVideo": "Video", - "videoStreamSelectionDialogAudio": "Audio", - "videoStreamSelectionDialogText": "Untertitel", - "videoStreamSelectionDialogOff": "Aus", - "videoStreamSelectionDialogTrack": "Spur", - "videoStreamSelectionDialogNoSelection": "Es gibt keine anderen Spuren.", - - "genericSuccessFeedback": "Erledigt!", - "genericFailureFeedback": "Gescheitert", - - "menuActionConfigureView": "Sortierung", - "menuActionSelect": "Auswahl", - "menuActionSelectAll": "Alle auswählen", - "menuActionSelectNone": "Keine auswählen", - "menuActionMap": "Karte", - "menuActionSlideshow": "Diashow", - "menuActionStats": "Statistiken", - - "viewDialogSortSectionTitle": "Sortieren", - "viewDialogGroupSectionTitle": "Gruppe", - "viewDialogLayoutSectionTitle": "Layout", - "viewDialogReverseSortOrder": "Umgekehrte Sortierung", - - "tileLayoutMosaic": "Mosaik", - "tileLayoutGrid": "Kacheln", - "tileLayoutList": "Liste", - - "coverDialogTabCover": "Titelbild", - "coverDialogTabApp": "App", - "coverDialogTabColor": "Farbe", - - "appPickDialogTitle": "Wähle App", - "appPickDialogNone": "Nichts", - - "aboutPageTitle": "Über", - "aboutLinkLicense": "Lizenz", - "aboutLinkPolicy": "Datenschutzrichtlinie", - - "aboutBugSectionTitle": "Fehlerbericht", - "aboutBugSaveLogInstruction": "Anwendungsprotokolle in einer Datei speichern", - "aboutBugCopyInfoInstruction": "Systeminformationen kopieren", - "aboutBugCopyInfoButton": "Kopieren", - "aboutBugReportInstruction": "Bericht auf GitHub mit den Protokollen und Systeminformationen", - "aboutBugReportButton": "Bericht", - - "aboutCreditsSectionTitle": "Credits", - "aboutCreditsWorldAtlas1": "Diese Anwendung verwendet eine TopoJSON-Datei von", - "aboutCreditsWorldAtlas2": "unter ISC-Lizenz.", - "aboutTranslatorsSectionTitle": "Übersetzer", - - "aboutLicensesSectionTitle": "Open-Source-Lizenzen", - "aboutLicensesBanner": "Diese Anwendung verwendet die folgenden Open-Source-Pakete und -Bibliotheken.", - "aboutLicensesAndroidLibrariesSectionTitle": "Android-Bibliotheken", - "aboutLicensesFlutterPluginsSectionTitle": "Flutter-Plugins", - "aboutLicensesFlutterPackagesSectionTitle": "Flatter-Pakete", - "aboutLicensesDartPackagesSectionTitle": "Dart-Pakete", - "aboutLicensesShowAllButtonLabel": "Alle Lizenzen anzeigen", - - "policyPageTitle": "Datenschutzrichtlinie", - - "collectionPageTitle": "Sammlung", - "collectionPickPageTitle": "Wähle", - "collectionSelectPageTitle": "Elemente auswählen", - - "collectionActionShowTitleSearch": "Titelfilter anzeigen", - "collectionActionHideTitleSearch": "Titelfilter ausblenden", - "collectionActionAddShortcut": "Verknüpfung hinzufügen", - "collectionActionEmptyBin": "Papierkorb leeren", - "collectionActionCopy": "In Album kopieren", - "collectionActionMove": "Zum Album verschieben", - "collectionActionRescan": "Neu scannen", - "collectionActionEdit": "Bearbeiten", - - "collectionSearchTitlesHintText": "Titel suchen", - - "collectionGroupAlbum": "Nach Album", - "collectionGroupMonth": "Nach Monat", - "collectionGroupDay": "Nach Tag", - "collectionGroupNone": "Nicht gruppieren", - - "sectionUnknown": "Unbekannt", - "dateToday": "Heute", - "dateYesterday": "Gestern", - "dateThisMonth": "Diesen Monat", - "collectionDeleteFailureFeedback": "{count, plural, =1{1 Element konnte nicht gelöscht werden} other{{count} Elemente konnten nicht gelöscht werden}}", - "collectionCopyFailureFeedback": "{count, plural, =1{1 Element konnte nicht kopiert werden} other{{count} Element konnten nicht kopiert werden}}", - "collectionMoveFailureFeedback": "{count, plural, =1{1 Element konnte nicht verschoben werden} other{{count} Elemente konnten nicht verschoben werden}}", - "collectionRenameFailureFeedback": "{count, plural, =1{Fehler beim Umbenennen eines Elements} other{Fehler beim Umbenennen {count} Elemente}}", - "collectionEditFailureFeedback": "{count, plural, =1{1 Element konnte nicht bearbeitet werden} other{{count} 1 Elemente konnten nicht bearbeitet werden}}", - "collectionExportFailureFeedback": "{count, plural, =1{1 Seite konnte nicht exportiert werden} other{{count} Seiten konnten nicht exportiert werden}}", - "collectionCopySuccessFeedback": "{count, plural, =1{1 Element kopier} other{ {count} Elemente kopiert}}", - "collectionMoveSuccessFeedback": "{count, plural, =1{1 Element verschoben} other{{count} Elemente verschoben}}", - "collectionRenameSuccessFeedback": "{count, plural, =1{1 Element unmebannt} other{{count} Elemente umbenannt}}", - "collectionEditSuccessFeedback": "{count, plural, =1{1 Element bearbeitet} other{ {count} Elemente bearbeitet}}", - - "collectionEmptyFavourites": "Keine Favoriten", - "collectionEmptyVideos": "Keine Videos", - "collectionEmptyImages": "Keine Bilder", - "collectionEmptyGrantAccessButtonLabel": "Zugriff gewähren", - - "collectionSelectSectionTooltip": "Bereich auswählen", - "collectionDeselectSectionTooltip": "Bereich abwählen", - - "drawerAboutButton": "Über", - "drawerSettingsButton": "Einstellungen", - "drawerCollectionAll": "Alle Bilder", - "drawerCollectionFavourites": "Favoriten", - "drawerCollectionImages": "Bilder", - "drawerCollectionVideos": "Videos", - "drawerCollectionAnimated": "Animationen", - "drawerCollectionMotionPhotos": "Bewegte Fotos", - "drawerCollectionPanoramas": "Panoramen", - "drawerCollectionRaws": "Rohdaten Fotos", - "drawerCollectionSphericalVideos": "360°-Videos", - "drawerAlbumPage": "Alben", - "drawerCountryPage": "Länder", - "drawerTagPage": "Tags", - - "sortByDate": "Nach Datum", - "sortByName": "Nach Name", - "sortByItemCount": "Nach Anzahl", - "sortBySize": "Nach Größe", - "sortByAlbumFileName": "Nach Album & Dateiname", - "sortByRating": "Nach Bewertung", - - "sortOrderNewestFirst": "Neueste zuerst", - "sortOrderOldestFirst": "Älteste zuerst", - "sortOrderAtoZ": "A zu Z", - "sortOrderZtoA": "Z zu A", - "sortOrderHighestFirst": "Höchste zuerst", - "sortOrderLowestFirst": "Niedrigste zuerst", - "sortOrderLargestFirst": "Größtes zuerst", - "sortOrderSmallestFirst": "Kleinste zuerst", - - "albumGroupTier": "Nach Ebene", - "albumGroupType": "Nach Typ", - "albumGroupVolume": "Nach Speichervolumen", - "albumGroupNone": "Nicht gruppieren", - - "albumMimeTypeMixed": "Gemischt", - - "albumPickPageTitleCopy": "In Album kopieren", - "albumPickPageTitleExport": "In Album exportieren", - "albumPickPageTitleMove": "Zum Album verschieben", - "albumPickPageTitlePick": "Album auswählen", - - "albumCamera": "Kamera", - "albumDownload": "Heruntergeladen", - "albumScreenshots": "Bildschirmfotos", - "albumScreenRecordings": "Bildschirmaufnahmen", - "albumVideoCaptures": "Video-Aufnahmen", - - "albumPageTitle": "Alben", - "albumEmpty": "Keine Alben", - "createAlbumTooltip": "Album erstellen", - "createAlbumButtonLabel": "ERSTELLE", - "newFilterBanner": "Neu", - - "countryPageTitle": "Länder", - "countryEmpty": "Keine Länder", - - "tagPageTitle": "Tags", - "tagEmpty": "Keine Tags", - - "binPageTitle": "Papierkorb", - - "searchCollectionFieldHint": "Sammlung durchsuchen", - "searchRecentSectionTitle": "Neueste", - "searchDateSectionTitle": "Datum", - "searchAlbumsSectionTitle": "Alben", - "searchCountriesSectionTitle": "Länder", - "searchPlacesSectionTitle": "Orte", - "searchTagsSectionTitle": "Tags", - "searchRatingSectionTitle": "Bewertungen", - "searchMetadataSectionTitle": "Metadaten", - - "settingsPageTitle": "Einstellungen", - "settingsSystemDefault": "System", - "settingsDefault": "Standard", - "settingsDisabled": "Deaktiviert", - - "settingsSearchFieldLabel": "Einstellungen durchsuchen", - "settingsSearchEmpty": "Keine passende Einstellung", - "settingsActionExport": "Exportieren", - "settingsActionExportDialogTitle": "Exportieren", - "settingsActionImport": "Importieren", - "settingsActionImportDialogTitle": "Importieren", - - "appExportCovers": "Titelbilder", - "appExportFavourites": "Favoriten", - "appExportSettings": "Einstellungen", - - "settingsNavigationSectionTitle": "Navigation", - "settingsHomeTile": "Startseite", - "settingsHomeDialogTitle": "Startseite", - "settingsShowBottomNavigationBar": "Untere Navigationsleiste anzeigen", - "settingsKeepScreenOnTile": "Bildschirm eingeschaltet lassen", - "settingsKeepScreenOnDialogTitle": "Bildschirm eingeschaltet lassen", - "settingsDoubleBackExit": "Zum Verlassen zweimal „zurück“ tippen", - - "settingsConfirmationTile": "Bestätigungsdialoge", - "settingsConfirmationDialogTitle": "Bestätigungsdialoge", - "settingsConfirmationBeforeDeleteItems": "Vor dem endgültigen Löschen von Elementen fragen", - "settingsConfirmationBeforeMoveToBinItems": "Vor dem Verschieben von Elementen in den Papierkorb fragen", - "settingsConfirmationBeforeMoveUndatedItems": "Vor Verschiebung von Objekten ohne Metadaten-Datum fragen", - "settingsConfirmationAfterMoveToBinItems": "Nachricht nach dem Verschieben von Elementen in den Papierkorb anzeigen", - - "settingsNavigationDrawerTile": "Menü Navigation", - "settingsNavigationDrawerEditorPageTitle": "Menü Navigation", - "settingsNavigationDrawerBanner": "Die Taste berühren und halten, um Menüpunkte zu verschieben und neu anzuordnen.", - "settingsNavigationDrawerTabTypes": "Typen", - "settingsNavigationDrawerTabAlbums": "Alben", - "settingsNavigationDrawerTabPages": "Seiten", - "settingsNavigationDrawerAddAlbum": "Album hinzufügen", - - "settingsThumbnailSectionTitle": "Vorschaubilder", - "settingsThumbnailOverlayTile": "Überlagerung", - "settingsThumbnailOverlayPageTitle": "Überlagerung", - "settingsThumbnailShowFavouriteIcon": "Favoriten-Symbol anzeigen", - "settingsThumbnailShowTagIcon": "Tag-Symbol anzeigen", - "settingsThumbnailShowLocationIcon": "Standort-Symbol anzeigen", - "settingsThumbnailShowMotionPhotoIcon": "Bewegungsfoto-Symbol anzeigen", - "settingsThumbnailShowRating": "Bewertung anzeigen", - "settingsThumbnailShowRawIcon": "Rohdaten-Symbol anzeigen", - "settingsThumbnailShowVideoDuration": "Videodauer anzeigen", - - "settingsCollectionQuickActionsTile": "Schnelle Aktionen", - "settingsCollectionQuickActionEditorPageTitle": "Schnelle Aktionen", - "settingsCollectionQuickActionTabBrowsing": "Durchsuchen", - "settingsCollectionQuickActionTabSelecting": "Auswahl", - "settingsCollectionBrowsingQuickActionEditorBanner": "Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen beim Durchsuchen von Elementen angezeigt werden.", - "settingsCollectionSelectionQuickActionEditorBanner": "Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen beim Durchsuchen von Elementen angezeigt werden.", - - "settingsViewerSectionTitle": "Anzeige", - "settingsViewerGestureSideTapNext": "Tippen auf den Bildschirmrand, um das vorheriges/nächstes Element anzuzeigen", - "settingsViewerUseCutout": "Ausgeschnittenen Bereich verwenden", - "settingsViewerMaximumBrightness": "Maximale Helligkeit", - "settingsMotionPhotoAutoPlay": "Automatische Wiedergabe bewegter Fotos", - "settingsImageBackground": "Bild-Hintergrund", - - "settingsViewerQuickActionsTile": "Schnelle Aktionen", - "settingsViewerQuickActionEditorPageTitle": "Schnelle Aktionen", - "settingsViewerQuickActionEditorBanner": "Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen im Viewer angezeigt werden sollen.", - "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Angezeigte Schaltflächen", - "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Verfügbare Schaltflächen", - "settingsViewerQuickActionEmpty": "Keine Tasten", - - "settingsViewerOverlayTile": "Überlagerung", - "settingsViewerOverlayPageTitle": "Überlagerung", - "settingsViewerShowOverlayOnOpening": "Bei Eröffnung anzeigen", - "settingsViewerShowMinimap": "Minimap anzeigen", - "settingsViewerShowInformation": "Informationen anzeigen", - "settingsViewerShowInformationSubtitle": "Titel, Datum, Ort, etc. anzeigen.", - "settingsViewerShowShootingDetails": "Aufnahmedetails anzeigen", - "settingsViewerShowOverlayThumbnails": "Vorschaubilder anzeigen", - "settingsViewerEnableOverlayBlurEffect": "Unschärfe-Effekt", - - "settingsViewerSlideshowTile": "Diashow", - "settingsViewerSlideshowPageTitle": "Diashow", - "settingsSlideshowRepeat": "Wiederholung", - "settingsSlideshowShuffle": "Mischen", - "settingsSlideshowFillScreen": "Bildschirm ausfüllen", - "settingsSlideshowAnimatedZoomEffect": "Animierter Zoomeffekt", - "settingsSlideshowTransitionTile": "Übergang", - "settingsSlideshowIntervalTile": "Intervall", - "settingsSlideshowVideoPlaybackTile": "Videowiedergabe", - "settingsSlideshowVideoPlaybackDialogTitle": "Videowiedergabe", - - "settingsVideoPageTitle": "Video-Einstellungen", - "settingsVideoSectionTitle": "Video", - "settingsVideoShowVideos": "Videos anzeigen", - "settingsVideoEnableHardwareAcceleration": "Hardware-Beschleunigung", - "settingsVideoAutoPlay": "Automatische Wiedergabe", - "settingsVideoLoopModeTile": "Schleifen-Modus", - "settingsVideoLoopModeDialogTitle": "Schleifen-Modus", - - "settingsSubtitleThemeTile": "Untertitel", - "settingsSubtitleThemePageTitle": "Untertitel", - "settingsSubtitleThemeSample": "Dies ist ein Beispiel.", - "settingsSubtitleThemeTextAlignmentTile": "Textausrichtung", - "settingsSubtitleThemeTextAlignmentDialogTitle": "Textausrichtung", - "settingsSubtitleThemeTextSize": "Textgröße", - "settingsSubtitleThemeShowOutline": "Umriss und Schatten anzeigen", - "settingsSubtitleThemeTextColor": "Textfarbe", - "settingsSubtitleThemeTextOpacity": "Opazität des Textes", - "settingsSubtitleThemeBackgroundColor": "Hintergrundfarbe", - "settingsSubtitleThemeBackgroundOpacity": "Hintergrund-Opazität", - "settingsSubtitleThemeTextAlignmentLeft": "Links", - "settingsSubtitleThemeTextAlignmentCenter": "Zentrum", - "settingsSubtitleThemeTextAlignmentRight": "Rechts", - - "settingsVideoControlsTile": "Steuerung", - "settingsVideoControlsPageTitle": "Steuerung", - "settingsVideoButtonsTile": "Schaltflächen", - "settingsVideoGestureDoubleTapTogglePlay": "Doppeltippen zum Abspielen/Pausieren", - "settingsVideoGestureSideDoubleTapSeek": "Doppeltippen auf die Bildschirmränder zum Rückwärts-/Vorwärtsspringen", - - "settingsPrivacySectionTitle": "Datenschutz", - "settingsAllowInstalledAppAccess": "Zugriff auf die Liste der installierten Apps", - "settingsAllowInstalledAppAccessSubtitle": "zur Gruppierung von Bildern nach Apps", - "settingsAllowErrorReporting": "Anonyme Fehlermeldungen zulassen", - "settingsSaveSearchHistory": "Suchverlauf speichern", - "settingsEnableBin": "Papierkorb verwenden", - "settingsEnableBinSubtitle": "Gelöschte Elemente 30 Tage lang aufbewahren", - - "settingsHiddenItemsTile": "Versteckte Elemente", - "settingsHiddenItemsPageTitle": "Versteckte Elemente", - - "settingsHiddenItemsTabFilters": "Versteckte Filter", - "settingsHiddenFiltersBanner": "Fotos und Videos, die versteckten Filtern entsprechen, werden nicht in Ihrer Sammlung angezeigt.", - "settingsHiddenFiltersEmpty": "Keine versteckten Filter", - - "settingsHiddenItemsTabPaths": "Verborgene Pfade", - "settingsHiddenPathsBanner": "Fotos und Videos, die sich in diesen Ordnern oder in einem ihrer Unterordner befinden, werden nicht in Ihrer Sammlung angezeigt.", - "addPathTooltip": "Pfad hinzufügen", - - "settingsStorageAccessTile": "Speicherzugriff", - "settingsStorageAccessPageTitle": "Speicherzugriff", - "settingsStorageAccessBanner": "Einige Verzeichnisse erfordern eine explizite Zugriffsberechtigung, um Dateien darin zu ändern. Hier können Verzeichnisse überprüft werden, auf die zuvor Zugriff gewährt wurde.", - "settingsStorageAccessEmpty": "Keine Zugangsberechtigungen", - "settingsStorageAccessRevokeTooltip": "Widerrufen", - - "settingsAccessibilitySectionTitle": "Barrierefreiheit", - "settingsRemoveAnimationsTile": "Animationen entfernen", - "settingsRemoveAnimationsDialogTitle": "Animationen entfernen", - "settingsTimeToTakeActionTile": "Zeit zum Reagieren", - - "settingsDisplaySectionTitle": "Anzeige", - "settingsThemeBrightnessTile": "Thema", - "settingsThemeBrightnessDialogTitle": "Thema", - "settingsThemeColorHighlights": "Farbige Highlights", - "settingsThemeEnableDynamicColor": "Dynamische Farben", - "settingsDisplayRefreshRateModeTile": "Bildwiederholrate der Anzeige", - "settingsDisplayRefreshRateModeDialogTitle": "Bildwiederholrate", - - "settingsLanguageSectionTitle": "Sprache & Formate", - "settingsLanguageTile": "Sprache", - "settingsLanguagePageTitle": "Sprache", - "settingsCoordinateFormatTile": "Koordinatenformat", - "settingsCoordinateFormatDialogTitle": "Koordinatenformat", - "settingsUnitSystemTile": "Einheiten", - "settingsUnitSystemDialogTitle": "Einheiten", - - "settingsScreenSaverPageTitle": "Bildschirmschoner", - - "settingsWidgetPageTitle": "Bilderrahmen", - "settingsWidgetShowOutline": "Gliederung", - "settingsWidgetOpenPage": "Beim Tippen auf das Widget", - - "settingsCollectionTile": "Sammlung", - - "statsPageTitle": "Statistiken", - "statsWithGps": "{count, plural, =1{1 Element mit Standort} other{{count} Elemente mit Standort}}", - "statsTopCountriesSectionTitle": "Top-Länder", - "statsTopPlacesSectionTitle": "Top-Plätze", - "statsTopTagsSectionTitle": "Top-Tags", - "statsTopAlbumsSectionTitle": "Top-Alben", - - "viewerOpenPanoramaButtonLabel": "ÖFFNE PANORAMA", - "viewerSetWallpaperButtonLabel": "HINTERGRUNDBILD EINSTELLEN", - "viewerErrorUnknown": "Ups!", - "viewerErrorDoesNotExist": "Die Datei existiert nicht mehr.", - - "viewerInfoPageTitle": "Info", - "viewerInfoBackToViewerTooltip": "Zurück zum Betrachter", - - "viewerInfoUnknown": "Unbekannt", - "viewerInfoLabelDescription": "Beschreibung", - "viewerInfoLabelTitle": "Titel", - "viewerInfoLabelDate": "Datum", - "viewerInfoLabelResolution": "Auflösung", - "viewerInfoLabelSize": "Größe", - "viewerInfoLabelUri": "URL", - "viewerInfoLabelPath": "Pfad", - "viewerInfoLabelDuration": "Dauer", - "viewerInfoLabelOwner": "Im Besitz von", - "viewerInfoLabelCoordinates": "Koordinaten", - "viewerInfoLabelAddress": "Adresse", - - "mapStyleDialogTitle": "Kartenstil", - "mapStyleTooltip": "Kartenstil auswählen", - "mapZoomInTooltip": "Vergrößern", - "mapZoomOutTooltip": "Verkleinern", - "mapPointNorthUpTooltip": "Richtung Norden aufwärts", - "mapAttributionOsmHot": "Kartendaten © [OpenStreetMap](https://www.openstreetmap.org/copyright) Mitwirkende - Kacheln von [HOT](https://www.hotosm.org/) - Gehostet von [OSM France](https://openstreetmap.fr/)", - "mapAttributionStamen": "Kartendaten © [OpenStreetMap](https://www.openstreetmap.org/copyright) Mitwirkende - Kacheln von [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", - "openMapPageTooltip": "Auf der Karte anzeigen", - "mapEmptyRegion": "Keine Bilder in dieser Region", - - "viewerInfoOpenEmbeddedFailureFeedback": "Eingebettete Daten konnten nicht extrahiert werden", - "viewerInfoOpenLinkText": "Öffnen", - "viewerInfoViewXmlLinkText": "Ansicht XML", - - "viewerInfoSearchFieldLabel": "Metadaten suchen", - "viewerInfoSearchEmpty": "Keine passenden Schlüssel", - "viewerInfoSearchSuggestionDate": "Datum & Uhrzeit", - "viewerInfoSearchSuggestionDescription": "Beschreibung", - "viewerInfoSearchSuggestionDimensions": "Abmessungen", - "viewerInfoSearchSuggestionResolution": "Auflösung", - "viewerInfoSearchSuggestionRights": "Rechte", - - "wallpaperUseScrollEffect": "Scroll-Effekt auf dem Startbildschirm verwenden", - - "tagEditorPageTitle": "Tags bearbeiten", - "tagEditorPageNewTagFieldLabel": "Neuer Tag", - "tagEditorPageAddTagTooltip": "Tag hinzufügen", - "tagEditorSectionRecent": "Neueste", - - "panoramaEnableSensorControl": "Aktivieren der Sensorsteuerung", - "panoramaDisableSensorControl": "Sensorsteuerung deaktivieren", - - "sourceViewerPageTitle": "Quelle", - - "filePickerShowHiddenFiles": "Versteckte Dateien anzeigen", - "filePickerDoNotShowHiddenFiles": "Versteckte Dateien nicht anzeigen", - "filePickerOpenFrom": "Öffnen von", - "filePickerNoItems": "Keine Elemente", - "filePickerUseThisFolder": "Diesen Ordner verwenden" -} +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Willkommen bei Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Optional", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Ich stimme den Bedingungen und Konditionen zu", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, =1{1 Element} other{{count} Elemente}}", + "@itemCount": {}, + "timeSeconds": "{seconds, plural, =1{1 Sekunde} other{{seconds} Sekunde}}", + "@timeSeconds": {}, + "timeMinutes": "{minutes, plural, =1{1 Minute} other{{minutes} Minuten}}", + "@timeMinutes": {}, + "timeDays": "{days, plural, =1{1 Tag} other{{days} Tage}}", + "@timeDays": {}, + "focalLength": "{length} mm", + "@focalLength": {}, + "applyButtonLabel": "ANWENDEN", + "@applyButtonLabel": {}, + "deleteButtonLabel": "LÖSCHEN", + "@deleteButtonLabel": {}, + "nextButtonLabel": "NÄCHSTE", + "@nextButtonLabel": {}, + "showButtonLabel": "ANZEIGEN", + "@showButtonLabel": {}, + "hideButtonLabel": "VERBERGEN", + "@hideButtonLabel": {}, + "continueButtonLabel": "WEITER", + "@continueButtonLabel": {}, + "cancelTooltip": "Abbrechen", + "@cancelTooltip": {}, + "changeTooltip": "Ändern", + "@changeTooltip": {}, + "clearTooltip": "Aufräumen", + "@clearTooltip": {}, + "previousTooltip": "Vorherige", + "@previousTooltip": {}, + "nextTooltip": "Nächste", + "@nextTooltip": {}, + "showTooltip": "Anzeigen", + "@showTooltip": {}, + "hideTooltip": "Ausblenden", + "@hideTooltip": {}, + "actionRemove": "Entfernen", + "@actionRemove": {}, + "resetTooltip": "Zurücksetzen", + "@resetTooltip": {}, + "saveTooltip": "Speichern", + "@saveTooltip": {}, + "pickTooltip": "Wähle", + "@pickTooltip": {}, + "doubleBackExitMessage": "Zum Verlassen erneut auf „Zurück“ tippen.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Nicht noch einmal fragen", + "@doNotAskAgain": {}, + "sourceStateLoading": "Laden", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Katalogisierung", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Länder lokalisieren", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Lokalisierung von Orten", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Löschen", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Anzeigen in Alben", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Anzeigen in Ländern", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Zeige in Tags", + "@chipActionGoToTagPage": {}, + "chipActionFilterOut": "Filtern ohne", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Filtern mit", + "@chipActionFilterIn": {}, + "chipActionHide": "Ausblenden", + "@chipActionHide": {}, + "chipActionPin": "Oben Anpinnen", + "@chipActionPin": {}, + "chipActionUnpin": "Nicht mehr Anpinen", + "@chipActionUnpin": {}, + "chipActionRename": "Umbenennen", + "@chipActionRename": {}, + "chipActionSetCover": "Titelbild bestimmen", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "Album erstellen", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "In die Zwischenablage kopieren", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "Löschen", + "@entryActionDelete": {}, + "entryActionConvert": "Konvertieren", + "@entryActionConvert": {}, + "entryActionExport": "Exportieren", + "@entryActionExport": {}, + "entryActionInfo": "Info", + "@entryActionInfo": {}, + "entryActionRename": "Umbenennen", + "@entryActionRename": {}, + "entryActionRestore": "Wiederherstellen", + "@entryActionRestore": {}, + "entryActionRotateCCW": "Drehen gegen den Uhrzeigersinn", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Drehen im Uhrzeigersinn", + "@entryActionRotateCW": {}, + "entryActionFlip": "Horizontal spiegeln", + "@entryActionFlip": {}, + "entryActionPrint": "Drucken", + "@entryActionPrint": {}, + "entryActionShare": "Teilen", + "@entryActionShare": {}, + "entryActionViewSource": "Quelle anzeigen", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Als Karten-Overlay anzeigen", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "In ein Standbild umwandeln", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Video öffnen", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Bearbeiten", + "@entryActionEdit": {}, + "entryActionOpen": "Öffnen mit", + "@entryActionOpen": {}, + "entryActionSetAs": "Einstellen als", + "@entryActionSetAs": {}, + "entryActionOpenMap": "In der Karten-App anzeigen", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Bildschirm rotieren", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Zu Favoriten hinzufügen", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Aus Favoriten entfernen", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Frame aufnehmen", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Audio deaktivieren", + "@videoActionMute": {}, + "videoActionUnmute": "Audio aktiveren", + "@videoActionUnmute": {}, + "videoActionPause": "Pause", + "@videoActionPause": {}, + "videoActionPlay": "Spielen", + "@videoActionPlay": {}, + "videoActionReplay10": "10 Sekunden rückwärts springen", + "@videoActionReplay10": {}, + "videoActionSkip10": "10 Sekunden vorwärts springen", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Titel auswählen", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Wiedergabegeschwindigkeit", + "@videoActionSetSpeed": {}, + "videoActionSettings": "Einstellungen", + "@videoActionSettings": {}, + "slideshowActionResume": "Wiedergabe", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "In Sammlung anzeigen", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Datum & Uhrzeit bearbeiten", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Standort bearbeiten", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Titel und Beschreibung bearbeiten", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Bewertung bearbeiten", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Tags bearbeiten", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Metadaten entfernen", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Papierkorb", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Favorit", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Undatiert", + "@filterNoDateLabel": {}, + "filterNoLocationLabel": "Ungeortet", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Nicht bewertet", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Unmarkiert", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Unbenannt", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Am heutigen Tag", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Kürzlich hinzugefügt", + "@filterRecentlyAddedLabel": {}, + "filterRatingRejectedLabel": "Verworfen", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animationen", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "Bewegtes Foto", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Rohdaten", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° Video", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "Bild", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "GMS", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Dezimalgrad", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "s", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "O", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "W", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Metrisch", + "@unitSystemMetric": {}, + "unitSystemImperial": "Imperiale", + "@unitSystemImperial": {}, + "videoLoopModeNever": "Niemals", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "Nur kurze Videos", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "Immer", + "@videoLoopModeAlways": {}, + "videoControlsPlay": "Abspielen/Pausieren", + "@videoControlsPlay": {}, + "videoControlsPlaySeek": "Abspielen/Pausieren & Sprung-Schaltflächen", + "@videoControlsPlaySeek": {}, + "videoControlsPlayOutside": "Mit anderem Video-Player öffnen", + "@videoControlsPlayOutside": {}, + "videoControlsNone": "Keine Schaltflächen", + "@videoControlsNone": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps (Gelände)", + "@mapStyleGoogleTerrain": {}, + "mapStyleHuaweiNormal": "Petal Maps", + "@mapStyleHuaweiNormal": {}, + "mapStyleHuaweiTerrain": "Petal Maps (Gelände)", + "@mapStyleHuaweiTerrain": {}, + "mapStyleOsmHot": "Humanitäres OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenToner": "Stamen Toner (SchwarzWeiß)", + "@mapStyleStamenToner": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (Aquarell)", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Umbenennen", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Ersetzen", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Überspringen", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Niemals", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Nur bei Bildbetrachtung", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Immer", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "Verhinderung von Bildschirmeffekten", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Bildschirmeffekte beibehalten", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "Höchste Rate", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Niedrigste Rate", + "@displayRefreshRatePreferLowest": {}, + "videoPlaybackSkip": "Überspringen", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Stumm abspielen", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Mit Ton abspielen", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "Hell", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "Dunkel", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "Schwarz", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "Dia", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Parallaxe", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "Ausblenden", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "Heranzoomen", + "@viewerTransitionZoomIn": {}, + "viewerTransitionNone": "Keine", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Startbildschirm", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "Sperrbildschirm", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "Start- und Sperrbildschirm", + "@wallpaperTargetHomeLock": {}, + "widgetOpenPageHome": "Startseite öffnen", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Viewer öffnen", + "@widgetOpenPageViewer": {}, + "albumTierNew": "Neu", + "@albumTierNew": {}, + "albumTierPinned": "Angeheftet", + "@albumTierPinned": {}, + "albumTierSpecial": "Häufig verwendet", + "@albumTierSpecial": {}, + "albumTierApps": "Apps", + "@albumTierApps": {}, + "albumTierRegular": "Andere", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "Interner Speicher", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD-Karte", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "Hauptverzeichnis", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "„{name}“ Verzeichnis", + "@otherDirectoryDescription": {}, + "storageAccessDialogMessage": "Bitte den {directory} von „{volume}“ auf dem nächsten Bildschirm auswählen, um dieser App Zugriff darauf zu geben.", + "@storageAccessDialogMessage": {}, + "restrictedAccessDialogMessage": "Diese Anwendung darf keine Dateien im {directory} von „{volume}“ verändern.\n\nBitte einen vorinstallierten Dateimanager verwenden oder eine Galerie-App, um die Objekte in ein anderes Verzeichnis zu verschieben.", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Diese Operation benötigt {neededSize} freien Platz auf „{volume}“, um abgeschlossen zu werden, aber es ist nur noch {freeSize} übrig.", + "@notEnoughSpaceDialogMessage": {}, + "missingSystemFilePickerDialogMessage": "Der System-Dateiauswahldialog fehlt oder ist deaktiviert. Bitte aktivieren und es erneut versuchen.", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, =1{Dieser Vorgang wird für Elemente des folgenden Typs nicht unterstützt: {types}.} other{Dieser Vorgang wird für Elemente der folgenden Typen nicht unterstützt: {types}.}}", + "@unsupportedTypeDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "Einige Dateien im Zielordner haben den gleichen Namen.", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "Einige Dateien haben denselben Namen.", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "Shortcut-Etikett", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "Hinzufügen", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "Es gibt keine Anwendungen, die dies bewältigen können.", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Dieses Element in den Papierkorb verschieben?} other{Diese {count} Elemente in den Papierkorb verschieben?}}", + "@binEntriesConfirmationDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Sicher, dass dieses Element gelöscht werden soll?} other{Sicher, dass diese {count} Elemente gelöscht werden sollen?}}", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Einige Artikel haben kein Metadaten-Datum. Ihr aktuelles Datum wird durch diesen Vorgang zurückgesetzt, es sei denn, es wurde ein Metadaten-Datum festgelegt.", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Datum einstellen", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "Soll bei {time} weiter abspielt werden?", + "@videoResumeDialogMessage": {}, + "videoStartOverButtonLabel": "NEU BEGINNEN", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "FORTSETZTEN", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "Letzter Artikel", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "Benutzerdefiniert", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Passende Fotos und Videos werden aus Ihrer Sammlung ausgeblendet. Dies kann in den „Datenschutz“-Einstellungen wieder eingeblendet werden.\n\nSicher, dass diese ausblendet werden sollen?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "Neues Album", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "Album Name", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Verzeichnis existiert bereits", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "Speicher:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "Neuer Name", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Verzeichnis existiert bereits", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "Umbenennen", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "Benennungsmuster", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "Feld einfügen", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "Vorschau", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Zähler", + "@renameProcessorCounter": {}, + "renameProcessorName": "Name", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Sicher, dass dieses Album und der Inhalt gelöscht werden soll?} other{Sicher, dass dieses Album und deren {count} Elemente gelöscht werden sollen?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Sicher, dass diese Alben und deren Inhalt gelöscht werden sollen?} other{Sicher, dass diese Alben und deren {count} Elemente gelöscht werden sollen?}}", + "@deleteMultiAlbumConfirmationDialogMessage": {}, + "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "Breite", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "Höhe", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "Neuer Name", + "@renameEntryDialogLabel": {}, + "editEntryDialogTargetFieldsHeader": "Zu ändernde Felder", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "Datum & Uhrzeit", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Datum einstellen", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Von anderem Datum kopieren", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogCopyItem": "Von einem anderen Element kopieren", + "@editEntryDateDialogCopyItem": {}, + "editEntryDateDialogExtractFromTitle": "Auszug aus dem Titel", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "Verschieben", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "Änderungsdatum der Datei", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "Stunden", + "@durationDialogHours": {}, + "durationDialogMinutes": "Minuten", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "Standort", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMapTooltip": "Auf Karte wählen", + "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogLatitude": "Breitengrad", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "Längengrad", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "Diesen Standort verwenden", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "Bewertung", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Entfernung von Metadaten", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "Mehr", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP ist erforderlich, um das Video innerhalb eines bewegten Bildes abzuspielen.\n\nSicher, dass es entfernt werden soll?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "convertMotionPhotoToStillImageWarningDialogMessage": "Sicher?", + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Wiedergabegeschwindigkeit", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "Untertitel", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "Aus", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "Spur", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "Es gibt keine anderen Spuren.", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "Erledigt!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Gescheitert", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "Sortierung", + "@menuActionConfigureView": {}, + "menuActionSelect": "Auswahl", + "@menuActionSelect": {}, + "menuActionSelectAll": "Alle auswählen", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "Keine auswählen", + "@menuActionSelectNone": {}, + "menuActionMap": "Karte", + "@menuActionMap": {}, + "menuActionSlideshow": "Diashow", + "@menuActionSlideshow": {}, + "menuActionStats": "Statistiken", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "Sortieren", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "Gruppe", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "Layout", + "@viewDialogLayoutSectionTitle": {}, + "viewDialogReverseSortOrder": "Umgekehrte Sortierung", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "Mosaik", + "@tileLayoutMosaic": {}, + "tileLayoutGrid": "Kacheln", + "@tileLayoutGrid": {}, + "tileLayoutList": "Liste", + "@tileLayoutList": {}, + "coverDialogTabCover": "Titelbild", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "App", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "Farbe", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "Wähle App", + "@appPickDialogTitle": {}, + "appPickDialogNone": "Nichts", + "@appPickDialogNone": {}, + "aboutPageTitle": "Über", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Lizenz", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Datenschutzrichtlinie", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "Fehlerbericht", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "Anwendungsprotokolle in einer Datei speichern", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "Systeminformationen kopieren", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "Kopieren", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Bericht auf GitHub mit den Protokollen und Systeminformationen", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "Bericht", + "@aboutBugReportButton": {}, + "aboutCreditsSectionTitle": "Credits", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Diese Anwendung verwendet eine TopoJSON-Datei von", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "unter ISC-Lizenz.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Übersetzer", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Open-Source-Lizenzen", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "Diese Anwendung verwendet die folgenden Open-Source-Pakete und -Bibliotheken.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android-Bibliotheken", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter-Plugins", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flatter-Pakete", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart-Pakete", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Alle Lizenzen anzeigen", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "Datenschutzrichtlinie", + "@policyPageTitle": {}, + "collectionPageTitle": "Sammlung", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "Wähle", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "Elemente auswählen", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "Titelfilter anzeigen", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Titelfilter ausblenden", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "Verknüpfung hinzufügen", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "Papierkorb leeren", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "In Album kopieren", + "@collectionActionCopy": {}, + "collectionActionMove": "Zum Album verschieben", + "@collectionActionMove": {}, + "collectionActionRescan": "Neu scannen", + "@collectionActionRescan": {}, + "collectionActionEdit": "Bearbeiten", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "Titel suchen", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "Nach Album", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "Nach Monat", + "@collectionGroupMonth": {}, + "collectionGroupDay": "Nach Tag", + "@collectionGroupDay": {}, + "collectionGroupNone": "Nicht gruppieren", + "@collectionGroupNone": {}, + "sectionUnknown": "Unbekannt", + "@sectionUnknown": {}, + "dateToday": "Heute", + "@dateToday": {}, + "dateYesterday": "Gestern", + "@dateYesterday": {}, + "dateThisMonth": "Diesen Monat", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, =1{1 Element konnte nicht gelöscht werden} other{{count} Elemente konnten nicht gelöscht werden}}", + "@collectionDeleteFailureFeedback": {}, + "collectionCopyFailureFeedback": "{count, plural, =1{1 Element konnte nicht kopiert werden} other{{count} Element konnten nicht kopiert werden}}", + "@collectionCopyFailureFeedback": {}, + "collectionMoveFailureFeedback": "{count, plural, =1{1 Element konnte nicht verschoben werden} other{{count} Elemente konnten nicht verschoben werden}}", + "@collectionMoveFailureFeedback": {}, + "collectionRenameFailureFeedback": "{count, plural, =1{Fehler beim Umbenennen eines Elements} other{Fehler beim Umbenennen {count} Elemente}}", + "@collectionRenameFailureFeedback": {}, + "collectionEditFailureFeedback": "{count, plural, =1{1 Element konnte nicht bearbeitet werden} other{{count} 1 Elemente konnten nicht bearbeitet werden}}", + "@collectionEditFailureFeedback": {}, + "collectionExportFailureFeedback": "{count, plural, =1{1 Seite konnte nicht exportiert werden} other{{count} Seiten konnten nicht exportiert werden}}", + "@collectionExportFailureFeedback": {}, + "collectionCopySuccessFeedback": "{count, plural, =1{1 Element kopier} other{ {count} Elemente kopiert}}", + "@collectionCopySuccessFeedback": {}, + "collectionMoveSuccessFeedback": "{count, plural, =1{1 Element verschoben} other{{count} Elemente verschoben}}", + "@collectionMoveSuccessFeedback": {}, + "collectionRenameSuccessFeedback": "{count, plural, =1{1 Element unmebannt} other{{count} Elemente umbenannt}}", + "@collectionRenameSuccessFeedback": {}, + "collectionEditSuccessFeedback": "{count, plural, =1{1 Element bearbeitet} other{ {count} Elemente bearbeitet}}", + "@collectionEditSuccessFeedback": {}, + "collectionEmptyFavourites": "Keine Favoriten", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "Keine Videos", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "Keine Bilder", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "Zugriff gewähren", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "Bereich auswählen", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "Bereich abwählen", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "Über", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Einstellungen", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "Alle Bilder", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "Favoriten", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "Bilder", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "Videos", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "Animationen", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "Bewegte Fotos", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "Panoramen", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Rohdaten Fotos", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360°-Videos", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "Alben", + "@drawerAlbumPage": {}, + "drawerCountryPage": "Länder", + "@drawerCountryPage": {}, + "drawerTagPage": "Tags", + "@drawerTagPage": {}, + "sortByDate": "Nach Datum", + "@sortByDate": {}, + "sortByName": "Nach Name", + "@sortByName": {}, + "sortByItemCount": "Nach Anzahl", + "@sortByItemCount": {}, + "sortBySize": "Nach Größe", + "@sortBySize": {}, + "sortByAlbumFileName": "Nach Album & Dateiname", + "@sortByAlbumFileName": {}, + "sortByRating": "Nach Bewertung", + "@sortByRating": {}, + "sortOrderNewestFirst": "Neueste zuerst", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Älteste zuerst", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "A zu Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Z zu A", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Höchste zuerst", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Niedrigste zuerst", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Größtes zuerst", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "Kleinste zuerst", + "@sortOrderSmallestFirst": {}, + "albumGroupTier": "Nach Ebene", + "@albumGroupTier": {}, + "albumGroupType": "Nach Typ", + "@albumGroupType": {}, + "albumGroupVolume": "Nach Speichervolumen", + "@albumGroupVolume": {}, + "albumGroupNone": "Nicht gruppieren", + "@albumGroupNone": {}, + "albumMimeTypeMixed": "Gemischt", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "In Album kopieren", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "In Album exportieren", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Zum Album verschieben", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "Album auswählen", + "@albumPickPageTitlePick": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumDownload": "Heruntergeladen", + "@albumDownload": {}, + "albumScreenshots": "Bildschirmfotos", + "@albumScreenshots": {}, + "albumScreenRecordings": "Bildschirmaufnahmen", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Video-Aufnahmen", + "@albumVideoCaptures": {}, + "albumPageTitle": "Alben", + "@albumPageTitle": {}, + "albumEmpty": "Keine Alben", + "@albumEmpty": {}, + "createAlbumTooltip": "Album erstellen", + "@createAlbumTooltip": {}, + "createAlbumButtonLabel": "ERSTELLE", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "Neu", + "@newFilterBanner": {}, + "countryPageTitle": "Länder", + "@countryPageTitle": {}, + "countryEmpty": "Keine Länder", + "@countryEmpty": {}, + "tagPageTitle": "Tags", + "@tagPageTitle": {}, + "tagEmpty": "Keine Tags", + "@tagEmpty": {}, + "binPageTitle": "Papierkorb", + "@binPageTitle": {}, + "searchCollectionFieldHint": "Sammlung durchsuchen", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "Neueste", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "Datum", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "Alben", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "Länder", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "Orte", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Tags", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "Bewertungen", + "@searchRatingSectionTitle": {}, + "searchMetadataSectionTitle": "Metadaten", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Einstellungen", + "@settingsPageTitle": {}, + "settingsSystemDefault": "System", + "@settingsSystemDefault": {}, + "settingsDefault": "Standard", + "@settingsDefault": {}, + "settingsDisabled": "Deaktiviert", + "@settingsDisabled": {}, + "settingsSearchFieldLabel": "Einstellungen durchsuchen", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Keine passende Einstellung", + "@settingsSearchEmpty": {}, + "settingsActionExport": "Exportieren", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "Exportieren", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "Importieren", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Importieren", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "Titelbilder", + "@appExportCovers": {}, + "appExportFavourites": "Favoriten", + "@appExportFavourites": {}, + "appExportSettings": "Einstellungen", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "Navigation", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Startseite", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Startseite", + "@settingsHomeDialogTitle": {}, + "settingsShowBottomNavigationBar": "Untere Navigationsleiste anzeigen", + "@settingsShowBottomNavigationBar": {}, + "settingsKeepScreenOnTile": "Bildschirm eingeschaltet lassen", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Bildschirm eingeschaltet lassen", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Zum Verlassen zweimal „zurück“ tippen", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "Bestätigungsdialoge", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "Bestätigungsdialoge", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "Vor dem endgültigen Löschen von Elementen fragen", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "Vor dem Verschieben von Elementen in den Papierkorb fragen", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "Vor Verschiebung von Objekten ohne Metadaten-Datum fragen", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsConfirmationAfterMoveToBinItems": "Nachricht nach dem Verschieben von Elementen in den Papierkorb anzeigen", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsNavigationDrawerTile": "Menü Navigation", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Menü Navigation", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "Die Taste berühren und halten, um Menüpunkte zu verschieben und neu anzuordnen.", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "Typen", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "Alben", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Seiten", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "Album hinzufügen", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "Vorschaubilder", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "Überlagerung", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "Überlagerung", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "Favoriten-Symbol anzeigen", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "Tag-Symbol anzeigen", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "Standort-Symbol anzeigen", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "Bewegungsfoto-Symbol anzeigen", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "Bewertung anzeigen", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Rohdaten-Symbol anzeigen", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "Videodauer anzeigen", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "Schnelle Aktionen", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "Schnelle Aktionen", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "Durchsuchen", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "Auswahl", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen beim Durchsuchen von Elementen angezeigt werden.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen beim Durchsuchen von Elementen angezeigt werden.", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerSectionTitle": "Anzeige", + "@settingsViewerSectionTitle": {}, + "settingsViewerGestureSideTapNext": "Tippen auf den Bildschirmrand, um das vorheriges/nächstes Element anzuzeigen", + "@settingsViewerGestureSideTapNext": {}, + "settingsViewerUseCutout": "Ausgeschnittenen Bereich verwenden", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "Maximale Helligkeit", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "Automatische Wiedergabe bewegter Fotos", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "Bild-Hintergrund", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "Schnelle Aktionen", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "Schnelle Aktionen", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "Die Taste gedrückt halten, um die Schaltflächen zu bewegen und auszuwählen, welche Aktionen im Viewer angezeigt werden sollen.", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Angezeigte Schaltflächen", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Verfügbare Schaltflächen", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "Keine Tasten", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "Überlagerung", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "Überlagerung", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "Bei Eröffnung anzeigen", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "Minimap anzeigen", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "Informationen anzeigen", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "Titel, Datum, Ort, etc. anzeigen.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "Aufnahmedetails anzeigen", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "Vorschaubilder anzeigen", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "Unschärfe-Effekt", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "Diashow", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Diashow", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Wiederholung", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Mischen", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "Bildschirm ausfüllen", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowAnimatedZoomEffect": "Animierter Zoomeffekt", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Übergang", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "Intervall", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "Videowiedergabe", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Videowiedergabe", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "Video-Einstellungen", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "Videos anzeigen", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "Hardware-Beschleunigung", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "Automatische Wiedergabe", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "Schleifen-Modus", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Schleifen-Modus", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "Untertitel", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "Untertitel", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "Dies ist ein Beispiel.", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "Textausrichtung", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Textausrichtung", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextSize": "Textgröße", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "Umriss und Schatten anzeigen", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "Textfarbe", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Opazität des Textes", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Hintergrundfarbe", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Hintergrund-Opazität", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Links", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Zentrum", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "Rechts", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "Steuerung", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "Steuerung", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "Schaltflächen", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Doppeltippen zum Abspielen/Pausieren", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "Doppeltippen auf die Bildschirmränder zum Rückwärts-/Vorwärtsspringen", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsPrivacySectionTitle": "Datenschutz", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "Zugriff auf die Liste der installierten Apps", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "zur Gruppierung von Bildern nach Apps", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Anonyme Fehlermeldungen zulassen", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "Suchverlauf speichern", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "Papierkorb verwenden", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "Gelöschte Elemente 30 Tage lang aufbewahren", + "@settingsEnableBinSubtitle": {}, + "settingsHiddenItemsTile": "Versteckte Elemente", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Versteckte Elemente", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenItemsTabFilters": "Versteckte Filter", + "@settingsHiddenItemsTabFilters": {}, + "settingsHiddenFiltersBanner": "Fotos und Videos, die versteckten Filtern entsprechen, werden nicht in Ihrer Sammlung angezeigt.", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "Keine versteckten Filter", + "@settingsHiddenFiltersEmpty": {}, + "settingsHiddenItemsTabPaths": "Verborgene Pfade", + "@settingsHiddenItemsTabPaths": {}, + "settingsHiddenPathsBanner": "Fotos und Videos, die sich in diesen Ordnern oder in einem ihrer Unterordner befinden, werden nicht in Ihrer Sammlung angezeigt.", + "@settingsHiddenPathsBanner": {}, + "addPathTooltip": "Pfad hinzufügen", + "@addPathTooltip": {}, + "settingsStorageAccessTile": "Speicherzugriff", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "Speicherzugriff", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "Einige Verzeichnisse erfordern eine explizite Zugriffsberechtigung, um Dateien darin zu ändern. Hier können Verzeichnisse überprüft werden, auf die zuvor Zugriff gewährt wurde.", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "Keine Zugangsberechtigungen", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "Widerrufen", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "Barrierefreiheit", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "Animationen entfernen", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "Animationen entfernen", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "Zeit zum Reagieren", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "Anzeige", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Thema", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "Thema", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "Farbige Highlights", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "Dynamische Farben", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "Bildwiederholrate der Anzeige", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "Bildwiederholrate", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "Sprache & Formate", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "Sprache", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Sprache", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "Koordinatenformat", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "Koordinatenformat", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Einheiten", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "Einheiten", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "Bildschirmschoner", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "Bilderrahmen", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Gliederung", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "Beim Tippen auf das Widget", + "@settingsWidgetOpenPage": {}, + "settingsCollectionTile": "Sammlung", + "@settingsCollectionTile": {}, + "statsPageTitle": "Statistiken", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, =1{1 Element mit Standort} other{{count} Elemente mit Standort}}", + "@statsWithGps": {}, + "statsTopCountriesSectionTitle": "Top-Länder", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Top-Plätze", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Top-Tags", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Top-Alben", + "@statsTopAlbumsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "ÖFFNE PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "HINTERGRUNDBILD EINSTELLEN", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Ups!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "Die Datei existiert nicht mehr.", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "Info", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "Zurück zum Betrachter", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "Unbekannt", + "@viewerInfoUnknown": {}, + "viewerInfoLabelDescription": "Beschreibung", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Titel", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "Datum", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "Auflösung", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Größe", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URL", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Pfad", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Dauer", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Im Besitz von", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Koordinaten", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Adresse", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "Kartenstil", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Kartenstil auswählen", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Vergrößern", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "Verkleinern", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "Richtung Norden aufwärts", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmHot": "Kartendaten © [OpenStreetMap](https://www.openstreetmap.org/copyright) Mitwirkende - Kacheln von [HOT](https://www.hotosm.org/) - Gehostet von [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "Kartendaten © [OpenStreetMap](https://www.openstreetmap.org/copyright) Mitwirkende - Kacheln von [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "Auf der Karte anzeigen", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "Keine Bilder in dieser Region", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "Eingebettete Daten konnten nicht extrahiert werden", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "Öffnen", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Ansicht XML", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "Metadaten suchen", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "Keine passenden Schlüssel", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "Datum & Uhrzeit", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "Beschreibung", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "Abmessungen", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "Auflösung", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Rechte", + "@viewerInfoSearchSuggestionRights": {}, + "wallpaperUseScrollEffect": "Scroll-Effekt auf dem Startbildschirm verwenden", + "@wallpaperUseScrollEffect": {}, + "tagEditorPageTitle": "Tags bearbeiten", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "Neuer Tag", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "Tag hinzufügen", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "Neueste", + "@tagEditorSectionRecent": {}, + "panoramaEnableSensorControl": "Aktivieren der Sensorsteuerung", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Sensorsteuerung deaktivieren", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "Quelle", + "@sourceViewerPageTitle": {}, + "filePickerShowHiddenFiles": "Versteckte Dateien anzeigen", + "@filePickerShowHiddenFiles": {}, + "filePickerDoNotShowHiddenFiles": "Versteckte Dateien nicht anzeigen", + "@filePickerDoNotShowHiddenFiles": {}, + "filePickerOpenFrom": "Öffnen von", + "@filePickerOpenFrom": {}, + "filePickerNoItems": "Keine Elemente", + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "Diesen Ordner verwenden", + "@filePickerUseThisFolder": {} +} diff --git a/lib/l10n/app_el.arb b/lib/l10n/app_el.arb index 4a12ea214..c7b2619b3 100644 --- a/lib/l10n/app_el.arb +++ b/lib/l10n/app_el.arb @@ -1,694 +1,1146 @@ { "appName": "Aves", + "@appName": {}, "welcomeMessage": "Καλωσορίσατε στην εφαρμογή Aves", + "@welcomeMessage": {}, "welcomeOptional": "Προαιρετικό", + "@welcomeOptional": {}, "welcomeTermsToggle": "Συμφωνώ με τους όρους και τις προυποθέσεις", + "@welcomeTermsToggle": {}, "itemCount": "{count, plural, =1{1 στοιχείο} other{{count} στοιχεία}}", - + "@itemCount": {}, "timeSeconds": "{seconds, plural, =1{1 δευτερόλεπτο} other{{seconds} δευτερόλεπτα}}", + "@timeSeconds": {}, "timeMinutes": "{minutes, plural, =1{1 λεπτό} other{{minutes} λεπτά}}", + "@timeMinutes": {}, "timeDays": "{days, plural, =1{1 ημέρα} other{{days} ημέρες}}", + "@timeDays": {}, "focalLength": "{length} mm", - + "@focalLength": {}, "applyButtonLabel": "ΕΦΑΡΜΟΓΗ", + "@applyButtonLabel": {}, "deleteButtonLabel": "ΔΙΑΓΡΑΦΗ", + "@deleteButtonLabel": {}, "nextButtonLabel": "ΕΠΟΜΕΝΟ", + "@nextButtonLabel": {}, "showButtonLabel": "ΕΜΦΑΝΙΣΗ", + "@showButtonLabel": {}, "hideButtonLabel": "ΑΠΟΚΡΥΨΗ", + "@hideButtonLabel": {}, "continueButtonLabel": "ΣΥΝΕΧΕΙΑ", - + "@continueButtonLabel": {}, "cancelTooltip": "Ακύρωση", + "@cancelTooltip": {}, "changeTooltip": "Αλλαγή", + "@changeTooltip": {}, "clearTooltip": "Εκκαθάριση", + "@clearTooltip": {}, "previousTooltip": "Προηγούμενο", + "@previousTooltip": {}, "nextTooltip": "Επόμενο", + "@nextTooltip": {}, "showTooltip": "Εμφάνιση", + "@showTooltip": {}, "hideTooltip": "Απόκρυψη", + "@hideTooltip": {}, "actionRemove": "Αφαίρεση", + "@actionRemove": {}, "resetTooltip": "Επαναφορά", + "@resetTooltip": {}, "saveTooltip": "Αποθήκευση", + "@saveTooltip": {}, "pickTooltip": "Διαλέξτε", - + "@pickTooltip": {}, "doubleBackExitMessage": "Αγγίξτε ξανά το «πίσω» για έξοδο.", + "@doubleBackExitMessage": {}, "doNotAskAgain": "Να μην ερωτηθώ ξανά", - + "@doNotAskAgain": {}, "sourceStateLoading": "Φόρτωση", + "@sourceStateLoading": {}, "sourceStateCataloguing": "Καταλογογράφηση", + "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "Εντοπισμός χωρών", + "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "Εντοπισμός τοποθεσιών", - + "@sourceStateLocatingPlaces": {}, "chipActionDelete": "Διαγραφή", + "@chipActionDelete": {}, "chipActionGoToAlbumPage": "Εμφάνιση στα Άλμπουμ", + "@chipActionGoToAlbumPage": {}, "chipActionGoToCountryPage": "Εμφάνιση στις χώρες", + "@chipActionGoToCountryPage": {}, "chipActionGoToTagPage": "Εμφάνιση στις ετικέτες", + "@chipActionGoToTagPage": {}, "chipActionFilterOut": "Χωρίς φιλτράρισμα", + "@chipActionFilterOut": {}, "chipActionFilterIn": "Με φιλτράρισμα", + "@chipActionFilterIn": {}, "chipActionHide": "Απόκρυψη", + "@chipActionHide": {}, "chipActionPin": "Καρφίτσωμα στην κορυφή", + "@chipActionPin": {}, "chipActionUnpin": "Ξέκαρφίτσωμα από την κορυφή", + "@chipActionUnpin": {}, "chipActionRename": "Μετονομασία", + "@chipActionRename": {}, "chipActionSetCover": "Ορισμός ως εξώφυλλο", + "@chipActionSetCover": {}, "chipActionCreateAlbum": "Δημιουργία άλμπουμ", - + "@chipActionCreateAlbum": {}, "entryActionCopyToClipboard": "Αντιγραφή στο πρόχειρο", + "@entryActionCopyToClipboard": {}, "entryActionDelete": "Διαγραφή", + "@entryActionDelete": {}, "entryActionConvert": "Μετατροπή", + "@entryActionConvert": {}, "entryActionExport": "Εξαγωγή", + "@entryActionExport": {}, "entryActionInfo": "Λεπτομέρειες", + "@entryActionInfo": {}, "entryActionRename": "Μετονομασία", + "@entryActionRename": {}, "entryActionRestore": "Επαναφορά", + "@entryActionRestore": {}, "entryActionRotateCCW": "Περιστροφή προς τα αριστερά", + "@entryActionRotateCCW": {}, "entryActionRotateCW": "Περιστροφή προς τα δεξιά", + "@entryActionRotateCW": {}, "entryActionFlip": "Αντανάκλαση καθρέφτη", + "@entryActionFlip": {}, "entryActionPrint": "Εκτύπωση", + "@entryActionPrint": {}, "entryActionShare": "Κοινοποίηση", + "@entryActionShare": {}, "entryActionViewSource": "Προβολή πηγής", + "@entryActionViewSource": {}, "entryActionShowGeoTiffOnMap": "Εμφάνιση ως επικάλυψη στον χάρτη", + "@entryActionShowGeoTiffOnMap": {}, "entryActionConvertMotionPhotoToStillImage": "Μετατροπή σε στατική εικόνα", + "@entryActionConvertMotionPhotoToStillImage": {}, "entryActionViewMotionPhotoVideo": "Άνοιγμα του βίντεο", + "@entryActionViewMotionPhotoVideo": {}, "entryActionEdit": "Επεξεργασία", + "@entryActionEdit": {}, "entryActionOpen": "Άνοιγμα με", + "@entryActionOpen": {}, "entryActionSetAs": "Ορισμός ως", + "@entryActionSetAs": {}, "entryActionOpenMap": "Εμφάνιση στην εφαρμογή χάρτες", + "@entryActionOpenMap": {}, "entryActionRotateScreen": "Περιστροφή οθόνης", + "@entryActionRotateScreen": {}, "entryActionAddFavourite": "Προσθήκη στα αγαπημένα", + "@entryActionAddFavourite": {}, "entryActionRemoveFavourite": "Αφαίρεση από τα αγαπημένα", - + "@entryActionRemoveFavourite": {}, "videoActionCaptureFrame": "Λήψη στιγμιότυπου", + "@videoActionCaptureFrame": {}, "videoActionMute": "Σίγαση", + "@videoActionMute": {}, "videoActionUnmute": "Αναίρεση σίγασης", + "@videoActionUnmute": {}, "videoActionPause": "Παύση", + "@videoActionPause": {}, "videoActionPlay": "Αναπαραγωγή", - "videoActionReplay10": "10 δευτερόλεπτα πίσω ", + "@videoActionPlay": {}, + "videoActionReplay10": "10 δευτερόλεπτα πίσω", + "@videoActionReplay10": {}, "videoActionSkip10": "10 δευτερόλεπτα μπροστά", + "@videoActionSkip10": {}, "videoActionSelectStreams": "Επιλογή γλώσσας", + "@videoActionSelectStreams": {}, "videoActionSetSpeed": "Ταχύτητα αναπαραγωγής", + "@videoActionSetSpeed": {}, "videoActionSettings": "Ρυθμίσεις", - + "@videoActionSettings": {}, "slideshowActionResume": "Συνέχιση", + "@slideshowActionResume": {}, "slideshowActionShowInCollection": "Εμφάνιση στη Συλλογή", - + "@slideshowActionShowInCollection": {}, "entryInfoActionEditDate": "Επεξεργασία ημερομηνίας και ώρας", + "@entryInfoActionEditDate": {}, "entryInfoActionEditLocation": "Επεξεργασία τοποθεσίας", + "@entryInfoActionEditLocation": {}, "entryInfoActionEditTitleDescription": "Επεξεργασία ονομασίας & περιγραφής", + "@entryInfoActionEditTitleDescription": {}, "entryInfoActionEditRating": "Επεξεργασία βαθμολογίας", + "@entryInfoActionEditRating": {}, "entryInfoActionEditTags": "Επεξεργασία ετικετών", + "@entryInfoActionEditTags": {}, "entryInfoActionRemoveMetadata": "Κατάργηση μεταδεδομένων", - + "@entryInfoActionRemoveMetadata": {}, "filterBinLabel": "Κάδος ανακύκλωσης", + "@filterBinLabel": {}, "filterFavouriteLabel": "Αγαπημένα", + "@filterFavouriteLabel": {}, "filterNoDateLabel": "Χωρίς ημερομηνία", + "@filterNoDateLabel": {}, "filterNoLocationLabel": "Χωρίς τοποθεσία", + "@filterNoLocationLabel": {}, "filterNoRatingLabel": "Χωρίς βαθμολογία", + "@filterNoRatingLabel": {}, "filterNoTagLabel": "Χωρίς ετικέτα", + "@filterNoTagLabel": {}, "filterNoTitleLabel": "Χωρίς ονομασία", + "@filterNoTitleLabel": {}, "filterOnThisDayLabel": "Αυτή τη μέρα", + "@filterOnThisDayLabel": {}, "filterRecentlyAddedLabel": "Προστέθηκαν πρόσφατα", + "@filterRecentlyAddedLabel": {}, "filterRatingRejectedLabel": "Απορριφθέντα", + "@filterRatingRejectedLabel": {}, "filterTypeAnimatedLabel": "Κινούμενα", + "@filterTypeAnimatedLabel": {}, "filterTypeMotionPhotoLabel": "Φωτογραφίες με κίνηση", + "@filterTypeMotionPhotoLabel": {}, "filterTypePanoramaLabel": "Πανοραμικές", + "@filterTypePanoramaLabel": {}, "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, "filterTypeSphericalVideoLabel": "Βίντεο 360°", + "@filterTypeSphericalVideoLabel": {}, "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, "filterMimeImageLabel": "Εικόνα", + "@filterMimeImageLabel": {}, "filterMimeVideoLabel": "Βίντεο", - + "@filterMimeVideoLabel": {}, "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, "coordinateFormatDecimal": "Δεκαδικές μοίρες", + "@coordinateFormatDecimal": {}, "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, "coordinateDmsNorth": "Β", + "@coordinateDmsNorth": {}, "coordinateDmsSouth": "Ν", + "@coordinateDmsSouth": {}, "coordinateDmsEast": "Α", + "@coordinateDmsEast": {}, "coordinateDmsWest": "Δ", - + "@coordinateDmsWest": {}, "unitSystemMetric": "Μετρικό", + "@unitSystemMetric": {}, "unitSystemImperial": "Aγγλοσαξονικό", - + "@unitSystemImperial": {}, "videoLoopModeNever": "Ποτέ", + "@videoLoopModeNever": {}, "videoLoopModeShortOnly": "Μόνο για βίντεο σύντομης διάρκειας", + "@videoLoopModeShortOnly": {}, "videoLoopModeAlways": "Πάντα", - + "@videoLoopModeAlways": {}, "videoControlsPlay": "Αναπαραγωγή", + "@videoControlsPlay": {}, "videoControlsPlaySeek": "Αναπαραγωγή & πίσω/μπροστά", + "@videoControlsPlaySeek": {}, "videoControlsPlayOutside": "Άνοιγμα με άλλη εφαρμογή", + "@videoControlsPlayOutside": {}, "videoControlsNone": "Καμία επιλογή", - + "@videoControlsNone": {}, "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "@mapStyleGoogleHybrid": {}, "mapStyleGoogleTerrain": "Google Maps (Terrain)", + "@mapStyleGoogleTerrain": {}, "mapStyleHuaweiNormal": "Petal Maps", + "@mapStyleHuaweiNormal": {}, "mapStyleHuaweiTerrain": "Petal Maps (Terrain)", + "@mapStyleHuaweiTerrain": {}, "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, "mapStyleStamenToner": "Stamen Toner", + "@mapStyleStamenToner": {}, "mapStyleStamenWatercolor": "Stamen Watercolor", - + "@mapStyleStamenWatercolor": {}, "nameConflictStrategyRename": "Μετονομασία", + "@nameConflictStrategyRename": {}, "nameConflictStrategyReplace": "Αντικατάσταση", + "@nameConflictStrategyReplace": {}, "nameConflictStrategySkip": "Παράλειψη", - + "@nameConflictStrategySkip": {}, "keepScreenOnNever": "Ποτέ", + "@keepScreenOnNever": {}, "keepScreenOnViewerOnly": "Μόνο όταν πραγματοποιείται προβολή στοιχείων", + "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "Πάντα", - + "@keepScreenOnAlways": {}, "accessibilityAnimationsRemove": "Απενεργοποίηση εφέ οθόνης", + "@accessibilityAnimationsRemove": {}, "accessibilityAnimationsKeep": "Διατήρηση εφέ οθόνης", - + "@accessibilityAnimationsKeep": {}, "displayRefreshRatePreferHighest": "Υψηλότερος ρυθμός", + "@displayRefreshRatePreferHighest": {}, "displayRefreshRatePreferLowest": "Χαμηλότερος ρυθμός", - + "@displayRefreshRatePreferLowest": {}, "videoPlaybackSkip": "Παράλειψη", + "@videoPlaybackSkip": {}, "videoPlaybackMuted": "Αναπαραγωγή σε σίγαση", + "@videoPlaybackMuted": {}, "videoPlaybackWithSound": "Αναπαραγωγή με ήχο", - + "@videoPlaybackWithSound": {}, "themeBrightnessLight": "Φωτεινό", + "@themeBrightnessLight": {}, "themeBrightnessDark": "Σκούρο", + "@themeBrightnessDark": {}, "themeBrightnessBlack": "Μαύρο", - + "@themeBrightnessBlack": {}, "viewerTransitionSlide": "Ολίσθηση", + "@viewerTransitionSlide": {}, "viewerTransitionParallax": "Παράλλαξη", + "@viewerTransitionParallax": {}, "viewerTransitionFade": "Ξεθώριασμα", + "@viewerTransitionFade": {}, "viewerTransitionZoomIn": "Μεγέθυνση", + "@viewerTransitionZoomIn": {}, "viewerTransitionNone": "Καμία", - + "@viewerTransitionNone": {}, "wallpaperTargetHome": "Αρχική οθόνη", + "@wallpaperTargetHome": {}, "wallpaperTargetLock": "Οθόνη κλειδώματος", + "@wallpaperTargetLock": {}, "wallpaperTargetHomeLock": "Αρχική οθόνη και οθόνη κλειδώματος", - + "@wallpaperTargetHomeLock": {}, "widgetOpenPageHome": "Άνοιγμα αρχικής σελίδας", + "@widgetOpenPageHome": {}, "widgetOpenPageViewer": "Άνοιγμα προβολέα αρχείων", - + "@widgetOpenPageViewer": {}, "albumTierNew": "Νέα", + "@albumTierNew": {}, "albumTierPinned": "Καρφιτσωμένα", + "@albumTierPinned": {}, "albumTierSpecial": "Συστήματος", + "@albumTierSpecial": {}, "albumTierApps": "Εφαρμογές", + "@albumTierApps": {}, "albumTierRegular": "Προσωπικά", - + "@albumTierRegular": {}, "storageVolumeDescriptionFallbackPrimary": "Εσωτερικός χώρος αποθήκευσης", + "@storageVolumeDescriptionFallbackPrimary": {}, "storageVolumeDescriptionFallbackNonPrimary": "SD card/Εξωτερικός χώρος αποθήκευσης", + "@storageVolumeDescriptionFallbackNonPrimary": {}, "rootDirectoryDescription": "Κατάλογος ρίζας", + "@rootDirectoryDescription": {}, "otherDirectoryDescription": "«{name}» κατάλογος", + "@otherDirectoryDescription": {}, "storageAccessDialogMessage": "Παρακαλώ επιλέξτε τον {directory} του «{volume}» στην επόμενη οθόνη για να δώσετε πρόσβαση στην εφαρμογή", + "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "Αυτή η εφαρμογή δεν επιτρέπεται να τροποποιεί αρχεία στο {directory} του «{volume}».\n\nΠαρακαλώ χρησιμοποιήστε μια άλλη εφαρμογή διαχείρισης αρχείων ή συλλογή φωτογραφιών για να μετακινήσετε τα στοιχεία αλλού.", + "@restrictedAccessDialogMessage": {}, "notEnoughSpaceDialogMessage": "Αυτή η λειτουργία χρειάζεται {neededSize} ελεύθερου χώρου στο «{volume}» για να ολοκληρωθεί, αλλά μόνο {freeSize} απομένουν ελεύθερα.", + "@notEnoughSpaceDialogMessage": {}, "missingSystemFilePickerDialogMessage": "Η εφαρμογή επιλογής αρχείων του δεν βρέθηκε ή είναι απενεργοποιημένη. Ενεργοποιήστε την και δοκιμάστε ξανά.", - + "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, =1{Αυτή η λειτουργία δεν υποστηρίζεται για το ακόλουθο αρχείο: {types}.} other{Αυτή η λειτουργία δεν υποστηρίζεται για τα ακόλουθα αρχεία: {types}.}}", - + "@unsupportedTypeDialogMessage": {}, "nameConflictDialogSingleSourceMessage": "Ορισμένα αρχεία στον φάκελο προορισμού έχουν το ίδιο όνομα.", + "@nameConflictDialogSingleSourceMessage": {}, "nameConflictDialogMultipleSourceMessage": "Ορισμένα αρχεία έχουν το ίδιο όνομα.", - + "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "Ετικέτα συντόμευσης", + "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "ΠΡΟΣΘΗΚΗ", - + "@addShortcutButtonLabel": {}, "noMatchingAppDialogMessage": "Δεν βρέθηκαν εγκατεστημένες εφαρμογές που μπορούν να το κάνουν αυτό.", - + "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{Μετακίνηση αυτού του στοιχείου στον κάδο ανακύκλωσης;} other{Μετακίνηση αυτών των {count} στοιχείων στον κάδο ανακύκλωσης;}}", + "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Διαγραφή αυτού του στοιχείου;} other{Διαγραφή αυτών των {count} στοιχείων;}}", + "@deleteEntriesConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogMessage": "Αποθήκευση ημερομηνιών στοιχείων πριν συνεχίσετε;", + "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Αποθήκευση ημερομηνιών", - + "@moveUndatedConfirmationDialogSetDate": {}, "videoResumeDialogMessage": "Συνέχεια αναπαραγωγής από {time}?", + "@videoResumeDialogMessage": {}, "videoStartOverButtonLabel": "ΑΝΑΠΑΡΑΓΩΓΗ ΑΠΟ ΤΗΝ ΑΡΧΗ", + "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "ΣΥΝΕΧΙΣΗ ΑΝΑΠΑΡΑΓΩΓΗΣ", - + "@videoResumeButtonLabel": {}, "setCoverDialogLatest": "Πιο πρόσφατο στοιχείο", + "@setCoverDialogLatest": {}, "setCoverDialogAuto": "Αυτόματο", + "@setCoverDialogAuto": {}, "setCoverDialogCustom": "Προσαρμοσμένο", - + "@setCoverDialogCustom": {}, "hideFilterConfirmationDialogMessage": "Οι φωτογραφίες και τα βίντεο που ταιριάζουν θα κρυφτούν από τη συλλογή σας. Μπορείτε να τα εμφανίσετε ξανά από τις ρυθμίσεις «Απόρρητο».\n\nΕίστε σίγουροι ότι θέλετε να τα κρύψετε;", - + "@hideFilterConfirmationDialogMessage": {}, "newAlbumDialogTitle": "Νεο αλμπουμ", + "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "Όνομα άλμπουμ", + "@newAlbumDialogNameLabel": {}, "newAlbumDialogNameLabelAlreadyExistsHelper": "Ο κατάλογος υπάρχει ήδη", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "Aποθηκευτικός χώρος:", - + "@newAlbumDialogStorageLabel": {}, "renameAlbumDialogLabel": "Νέο όνομα", + "@renameAlbumDialogLabel": {}, "renameAlbumDialogLabelAlreadyExistsHelper": "Ο κατάλογος υπάρχει ήδη", - + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, "renameEntrySetPageTitle": "Μετονομασια", + "@renameEntrySetPageTitle": {}, "renameEntrySetPagePatternFieldLabel": "Μοτίβο ονομασίας", + "@renameEntrySetPagePatternFieldLabel": {}, "renameEntrySetPageInsertTooltip": "Εισαγωγή πεδίου", + "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "Προεπισκοπηση", - + "@renameEntrySetPagePreviewSectionTitle": {}, "renameProcessorCounter": "Counter", + "@renameProcessorCounter": {}, "renameProcessorName": "Όνομα", - + "@renameProcessorName": {}, "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Διαγραφή αυτού του άλμπουμ και του περιεχομένου του;} other{Διαγράψτε αυτό το άλμπουμ και όλα τα {count} στοιχεία του;}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Διαγράψτε αυτά τα άλμπουμ και το περιεχόμενό τους;} other{Διαγράψτε αυτά τα άλμπουμ και όλα τα {count} στοιχεία τους;}}", - + "@deleteMultiAlbumConfirmationDialogMessage": {}, "exportEntryDialogFormat": "Μορφή:", + "@exportEntryDialogFormat": {}, "exportEntryDialogWidth": "Πλάτος", + "@exportEntryDialogWidth": {}, "exportEntryDialogHeight": "Ύψος", - + "@exportEntryDialogHeight": {}, "renameEntryDialogLabel": "Νέο όνομα", - + "@renameEntryDialogLabel": {}, "editEntryDialogTargetFieldsHeader": "Πεδία προς τροποποίηση", - + "@editEntryDialogTargetFieldsHeader": {}, "editEntryDateDialogTitle": "Ημερομηνια & Ώρα", + "@editEntryDateDialogTitle": {}, "editEntryDateDialogSetCustom": "Ορισμός προσαρμοσμένης ημερομηνίας", + "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Αντιγραφή από άλλη ημερομηνία", + "@editEntryDateDialogCopyField": {}, "editEntryDateDialogCopyItem": "Αντιγραφή από άλλο στοιχείο", + "@editEntryDateDialogCopyItem": {}, "editEntryDateDialogExtractFromTitle": "Εξαγωγή από το όνομα του κάθε αρχείου", + "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Μετατόπιση", + "@editEntryDateDialogShift": {}, "editEntryDateDialogSourceFileModifiedDate": "Ημερομηνία τροποποίησης αρχείου", - + "@editEntryDateDialogSourceFileModifiedDate": {}, "durationDialogHours": "Ώρες", + "@durationDialogHours": {}, "durationDialogMinutes": "Λεπτά", - + "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Τοποθεσια", + "@editEntryLocationDialogTitle": {}, "editEntryLocationDialogChooseOnMapTooltip": "Επιλογή στο χάρτη", + "@editEntryLocationDialogChooseOnMapTooltip": {}, "editEntryLocationDialogLatitude": "Γεωγραφικό πλάτος", + "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Γεωγραφικό μήκος", - + "@editEntryLocationDialogLongitude": {}, "locationPickerUseThisLocationButton": "Χρησιμοποίηση της τοποθεσίας", - + "@locationPickerUseThisLocationButton": {}, "editEntryRatingDialogTitle": "Βαθμολογια", - + "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "Αφαιρεση μεταδεδομενων", + "@removeEntryMetadataDialogTitle": {}, "removeEntryMetadataDialogMore": "Περισσότερα", - + "@removeEntryMetadataDialogMore": {}, "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Απαιτείται XMP για την αναπαραγωγή του βίντεο μέσα σε μια κινούμενη φωτογραφία.\n\nΕίστε βέβαιοι ότι θέλετε να αφαιρεθεί;", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, "convertMotionPhotoToStillImageWarningDialogMessage": "Είστε βέβαιοι;", - + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, "videoSpeedDialogLabel": "Ταχύτητα αναπαραγωγής", - + "@videoSpeedDialogLabel": {}, "videoStreamSelectionDialogVideo": "Βίντεο", + "@videoStreamSelectionDialogVideo": {}, "videoStreamSelectionDialogAudio": "Ήχος", + "@videoStreamSelectionDialogAudio": {}, "videoStreamSelectionDialogText": "Υπότιτλοι", + "@videoStreamSelectionDialogText": {}, "videoStreamSelectionDialogOff": "Απενεργοποίηση", + "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "Κομμάτι", + "@videoStreamSelectionDialogTrack": {}, "videoStreamSelectionDialogNoSelection": "Δεν υπάρχουν άλλα κομμάτια.", - + "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "Ολοκληρώθηκε!", + "@genericSuccessFeedback": {}, "genericFailureFeedback": "Απέτυχε", - + "@genericFailureFeedback": {}, "menuActionConfigureView": "Προβολή", + "@menuActionConfigureView": {}, "menuActionSelect": "Επιλογή", + "@menuActionSelect": {}, "menuActionSelectAll": "Επιλογή όλων", + "@menuActionSelectAll": {}, "menuActionSelectNone": "Να μην επιλεγεί κανένα", + "@menuActionSelectNone": {}, "menuActionMap": "Χάρτης", + "@menuActionMap": {}, "menuActionSlideshow": "Παρουσίαση φωτογραφιών", + "@menuActionSlideshow": {}, "menuActionStats": "Στατιστικά", - + "@menuActionStats": {}, "viewDialogSortSectionTitle": "Ταξινομηση", + "@viewDialogSortSectionTitle": {}, "viewDialogGroupSectionTitle": "Ομαδοποιηση", + "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "Διαταξη", + "@viewDialogLayoutSectionTitle": {}, "viewDialogReverseSortOrder": "Αντίστροφη σειρά ταξινόμησης", - + "@viewDialogReverseSortOrder": {}, "tileLayoutMosaic": "Ψηφιδωτό", + "@tileLayoutMosaic": {}, "tileLayoutGrid": "Πλέγμα", + "@tileLayoutGrid": {}, "tileLayoutList": "Λίστα", - + "@tileLayoutList": {}, "coverDialogTabCover": "Εξώφυλλο", + "@coverDialogTabCover": {}, "coverDialogTabApp": "Εφαρμογή", + "@coverDialogTabApp": {}, "coverDialogTabColor": "Χρώμα", - + "@coverDialogTabColor": {}, "appPickDialogTitle": "Επιλογη εφαρμογης", + "@appPickDialogTitle": {}, "appPickDialogNone": "Καμία επιλογή", - + "@appPickDialogNone": {}, "aboutPageTitle": "Διαφορα", + "@aboutPageTitle": {}, "aboutLinkLicense": "Άδειες", + "@aboutLinkLicense": {}, "aboutLinkPolicy": "Πολιτική Απορρήτου", - + "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "Αναφορα σφαλματος", + "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "Αποθήκευση των αρχείων καταγραφής της εφαρμογής σε ένα ξεχωριστό αρχείο", + "@aboutBugSaveLogInstruction": {}, "aboutBugCopyInfoInstruction": "Αντιγραφή πληροφοριών του συστήματος", + "@aboutBugCopyInfoInstruction": {}, "aboutBugCopyInfoButton": "Αντιγραφή", + "@aboutBugCopyInfoButton": {}, "aboutBugReportInstruction": "Αναφορά στο GitHub με τα αρχεία καταγραφής και τις πληροφορίες του συστήματος", + "@aboutBugReportInstruction": {}, "aboutBugReportButton": "Αναφορά", - + "@aboutBugReportButton": {}, "aboutCreditsSectionTitle": "Αναφορες", + "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "Αυτή η εφαρμογή χρησιμοποιεί ένα αρχείο TopoJSON από", + "@aboutCreditsWorldAtlas1": {}, "aboutCreditsWorldAtlas2": "υπό την άδεια ISC.", + "@aboutCreditsWorldAtlas2": {}, "aboutTranslatorsSectionTitle": "Μεταφραστες", - + "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "Αδειες ανοιχτου κωδικα", + "@aboutLicensesSectionTitle": {}, "aboutLicensesBanner": "Αυτή η εφαρμογή χρησιμοποιεί τα ακόλουθα πακέτα και βιβλιοθήκες ανοιχτού κώδικα.", + "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "Βιβλιοθηκες Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, "aboutLicensesFlutterPluginsSectionTitle": "Προσθετα Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, "aboutLicensesFlutterPackagesSectionTitle": "Πακετα Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, "aboutLicensesDartPackagesSectionTitle": "Πακετα Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "Εμφάνιση όλων των αδειών", - + "@aboutLicensesShowAllButtonLabel": {}, "policyPageTitle": "Πολιτικη απορρητου", - + "@policyPageTitle": {}, "collectionPageTitle": "Συλλογη", + "@collectionPageTitle": {}, "collectionPickPageTitle": "Διαλεξτε", + "@collectionPickPageTitle": {}, "collectionSelectPageTitle": "Επιλογη στοιχειων", - + "@collectionSelectPageTitle": {}, "collectionActionShowTitleSearch": "Εμφάνιση φίλτρου τίτλου", + "@collectionActionShowTitleSearch": {}, "collectionActionHideTitleSearch": "Απόκρυψη φίλτρου τίτλου", + "@collectionActionHideTitleSearch": {}, "collectionActionAddShortcut": "Προσθήκη συντόμευσης", + "@collectionActionAddShortcut": {}, "collectionActionEmptyBin": "Καθαρισμός του κάδου ανακύκλωσης", + "@collectionActionEmptyBin": {}, "collectionActionCopy": "Αντιγραφή στο άλμπουμ", + "@collectionActionCopy": {}, "collectionActionMove": "Μετακίνηση στο άλμπουμ", + "@collectionActionMove": {}, "collectionActionRescan": "Εκ νέου σάρωση", + "@collectionActionRescan": {}, "collectionActionEdit": "Επεξεργασία", - + "@collectionActionEdit": {}, "collectionSearchTitlesHintText": "Αναζήτηση τίτλων", - + "@collectionSearchTitlesHintText": {}, "collectionGroupAlbum": "Ανά άλμπουμ", + "@collectionGroupAlbum": {}, "collectionGroupMonth": "Ανά μήνα", + "@collectionGroupMonth": {}, "collectionGroupDay": "Ανά ημέρα", + "@collectionGroupDay": {}, "collectionGroupNone": "Να μην γίνει ομαδοποίηση", - + "@collectionGroupNone": {}, "sectionUnknown": "Χωρίς λεπτομέρειες", + "@sectionUnknown": {}, "dateToday": "Σήμερα", + "@dateToday": {}, "dateYesterday": "Εχθές", + "@dateYesterday": {}, "dateThisMonth": "Αυτό το μήνα", + "@dateThisMonth": {}, "collectionDeleteFailureFeedback": "{count, plural, =1{Αποτυχία διαγραφής του στοιχείου} other{Αποτυχία διαγραφής των {count} στοιχείων}}", + "@collectionDeleteFailureFeedback": {}, "collectionCopyFailureFeedback": "{count, plural, =1{Αποτυχία αντιγραφής του στοιχείου} other{Αποτυχία αντιγραφής των {count} στοιχείων}}", + "@collectionCopyFailureFeedback": {}, "collectionMoveFailureFeedback": "{count, plural, =1{Αποτυχία μετακίνησης του στοιχείου} other{Αποτυχία μετακίνησης των {count} στοιχείων}}", + "@collectionMoveFailureFeedback": {}, "collectionRenameFailureFeedback": "{count, plural, =1{Αποτυχία μετονομασίας του στοιχείου} other{Αποτυχία μετονομασίας των {count} στοιχείων}}", + "@collectionRenameFailureFeedback": {}, "collectionEditFailureFeedback": "{count, plural, =1{Απέτυχε η επεξεργασία του στοιχείου} other{Απέτυχε η επεξεργασία των {count} στοιχείων}}", + "@collectionEditFailureFeedback": {}, "collectionExportFailureFeedback": "{count, plural, =1{Απέτυχε η εξαγωγή της σελίδας} other{Απέτυχε η εξαγωγή των {count} σελίδων}}", + "@collectionExportFailureFeedback": {}, "collectionCopySuccessFeedback": "{count, plural, =1{Αντιγράφηκε το στοιχείο} other{Αντιγράφηκαν τα {count} στοιχεία}}", + "@collectionCopySuccessFeedback": {}, "collectionMoveSuccessFeedback": "{count, plural, =1{Μετακινήθηκε το στοιχείο} other{Μετακινήθηκαν τα {count} στοιχεία}}", + "@collectionMoveSuccessFeedback": {}, "collectionRenameSuccessFeedback": "{count, plural, =1{Μετονομάστηκε το στοιχείο} other{Μετονομάστηκαν τα {count} στοιχεία}}", + "@collectionRenameSuccessFeedback": {}, "collectionEditSuccessFeedback": "{count, plural, =1{Επεξεργάστηκε το στοιχείο} other{Επεξεργάστηκαν τα {count} στοιχεία}}", - + "@collectionEditSuccessFeedback": {}, "collectionEmptyFavourites": "Δεν έχουν καταχωρηθεί αγαπημένα στοιχεία", + "@collectionEmptyFavourites": {}, "collectionEmptyVideos": "Δεν υπάρχουν βίντεο", + "@collectionEmptyVideos": {}, "collectionEmptyImages": "Δεν υπάρχουν εικόνες", + "@collectionEmptyImages": {}, "collectionEmptyGrantAccessButtonLabel": "Παραχώρηση πρόσβασης", - + "@collectionEmptyGrantAccessButtonLabel": {}, "collectionSelectSectionTooltip": "Επιλέξτε ενότητα", + "@collectionSelectSectionTooltip": {}, "collectionDeselectSectionTooltip": "Αφαιρέστε ενότητα", - + "@collectionDeselectSectionTooltip": {}, "drawerAboutButton": "Διάφορα", + "@drawerAboutButton": {}, "drawerSettingsButton": "Ρυθμίσεις", + "@drawerSettingsButton": {}, "drawerCollectionAll": "Όλη η συλλογή", + "@drawerCollectionAll": {}, "drawerCollectionFavourites": "Αγαπημένα", + "@drawerCollectionFavourites": {}, "drawerCollectionImages": "Εικόνες", + "@drawerCollectionImages": {}, "drawerCollectionVideos": "Βίντεο", + "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "Κινούμενα", + "@drawerCollectionAnimated": {}, "drawerCollectionMotionPhotos": "Φωτογραφίες με κίνηση", + "@drawerCollectionMotionPhotos": {}, "drawerCollectionPanoramas": "Πανοραμικές", + "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "Raw φωτογραφίες", + "@drawerCollectionRaws": {}, "drawerCollectionSphericalVideos": "Βίντεο 360°", + "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "Άλμπουμ", + "@drawerAlbumPage": {}, "drawerCountryPage": "Χώρες", + "@drawerCountryPage": {}, "drawerTagPage": "Ετικέτες", - + "@drawerTagPage": {}, "sortByDate": "Ανά ημερομηνία", + "@sortByDate": {}, "sortByName": "Ανά όνομα", + "@sortByName": {}, "sortByItemCount": "Ανά μέτρηση στοιχείων", + "@sortByItemCount": {}, "sortBySize": "Ανά μέγεθος", + "@sortBySize": {}, "sortByAlbumFileName": "Ανά άλμπουμ και όνομα αρχείου", + "@sortByAlbumFileName": {}, "sortByRating": "Ανά βαθμολογία", - + "@sortByRating": {}, "sortOrderNewestFirst": "Τα πιο πρόσφατα πρώτα", + "@sortOrderNewestFirst": {}, "sortOrderOldestFirst": "Τα παλαιότερα πρώτα", + "@sortOrderOldestFirst": {}, "sortOrderAtoZ": "Α έως Ω", + "@sortOrderAtoZ": {}, "sortOrderZtoA": "Ω έως Α", + "@sortOrderZtoA": {}, "sortOrderHighestFirst": "Υψηλότερη βαθμολογία πρώτα", + "@sortOrderHighestFirst": {}, "sortOrderLowestFirst": "Χαμηλότερη βαθμολογία πρώτα", + "@sortOrderLowestFirst": {}, "sortOrderLargestFirst": "Τα μεγαλύτερα πρώτα", + "@sortOrderLargestFirst": {}, "sortOrderSmallestFirst": "Τα μικρότερα πρώτα", - + "@sortOrderSmallestFirst": {}, "albumGroupTier": "Ανά βαθμίδα", + "@albumGroupTier": {}, "albumGroupType": "Ανά τύπο", + "@albumGroupType": {}, "albumGroupVolume": "Ανά αποθηκευτική μονάδα", + "@albumGroupVolume": {}, "albumGroupNone": "Να μην γίνει ομαδοποίηση", - + "@albumGroupNone": {}, "albumMimeTypeMixed": "Μικτα", - + "@albumMimeTypeMixed": {}, "albumPickPageTitleCopy": "Αντιγραφή στο άλμπουμ", + "@albumPickPageTitleCopy": {}, "albumPickPageTitleExport": "Εξαγωγή στο άλμπουμ", + "@albumPickPageTitleExport": {}, "albumPickPageTitleMove": "Μετακίνηση στο άλμπουμ", + "@albumPickPageTitleMove": {}, "albumPickPageTitlePick": "Επιλογή άλμπουμ", - + "@albumPickPageTitlePick": {}, "albumCamera": "Κάμερα", + "@albumCamera": {}, "albumDownload": "Λήψεις", + "@albumDownload": {}, "albumScreenshots": "Στιγμιότυπα οθόνης", + "@albumScreenshots": {}, "albumScreenRecordings": "Εγγραφές οθόνης", + "@albumScreenRecordings": {}, "albumVideoCaptures": "Στιγμιότυπα οθόνης από βίντεο", - + "@albumVideoCaptures": {}, "albumPageTitle": "Άλμπουμ", + "@albumPageTitle": {}, "albumEmpty": "Δεν υπάρχουν άλμπουμ", + "@albumEmpty": {}, "createAlbumTooltip": "Δημιουργία άλμπουμ", + "@createAlbumTooltip": {}, "createAlbumButtonLabel": "ΔΗΜΙΟΥΡΓΙΑ", + "@createAlbumButtonLabel": {}, "newFilterBanner": "Νέα", - + "@newFilterBanner": {}, "countryPageTitle": "Χωρες", + "@countryPageTitle": {}, "countryEmpty": "Δεν έχουν καταχωρηθεί χώρες", - + "@countryEmpty": {}, "tagPageTitle": "Ετικετες", + "@tagPageTitle": {}, "tagEmpty": "Δεν έχουν καταχωρηθεί ετικέτες", - + "@tagEmpty": {}, "binPageTitle": "Καδος ανακυκλωσης", - + "@binPageTitle": {}, "searchCollectionFieldHint": "Αναζήτηση στην συλλογή", + "@searchCollectionFieldHint": {}, "searchRecentSectionTitle": "Προσφατα", + "@searchRecentSectionTitle": {}, "searchDateSectionTitle": "Ημερομηνια", + "@searchDateSectionTitle": {}, "searchAlbumsSectionTitle": "Άλμπουμ", + "@searchAlbumsSectionTitle": {}, "searchCountriesSectionTitle": "Χωρες", + "@searchCountriesSectionTitle": {}, "searchPlacesSectionTitle": "Τοποθεσιες", + "@searchPlacesSectionTitle": {}, "searchTagsSectionTitle": "Ετικετες", + "@searchTagsSectionTitle": {}, "searchRatingSectionTitle": "Βαθμολογιες", + "@searchRatingSectionTitle": {}, "searchMetadataSectionTitle": "Μεταδεδομενα", - + "@searchMetadataSectionTitle": {}, "settingsPageTitle": "Ρυθμισεις", + "@settingsPageTitle": {}, "settingsSystemDefault": "Σύστημα", + "@settingsSystemDefault": {}, "settingsDefault": "Προεπιλογή", + "@settingsDefault": {}, "settingsDisabled": "Απενεργοποιημένο", - + "@settingsDisabled": {}, "settingsSearchFieldLabel": "Αναζήτηση ρυθμίσεων", + "@settingsSearchFieldLabel": {}, "settingsSearchEmpty": "Δεν υπάρχει αντίστοιχη ρύθμιση", + "@settingsSearchEmpty": {}, "settingsActionExport": "Εξαγωγή", + "@settingsActionExport": {}, "settingsActionExportDialogTitle": "Εξαγωγη", + "@settingsActionExportDialogTitle": {}, "settingsActionImport": "Εισαγωγή", + "@settingsActionImport": {}, "settingsActionImportDialogTitle": "Εισαγωγη", - + "@settingsActionImportDialogTitle": {}, "appExportCovers": "Εξώφυλλα", + "@appExportCovers": {}, "appExportFavourites": "Αγαπημένα", + "@appExportFavourites": {}, "appExportSettings": "Ρυθμίσεις", - + "@appExportSettings": {}, "settingsNavigationSectionTitle": "Πλοηγηση", + "@settingsNavigationSectionTitle": {}, "settingsHomeTile": "Αρχική σελίδα της εφαρμογής", + "@settingsHomeTile": {}, "settingsHomeDialogTitle": "Αρχικη σελιδα της εφαρμογης", + "@settingsHomeDialogTitle": {}, "settingsShowBottomNavigationBar": "Εμφάνιση κάτω γραμμής πλοήγησης", + "@settingsShowBottomNavigationBar": {}, "settingsKeepScreenOnTile": "Διατήρηση της οθόνης ενεργοποιημένη", + "@settingsKeepScreenOnTile": {}, "settingsKeepScreenOnDialogTitle": "Διατηρηση της Οθονης Ενεργοποιημενη", + "@settingsKeepScreenOnDialogTitle": {}, "settingsDoubleBackExit": "Αγγίξτε το «πίσω» δύο φορές για έξοδο", - + "@settingsDoubleBackExit": {}, "settingsConfirmationTile": "Παράθυρα επιβεβαίωσης", + "@settingsConfirmationTile": {}, "settingsConfirmationDialogTitle": "Παραθυρα Επιβεβαιωσης", + "@settingsConfirmationDialogTitle": {}, "settingsConfirmationBeforeDeleteItems": "Ερώτηση πριν διαγραφούν στοιχεία οριστικά", + "@settingsConfirmationBeforeDeleteItems": {}, "settingsConfirmationBeforeMoveToBinItems": "Ερώτηση πριν μεταφερθούν στοιχεία στον κάδο ανακύκλωσης", + "@settingsConfirmationBeforeMoveToBinItems": {}, "settingsConfirmationBeforeMoveUndatedItems": "Ερώτηση πριν μεταφερθούν στοιχεία χωρίς ημερομηνία", + "@settingsConfirmationBeforeMoveUndatedItems": {}, "settingsConfirmationAfterMoveToBinItems": "Εμφάνιση μηνύματος μετά τη μεταφορά στοιχείων στον κάδο ανακύκλωσης", - + "@settingsConfirmationAfterMoveToBinItems": {}, "settingsNavigationDrawerTile": "Μενού πλοήγησης", + "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "Μενου Πλοηγησης", + "@settingsNavigationDrawerEditorPageTitle": {}, "settingsNavigationDrawerBanner": "Αγγίξτε παρατεταμένα για να μετακινήσετε και να αναδιατάξετε τα στοιχεία του μενού.", + "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "Τύποι", + "@settingsNavigationDrawerTabTypes": {}, "settingsNavigationDrawerTabAlbums": "Άλμπουμ", + "@settingsNavigationDrawerTabAlbums": {}, "settingsNavigationDrawerTabPages": "Σελίδες", + "@settingsNavigationDrawerTabPages": {}, "settingsNavigationDrawerAddAlbum": "Προσθήκη άλμπουμ", - + "@settingsNavigationDrawerAddAlbum": {}, "settingsThumbnailSectionTitle": "Μικρογραφιες", + "@settingsThumbnailSectionTitle": {}, "settingsThumbnailOverlayTile": "Βοηθητικές πληροφορίες", + "@settingsThumbnailOverlayTile": {}, "settingsThumbnailOverlayPageTitle": "Βοηθητικές πληροφοριες", + "@settingsThumbnailOverlayPageTitle": {}, "settingsThumbnailShowFavouriteIcon": "Εμφάνιση εικονιδίου για αγαπημένο", + "@settingsThumbnailShowFavouriteIcon": {}, "settingsThumbnailShowTagIcon": "Εμφάνιση εικονιδίου για ετικέτα", + "@settingsThumbnailShowTagIcon": {}, "settingsThumbnailShowLocationIcon": "Εμφάνιση εικονιδίου για τοποθεσία", + "@settingsThumbnailShowLocationIcon": {}, "settingsThumbnailShowMotionPhotoIcon": "Εμφάνιση εικονιδίου για φωτογραφία με κίνηση", + "@settingsThumbnailShowMotionPhotoIcon": {}, "settingsThumbnailShowRating": "Εμφάνιση βαθμολογίας", + "@settingsThumbnailShowRating": {}, "settingsThumbnailShowRawIcon": "Εμφάνιση εικονιδίου για raw στοιχεία", + "@settingsThumbnailShowRawIcon": {}, "settingsThumbnailShowVideoDuration": "Εμφάνιση διάρκειας βίντεο", - + "@settingsThumbnailShowVideoDuration": {}, "settingsCollectionQuickActionsTile": "Γρήγορες ενέργειες", + "@settingsCollectionQuickActionsTile": {}, "settingsCollectionQuickActionEditorPageTitle": "Γρηγορες Ενεργειες", + "@settingsCollectionQuickActionEditorPageTitle": {}, "settingsCollectionQuickActionTabBrowsing": "Περιήγηση", + "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "Επιλογή", + "@settingsCollectionQuickActionTabSelecting": {}, "settingsCollectionBrowsingQuickActionEditorBanner": "Αγγίξτε παρατεταμένα για να μετακινήσετε τα κουμπιά και επιλέξτε ποιες ενέργειες θα εμφανίζονται κατά την περιήγηση στοιχείων.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "Αγγίξτε παρατεταμένα για να μετακινήσετε τα κουμπιά και επιλέξτε ποιες ενέργειες θα εμφανίζονται κατά την επιλογή στοιχείων.", - + "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "Προβολη", + "@settingsViewerSectionTitle": {}, "settingsViewerGestureSideTapNext": "Πατήστε στις άκρες της οθόνης για να εμφανίσετε το προηγούμενο/επόμενο στοιχείο", + "@settingsViewerGestureSideTapNext": {}, "settingsViewerUseCutout": "Χρησιμοποιήστε την περιοχή αποκοπής", + "@settingsViewerUseCutout": {}, "settingsViewerMaximumBrightness": "Μέγιστη φωτεινότητα", + "@settingsViewerMaximumBrightness": {}, "settingsMotionPhotoAutoPlay": "Αυτόματη αναπαραγωγή φωτογραφιών κίνησης", + "@settingsMotionPhotoAutoPlay": {}, "settingsImageBackground": "Φόντο κατά την προβολή στοιχείων", - + "@settingsImageBackground": {}, "settingsViewerQuickActionsTile": "Γρήγορες ενέργειες", + "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "Γρηγορες Ενεργειες", + "@settingsViewerQuickActionEditorPageTitle": {}, "settingsViewerQuickActionEditorBanner": "Αγγίξτε παρατεταμένα για να μετακινήσετε τα κουμπιά και επιλέξτε ποιες ενέργειες θα εμφανίζονται κατά την προβολή.", + "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Εμφανιζομενα κουμπια", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Διαθεσιμα κουμπια", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, "settingsViewerQuickActionEmpty": "Χωρίς κουμπιά", - + "@settingsViewerQuickActionEmpty": {}, "settingsViewerOverlayTile": "Επικάλυψη", + "@settingsViewerOverlayTile": {}, "settingsViewerOverlayPageTitle": "Επικαλυψη", + "@settingsViewerOverlayPageTitle": {}, "settingsViewerShowOverlayOnOpening": "Εμφάνιση κατά το άνοιγμα", + "@settingsViewerShowOverlayOnOpening": {}, "settingsViewerShowMinimap": "Εμφάνιση μικρού χάρτη", + "@settingsViewerShowMinimap": {}, "settingsViewerShowInformation": "Εμφάνιση πληροφοριών", + "@settingsViewerShowInformation": {}, "settingsViewerShowInformationSubtitle": "Εμφάνιση ονομασίας, ημερομηνίας, τοποθεσίας κ.λπ.", + "@settingsViewerShowInformationSubtitle": {}, "settingsViewerShowShootingDetails": "Εμφάνιση λεπτομερειών λήψης", + "@settingsViewerShowShootingDetails": {}, "settingsViewerShowOverlayThumbnails": "Εμφάνιση μικρογραφιών", + "@settingsViewerShowOverlayThumbnails": {}, "settingsViewerEnableOverlayBlurEffect": "Εφέ θαμπώματος", - + "@settingsViewerEnableOverlayBlurEffect": {}, "settingsViewerSlideshowTile": "Παρουσίαση φωτογραφιών", + "@settingsViewerSlideshowTile": {}, "settingsViewerSlideshowPageTitle": "Παρουσιαση φωτογραφιων", + "@settingsViewerSlideshowPageTitle": {}, "settingsSlideshowRepeat": "Επανάληψη", + "@settingsSlideshowRepeat": {}, "settingsSlideshowShuffle": "Τυχαία σειρά", + "@settingsSlideshowShuffle": {}, "settingsSlideshowFillScreen": "Χρησιμοποίηση πλήρης οθόνης", + "@settingsSlideshowFillScreen": {}, "settingsSlideshowAnimatedZoomEffect": "Εφέ κινούμενου ζουμ", + "@settingsSlideshowAnimatedZoomEffect": {}, "settingsSlideshowTransitionTile": "Μετάβαση", + "@settingsSlideshowTransitionTile": {}, "settingsSlideshowIntervalTile": "Διάρκεια", + "@settingsSlideshowIntervalTile": {}, "settingsSlideshowVideoPlaybackTile": "Αναπαραγωγή βίντεο", + "@settingsSlideshowVideoPlaybackTile": {}, "settingsSlideshowVideoPlaybackDialogTitle": "Αναπαραγωγη Βιντεο", - + "@settingsSlideshowVideoPlaybackDialogTitle": {}, "settingsVideoPageTitle": "Ρυθμισεις Βιντεο", + "@settingsVideoPageTitle": {}, "settingsVideoSectionTitle": "Βιντεο", + "@settingsVideoSectionTitle": {}, "settingsVideoShowVideos": "Εμφάνιση των βίντεο στη συλλογή", + "@settingsVideoShowVideos": {}, "settingsVideoEnableHardwareAcceleration": "Επιτάχυνση υλισμικού", + "@settingsVideoEnableHardwareAcceleration": {}, "settingsVideoAutoPlay": "Αυτόματη αναπαραγωγή κατά το άνοιγμα", + "@settingsVideoAutoPlay": {}, "settingsVideoLoopModeTile": "Επανάληψη αυτόματα στο τέλος κάθε βίντεο", + "@settingsVideoLoopModeTile": {}, "settingsVideoLoopModeDialogTitle": "Επαναληψη Αυτοματα στο Τελος Καθε Βιντεο", - + "@settingsVideoLoopModeDialogTitle": {}, "settingsSubtitleThemeTile": "Υπότιτλοι", + "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "Υποτιτλοι", + "@settingsSubtitleThemePageTitle": {}, "settingsSubtitleThemeSample": "Αυτό είναι ένα δείγμα.", + "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "Στοίχιση κειμένου", + "@settingsSubtitleThemeTextAlignmentTile": {}, "settingsSubtitleThemeTextAlignmentDialogTitle": "Στοιχιση Κειμενου", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, "settingsSubtitleThemeTextSize": "Μέγεθος κειμένου", + "@settingsSubtitleThemeTextSize": {}, "settingsSubtitleThemeShowOutline": "Εμφάνιση περιγράμματος και σκιάς", + "@settingsSubtitleThemeShowOutline": {}, "settingsSubtitleThemeTextColor": "Χρώμα κειμένου", + "@settingsSubtitleThemeTextColor": {}, "settingsSubtitleThemeTextOpacity": "Αδιαφάνεια κειμένου", + "@settingsSubtitleThemeTextOpacity": {}, "settingsSubtitleThemeBackgroundColor": "Χρώμα του φόντου", + "@settingsSubtitleThemeBackgroundColor": {}, "settingsSubtitleThemeBackgroundOpacity": "Αδιαφάνεια φόντου", + "@settingsSubtitleThemeBackgroundOpacity": {}, "settingsSubtitleThemeTextAlignmentLeft": "Αριστερά", + "@settingsSubtitleThemeTextAlignmentLeft": {}, "settingsSubtitleThemeTextAlignmentCenter": "Κέντρο", + "@settingsSubtitleThemeTextAlignmentCenter": {}, "settingsSubtitleThemeTextAlignmentRight": "Δεξιά", - + "@settingsSubtitleThemeTextAlignmentRight": {}, "settingsVideoControlsTile": "Έλεγχος", + "@settingsVideoControlsTile": {}, "settingsVideoControlsPageTitle": "Ελεγχος", + "@settingsVideoControlsPageTitle": {}, "settingsVideoButtonsTile": "Κουμπιά", + "@settingsVideoButtonsTile": {}, "settingsVideoGestureDoubleTapTogglePlay": "Αγγίξτε την οθόνη δύο φορές για αναπαραγωγή/παύση", + "@settingsVideoGestureDoubleTapTogglePlay": {}, "settingsVideoGestureSideDoubleTapSeek": "Αγγίξτε δύο φορές τις άκρες της οθόνης για να πάτε πίσω/εμπρός", - + "@settingsVideoGestureSideDoubleTapSeek": {}, "settingsPrivacySectionTitle": "Απορρητο", + "@settingsPrivacySectionTitle": {}, "settingsAllowInstalledAppAccess": "Να επιτρέπεται η πρόσβαση στον κατάλογο εγκατεστημένων εφαρμογών της συσκευής", + "@settingsAllowInstalledAppAccess": {}, "settingsAllowInstalledAppAccessSubtitle": "Χρησιμοποιείται για τη βελτίωση της εμφάνισης των στοιχείων από τα άλμπουμ", + "@settingsAllowInstalledAppAccessSubtitle": {}, "settingsAllowErrorReporting": "Να επιτρέπεται η ανώνυμη αναφορά σφαλμάτων", + "@settingsAllowErrorReporting": {}, "settingsSaveSearchHistory": "Αποθήκευση ιστορικού αναζήτησης", + "@settingsSaveSearchHistory": {}, "settingsEnableBin": "Χρησιμοποίηση κάδου ανακύκλωσης", + "@settingsEnableBin": {}, "settingsEnableBinSubtitle": "Διατήρηση των διαγραμμένων στοιχείων για 30 ημέρες", - + "@settingsEnableBinSubtitle": {}, "settingsHiddenItemsTile": "Κρυφά στοιχεία", + "@settingsHiddenItemsTile": {}, "settingsHiddenItemsPageTitle": "Κρυφα Στοιχεια", - + "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "Κρυφά φίλτρα", + "@settingsHiddenItemsTabFilters": {}, "settingsHiddenFiltersBanner": "Οι φωτογραφίες και τα βίντεο που είναι κρυφά δεν θα εμφανίζονται στη συλλογή σας.", + "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "Χωρίς κρυφά φίλτρα", - + "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "Κρυφές διαδρομές", + "@settingsHiddenItemsTabPaths": {}, "settingsHiddenPathsBanner": "Οι φωτογραφίες και τα βίντεο σε αυτούς τους φακέλους ή σε οποιονδήποτε από τους υποφακέλους τους, δεν θα εμφανίζονται στη συλλογή σας.", + "@settingsHiddenPathsBanner": {}, "addPathTooltip": "Προσθήκη διαδρομής", - + "@addPathTooltip": {}, "settingsStorageAccessTile": "Πρόσβαση στον χώρο αποθήκευσης", + "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "Προσβαση στον Χωρο Αποθηκευσης", + "@settingsStorageAccessPageTitle": {}, "settingsStorageAccessBanner": "Ορισμένοι κατάλογοι απαιτούν ρητή άδεια πρόσβασης για την τροποποίηση των αρχείων που βρίσκονται σε αυτούς. Μπορείτε να δείτε εδώ τους καταλόγους στους οποίους έχετε ήδη χορηγήσει πρόσβαση.", + "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "Δεν έχει χορηγηθεί πρόσβαση", + "@settingsStorageAccessEmpty": {}, "settingsStorageAccessRevokeTooltip": "Ανάκληση χορήγησης πρόσβασης", - + "@settingsStorageAccessRevokeTooltip": {}, "settingsAccessibilitySectionTitle": "Προσβασιμοτητα", + "@settingsAccessibilitySectionTitle": {}, "settingsRemoveAnimationsTile": "Κατάργηση κινούμενων εικόνων", + "@settingsRemoveAnimationsTile": {}, "settingsRemoveAnimationsDialogTitle": "Καταργηση Κινουμενων Εικονων", + "@settingsRemoveAnimationsDialogTitle": {}, "settingsTimeToTakeActionTile": "Χρόνος λήψης ενεργειών", - + "@settingsTimeToTakeActionTile": {}, "settingsDisplaySectionTitle": "Οθονη", + "@settingsDisplaySectionTitle": {}, "settingsThemeBrightnessTile": "Θέμα", + "@settingsThemeBrightnessTile": {}, "settingsThemeBrightnessDialogTitle": "Θεμα", + "@settingsThemeBrightnessDialogTitle": {}, "settingsThemeColorHighlights": "Χρωματιστά εικονίδια", + "@settingsThemeColorHighlights": {}, "settingsThemeEnableDynamicColor": "Έντονο χρώμα", + "@settingsThemeEnableDynamicColor": {}, "settingsDisplayRefreshRateModeTile": "Εμφάνιση ρυθμού ανανέωσης", + "@settingsDisplayRefreshRateModeTile": {}, "settingsDisplayRefreshRateModeDialogTitle": "Ρυθμος ανανεωσης", - + "@settingsDisplayRefreshRateModeDialogTitle": {}, "settingsLanguageSectionTitle": "Γλωσσα & Μορφες", + "@settingsLanguageSectionTitle": {}, "settingsLanguageTile": "Γλώσσα", + "@settingsLanguageTile": {}, "settingsLanguagePageTitle": "Γλωσσα", + "@settingsLanguagePageTitle": {}, "settingsCoordinateFormatTile": "Μορφή συντεταγμένων", + "@settingsCoordinateFormatTile": {}, "settingsCoordinateFormatDialogTitle": "Μορφη Συντεταγμενων", + "@settingsCoordinateFormatDialogTitle": {}, "settingsUnitSystemTile": "Σύστημα μέτρησης", + "@settingsUnitSystemTile": {}, "settingsUnitSystemDialogTitle": "Συστημα μετρησης", - + "@settingsUnitSystemDialogTitle": {}, "settingsScreenSaverPageTitle": "Προφυλαξη οθονης", - + "@settingsScreenSaverPageTitle": {}, "settingsWidgetPageTitle": "Κορνιζα", + "@settingsWidgetPageTitle": {}, "settingsWidgetShowOutline": "Περίγραμμα", + "@settingsWidgetShowOutline": {}, "settingsWidgetOpenPage": "Όταν πατάτε στο γραφικό στοιχείο", - + "@settingsWidgetOpenPage": {}, "settingsCollectionTile": "Συλλογή", - + "@settingsCollectionTile": {}, "statsPageTitle": "Στατιστικα", + "@statsPageTitle": {}, "statsWithGps": "{count, plural, =1{1 στοιχείο με τοποθεσία} other{{count} στοιχεία με τοποθεσία}}", + "@statsWithGps": {}, "statsTopCountriesSectionTitle": "Κορυφαιες Χωρες", + "@statsTopCountriesSectionTitle": {}, "statsTopPlacesSectionTitle": "Κορυφαια Μερη", + "@statsTopPlacesSectionTitle": {}, "statsTopTagsSectionTitle": "Κορυφαιες Ετικετες", + "@statsTopTagsSectionTitle": {}, "statsTopAlbumsSectionTitle": "Κορυφαια Αλμπουμ", - + "@statsTopAlbumsSectionTitle": {}, "viewerOpenPanoramaButtonLabel": "Άνοιγμα πανοραμικών", + "@viewerOpenPanoramaButtonLabel": {}, "viewerSetWallpaperButtonLabel": "ΟΡΙΣΜΟΣ ΤΑΠΕΤΣΑΡΙΑΣ", + "@viewerSetWallpaperButtonLabel": {}, "viewerErrorUnknown": "Ωχ!", + "@viewerErrorUnknown": {}, "viewerErrorDoesNotExist": "Το αρχείο δεν υπάρχει πλέον.", - + "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "Πληροφοριες", + "@viewerInfoPageTitle": {}, "viewerInfoBackToViewerTooltip": "Επιστροφή στην προβολή", - + "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "Άγνωστο", + "@viewerInfoUnknown": {}, "viewerInfoLabelDescription": "Περιγραφή", + "@viewerInfoLabelDescription": {}, "viewerInfoLabelTitle": "Όνομα", + "@viewerInfoLabelTitle": {}, "viewerInfoLabelDate": "Ημερομηνία", + "@viewerInfoLabelDate": {}, "viewerInfoLabelResolution": "Ανάλυση", + "@viewerInfoLabelResolution": {}, "viewerInfoLabelSize": "Μέγεθος", + "@viewerInfoLabelSize": {}, "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, "viewerInfoLabelPath": "Διαδρομή", + "@viewerInfoLabelPath": {}, "viewerInfoLabelDuration": "Διάρκεια", + "@viewerInfoLabelDuration": {}, "viewerInfoLabelOwner": "Κάτοχος", + "@viewerInfoLabelOwner": {}, "viewerInfoLabelCoordinates": "Συντεταγμένες", + "@viewerInfoLabelCoordinates": {}, "viewerInfoLabelAddress": "Διεύθυνση", - + "@viewerInfoLabelAddress": {}, "mapStyleDialogTitle": "Στυλ χαρτη", + "@mapStyleDialogTitle": {}, "mapStyleTooltip": "Επιλέξτε στυλ χάρτη", + "@mapStyleTooltip": {}, "mapZoomInTooltip": "Μεγέθυνση", + "@mapZoomInTooltip": {}, "mapZoomOutTooltip": "Σμίκρυνση", + "@mapZoomOutTooltip": {}, "mapPointNorthUpTooltip": "Εμφάνιση του βορρά στην κορυφή", + "@mapPointNorthUpTooltip": {}, "mapAttributionOsmHot": "Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors • Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, "mapAttributionStamen": "Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors • Tiles by [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, "openMapPageTooltip": "Προβολή στη σελίδα του χάρτη", + "@openMapPageTooltip": {}, "mapEmptyRegion": "Δεν υπάρχουν εικόνες σε αυτήν την περιοχή", - + "@mapEmptyRegion": {}, "viewerInfoOpenEmbeddedFailureFeedback": "Αποτυχία εξαγωγής ενσωματωμένων δεδομένων", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, "viewerInfoOpenLinkText": "Άνοιγμα", + "@viewerInfoOpenLinkText": {}, "viewerInfoViewXmlLinkText": "Προβολή του αρχείου XML", - + "@viewerInfoViewXmlLinkText": {}, "viewerInfoSearchFieldLabel": "Αναζήτηση μεταδεδομένων", + "@viewerInfoSearchFieldLabel": {}, "viewerInfoSearchEmpty": "Δεν ταιριάζουν τα κλειδιά", + "@viewerInfoSearchEmpty": {}, "viewerInfoSearchSuggestionDate": "Ημερομηνία & Ώρα", + "@viewerInfoSearchSuggestionDate": {}, "viewerInfoSearchSuggestionDescription": "Περιγραφή", + "@viewerInfoSearchSuggestionDescription": {}, "viewerInfoSearchSuggestionDimensions": "Διαστάσεις", + "@viewerInfoSearchSuggestionDimensions": {}, "viewerInfoSearchSuggestionResolution": "Ανάλυση", + "@viewerInfoSearchSuggestionResolution": {}, "viewerInfoSearchSuggestionRights": "Δικαιώματα", - + "@viewerInfoSearchSuggestionRights": {}, "wallpaperUseScrollEffect": "Εφέ κύλισης στην αρχική οθόνη", - + "@wallpaperUseScrollEffect": {}, "tagEditorPageTitle": "Επεξεργασια Ετικετων", + "@tagEditorPageTitle": {}, "tagEditorPageNewTagFieldLabel": "Νέα ετικέτα", + "@tagEditorPageNewTagFieldLabel": {}, "tagEditorPageAddTagTooltip": "Προσθήκη ετικέτας", + "@tagEditorPageAddTagTooltip": {}, "tagEditorSectionRecent": "Πρόσφατα", - + "@tagEditorSectionRecent": {}, "panoramaEnableSensorControl": "Ενεργοποίηση ελέγχου αισθητήρα", + "@panoramaEnableSensorControl": {}, "panoramaDisableSensorControl": "Απενεργοποίηση ελέγχου αισθητήρα", - + "@panoramaDisableSensorControl": {}, "sourceViewerPageTitle": "Πηγη", - + "@sourceViewerPageTitle": {}, "filePickerShowHiddenFiles": "Εμφάνιση κρυφών αρχείων", + "@filePickerShowHiddenFiles": {}, "filePickerDoNotShowHiddenFiles": "Να μην εμφανίζονται τα κρυφά αρχεία", + "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "Άνοιγμα από", + "@filePickerOpenFrom": {}, "filePickerNoItems": "Κανένα στοιχείο", - "filePickerUseThisFolder": "Χρησιμοποιήστε αυτόν τον φάκελο" + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "Χρησιμοποιήστε αυτόν τον φάκελο", + "@filePickerUseThisFolder": {} } diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 4eff26ac7..62027cb06 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1,661 +1,1088 @@ { "appName": "Aves", + "@appName": {}, "welcomeMessage": "Bienvenido a Aves", + "@welcomeMessage": {}, "welcomeOptional": "Opcional", + "@welcomeOptional": {}, "welcomeTermsToggle": "Acepto los términos y condiciones", + "@welcomeTermsToggle": {}, "itemCount": "{count, plural, =1{1 elemento} other{{count} elementos}}", - + "@itemCount": {}, "timeSeconds": "{seconds, plural, =1{1 segundo} other{{seconds} segundos}}", + "@timeSeconds": {}, "timeMinutes": "{minutes, plural, =1{1 minuto} other{{minutes} minutos}}", + "@timeMinutes": {}, "timeDays": "{days, plural, =1{1 día} other{{days} días}}", + "@timeDays": {}, "focalLength": "{length} mm", - + "@focalLength": {}, "applyButtonLabel": "APLICAR", + "@applyButtonLabel": {}, "deleteButtonLabel": "BORRAR", + "@deleteButtonLabel": {}, "nextButtonLabel": "SIGUIENTE", + "@nextButtonLabel": {}, "showButtonLabel": "MOSTRAR", + "@showButtonLabel": {}, "hideButtonLabel": "OCULTAR", + "@hideButtonLabel": {}, "continueButtonLabel": "CONTINUAR", - + "@continueButtonLabel": {}, "cancelTooltip": "Cancelar", + "@cancelTooltip": {}, "changeTooltip": "Cambiar", + "@changeTooltip": {}, "clearTooltip": "Limpiar", + "@clearTooltip": {}, "previousTooltip": "Anterior", + "@previousTooltip": {}, "nextTooltip": "Siguiente", + "@nextTooltip": {}, "showTooltip": "Mostrar", + "@showTooltip": {}, "hideTooltip": "Ocultar", + "@hideTooltip": {}, "actionRemove": "Remover", + "@actionRemove": {}, "resetTooltip": "Restablecer", + "@resetTooltip": {}, "saveTooltip": "Guardar", + "@saveTooltip": {}, "pickTooltip": "Elegir", - + "@pickTooltip": {}, "doubleBackExitMessage": "Presione «atrás» nuevamente para salir.", + "@doubleBackExitMessage": {}, "doNotAskAgain": "No preguntar nuevamente", - + "@doNotAskAgain": {}, "sourceStateLoading": "Cargando", + "@sourceStateLoading": {}, "sourceStateCataloguing": "Catalogando", + "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "Ubicando países", + "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "Ubicando lugares", - + "@sourceStateLocatingPlaces": {}, "chipActionDelete": "Borrar", + "@chipActionDelete": {}, "chipActionGoToAlbumPage": "Mostrar en Álbumes", + "@chipActionGoToAlbumPage": {}, "chipActionGoToCountryPage": "Mostrar en Países", + "@chipActionGoToCountryPage": {}, "chipActionGoToTagPage": "Mostrar en Etiquetas", + "@chipActionGoToTagPage": {}, "chipActionHide": "Esconder", + "@chipActionHide": {}, "chipActionPin": "Fijar", + "@chipActionPin": {}, "chipActionUnpin": "Dejar de fijar", + "@chipActionUnpin": {}, "chipActionRename": "Renombrar", + "@chipActionRename": {}, "chipActionSetCover": "Elegir carátula", + "@chipActionSetCover": {}, "chipActionCreateAlbum": "Crear álbum", - + "@chipActionCreateAlbum": {}, "entryActionCopyToClipboard": "Copiar al portapapeles", + "@entryActionCopyToClipboard": {}, "entryActionDelete": "Borrar", + "@entryActionDelete": {}, "entryActionConvert": "Convertir", + "@entryActionConvert": {}, "entryActionExport": "Exportar", + "@entryActionExport": {}, "entryActionInfo": "Información", + "@entryActionInfo": {}, "entryActionRename": "Renombrar", + "@entryActionRename": {}, "entryActionRestore": "Restaurar", + "@entryActionRestore": {}, "entryActionRotateCCW": "Rotar en sentido antihorario", + "@entryActionRotateCCW": {}, "entryActionRotateCW": "Rotar en sentido horario", + "@entryActionRotateCW": {}, "entryActionFlip": "Voltear horizontalmente", + "@entryActionFlip": {}, "entryActionPrint": "Imprimir", + "@entryActionPrint": {}, "entryActionShare": "Compartir", + "@entryActionShare": {}, "entryActionViewSource": "Ver fuente", + "@entryActionViewSource": {}, "entryActionShowGeoTiffOnMap": "Mostrar como mapa superpuesto", + "@entryActionShowGeoTiffOnMap": {}, "entryActionConvertMotionPhotoToStillImage": "Convertir a imagen fija", + "@entryActionConvertMotionPhotoToStillImage": {}, "entryActionViewMotionPhotoVideo": "Abrir video", + "@entryActionViewMotionPhotoVideo": {}, "entryActionEdit": "Editar", + "@entryActionEdit": {}, "entryActionOpen": "Abrir con", + "@entryActionOpen": {}, "entryActionSetAs": "Establecer como", + "@entryActionSetAs": {}, "entryActionOpenMap": "Mostrar en aplicación de mapa", + "@entryActionOpenMap": {}, "entryActionRotateScreen": "Rotar pantalla", + "@entryActionRotateScreen": {}, "entryActionAddFavourite": "Agregar a favoritos", + "@entryActionAddFavourite": {}, "entryActionRemoveFavourite": "Quitar de favoritos", - + "@entryActionRemoveFavourite": {}, "videoActionCaptureFrame": "Capturar fotograma", + "@videoActionCaptureFrame": {}, "videoActionMute": "Silenciar", + "@videoActionMute": {}, "videoActionUnmute": "Dejar de silenciar", + "@videoActionUnmute": {}, "videoActionPause": "Pausa", + "@videoActionPause": {}, "videoActionPlay": "Reproducir", + "@videoActionPlay": {}, "videoActionReplay10": "Retroceder 10 segundos", + "@videoActionReplay10": {}, "videoActionSkip10": "Adelantar 10 segundos", + "@videoActionSkip10": {}, "videoActionSelectStreams": "Seleccionar pistas", + "@videoActionSelectStreams": {}, "videoActionSetSpeed": "Velocidad de reproducción", + "@videoActionSetSpeed": {}, "videoActionSettings": "Ajustes", - + "@videoActionSettings": {}, "slideshowActionResume": "Reanudar", + "@slideshowActionResume": {}, "slideshowActionShowInCollection": "Mostrar en Colección", - + "@slideshowActionShowInCollection": {}, "entryInfoActionEditDate": "Editar fecha y hora", + "@entryInfoActionEditDate": {}, "entryInfoActionEditLocation": "Editar ubicación", + "@entryInfoActionEditLocation": {}, "entryInfoActionEditRating": "Editar clasificación", + "@entryInfoActionEditRating": {}, "entryInfoActionEditTags": "Editar etiquetas", + "@entryInfoActionEditTags": {}, "entryInfoActionRemoveMetadata": "Eliminar metadatos", - + "@entryInfoActionRemoveMetadata": {}, "filterBinLabel": "Cesto de basura", + "@filterBinLabel": {}, "filterFavouriteLabel": "Favorito", + "@filterFavouriteLabel": {}, "filterNoLocationLabel": "No localizado", + "@filterNoLocationLabel": {}, "filterNoRatingLabel": "Sin clasificar", + "@filterNoRatingLabel": {}, "filterNoTagLabel": "Sin etiquetar", + "@filterNoTagLabel": {}, "filterOnThisDayLabel": "De este día", + "@filterOnThisDayLabel": {}, "filterRatingRejectedLabel": "Rechazado", + "@filterRatingRejectedLabel": {}, "filterTypeAnimatedLabel": "Animado", + "@filterTypeAnimatedLabel": {}, "filterTypeMotionPhotoLabel": "Foto en movimiento", + "@filterTypeMotionPhotoLabel": {}, "filterTypePanoramaLabel": "Panorámica", + "@filterTypePanoramaLabel": {}, "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, "filterTypeSphericalVideoLabel": "Video en 360°", + "@filterTypeSphericalVideoLabel": {}, "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, "filterMimeImageLabel": "Imagen", + "@filterMimeImageLabel": {}, "filterMimeVideoLabel": "Video", - + "@filterMimeVideoLabel": {}, "coordinateFormatDms": "GMS", + "@coordinateFormatDms": {}, "coordinateFormatDecimal": "Grados decimales", + "@coordinateFormatDecimal": {}, "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, "coordinateDmsWest": "O", - + "@coordinateDmsWest": {}, "unitSystemMetric": "Métrico", + "@unitSystemMetric": {}, "unitSystemImperial": "Imperial", - + "@unitSystemImperial": {}, "videoLoopModeNever": "Nunca", + "@videoLoopModeNever": {}, "videoLoopModeShortOnly": "Sólo videos cortos", + "@videoLoopModeShortOnly": {}, "videoLoopModeAlways": "Siempre", - + "@videoLoopModeAlways": {}, "videoControlsNone": "Ninguno", + "@videoControlsNone": {}, "videoControlsPlay": "Reproducir", + "@videoControlsPlay": {}, "videoControlsPlaySeek": "Reproducir y buscar", + "@videoControlsPlaySeek": {}, "videoControlsPlayOutside": "Reproducir externamente", - + "@videoControlsPlayOutside": {}, "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, "mapStyleGoogleHybrid": "Google Maps (Híbrido)", + "@mapStyleGoogleHybrid": {}, "mapStyleGoogleTerrain": "Google Maps (Relieve)", + "@mapStyleGoogleTerrain": {}, "mapStyleHuaweiNormal": "Petal Maps", + "@mapStyleHuaweiNormal": {}, "mapStyleHuaweiTerrain": "Petal Maps (Relieve)", + "@mapStyleHuaweiTerrain": {}, "mapStyleOsmHot": "OSM Humanitario", + "@mapStyleOsmHot": {}, "mapStyleStamenToner": "Stamen Toner (Monocromático)", + "@mapStyleStamenToner": {}, "mapStyleStamenWatercolor": "Stamen Watercolor (Acuarela)", - + "@mapStyleStamenWatercolor": {}, "nameConflictStrategyRename": "Renombrar", + "@nameConflictStrategyRename": {}, "nameConflictStrategyReplace": "Reemplazar", + "@nameConflictStrategyReplace": {}, "nameConflictStrategySkip": "Saltear", - + "@nameConflictStrategySkip": {}, "keepScreenOnNever": "Nunca", + "@keepScreenOnNever": {}, "keepScreenOnViewerOnly": "Sólo en el visor", + "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "Siempre", - + "@keepScreenOnAlways": {}, "accessibilityAnimationsRemove": "Prevenir efectos en pantalla", + "@accessibilityAnimationsRemove": {}, "accessibilityAnimationsKeep": "Mantener efectos en pantalla", - + "@accessibilityAnimationsKeep": {}, "displayRefreshRatePreferHighest": "Alta tasa", + "@displayRefreshRatePreferHighest": {}, "displayRefreshRatePreferLowest": "Baja tasa", - + "@displayRefreshRatePreferLowest": {}, "videoPlaybackSkip": "Saltear", + "@videoPlaybackSkip": {}, "videoPlaybackMuted": "Reproducir sin sonido", + "@videoPlaybackMuted": {}, "videoPlaybackWithSound": "Reproducir con sonido", - + "@videoPlaybackWithSound": {}, "themeBrightnessLight": "Claro", + "@themeBrightnessLight": {}, "themeBrightnessDark": "Obscuro", + "@themeBrightnessDark": {}, "themeBrightnessBlack": "Negro", - + "@themeBrightnessBlack": {}, "viewerTransitionSlide": "Diapositiva", + "@viewerTransitionSlide": {}, "viewerTransitionParallax": "Paralaje", + "@viewerTransitionParallax": {}, "viewerTransitionFade": "Desvanecer", + "@viewerTransitionFade": {}, "viewerTransitionZoomIn": "Acercar", - + "@viewerTransitionZoomIn": {}, "wallpaperTargetHome": "Pantalla de inicio", + "@wallpaperTargetHome": {}, "wallpaperTargetLock": "Pantalla de bloqueo", + "@wallpaperTargetLock": {}, "wallpaperTargetHomeLock": "Pantallas de inicio y bloqueo", - + "@wallpaperTargetHomeLock": {}, "albumTierNew": "Nuevo", + "@albumTierNew": {}, "albumTierPinned": "Fijado", + "@albumTierPinned": {}, "albumTierSpecial": "Común", + "@albumTierSpecial": {}, "albumTierApps": "Aplicaciones", + "@albumTierApps": {}, "albumTierRegular": "Otros", - + "@albumTierRegular": {}, "storageVolumeDescriptionFallbackPrimary": "Almacenamiento interno", + "@storageVolumeDescriptionFallbackPrimary": {}, "storageVolumeDescriptionFallbackNonPrimary": "Tarjeta de memoria", + "@storageVolumeDescriptionFallbackNonPrimary": {}, "rootDirectoryDescription": "el directorio raíz", + "@rootDirectoryDescription": {}, "otherDirectoryDescription": "el directorio «{name}»", + "@otherDirectoryDescription": {}, "storageAccessDialogMessage": "Por favor seleccione {directory} en «{volume}» en la siguiente pantalla para permitir a esta aplicación tener acceso.", + "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "Esta aplicación no tiene permiso para modificar archivos de {directory} en «{volume}».\n\nPor favor use un gestor de archivos o la aplicación de galería preinstalada para mover los elementos a otro directorio.", + "@restrictedAccessDialogMessage": {}, "notEnoughSpaceDialogMessage": "Esta operación necesita {neededSize} de espacio libre en «{volume}» para completarse, pero sólo hay {freeSize} disponible.", + "@notEnoughSpaceDialogMessage": {}, "missingSystemFilePickerDialogMessage": "El selector de archivos del sistema no se encuentra disponible o fue deshabilitado. Por favor habilítelo e intente nuevamente.", - + "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, =1{Esta operación no está disponible para un elemento del siguiente tipo: {types}.} other{Esta operación no está disponible para elementos de los siguientes tipos: {types}.}}", - + "@unsupportedTypeDialogMessage": {}, "nameConflictDialogSingleSourceMessage": "Algunos archivos en el directorio de destino tienen el mismo nombre.", + "@nameConflictDialogSingleSourceMessage": {}, "nameConflictDialogMultipleSourceMessage": "Algunos archivos tienen el mismo nombre.", - + "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "Etiqueta del atajo", + "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "AGREGAR", - + "@addShortcutButtonLabel": {}, "noMatchingAppDialogMessage": "No se encontraron aplicaciones para manejar esto.", - + "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{¿Mover este elemento al cesto de basura?} other{¿Mover estos {count} elementos al cesto de basura?}}", + "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{¿Está seguro de borrar este elemento?} other{¿Está seguro de querer borrar {count} elementos?}}", + "@deleteEntriesConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogMessage": "Algunos elementos no poseen fecha en sus metadatos. Su fecha actual será reemplazada por esta operación a menos que una fecha de metadatos sea fijada.", + "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Fijar fecha", - + "@moveUndatedConfirmationDialogSetDate": {}, "videoResumeDialogMessage": "¿Desea reanudar la reproducción a las {time}?", + "@videoResumeDialogMessage": {}, "videoStartOverButtonLabel": "VOLVER A EMPEZAR", + "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "REANUDAR", - + "@videoResumeButtonLabel": {}, "setCoverDialogLatest": "Elemento más reciente", + "@setCoverDialogLatest": {}, "setCoverDialogAuto": "Automático", + "@setCoverDialogAuto": {}, "setCoverDialogCustom": "Personalizado", - + "@setCoverDialogCustom": {}, "hideFilterConfirmationDialogMessage": "Fotos y videos que concuerden serán ocultados de su colección. Puede volver a mostrarlos desde los ajustes de «Privacidad».\n\n¿Está seguro de que desea ocultarlos?", - + "@hideFilterConfirmationDialogMessage": {}, "newAlbumDialogTitle": "Álbum nuevo", + "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "Nombre del álbum", + "@newAlbumDialogNameLabel": {}, "newAlbumDialogNameLabelAlreadyExistsHelper": "El directorio ya existe", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "Almacenamiento:", - + "@newAlbumDialogStorageLabel": {}, "renameAlbumDialogLabel": "Renombrar", + "@renameAlbumDialogLabel": {}, "renameAlbumDialogLabelAlreadyExistsHelper": "El directorio ya existe", - + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, "renameEntrySetPageTitle": "Renombrar", + "@renameEntrySetPageTitle": {}, "renameEntrySetPagePatternFieldLabel": "Patrón de nombramiento", + "@renameEntrySetPagePatternFieldLabel": {}, "renameEntrySetPageInsertTooltip": "Insertar campo", + "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "Vista previa", - + "@renameEntrySetPagePreviewSectionTitle": {}, "renameProcessorCounter": "Contador", + "@renameProcessorCounter": {}, "renameProcessorName": "Nombre", - + "@renameProcessorName": {}, "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{¿Está seguro de que desea borrar este álbum y un elemento?} other{¿Está seguro de que desea borrar este álbum y sus {count} elementos?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{¿Está seguro de que desea borrar estos álbumes y un elemento?} other{¿Está seguro de que desea borrar estos álbumes y sus {count} elementos?}}", - + "@deleteMultiAlbumConfirmationDialogMessage": {}, "exportEntryDialogFormat": "Formato:", + "@exportEntryDialogFormat": {}, "exportEntryDialogWidth": "Anchura", + "@exportEntryDialogWidth": {}, "exportEntryDialogHeight": "Altura", - + "@exportEntryDialogHeight": {}, "renameEntryDialogLabel": "Renombrar", - + "@renameEntryDialogLabel": {}, "editEntryDialogTargetFieldsHeader": "Campos a modificar", - + "@editEntryDialogTargetFieldsHeader": {}, "editEntryDateDialogTitle": "Fecha y hora", + "@editEntryDateDialogTitle": {}, "editEntryDateDialogSetCustom": "Establecer fecha personalizada", + "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Copiar de otra fecha", + "@editEntryDateDialogCopyField": {}, "editEntryDateDialogCopyItem": "Copiar de otro elemento", + "@editEntryDateDialogCopyItem": {}, "editEntryDateDialogExtractFromTitle": "Extraer del título", + "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Cambiar", + "@editEntryDateDialogShift": {}, "editEntryDateDialogSourceFileModifiedDate": "Fecha de modificación del archivo", - + "@editEntryDateDialogSourceFileModifiedDate": {}, "durationDialogHours": "Horas", + "@durationDialogHours": {}, "durationDialogMinutes": "Minutos", - + "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Ubicación", + "@editEntryLocationDialogTitle": {}, "editEntryLocationDialogChooseOnMapTooltip": "Elegir en el mapa", + "@editEntryLocationDialogChooseOnMapTooltip": {}, "editEntryLocationDialogLatitude": "Latitud", + "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Longitud", - + "@editEntryLocationDialogLongitude": {}, "locationPickerUseThisLocationButton": "Usar esta ubicación", - + "@locationPickerUseThisLocationButton": {}, "editEntryRatingDialogTitle": "Clasificación", - + "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "Eliminación de metadatos", + "@removeEntryMetadataDialogTitle": {}, "removeEntryMetadataDialogMore": "Más", - + "@removeEntryMetadataDialogMore": {}, "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP es necesario para reproducir la animación de una foto en movimiento.\n\n¿Está seguro de que desea removerlo?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, "convertMotionPhotoToStillImageWarningDialogMessage": "¿Está seguro?", - + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, "videoSpeedDialogLabel": "Velocidad de reproducción", - + "@videoSpeedDialogLabel": {}, "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, "videoStreamSelectionDialogText": "Subtítulos", + "@videoStreamSelectionDialogText": {}, "videoStreamSelectionDialogOff": "Desactivado", + "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "Pista", + "@videoStreamSelectionDialogTrack": {}, "videoStreamSelectionDialogNoSelection": "No hay otras pistas.", - + "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "¡Completado!", + "@genericSuccessFeedback": {}, "genericFailureFeedback": "Falló", - + "@genericFailureFeedback": {}, "menuActionConfigureView": "Ver", + "@menuActionConfigureView": {}, "menuActionSelect": "Seleccionar", + "@menuActionSelect": {}, "menuActionSelectAll": "Seleccionar todo", + "@menuActionSelectAll": {}, "menuActionSelectNone": "Deseleccionar", + "@menuActionSelectNone": {}, "menuActionMap": "Mapa", + "@menuActionMap": {}, "menuActionSlideshow": "Presentación", + "@menuActionSlideshow": {}, "menuActionStats": "Estadísticas", - + "@menuActionStats": {}, "viewDialogSortSectionTitle": "Ordenar", + "@viewDialogSortSectionTitle": {}, "viewDialogGroupSectionTitle": "Grupo", + "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "Disposición", - + "@viewDialogLayoutSectionTitle": {}, "tileLayoutGrid": "Cuadrícula", + "@tileLayoutGrid": {}, "tileLayoutList": "Lista", - + "@tileLayoutList": {}, "coverDialogTabCover": "Carátula", + "@coverDialogTabCover": {}, "coverDialogTabApp": "Aplicación", + "@coverDialogTabApp": {}, "coverDialogTabColor": "Color", - + "@coverDialogTabColor": {}, "appPickDialogTitle": "Escoger aplicación", + "@appPickDialogTitle": {}, "appPickDialogNone": "Ninguna", - + "@appPickDialogNone": {}, "aboutPageTitle": "Acerca de", + "@aboutPageTitle": {}, "aboutLinkLicense": "Licencia", + "@aboutLinkLicense": {}, "aboutLinkPolicy": "Política de privacidad", - + "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "Reporte de errores", + "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "Guardar registros de la aplicación a un archivo", + "@aboutBugSaveLogInstruction": {}, "aboutBugCopyInfoInstruction": "Copiar información del sistema", + "@aboutBugCopyInfoInstruction": {}, "aboutBugCopyInfoButton": "Copiar", + "@aboutBugCopyInfoButton": {}, "aboutBugReportInstruction": "Reportar en GitHub con los registros y la información del sistema", + "@aboutBugReportInstruction": {}, "aboutBugReportButton": "Reportar", - + "@aboutBugReportButton": {}, "aboutCreditsSectionTitle": "Créditos", + "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "Esta aplicación usa un archivo TopoJSON de", + "@aboutCreditsWorldAtlas1": {}, "aboutCreditsWorldAtlas2": "bajo licencia ISC.", - "aboutTranslatorsSectionTitle": "Traductores:", - + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Traductores", + "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "Licencias de código abierto", + "@aboutLicensesSectionTitle": {}, "aboutLicensesBanner": "Esta aplicación usa los siguientes paquetes y librerías de código abierto.", + "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "Librerías de Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, "aboutLicensesFlutterPluginsSectionTitle": "Añadidos de Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, "aboutLicensesFlutterPackagesSectionTitle": "Paquetes de Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, "aboutLicensesDartPackagesSectionTitle": "Paquetes de Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "Mostrar todas las licencias", - + "@aboutLicensesShowAllButtonLabel": {}, "policyPageTitle": "Política de privacidad", - + "@policyPageTitle": {}, "collectionPageTitle": "Colección", + "@collectionPageTitle": {}, "collectionPickPageTitle": "Elegir", + "@collectionPickPageTitle": {}, "collectionSelectPageTitle": "Seleccionar", - + "@collectionSelectPageTitle": {}, "collectionActionShowTitleSearch": "Mostrar filtros de títulos", + "@collectionActionShowTitleSearch": {}, "collectionActionHideTitleSearch": "Ocultar filtros de títulos", + "@collectionActionHideTitleSearch": {}, "collectionActionAddShortcut": "Agregar atajo", + "@collectionActionAddShortcut": {}, "collectionActionEmptyBin": "Vaciar cesto", + "@collectionActionEmptyBin": {}, "collectionActionCopy": "Copiar a álbum", + "@collectionActionCopy": {}, "collectionActionMove": "Mover a álbum", + "@collectionActionMove": {}, "collectionActionRescan": "Volver a buscar", + "@collectionActionRescan": {}, "collectionActionEdit": "Editar", - + "@collectionActionEdit": {}, "collectionSearchTitlesHintText": "Buscar títulos", - + "@collectionSearchTitlesHintText": {}, "collectionGroupAlbum": "Por álbum", + "@collectionGroupAlbum": {}, "collectionGroupMonth": "Por mes", + "@collectionGroupMonth": {}, "collectionGroupDay": "Por día", + "@collectionGroupDay": {}, "collectionGroupNone": "No agrupar", - + "@collectionGroupNone": {}, "sectionUnknown": "Desconocido", + "@sectionUnknown": {}, "dateToday": "Hoy", + "@dateToday": {}, "dateYesterday": "Ayer", + "@dateYesterday": {}, "dateThisMonth": "Este mes", + "@dateThisMonth": {}, "collectionDeleteFailureFeedback": "{count, plural, =1{Error al borrar 1 elemento} other{Error al borrar {count} elementos}}", + "@collectionDeleteFailureFeedback": {}, "collectionCopyFailureFeedback": "{count, plural, =1{Error al copiar 1 item} other{Error al copiar {count} elementos}}", + "@collectionCopyFailureFeedback": {}, "collectionMoveFailureFeedback": "{count, plural, =1{Error al mover 1 elemento} other{Error al mover {count} elementos}}", + "@collectionMoveFailureFeedback": {}, "collectionRenameFailureFeedback": "{count, plural, =1{Error al renombrar 1 elemento} other{Error al renombrar {count} elementos}}", + "@collectionRenameFailureFeedback": {}, "collectionEditFailureFeedback": "{count, plural, =1{Error al editar 1 elemento} other{Error al editar {count} elementos}}", + "@collectionEditFailureFeedback": {}, "collectionExportFailureFeedback": "{count, plural, =1{Error al exportar 1 página} other{Error al exportar {count} páginas}}", + "@collectionExportFailureFeedback": {}, "collectionCopySuccessFeedback": "{count, plural, =1{1 elemento copiado} other{Copiados{count} elementos}}", + "@collectionCopySuccessFeedback": {}, "collectionMoveSuccessFeedback": "{count, plural, =1{1 elemento movido} other{Movidos {count} elementos}}", + "@collectionMoveSuccessFeedback": {}, "collectionRenameSuccessFeedback": "{count, plural, =1{1 elemento renombrado} other{Renombrados {count} elementos}}", + "@collectionRenameSuccessFeedback": {}, "collectionEditSuccessFeedback": "{count, plural, =1{1 elemento editado} other{Editados {count} elementos}}", - + "@collectionEditSuccessFeedback": {}, "collectionEmptyFavourites": "Sin favoritos", + "@collectionEmptyFavourites": {}, "collectionEmptyVideos": "Sin videos", + "@collectionEmptyVideos": {}, "collectionEmptyImages": "Sin imágenes", + "@collectionEmptyImages": {}, "collectionEmptyGrantAccessButtonLabel": "Otorgar accceso", - + "@collectionEmptyGrantAccessButtonLabel": {}, "collectionSelectSectionTooltip": "Seleccionar sección", + "@collectionSelectSectionTooltip": {}, "collectionDeselectSectionTooltip": "Deseleccionar sección", - + "@collectionDeselectSectionTooltip": {}, "drawerAboutButton": "Acerca de", + "@drawerAboutButton": {}, "drawerSettingsButton": "Ajustes", + "@drawerSettingsButton": {}, "drawerCollectionAll": "Toda la colección", + "@drawerCollectionAll": {}, "drawerCollectionFavourites": "Favoritos", + "@drawerCollectionFavourites": {}, "drawerCollectionImages": "Imágenes", + "@drawerCollectionImages": {}, "drawerCollectionVideos": "Videos", + "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "Animaciones", + "@drawerCollectionAnimated": {}, "drawerCollectionMotionPhotos": "Fotos en movimiento", + "@drawerCollectionMotionPhotos": {}, "drawerCollectionPanoramas": "Panorámicas", + "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "Fotos Raw", + "@drawerCollectionRaws": {}, "drawerCollectionSphericalVideos": "Videos en 360°", + "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "Álbumes", + "@drawerAlbumPage": {}, "drawerCountryPage": "Países", + "@drawerCountryPage": {}, "drawerTagPage": "Etiquetas", - + "@drawerTagPage": {}, "sortByDate": "Por fecha", + "@sortByDate": {}, "sortByName": "Por nombre", + "@sortByName": {}, "sortByItemCount": "Por número de elementos", + "@sortByItemCount": {}, "sortBySize": "Por tamaño", + "@sortBySize": {}, "sortByAlbumFileName": "Por nombre de álbum y archivo", + "@sortByAlbumFileName": {}, "sortByRating": "Por clasificación", - + "@sortByRating": {}, "albumGroupTier": "Por nivel", + "@albumGroupTier": {}, "albumGroupVolume": "Por volumen de almacenamiento", + "@albumGroupVolume": {}, "albumGroupNone": "No agrupar", - + "@albumGroupNone": {}, "albumPickPageTitleCopy": "Copiar a álbum", + "@albumPickPageTitleCopy": {}, "albumPickPageTitleExport": "Exportar a álbum", + "@albumPickPageTitleExport": {}, "albumPickPageTitleMove": "Mover a álbum", + "@albumPickPageTitleMove": {}, "albumPickPageTitlePick": "Elegir álbum", - + "@albumPickPageTitlePick": {}, "albumCamera": "Cámara", + "@albumCamera": {}, "albumDownload": "Descargar", + "@albumDownload": {}, "albumScreenshots": "Capturas de pantalla", + "@albumScreenshots": {}, "albumScreenRecordings": "Grabaciones de pantalla", + "@albumScreenRecordings": {}, "albumVideoCaptures": "Capturas en video", - + "@albumVideoCaptures": {}, "albumPageTitle": "Álbumes", + "@albumPageTitle": {}, "albumEmpty": "Sin álbumes", + "@albumEmpty": {}, "createAlbumTooltip": "Crear álbum", + "@createAlbumTooltip": {}, "createAlbumButtonLabel": "CREAR", + "@createAlbumButtonLabel": {}, "newFilterBanner": "nuevo", - + "@newFilterBanner": {}, "countryPageTitle": "Países", + "@countryPageTitle": {}, "countryEmpty": "Sin países", - + "@countryEmpty": {}, "tagPageTitle": "Etiquetas", + "@tagPageTitle": {}, "tagEmpty": "Sin etiquetas", - + "@tagEmpty": {}, "binPageTitle": "Cesto de basura", - + "@binPageTitle": {}, "searchCollectionFieldHint": "Buscar en colección", + "@searchCollectionFieldHint": {}, "searchRecentSectionTitle": "Reciente", + "@searchRecentSectionTitle": {}, "searchDateSectionTitle": "Fecha", + "@searchDateSectionTitle": {}, "searchAlbumsSectionTitle": "Álbumes", + "@searchAlbumsSectionTitle": {}, "searchCountriesSectionTitle": "Países", + "@searchCountriesSectionTitle": {}, "searchPlacesSectionTitle": "Lugares", + "@searchPlacesSectionTitle": {}, "searchTagsSectionTitle": "Etiquetas", + "@searchTagsSectionTitle": {}, "searchRatingSectionTitle": "Clasificaciones", - + "@searchRatingSectionTitle": {}, "settingsPageTitle": "Ajustes", + "@settingsPageTitle": {}, "settingsSystemDefault": "Sistema", + "@settingsSystemDefault": {}, "settingsDefault": "Restablecer", - + "@settingsDefault": {}, "settingsSearchFieldLabel": "Buscar ajustes", + "@settingsSearchFieldLabel": {}, "settingsSearchEmpty": "Sin coincidencias", + "@settingsSearchEmpty": {}, "settingsActionExport": "Exportar", + "@settingsActionExport": {}, "settingsActionExportDialogTitle": "Exportar", + "@settingsActionExportDialogTitle": {}, "settingsActionImport": "Importar", + "@settingsActionImport": {}, "settingsActionImportDialogTitle": "Importar", - + "@settingsActionImportDialogTitle": {}, "appExportCovers": "Carátulas", + "@appExportCovers": {}, "appExportFavourites": "Favoritos", + "@appExportFavourites": {}, "appExportSettings": "Ajustes", - + "@appExportSettings": {}, "settingsNavigationSectionTitle": "Navegación", + "@settingsNavigationSectionTitle": {}, "settingsHomeTile": "Inicio", + "@settingsHomeTile": {}, "settingsHomeDialogTitle": "Inicio", + "@settingsHomeDialogTitle": {}, "settingsShowBottomNavigationBar": "Mostrar barra de navegación inferior", + "@settingsShowBottomNavigationBar": {}, "settingsKeepScreenOnTile": "Mantener pantalla encendida", + "@settingsKeepScreenOnTile": {}, "settingsKeepScreenOnDialogTitle": "Mantener pantalla encendida", + "@settingsKeepScreenOnDialogTitle": {}, "settingsDoubleBackExit": "Presione «atrás» dos veces para salir", - + "@settingsDoubleBackExit": {}, "settingsConfirmationTile": "Diálogos de confirmación", + "@settingsConfirmationTile": {}, "settingsConfirmationDialogTitle": "Diálogos de confirmación", + "@settingsConfirmationDialogTitle": {}, "settingsConfirmationBeforeDeleteItems": "Preguntar antes de eliminar elementos permanentemente", + "@settingsConfirmationBeforeDeleteItems": {}, "settingsConfirmationBeforeMoveToBinItems": "Preguntar antes de mover elementos al cesto de basura", + "@settingsConfirmationBeforeMoveToBinItems": {}, "settingsConfirmationBeforeMoveUndatedItems": "Preguntar antes de mover elementos sin una fecha de metadatos", - + "@settingsConfirmationBeforeMoveUndatedItems": {}, "settingsNavigationDrawerTile": "Menú de navegación", + "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "Menú de navegación", + "@settingsNavigationDrawerEditorPageTitle": {}, "settingsNavigationDrawerBanner": "Toque y mantenga para mover y reordenar elementos del menú.", + "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "Tipos", + "@settingsNavigationDrawerTabTypes": {}, "settingsNavigationDrawerTabAlbums": "Álbumes", + "@settingsNavigationDrawerTabAlbums": {}, "settingsNavigationDrawerTabPages": "Páginas", + "@settingsNavigationDrawerTabPages": {}, "settingsNavigationDrawerAddAlbum": "Agregar álbum", - + "@settingsNavigationDrawerAddAlbum": {}, "settingsThumbnailSectionTitle": "Miniaturas", + "@settingsThumbnailSectionTitle": {}, "settingsThumbnailOverlayTile": "Incrustaciones", + "@settingsThumbnailOverlayTile": {}, "settingsThumbnailOverlayPageTitle": "Incrustaciones", + "@settingsThumbnailOverlayPageTitle": {}, "settingsThumbnailShowFavouriteIcon": "Mostrar icono de favoritos", + "@settingsThumbnailShowFavouriteIcon": {}, "settingsThumbnailShowTagIcon": "Mostrar ícono de etiqueta", + "@settingsThumbnailShowTagIcon": {}, "settingsThumbnailShowLocationIcon": "Mostrar icono de ubicación", + "@settingsThumbnailShowLocationIcon": {}, "settingsThumbnailShowMotionPhotoIcon": "Mostrar icono de foto en movimiento", + "@settingsThumbnailShowMotionPhotoIcon": {}, "settingsThumbnailShowRating": "Mostrar clasificación", + "@settingsThumbnailShowRating": {}, "settingsThumbnailShowRawIcon": "Mostrar icono Raw", + "@settingsThumbnailShowRawIcon": {}, "settingsThumbnailShowVideoDuration": "Mostrar duración de video", - + "@settingsThumbnailShowVideoDuration": {}, "settingsCollectionQuickActionsTile": "Acciones rápidas", + "@settingsCollectionQuickActionsTile": {}, "settingsCollectionQuickActionEditorPageTitle": "Acciones rápidas", + "@settingsCollectionQuickActionEditorPageTitle": {}, "settingsCollectionQuickActionTabBrowsing": "Búsqueda", + "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "Selección", + "@settingsCollectionQuickActionTabSelecting": {}, "settingsCollectionBrowsingQuickActionEditorBanner": "Toque y mantenga para mover botones y seleccionar cuáles acciones se muestran mientras busca elementos.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "Toque y mantenga para mover botones y seleccionar cuáles acciones se muestran mientras selecciona elementos.", - + "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "Visor", + "@settingsViewerSectionTitle": {}, "settingsViewerGestureSideTapNext": "Toque en los bordes de la pantalla para mostrar el elemento anterior/siguiente", + "@settingsViewerGestureSideTapNext": {}, "settingsViewerUseCutout": "Usar área recortada", + "@settingsViewerUseCutout": {}, "settingsViewerMaximumBrightness": "Brillo máximo", + "@settingsViewerMaximumBrightness": {}, "settingsMotionPhotoAutoPlay": "Reproducir automáticamente fotos en movimiento", + "@settingsMotionPhotoAutoPlay": {}, "settingsImageBackground": "Imagen de fondo", - + "@settingsImageBackground": {}, "settingsViewerQuickActionsTile": "Acciones rápidas", + "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "Acciones rápidas", + "@settingsViewerQuickActionEditorPageTitle": {}, "settingsViewerQuickActionEditorBanner": "Toque y mantenga para mover botones y seleccionar cuáles acciones se muestran en el visor.", + "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Botones mostrados", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Botones disponibles", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, "settingsViewerQuickActionEmpty": "Sin botones", - + "@settingsViewerQuickActionEmpty": {}, "settingsViewerOverlayTile": "Incrustaciones", + "@settingsViewerOverlayTile": {}, "settingsViewerOverlayPageTitle": "Incrustaciones", + "@settingsViewerOverlayPageTitle": {}, "settingsViewerShowOverlayOnOpening": "Mostrar durante apertura", + "@settingsViewerShowOverlayOnOpening": {}, "settingsViewerShowMinimap": "Mostrar mapa en miniatura", + "@settingsViewerShowMinimap": {}, "settingsViewerShowInformation": "Mostrar información", + "@settingsViewerShowInformation": {}, "settingsViewerShowInformationSubtitle": "Mostrar título, fecha, ubicación, etc.", + "@settingsViewerShowInformationSubtitle": {}, "settingsViewerShowShootingDetails": "Mostrar detalles de toma", + "@settingsViewerShowShootingDetails": {}, "settingsViewerShowOverlayThumbnails": "Mostrar miniaturas", + "@settingsViewerShowOverlayThumbnails": {}, "settingsViewerEnableOverlayBlurEffect": "Efecto de difuminado", - + "@settingsViewerEnableOverlayBlurEffect": {}, "settingsViewerSlideshowTile": "Presentación", + "@settingsViewerSlideshowTile": {}, "settingsViewerSlideshowPageTitle": "Presentación", + "@settingsViewerSlideshowPageTitle": {}, "settingsSlideshowRepeat": "Repetir", + "@settingsSlideshowRepeat": {}, "settingsSlideshowShuffle": "Mezclar", + "@settingsSlideshowShuffle": {}, "settingsSlideshowFillScreen": "Llenar pantalla", + "@settingsSlideshowFillScreen": {}, "settingsSlideshowTransitionTile": "Transición", + "@settingsSlideshowTransitionTile": {}, "settingsSlideshowIntervalTile": "Intervalo", + "@settingsSlideshowIntervalTile": {}, "settingsSlideshowVideoPlaybackTile": "Reproducción de video", + "@settingsSlideshowVideoPlaybackTile": {}, "settingsSlideshowVideoPlaybackDialogTitle": "Reproducción de video", - + "@settingsSlideshowVideoPlaybackDialogTitle": {}, "settingsVideoPageTitle": "Ajustes de video", + "@settingsVideoPageTitle": {}, "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, "settingsVideoShowVideos": "Mostrar videos", + "@settingsVideoShowVideos": {}, "settingsVideoEnableHardwareAcceleration": "Aceleración por hardware", + "@settingsVideoEnableHardwareAcceleration": {}, "settingsVideoAutoPlay": "Reproducción automática", + "@settingsVideoAutoPlay": {}, "settingsVideoLoopModeTile": "Modo bucle", + "@settingsVideoLoopModeTile": {}, "settingsVideoLoopModeDialogTitle": "Modo bucle", - + "@settingsVideoLoopModeDialogTitle": {}, "settingsSubtitleThemeTile": "Subtítulos", + "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "Subtítulos", + "@settingsSubtitleThemePageTitle": {}, "settingsSubtitleThemeSample": "Esto es un ejemplo.", + "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "Alineación de texto", + "@settingsSubtitleThemeTextAlignmentTile": {}, "settingsSubtitleThemeTextAlignmentDialogTitle": "Alineación de texto", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, "settingsSubtitleThemeTextSize": "Tamaño de texto", + "@settingsSubtitleThemeTextSize": {}, "settingsSubtitleThemeShowOutline": "Mostrar contorno y sombra", + "@settingsSubtitleThemeShowOutline": {}, "settingsSubtitleThemeTextColor": "Color de texto", + "@settingsSubtitleThemeTextColor": {}, "settingsSubtitleThemeTextOpacity": "Opacidad de texto", + "@settingsSubtitleThemeTextOpacity": {}, "settingsSubtitleThemeBackgroundColor": "Color de fondo", + "@settingsSubtitleThemeBackgroundColor": {}, "settingsSubtitleThemeBackgroundOpacity": "Opacidad de fondo", + "@settingsSubtitleThemeBackgroundOpacity": {}, "settingsSubtitleThemeTextAlignmentLeft": "Izquierda", + "@settingsSubtitleThemeTextAlignmentLeft": {}, "settingsSubtitleThemeTextAlignmentCenter": "Centro", + "@settingsSubtitleThemeTextAlignmentCenter": {}, "settingsSubtitleThemeTextAlignmentRight": "Derecha", - + "@settingsSubtitleThemeTextAlignmentRight": {}, "settingsVideoControlsTile": "Controles", + "@settingsVideoControlsTile": {}, "settingsVideoControlsPageTitle": "Controles", + "@settingsVideoControlsPageTitle": {}, "settingsVideoButtonsTile": "Botones", + "@settingsVideoButtonsTile": {}, "settingsVideoGestureDoubleTapTogglePlay": "Doble toque para reproducir/pausar", + "@settingsVideoGestureDoubleTapTogglePlay": {}, "settingsVideoGestureSideDoubleTapSeek": "Doble toque en los bordes de la pantalla para buscar atrás/adelante", - + "@settingsVideoGestureSideDoubleTapSeek": {}, "settingsPrivacySectionTitle": "Privacidad", + "@settingsPrivacySectionTitle": {}, "settingsAllowInstalledAppAccess": "Permita el acceso a lista de aplicaciones", + "@settingsAllowInstalledAppAccess": {}, "settingsAllowInstalledAppAccessSubtitle": "Usado para mejorar los álbumes mostrados", + "@settingsAllowInstalledAppAccessSubtitle": {}, "settingsAllowErrorReporting": "Permitir reporte de errores anónimo", + "@settingsAllowErrorReporting": {}, "settingsSaveSearchHistory": "Guardar historial de búsqueda", + "@settingsSaveSearchHistory": {}, "settingsEnableBin": "Usar cesto de basura", + "@settingsEnableBin": {}, "settingsEnableBinSubtitle": "Guardar los elementos eliminados por 30 días", - + "@settingsEnableBinSubtitle": {}, "settingsHiddenItemsTile": "Elementos ocultos", + "@settingsHiddenItemsTile": {}, "settingsHiddenItemsPageTitle": "Elementos ocultos", - + "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "Filtros", + "@settingsHiddenItemsTabFilters": {}, "settingsHiddenFiltersBanner": "Fotos y videos que concuerden con los filtros no aparecerán en su colección.", + "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "Sin filtros", - + "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "Ubicaciones ocultas", + "@settingsHiddenItemsTabPaths": {}, "settingsHiddenPathsBanner": "Fotos y videos que se encuentren en estos directorios y cualquiera de sus subdirectorios no aparecerán en su colección.", + "@settingsHiddenPathsBanner": {}, "addPathTooltip": "Añadir ubicación", - + "@addPathTooltip": {}, "settingsStorageAccessTile": "Acceso al almacenamiento", + "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "Acceso al almacenamiento", + "@settingsStorageAccessPageTitle": {}, "settingsStorageAccessBanner": "Algunos directorios requieren un permiso de acceso explícito para que sea posible modificar los archivos que contienen. Puede revisar los directorios con permiso aquí.", + "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "Sin permisos de acceso", + "@settingsStorageAccessEmpty": {}, "settingsStorageAccessRevokeTooltip": "Revocar", - + "@settingsStorageAccessRevokeTooltip": {}, "settingsAccessibilitySectionTitle": "Accesibilidad", + "@settingsAccessibilitySectionTitle": {}, "settingsRemoveAnimationsTile": "Remover animaciones", + "@settingsRemoveAnimationsTile": {}, "settingsRemoveAnimationsDialogTitle": "Remover animaciones", + "@settingsRemoveAnimationsDialogTitle": {}, "settingsTimeToTakeActionTile": "Retraso para ejecutar una acción", - + "@settingsTimeToTakeActionTile": {}, "settingsDisplaySectionTitle": "Pantalla", + "@settingsDisplaySectionTitle": {}, "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, "settingsThemeColorHighlights": "Acentos de color", + "@settingsThemeColorHighlights": {}, "settingsThemeEnableDynamicColor": "Color dinámico", + "@settingsThemeEnableDynamicColor": {}, "settingsDisplayRefreshRateModeTile": "Tasa de refresco de la pantalla", + "@settingsDisplayRefreshRateModeTile": {}, "settingsDisplayRefreshRateModeDialogTitle": "Tasa de refresco", - + "@settingsDisplayRefreshRateModeDialogTitle": {}, "settingsLanguageSectionTitle": "Idioma y formatos", + "@settingsLanguageSectionTitle": {}, "settingsLanguageTile": "Idioma", + "@settingsLanguageTile": {}, "settingsLanguagePageTitle": "Idioma", + "@settingsLanguagePageTitle": {}, "settingsCoordinateFormatTile": "Formato de coordenadas", + "@settingsCoordinateFormatTile": {}, "settingsCoordinateFormatDialogTitle": "Formato de coordenadas", + "@settingsCoordinateFormatDialogTitle": {}, "settingsUnitSystemTile": "Unidades", + "@settingsUnitSystemTile": {}, "settingsUnitSystemDialogTitle": "Unidades", - + "@settingsUnitSystemDialogTitle": {}, "settingsScreenSaverPageTitle": "Protector de pantalla", - + "@settingsScreenSaverPageTitle": {}, "settingsWidgetPageTitle": "Marco de foto", + "@settingsWidgetPageTitle": {}, "settingsWidgetShowOutline": "Borde", - + "@settingsWidgetShowOutline": {}, "settingsCollectionTile": "Colección", - + "@settingsCollectionTile": {}, "statsPageTitle": "Stats", + "@statsPageTitle": {}, "statsWithGps": "{count, plural, =1{1 elemento con ubicación} other{{count} elementos con ubicación}}", + "@statsWithGps": {}, "statsTopCountriesSectionTitle": "Países principales", + "@statsTopCountriesSectionTitle": {}, "statsTopPlacesSectionTitle": "Lugares principales", + "@statsTopPlacesSectionTitle": {}, "statsTopTagsSectionTitle": "Etiquetas principales", - + "@statsTopTagsSectionTitle": {}, "viewerOpenPanoramaButtonLabel": "ABRIR PANORÁMICA", + "@viewerOpenPanoramaButtonLabel": {}, "viewerSetWallpaperButtonLabel": "ESTABLECER FONDO", + "@viewerSetWallpaperButtonLabel": {}, "viewerErrorUnknown": "¡Ups!", + "@viewerErrorUnknown": {}, "viewerErrorDoesNotExist": "El archivo no existe.", - + "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "Información", + "@viewerInfoPageTitle": {}, "viewerInfoBackToViewerTooltip": "Regresar al visor", - + "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "Desconocido", + "@viewerInfoUnknown": {}, "viewerInfoLabelTitle": "Título", + "@viewerInfoLabelTitle": {}, "viewerInfoLabelDate": "Fecha", + "@viewerInfoLabelDate": {}, "viewerInfoLabelResolution": "Resolución", + "@viewerInfoLabelResolution": {}, "viewerInfoLabelSize": "Tamaño", + "@viewerInfoLabelSize": {}, "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, "viewerInfoLabelPath": "Ubicación", + "@viewerInfoLabelPath": {}, "viewerInfoLabelDuration": "Duración", + "@viewerInfoLabelDuration": {}, "viewerInfoLabelOwner": "Propiedad de", + "@viewerInfoLabelOwner": {}, "viewerInfoLabelCoordinates": "Coordinadas", + "@viewerInfoLabelCoordinates": {}, "viewerInfoLabelAddress": "Dirección", - + "@viewerInfoLabelAddress": {}, "mapStyleDialogTitle": "Estilo de mapa", + "@mapStyleDialogTitle": {}, "mapStyleTooltip": "Selección de estilo de mapa", + "@mapStyleTooltip": {}, "mapZoomInTooltip": "Acercar", + "@mapZoomInTooltip": {}, "mapZoomOutTooltip": "Alejar", + "@mapZoomOutTooltip": {}, "mapPointNorthUpTooltip": "Apuntar el Norte hacia arriba", + "@mapPointNorthUpTooltip": {}, "mapAttributionOsmHot": "Datos de mapas © [OpenStreetMap](https://www.openstreetmap.org/copyright) contribuidores • Teselas por [HOT](https://www.hotosm.org/) • Alojado por [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, "mapAttributionStamen": "Datos de mapas © [OpenStreetMap](https://www.openstreetmap.org/copyright) contribuidores • Teselas por [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, "openMapPageTooltip": "Ver en página del mapa", + "@openMapPageTooltip": {}, "mapEmptyRegion": "Sin imágenes en esta región", - + "@mapEmptyRegion": {}, "viewerInfoOpenEmbeddedFailureFeedback": "Fallo al extraer datos embutidos", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, "viewerInfoOpenLinkText": "Abrir", + "@viewerInfoOpenLinkText": {}, "viewerInfoViewXmlLinkText": "Ver XML", - + "@viewerInfoViewXmlLinkText": {}, "viewerInfoSearchFieldLabel": "Buscar metadatos", + "@viewerInfoSearchFieldLabel": {}, "viewerInfoSearchEmpty": "Sin claves concordantes", + "@viewerInfoSearchEmpty": {}, "viewerInfoSearchSuggestionDate": "Fecha y hora", + "@viewerInfoSearchSuggestionDate": {}, "viewerInfoSearchSuggestionDescription": "Descripción", + "@viewerInfoSearchSuggestionDescription": {}, "viewerInfoSearchSuggestionDimensions": "Dimensiones", + "@viewerInfoSearchSuggestionDimensions": {}, "viewerInfoSearchSuggestionResolution": "Resolución", + "@viewerInfoSearchSuggestionResolution": {}, "viewerInfoSearchSuggestionRights": "Derechos", - + "@viewerInfoSearchSuggestionRights": {}, "tagEditorPageTitle": "Editar Etiquetas", + "@tagEditorPageTitle": {}, "tagEditorPageNewTagFieldLabel": "Nueva etiqueta", + "@tagEditorPageNewTagFieldLabel": {}, "tagEditorPageAddTagTooltip": "Añadir etiqueta", + "@tagEditorPageAddTagTooltip": {}, "tagEditorSectionRecent": "Reciente", - + "@tagEditorSectionRecent": {}, "panoramaEnableSensorControl": "Activar control de sensores", + "@panoramaEnableSensorControl": {}, "panoramaDisableSensorControl": "Desactivar control de sensores", - + "@panoramaDisableSensorControl": {}, "sourceViewerPageTitle": "Fuente", - + "@sourceViewerPageTitle": {}, "filePickerShowHiddenFiles": "Mostrar archivos ocultos", + "@filePickerShowHiddenFiles": {}, "filePickerDoNotShowHiddenFiles": "No mostrar archivos ocultos", + "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "Abrir desde", + "@filePickerOpenFrom": {}, "filePickerNoItems": "Sin elementos", - "filePickerUseThisFolder": "Usar esta carpeta" + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "Usar esta carpeta", + "@filePickerUseThisFolder": {} } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index f0e8dc9a6..5f8994117 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1,696 +1,1150 @@ { "appName": "Aves", + "@appName": {}, "welcomeMessage": "Bienvenue", + "@welcomeMessage": {}, "welcomeOptional": "Option", + "@welcomeOptional": {}, "welcomeTermsToggle": "J’accepte les conditions d’utilisation", + "@welcomeTermsToggle": {}, "itemCount": "{count, plural, =1{1 élément} other{{count} éléments}}", - + "@itemCount": {}, "timeSeconds": "{seconds, plural, =0{0 seconde} =1{1 seconde} other{{seconds} secondes}}", + "@timeSeconds": {}, "timeMinutes": "{minutes, plural, =0{0 minute} =1{1 minute} other{{minutes} minutes}}", + "@timeMinutes": {}, "timeDays": "{days, plural, =0{0 jour} =1{1 jour} other{{days} jours}}", + "@timeDays": {}, "focalLength": "{length} mm", - + "@focalLength": {}, "applyButtonLabel": "ENREGISTRER", + "@applyButtonLabel": {}, "deleteButtonLabel": "SUPPRIMER", + "@deleteButtonLabel": {}, "nextButtonLabel": "SUIVANT", + "@nextButtonLabel": {}, "showButtonLabel": "AFFICHER", + "@showButtonLabel": {}, "hideButtonLabel": "MASQUER", + "@hideButtonLabel": {}, "continueButtonLabel": "CONTINUER", - + "@continueButtonLabel": {}, "cancelTooltip": "Annuler", + "@cancelTooltip": {}, "changeTooltip": "Modifier", + "@changeTooltip": {}, "clearTooltip": "Effacer", + "@clearTooltip": {}, "previousTooltip": "Précédent", + "@previousTooltip": {}, "nextTooltip": "Suivant", + "@nextTooltip": {}, "showTooltip": "Afficher", + "@showTooltip": {}, "hideTooltip": "Masquer", + "@hideTooltip": {}, "actionRemove": "Supprimer", + "@actionRemove": {}, "resetTooltip": "Réinitialiser", + "@resetTooltip": {}, "saveTooltip": "Sauvegarder", + "@saveTooltip": {}, "pickTooltip": "Sélectionner", - - "doubleBackExitMessage": "Pressez «\u00A0retour\u00A0» à nouveau pour quitter.", + "@pickTooltip": {}, + "doubleBackExitMessage": "Pressez « retour » à nouveau pour quitter.", + "@doubleBackExitMessage": {}, "doNotAskAgain": "Ne pas demander de nouveau", - + "@doNotAskAgain": {}, "sourceStateLoading": "Chargement", + "@sourceStateLoading": {}, "sourceStateCataloguing": "Classification", + "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "Identification des pays", + "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "Identification des lieux", - + "@sourceStateLocatingPlaces": {}, "chipActionDelete": "Supprimer", + "@chipActionDelete": {}, "chipActionGoToAlbumPage": "Afficher dans Albums", + "@chipActionGoToAlbumPage": {}, "chipActionGoToCountryPage": "Afficher dans Pays", + "@chipActionGoToCountryPage": {}, "chipActionGoToTagPage": "Afficher dans Libellés", + "@chipActionGoToTagPage": {}, "chipActionFilterOut": "Exclure", + "@chipActionFilterOut": {}, "chipActionFilterIn": "Inclure", + "@chipActionFilterIn": {}, "chipActionHide": "Masquer", + "@chipActionHide": {}, "chipActionPin": "Épingler", + "@chipActionPin": {}, "chipActionUnpin": "Retirer", + "@chipActionUnpin": {}, "chipActionRename": "Renommer", + "@chipActionRename": {}, "chipActionSetCover": "Modifier la couverture", + "@chipActionSetCover": {}, "chipActionCreateAlbum": "Créer un album", - + "@chipActionCreateAlbum": {}, "entryActionCopyToClipboard": "Copier dans presse-papier", + "@entryActionCopyToClipboard": {}, "entryActionDelete": "Supprimer", + "@entryActionDelete": {}, "entryActionConvert": "Convertir", + "@entryActionConvert": {}, "entryActionExport": "Exporter", + "@entryActionExport": {}, "entryActionInfo": "Détails", + "@entryActionInfo": {}, "entryActionRename": "Renommer", + "@entryActionRename": {}, "entryActionRestore": "Restaurer", + "@entryActionRestore": {}, "entryActionRotateCCW": "Pivoter à gauche", + "@entryActionRotateCCW": {}, "entryActionRotateCW": "Pivoter à droite", + "@entryActionRotateCW": {}, "entryActionFlip": "Retourner horizontalement", + "@entryActionFlip": {}, "entryActionPrint": "Imprimer", + "@entryActionPrint": {}, "entryActionShare": "Partager", + "@entryActionShare": {}, "entryActionViewSource": "Voir le code", + "@entryActionViewSource": {}, "entryActionShowGeoTiffOnMap": "Superposer sur la carte", + "@entryActionShowGeoTiffOnMap": {}, "entryActionConvertMotionPhotoToStillImage": "Convertir en image fixe", + "@entryActionConvertMotionPhotoToStillImage": {}, "entryActionViewMotionPhotoVideo": "Ouvrir la vidéo", + "@entryActionViewMotionPhotoVideo": {}, "entryActionEdit": "Modifier", + "@entryActionEdit": {}, "entryActionOpen": "Ouvrir avec", + "@entryActionOpen": {}, "entryActionSetAs": "Utiliser comme", + "@entryActionSetAs": {}, "entryActionOpenMap": "Localiser avec", + "@entryActionOpenMap": {}, "entryActionRotateScreen": "Pivoter l’écran", + "@entryActionRotateScreen": {}, "entryActionAddFavourite": "Ajouter aux favoris", + "@entryActionAddFavourite": {}, "entryActionRemoveFavourite": "Retirer des favoris", - + "@entryActionRemoveFavourite": {}, "videoActionCaptureFrame": "Capturer l’image", + "@videoActionCaptureFrame": {}, "videoActionMute": "Couper le son", + "@videoActionMute": {}, "videoActionUnmute": "Rétablir le son", + "@videoActionUnmute": {}, "videoActionPause": "Pause", + "@videoActionPause": {}, "videoActionPlay": "Lire", + "@videoActionPlay": {}, "videoActionReplay10": "Reculer de 10 secondes", + "@videoActionReplay10": {}, "videoActionSkip10": "Avancer de 10 secondes", + "@videoActionSkip10": {}, "videoActionSelectStreams": "Choisir les pistes", + "@videoActionSelectStreams": {}, "videoActionSetSpeed": "Vitesse de lecture", + "@videoActionSetSpeed": {}, "videoActionSettings": "Préférences", - + "@videoActionSettings": {}, "slideshowActionResume": "Reprendre", + "@slideshowActionResume": {}, "slideshowActionShowInCollection": "Afficher dans Collection", - + "@slideshowActionShowInCollection": {}, "entryInfoActionEditDate": "Modifier la date", + "@entryInfoActionEditDate": {}, "entryInfoActionEditLocation": "Modifier le lieu", + "@entryInfoActionEditLocation": {}, "entryInfoActionEditTitleDescription": "Modifier titre et description", + "@entryInfoActionEditTitleDescription": {}, "entryInfoActionEditRating": "Modifier la notation", + "@entryInfoActionEditRating": {}, "entryInfoActionEditTags": "Modifier les libellés", + "@entryInfoActionEditTags": {}, "entryInfoActionRemoveMetadata": "Retirer les métadonnées", - + "@entryInfoActionRemoveMetadata": {}, "filterBinLabel": "Corbeille", + "@filterBinLabel": {}, "filterFavouriteLabel": "Favori", + "@filterFavouriteLabel": {}, "filterNoDateLabel": "Sans date", + "@filterNoDateLabel": {}, "filterNoLocationLabel": "Sans lieu", + "@filterNoLocationLabel": {}, "filterNoRatingLabel": "Sans notation", + "@filterNoRatingLabel": {}, "filterNoTagLabel": "Sans libellé", + "@filterNoTagLabel": {}, "filterNoTitleLabel": "Sans titre", + "@filterNoTitleLabel": {}, "filterOnThisDayLabel": "Ce jour-là", + "@filterOnThisDayLabel": {}, "filterRecentlyAddedLabel": "Ajouté récemment", + "@filterRecentlyAddedLabel": {}, "filterRatingRejectedLabel": "Rejeté", + "@filterRatingRejectedLabel": {}, "filterTypeAnimatedLabel": "Animation", + "@filterTypeAnimatedLabel": {}, "filterTypeMotionPhotoLabel": "Photo animée", + "@filterTypeMotionPhotoLabel": {}, "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, "filterTypeSphericalVideoLabel": "Vidéo à 360°", + "@filterTypeSphericalVideoLabel": {}, "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, "filterMimeImageLabel": "Image", + "@filterMimeImageLabel": {}, "filterMimeVideoLabel": "Vidéo", - + "@filterMimeVideoLabel": {}, "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, "coordinateFormatDecimal": "Degrés décimaux", + "@coordinateFormatDecimal": {}, "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, "coordinateDmsWest": "O", - + "@coordinateDmsWest": {}, "unitSystemMetric": "SI", + "@unitSystemMetric": {}, "unitSystemImperial": "anglo-saxonnes", - + "@unitSystemImperial": {}, "videoLoopModeNever": "Jamais", + "@videoLoopModeNever": {}, "videoLoopModeShortOnly": "Courtes vidéos seulement", + "@videoLoopModeShortOnly": {}, "videoLoopModeAlways": "Toujours", - + "@videoLoopModeAlways": {}, "videoControlsPlay": "Lecture", + "@videoControlsPlay": {}, "videoControlsPlaySeek": "Lecture & déplacement", + "@videoControlsPlaySeek": {}, "videoControlsPlayOutside": "Ouvrir avec un autre lecteur", + "@videoControlsPlayOutside": {}, "videoControlsNone": "Aucun", - + "@videoControlsNone": {}, "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, "mapStyleGoogleHybrid": "Google Maps (Satellite)", + "@mapStyleGoogleHybrid": {}, "mapStyleGoogleTerrain": "Google Maps (Relief)", + "@mapStyleGoogleTerrain": {}, "mapStyleHuaweiNormal": "Petal Maps", + "@mapStyleHuaweiNormal": {}, "mapStyleHuaweiTerrain": "Petal Maps (Relief)", + "@mapStyleHuaweiTerrain": {}, "mapStyleOsmHot": "OSM Humanitaire", + "@mapStyleOsmHot": {}, "mapStyleStamenToner": "Stamen Toner (Monochrome)", + "@mapStyleStamenToner": {}, "mapStyleStamenWatercolor": "Stamen Watercolor (Aquarelle)", - + "@mapStyleStamenWatercolor": {}, "nameConflictStrategyRename": "Renommer", + "@nameConflictStrategyRename": {}, "nameConflictStrategyReplace": "Remplacer", + "@nameConflictStrategyReplace": {}, "nameConflictStrategySkip": "Ignorer", - + "@nameConflictStrategySkip": {}, "keepScreenOnNever": "Jamais", + "@keepScreenOnNever": {}, "keepScreenOnViewerOnly": "Visionneuse seulement", + "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "Toujours", - + "@keepScreenOnAlways": {}, "accessibilityAnimationsRemove": "Empêchez certains effets de l’écran", + "@accessibilityAnimationsRemove": {}, "accessibilityAnimationsKeep": "Conserver les effets de l’écran", - + "@accessibilityAnimationsKeep": {}, "displayRefreshRatePreferHighest": "Fréquence maximale", + "@displayRefreshRatePreferHighest": {}, "displayRefreshRatePreferLowest": "Fréquence minimale", - + "@displayRefreshRatePreferLowest": {}, "videoPlaybackSkip": "Passer", + "@videoPlaybackSkip": {}, "videoPlaybackMuted": "Jouer sans son", + "@videoPlaybackMuted": {}, "videoPlaybackWithSound": "Jouer avec son", - + "@videoPlaybackWithSound": {}, "themeBrightnessLight": "Clair", + "@themeBrightnessLight": {}, "themeBrightnessDark": "Sombre", + "@themeBrightnessDark": {}, "themeBrightnessBlack": "Noir", - + "@themeBrightnessBlack": {}, "viewerTransitionSlide": "Défilement", + "@viewerTransitionSlide": {}, "viewerTransitionParallax": "Parallaxe", + "@viewerTransitionParallax": {}, "viewerTransitionFade": "Fondu", + "@viewerTransitionFade": {}, "viewerTransitionZoomIn": "Zoom", + "@viewerTransitionZoomIn": {}, "viewerTransitionNone": "Aucune", - + "@viewerTransitionNone": {}, "wallpaperTargetHome": "Écran d’accueil", + "@wallpaperTargetHome": {}, "wallpaperTargetLock": "Écran de verrouillage", + "@wallpaperTargetLock": {}, "wallpaperTargetHomeLock": "Écrans accueil et verrouillage", - + "@wallpaperTargetHomeLock": {}, "widgetOpenPageHome": "Ouvrir la page d’accueil", + "@widgetOpenPageHome": {}, "widgetOpenPageCollection": "Ouvrir la collection", + "@widgetOpenPageCollection": {}, "widgetOpenPageViewer": "Ouvrir la visionneuse", - + "@widgetOpenPageViewer": {}, "albumTierNew": "Nouveaux", + "@albumTierNew": {}, "albumTierPinned": "Épinglés", + "@albumTierPinned": {}, "albumTierSpecial": "Standards", + "@albumTierSpecial": {}, "albumTierApps": "Apps", + "@albumTierApps": {}, "albumTierRegular": "Autres", - + "@albumTierRegular": {}, "storageVolumeDescriptionFallbackPrimary": "Stockage interne", + "@storageVolumeDescriptionFallbackPrimary": {}, "storageVolumeDescriptionFallbackNonPrimary": "Carte SD", + "@storageVolumeDescriptionFallbackNonPrimary": {}, "rootDirectoryDescription": "dossier racine", - "otherDirectoryDescription": "dossier «\u00A0{name}\u00A0»", - "storageAccessDialogMessage": "Veuillez sélectionner le {directory} de «\u00A0{volume}\u00A0» à l’écran suivant, pour que l’app puisse modifier son contenu.", - "restrictedAccessDialogMessage": "Cette app ne peut pas modifier les fichiers du {directory} de «\u00A0{volume}\u00A0».\n\nVeuillez utiliser une app pré-installée pour déplacer les fichiers vers un autre dossier.", - "notEnoughSpaceDialogMessage": "Cette opération nécessite {neededSize} d’espace disponible sur «\u00A0{volume}\u00A0», mais il ne reste que {freeSize}.", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "dossier « {name} »", + "@otherDirectoryDescription": {}, + "storageAccessDialogMessage": "Veuillez sélectionner le {directory} de « {volume} » à l’écran suivant, pour que l’app puisse modifier son contenu.", + "@storageAccessDialogMessage": {}, + "restrictedAccessDialogMessage": "Cette app ne peut pas modifier les fichiers du {directory} de « {volume} ».\n\nVeuillez utiliser une app pré-installée pour déplacer les fichiers vers un autre dossier.", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Cette opération nécessite {neededSize} d’espace disponible sur « {volume} », mais il ne reste que {freeSize}.", + "@notEnoughSpaceDialogMessage": {}, "missingSystemFilePickerDialogMessage": "Le sélecteur de fichiers du système est absent ou désactivé. Veuillez le réactiver et réessayer.", - + "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, =1{Cette opération n’est pas disponible pour les fichiers au format suivant : {types}.} other{Cette opération n’est pas disponible pour les fichiers aux formats suivants : {types}.}}", - + "@unsupportedTypeDialogMessage": {}, "nameConflictDialogSingleSourceMessage": "Certains fichiers dans le dossier de destination ont le même nom.", + "@nameConflictDialogSingleSourceMessage": {}, "nameConflictDialogMultipleSourceMessage": "Certains fichiers ont le même nom.", - + "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "Nom du raccourci", + "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "AJOUTER", - + "@addShortcutButtonLabel": {}, "noMatchingAppDialogMessage": "Aucune app ne peut effectuer cette opération.", - + "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{Mettre cet élément à la corbeille ?} other{Mettre ces {count} éléments à la corbeille ?}}", + "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Supprimer cet élément ?} other{Supprimer ces {count} éléments ?}}", - "moveUndatedConfirmationDialogMessage": "Sauvegarder les dates des éléments avant de continuer?", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Sauvegarder les dates des éléments avant de continuer ?", + "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Sauvegarder les dates", - + "@moveUndatedConfirmationDialogSetDate": {}, "videoResumeDialogMessage": "Voulez-vous reprendre la lecture à {time} ?", + "@videoResumeDialogMessage": {}, "videoStartOverButtonLabel": "RECOMMENCER", + "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "REPRENDRE", - + "@videoResumeButtonLabel": {}, "setCoverDialogLatest": "dernier élément", + "@setCoverDialogLatest": {}, "setCoverDialogAuto": "automatique", + "@setCoverDialogAuto": {}, "setCoverDialogCustom": "personnalisé", - - "hideFilterConfirmationDialogMessage": "Les images et vidéos correspondantes n’apparaîtront plus dans votre collection. Vous pouvez les montrer à nouveau via les réglages de «\u00A0Confidentialité\u00A0».\n\nVoulez-vous vraiment les masquer ?", - + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Les images et vidéos correspondantes n’apparaîtront plus dans votre collection. Vous pouvez les montrer à nouveau via les réglages de « Confidentialité ».\n\nVoulez-vous vraiment les masquer ?", + "@hideFilterConfirmationDialogMessage": {}, "newAlbumDialogTitle": "Nouvel Album", + "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "Nom de l’album", + "@newAlbumDialogNameLabel": {}, "newAlbumDialogNameLabelAlreadyExistsHelper": "Le dossier existe déjà", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "Volume de stockage :", - + "@newAlbumDialogStorageLabel": {}, "renameAlbumDialogLabel": "Nouveau nom", + "@renameAlbumDialogLabel": {}, "renameAlbumDialogLabelAlreadyExistsHelper": "Le dossier existe déjà", - + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, "renameEntrySetPageTitle": "Renommage", + "@renameEntrySetPageTitle": {}, "renameEntrySetPagePatternFieldLabel": "Modèle de nommage", + "@renameEntrySetPagePatternFieldLabel": {}, "renameEntrySetPageInsertTooltip": "Ajouter un champ", + "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "Aperçu", - + "@renameEntrySetPagePreviewSectionTitle": {}, "renameProcessorCounter": "Compteur", + "@renameProcessorCounter": {}, "renameProcessorName": "Nom", - + "@renameProcessorName": {}, "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Supprimer cet album et son élément ?} other{Supprimer cet album et ses {count} éléments ?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Supprimer ces albums et leur élément ?} other{Supprimer ces albums et leurs {count} éléments ?}}", - + "@deleteMultiAlbumConfirmationDialogMessage": {}, "exportEntryDialogFormat": "Format :", + "@exportEntryDialogFormat": {}, "exportEntryDialogWidth": "Largeur", + "@exportEntryDialogWidth": {}, "exportEntryDialogHeight": "Hauteur", - + "@exportEntryDialogHeight": {}, "renameEntryDialogLabel": "Nouveau nom", - + "@renameEntryDialogLabel": {}, "editEntryDialogTargetFieldsHeader": "Champs à modifier", - + "@editEntryDialogTargetFieldsHeader": {}, "editEntryDateDialogTitle": "Date & Heure", + "@editEntryDateDialogTitle": {}, "editEntryDateDialogSetCustom": "Régler une date personnalisée", + "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Copier d’une autre date", + "@editEntryDateDialogCopyField": {}, "editEntryDateDialogCopyItem": "Copier d’un autre élément", + "@editEntryDateDialogCopyItem": {}, "editEntryDateDialogExtractFromTitle": "Extraire du titre", + "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Décaler", + "@editEntryDateDialogShift": {}, "editEntryDateDialogSourceFileModifiedDate": "Date de modification du fichier", - + "@editEntryDateDialogSourceFileModifiedDate": {}, "durationDialogHours": "Heures", + "@durationDialogHours": {}, "durationDialogMinutes": "Minutes", + "@durationDialogMinutes": {}, "durationDialogSeconds": "Secondes", - + "@durationDialogSeconds": {}, "editEntryLocationDialogTitle": "Lieu", + "@editEntryLocationDialogTitle": {}, "editEntryLocationDialogChooseOnMapTooltip": "Sélectionner sur la carte", + "@editEntryLocationDialogChooseOnMapTooltip": {}, "editEntryLocationDialogLatitude": "Latitude", + "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Longitude", - + "@editEntryLocationDialogLongitude": {}, "locationPickerUseThisLocationButton": "Utiliser ce lieu", - + "@locationPickerUseThisLocationButton": {}, "editEntryRatingDialogTitle": "Notation", - + "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "Retrait de métadonnées", + "@removeEntryMetadataDialogTitle": {}, "removeEntryMetadataDialogMore": "Voir plus", - + "@removeEntryMetadataDialogMore": {}, "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Les métadonnées XMP sont nécessaires pour lire la vidéo d’une photo animée.\n\nVoulez-vous vraiment les supprimer ?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, "convertMotionPhotoToStillImageWarningDialogMessage": "Êtes-vous sûr ?", - + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, "videoSpeedDialogLabel": "Vitesse de lecture", - + "@videoSpeedDialogLabel": {}, "videoStreamSelectionDialogVideo": "Vidéo", + "@videoStreamSelectionDialogVideo": {}, "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, "videoStreamSelectionDialogText": "Sous-titres", + "@videoStreamSelectionDialogText": {}, "videoStreamSelectionDialogOff": "Désactivé", + "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "Piste", + "@videoStreamSelectionDialogTrack": {}, "videoStreamSelectionDialogNoSelection": "Il n’y a pas d’autre piste.", - + "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "Succès !", + "@genericSuccessFeedback": {}, "genericFailureFeedback": "Échec", - + "@genericFailureFeedback": {}, "menuActionConfigureView": "Vue", + "@menuActionConfigureView": {}, "menuActionSelect": "Sélectionner", + "@menuActionSelect": {}, "menuActionSelectAll": "Tout sélectionner", + "@menuActionSelectAll": {}, "menuActionSelectNone": "Tout désélectionner", + "@menuActionSelectNone": {}, "menuActionMap": "Carte", + "@menuActionMap": {}, "menuActionSlideshow": "Diaporama", + "@menuActionSlideshow": {}, "menuActionStats": "Statistiques", - + "@menuActionStats": {}, "viewDialogSortSectionTitle": "Tri", + "@viewDialogSortSectionTitle": {}, "viewDialogGroupSectionTitle": "Groupes", + "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "Vue", + "@viewDialogLayoutSectionTitle": {}, "viewDialogReverseSortOrder": "Inverser l’ordre", - + "@viewDialogReverseSortOrder": {}, "tileLayoutMosaic": "Mosaïque", + "@tileLayoutMosaic": {}, "tileLayoutGrid": "Grille", + "@tileLayoutGrid": {}, "tileLayoutList": "Liste", - + "@tileLayoutList": {}, "coverDialogTabCover": "Image", + "@coverDialogTabCover": {}, "coverDialogTabApp": "App", + "@coverDialogTabApp": {}, "coverDialogTabColor": "Couleur", - + "@coverDialogTabColor": {}, "appPickDialogTitle": "Sélection", + "@appPickDialogTitle": {}, "appPickDialogNone": "Aucune", - + "@appPickDialogNone": {}, "aboutPageTitle": "À propos", + "@aboutPageTitle": {}, "aboutLinkLicense": "Licence", + "@aboutLinkLicense": {}, "aboutLinkPolicy": "Politique de confidentialité", - + "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "Rapports d’erreur", + "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "Sauvegarder les logs de l’app vers un fichier", + "@aboutBugSaveLogInstruction": {}, "aboutBugCopyInfoInstruction": "Copier les informations d’environnement", + "@aboutBugCopyInfoInstruction": {}, "aboutBugCopyInfoButton": "Copier", - "aboutBugReportInstruction": "Créer une «\u00A0issue\u00A0» sur GitHub en attachant les logs et informations d’environnement", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "Créer une « issue » sur GitHub en attachant les logs et informations d’environnement", + "@aboutBugReportInstruction": {}, "aboutBugReportButton": "Créer", - + "@aboutBugReportButton": {}, "aboutCreditsSectionTitle": "Remerciements", - "aboutCreditsWorldAtlas1": "Cette app utilise un fichier TopoJSON de ", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "Cette app utilise un fichier TopoJSON de", + "@aboutCreditsWorldAtlas1": {}, "aboutCreditsWorldAtlas2": "sous licence ISC.", + "@aboutCreditsWorldAtlas2": {}, "aboutTranslatorsSectionTitle": "Traducteurs", - + "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "Licences open-source", + "@aboutLicensesSectionTitle": {}, "aboutLicensesBanner": "Cette app utilise ces librairies et packages open-source.", + "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "Librairies Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, "aboutLicensesFlutterPluginsSectionTitle": "Plugins Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, "aboutLicensesFlutterPackagesSectionTitle": "Packages Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, "aboutLicensesDartPackagesSectionTitle": "Packages Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "Afficher toutes les licences", - + "@aboutLicensesShowAllButtonLabel": {}, "policyPageTitle": "Politique de confidentialité", - + "@policyPageTitle": {}, "collectionPageTitle": "Collection", + "@collectionPageTitle": {}, "collectionPickPageTitle": "Sélection", + "@collectionPickPageTitle": {}, "collectionSelectPageTitle": "Sélection", - + "@collectionSelectPageTitle": {}, "collectionActionShowTitleSearch": "Filtrer les titres", + "@collectionActionShowTitleSearch": {}, "collectionActionHideTitleSearch": "Masquer le filtre", + "@collectionActionHideTitleSearch": {}, "collectionActionAddShortcut": "Créer un raccourci", + "@collectionActionAddShortcut": {}, "collectionActionEmptyBin": "Vider la corbeille", + "@collectionActionEmptyBin": {}, "collectionActionCopy": "Copier vers l’album", + "@collectionActionCopy": {}, "collectionActionMove": "Déplacer vers l’album", + "@collectionActionMove": {}, "collectionActionRescan": "Réanalyser", + "@collectionActionRescan": {}, "collectionActionEdit": "Modifier", - + "@collectionActionEdit": {}, "collectionSearchTitlesHintText": "Recherche de titres", - + "@collectionSearchTitlesHintText": {}, "collectionGroupAlbum": "par album", + "@collectionGroupAlbum": {}, "collectionGroupMonth": "par mois", + "@collectionGroupMonth": {}, "collectionGroupDay": "par jour", + "@collectionGroupDay": {}, "collectionGroupNone": "ne pas grouper", - + "@collectionGroupNone": {}, "sectionUnknown": "Inconnu", + "@sectionUnknown": {}, "dateToday": "Aujourd’hui", + "@dateToday": {}, "dateYesterday": "Hier", + "@dateYesterday": {}, "dateThisMonth": "Ce mois-ci", + "@dateThisMonth": {}, "collectionDeleteFailureFeedback": "{count, plural, =1{Échec de la suppression d’1 élément} other{Échec de la suppression de {count} éléments}}", + "@collectionDeleteFailureFeedback": {}, "collectionCopyFailureFeedback": "{count, plural, =1{Échec de la copie d’1 élément} other{Échec de la copie de {count} éléments}}", + "@collectionCopyFailureFeedback": {}, "collectionMoveFailureFeedback": "{count, plural, =1{Échec du déplacement d’1 élément} other{Échec du déplacement de {count} éléments}}", + "@collectionMoveFailureFeedback": {}, "collectionRenameFailureFeedback": "{count, plural, =1{Échec du renommage d’1 élément} other{Échec du renommage de {count} éléments}}", + "@collectionRenameFailureFeedback": {}, "collectionEditFailureFeedback": "{count, plural, =1{Échec de la modification d’1 élément} other{Échec de la modification de {count} éléments}}", + "@collectionEditFailureFeedback": {}, "collectionExportFailureFeedback": "{count, plural, =1{Échec de l’export d’1 page} other{Échec de l’export de {count} pages}}", + "@collectionExportFailureFeedback": {}, "collectionCopySuccessFeedback": "{count, plural, =1{1 élément copié} other{{count} éléments copiés}}", + "@collectionCopySuccessFeedback": {}, "collectionMoveSuccessFeedback": "{count, plural, =1{1 élément déplacé} other{{count} éléments déplacés}}", + "@collectionMoveSuccessFeedback": {}, "collectionRenameSuccessFeedback": "{count, plural, =1{1 élément renommé} other{{count} éléments renommés}}", + "@collectionRenameSuccessFeedback": {}, "collectionEditSuccessFeedback": "{count, plural, =1{1 élément modifié} other{{count} éléments modifiés}}", - + "@collectionEditSuccessFeedback": {}, "collectionEmptyFavourites": "Aucun favori", + "@collectionEmptyFavourites": {}, "collectionEmptyVideos": "Aucune vidéo", + "@collectionEmptyVideos": {}, "collectionEmptyImages": "Aucune image", + "@collectionEmptyImages": {}, "collectionEmptyGrantAccessButtonLabel": "Autoriser l’accès", - + "@collectionEmptyGrantAccessButtonLabel": {}, "collectionSelectSectionTooltip": "Sélectionner la section", + "@collectionSelectSectionTooltip": {}, "collectionDeselectSectionTooltip": "Désélectionner la section", - + "@collectionDeselectSectionTooltip": {}, "drawerAboutButton": "À propos", + "@drawerAboutButton": {}, "drawerSettingsButton": "Réglages", + "@drawerSettingsButton": {}, "drawerCollectionAll": "Toute la collection", + "@drawerCollectionAll": {}, "drawerCollectionFavourites": "Favoris", + "@drawerCollectionFavourites": {}, "drawerCollectionImages": "Images", + "@drawerCollectionImages": {}, "drawerCollectionVideos": "Vidéos", + "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "Animations", + "@drawerCollectionAnimated": {}, "drawerCollectionMotionPhotos": "Photos animées", + "@drawerCollectionMotionPhotos": {}, "drawerCollectionPanoramas": "Panoramas", + "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "Photos Raw", + "@drawerCollectionRaws": {}, "drawerCollectionSphericalVideos": "Vidéos à 360°", + "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "Albums", + "@drawerAlbumPage": {}, "drawerCountryPage": "Pays", + "@drawerCountryPage": {}, "drawerTagPage": "Libellés", - + "@drawerTagPage": {}, "sortByDate": "par date", + "@sortByDate": {}, "sortByName": "alphabétique", + "@sortByName": {}, "sortByItemCount": "par nombre d’éléments", + "@sortByItemCount": {}, "sortBySize": "par taille", + "@sortBySize": {}, "sortByAlbumFileName": "alphabétique", + "@sortByAlbumFileName": {}, "sortByRating": "par notation", - + "@sortByRating": {}, "sortOrderNewestFirst": "Plus récents d’abord", + "@sortOrderNewestFirst": {}, "sortOrderOldestFirst": "Plus anciens d’abord", + "@sortOrderOldestFirst": {}, "sortOrderAtoZ": "De A à Z", + "@sortOrderAtoZ": {}, "sortOrderZtoA": "De Z à A", + "@sortOrderZtoA": {}, "sortOrderHighestFirst": "Meilleurs d’abord", + "@sortOrderHighestFirst": {}, "sortOrderLowestFirst": "Moins bons d’abord", + "@sortOrderLowestFirst": {}, "sortOrderLargestFirst": "Plus larges d’abord", + "@sortOrderLargestFirst": {}, "sortOrderSmallestFirst": "Moins larges d’abord", - + "@sortOrderSmallestFirst": {}, "albumGroupTier": "par importance", + "@albumGroupTier": {}, "albumGroupType": "par type", + "@albumGroupType": {}, "albumGroupVolume": "par volume de stockage", + "@albumGroupVolume": {}, "albumGroupNone": "ne pas grouper", - + "@albumGroupNone": {}, "albumMimeTypeMixed": "Mixte", - + "@albumMimeTypeMixed": {}, "albumPickPageTitleCopy": "Copie", + "@albumPickPageTitleCopy": {}, "albumPickPageTitleExport": "Export", + "@albumPickPageTitleExport": {}, "albumPickPageTitleMove": "Déplacement", + "@albumPickPageTitleMove": {}, "albumPickPageTitlePick": "Sélection", - + "@albumPickPageTitlePick": {}, "albumCamera": "Appareil photo", + "@albumCamera": {}, "albumDownload": "Téléchargements", + "@albumDownload": {}, "albumScreenshots": "Captures d’écran", + "@albumScreenshots": {}, "albumScreenRecordings": "Enregistrements d’écran", + "@albumScreenRecordings": {}, "albumVideoCaptures": "Captures de vidéo", - + "@albumVideoCaptures": {}, "albumPageTitle": "Albums", + "@albumPageTitle": {}, "albumEmpty": "Aucun album", + "@albumEmpty": {}, "createAlbumTooltip": "Créer un album", + "@createAlbumTooltip": {}, "createAlbumButtonLabel": "CRÉER", + "@createAlbumButtonLabel": {}, "newFilterBanner": "nouveau", - + "@newFilterBanner": {}, "countryPageTitle": "Pays", + "@countryPageTitle": {}, "countryEmpty": "Aucun pays", - + "@countryEmpty": {}, "tagPageTitle": "Libellés", + "@tagPageTitle": {}, "tagEmpty": "Aucun libellé", - + "@tagEmpty": {}, "binPageTitle": "Corbeille", - + "@binPageTitle": {}, "searchCollectionFieldHint": "Recherche", + "@searchCollectionFieldHint": {}, "searchRecentSectionTitle": "Historique", + "@searchRecentSectionTitle": {}, "searchDateSectionTitle": "Date", + "@searchDateSectionTitle": {}, "searchAlbumsSectionTitle": "Albums", + "@searchAlbumsSectionTitle": {}, "searchCountriesSectionTitle": "Pays", + "@searchCountriesSectionTitle": {}, "searchPlacesSectionTitle": "Lieux", + "@searchPlacesSectionTitle": {}, "searchTagsSectionTitle": "Libellés", + "@searchTagsSectionTitle": {}, "searchRatingSectionTitle": "Notations", + "@searchRatingSectionTitle": {}, "searchMetadataSectionTitle": "Métadonnées", - + "@searchMetadataSectionTitle": {}, "settingsPageTitle": "Réglages", + "@settingsPageTitle": {}, "settingsSystemDefault": "Système", + "@settingsSystemDefault": {}, "settingsDefault": "Par défaut", + "@settingsDefault": {}, "settingsDisabled": "Désactivé", - + "@settingsDisabled": {}, "settingsSearchFieldLabel": "Recherche de réglages", + "@settingsSearchFieldLabel": {}, "settingsSearchEmpty": "Aucun réglage correspondant", + "@settingsSearchEmpty": {}, "settingsActionExport": "Exporter", + "@settingsActionExport": {}, "settingsActionExportDialogTitle": "Exporter", + "@settingsActionExportDialogTitle": {}, "settingsActionImport": "Importer", + "@settingsActionImport": {}, "settingsActionImportDialogTitle": "Importer", - + "@settingsActionImportDialogTitle": {}, "appExportCovers": "Couvertures", + "@appExportCovers": {}, "appExportFavourites": "Favoris", + "@appExportFavourites": {}, "appExportSettings": "Réglages", - + "@appExportSettings": {}, "settingsNavigationSectionTitle": "Navigation", + "@settingsNavigationSectionTitle": {}, "settingsHomeTile": "Page d’accueil", + "@settingsHomeTile": {}, "settingsHomeDialogTitle": "Page d’accueil", + "@settingsHomeDialogTitle": {}, "settingsShowBottomNavigationBar": "Afficher la barre de navigation", + "@settingsShowBottomNavigationBar": {}, "settingsKeepScreenOnTile": "Maintenir l’écran allumé", + "@settingsKeepScreenOnTile": {}, "settingsKeepScreenOnDialogTitle": "Allumage de l’écran", - "settingsDoubleBackExit": "Presser «\u00A0retour\u00A0» 2 fois pour quitter", - + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Presser « retour » 2 fois pour quitter", + "@settingsDoubleBackExit": {}, "settingsConfirmationTile": "Demandes de confirmation", + "@settingsConfirmationTile": {}, "settingsConfirmationDialogTitle": "Demandes de confirmation", + "@settingsConfirmationDialogTitle": {}, "settingsConfirmationBeforeDeleteItems": "Suppression définitive d’éléments", + "@settingsConfirmationBeforeDeleteItems": {}, "settingsConfirmationBeforeMoveToBinItems": "Mise d’éléments à la corbeille", + "@settingsConfirmationBeforeMoveToBinItems": {}, "settingsConfirmationBeforeMoveUndatedItems": "Déplacement d’éléments non datés", + "@settingsConfirmationBeforeMoveUndatedItems": {}, "settingsConfirmationAfterMoveToBinItems": "Confirmation après mise d’éléments à la corbeille", - + "@settingsConfirmationAfterMoveToBinItems": {}, "settingsNavigationDrawerTile": "Menu de navigation", + "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "Menu de navigation", + "@settingsNavigationDrawerEditorPageTitle": {}, "settingsNavigationDrawerBanner": "Maintenez votre doigt appuyé pour déplacer et réorganiser les éléments de menu.", + "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "Types", + "@settingsNavigationDrawerTabTypes": {}, "settingsNavigationDrawerTabAlbums": "Albums", + "@settingsNavigationDrawerTabAlbums": {}, "settingsNavigationDrawerTabPages": "Pages", + "@settingsNavigationDrawerTabPages": {}, "settingsNavigationDrawerAddAlbum": "Ajouter un album", - + "@settingsNavigationDrawerAddAlbum": {}, "settingsThumbnailSectionTitle": "Vignettes", + "@settingsThumbnailSectionTitle": {}, "settingsThumbnailOverlayTile": "Incrustations", + "@settingsThumbnailOverlayTile": {}, "settingsThumbnailOverlayPageTitle": "Incrustations", + "@settingsThumbnailOverlayPageTitle": {}, "settingsThumbnailShowFavouriteIcon": "Afficher l’icône de favori", + "@settingsThumbnailShowFavouriteIcon": {}, "settingsThumbnailShowTagIcon": "Afficher l’icône de libellé", + "@settingsThumbnailShowTagIcon": {}, "settingsThumbnailShowLocationIcon": "Afficher l’icône de lieu", + "@settingsThumbnailShowLocationIcon": {}, "settingsThumbnailShowMotionPhotoIcon": "Afficher l’icône de photo animée", + "@settingsThumbnailShowMotionPhotoIcon": {}, "settingsThumbnailShowRating": "Afficher la notation", + "@settingsThumbnailShowRating": {}, "settingsThumbnailShowRawIcon": "Afficher l’icône de photo raw", + "@settingsThumbnailShowRawIcon": {}, "settingsThumbnailShowVideoDuration": "Afficher la durée de la vidéo", - + "@settingsThumbnailShowVideoDuration": {}, "settingsCollectionQuickActionsTile": "Actions rapides", + "@settingsCollectionQuickActionsTile": {}, "settingsCollectionQuickActionEditorPageTitle": "Actions rapides", + "@settingsCollectionQuickActionEditorPageTitle": {}, "settingsCollectionQuickActionTabBrowsing": "Navigation", + "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "Sélection", + "@settingsCollectionQuickActionTabSelecting": {}, "settingsCollectionBrowsingQuickActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées lors de la navigation.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées lors de la sélection d’éléments.", - + "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "Visionneuse", + "@settingsViewerSectionTitle": {}, "settingsViewerGestureSideTapNext": "Appuyer sur les bords de l’écran pour passer à l’élément précédent/suivant", + "@settingsViewerGestureSideTapNext": {}, "settingsViewerUseCutout": "Utiliser la zone d’encoche", + "@settingsViewerUseCutout": {}, "settingsViewerMaximumBrightness": "Luminosité maximale", + "@settingsViewerMaximumBrightness": {}, "settingsMotionPhotoAutoPlay": "Lecture automatique des photos animées", + "@settingsMotionPhotoAutoPlay": {}, "settingsImageBackground": "Arrière-plan de l’image", - + "@settingsImageBackground": {}, "settingsViewerQuickActionsTile": "Actions rapides", + "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "Actions rapides", + "@settingsViewerQuickActionEditorPageTitle": {}, "settingsViewerQuickActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées sur la visionneuse.", + "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Boutons affichés", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Boutons disponibles", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, "settingsViewerQuickActionEmpty": "Aucun bouton", - + "@settingsViewerQuickActionEmpty": {}, "settingsViewerOverlayTile": "Incrustations", + "@settingsViewerOverlayTile": {}, "settingsViewerOverlayPageTitle": "Incrustations", + "@settingsViewerOverlayPageTitle": {}, "settingsViewerShowOverlayOnOpening": "Afficher à l’ouverture", + "@settingsViewerShowOverlayOnOpening": {}, "settingsViewerShowMinimap": "Afficher la mini-carte", + "@settingsViewerShowMinimap": {}, "settingsViewerShowInformation": "Afficher les détails", + "@settingsViewerShowInformation": {}, "settingsViewerShowInformationSubtitle": "Afficher les titre, date, lieu, etc.", + "@settingsViewerShowInformationSubtitle": {}, "settingsViewerShowShootingDetails": "Afficher les détails de prise de vue", + "@settingsViewerShowShootingDetails": {}, "settingsViewerShowOverlayThumbnails": "Afficher les vignettes", + "@settingsViewerShowOverlayThumbnails": {}, "settingsViewerEnableOverlayBlurEffect": "Effets de flou", - + "@settingsViewerEnableOverlayBlurEffect": {}, "settingsViewerSlideshowTile": "Diaporama", + "@settingsViewerSlideshowTile": {}, "settingsViewerSlideshowPageTitle": "Diaporama", + "@settingsViewerSlideshowPageTitle": {}, "settingsSlideshowRepeat": "Répéter", + "@settingsSlideshowRepeat": {}, "settingsSlideshowShuffle": "Aléatoire", + "@settingsSlideshowShuffle": {}, "settingsSlideshowFillScreen": "Remplir l’écran", + "@settingsSlideshowFillScreen": {}, "settingsSlideshowAnimatedZoomEffect": "Effet de zoom animé", + "@settingsSlideshowAnimatedZoomEffect": {}, "settingsSlideshowTransitionTile": "Transition", + "@settingsSlideshowTransitionTile": {}, "settingsSlideshowIntervalTile": "Intervalle", + "@settingsSlideshowIntervalTile": {}, "settingsSlideshowVideoPlaybackTile": "Lecture de vidéos", + "@settingsSlideshowVideoPlaybackTile": {}, "settingsSlideshowVideoPlaybackDialogTitle": "Lecture de vidéos", - + "@settingsSlideshowVideoPlaybackDialogTitle": {}, "settingsVideoPageTitle": "Réglages vidéo", + "@settingsVideoPageTitle": {}, "settingsVideoSectionTitle": "Vidéo", + "@settingsVideoSectionTitle": {}, "settingsVideoShowVideos": "Afficher les vidéos", + "@settingsVideoShowVideos": {}, "settingsVideoEnableHardwareAcceleration": "Accélération matérielle", + "@settingsVideoEnableHardwareAcceleration": {}, "settingsVideoAutoPlay": "Lecture automatique", + "@settingsVideoAutoPlay": {}, "settingsVideoLoopModeTile": "Lecture répétée", + "@settingsVideoLoopModeTile": {}, "settingsVideoLoopModeDialogTitle": "Lecture répétée", - + "@settingsVideoLoopModeDialogTitle": {}, "settingsSubtitleThemeTile": "Sous-titres", + "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "Sous-titres", + "@settingsSubtitleThemePageTitle": {}, "settingsSubtitleThemeSample": "Ceci est un exemple.", + "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "Alignement du texte", + "@settingsSubtitleThemeTextAlignmentTile": {}, "settingsSubtitleThemeTextAlignmentDialogTitle": "Alignement du texte", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, "settingsSubtitleThemeTextSize": "Taille du texte", + "@settingsSubtitleThemeTextSize": {}, "settingsSubtitleThemeShowOutline": "Afficher les contours et ombres", + "@settingsSubtitleThemeShowOutline": {}, "settingsSubtitleThemeTextColor": "Couleur du texte", + "@settingsSubtitleThemeTextColor": {}, "settingsSubtitleThemeTextOpacity": "Transparence du texte", + "@settingsSubtitleThemeTextOpacity": {}, "settingsSubtitleThemeBackgroundColor": "Couleur d’arrière-plan", + "@settingsSubtitleThemeBackgroundColor": {}, "settingsSubtitleThemeBackgroundOpacity": "Transparence de l’arrière-plan", + "@settingsSubtitleThemeBackgroundOpacity": {}, "settingsSubtitleThemeTextAlignmentLeft": "gauche", + "@settingsSubtitleThemeTextAlignmentLeft": {}, "settingsSubtitleThemeTextAlignmentCenter": "centré", + "@settingsSubtitleThemeTextAlignmentCenter": {}, "settingsSubtitleThemeTextAlignmentRight": "droite", - + "@settingsSubtitleThemeTextAlignmentRight": {}, "settingsVideoControlsTile": "Contrôles", + "@settingsVideoControlsTile": {}, "settingsVideoControlsPageTitle": "Contrôles", + "@settingsVideoControlsPageTitle": {}, "settingsVideoButtonsTile": "Boutons", + "@settingsVideoButtonsTile": {}, "settingsVideoGestureDoubleTapTogglePlay": "Appuyer deux fois pour lire ou mettre en pause", + "@settingsVideoGestureDoubleTapTogglePlay": {}, "settingsVideoGestureSideDoubleTapSeek": "Appuyer deux fois sur les bords de l’écran pour reculer ou avancer", - + "@settingsVideoGestureSideDoubleTapSeek": {}, "settingsPrivacySectionTitle": "Confidentialité", + "@settingsPrivacySectionTitle": {}, "settingsAllowInstalledAppAccess": "Autoriser l’accès à l’inventaire des apps", + "@settingsAllowInstalledAppAccess": {}, "settingsAllowInstalledAppAccessSubtitle": "Pour un affichage amélioré des albums", + "@settingsAllowInstalledAppAccessSubtitle": {}, "settingsAllowErrorReporting": "Autoriser l’envoi de rapports d’erreur", + "@settingsAllowErrorReporting": {}, "settingsSaveSearchHistory": "Maintenir un historique des recherches", + "@settingsSaveSearchHistory": {}, "settingsEnableBin": "Utiliser la corbeille", + "@settingsEnableBin": {}, "settingsEnableBinSubtitle": "Conserver les éléments supprimés pendant 30 jours", - + "@settingsEnableBinSubtitle": {}, "settingsHiddenItemsTile": "Éléments masqués", + "@settingsHiddenItemsTile": {}, "settingsHiddenItemsPageTitle": "Éléments masqués", - + "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "Filtres masqués", + "@settingsHiddenItemsTabFilters": {}, "settingsHiddenFiltersBanner": "Les images et vidéos correspondantes aux filtres masqués n’apparaîtront pas dans votre collection.", + "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "Aucun filtre masqué", - + "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "Chemins masqués", + "@settingsHiddenItemsTabPaths": {}, "settingsHiddenPathsBanner": "Les images et vidéos dans ces dossiers, ou leurs sous-dossiers, n’apparaîtront pas dans votre collection.", + "@settingsHiddenPathsBanner": {}, "addPathTooltip": "Ajouter un chemin", - + "@addPathTooltip": {}, "settingsStorageAccessTile": "Accès au stockage", + "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "Accès au stockage", + "@settingsStorageAccessPageTitle": {}, "settingsStorageAccessBanner": "Une autorisation d’accès au stockage est nécessaire pour modifier le contenu de certains dossiers. Voici la liste des autorisations couramment en vigueur.", + "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "Aucune autorisation d’accès", + "@settingsStorageAccessEmpty": {}, "settingsStorageAccessRevokeTooltip": "Retirer", - + "@settingsStorageAccessRevokeTooltip": {}, "settingsAccessibilitySectionTitle": "Accessibilité", + "@settingsAccessibilitySectionTitle": {}, "settingsRemoveAnimationsTile": "Suppression des animations", + "@settingsRemoveAnimationsTile": {}, "settingsRemoveAnimationsDialogTitle": "Suppression des animations", + "@settingsRemoveAnimationsDialogTitle": {}, "settingsTimeToTakeActionTile": "Délai pour effectuer une action", - + "@settingsTimeToTakeActionTile": {}, "settingsDisplaySectionTitle": "Affichage", + "@settingsDisplaySectionTitle": {}, "settingsThemeBrightnessTile": "Thème", + "@settingsThemeBrightnessTile": {}, "settingsThemeBrightnessDialogTitle": "Thème", + "@settingsThemeBrightnessDialogTitle": {}, "settingsThemeColorHighlights": "Surlignages colorés", + "@settingsThemeColorHighlights": {}, "settingsThemeEnableDynamicColor": "Couleur dynamique", + "@settingsThemeEnableDynamicColor": {}, "settingsDisplayRefreshRateModeTile": "Fréquence d’actualisation de l’écran", + "@settingsDisplayRefreshRateModeTile": {}, "settingsDisplayRefreshRateModeDialogTitle": "Fréquence d’actualisation", - + "@settingsDisplayRefreshRateModeDialogTitle": {}, "settingsLanguageSectionTitle": "Langue & Formats", + "@settingsLanguageSectionTitle": {}, "settingsLanguageTile": "Langue", + "@settingsLanguageTile": {}, "settingsLanguagePageTitle": "Langue", + "@settingsLanguagePageTitle": {}, "settingsCoordinateFormatTile": "Format de coordonnées", + "@settingsCoordinateFormatTile": {}, "settingsCoordinateFormatDialogTitle": "Format de coordonnées", + "@settingsCoordinateFormatDialogTitle": {}, "settingsUnitSystemTile": "Unités", + "@settingsUnitSystemTile": {}, "settingsUnitSystemDialogTitle": "Unités", - + "@settingsUnitSystemDialogTitle": {}, "settingsScreenSaverPageTitle": "Économiseur d’écran", - + "@settingsScreenSaverPageTitle": {}, "settingsWidgetPageTitle": "Cadre photo", + "@settingsWidgetPageTitle": {}, "settingsWidgetShowOutline": "Contours", + "@settingsWidgetShowOutline": {}, "settingsWidgetOpenPage": "Quand vous appuyez sur le widget", - + "@settingsWidgetOpenPage": {}, "settingsCollectionTile": "Collection", - + "@settingsCollectionTile": {}, "statsPageTitle": "Statistiques", + "@statsPageTitle": {}, "statsWithGps": "{count, plural, =1{1 élément localisé} other{{count} éléments localisés}}", + "@statsWithGps": {}, "statsTopCountriesSectionTitle": "Top pays", + "@statsTopCountriesSectionTitle": {}, "statsTopPlacesSectionTitle": "Top lieux", + "@statsTopPlacesSectionTitle": {}, "statsTopTagsSectionTitle": "Top libellés", + "@statsTopTagsSectionTitle": {}, "statsTopAlbumsSectionTitle": "Top albums", - + "@statsTopAlbumsSectionTitle": {}, "viewerOpenPanoramaButtonLabel": "OUVRIR LE PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, "viewerSetWallpaperButtonLabel": "APPLIQUER", + "@viewerSetWallpaperButtonLabel": {}, "viewerErrorUnknown": "Zut !", + "@viewerErrorUnknown": {}, "viewerErrorDoesNotExist": "Le fichier n’existe plus.", - + "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "Détails", + "@viewerInfoPageTitle": {}, "viewerInfoBackToViewerTooltip": "Retour à la visionneuse", - + "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "inconnu", + "@viewerInfoUnknown": {}, "viewerInfoLabelDescription": "Description", + "@viewerInfoLabelDescription": {}, "viewerInfoLabelTitle": "Titre", + "@viewerInfoLabelTitle": {}, "viewerInfoLabelDate": "Date", + "@viewerInfoLabelDate": {}, "viewerInfoLabelResolution": "Résolution", + "@viewerInfoLabelResolution": {}, "viewerInfoLabelSize": "Taille", + "@viewerInfoLabelSize": {}, "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, "viewerInfoLabelPath": "Chemin", + "@viewerInfoLabelPath": {}, "viewerInfoLabelDuration": "Durée", + "@viewerInfoLabelDuration": {}, "viewerInfoLabelOwner": "Propriétaire", + "@viewerInfoLabelOwner": {}, "viewerInfoLabelCoordinates": "Coordonnées", + "@viewerInfoLabelCoordinates": {}, "viewerInfoLabelAddress": "Adresse", - + "@viewerInfoLabelAddress": {}, "mapStyleDialogTitle": "Type de carte", + "@mapStyleDialogTitle": {}, "mapStyleTooltip": "Sélectionner le type de carte", + "@mapStyleTooltip": {}, "mapZoomInTooltip": "Zoomer", + "@mapZoomInTooltip": {}, "mapZoomOutTooltip": "Dézoomer", + "@mapZoomOutTooltip": {}, "mapPointNorthUpTooltip": "Placer le nord en haut", + "@mapPointNorthUpTooltip": {}, "mapAttributionOsmHot": "Données © les contributeurs d’[OpenStreetMap](https://www.openstreetmap.org/copyright) • Fond de carte par [HOT](https://www.hotosm.org/) • Hébergé par [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, "mapAttributionStamen": "Données © les contributeurs d’[OpenStreetMap](https://www.openstreetmap.org/copyright) • Fond de carte par [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, "openMapPageTooltip": "Ouvrir la page Carte", + "@openMapPageTooltip": {}, "mapEmptyRegion": "Aucune image dans cette région", - + "@mapEmptyRegion": {}, "viewerInfoOpenEmbeddedFailureFeedback": "Échec de l’extraction des données", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, "viewerInfoOpenLinkText": "Ouvrir", + "@viewerInfoOpenLinkText": {}, "viewerInfoViewXmlLinkText": "Afficher le XML", - + "@viewerInfoViewXmlLinkText": {}, "viewerInfoSearchFieldLabel": "Recherche de métadonnées", + "@viewerInfoSearchFieldLabel": {}, "viewerInfoSearchEmpty": "Aucune clé correspondante", + "@viewerInfoSearchEmpty": {}, "viewerInfoSearchSuggestionDate": "Date & heure", + "@viewerInfoSearchSuggestionDate": {}, "viewerInfoSearchSuggestionDescription": "Description", + "@viewerInfoSearchSuggestionDescription": {}, "viewerInfoSearchSuggestionDimensions": "Dimensions", + "@viewerInfoSearchSuggestionDimensions": {}, "viewerInfoSearchSuggestionResolution": "Résolution", + "@viewerInfoSearchSuggestionResolution": {}, "viewerInfoSearchSuggestionRights": "Droits", - + "@viewerInfoSearchSuggestionRights": {}, "wallpaperUseScrollEffect": "Utiliser l’effet de défilement sur l’écran d’accueil", - + "@wallpaperUseScrollEffect": {}, "tagEditorPageTitle": "Modifier les libellés", + "@tagEditorPageTitle": {}, "tagEditorPageNewTagFieldLabel": "Nouveau libellé", + "@tagEditorPageNewTagFieldLabel": {}, "tagEditorPageAddTagTooltip": "Ajouter le libellé", + "@tagEditorPageAddTagTooltip": {}, "tagEditorSectionRecent": "Ajouts récents", - + "@tagEditorSectionRecent": {}, "panoramaEnableSensorControl": "Activer le contrôle par capteurs", + "@panoramaEnableSensorControl": {}, "panoramaDisableSensorControl": "Désactiver le contrôle par capteurs", - + "@panoramaDisableSensorControl": {}, "sourceViewerPageTitle": "Code source", - + "@sourceViewerPageTitle": {}, "filePickerShowHiddenFiles": "Afficher les fichiers masqués", + "@filePickerShowHiddenFiles": {}, "filePickerDoNotShowHiddenFiles": "Ne pas afficher les fichiers masqués", + "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "Ouvrir à partir de", + "@filePickerOpenFrom": {}, "filePickerNoItems": "Aucun élément", - "filePickerUseThisFolder": "Utiliser ce dossier" + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "Utiliser ce dossier", + "@filePickerUseThisFolder": {} } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 79709e726..aba29bda9 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -1,694 +1,1146 @@ { "appName": "Aves", + "@appName": {}, "welcomeMessage": "Benvenuto in Aves", + "@welcomeMessage": {}, "welcomeOptional": "Opzionale", + "@welcomeOptional": {}, "welcomeTermsToggle": "Accetto i termini e le condizioni", + "@welcomeTermsToggle": {}, "itemCount": "{count, plural, =1{1 elemento} other{{count} elementi}}", - + "@itemCount": {}, "timeSeconds": "{seconds, plural, =1{1 secondo} other{{seconds} secondi}}", + "@timeSeconds": {}, "timeMinutes": "{minutes, plural, =1{1 minuto} other{{minutes} minuti}}", + "@timeMinutes": {}, "timeDays": "{days, plural, =1{1 giorno} other{{days} giorni}}", + "@timeDays": {}, "focalLength": "{length} mm", - + "@focalLength": {}, "applyButtonLabel": "APPLICA", + "@applyButtonLabel": {}, "deleteButtonLabel": "CANCELLA", + "@deleteButtonLabel": {}, "nextButtonLabel": "AVANTI", + "@nextButtonLabel": {}, "showButtonLabel": "MOSTRA", + "@showButtonLabel": {}, "hideButtonLabel": "NASCONDERE", + "@hideButtonLabel": {}, "continueButtonLabel": "CONTINUA", - + "@continueButtonLabel": {}, "cancelTooltip": "Annulla", + "@cancelTooltip": {}, "changeTooltip": "Cambia", + "@changeTooltip": {}, "clearTooltip": "Cancella", + "@clearTooltip": {}, "previousTooltip": "Precedente", + "@previousTooltip": {}, "nextTooltip": "Successivo", + "@nextTooltip": {}, "showTooltip": "Mostra", + "@showTooltip": {}, "hideTooltip": "Nascondi", + "@hideTooltip": {}, "actionRemove": "Rimuovi", + "@actionRemove": {}, "resetTooltip": "Reimposta", + "@resetTooltip": {}, "saveTooltip": "Salva", + "@saveTooltip": {}, "pickTooltip": "Seleziona", - + "@pickTooltip": {}, "doubleBackExitMessage": "Tocca di nuovo «indietro» per uscire", + "@doubleBackExitMessage": {}, "doNotAskAgain": "Non chiedere di nuovo", - + "@doNotAskAgain": {}, "sourceStateLoading": "Caricamento", + "@sourceStateLoading": {}, "sourceStateCataloguing": "Catalogazione", + "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "Individuazione dei paesi", + "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "Individuazione dei luoghi", - + "@sourceStateLocatingPlaces": {}, "chipActionDelete": "Elimina", + "@chipActionDelete": {}, "chipActionGoToAlbumPage": "Mostra negli album", + "@chipActionGoToAlbumPage": {}, "chipActionGoToCountryPage": "Mostra nei Paesi", + "@chipActionGoToCountryPage": {}, "chipActionGoToTagPage": "Mostra nelle Etichette", + "@chipActionGoToTagPage": {}, "chipActionFilterOut": "Escludi", + "@chipActionFilterOut": {}, "chipActionFilterIn": "Includi", + "@chipActionFilterIn": {}, "chipActionHide": "Nascondi", + "@chipActionHide": {}, "chipActionPin": "Fissa in alto", + "@chipActionPin": {}, "chipActionUnpin": "Rimuovi dall’alto", + "@chipActionUnpin": {}, "chipActionRename": "Rinomina", + "@chipActionRename": {}, "chipActionSetCover": "Imposta copertina", + "@chipActionSetCover": {}, "chipActionCreateAlbum": "Crea album", - + "@chipActionCreateAlbum": {}, "entryActionCopyToClipboard": "Copia negli appunti", + "@entryActionCopyToClipboard": {}, "entryActionDelete": "Elimina", + "@entryActionDelete": {}, "entryActionConvert": "Converti", + "@entryActionConvert": {}, "entryActionExport": "Esportazione", + "@entryActionExport": {}, "entryActionInfo": "Info", + "@entryActionInfo": {}, "entryActionRename": "Rinomina", + "@entryActionRename": {}, "entryActionRestore": "Ripristina", + "@entryActionRestore": {}, "entryActionRotateCCW": "Ruota in senso antiorario", + "@entryActionRotateCCW": {}, "entryActionRotateCW": "Ruota in senso orario", + "@entryActionRotateCW": {}, "entryActionFlip": "Capovolgi orizzontalmente", + "@entryActionFlip": {}, "entryActionPrint": "Stampa", + "@entryActionPrint": {}, "entryActionShare": "Condividi", + "@entryActionShare": {}, "entryActionViewSource": "Visualizza sorgente", + "@entryActionViewSource": {}, "entryActionShowGeoTiffOnMap": "Mostra sopra la mappa", + "@entryActionShowGeoTiffOnMap": {}, "entryActionConvertMotionPhotoToStillImage": "Converti in immagine statica", + "@entryActionConvertMotionPhotoToStillImage": {}, "entryActionViewMotionPhotoVideo": "Apri foto in movimento", + "@entryActionViewMotionPhotoVideo": {}, "entryActionEdit": "Modifica", + "@entryActionEdit": {}, "entryActionOpen": "Apri con", + "@entryActionOpen": {}, "entryActionSetAs": "Imposta come", + "@entryActionSetAs": {}, "entryActionOpenMap": "Mostra in app mappa", + "@entryActionOpenMap": {}, "entryActionRotateScreen": "Ruota lo schermo", + "@entryActionRotateScreen": {}, "entryActionAddFavourite": "Aggiungi ai preferiti", + "@entryActionAddFavourite": {}, "entryActionRemoveFavourite": "Rimuovi dai preferiti", - + "@entryActionRemoveFavourite": {}, "videoActionCaptureFrame": "Cattura fotogramma", + "@videoActionCaptureFrame": {}, "videoActionMute": "Disattiva audio", + "@videoActionMute": {}, "videoActionUnmute": "Riattiva audio", + "@videoActionUnmute": {}, "videoActionPause": "Pausa", + "@videoActionPause": {}, "videoActionPlay": "Riproduci", + "@videoActionPlay": {}, "videoActionReplay10": "Cerca indietro di 10 secondi", + "@videoActionReplay10": {}, "videoActionSkip10": "Cerca in avanti di 10 secondi", + "@videoActionSkip10": {}, "videoActionSelectStreams": "Seleziona le tracce", + "@videoActionSelectStreams": {}, "videoActionSetSpeed": "Velocità di riproduzione", + "@videoActionSetSpeed": {}, "videoActionSettings": "Impostazioni", - + "@videoActionSettings": {}, "slideshowActionResume": "Riprendi", + "@slideshowActionResume": {}, "slideshowActionShowInCollection": "Mostra nella Collezione", - + "@slideshowActionShowInCollection": {}, "entryInfoActionEditDate": "Modifica data e ora", + "@entryInfoActionEditDate": {}, "entryInfoActionEditLocation": "Modifica posizione", + "@entryInfoActionEditLocation": {}, "entryInfoActionEditTitleDescription": "Modifica titolo & descrizione", + "@entryInfoActionEditTitleDescription": {}, "entryInfoActionEditRating": "Modifica valutazione", + "@entryInfoActionEditRating": {}, "entryInfoActionEditTags": "Modifica etichetta", + "@entryInfoActionEditTags": {}, "entryInfoActionRemoveMetadata": "Rimuovi metadati", - + "@entryInfoActionRemoveMetadata": {}, "filterBinLabel": "Cestino", + "@filterBinLabel": {}, "filterFavouriteLabel": "Preferiti", + "@filterFavouriteLabel": {}, "filterNoDateLabel": "Senza data", + "@filterNoDateLabel": {}, "filterNoLocationLabel": "Senza posizione", + "@filterNoLocationLabel": {}, "filterNoRatingLabel": "Non valutato", + "@filterNoRatingLabel": {}, "filterNoTagLabel": "Senza etichetta", + "@filterNoTagLabel": {}, "filterNoTitleLabel": "Senza titolo", + "@filterNoTitleLabel": {}, "filterOnThisDayLabel": "In questo giorno", + "@filterOnThisDayLabel": {}, "filterRecentlyAddedLabel": "Aggiunto di recente", + "@filterRecentlyAddedLabel": {}, "filterRatingRejectedLabel": "Rifiutato", + "@filterRatingRejectedLabel": {}, "filterTypeAnimatedLabel": "Animato", + "@filterTypeAnimatedLabel": {}, "filterTypeMotionPhotoLabel": "Foto in movimento", + "@filterTypeMotionPhotoLabel": {}, "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, "filterTypeSphericalVideoLabel": "Video a 360°", + "@filterTypeSphericalVideoLabel": {}, "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, "filterMimeImageLabel": "Immagine", + "@filterMimeImageLabel": {}, "filterMimeVideoLabel": "Video", - + "@filterMimeVideoLabel": {}, "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, "coordinateFormatDecimal": "Gradi decimali", + "@coordinateFormatDecimal": {}, "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, "coordinateDmsWest": "O", - + "@coordinateDmsWest": {}, "unitSystemMetric": "Metrico", + "@unitSystemMetric": {}, "unitSystemImperial": "Imperiale", - + "@unitSystemImperial": {}, "videoLoopModeNever": "Mai", + "@videoLoopModeNever": {}, "videoLoopModeShortOnly": "Solo video brevi", + "@videoLoopModeShortOnly": {}, "videoLoopModeAlways": "Sempre", - + "@videoLoopModeAlways": {}, "videoControlsPlay": "Riproduci", + "@videoControlsPlay": {}, "videoControlsPlaySeek": "Riproduci e cerca avanti/indietro", + "@videoControlsPlaySeek": {}, "videoControlsPlayOutside": "Apri con un altro lettore", + "@videoControlsPlayOutside": {}, "videoControlsNone": "Nessuno", - + "@videoControlsNone": {}, "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, "mapStyleGoogleHybrid": "Google Maps (Ibrido)", + "@mapStyleGoogleHybrid": {}, "mapStyleGoogleTerrain": "Google Maps (Terreno)", + "@mapStyleGoogleTerrain": {}, "mapStyleHuaweiNormal": "Petal Maps", + "@mapStyleHuaweiNormal": {}, "mapStyleHuaweiTerrain": "Petal Maps (Terreno)", + "@mapStyleHuaweiTerrain": {}, "mapStyleOsmHot": "OSM umanitario", + "@mapStyleOsmHot": {}, "mapStyleStamenToner": "Stamen Toner (Monocromatico)", + "@mapStyleStamenToner": {}, "mapStyleStamenWatercolor": "Stamen Watercolor (Acquerello)", - + "@mapStyleStamenWatercolor": {}, "nameConflictStrategyRename": "Rinomina", + "@nameConflictStrategyRename": {}, "nameConflictStrategyReplace": "Sostituisci", + "@nameConflictStrategyReplace": {}, "nameConflictStrategySkip": "Salta", - + "@nameConflictStrategySkip": {}, "keepScreenOnNever": "Mai", + "@keepScreenOnNever": {}, "keepScreenOnViewerOnly": "Solo pagina di visualizzazione", + "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "Sempre", - + "@keepScreenOnAlways": {}, "accessibilityAnimationsRemove": "Evita gli effetti sullo schermo", + "@accessibilityAnimationsRemove": {}, "accessibilityAnimationsKeep": "Mantieni gli effetti sullo schermo", - + "@accessibilityAnimationsKeep": {}, "displayRefreshRatePreferHighest": "Frequenza massima", + "@displayRefreshRatePreferHighest": {}, "displayRefreshRatePreferLowest": "Frequenza minima", - + "@displayRefreshRatePreferLowest": {}, "videoPlaybackSkip": "Salta", + "@videoPlaybackSkip": {}, "videoPlaybackMuted": "Riproduci senza audio", + "@videoPlaybackMuted": {}, "videoPlaybackWithSound": "Riproduci con audio", - + "@videoPlaybackWithSound": {}, "themeBrightnessLight": "Chiaro", + "@themeBrightnessLight": {}, "themeBrightnessDark": "Scuro", + "@themeBrightnessDark": {}, "themeBrightnessBlack": "Nero", - + "@themeBrightnessBlack": {}, "viewerTransitionSlide": "Diapositiva", + "@viewerTransitionSlide": {}, "viewerTransitionParallax": "Parallasse", + "@viewerTransitionParallax": {}, "viewerTransitionFade": "Dissolvenza", + "@viewerTransitionFade": {}, "viewerTransitionZoomIn": "Ingrandisci", + "@viewerTransitionZoomIn": {}, "viewerTransitionNone": "Nessuna", - + "@viewerTransitionNone": {}, "wallpaperTargetHome": "Schermata iniziale", + "@wallpaperTargetHome": {}, "wallpaperTargetLock": "Schermata di blocco", + "@wallpaperTargetLock": {}, "wallpaperTargetHomeLock": "Schermata iniziale e di blocco", - + "@wallpaperTargetHomeLock": {}, "widgetOpenPageHome": "Apri pagina iniziale", + "@widgetOpenPageHome": {}, "widgetOpenPageViewer": "Apri visualizzazione", - + "@widgetOpenPageViewer": {}, "albumTierNew": "Nuovi", + "@albumTierNew": {}, "albumTierPinned": "Fissati", + "@albumTierPinned": {}, "albumTierSpecial": "Frequenti", + "@albumTierSpecial": {}, "albumTierApps": "Applicazioni", + "@albumTierApps": {}, "albumTierRegular": "Altri", - + "@albumTierRegular": {}, "storageVolumeDescriptionFallbackPrimary": "Archiviazione interna", + "@storageVolumeDescriptionFallbackPrimary": {}, "storageVolumeDescriptionFallbackNonPrimary": "Scheda SD", + "@storageVolumeDescriptionFallbackNonPrimary": {}, "rootDirectoryDescription": "cartella root", + "@rootDirectoryDescription": {}, "otherDirectoryDescription": "cartella «{name}»", + "@otherDirectoryDescription": {}, "storageAccessDialogMessage": "Si prega di selezionare la {directory} di «{volume}» nella prossima schermata per dare accesso a questa applicazione", + "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "Questa applicazione non è autorizzata a modificare i file nella {directory} di «{volume}»", - "notEnoughSpaceDialogMessage": "Questa operazione ha bisogno di {needSize} di spazio libero su «{volume}» per essere completata, ma è rimasto solo {freeSize}", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Questa operazione ha bisogno di {neededSize} di spazio libero su «{volume}» per essere completata, ma è rimasto solo {freeSize}.", + "@notEnoughSpaceDialogMessage": {}, "missingSystemFilePickerDialogMessage": "Il selezionatore file di sistema è mancante o disabilitato. Per favore abilitalo e riprova", - + "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, =1{Questa operazione non è supportata per elementi del seguente tipo: {types}.} other{Questa operazione non è supportata per elementi dei seguenti tipi: {types}.}}", - + "@unsupportedTypeDialogMessage": {}, "nameConflictDialogSingleSourceMessage": "Alcuni file nella cartella di destinazione hanno lo stesso nome", + "@nameConflictDialogSingleSourceMessage": {}, "nameConflictDialogMultipleSourceMessage": "Alcuni file hanno lo stesso nome", - + "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "Etichetta della scorciatoia", + "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "AGGIUNGI", - + "@addShortcutButtonLabel": {}, "noMatchingAppDialogMessage": "Non ci sono app che possono gestire questo", - + "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{Spostare questo elemento nel cestino?} other{Spostare questi {count} elementi nel cestino?}}", + "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Cancellare questo elemento?} other{Cancellare questi {count} elementi?}}", - "moveUndatedConfirmationDialogMessage": "Salvare le date degli elementi prima di procedere", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Salvare le date degli elementi prima di procedere?", + "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Salvare le date", - + "@moveUndatedConfirmationDialogSetDate": {}, "videoResumeDialogMessage": "Vuoi riprendere la riproduzione a {time}?", + "@videoResumeDialogMessage": {}, "videoStartOverButtonLabel": "RICOMINCIA", + "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "RIPRENDI", - + "@videoResumeButtonLabel": {}, "setCoverDialogLatest": "Ultimo elemento", + "@setCoverDialogLatest": {}, "setCoverDialogAuto": "Automatico", + "@setCoverDialogAuto": {}, "setCoverDialogCustom": "Personalizzato", - - "hideFilterConfirmationDialogMessage": "Le foto e i video corrispondenti saranno nascosti dalla tua collezione. Puoi mostrarli di nuovo dalle impostazioni della «Privacy». Sei sicuro di volerli nascondere?", - + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Le foto e i video corrispondenti saranno nascosti dalla tua collezione. Puoi mostrarli di nuovo dalle impostazioni della «Privacy».\n\nSei sicuro di volerli nascondere?", + "@hideFilterConfirmationDialogMessage": {}, "newAlbumDialogTitle": "Nuovo album", + "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "Nome dell’album", + "@newAlbumDialogNameLabel": {}, "newAlbumDialogNameLabelAlreadyExistsHelper": "La cartella esiste già", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "Archiviazione:", - + "@newAlbumDialogStorageLabel": {}, "renameAlbumDialogLabel": "Nuovo nome", + "@renameAlbumDialogLabel": {}, "renameAlbumDialogLabelAlreadyExistsHelper": "La cartella esiste già", - + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, "renameEntrySetPageTitle": "Rinomina", + "@renameEntrySetPageTitle": {}, "renameEntrySetPagePatternFieldLabel": "Schema per i nomi", + "@renameEntrySetPagePatternFieldLabel": {}, "renameEntrySetPageInsertTooltip": "Inserisci campo", + "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "Anteprima", - + "@renameEntrySetPagePreviewSectionTitle": {}, "renameProcessorCounter": "Contatore", + "@renameProcessorCounter": {}, "renameProcessorName": "Nome", - + "@renameProcessorName": {}, "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Cancellare questo album e i suoi elementi?} other{Cancellare questo album e i suoi {count} elementi?}}", - "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Cancellare questi album e i loro elementi?} other{Cancellare questi album e i loro {count} elementi?}", - + "@deleteSingleAlbumConfirmationDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Cancellare questi album e i loro elementi?} other{Cancellare questi album e i loro {count} elementi?}}", + "@deleteMultiAlbumConfirmationDialogMessage": {}, "exportEntryDialogFormat": "Formato:", + "@exportEntryDialogFormat": {}, "exportEntryDialogWidth": "Larghezza", + "@exportEntryDialogWidth": {}, "exportEntryDialogHeight": "Altezza", - + "@exportEntryDialogHeight": {}, "renameEntryDialogLabel": "Nuovo nome", - + "@renameEntryDialogLabel": {}, "editEntryDialogTargetFieldsHeader": "Campi da modificare", - + "@editEntryDialogTargetFieldsHeader": {}, "editEntryDateDialogTitle": "Data e ora", + "@editEntryDateDialogTitle": {}, "editEntryDateDialogSetCustom": "Imposta data personalizzata", + "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Copia da un’altra data", + "@editEntryDateDialogCopyField": {}, "editEntryDateDialogCopyItem": "Copia da un altro elemento", + "@editEntryDateDialogCopyItem": {}, "editEntryDateDialogExtractFromTitle": "Estrai dal titolo", + "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Turno", + "@editEntryDateDialogShift": {}, "editEntryDateDialogSourceFileModifiedDate": "Data di modifica del file", - + "@editEntryDateDialogSourceFileModifiedDate": {}, "durationDialogHours": "Ore", + "@durationDialogHours": {}, "durationDialogMinutes": "Minuti", - + "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Posizione", + "@editEntryLocationDialogTitle": {}, "editEntryLocationDialogChooseOnMapTooltip": "Scegli sulla mappa", + "@editEntryLocationDialogChooseOnMapTooltip": {}, "editEntryLocationDialogLatitude": "Latitudine", + "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Longitudine", - + "@editEntryLocationDialogLongitude": {}, "locationPickerUseThisLocationButton": "Usa questa posizione", - + "@locationPickerUseThisLocationButton": {}, "editEntryRatingDialogTitle": "Valutazione", - + "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "Rimozione dei metadati", + "@removeEntryMetadataDialogTitle": {}, "removeEntryMetadataDialogMore": "Altro", - + "@removeEntryMetadataDialogMore": {}, "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP è richiesto per riprodurre il video all’interno di una foto in movimento.\n\nSei sicuro di volerlo rimuovere?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, "convertMotionPhotoToStillImageWarningDialogMessage": "Sei sicuro?", - + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, "videoSpeedDialogLabel": "Velocità di riproduzione", - + "@videoSpeedDialogLabel": {}, "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, "videoStreamSelectionDialogText": "Sottotitoli", + "@videoStreamSelectionDialogText": {}, "videoStreamSelectionDialogOff": "Off", + "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "Traccia", + "@videoStreamSelectionDialogTrack": {}, "videoStreamSelectionDialogNoSelection": "Non ci sono altre tracce", - + "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "Fatto!", + "@genericSuccessFeedback": {}, "genericFailureFeedback": "Fallito", - + "@genericFailureFeedback": {}, "menuActionConfigureView": "Vista", + "@menuActionConfigureView": {}, "menuActionSelect": "Seleziona", + "@menuActionSelect": {}, "menuActionSelectAll": "Seleziona tutto", + "@menuActionSelectAll": {}, "menuActionSelectNone": "Deseleziona tutto", + "@menuActionSelectNone": {}, "menuActionMap": "Mappa", + "@menuActionMap": {}, "menuActionSlideshow": "Presentazione", + "@menuActionSlideshow": {}, "menuActionStats": "Statistiche", - + "@menuActionStats": {}, "viewDialogSortSectionTitle": "Ordina", + "@viewDialogSortSectionTitle": {}, "viewDialogGroupSectionTitle": "Raggruppa", + "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "Layout", + "@viewDialogLayoutSectionTitle": {}, "viewDialogReverseSortOrder": "Inverti ordinamento", - + "@viewDialogReverseSortOrder": {}, "tileLayoutMosaic": "Mosaico", + "@tileLayoutMosaic": {}, "tileLayoutGrid": "Griglia", + "@tileLayoutGrid": {}, "tileLayoutList": "Lista", - + "@tileLayoutList": {}, "coverDialogTabCover": "Copertina", + "@coverDialogTabCover": {}, "coverDialogTabApp": "App", + "@coverDialogTabApp": {}, "coverDialogTabColor": "Colore", - + "@coverDialogTabColor": {}, "appPickDialogTitle": "Seleziona App", + "@appPickDialogTitle": {}, "appPickDialogNone": "Nessuna", - + "@appPickDialogNone": {}, "aboutPageTitle": "Informazioni", + "@aboutPageTitle": {}, "aboutLinkLicense": "Licenza", + "@aboutLinkLicense": {}, "aboutLinkPolicy": "Informativa sulla privacy", - + "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "Segnalazione bug", + "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "Salva i log dell’app in un file", + "@aboutBugSaveLogInstruction": {}, "aboutBugCopyInfoInstruction": "Copia le informazioni di sistema", + "@aboutBugCopyInfoInstruction": {}, "aboutBugCopyInfoButton": "Copia", + "@aboutBugCopyInfoButton": {}, "aboutBugReportInstruction": "Segnala su GitHub con i log e le informazioni di sistema", + "@aboutBugReportInstruction": {}, "aboutBugReportButton": "Segnala", - + "@aboutBugReportButton": {}, "aboutCreditsSectionTitle": "Crediti", + "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "Questa applicazione utilizza un file TopoJSON di", + "@aboutCreditsWorldAtlas1": {}, "aboutCreditsWorldAtlas2": "sotto licenza ISC", + "@aboutCreditsWorldAtlas2": {}, "aboutTranslatorsSectionTitle": "Traduttori", - + "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "Licenze Open-Source", + "@aboutLicensesSectionTitle": {}, "aboutLicensesBanner": "Questa applicazione utilizza i seguenti pacchetti e librerie open-source", + "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "Librerie Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, "aboutLicensesFlutterPluginsSectionTitle": "Plugin Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, "aboutLicensesFlutterPackagesSectionTitle": "Pacchetti Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, "aboutLicensesDartPackagesSectionTitle": "Pacchetti Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "Mostra tutte le licenze", - + "@aboutLicensesShowAllButtonLabel": {}, "policyPageTitle": "Informativa sulla privacy", - + "@policyPageTitle": {}, "collectionPageTitle": "Collezione", + "@collectionPageTitle": {}, "collectionPickPageTitle": "Seleziona", + "@collectionPickPageTitle": {}, "collectionSelectPageTitle": "Seleziona elementi", - + "@collectionSelectPageTitle": {}, "collectionActionShowTitleSearch": "Filtra per titoli", + "@collectionActionShowTitleSearch": {}, "collectionActionHideTitleSearch": "Nascondi filtro", + "@collectionActionHideTitleSearch": {}, "collectionActionAddShortcut": "Aggiungi collegamento", + "@collectionActionAddShortcut": {}, "collectionActionEmptyBin": "Svuota cestino", + "@collectionActionEmptyBin": {}, "collectionActionCopy": "Copia nell’album", + "@collectionActionCopy": {}, "collectionActionMove": "Sposta nell’album", + "@collectionActionMove": {}, "collectionActionRescan": "Riscansiona", + "@collectionActionRescan": {}, "collectionActionEdit": "Modifica", - + "@collectionActionEdit": {}, "collectionSearchTitlesHintText": "Cerca titoli", - + "@collectionSearchTitlesHintText": {}, "collectionGroupAlbum": "Per album", + "@collectionGroupAlbum": {}, "collectionGroupMonth": "Per mese", + "@collectionGroupMonth": {}, "collectionGroupDay": "Per giorno", + "@collectionGroupDay": {}, "collectionGroupNone": "Non raggruppare", - + "@collectionGroupNone": {}, "sectionUnknown": "Sconosciuto", + "@sectionUnknown": {}, "dateToday": "Oggi", + "@dateToday": {}, "dateYesterday": "Ieri", + "@dateYesterday": {}, "dateThisMonth": "Questo mese", + "@dateThisMonth": {}, "collectionDeleteFailureFeedback": "{count, plural, =1{Impossibile cancellare 1 elemento} other{Impossibile cancellare {count} elementi}}", + "@collectionDeleteFailureFeedback": {}, "collectionCopyFailureFeedback": "{count, plural, =1{Impossibile copiare 1 elemento} other{Impossibile copiare {count} elementi}}", + "@collectionCopyFailureFeedback": {}, "collectionMoveFailureFeedback": "{count, plural, =1{Impossibile spostare 1 elemento} other{Impossibile spostare {count} elementi}}", + "@collectionMoveFailureFeedback": {}, "collectionRenameFailureFeedback": "{count, plural, =1{Impossibile rinominare 1 elemento} other{Impossibile rinominare {count} elementi}}", + "@collectionRenameFailureFeedback": {}, "collectionEditFailureFeedback": "{count, plural, =1{Impossibile modificare 1 elemento} other{Impossibile modificare {count} elementi}}", + "@collectionEditFailureFeedback": {}, "collectionExportFailureFeedback": "{count, plural, =1{Impossibile esportare 1 elemento} other{Impossibile esportare {count} elementi}}", + "@collectionExportFailureFeedback": {}, "collectionCopySuccessFeedback": "{count, plural, =1{Copiato 1 elemento} other{Copiati {count} elementi}}", + "@collectionCopySuccessFeedback": {}, "collectionMoveSuccessFeedback": "{count, plural, =1{Spostato 1 elemento} other{Spostati {count} elementi}}", + "@collectionMoveSuccessFeedback": {}, "collectionRenameSuccessFeedback": "{count, plural, =1{Rinominato 1 elemento} other{Rinominati {count} elementi}}", + "@collectionRenameSuccessFeedback": {}, "collectionEditSuccessFeedback": "{count, plural, =1{Modificato 1 elemento} other{Modificati {count} elementi}}", - + "@collectionEditSuccessFeedback": {}, "collectionEmptyFavourites": "Nessun preferito", + "@collectionEmptyFavourites": {}, "collectionEmptyVideos": "Nessun video", + "@collectionEmptyVideos": {}, "collectionEmptyImages": "Nessuna immagine", + "@collectionEmptyImages": {}, "collectionEmptyGrantAccessButtonLabel": "Consenti accesso", - + "@collectionEmptyGrantAccessButtonLabel": {}, "collectionSelectSectionTooltip": "Seleziona sezione", + "@collectionSelectSectionTooltip": {}, "collectionDeselectSectionTooltip": "Deseleziona sezione", - + "@collectionDeselectSectionTooltip": {}, "drawerAboutButton": "Informazioni", + "@drawerAboutButton": {}, "drawerSettingsButton": "Impostazioni", + "@drawerSettingsButton": {}, "drawerCollectionAll": "Tutte le collezioni", + "@drawerCollectionAll": {}, "drawerCollectionFavourites": "Preferiti", + "@drawerCollectionFavourites": {}, "drawerCollectionImages": "Immagini", + "@drawerCollectionImages": {}, "drawerCollectionVideos": "Video", + "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "Animazioni", + "@drawerCollectionAnimated": {}, "drawerCollectionMotionPhotos": "Foto in movimento", + "@drawerCollectionMotionPhotos": {}, "drawerCollectionPanoramas": "Panorami", + "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "Foto raw", + "@drawerCollectionRaws": {}, "drawerCollectionSphericalVideos": "Video a 360°", + "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "Album", + "@drawerAlbumPage": {}, "drawerCountryPage": "Paesi", + "@drawerCountryPage": {}, "drawerTagPage": "Etichette", - + "@drawerTagPage": {}, "sortByDate": "Per data", + "@sortByDate": {}, "sortByName": "Per nome", + "@sortByName": {}, "sortByItemCount": "Per numero di elementi", + "@sortByItemCount": {}, "sortBySize": "Per dimensione", + "@sortBySize": {}, "sortByAlbumFileName": "Per album e nome del file", + "@sortByAlbumFileName": {}, "sortByRating": "Per valutazione", - + "@sortByRating": {}, "sortOrderNewestFirst": "Prima i più nuovi", + "@sortOrderNewestFirst": {}, "sortOrderOldestFirst": "Prima i più vecchi", + "@sortOrderOldestFirst": {}, "sortOrderAtoZ": "Dalla A alla Z", + "@sortOrderAtoZ": {}, "sortOrderZtoA": "Dalla Z alla A", + "@sortOrderZtoA": {}, "sortOrderHighestFirst": "Prima le più alte", + "@sortOrderHighestFirst": {}, "sortOrderLowestFirst": "Prima le più basse", + "@sortOrderLowestFirst": {}, "sortOrderLargestFirst": "Prima i più grandi", + "@sortOrderLargestFirst": {}, "sortOrderSmallestFirst": "Prima i più piccoli", - + "@sortOrderSmallestFirst": {}, "albumGroupTier": "Per importanza", + "@albumGroupTier": {}, "albumGroupType": "Per tipo", + "@albumGroupType": {}, "albumGroupVolume": "Per volume di archiviazione", + "@albumGroupVolume": {}, "albumGroupNone": "Non raggruppare", - + "@albumGroupNone": {}, "albumMimeTypeMixed": "Misto", - + "@albumMimeTypeMixed": {}, "albumPickPageTitleCopy": "Copia", + "@albumPickPageTitleCopy": {}, "albumPickPageTitleExport": "Esporta", + "@albumPickPageTitleExport": {}, "albumPickPageTitleMove": "Sposta", + "@albumPickPageTitleMove": {}, "albumPickPageTitlePick": "Seleziona", - + "@albumPickPageTitlePick": {}, "albumCamera": "Fotocamera", + "@albumCamera": {}, "albumDownload": "Scaricati", + "@albumDownload": {}, "albumScreenshots": "Screenshot", + "@albumScreenshots": {}, "albumScreenRecordings": "Registrazioni schermo", + "@albumScreenRecordings": {}, "albumVideoCaptures": "Scatti nei video", - + "@albumVideoCaptures": {}, "albumPageTitle": "Album", + "@albumPageTitle": {}, "albumEmpty": "Nessun album", + "@albumEmpty": {}, "createAlbumTooltip": "Crea album", + "@createAlbumTooltip": {}, "createAlbumButtonLabel": "CREA", + "@createAlbumButtonLabel": {}, "newFilterBanner": "nuovo", - + "@newFilterBanner": {}, "countryPageTitle": "Paesi", + "@countryPageTitle": {}, "countryEmpty": "Nessun paese", - + "@countryEmpty": {}, "tagPageTitle": "Etichette", + "@tagPageTitle": {}, "tagEmpty": "Nessuna etichetta", - + "@tagEmpty": {}, "binPageTitle": "Cestino", - + "@binPageTitle": {}, "searchCollectionFieldHint": "Cerca raccolta", + "@searchCollectionFieldHint": {}, "searchRecentSectionTitle": "Recenti", + "@searchRecentSectionTitle": {}, "searchDateSectionTitle": "Data", + "@searchDateSectionTitle": {}, "searchAlbumsSectionTitle": "Album", + "@searchAlbumsSectionTitle": {}, "searchCountriesSectionTitle": "Paesi", + "@searchCountriesSectionTitle": {}, "searchPlacesSectionTitle": "Luoghi", + "@searchPlacesSectionTitle": {}, "searchTagsSectionTitle": "Etichette", + "@searchTagsSectionTitle": {}, "searchRatingSectionTitle": "Valutazioni", + "@searchRatingSectionTitle": {}, "searchMetadataSectionTitle": "Metadati", - + "@searchMetadataSectionTitle": {}, "settingsPageTitle": "Impostazioni", + "@settingsPageTitle": {}, "settingsSystemDefault": "Sistema", + "@settingsSystemDefault": {}, "settingsDefault": "Predefinite", + "@settingsDefault": {}, "settingsDisabled": "Disabilitato", - + "@settingsDisabled": {}, "settingsSearchFieldLabel": "Ricerca impostazioni", + "@settingsSearchFieldLabel": {}, "settingsSearchEmpty": "Nessuna impostazione corrispondente", + "@settingsSearchEmpty": {}, "settingsActionExport": "Esporta", + "@settingsActionExport": {}, "settingsActionExportDialogTitle": "Esporta", + "@settingsActionExportDialogTitle": {}, "settingsActionImport": "Importa", + "@settingsActionImport": {}, "settingsActionImportDialogTitle": "Importa", - + "@settingsActionImportDialogTitle": {}, "appExportCovers": "Copertine", + "@appExportCovers": {}, "appExportFavourites": "Preferiti", + "@appExportFavourites": {}, "appExportSettings": "Impostazioni", - + "@appExportSettings": {}, "settingsNavigationSectionTitle": "Navigazione", + "@settingsNavigationSectionTitle": {}, "settingsHomeTile": "Pagina iniziale", + "@settingsHomeTile": {}, "settingsHomeDialogTitle": "Pagina iniziale", + "@settingsHomeDialogTitle": {}, "settingsShowBottomNavigationBar": "Mostra la barra di navigazione in basso", + "@settingsShowBottomNavigationBar": {}, "settingsKeepScreenOnTile": "Mantieni acceso lo schermo", + "@settingsKeepScreenOnTile": {}, "settingsKeepScreenOnDialogTitle": "Illuminazione schermo", + "@settingsKeepScreenOnDialogTitle": {}, "settingsDoubleBackExit": "Tocca «indietro» due volte per uscire", - + "@settingsDoubleBackExit": {}, "settingsConfirmationTile": "Richieste di conferma", + "@settingsConfirmationTile": {}, "settingsConfirmationDialogTitle": "Richieste di conferma", + "@settingsConfirmationDialogTitle": {}, "settingsConfirmationBeforeDeleteItems": "Chiedi prima di cancellare gli elementi definitivamente", + "@settingsConfirmationBeforeDeleteItems": {}, "settingsConfirmationBeforeMoveToBinItems": "Chiedi prima di spostare gli elementi nel cestino", + "@settingsConfirmationBeforeMoveToBinItems": {}, "settingsConfirmationBeforeMoveUndatedItems": "Chiedi prima di spostare gli elementi senza data", + "@settingsConfirmationBeforeMoveUndatedItems": {}, "settingsConfirmationAfterMoveToBinItems": "Mostra un messaggio dopo aver spostato gli elementi nel cestino", - + "@settingsConfirmationAfterMoveToBinItems": {}, "settingsNavigationDrawerTile": "Menu di navigazione", + "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "Menu di navigazione", + "@settingsNavigationDrawerEditorPageTitle": {}, "settingsNavigationDrawerBanner": "Tocca e tieni premuto per spostare e riordinare gli elementi del menu", + "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "Tipi", + "@settingsNavigationDrawerTabTypes": {}, "settingsNavigationDrawerTabAlbums": "Album", + "@settingsNavigationDrawerTabAlbums": {}, "settingsNavigationDrawerTabPages": "Pagine", + "@settingsNavigationDrawerTabPages": {}, "settingsNavigationDrawerAddAlbum": "Aggiungi album", - + "@settingsNavigationDrawerAddAlbum": {}, "settingsThumbnailSectionTitle": "Miniature", + "@settingsThumbnailSectionTitle": {}, "settingsThumbnailOverlayTile": "Sovrapposizione", + "@settingsThumbnailOverlayTile": {}, "settingsThumbnailOverlayPageTitle": "Sovrapposizione", + "@settingsThumbnailOverlayPageTitle": {}, "settingsThumbnailShowFavouriteIcon": "Mostra l’icona Preferiti", + "@settingsThumbnailShowFavouriteIcon": {}, "settingsThumbnailShowTagIcon": "Mostra l’icona Etichetta", + "@settingsThumbnailShowTagIcon": {}, "settingsThumbnailShowLocationIcon": "Mostra l’icona Posizione", + "@settingsThumbnailShowLocationIcon": {}, "settingsThumbnailShowMotionPhotoIcon": "Mostra l’icona Foto in movimento", + "@settingsThumbnailShowMotionPhotoIcon": {}, "settingsThumbnailShowRating": "Mostra la valutazione", + "@settingsThumbnailShowRating": {}, "settingsThumbnailShowRawIcon": "Mostra icona Raw", + "@settingsThumbnailShowRawIcon": {}, "settingsThumbnailShowVideoDuration": "Mostra la durata del video", - + "@settingsThumbnailShowVideoDuration": {}, "settingsCollectionQuickActionsTile": "Azioni rapide", + "@settingsCollectionQuickActionsTile": {}, "settingsCollectionQuickActionEditorPageTitle": "Azioni rapide", + "@settingsCollectionQuickActionEditorPageTitle": {}, "settingsCollectionQuickActionTabBrowsing": "Navigazione", + "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "Selezione", + "@settingsCollectionQuickActionTabSelecting": {}, "settingsCollectionBrowsingQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate durante la navigazione degli elementi", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate quando si selezionano gli elementi", - + "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "Visualizzazione", + "@settingsViewerSectionTitle": {}, "settingsViewerGestureSideTapNext": "Tocca i bordi dello schermo per visualizzare l'elemento precedente/successivo", + "@settingsViewerGestureSideTapNext": {}, "settingsViewerUseCutout": "Usa area di ritaglio", + "@settingsViewerUseCutout": {}, "settingsViewerMaximumBrightness": "Luminosità massima", + "@settingsViewerMaximumBrightness": {}, "settingsMotionPhotoAutoPlay": "Riproduzione automatica delle foto in movimento", + "@settingsMotionPhotoAutoPlay": {}, "settingsImageBackground": "Sfondo immagine", - + "@settingsImageBackground": {}, "settingsViewerQuickActionsTile": "Azioni rapide", + "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "Azioni rapide", + "@settingsViewerQuickActionEditorPageTitle": {}, "settingsViewerQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono mostrate durante la visualizione", + "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Pulsanti visualizzati", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Pulsanti disponibili", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, "settingsViewerQuickActionEmpty": "Nessun pulsante", - + "@settingsViewerQuickActionEmpty": {}, "settingsViewerOverlayTile": "Sovrapposizione", + "@settingsViewerOverlayTile": {}, "settingsViewerOverlayPageTitle": "Sovrapposizione", + "@settingsViewerOverlayPageTitle": {}, "settingsViewerShowOverlayOnOpening": "Mostra all’apertura", + "@settingsViewerShowOverlayOnOpening": {}, "settingsViewerShowMinimap": "Mostra la minimappa", + "@settingsViewerShowMinimap": {}, "settingsViewerShowInformation": "Mostra informazioni", + "@settingsViewerShowInformation": {}, "settingsViewerShowInformationSubtitle": "Mostra titolo, data, posizione, ecc.", + "@settingsViewerShowInformationSubtitle": {}, "settingsViewerShowShootingDetails": "Mostra i dettagli dello scatto", + "@settingsViewerShowShootingDetails": {}, "settingsViewerShowOverlayThumbnails": "Mostra le miniature", + "@settingsViewerShowOverlayThumbnails": {}, "settingsViewerEnableOverlayBlurEffect": "Effetto sfocatura", - + "@settingsViewerEnableOverlayBlurEffect": {}, "settingsViewerSlideshowTile": "Presentazione", + "@settingsViewerSlideshowTile": {}, "settingsViewerSlideshowPageTitle": "Presentazione", + "@settingsViewerSlideshowPageTitle": {}, "settingsSlideshowRepeat": "Ripeti", + "@settingsSlideshowRepeat": {}, "settingsSlideshowShuffle": "Ordine casuale", + "@settingsSlideshowShuffle": {}, "settingsSlideshowFillScreen": "Riempi schermo", + "@settingsSlideshowFillScreen": {}, "settingsSlideshowAnimatedZoomEffect": "Effetto ingrandimento animato", + "@settingsSlideshowAnimatedZoomEffect": {}, "settingsSlideshowTransitionTile": "Transizione", + "@settingsSlideshowTransitionTile": {}, "settingsSlideshowIntervalTile": "Intervallo", + "@settingsSlideshowIntervalTile": {}, "settingsSlideshowVideoPlaybackTile": "Riproduzione video", + "@settingsSlideshowVideoPlaybackTile": {}, "settingsSlideshowVideoPlaybackDialogTitle": "Riproduzione video", - + "@settingsSlideshowVideoPlaybackDialogTitle": {}, "settingsVideoPageTitle": "Impostazioni video", + "@settingsVideoPageTitle": {}, "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, "settingsVideoShowVideos": "Mostra video", + "@settingsVideoShowVideos": {}, "settingsVideoEnableHardwareAcceleration": "Accelerazione hardware", + "@settingsVideoEnableHardwareAcceleration": {}, "settingsVideoAutoPlay": "Riproduzione automatica", + "@settingsVideoAutoPlay": {}, "settingsVideoLoopModeTile": "Modalità loop", + "@settingsVideoLoopModeTile": {}, "settingsVideoLoopModeDialogTitle": "Modalità loop", - + "@settingsVideoLoopModeDialogTitle": {}, "settingsSubtitleThemeTile": "Sottotitoli", + "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "Sottotitoli", + "@settingsSubtitleThemePageTitle": {}, "settingsSubtitleThemeSample": "Questo è un campione", + "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "Allineamento del testo", + "@settingsSubtitleThemeTextAlignmentTile": {}, "settingsSubtitleThemeTextAlignmentDialogTitle": "Allineamento del testo", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, "settingsSubtitleThemeTextSize": "Dimensione del testo", + "@settingsSubtitleThemeTextSize": {}, "settingsSubtitleThemeShowOutline": "Mostra contorno e ombra", + "@settingsSubtitleThemeShowOutline": {}, "settingsSubtitleThemeTextColor": "Colore del testo", + "@settingsSubtitleThemeTextColor": {}, "settingsSubtitleThemeTextOpacity": "Opacità del testo", + "@settingsSubtitleThemeTextOpacity": {}, "settingsSubtitleThemeBackgroundColor": "Colore di sfondo", + "@settingsSubtitleThemeBackgroundColor": {}, "settingsSubtitleThemeBackgroundOpacity": "Opacità dello sfondo", + "@settingsSubtitleThemeBackgroundOpacity": {}, "settingsSubtitleThemeTextAlignmentLeft": "Sinistra", + "@settingsSubtitleThemeTextAlignmentLeft": {}, "settingsSubtitleThemeTextAlignmentCenter": "Centro", + "@settingsSubtitleThemeTextAlignmentCenter": {}, "settingsSubtitleThemeTextAlignmentRight": "Destra", - + "@settingsSubtitleThemeTextAlignmentRight": {}, "settingsVideoControlsTile": "Controlli", + "@settingsVideoControlsTile": {}, "settingsVideoControlsPageTitle": "Controlli", + "@settingsVideoControlsPageTitle": {}, "settingsVideoButtonsTile": "Pulsanti", + "@settingsVideoButtonsTile": {}, "settingsVideoGestureDoubleTapTogglePlay": "Doppio tocco per play/pausa", + "@settingsVideoGestureDoubleTapTogglePlay": {}, "settingsVideoGestureSideDoubleTapSeek": "Doppio tocco sui bordi dello schermo per cercare avanti/indietro", - + "@settingsVideoGestureSideDoubleTapSeek": {}, "settingsPrivacySectionTitle": "Privacy", + "@settingsPrivacySectionTitle": {}, "settingsAllowInstalledAppAccess": "Consentire l’accesso all’inventario delle app", + "@settingsAllowInstalledAppAccess": {}, "settingsAllowInstalledAppAccessSubtitle": "Utilizzato per migliorare la visualizzazione degli album", + "@settingsAllowInstalledAppAccessSubtitle": {}, "settingsAllowErrorReporting": "Consenti segnalazione anonima degli errori", + "@settingsAllowErrorReporting": {}, "settingsSaveSearchHistory": "Salva la cronologia delle ricerche", + "@settingsSaveSearchHistory": {}, "settingsEnableBin": "Usa il cestino", + "@settingsEnableBin": {}, "settingsEnableBinSubtitle": "Conserva gli elementi cancellati per 30 giorni", - + "@settingsEnableBinSubtitle": {}, "settingsHiddenItemsTile": "Elementi nascosti", + "@settingsHiddenItemsTile": {}, "settingsHiddenItemsPageTitle": "Elementi nascosti", - + "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "Filtri nascosti", + "@settingsHiddenItemsTabFilters": {}, "settingsHiddenFiltersBanner": "Le foto e i video che corrispondono ai filtri nascosti non appariranno nella tua collezione", + "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "Nessun filtro nascosto", - + "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "Percorsi nascosti", + "@settingsHiddenItemsTabPaths": {}, "settingsHiddenPathsBanner": "Le foto e i video in queste cartelle, o in qualsiasi loro sottocartella, non appariranno nella tua collezione", + "@settingsHiddenPathsBanner": {}, "addPathTooltip": "Aggiungi percorso", - + "@addPathTooltip": {}, "settingsStorageAccessTile": "Accesso a tutti i file", + "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "Accesso a tutti i file", + "@settingsStorageAccessPageTitle": {}, "settingsStorageAccessBanner": "Alcune cartelle richiedono una concessione di accesso esplicita per modificare i file al loro interno. Puoi rivedere qui le cartelle a cui hai dato accesso in precedenza", + "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "Nessuna autorizzazione concessa", + "@settingsStorageAccessEmpty": {}, "settingsStorageAccessRevokeTooltip": "Rifiuta autorizzazione", - + "@settingsStorageAccessRevokeTooltip": {}, "settingsAccessibilitySectionTitle": "Accessibilità", + "@settingsAccessibilitySectionTitle": {}, "settingsRemoveAnimationsTile": "Rimuovi animazioni", + "@settingsRemoveAnimationsTile": {}, "settingsRemoveAnimationsDialogTitle": "Rimuovi animazioni", + "@settingsRemoveAnimationsDialogTitle": {}, "settingsTimeToTakeActionTile": "Tempo di reazione", - + "@settingsTimeToTakeActionTile": {}, "settingsDisplaySectionTitle": "Schermo", + "@settingsDisplaySectionTitle": {}, "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, "settingsThemeColorHighlights": "Colori evidenziati", + "@settingsThemeColorHighlights": {}, "settingsThemeEnableDynamicColor": "Colori dinamici", + "@settingsThemeEnableDynamicColor": {}, "settingsDisplayRefreshRateModeTile": "Frequenza di aggiornamento dello schermo", + "@settingsDisplayRefreshRateModeTile": {}, "settingsDisplayRefreshRateModeDialogTitle": "Frequenza di aggiornamento", - + "@settingsDisplayRefreshRateModeDialogTitle": {}, "settingsLanguageSectionTitle": "Lingua e formati", + "@settingsLanguageSectionTitle": {}, "settingsLanguageTile": "Lingua", + "@settingsLanguageTile": {}, "settingsLanguagePageTitle": "Lingua", + "@settingsLanguagePageTitle": {}, "settingsCoordinateFormatTile": "Formato coordinate", + "@settingsCoordinateFormatTile": {}, "settingsCoordinateFormatDialogTitle": "Formato coordinate", + "@settingsCoordinateFormatDialogTitle": {}, "settingsUnitSystemTile": "Unità", + "@settingsUnitSystemTile": {}, "settingsUnitSystemDialogTitle": "Unità", - + "@settingsUnitSystemDialogTitle": {}, "settingsScreenSaverPageTitle": "Salvaschermo", - + "@settingsScreenSaverPageTitle": {}, "settingsWidgetPageTitle": "Cornice foto", + "@settingsWidgetPageTitle": {}, "settingsWidgetShowOutline": "Contorno", + "@settingsWidgetShowOutline": {}, "settingsWidgetOpenPage": "Se tocchi il widget", - + "@settingsWidgetOpenPage": {}, "settingsCollectionTile": "Collezione", - + "@settingsCollectionTile": {}, "statsPageTitle": "Statistiche", + "@statsPageTitle": {}, "statsWithGps": "{count, plural, =1{1 elemento con posizione} other{{count} elementi con posizione}}", + "@statsWithGps": {}, "statsTopCountriesSectionTitle": "Paesi più frequenti", + "@statsTopCountriesSectionTitle": {}, "statsTopPlacesSectionTitle": "Luoghi più frequenti", + "@statsTopPlacesSectionTitle": {}, "statsTopTagsSectionTitle": "Etichette più frequenti", + "@statsTopTagsSectionTitle": {}, "statsTopAlbumsSectionTitle": "Album più frequenti", - + "@statsTopAlbumsSectionTitle": {}, "viewerOpenPanoramaButtonLabel": "APRI PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, "viewerSetWallpaperButtonLabel": "IMPOSTA SFONDO", + "@viewerSetWallpaperButtonLabel": {}, "viewerErrorUnknown": "Ops!", + "@viewerErrorUnknown": {}, "viewerErrorDoesNotExist": "Il file non esiste più", - + "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "Info", + "@viewerInfoPageTitle": {}, "viewerInfoBackToViewerTooltip": "Torna alla visualizzazione", - + "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "sconosciuto", + "@viewerInfoUnknown": {}, "viewerInfoLabelDescription": "Descrizione", + "@viewerInfoLabelDescription": {}, "viewerInfoLabelTitle": "Titolo", + "@viewerInfoLabelTitle": {}, "viewerInfoLabelDate": "Data", + "@viewerInfoLabelDate": {}, "viewerInfoLabelResolution": "Risoluzione", + "@viewerInfoLabelResolution": {}, "viewerInfoLabelSize": "Dimensione", + "@viewerInfoLabelSize": {}, "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, "viewerInfoLabelPath": "Percorso", + "@viewerInfoLabelPath": {}, "viewerInfoLabelDuration": "Durata", + "@viewerInfoLabelDuration": {}, "viewerInfoLabelOwner": "Di proprietà di", + "@viewerInfoLabelOwner": {}, "viewerInfoLabelCoordinates": "Coordinate", + "@viewerInfoLabelCoordinates": {}, "viewerInfoLabelAddress": "Indirizzo", - + "@viewerInfoLabelAddress": {}, "mapStyleDialogTitle": "Stile Mappa", + "@mapStyleDialogTitle": {}, "mapStyleTooltip": "Seleziona lo stile della mappa", + "@mapStyleTooltip": {}, "mapZoomInTooltip": "Ingrandisci", + "@mapZoomInTooltip": {}, "mapZoomOutTooltip": "Riduci", + "@mapZoomOutTooltip": {}, "mapPointNorthUpTooltip": "Punta a nord verso l’alto", + "@mapPointNorthUpTooltip": {}, "mapAttributionOsmHot": "Dati della mappa © collaboratori di [OpenStreetMap](https://www.openstreetmap.org/copyright) - Titoli di [HOT](https://www.hotosm.org/) - Ospitato da [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, "mapAttributionStamen": "Dati della mappa © collaboratori di [OpenStreetMap](https://www.openstreetmap.org/copyright) - Titoli di [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, "openMapPageTooltip": "Visualizza sulla pagina della mappa", + "@openMapPageTooltip": {}, "mapEmptyRegion": "Nessuna immagine in questa regione", - + "@mapEmptyRegion": {}, "viewerInfoOpenEmbeddedFailureFeedback": "Fallita l’estrazione dei dati incorporati", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, "viewerInfoOpenLinkText": "Apri", + "@viewerInfoOpenLinkText": {}, "viewerInfoViewXmlLinkText": "Visualizza XML", - + "@viewerInfoViewXmlLinkText": {}, "viewerInfoSearchFieldLabel": "Metadati di ricerca", + "@viewerInfoSearchFieldLabel": {}, "viewerInfoSearchEmpty": "Nessuna chiave corrispondente", + "@viewerInfoSearchEmpty": {}, "viewerInfoSearchSuggestionDate": "Data e ora", + "@viewerInfoSearchSuggestionDate": {}, "viewerInfoSearchSuggestionDescription": "Descrizione", + "@viewerInfoSearchSuggestionDescription": {}, "viewerInfoSearchSuggestionDimensions": "Dimensioni", + "@viewerInfoSearchSuggestionDimensions": {}, "viewerInfoSearchSuggestionResolution": "Risoluzione", + "@viewerInfoSearchSuggestionResolution": {}, "viewerInfoSearchSuggestionRights": "Diritti", - + "@viewerInfoSearchSuggestionRights": {}, "wallpaperUseScrollEffect": "Usa effetto di scorrimento nella schermata iniziale", - + "@wallpaperUseScrollEffect": {}, "tagEditorPageTitle": "Modifica etichette", + "@tagEditorPageTitle": {}, "tagEditorPageNewTagFieldLabel": "Nuova etichetta", + "@tagEditorPageNewTagFieldLabel": {}, "tagEditorPageAddTagTooltip": "Aggiungi etichetta", + "@tagEditorPageAddTagTooltip": {}, "tagEditorSectionRecent": "Aggiunti di recente", - + "@tagEditorSectionRecent": {}, "panoramaEnableSensorControl": "Abilita il controllo del sensore", + "@panoramaEnableSensorControl": {}, "panoramaDisableSensorControl": "Disabilita il controllo del sensore", - + "@panoramaDisableSensorControl": {}, "sourceViewerPageTitle": "Codice sorgente", - + "@sourceViewerPageTitle": {}, "filePickerShowHiddenFiles": "Mostra i file nascosti", + "@filePickerShowHiddenFiles": {}, "filePickerDoNotShowHiddenFiles": "Non mostrare i file nascosti", + "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "Apri da", + "@filePickerOpenFrom": {}, "filePickerNoItems": "Nessun elemento", - "filePickerUseThisFolder": "Usa questa cartella" + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "Usa questa cartella", + "@filePickerUseThisFolder": {} } diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 4c75b8a50..eb874252b 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -1,660 +1,1086 @@ -{ - "appName": "Aves", - "welcomeMessage": "Avesへようこそ", - "welcomeOptional": "オプション", - "welcomeTermsToggle": "利用規約に同意する", - "itemCount": "{count, plural, other{{count} 件のアイテム}}", - - "timeSeconds": "{seconds, plural, other{{seconds} 秒}}", - "timeMinutes": "{minutes, plural, other{{minutes} 分}}", - "timeDays": "{days, plural, other{{days} 日}}", - "focalLength": "{length} mm", - - "applyButtonLabel": "適用", - "deleteButtonLabel": "削除", - "nextButtonLabel": "次へ", - "showButtonLabel": "表示", - "hideButtonLabel": "非表示", - "continueButtonLabel": "続ける", - - "cancelTooltip": "キャンセル", - "changeTooltip": "変更", - "clearTooltip": "クリア", - "previousTooltip": "前へ", - "nextTooltip": "次へ", - "showTooltip": "表示する", - "hideTooltip": "非表示にする", - "actionRemove": "削除", - "resetTooltip": "リセット", - "saveTooltip": "保存", - "pickTooltip": "ピック", - - "doubleBackExitMessage": "終了するには「戻る」をもう一度タップしてください。", - "doNotAskAgain": "今後このメッセージを表示しない", - - "sourceStateLoading": "読み込み中", - "sourceStateCataloguing": "分類中", - "sourceStateLocatingCountries": "国、地域を確認中", - "sourceStateLocatingPlaces": "場所を確認中", - - "chipActionDelete": "削除", - "chipActionGoToAlbumPage": "アルバム別に表示", - "chipActionGoToCountryPage": "国地域別に表示", - "chipActionGoToTagPage": "タグ別に表示", - "chipActionHide": "非表示", - "chipActionPin": "一番上に固定", - "chipActionUnpin": "一番上への固定を解除", - "chipActionRename": "名前を変更", - "chipActionSetCover": "カバーを設定", - "chipActionCreateAlbum": "アルバムを作成", - - "entryActionCopyToClipboard": "クリップボードにコピー", - "entryActionDelete": "削除", - "entryActionConvert": "変換", - "entryActionExport": "エクスポート", - "entryActionInfo": "情報", - "entryActionRename": "名前を変更", - "entryActionRestore": "元に戻す", - "entryActionRotateCCW": "反時計回りに回転", - "entryActionRotateCW": "時計回りに回転", - "entryActionFlip": "水平方向に反転", - "entryActionPrint": "印刷", - "entryActionShare": "共有", - "entryActionViewSource": "ソースを表示", - "entryActionShowGeoTiffOnMap": "地図のオーバーレイとして表示", - "entryActionConvertMotionPhotoToStillImage": "静止画に変換", - "entryActionViewMotionPhotoVideo": "動画を開く", - "entryActionEdit": "編集", - "entryActionOpen": "アプリで開く", - "entryActionSetAs": "登録", - "entryActionOpenMap": "地図アプリで表示", - "entryActionRotateScreen": "画面を回転", - "entryActionAddFavourite": "お気に入りに追加", - "entryActionRemoveFavourite": "お気に入りから削除", - - "videoActionCaptureFrame": "フレームをキャプチャ", - "videoActionMute": "ミュート", - "videoActionUnmute": "ミュート解除", - "videoActionPause": "一時停止", - "videoActionPlay": "再生", - "videoActionReplay10": "10 秒前に戻る", - "videoActionSkip10": "10 秒前に進む", - "videoActionSelectStreams": "トラックを選択", - "videoActionSetSpeed": "再生速度", - "videoActionSettings": "設定", - - "slideshowActionResume": "再開", - "slideshowActionShowInCollection": "コレクションで表示", - - "entryInfoActionEditDate": "日時を編集", - "entryInfoActionEditLocation": "位置情報を編集", - "entryInfoActionEditRating": "評価を編集", - "entryInfoActionEditTags": "タグを編集", - "entryInfoActionRemoveMetadata": "メタデータを削除", - - "filterBinLabel": "ごみ箱", - "filterFavouriteLabel": "お気に入り", - "filterNoLocationLabel": "位置情報なし", - "filterNoRatingLabel": "評価情報なし", - "filterNoTagLabel": "タグ情報なし", - "filterOnThisDayLabel": "過去のこの日", - "filterRatingRejectedLabel": "拒否", - "filterTypeAnimatedLabel": "アニメーション", - "filterTypeMotionPhotoLabel": "モーションフォト", - "filterTypePanoramaLabel": "パノラマ", - "filterTypeRawLabel": "Raw", - "filterTypeSphericalVideoLabel": "360° 動画", - "filterTypeGeotiffLabel": "GeoTIFF", - "filterMimeImageLabel": "画像", - "filterMimeVideoLabel": "動画", - - "coordinateFormatDms": "度分秒", - "coordinateFormatDecimal": "十進角", - "coordinateDms": "{direction}{coordinate}", - "coordinateDmsNorth": "北緯", - "coordinateDmsSouth": "南緯", - "coordinateDmsEast": "東経", - "coordinateDmsWest": "西経", - - "unitSystemMetric": "メートル法", - "unitSystemImperial": "ヤード・ポンド法", - - "videoLoopModeNever": "ループ再生しない", - "videoLoopModeShortOnly": "短い動画のみ", - "videoLoopModeAlways": "常にループ再生", - - "videoControlsPlay": "再生", - "videoControlsPlaySeek": "再生&早送り/早戻し", - "videoControlsPlayOutside": "他のプレイヤーで開く", - "videoControlsNone": "なし", - - "mapStyleGoogleNormal": "Google マップ", - "mapStyleGoogleHybrid": "Google マップ(ハイブリッド)", - "mapStyleGoogleTerrain": "Google マップ(地形)", - "mapStyleHuaweiNormal": "Petal マップ", - "mapStyleHuaweiTerrain": "Petal マップ(地形)", - "mapStyleOsmHot": "Humanitarian OSM", - "mapStyleStamenToner": "Stamen Toner", - "mapStyleStamenWatercolor": "Stamen Watercolor", - - "nameConflictStrategyRename": "名前を変更", - "nameConflictStrategyReplace": "置換", - "nameConflictStrategySkip": "スキップ", - - "keepScreenOnNever": "自動オフ", - "keepScreenOnViewerOnly": "ビューアー表示中のみ", - "keepScreenOnAlways": "常にオン", - - "accessibilityAnimationsRemove": "画面効果を表示しない", - "accessibilityAnimationsKeep": "画面効果を表示", - - "displayRefreshRatePreferHighest": "高レート", - "displayRefreshRatePreferLowest": "低レート", - - "videoPlaybackSkip": "スキップ", - "videoPlaybackMuted": "ミュート再生", - "videoPlaybackWithSound": "音声あり再生", - - "themeBrightnessLight": "ライト", - "themeBrightnessDark": "ダーク", - "themeBrightnessBlack": "ブラック", - - "viewerTransitionSlide": "スライド", - "viewerTransitionParallax": "パララックス", - "viewerTransitionFade": "フェード", - "viewerTransitionZoomIn": "ズームイン", - - "wallpaperTargetHome": "ホーム画面", - "wallpaperTargetLock": "ロック画面", - "wallpaperTargetHomeLock": "ホームおよびロック画面", - - "albumTierNew": "新規", - "albumTierPinned": "固定", - "albumTierSpecial": "全体", - "albumTierApps": "アプリ", - "albumTierRegular": "その他", - - "storageVolumeDescriptionFallbackPrimary": "内蔵ストレージ", - "storageVolumeDescriptionFallbackNonPrimary": "SD カード", - "rootDirectoryDescription": "ルート ディレクトリ", - "otherDirectoryDescription": "“{name}” ディレクトリ", - "storageAccessDialogMessage": "このアプリにアクセスを許可するために次の画面で {directory} の “{volume}” を選択してください。", - "restrictedAccessDialogMessage": "このアプリは {directory} の “{volume}” にあるファイルを変更できません。\n\nプリインストールされているファイル マネージャまたはギャラリー アプリを使用して他のディレクトリに移動してください。", - "notEnoughSpaceDialogMessage": "この操作には “{volume}” に {neededSize} の容量が必要ですが、 残り {freeSize} のみ利用可能です。", - "missingSystemFilePickerDialogMessage": "システム ファイル ピッカーが見つからないか、利用できません。利用可能にしてから再度お試しください。", - - "unsupportedTypeDialogMessage": "{count, plural, other{この操作は次のタイプのアイテムには対応していません: {types}.}}", - - "nameConflictDialogSingleSourceMessage": "目的フォルダに同じ名前のファイルが存在しています。", - "nameConflictDialogMultipleSourceMessage": "同じ名前のファイルが存在しています。", - - "addShortcutDialogLabel": "ショートカット ラベル", - "addShortcutButtonLabel": "追加", - - "noMatchingAppDialogMessage": "処理できるアプリが見つかりません。", - - "binEntriesConfirmationDialogMessage": "{count, plural, =1{このアイテムをごみ箱に移動しますか?} other{{count} 件のアイテムをごみ箱に移動しますか?}}", - "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{このアイテムを削除しますか?} other{{count} 件のアイテムを削除しますか?}}", - "moveUndatedConfirmationDialogMessage": "いくつかのアイテムはメタデータ上に日付がありません。メタデータ上の日付が設定されない場合、この操作によりこれらの現在の日付はリセットされます", - "moveUndatedConfirmationDialogSetDate": "日付を設定", - - "videoResumeDialogMessage": " {time} の時点から再生を再開しますか?", - "videoStartOverButtonLabel": "最初から再生", - "videoResumeButtonLabel": "再開", - - "setCoverDialogLatest": "最新のアイテム", - "setCoverDialogAuto": "自動", - "setCoverDialogCustom": "カスタム", - - "hideFilterConfirmationDialogMessage": "一致する写真と動画はコレクションに表示されなくなります。「プライバシー」設定からいつでもアイテムを表示できます。\n\nこれらのアイテムを非表示にしますか?", - - "newAlbumDialogTitle": "新規アルバム", - "newAlbumDialogNameLabel": "アルバム名", - "newAlbumDialogNameLabelAlreadyExistsHelper": "ディレクトリが既に存在します", - "newAlbumDialogStorageLabel": "ストレージ:", - - "renameAlbumDialogLabel": "新しい名前", - "renameAlbumDialogLabelAlreadyExistsHelper": "ディレクトリが既に存在します", - - "renameEntrySetPageTitle": "名前を変更", - "renameEntrySetPagePatternFieldLabel": "名前付けのパターン", - "renameEntrySetPageInsertTooltip": "フィールドを挿入", - "renameEntrySetPagePreviewSectionTitle": "プレビュー", - - "renameProcessorCounter": "連番", - "renameProcessorName": "名前", - - "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{このアルバムとアルバム内のアイテムを削除しますか?} other{このアルバムとアルバム内の {count} 件のアイテムを削除しますか?}}", - "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{これらのアルバムとアルバム内のアイテムを削除しますか?} other{これらのアルバムとアルバム内の {count} 件のアイテムを削除しますか?}}", - - "exportEntryDialogFormat": "形式:", - "exportEntryDialogWidth": "幅", - "exportEntryDialogHeight": "高さ", - - "renameEntryDialogLabel": "新しい名前", - - "editEntryDialogTargetFieldsHeader": "更新するフィールド", - - "editEntryDateDialogTitle": "日時", - "editEntryDateDialogSetCustom": "日を設定する", - "editEntryDateDialogCopyField": "他の日からコピーする", - "editEntryDateDialogCopyItem": "他のアイテムからコピーする", - "editEntryDateDialogExtractFromTitle": "タイトルから抽出する", - "editEntryDateDialogShift": "シフト", - "editEntryDateDialogSourceFileModifiedDate": "ファイル更新日", - - "durationDialogHours": "時", - "durationDialogMinutes": "分", - - "editEntryLocationDialogTitle": "位置情報", - "editEntryLocationDialogChooseOnMapTooltip": "地図上で選択", - "editEntryLocationDialogLatitude": "緯度", - "editEntryLocationDialogLongitude": "経度", - - "locationPickerUseThisLocationButton": "この位置情報を使用", - - "editEntryRatingDialogTitle": "評価", - - "removeEntryMetadataDialogTitle": "メタデータの削除", - "removeEntryMetadataDialogMore": "もっと見る", - - "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "モーションフォト内の動画を再生するには XMP が必要です。\n\n削除しますか?", - "convertMotionPhotoToStillImageWarningDialogMessage": "適用しますか?", - - "videoSpeedDialogLabel": "再生速度", - - "videoStreamSelectionDialogVideo": "動画", - "videoStreamSelectionDialogAudio": "音声", - "videoStreamSelectionDialogText": "字幕", - "videoStreamSelectionDialogOff": "オフ", - "videoStreamSelectionDialogTrack": "トラック", - "videoStreamSelectionDialogNoSelection": "他にトラックはありません。", - - "genericSuccessFeedback": "完了しました!", - "genericFailureFeedback": "エラー", - - "menuActionConfigureView": "表示", - "menuActionSelect": "選択", - "menuActionSelectAll": "すべて選択", - "menuActionSelectNone": "選択を解除", - "menuActionMap": "地図", - "menuActionSlideshow": "スライドショー", - "menuActionStats": "統計", - - "viewDialogSortSectionTitle": "並べ替え", - "viewDialogGroupSectionTitle": "グループ", - "viewDialogLayoutSectionTitle": "レイアウト", - - "tileLayoutGrid": "グリッド表示", - "tileLayoutList": "リスト表示", - - "coverDialogTabCover": "カバー", - "coverDialogTabApp": "アプリ", - "coverDialogTabColor": "カラー", - - "appPickDialogTitle": "アプリを選ぶ", - "appPickDialogNone": "なし", - - "aboutPageTitle": "アプリについて", - "aboutLinkLicense": "ライセンス", - "aboutLinkPolicy": "プライバシー ポリシー", - - "aboutBugSectionTitle": "バグの報告", - "aboutBugSaveLogInstruction": "アプリのログをファイルに保存", - "aboutBugCopyInfoInstruction": "システム情報をコピー", - "aboutBugCopyInfoButton": "コピー", - "aboutBugReportInstruction": "ログとシステム情報とともに GitHub で報告", - "aboutBugReportButton": "報告", - - "aboutCreditsSectionTitle": "クレジット", - "aboutCreditsWorldAtlas1": "このアプリは TopoJSON ファイルを", - "aboutCreditsWorldAtlas2": "ISC License の下使用しています。", - "aboutTranslatorsSectionTitle": "翻訳", - - "aboutLicensesSectionTitle": "オープンソース ライセンス", - "aboutLicensesBanner": "このアプリは下記のオープンソース パッケージおよびライブラリを使用しています。", - "aboutLicensesAndroidLibrariesSectionTitle": "Android ライブラリ", - "aboutLicensesFlutterPluginsSectionTitle": "Flutter プラグイン", - "aboutLicensesFlutterPackagesSectionTitle": "Flutter パッケージ", - "aboutLicensesDartPackagesSectionTitle": "Dart パッケージ", - "aboutLicensesShowAllButtonLabel": "すべてのライセンスを表示", - - "policyPageTitle": "プライバシー ポリシー", - - "collectionPageTitle": "コレクション", - "collectionPickPageTitle": "ピック", - "collectionSelectPageTitle": "アイテムを選択", - - "collectionActionShowTitleSearch": "タイトル名フィルターを表示", - "collectionActionHideTitleSearch": "タイトル名フィルターを非表示", - "collectionActionAddShortcut": "ショートカットを追加", - "collectionActionEmptyBin": "ごみ箱を空にする", - "collectionActionCopy": "アルバムにコピー", - "collectionActionMove": "アルバムに移動", - "collectionActionRescan": "再スキャン", - "collectionActionEdit": "編集", - - "collectionSearchTitlesHintText": "タイトルを検索", - - "collectionGroupAlbum": "アルバム別", - "collectionGroupMonth": "月別", - "collectionGroupDay": "日別", - "collectionGroupNone": "グループ化しない", - - "sectionUnknown": "不明", - "dateToday": "今日", - "dateYesterday": "昨日", - "dateThisMonth": "今月", - "collectionDeleteFailureFeedback": "{count, plural, other{{count} 件のアイテムを削除できませんでした}}", - "collectionCopyFailureFeedback": "{count, plural, other{{count} 件のアイテムをコピーできませんでした}}", - "collectionMoveFailureFeedback": "{count, plural, other{{count} 件のアイテムを移動できませんでした}}", - "collectionRenameFailureFeedback": "{count, plural, other{{count} 件のアイテム名を変更できませんでした}}", - "collectionEditFailureFeedback": "{count, plural, other{{count} 件のアイテムを編集できませんでした}}", - "collectionExportFailureFeedback": "{count, plural, other{{count} ページをエクスポートできませんでした}}", - "collectionCopySuccessFeedback": "{count, plural, other{{count} 件のアイテムをコピーしました}}", - "collectionMoveSuccessFeedback": "{count, plural, other{{count} 件のアイテムを移動しました}}", - "collectionRenameSuccessFeedback": "{count, plural, other{{count} 件のアイテム名を変更しました}}", - "collectionEditSuccessFeedback": "{count, plural, other{{count} 件のアイテムを編集しました}}", - - "collectionEmptyFavourites": "お気に入りはありません", - "collectionEmptyVideos": "動画はありません", - "collectionEmptyImages": "画像はありません", - "collectionEmptyGrantAccessButtonLabel": "アクセスを許可", - - "collectionSelectSectionTooltip": "セクションを選択", - "collectionDeselectSectionTooltip": "セクションの選択を解除", - - "drawerAboutButton": "アプリについて", - "drawerSettingsButton": "設定", - "drawerCollectionAll": "すべてのコレクション", - "drawerCollectionFavourites": "お気に入り", - "drawerCollectionImages": "画像", - "drawerCollectionVideos": "動画", - "drawerCollectionAnimated": "アニメーション", - "drawerCollectionMotionPhotos": "モーションフォト", - "drawerCollectionPanoramas": "パノラマ", - "drawerCollectionRaws": "Raw 写真", - "drawerCollectionSphericalVideos": "360° 動画", - "drawerAlbumPage": "アルバム", - "drawerCountryPage": "国", - "drawerTagPage": "タグ", - - "sortByDate": "日付", - "sortByName": "名前", - "sortByItemCount": "アイテム件数", - "sortBySize": "サイズ", - "sortByAlbumFileName": "アルバムとファイル名", - "sortByRating": "評価", - - "albumGroupTier": "階層別", - "albumGroupVolume": "ストレージ ボリューム別", - "albumGroupNone": "グループ化しない", - - "albumPickPageTitleCopy": "アルバムにコピー", - "albumPickPageTitleExport": "アルバムにエクスポート", - "albumPickPageTitleMove": "アルバムに移動", - "albumPickPageTitlePick": "アルバムを選択", - - "albumCamera": "カメラ", - "albumDownload": "ダウンロード", - "albumScreenshots": "スクリーンショット", - "albumScreenRecordings": "画面録画", - "albumVideoCaptures": "動画キャプチャ", - - "albumPageTitle": "アルバム", - "albumEmpty": "アルバムはありません", - "createAlbumTooltip": "アルバムを作成", - "createAlbumButtonLabel": "作成", - "newFilterBanner": "新規", - - "countryPageTitle": "国", - "countryEmpty": "国はありません", - - "tagPageTitle": "タグ", - "tagEmpty": "タグはありません", - - "binPageTitle": "ごみ箱", - - "searchCollectionFieldHint": "コレクションを検索", - "searchRecentSectionTitle": "最近", - "searchDateSectionTitle": "日付", - "searchAlbumsSectionTitle": "アルバム", - "searchCountriesSectionTitle": "国", - "searchPlacesSectionTitle": "場所", - "searchTagsSectionTitle": "タグ", - "searchRatingSectionTitle": "評価", - - "settingsPageTitle": "設定", - "settingsSystemDefault": "システム", - "settingsDefault": "デフォルト", - - "settingsSearchFieldLabel": "検索設定", - "settingsSearchEmpty": "一致する設定なし", - "settingsActionExport": "エクスポート", - "settingsActionExportDialogTitle": "エクスポート", - "settingsActionImport": "インポート", - "settingsActionImportDialogTitle": "インポート", - - "appExportCovers": "カバー", - "appExportFavourites": "お気に入り", - "appExportSettings": "設定", - - "settingsNavigationSectionTitle": "ナビゲーション", - "settingsHomeTile": "ホーム", - "settingsHomeDialogTitle": "ホーム", - "settingsShowBottomNavigationBar": "下部のナビゲーションバーを表示", - "settingsKeepScreenOnTile": "画面をオンのままにする", - "settingsKeepScreenOnDialogTitle": "画面をオンのままにする", - "settingsDoubleBackExit": "「戻る」を2回タップして終了", - - "settingsConfirmationTile": "確認メッセージ", - "settingsConfirmationDialogTitle": "確認メッセージ", - "settingsConfirmationBeforeDeleteItems": "アイテムを完全に削除する前に確認", - "settingsConfirmationBeforeMoveToBinItems": "アイテムをごみ箱に移動する前に確認", - "settingsConfirmationBeforeMoveUndatedItems": "メタデータ上に日付のないアイテムを移動する前に確認", - - "settingsNavigationDrawerTile": "ナビゲーション メニュー", - "settingsNavigationDrawerEditorPageTitle": "ナビゲーション メニュー", - "settingsNavigationDrawerBanner": "メニュー項目を長押しして、移動および並べ替え", - "settingsNavigationDrawerTabTypes": "タイプ", - "settingsNavigationDrawerTabAlbums": "アルバム", - "settingsNavigationDrawerTabPages": "ページ", - "settingsNavigationDrawerAddAlbum": "アルバムを追加", - - "settingsThumbnailSectionTitle": "サムネイル", - "settingsThumbnailOverlayTile": "オーバーレイ", - "settingsThumbnailOverlayPageTitle": "オーバーレイ", - "settingsThumbnailShowFavouriteIcon": "お気に入りアイコンを表示", - "settingsThumbnailShowTagIcon": "タグアイコンを表示", - "settingsThumbnailShowLocationIcon": "位置情報アイコンを表示", - "settingsThumbnailShowMotionPhotoIcon": "モーションフォトアイコンを表示", - "settingsThumbnailShowRating": "評価情報を表示", - "settingsThumbnailShowRawIcon": "Raw アイコンを表示", - "settingsThumbnailShowVideoDuration": "動画の再生時間を表示", - - "settingsCollectionQuickActionsTile": "クイック アクション", - "settingsCollectionQuickActionEditorPageTitle": "クイック アクション", - "settingsCollectionQuickActionTabBrowsing": "ブラウズ中", - "settingsCollectionQuickActionTabSelecting": "選択中", - "settingsCollectionBrowsingQuickActionEditorBanner": "長押ししてボタンを移動しアイテムを閲覧中に表示されるアクションを選択します。", - "settingsCollectionSelectionQuickActionEditorBanner": "長押ししてボタンを移動しアイテムを選択中に表示されるアクションを選択します。", - - "settingsViewerSectionTitle": "ビューアー", - "settingsViewerUseCutout": "切り取り領域を使用", - "settingsViewerMaximumBrightness": "明るさ最大", - "settingsMotionPhotoAutoPlay": "モーションフォトを自動再生", - "settingsImageBackground": "画像の背景", - - "settingsViewerQuickActionsTile": "クイックアクション", - "settingsViewerQuickActionEditorPageTitle": "クイックアクション", - "settingsViewerQuickActionEditorBanner": "長押ししてボタンを移動しビューアーで表示されるアクションを選択します。", - "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "表示ボタン", - "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "利用可能なボタン", - "settingsViewerQuickActionEmpty": "ボタンなし", - - "settingsViewerOverlayTile": "オーバーレイ", - "settingsViewerOverlayPageTitle": "オーバーレイ", - "settingsViewerShowOverlayOnOpening": "起動時に表示", - "settingsViewerShowMinimap": "小さな地図を表示", - "settingsViewerShowInformation": "情報を表示", - "settingsViewerShowInformationSubtitle": "タイトル、日付、位置情報、その他を表示", - "settingsViewerShowShootingDetails": "撮影詳細を表示", - "settingsViewerShowOverlayThumbnails": "サムネイルを表示", - "settingsViewerEnableOverlayBlurEffect": "ぼかし効果", - - "settingsViewerSlideshowTile": "スライドショー", - "settingsViewerSlideshowPageTitle": "スライドショー", - "settingsSlideshowRepeat": "繰り返し", - "settingsSlideshowShuffle": "シャッフル", - "settingsSlideshowFillScreen": "画面いっぱいに表示", - "settingsSlideshowTransitionTile": "トランジション", - "settingsSlideshowIntervalTile": "間隔", - "settingsSlideshowVideoPlaybackTile": "動画を再生", - "settingsSlideshowVideoPlaybackDialogTitle": "動画再生", - - "settingsVideoPageTitle": "動画設定", - "settingsVideoSectionTitle": "動画", - "settingsVideoShowVideos": "動画を表示", - "settingsVideoEnableHardwareAcceleration": "ハードウェア アクセラレーション", - "settingsVideoAutoPlay": "自動再生", - "settingsVideoLoopModeTile": "ループ モード", - "settingsVideoLoopModeDialogTitle": "ループ モード", - - "settingsSubtitleThemeTile": "字幕", - "settingsSubtitleThemePageTitle": "字幕", - "settingsSubtitleThemeSample": "これはサンプルです。", - "settingsSubtitleThemeTextAlignmentTile": "テキストの配置", - "settingsSubtitleThemeTextAlignmentDialogTitle": "テキストの配置", - "settingsSubtitleThemeTextSize": "テキストのサイズ", - "settingsSubtitleThemeShowOutline": "アウトラインと影を表示", - "settingsSubtitleThemeTextColor": "テキストの色", - "settingsSubtitleThemeTextOpacity": "テキストの不透明度", - "settingsSubtitleThemeBackgroundColor": "背景色", - "settingsSubtitleThemeBackgroundOpacity": "背景の不透明度", - "settingsSubtitleThemeTextAlignmentLeft": "左揃え", - "settingsSubtitleThemeTextAlignmentCenter": "中央揃え", - "settingsSubtitleThemeTextAlignmentRight": "右揃え", - - "settingsVideoControlsTile": "操作", - "settingsVideoControlsPageTitle": "操作", - "settingsVideoButtonsTile": "ボタン", - "settingsVideoGestureDoubleTapTogglePlay": "2回タップして再生/一時停止", - "settingsVideoGestureSideDoubleTapSeek": "画面の角を2回タップして早送り/早戻し", - - "settingsPrivacySectionTitle": "プライバシー", - "settingsAllowInstalledAppAccess": "アプリのインベントリへのアクセスを許可する", - "settingsAllowInstalledAppAccessSubtitle": "アルバム表示の改善に使用されます", - "settingsAllowErrorReporting": "匿名でのエラー報告を許可する", - "settingsSaveSearchHistory": "検索履歴を保存", - "settingsEnableBin": "ごみ箱を使用", - "settingsEnableBinSubtitle": "削除したアイテムを30日間保持します", - - "settingsHiddenItemsTile": "非表示アイテム", - "settingsHiddenItemsPageTitle": "非表示アイテム", - - "settingsHiddenItemsTabFilters": "非表示フィルター", - "settingsHiddenFiltersBanner": "非表示のフィルターに一致する写真と動画は、コレクションに表示されません。", - "settingsHiddenFiltersEmpty": "非表示フィルターがありません", - - "settingsHiddenItemsTabPaths": "非表示パス", - "settingsHiddenPathsBanner": "これらのフォルダまたはそのサブフォルダにある写真と動画は、コレクションに表示されません。", - "addPathTooltip": "パスを追加", - - "settingsStorageAccessTile": "ストレージへのアクセス", - "settingsStorageAccessPageTitle": "ストレージへのアクセス", - "settingsStorageAccessBanner": "ディレクトリによっては、ファイルの編集のためにアクセス許可が必要です。ここには、これまでにアクセスを許可したディレクトリが表示されます。", - "settingsStorageAccessEmpty": "許可したアクセスはありません", - "settingsStorageAccessRevokeTooltip": "許可を取り消し", - - "settingsAccessibilitySectionTitle": "アクセシビリティ", - "settingsRemoveAnimationsTile": "アニメーションの削除", - "settingsRemoveAnimationsDialogTitle": "アニメーションの削除", - "settingsTimeToTakeActionTile": "操作までの時間", - - "settingsDisplaySectionTitle": "ディスプレイ", - "settingsThemeBrightnessTile": "テーマ", - "settingsThemeBrightnessDialogTitle": "テーマ", - "settingsThemeColorHighlights": "カラー強調表示", - "settingsThemeEnableDynamicColor": "ダイナミックカラー", - "settingsDisplayRefreshRateModeTile": "ディスプレイ リフレッシュ レート", - "settingsDisplayRefreshRateModeDialogTitle": "リフレッシュ レート", - - "settingsLanguageSectionTitle": "言語と形式", - "settingsLanguageTile": "言語", - "settingsLanguagePageTitle": "言語", - "settingsCoordinateFormatTile": "座標形式", - "settingsCoordinateFormatDialogTitle": "座標形式", - "settingsUnitSystemTile": "単位", - "settingsUnitSystemDialogTitle": "単位", - - "settingsScreenSaverPageTitle": "スクリーンセーバー", - - "settingsWidgetPageTitle": "フォトフレーム", - "settingsWidgetShowOutline": "枠", - - "settingsCollectionTile": "コレクション", - - "statsPageTitle": "統計", - "statsWithGps": "{count, plural, other{位置情報のあるアイテム {count} 件}}", - "statsTopCountriesSectionTitle": "上位の国", - "statsTopPlacesSectionTitle": "上位の場所", - "statsTopTagsSectionTitle": "上位のタグ", - - "viewerOpenPanoramaButtonLabel": "パノラマを開く", - "viewerSetWallpaperButtonLabel": "壁紙設定", - "viewerErrorUnknown": "エラー", - "viewerErrorDoesNotExist": "ファイルが存在しません。", - - "viewerInfoPageTitle": "情報", - "viewerInfoBackToViewerTooltip": "ビューアーに戻る", - - "viewerInfoUnknown": "不明", - "viewerInfoLabelTitle": "タイトル", - "viewerInfoLabelDate": "日付", - "viewerInfoLabelResolution": "解像度", - "viewerInfoLabelSize": "サイズ", - "viewerInfoLabelUri": "URI", - "viewerInfoLabelPath": "パス", - "viewerInfoLabelDuration": "再生時間", - "viewerInfoLabelOwner": "所有者", - "viewerInfoLabelCoordinates": "座標", - "viewerInfoLabelAddress": "アドレス", - - "mapStyleDialogTitle": "地図のスタイル", - "mapStyleTooltip": "地図のスタイルを選択", - "mapZoomInTooltip": "ズームイン", - "mapZoomOutTooltip": "ズームアウト", - "mapPointNorthUpTooltip": "北が上になるように表示", - "mapAttributionOsmHot": "地図データ © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors • Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)", - "mapAttributionStamen": "地図データ © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors • Tiles by [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", - "openMapPageTooltip": "地図ページで表示", - "mapEmptyRegion": "この地域の画像はありません", - - "viewerInfoOpenEmbeddedFailureFeedback": "埋め込みデータを抽出できませんでした", - "viewerInfoOpenLinkText": "開く", - "viewerInfoViewXmlLinkText": "XML を表示", - - "viewerInfoSearchFieldLabel": "メタデータを検索", - "viewerInfoSearchEmpty": "一致するキーはありません", - "viewerInfoSearchSuggestionDate": "日時", - "viewerInfoSearchSuggestionDescription": "説明", - "viewerInfoSearchSuggestionDimensions": "寸法", - "viewerInfoSearchSuggestionResolution": "解像度", - "viewerInfoSearchSuggestionRights": "権限", - - "tagEditorPageTitle": "タグの編集", - "tagEditorPageNewTagFieldLabel": "新しいタグ", - "tagEditorPageAddTagTooltip": "タグを追加", - "tagEditorSectionRecent": "最近", - - "panoramaEnableSensorControl": "センサー制御を有効にする", - "panoramaDisableSensorControl": "センサー制御を無効にする", - - "sourceViewerPageTitle": "ソース", - - "filePickerShowHiddenFiles": "非表示のファイルを表示する", - "filePickerDoNotShowHiddenFiles": "非表示のファイルを表示しない", - "filePickerOpenFrom": "次から開く", - "filePickerNoItems": "アイテムはありません", - "filePickerUseThisFolder": "このフォルダを使用" -} +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Avesへようこそ", + "@welcomeMessage": {}, + "welcomeOptional": "オプション", + "@welcomeOptional": {}, + "welcomeTermsToggle": "利用規約に同意する", + "@welcomeTermsToggle": {}, + "itemCount": "{count, plural, other{{count} 件のアイテム}}", + "@itemCount": {}, + "timeSeconds": "{seconds, plural, other{{seconds} 秒}}", + "@timeSeconds": {}, + "timeMinutes": "{minutes, plural, other{{minutes} 分}}", + "@timeMinutes": {}, + "timeDays": "{days, plural, other{{days} 日}}", + "@timeDays": {}, + "focalLength": "{length} mm", + "@focalLength": {}, + "applyButtonLabel": "適用", + "@applyButtonLabel": {}, + "deleteButtonLabel": "削除", + "@deleteButtonLabel": {}, + "nextButtonLabel": "次へ", + "@nextButtonLabel": {}, + "showButtonLabel": "表示", + "@showButtonLabel": {}, + "hideButtonLabel": "非表示", + "@hideButtonLabel": {}, + "continueButtonLabel": "続ける", + "@continueButtonLabel": {}, + "cancelTooltip": "キャンセル", + "@cancelTooltip": {}, + "changeTooltip": "変更", + "@changeTooltip": {}, + "clearTooltip": "クリア", + "@clearTooltip": {}, + "previousTooltip": "前へ", + "@previousTooltip": {}, + "nextTooltip": "次へ", + "@nextTooltip": {}, + "showTooltip": "表示する", + "@showTooltip": {}, + "hideTooltip": "非表示にする", + "@hideTooltip": {}, + "actionRemove": "削除", + "@actionRemove": {}, + "resetTooltip": "リセット", + "@resetTooltip": {}, + "saveTooltip": "保存", + "@saveTooltip": {}, + "pickTooltip": "ピック", + "@pickTooltip": {}, + "doubleBackExitMessage": "終了するには「戻る」をもう一度タップしてください。", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "今後このメッセージを表示しない", + "@doNotAskAgain": {}, + "sourceStateLoading": "読み込み中", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "分類中", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "国、地域を確認中", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "場所を確認中", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "削除", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "アルバム別に表示", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "国地域別に表示", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "タグ別に表示", + "@chipActionGoToTagPage": {}, + "chipActionHide": "非表示", + "@chipActionHide": {}, + "chipActionPin": "一番上に固定", + "@chipActionPin": {}, + "chipActionUnpin": "一番上への固定を解除", + "@chipActionUnpin": {}, + "chipActionRename": "名前を変更", + "@chipActionRename": {}, + "chipActionSetCover": "カバーを設定", + "@chipActionSetCover": {}, + "chipActionCreateAlbum": "アルバムを作成", + "@chipActionCreateAlbum": {}, + "entryActionCopyToClipboard": "クリップボードにコピー", + "@entryActionCopyToClipboard": {}, + "entryActionDelete": "削除", + "@entryActionDelete": {}, + "entryActionConvert": "変換", + "@entryActionConvert": {}, + "entryActionExport": "エクスポート", + "@entryActionExport": {}, + "entryActionInfo": "情報", + "@entryActionInfo": {}, + "entryActionRename": "名前を変更", + "@entryActionRename": {}, + "entryActionRestore": "元に戻す", + "@entryActionRestore": {}, + "entryActionRotateCCW": "反時計回りに回転", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "時計回りに回転", + "@entryActionRotateCW": {}, + "entryActionFlip": "水平方向に反転", + "@entryActionFlip": {}, + "entryActionPrint": "印刷", + "@entryActionPrint": {}, + "entryActionShare": "共有", + "@entryActionShare": {}, + "entryActionViewSource": "ソースを表示", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "地図のオーバーレイとして表示", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "静止画に変換", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "動画を開く", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "編集", + "@entryActionEdit": {}, + "entryActionOpen": "アプリで開く", + "@entryActionOpen": {}, + "entryActionSetAs": "登録", + "@entryActionSetAs": {}, + "entryActionOpenMap": "地図アプリで表示", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "画面を回転", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "お気に入りに追加", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "お気に入りから削除", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "フレームをキャプチャ", + "@videoActionCaptureFrame": {}, + "videoActionMute": "ミュート", + "@videoActionMute": {}, + "videoActionUnmute": "ミュート解除", + "@videoActionUnmute": {}, + "videoActionPause": "一時停止", + "@videoActionPause": {}, + "videoActionPlay": "再生", + "@videoActionPlay": {}, + "videoActionReplay10": "10 秒前に戻る", + "@videoActionReplay10": {}, + "videoActionSkip10": "10 秒前に進む", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "トラックを選択", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "再生速度", + "@videoActionSetSpeed": {}, + "videoActionSettings": "設定", + "@videoActionSettings": {}, + "slideshowActionResume": "再開", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "コレクションで表示", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "日時を編集", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "位置情報を編集", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditRating": "評価を編集", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "タグを編集", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "メタデータを削除", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "ごみ箱", + "@filterBinLabel": {}, + "filterFavouriteLabel": "お気に入り", + "@filterFavouriteLabel": {}, + "filterNoLocationLabel": "位置情報なし", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "評価情報なし", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "タグ情報なし", + "@filterNoTagLabel": {}, + "filterOnThisDayLabel": "過去のこの日", + "@filterOnThisDayLabel": {}, + "filterRatingRejectedLabel": "拒否", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "アニメーション", + "@filterTypeAnimatedLabel": {}, + "filterTypeMotionPhotoLabel": "モーションフォト", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "パノラマ", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, + "filterTypeSphericalVideoLabel": "360° 動画", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "filterMimeImageLabel": "画像", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "動画", + "@filterMimeVideoLabel": {}, + "coordinateFormatDms": "度分秒", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "十進角", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{direction}{coordinate}", + "@coordinateDms": {}, + "coordinateDmsNorth": "北緯", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "南緯", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "東経", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "西経", + "@coordinateDmsWest": {}, + "unitSystemMetric": "メートル法", + "@unitSystemMetric": {}, + "unitSystemImperial": "ヤード・ポンド法", + "@unitSystemImperial": {}, + "videoLoopModeNever": "ループ再生しない", + "@videoLoopModeNever": {}, + "videoLoopModeShortOnly": "短い動画のみ", + "@videoLoopModeShortOnly": {}, + "videoLoopModeAlways": "常にループ再生", + "@videoLoopModeAlways": {}, + "videoControlsPlay": "再生", + "@videoControlsPlay": {}, + "videoControlsPlaySeek": "再生&早送り/早戻し", + "@videoControlsPlaySeek": {}, + "videoControlsPlayOutside": "他のプレイヤーで開く", + "@videoControlsPlayOutside": {}, + "videoControlsNone": "なし", + "@videoControlsNone": {}, + "mapStyleGoogleNormal": "Google マップ", + "@mapStyleGoogleNormal": {}, + "mapStyleGoogleHybrid": "Google マップ(ハイブリッド)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google マップ(地形)", + "@mapStyleGoogleTerrain": {}, + "mapStyleHuaweiNormal": "Petal マップ", + "@mapStyleHuaweiNormal": {}, + "mapStyleHuaweiTerrain": "Petal マップ(地形)", + "@mapStyleHuaweiTerrain": {}, + "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, + "mapStyleStamenToner": "Stamen Toner", + "@mapStyleStamenToner": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "名前を変更", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "置換", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "スキップ", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "自動オフ", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "ビューアー表示中のみ", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "常にオン", + "@keepScreenOnAlways": {}, + "accessibilityAnimationsRemove": "画面効果を表示しない", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "画面効果を表示", + "@accessibilityAnimationsKeep": {}, + "displayRefreshRatePreferHighest": "高レート", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "低レート", + "@displayRefreshRatePreferLowest": {}, + "videoPlaybackSkip": "スキップ", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "ミュート再生", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "音声あり再生", + "@videoPlaybackWithSound": {}, + "themeBrightnessLight": "ライト", + "@themeBrightnessLight": {}, + "themeBrightnessDark": "ダーク", + "@themeBrightnessDark": {}, + "themeBrightnessBlack": "ブラック", + "@themeBrightnessBlack": {}, + "viewerTransitionSlide": "スライド", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "パララックス", + "@viewerTransitionParallax": {}, + "viewerTransitionFade": "フェード", + "@viewerTransitionFade": {}, + "viewerTransitionZoomIn": "ズームイン", + "@viewerTransitionZoomIn": {}, + "wallpaperTargetHome": "ホーム画面", + "@wallpaperTargetHome": {}, + "wallpaperTargetLock": "ロック画面", + "@wallpaperTargetLock": {}, + "wallpaperTargetHomeLock": "ホームおよびロック画面", + "@wallpaperTargetHomeLock": {}, + "albumTierNew": "新規", + "@albumTierNew": {}, + "albumTierPinned": "固定", + "@albumTierPinned": {}, + "albumTierSpecial": "全体", + "@albumTierSpecial": {}, + "albumTierApps": "アプリ", + "@albumTierApps": {}, + "albumTierRegular": "その他", + "@albumTierRegular": {}, + "storageVolumeDescriptionFallbackPrimary": "内蔵ストレージ", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD カード", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "ルート ディレクトリ", + "@rootDirectoryDescription": {}, + "otherDirectoryDescription": "“{name}” ディレクトリ", + "@otherDirectoryDescription": {}, + "storageAccessDialogMessage": "このアプリにアクセスを許可するために次の画面で {directory} の “{volume}” を選択してください。", + "@storageAccessDialogMessage": {}, + "restrictedAccessDialogMessage": "このアプリは {directory} の “{volume}” にあるファイルを変更できません。\n\nプリインストールされているファイル マネージャまたはギャラリー アプリを使用して他のディレクトリに移動してください。", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "この操作には “{volume}” に {neededSize} の容量が必要ですが、 残り {freeSize} のみ利用可能です。", + "@notEnoughSpaceDialogMessage": {}, + "missingSystemFilePickerDialogMessage": "システム ファイル ピッカーが見つからないか、利用できません。利用可能にしてから再度お試しください。", + "@missingSystemFilePickerDialogMessage": {}, + "unsupportedTypeDialogMessage": "{count, plural, other{この操作は次のタイプのアイテムには対応していません: {types}.}}", + "@unsupportedTypeDialogMessage": {}, + "nameConflictDialogSingleSourceMessage": "目的フォルダに同じ名前のファイルが存在しています。", + "@nameConflictDialogSingleSourceMessage": {}, + "nameConflictDialogMultipleSourceMessage": "同じ名前のファイルが存在しています。", + "@nameConflictDialogMultipleSourceMessage": {}, + "addShortcutDialogLabel": "ショートカット ラベル", + "@addShortcutDialogLabel": {}, + "addShortcutButtonLabel": "追加", + "@addShortcutButtonLabel": {}, + "noMatchingAppDialogMessage": "処理できるアプリが見つかりません。", + "@noMatchingAppDialogMessage": {}, + "binEntriesConfirmationDialogMessage": "{count, plural, =1{このアイテムをごみ箱に移動しますか?} other{{count} 件のアイテムをごみ箱に移動しますか?}}", + "@binEntriesConfirmationDialogMessage": {}, + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{このアイテムを削除しますか?} other{{count} 件のアイテムを削除しますか?}}", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "いくつかのアイテムはメタデータ上に日付がありません。メタデータ上の日付が設定されない場合、この操作によりこれらの現在の日付はリセットされます", + "@moveUndatedConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogSetDate": "日付を設定", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeDialogMessage": "{time} の時点から再生を再開しますか?", + "@videoResumeDialogMessage": {}, + "videoStartOverButtonLabel": "最初から再生", + "@videoStartOverButtonLabel": {}, + "videoResumeButtonLabel": "再開", + "@videoResumeButtonLabel": {}, + "setCoverDialogLatest": "最新のアイテム", + "@setCoverDialogLatest": {}, + "setCoverDialogAuto": "自動", + "@setCoverDialogAuto": {}, + "setCoverDialogCustom": "カスタム", + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "一致する写真と動画はコレクションに表示されなくなります。「プライバシー」設定からいつでもアイテムを表示できます。\n\nこれらのアイテムを非表示にしますか?", + "@hideFilterConfirmationDialogMessage": {}, + "newAlbumDialogTitle": "新規アルバム", + "@newAlbumDialogTitle": {}, + "newAlbumDialogNameLabel": "アルバム名", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "ディレクトリが既に存在します", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "newAlbumDialogStorageLabel": "ストレージ:", + "@newAlbumDialogStorageLabel": {}, + "renameAlbumDialogLabel": "新しい名前", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "ディレクトリが既に存在します", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameEntrySetPageTitle": "名前を変更", + "@renameEntrySetPageTitle": {}, + "renameEntrySetPagePatternFieldLabel": "名前付けのパターン", + "@renameEntrySetPagePatternFieldLabel": {}, + "renameEntrySetPageInsertTooltip": "フィールドを挿入", + "@renameEntrySetPageInsertTooltip": {}, + "renameEntrySetPagePreviewSectionTitle": "プレビュー", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "連番", + "@renameProcessorCounter": {}, + "renameProcessorName": "名前", + "@renameProcessorName": {}, + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{このアルバムとアルバム内のアイテムを削除しますか?} other{このアルバムとアルバム内の {count} 件のアイテムを削除しますか?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{これらのアルバムとアルバム内のアイテムを削除しますか?} other{これらのアルバムとアルバム内の {count} 件のアイテムを削除しますか?}}", + "@deleteMultiAlbumConfirmationDialogMessage": {}, + "exportEntryDialogFormat": "形式:", + "@exportEntryDialogFormat": {}, + "exportEntryDialogWidth": "幅", + "@exportEntryDialogWidth": {}, + "exportEntryDialogHeight": "高さ", + "@exportEntryDialogHeight": {}, + "renameEntryDialogLabel": "新しい名前", + "@renameEntryDialogLabel": {}, + "editEntryDialogTargetFieldsHeader": "更新するフィールド", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogTitle": "日時", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "日を設定する", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "他の日からコピーする", + "@editEntryDateDialogCopyField": {}, + "editEntryDateDialogCopyItem": "他のアイテムからコピーする", + "@editEntryDateDialogCopyItem": {}, + "editEntryDateDialogExtractFromTitle": "タイトルから抽出する", + "@editEntryDateDialogExtractFromTitle": {}, + "editEntryDateDialogShift": "シフト", + "@editEntryDateDialogShift": {}, + "editEntryDateDialogSourceFileModifiedDate": "ファイル更新日", + "@editEntryDateDialogSourceFileModifiedDate": {}, + "durationDialogHours": "時", + "@durationDialogHours": {}, + "durationDialogMinutes": "分", + "@durationDialogMinutes": {}, + "editEntryLocationDialogTitle": "位置情報", + "@editEntryLocationDialogTitle": {}, + "editEntryLocationDialogChooseOnMapTooltip": "地図上で選択", + "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogLatitude": "緯度", + "@editEntryLocationDialogLatitude": {}, + "editEntryLocationDialogLongitude": "経度", + "@editEntryLocationDialogLongitude": {}, + "locationPickerUseThisLocationButton": "この位置情報を使用", + "@locationPickerUseThisLocationButton": {}, + "editEntryRatingDialogTitle": "評価", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "メタデータの削除", + "@removeEntryMetadataDialogTitle": {}, + "removeEntryMetadataDialogMore": "もっと見る", + "@removeEntryMetadataDialogMore": {}, + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "モーションフォト内の動画を再生するには XMP が必要です。\n\n削除しますか?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, + "convertMotionPhotoToStillImageWarningDialogMessage": "適用しますか?", + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, + "videoSpeedDialogLabel": "再生速度", + "@videoSpeedDialogLabel": {}, + "videoStreamSelectionDialogVideo": "動画", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "音声", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogText": "字幕", + "@videoStreamSelectionDialogText": {}, + "videoStreamSelectionDialogOff": "オフ", + "@videoStreamSelectionDialogOff": {}, + "videoStreamSelectionDialogTrack": "トラック", + "@videoStreamSelectionDialogTrack": {}, + "videoStreamSelectionDialogNoSelection": "他にトラックはありません。", + "@videoStreamSelectionDialogNoSelection": {}, + "genericSuccessFeedback": "完了しました!", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "エラー", + "@genericFailureFeedback": {}, + "menuActionConfigureView": "表示", + "@menuActionConfigureView": {}, + "menuActionSelect": "選択", + "@menuActionSelect": {}, + "menuActionSelectAll": "すべて選択", + "@menuActionSelectAll": {}, + "menuActionSelectNone": "選択を解除", + "@menuActionSelectNone": {}, + "menuActionMap": "地図", + "@menuActionMap": {}, + "menuActionSlideshow": "スライドショー", + "@menuActionSlideshow": {}, + "menuActionStats": "統計", + "@menuActionStats": {}, + "viewDialogSortSectionTitle": "並べ替え", + "@viewDialogSortSectionTitle": {}, + "viewDialogGroupSectionTitle": "グループ", + "@viewDialogGroupSectionTitle": {}, + "viewDialogLayoutSectionTitle": "レイアウト", + "@viewDialogLayoutSectionTitle": {}, + "tileLayoutGrid": "グリッド表示", + "@tileLayoutGrid": {}, + "tileLayoutList": "リスト表示", + "@tileLayoutList": {}, + "coverDialogTabCover": "カバー", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "アプリ", + "@coverDialogTabApp": {}, + "coverDialogTabColor": "カラー", + "@coverDialogTabColor": {}, + "appPickDialogTitle": "アプリを選ぶ", + "@appPickDialogTitle": {}, + "appPickDialogNone": "なし", + "@appPickDialogNone": {}, + "aboutPageTitle": "アプリについて", + "@aboutPageTitle": {}, + "aboutLinkLicense": "ライセンス", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "プライバシー ポリシー", + "@aboutLinkPolicy": {}, + "aboutBugSectionTitle": "バグの報告", + "@aboutBugSectionTitle": {}, + "aboutBugSaveLogInstruction": "アプリのログをファイルに保存", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoInstruction": "システム情報をコピー", + "@aboutBugCopyInfoInstruction": {}, + "aboutBugCopyInfoButton": "コピー", + "@aboutBugCopyInfoButton": {}, + "aboutBugReportInstruction": "ログとシステム情報とともに GitHub で報告", + "@aboutBugReportInstruction": {}, + "aboutBugReportButton": "報告", + "@aboutBugReportButton": {}, + "aboutCreditsSectionTitle": "クレジット", + "@aboutCreditsSectionTitle": {}, + "aboutCreditsWorldAtlas1": "このアプリは TopoJSON ファイルを", + "@aboutCreditsWorldAtlas1": {}, + "aboutCreditsWorldAtlas2": "ISC License の下使用しています。", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "翻訳", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "オープンソース ライセンス", + "@aboutLicensesSectionTitle": {}, + "aboutLicensesBanner": "このアプリは下記のオープンソース パッケージおよびライブラリを使用しています。", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android ライブラリ", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter プラグイン", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter パッケージ", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart パッケージ", + "@aboutLicensesDartPackagesSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "すべてのライセンスを表示", + "@aboutLicensesShowAllButtonLabel": {}, + "policyPageTitle": "プライバシー ポリシー", + "@policyPageTitle": {}, + "collectionPageTitle": "コレクション", + "@collectionPageTitle": {}, + "collectionPickPageTitle": "ピック", + "@collectionPickPageTitle": {}, + "collectionSelectPageTitle": "アイテムを選択", + "@collectionSelectPageTitle": {}, + "collectionActionShowTitleSearch": "タイトル名フィルターを表示", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "タイトル名フィルターを非表示", + "@collectionActionHideTitleSearch": {}, + "collectionActionAddShortcut": "ショートカットを追加", + "@collectionActionAddShortcut": {}, + "collectionActionEmptyBin": "ごみ箱を空にする", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "アルバムにコピー", + "@collectionActionCopy": {}, + "collectionActionMove": "アルバムに移動", + "@collectionActionMove": {}, + "collectionActionRescan": "再スキャン", + "@collectionActionRescan": {}, + "collectionActionEdit": "編集", + "@collectionActionEdit": {}, + "collectionSearchTitlesHintText": "タイトルを検索", + "@collectionSearchTitlesHintText": {}, + "collectionGroupAlbum": "アルバム別", + "@collectionGroupAlbum": {}, + "collectionGroupMonth": "月別", + "@collectionGroupMonth": {}, + "collectionGroupDay": "日別", + "@collectionGroupDay": {}, + "collectionGroupNone": "グループ化しない", + "@collectionGroupNone": {}, + "sectionUnknown": "不明", + "@sectionUnknown": {}, + "dateToday": "今日", + "@dateToday": {}, + "dateYesterday": "昨日", + "@dateYesterday": {}, + "dateThisMonth": "今月", + "@dateThisMonth": {}, + "collectionDeleteFailureFeedback": "{count, plural, other{{count} 件のアイテムを削除できませんでした}}", + "@collectionDeleteFailureFeedback": {}, + "collectionCopyFailureFeedback": "{count, plural, other{{count} 件のアイテムをコピーできませんでした}}", + "@collectionCopyFailureFeedback": {}, + "collectionMoveFailureFeedback": "{count, plural, other{{count} 件のアイテムを移動できませんでした}}", + "@collectionMoveFailureFeedback": {}, + "collectionRenameFailureFeedback": "{count, plural, other{{count} 件のアイテム名を変更できませんでした}}", + "@collectionRenameFailureFeedback": {}, + "collectionEditFailureFeedback": "{count, plural, other{{count} 件のアイテムを編集できませんでした}}", + "@collectionEditFailureFeedback": {}, + "collectionExportFailureFeedback": "{count, plural, other{{count} ページをエクスポートできませんでした}}", + "@collectionExportFailureFeedback": {}, + "collectionCopySuccessFeedback": "{count, plural, other{{count} 件のアイテムをコピーしました}}", + "@collectionCopySuccessFeedback": {}, + "collectionMoveSuccessFeedback": "{count, plural, other{{count} 件のアイテムを移動しました}}", + "@collectionMoveSuccessFeedback": {}, + "collectionRenameSuccessFeedback": "{count, plural, other{{count} 件のアイテム名を変更しました}}", + "@collectionRenameSuccessFeedback": {}, + "collectionEditSuccessFeedback": "{count, plural, other{{count} 件のアイテムを編集しました}}", + "@collectionEditSuccessFeedback": {}, + "collectionEmptyFavourites": "お気に入りはありません", + "@collectionEmptyFavourites": {}, + "collectionEmptyVideos": "動画はありません", + "@collectionEmptyVideos": {}, + "collectionEmptyImages": "画像はありません", + "@collectionEmptyImages": {}, + "collectionEmptyGrantAccessButtonLabel": "アクセスを許可", + "@collectionEmptyGrantAccessButtonLabel": {}, + "collectionSelectSectionTooltip": "セクションを選択", + "@collectionSelectSectionTooltip": {}, + "collectionDeselectSectionTooltip": "セクションの選択を解除", + "@collectionDeselectSectionTooltip": {}, + "drawerAboutButton": "アプリについて", + "@drawerAboutButton": {}, + "drawerSettingsButton": "設定", + "@drawerSettingsButton": {}, + "drawerCollectionAll": "すべてのコレクション", + "@drawerCollectionAll": {}, + "drawerCollectionFavourites": "お気に入り", + "@drawerCollectionFavourites": {}, + "drawerCollectionImages": "画像", + "@drawerCollectionImages": {}, + "drawerCollectionVideos": "動画", + "@drawerCollectionVideos": {}, + "drawerCollectionAnimated": "アニメーション", + "@drawerCollectionAnimated": {}, + "drawerCollectionMotionPhotos": "モーションフォト", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionPanoramas": "パノラマ", + "@drawerCollectionPanoramas": {}, + "drawerCollectionRaws": "Raw 写真", + "@drawerCollectionRaws": {}, + "drawerCollectionSphericalVideos": "360° 動画", + "@drawerCollectionSphericalVideos": {}, + "drawerAlbumPage": "アルバム", + "@drawerAlbumPage": {}, + "drawerCountryPage": "国", + "@drawerCountryPage": {}, + "drawerTagPage": "タグ", + "@drawerTagPage": {}, + "sortByDate": "日付", + "@sortByDate": {}, + "sortByName": "名前", + "@sortByName": {}, + "sortByItemCount": "アイテム件数", + "@sortByItemCount": {}, + "sortBySize": "サイズ", + "@sortBySize": {}, + "sortByAlbumFileName": "アルバムとファイル名", + "@sortByAlbumFileName": {}, + "sortByRating": "評価", + "@sortByRating": {}, + "albumGroupTier": "階層別", + "@albumGroupTier": {}, + "albumGroupVolume": "ストレージ ボリューム別", + "@albumGroupVolume": {}, + "albumGroupNone": "グループ化しない", + "@albumGroupNone": {}, + "albumPickPageTitleCopy": "アルバムにコピー", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitleExport": "アルバムにエクスポート", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "アルバムに移動", + "@albumPickPageTitleMove": {}, + "albumPickPageTitlePick": "アルバムを選択", + "@albumPickPageTitlePick": {}, + "albumCamera": "カメラ", + "@albumCamera": {}, + "albumDownload": "ダウンロード", + "@albumDownload": {}, + "albumScreenshots": "スクリーンショット", + "@albumScreenshots": {}, + "albumScreenRecordings": "画面録画", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "動画キャプチャ", + "@albumVideoCaptures": {}, + "albumPageTitle": "アルバム", + "@albumPageTitle": {}, + "albumEmpty": "アルバムはありません", + "@albumEmpty": {}, + "createAlbumTooltip": "アルバムを作成", + "@createAlbumTooltip": {}, + "createAlbumButtonLabel": "作成", + "@createAlbumButtonLabel": {}, + "newFilterBanner": "新規", + "@newFilterBanner": {}, + "countryPageTitle": "国", + "@countryPageTitle": {}, + "countryEmpty": "国はありません", + "@countryEmpty": {}, + "tagPageTitle": "タグ", + "@tagPageTitle": {}, + "tagEmpty": "タグはありません", + "@tagEmpty": {}, + "binPageTitle": "ごみ箱", + "@binPageTitle": {}, + "searchCollectionFieldHint": "コレクションを検索", + "@searchCollectionFieldHint": {}, + "searchRecentSectionTitle": "最近", + "@searchRecentSectionTitle": {}, + "searchDateSectionTitle": "日付", + "@searchDateSectionTitle": {}, + "searchAlbumsSectionTitle": "アルバム", + "@searchAlbumsSectionTitle": {}, + "searchCountriesSectionTitle": "国", + "@searchCountriesSectionTitle": {}, + "searchPlacesSectionTitle": "場所", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "タグ", + "@searchTagsSectionTitle": {}, + "searchRatingSectionTitle": "評価", + "@searchRatingSectionTitle": {}, + "settingsPageTitle": "設定", + "@settingsPageTitle": {}, + "settingsSystemDefault": "システム", + "@settingsSystemDefault": {}, + "settingsDefault": "デフォルト", + "@settingsDefault": {}, + "settingsSearchFieldLabel": "検索設定", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "一致する設定なし", + "@settingsSearchEmpty": {}, + "settingsActionExport": "エクスポート", + "@settingsActionExport": {}, + "settingsActionExportDialogTitle": "エクスポート", + "@settingsActionExportDialogTitle": {}, + "settingsActionImport": "インポート", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "インポート", + "@settingsActionImportDialogTitle": {}, + "appExportCovers": "カバー", + "@appExportCovers": {}, + "appExportFavourites": "お気に入り", + "@appExportFavourites": {}, + "appExportSettings": "設定", + "@appExportSettings": {}, + "settingsNavigationSectionTitle": "ナビゲーション", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "ホーム", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "ホーム", + "@settingsHomeDialogTitle": {}, + "settingsShowBottomNavigationBar": "下部のナビゲーションバーを表示", + "@settingsShowBottomNavigationBar": {}, + "settingsKeepScreenOnTile": "画面をオンのままにする", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "画面をオンのままにする", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "「戻る」を2回タップして終了", + "@settingsDoubleBackExit": {}, + "settingsConfirmationTile": "確認メッセージ", + "@settingsConfirmationTile": {}, + "settingsConfirmationDialogTitle": "確認メッセージ", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationBeforeDeleteItems": "アイテムを完全に削除する前に確認", + "@settingsConfirmationBeforeDeleteItems": {}, + "settingsConfirmationBeforeMoveToBinItems": "アイテムをごみ箱に移動する前に確認", + "@settingsConfirmationBeforeMoveToBinItems": {}, + "settingsConfirmationBeforeMoveUndatedItems": "メタデータ上に日付のないアイテムを移動する前に確認", + "@settingsConfirmationBeforeMoveUndatedItems": {}, + "settingsNavigationDrawerTile": "ナビゲーション メニュー", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "ナビゲーション メニュー", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerBanner": "メニュー項目を長押しして、移動および並べ替え", + "@settingsNavigationDrawerBanner": {}, + "settingsNavigationDrawerTabTypes": "タイプ", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerTabAlbums": "アルバム", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "ページ", + "@settingsNavigationDrawerTabPages": {}, + "settingsNavigationDrawerAddAlbum": "アルバムを追加", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsThumbnailSectionTitle": "サムネイル", + "@settingsThumbnailSectionTitle": {}, + "settingsThumbnailOverlayTile": "オーバーレイ", + "@settingsThumbnailOverlayTile": {}, + "settingsThumbnailOverlayPageTitle": "オーバーレイ", + "@settingsThumbnailOverlayPageTitle": {}, + "settingsThumbnailShowFavouriteIcon": "お気に入りアイコンを表示", + "@settingsThumbnailShowFavouriteIcon": {}, + "settingsThumbnailShowTagIcon": "タグアイコンを表示", + "@settingsThumbnailShowTagIcon": {}, + "settingsThumbnailShowLocationIcon": "位置情報アイコンを表示", + "@settingsThumbnailShowLocationIcon": {}, + "settingsThumbnailShowMotionPhotoIcon": "モーションフォトアイコンを表示", + "@settingsThumbnailShowMotionPhotoIcon": {}, + "settingsThumbnailShowRating": "評価情報を表示", + "@settingsThumbnailShowRating": {}, + "settingsThumbnailShowRawIcon": "Raw アイコンを表示", + "@settingsThumbnailShowRawIcon": {}, + "settingsThumbnailShowVideoDuration": "動画の再生時間を表示", + "@settingsThumbnailShowVideoDuration": {}, + "settingsCollectionQuickActionsTile": "クイック アクション", + "@settingsCollectionQuickActionsTile": {}, + "settingsCollectionQuickActionEditorPageTitle": "クイック アクション", + "@settingsCollectionQuickActionEditorPageTitle": {}, + "settingsCollectionQuickActionTabBrowsing": "ブラウズ中", + "@settingsCollectionQuickActionTabBrowsing": {}, + "settingsCollectionQuickActionTabSelecting": "選択中", + "@settingsCollectionQuickActionTabSelecting": {}, + "settingsCollectionBrowsingQuickActionEditorBanner": "長押ししてボタンを移動しアイテムを閲覧中に表示されるアクションを選択します。", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, + "settingsCollectionSelectionQuickActionEditorBanner": "長押ししてボタンを移動しアイテムを選択中に表示されるアクションを選択します。", + "@settingsCollectionSelectionQuickActionEditorBanner": {}, + "settingsViewerSectionTitle": "ビューアー", + "@settingsViewerSectionTitle": {}, + "settingsViewerUseCutout": "切り取り領域を使用", + "@settingsViewerUseCutout": {}, + "settingsViewerMaximumBrightness": "明るさ最大", + "@settingsViewerMaximumBrightness": {}, + "settingsMotionPhotoAutoPlay": "モーションフォトを自動再生", + "@settingsMotionPhotoAutoPlay": {}, + "settingsImageBackground": "画像の背景", + "@settingsImageBackground": {}, + "settingsViewerQuickActionsTile": "クイックアクション", + "@settingsViewerQuickActionsTile": {}, + "settingsViewerQuickActionEditorPageTitle": "クイックアクション", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerQuickActionEditorBanner": "長押ししてボタンを移動しビューアーで表示されるアクションを選択します。", + "@settingsViewerQuickActionEditorBanner": {}, + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "表示ボタン", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "利用可能なボタン", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, + "settingsViewerQuickActionEmpty": "ボタンなし", + "@settingsViewerQuickActionEmpty": {}, + "settingsViewerOverlayTile": "オーバーレイ", + "@settingsViewerOverlayTile": {}, + "settingsViewerOverlayPageTitle": "オーバーレイ", + "@settingsViewerOverlayPageTitle": {}, + "settingsViewerShowOverlayOnOpening": "起動時に表示", + "@settingsViewerShowOverlayOnOpening": {}, + "settingsViewerShowMinimap": "小さな地図を表示", + "@settingsViewerShowMinimap": {}, + "settingsViewerShowInformation": "情報を表示", + "@settingsViewerShowInformation": {}, + "settingsViewerShowInformationSubtitle": "タイトル、日付、位置情報、その他を表示", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerShowShootingDetails": "撮影詳細を表示", + "@settingsViewerShowShootingDetails": {}, + "settingsViewerShowOverlayThumbnails": "サムネイルを表示", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsViewerEnableOverlayBlurEffect": "ぼかし効果", + "@settingsViewerEnableOverlayBlurEffect": {}, + "settingsViewerSlideshowTile": "スライドショー", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "スライドショー", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "繰り返し", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "シャッフル", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowFillScreen": "画面いっぱいに表示", + "@settingsSlideshowFillScreen": {}, + "settingsSlideshowTransitionTile": "トランジション", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowIntervalTile": "間隔", + "@settingsSlideshowIntervalTile": {}, + "settingsSlideshowVideoPlaybackTile": "動画を再生", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "動画再生", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoPageTitle": "動画設定", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "動画", + "@settingsVideoSectionTitle": {}, + "settingsVideoShowVideos": "動画を表示", + "@settingsVideoShowVideos": {}, + "settingsVideoEnableHardwareAcceleration": "ハードウェア アクセラレーション", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoAutoPlay": "自動再生", + "@settingsVideoAutoPlay": {}, + "settingsVideoLoopModeTile": "ループ モード", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "ループ モード", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTile": "字幕", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemePageTitle": "字幕", + "@settingsSubtitleThemePageTitle": {}, + "settingsSubtitleThemeSample": "これはサンプルです。", + "@settingsSubtitleThemeSample": {}, + "settingsSubtitleThemeTextAlignmentTile": "テキストの配置", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "テキストの配置", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextSize": "テキストのサイズ", + "@settingsSubtitleThemeTextSize": {}, + "settingsSubtitleThemeShowOutline": "アウトラインと影を表示", + "@settingsSubtitleThemeShowOutline": {}, + "settingsSubtitleThemeTextColor": "テキストの色", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "テキストの不透明度", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "背景色", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "背景の不透明度", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentLeft": "左揃え", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "中央揃え", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsSubtitleThemeTextAlignmentRight": "右揃え", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "操作", + "@settingsVideoControlsTile": {}, + "settingsVideoControlsPageTitle": "操作", + "@settingsVideoControlsPageTitle": {}, + "settingsVideoButtonsTile": "ボタン", + "@settingsVideoButtonsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "2回タップして再生/一時停止", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsVideoGestureSideDoubleTapSeek": "画面の角を2回タップして早送り/早戻し", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsPrivacySectionTitle": "プライバシー", + "@settingsPrivacySectionTitle": {}, + "settingsAllowInstalledAppAccess": "アプリのインベントリへのアクセスを許可する", + "@settingsAllowInstalledAppAccess": {}, + "settingsAllowInstalledAppAccessSubtitle": "アルバム表示の改善に使用されます", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "匿名でのエラー報告を許可する", + "@settingsAllowErrorReporting": {}, + "settingsSaveSearchHistory": "検索履歴を保存", + "@settingsSaveSearchHistory": {}, + "settingsEnableBin": "ごみ箱を使用", + "@settingsEnableBin": {}, + "settingsEnableBinSubtitle": "削除したアイテムを30日間保持します", + "@settingsEnableBinSubtitle": {}, + "settingsHiddenItemsTile": "非表示アイテム", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "非表示アイテム", + "@settingsHiddenItemsPageTitle": {}, + "settingsHiddenItemsTabFilters": "非表示フィルター", + "@settingsHiddenItemsTabFilters": {}, + "settingsHiddenFiltersBanner": "非表示のフィルターに一致する写真と動画は、コレクションに表示されません。", + "@settingsHiddenFiltersBanner": {}, + "settingsHiddenFiltersEmpty": "非表示フィルターがありません", + "@settingsHiddenFiltersEmpty": {}, + "settingsHiddenItemsTabPaths": "非表示パス", + "@settingsHiddenItemsTabPaths": {}, + "settingsHiddenPathsBanner": "これらのフォルダまたはそのサブフォルダにある写真と動画は、コレクションに表示されません。", + "@settingsHiddenPathsBanner": {}, + "addPathTooltip": "パスを追加", + "@addPathTooltip": {}, + "settingsStorageAccessTile": "ストレージへのアクセス", + "@settingsStorageAccessTile": {}, + "settingsStorageAccessPageTitle": "ストレージへのアクセス", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessBanner": "ディレクトリによっては、ファイルの編集のためにアクセス許可が必要です。ここには、これまでにアクセスを許可したディレクトリが表示されます。", + "@settingsStorageAccessBanner": {}, + "settingsStorageAccessEmpty": "許可したアクセスはありません", + "@settingsStorageAccessEmpty": {}, + "settingsStorageAccessRevokeTooltip": "許可を取り消し", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsAccessibilitySectionTitle": "アクセシビリティ", + "@settingsAccessibilitySectionTitle": {}, + "settingsRemoveAnimationsTile": "アニメーションの削除", + "@settingsRemoveAnimationsTile": {}, + "settingsRemoveAnimationsDialogTitle": "アニメーションの削除", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsTimeToTakeActionTile": "操作までの時間", + "@settingsTimeToTakeActionTile": {}, + "settingsDisplaySectionTitle": "ディスプレイ", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "テーマ", + "@settingsThemeBrightnessTile": {}, + "settingsThemeBrightnessDialogTitle": "テーマ", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsThemeColorHighlights": "カラー強調表示", + "@settingsThemeColorHighlights": {}, + "settingsThemeEnableDynamicColor": "ダイナミックカラー", + "@settingsThemeEnableDynamicColor": {}, + "settingsDisplayRefreshRateModeTile": "ディスプレイ リフレッシュ レート", + "@settingsDisplayRefreshRateModeTile": {}, + "settingsDisplayRefreshRateModeDialogTitle": "リフレッシュ レート", + "@settingsDisplayRefreshRateModeDialogTitle": {}, + "settingsLanguageSectionTitle": "言語と形式", + "@settingsLanguageSectionTitle": {}, + "settingsLanguageTile": "言語", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "言語", + "@settingsLanguagePageTitle": {}, + "settingsCoordinateFormatTile": "座標形式", + "@settingsCoordinateFormatTile": {}, + "settingsCoordinateFormatDialogTitle": "座標形式", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "単位", + "@settingsUnitSystemTile": {}, + "settingsUnitSystemDialogTitle": "単位", + "@settingsUnitSystemDialogTitle": {}, + "settingsScreenSaverPageTitle": "スクリーンセーバー", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetPageTitle": "フォトフレーム", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "枠", + "@settingsWidgetShowOutline": {}, + "settingsCollectionTile": "コレクション", + "@settingsCollectionTile": {}, + "statsPageTitle": "統計", + "@statsPageTitle": {}, + "statsWithGps": "{count, plural, other{位置情報のあるアイテム {count} 件}}", + "@statsWithGps": {}, + "statsTopCountriesSectionTitle": "上位の国", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "上位の場所", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "上位のタグ", + "@statsTopTagsSectionTitle": {}, + "viewerOpenPanoramaButtonLabel": "パノラマを開く", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "壁紙設定", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "エラー!", + "@viewerErrorUnknown": {}, + "viewerErrorDoesNotExist": "ファイルが存在しません。", + "@viewerErrorDoesNotExist": {}, + "viewerInfoPageTitle": "情報", + "@viewerInfoPageTitle": {}, + "viewerInfoBackToViewerTooltip": "ビューアーに戻る", + "@viewerInfoBackToViewerTooltip": {}, + "viewerInfoUnknown": "不明", + "@viewerInfoUnknown": {}, + "viewerInfoLabelTitle": "タイトル", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelDate": "日付", + "@viewerInfoLabelDate": {}, + "viewerInfoLabelResolution": "解像度", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "サイズ", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "パス", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "再生時間", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "所有者", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "座標", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "アドレス", + "@viewerInfoLabelAddress": {}, + "mapStyleDialogTitle": "地図のスタイル", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "地図のスタイルを選択", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "ズームイン", + "@mapZoomInTooltip": {}, + "mapZoomOutTooltip": "ズームアウト", + "@mapZoomOutTooltip": {}, + "mapPointNorthUpTooltip": "北が上になるように表示", + "@mapPointNorthUpTooltip": {}, + "mapAttributionOsmHot": "地図データ © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors • Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, + "mapAttributionStamen": "地図データ © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors • Tiles by [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, + "openMapPageTooltip": "地図ページで表示", + "@openMapPageTooltip": {}, + "mapEmptyRegion": "この地域の画像はありません", + "@mapEmptyRegion": {}, + "viewerInfoOpenEmbeddedFailureFeedback": "埋め込みデータを抽出できませんでした", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, + "viewerInfoOpenLinkText": "開く", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "XML を表示", + "@viewerInfoViewXmlLinkText": {}, + "viewerInfoSearchFieldLabel": "メタデータを検索", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchEmpty": "一致するキーはありません", + "@viewerInfoSearchEmpty": {}, + "viewerInfoSearchSuggestionDate": "日時", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDescription": "説明", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchSuggestionDimensions": "寸法", + "@viewerInfoSearchSuggestionDimensions": {}, + "viewerInfoSearchSuggestionResolution": "解像度", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "権限", + "@viewerInfoSearchSuggestionRights": {}, + "tagEditorPageTitle": "タグの編集", + "@tagEditorPageTitle": {}, + "tagEditorPageNewTagFieldLabel": "新しいタグ", + "@tagEditorPageNewTagFieldLabel": {}, + "tagEditorPageAddTagTooltip": "タグを追加", + "@tagEditorPageAddTagTooltip": {}, + "tagEditorSectionRecent": "最近", + "@tagEditorSectionRecent": {}, + "panoramaEnableSensorControl": "センサー制御を有効にする", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "センサー制御を無効にする", + "@panoramaDisableSensorControl": {}, + "sourceViewerPageTitle": "ソース", + "@sourceViewerPageTitle": {}, + "filePickerShowHiddenFiles": "非表示のファイルを表示する", + "@filePickerShowHiddenFiles": {}, + "filePickerDoNotShowHiddenFiles": "非表示のファイルを表示しない", + "@filePickerDoNotShowHiddenFiles": {}, + "filePickerOpenFrom": "次から開く", + "@filePickerOpenFrom": {}, + "filePickerNoItems": "アイテムはありません", + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "このフォルダを使用", + "@filePickerUseThisFolder": {} +} diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 0644a9a14..b71461b26 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -1,696 +1,1150 @@ { "appName": "아베스", + "@appName": {}, "welcomeMessage": "아베스 사용을 환영합니다", + "@welcomeMessage": {}, "welcomeOptional": "선택", + "@welcomeOptional": {}, "welcomeTermsToggle": "이용약관에 동의합니다", + "@welcomeTermsToggle": {}, "itemCount": "{count, plural, other{{count}개}}", - + "@itemCount": {}, "timeSeconds": "{seconds, plural, other{{seconds}초}}", + "@timeSeconds": {}, "timeMinutes": "{minutes, plural, other{{minutes}분}}", + "@timeMinutes": {}, "timeDays": "{days, plural, other{{days}일}}", + "@timeDays": {}, "focalLength": "{length} mm", - + "@focalLength": {}, "applyButtonLabel": "확인", + "@applyButtonLabel": {}, "deleteButtonLabel": "삭제", + "@deleteButtonLabel": {}, "nextButtonLabel": "다음", + "@nextButtonLabel": {}, "showButtonLabel": "보기", + "@showButtonLabel": {}, "hideButtonLabel": "숨기기", + "@hideButtonLabel": {}, "continueButtonLabel": "다음", - + "@continueButtonLabel": {}, "cancelTooltip": "취소", + "@cancelTooltip": {}, "changeTooltip": "변경", + "@changeTooltip": {}, "clearTooltip": "초기화", + "@clearTooltip": {}, "previousTooltip": "이전", + "@previousTooltip": {}, "nextTooltip": "다음", + "@nextTooltip": {}, "showTooltip": "보기", + "@showTooltip": {}, "hideTooltip": "숨기기", + "@hideTooltip": {}, "actionRemove": "제거", + "@actionRemove": {}, "resetTooltip": "복원", + "@resetTooltip": {}, "saveTooltip": "저장", + "@saveTooltip": {}, "pickTooltip": "선택", - + "@pickTooltip": {}, "doubleBackExitMessage": "종료하려면 한번 더 누르세요.", + "@doubleBackExitMessage": {}, "doNotAskAgain": "다시 묻지 않기", - + "@doNotAskAgain": {}, "sourceStateLoading": "로딩 중", + "@sourceStateLoading": {}, "sourceStateCataloguing": "분석 중", + "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "국가 찾는 중", + "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "장소 찾는 중", - + "@sourceStateLocatingPlaces": {}, "chipActionDelete": "삭제", + "@chipActionDelete": {}, "chipActionGoToAlbumPage": "앨범 페이지에서 보기", + "@chipActionGoToAlbumPage": {}, "chipActionGoToCountryPage": "국가 페이지에서 보기", + "@chipActionGoToCountryPage": {}, "chipActionGoToTagPage": "태그 페이지에서 보기", + "@chipActionGoToTagPage": {}, "chipActionFilterOut": "제외하기", + "@chipActionFilterOut": {}, "chipActionFilterIn": "포함시키기", + "@chipActionFilterIn": {}, "chipActionHide": "숨기기", + "@chipActionHide": {}, "chipActionPin": "고정", + "@chipActionPin": {}, "chipActionUnpin": "고정 해제", + "@chipActionUnpin": {}, "chipActionRename": "이름 변경", + "@chipActionRename": {}, "chipActionSetCover": "대표 이미지 변경", + "@chipActionSetCover": {}, "chipActionCreateAlbum": "앨범 만들기", - + "@chipActionCreateAlbum": {}, "entryActionCopyToClipboard": "클립보드에 복사", + "@entryActionCopyToClipboard": {}, "entryActionDelete": "삭제", + "@entryActionDelete": {}, "entryActionConvert": "변환", + "@entryActionConvert": {}, "entryActionExport": "내보내기", + "@entryActionExport": {}, "entryActionInfo": "상세정보", + "@entryActionInfo": {}, "entryActionRename": "이름 변경", + "@entryActionRename": {}, "entryActionRestore": "복원", + "@entryActionRestore": {}, "entryActionRotateCCW": "좌회전", + "@entryActionRotateCCW": {}, "entryActionRotateCW": "우회전", + "@entryActionRotateCW": {}, "entryActionFlip": "좌우 뒤집기", + "@entryActionFlip": {}, "entryActionPrint": "인쇄", + "@entryActionPrint": {}, "entryActionShare": "공유", + "@entryActionShare": {}, "entryActionViewSource": "소스 코드 보기", + "@entryActionViewSource": {}, "entryActionShowGeoTiffOnMap": "지도에 겹쳐그리기", + "@entryActionShowGeoTiffOnMap": {}, "entryActionConvertMotionPhotoToStillImage": "스틸 사진으로 변환", + "@entryActionConvertMotionPhotoToStillImage": {}, "entryActionViewMotionPhotoVideo": "동영상 보기", + "@entryActionViewMotionPhotoVideo": {}, "entryActionEdit": "편집", + "@entryActionEdit": {}, "entryActionOpen": "다른 앱에서 열기", + "@entryActionOpen": {}, "entryActionSetAs": "다음 용도로 사용", + "@entryActionSetAs": {}, "entryActionOpenMap": "지도 앱에서 보기", + "@entryActionOpenMap": {}, "entryActionRotateScreen": "화면 회전", + "@entryActionRotateScreen": {}, "entryActionAddFavourite": "즐겨찾기에 추가", + "@entryActionAddFavourite": {}, "entryActionRemoveFavourite": "즐겨찾기에서 삭제", - + "@entryActionRemoveFavourite": {}, "videoActionCaptureFrame": "프레임 캡처", + "@videoActionCaptureFrame": {}, "videoActionMute": "음소거", + "@videoActionMute": {}, "videoActionUnmute": "음소거 해제", + "@videoActionUnmute": {}, "videoActionPause": "일시정지", + "@videoActionPause": {}, "videoActionPlay": "재생", + "@videoActionPlay": {}, "videoActionReplay10": "10초 뒤로 탐색", + "@videoActionReplay10": {}, "videoActionSkip10": "10초 앞으로 탐색", + "@videoActionSkip10": {}, "videoActionSelectStreams": "트랙 선택", + "@videoActionSelectStreams": {}, "videoActionSetSpeed": "재생 배속", + "@videoActionSetSpeed": {}, "videoActionSettings": "설정", - + "@videoActionSettings": {}, "slideshowActionResume": "이어서", + "@slideshowActionResume": {}, "slideshowActionShowInCollection": "미디어 페이지에서 보기", - + "@slideshowActionShowInCollection": {}, "entryInfoActionEditDate": "날짜 및 시간 수정", + "@entryInfoActionEditDate": {}, "entryInfoActionEditLocation": "위치 수정", + "@entryInfoActionEditLocation": {}, "entryInfoActionEditTitleDescription": "제목 및 설명 수정", + "@entryInfoActionEditTitleDescription": {}, "entryInfoActionEditRating": "별점 수정", + "@entryInfoActionEditRating": {}, "entryInfoActionEditTags": "태그 수정", + "@entryInfoActionEditTags": {}, "entryInfoActionRemoveMetadata": "메타데이터 삭제", - + "@entryInfoActionRemoveMetadata": {}, "filterBinLabel": "휴지통", + "@filterBinLabel": {}, "filterFavouriteLabel": "즐겨찾기", + "@filterFavouriteLabel": {}, "filterNoDateLabel": "날짜 없음", + "@filterNoDateLabel": {}, "filterNoLocationLabel": "장소 없음", + "@filterNoLocationLabel": {}, "filterNoRatingLabel": "별점 없음", + "@filterNoRatingLabel": {}, "filterNoTagLabel": "태그 없음", + "@filterNoTagLabel": {}, "filterNoTitleLabel": "제목 없음", + "@filterNoTitleLabel": {}, "filterOnThisDayLabel": "이 날", + "@filterOnThisDayLabel": {}, "filterRecentlyAddedLabel": "최근 추가된", + "@filterRecentlyAddedLabel": {}, "filterRatingRejectedLabel": "거부됨", + "@filterRatingRejectedLabel": {}, "filterTypeAnimatedLabel": "애니메이션", + "@filterTypeAnimatedLabel": {}, "filterTypeMotionPhotoLabel": "모션 사진", + "@filterTypeMotionPhotoLabel": {}, "filterTypePanoramaLabel": "파노라마", + "@filterTypePanoramaLabel": {}, "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, "filterTypeSphericalVideoLabel": "360° 동영상", + "@filterTypeSphericalVideoLabel": {}, "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, "filterMimeImageLabel": "사진", + "@filterMimeImageLabel": {}, "filterMimeVideoLabel": "동영상", - + "@filterMimeVideoLabel": {}, "coordinateFormatDms": "도분초", + "@coordinateFormatDms": {}, "coordinateFormatDecimal": "소수점", + "@coordinateFormatDecimal": {}, "coordinateDms": "{direction} {coordinate}", + "@coordinateDms": {}, "coordinateDmsNorth": "북위", + "@coordinateDmsNorth": {}, "coordinateDmsSouth": "남위", + "@coordinateDmsSouth": {}, "coordinateDmsEast": "동경", + "@coordinateDmsEast": {}, "coordinateDmsWest": "서경", - + "@coordinateDmsWest": {}, "unitSystemMetric": "미터법", + "@unitSystemMetric": {}, "unitSystemImperial": "야드파운드법", - + "@unitSystemImperial": {}, "videoLoopModeNever": "반복 안 함", + "@videoLoopModeNever": {}, "videoLoopModeShortOnly": "짧은 동영상만 반복", + "@videoLoopModeShortOnly": {}, "videoLoopModeAlways": "항상 반복", - + "@videoLoopModeAlways": {}, "videoControlsPlay": "재생", + "@videoControlsPlay": {}, "videoControlsPlaySeek": "재생 및 앞뒤로 가기", + "@videoControlsPlaySeek": {}, "videoControlsPlayOutside": "다른 앱에서 열기", + "@videoControlsPlayOutside": {}, "videoControlsNone": "없음", - + "@videoControlsNone": {}, "mapStyleGoogleNormal": "Google 지도", + "@mapStyleGoogleNormal": {}, "mapStyleGoogleHybrid": "Google 지도 (위성)", + "@mapStyleGoogleHybrid": {}, "mapStyleGoogleTerrain": "Google 지도 (지형)", + "@mapStyleGoogleTerrain": {}, "mapStyleHuaweiNormal": "Petal 지도", + "@mapStyleHuaweiNormal": {}, "mapStyleHuaweiTerrain": "Petal 지도 (지형)", + "@mapStyleHuaweiTerrain": {}, "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, "mapStyleStamenToner": "Stamen Toner (토너)", + "@mapStyleStamenToner": {}, "mapStyleStamenWatercolor": "Stamen Watercolor (수채화)", - + "@mapStyleStamenWatercolor": {}, "nameConflictStrategyRename": "이름 변경", + "@nameConflictStrategyRename": {}, "nameConflictStrategyReplace": "대체", + "@nameConflictStrategyReplace": {}, "nameConflictStrategySkip": "건너뛰기", - + "@nameConflictStrategySkip": {}, "keepScreenOnNever": "자동 꺼짐", + "@keepScreenOnNever": {}, "keepScreenOnViewerOnly": "뷰어 이용 시 작동", + "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "항상 켜짐", - + "@keepScreenOnAlways": {}, "accessibilityAnimationsRemove": "화면 효과 제한", + "@accessibilityAnimationsRemove": {}, "accessibilityAnimationsKeep": "화면 효과 유지", - + "@accessibilityAnimationsKeep": {}, "displayRefreshRatePreferHighest": "가장 높은 재생률", + "@displayRefreshRatePreferHighest": {}, "displayRefreshRatePreferLowest": "가장 낮은 재생률", - + "@displayRefreshRatePreferLowest": {}, "videoPlaybackSkip": "생략", + "@videoPlaybackSkip": {}, "videoPlaybackMuted": "음소거 재생", + "@videoPlaybackMuted": {}, "videoPlaybackWithSound": "일반 재생", - + "@videoPlaybackWithSound": {}, "themeBrightnessLight": "라이트", + "@themeBrightnessLight": {}, "themeBrightnessDark": "다크", + "@themeBrightnessDark": {}, "themeBrightnessBlack": "검은색", - + "@themeBrightnessBlack": {}, "viewerTransitionSlide": "좌우", + "@viewerTransitionSlide": {}, "viewerTransitionParallax": "시차", + "@viewerTransitionParallax": {}, "viewerTransitionFade": "페이드", + "@viewerTransitionFade": {}, "viewerTransitionZoomIn": "확대", + "@viewerTransitionZoomIn": {}, "viewerTransitionNone": "없음", - + "@viewerTransitionNone": {}, "wallpaperTargetHome": "홈 화면", + "@wallpaperTargetHome": {}, "wallpaperTargetLock": "잠금화면", + "@wallpaperTargetLock": {}, "wallpaperTargetHomeLock": "홈 및 잠금화면", - + "@wallpaperTargetHomeLock": {}, "widgetOpenPageHome": "홈 열기", + "@widgetOpenPageHome": {}, "widgetOpenPageCollection": "미디어 열기", + "@widgetOpenPageCollection": {}, "widgetOpenPageViewer": "뷰어 열기", - + "@widgetOpenPageViewer": {}, "albumTierNew": "신규", + "@albumTierNew": {}, "albumTierPinned": "고정", + "@albumTierPinned": {}, "albumTierSpecial": "기본", + "@albumTierSpecial": {}, "albumTierApps": "앱", + "@albumTierApps": {}, "albumTierRegular": "일반", - + "@albumTierRegular": {}, "storageVolumeDescriptionFallbackPrimary": "내장 메모리", + "@storageVolumeDescriptionFallbackPrimary": {}, "storageVolumeDescriptionFallbackNonPrimary": "SD 카드", + "@storageVolumeDescriptionFallbackNonPrimary": {}, "rootDirectoryDescription": "루트 폴더", + "@rootDirectoryDescription": {}, "otherDirectoryDescription": "“{name}” 폴더", + "@otherDirectoryDescription": {}, "storageAccessDialogMessage": "파일에 접근하도록 다음 화면에서 “{volume}”의 {directory}를 선택하세요.", + "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "“{volume}”의 {directory}에 있는 파일의 접근이 제한됩니다.\n\n기본으로 설치된 갤러리나 파일 관리 앱을 사용해서 다른 폴더로 파일을 이동하세요.", + "@restrictedAccessDialogMessage": {}, "notEnoughSpaceDialogMessage": "“{volume}”에 필요 공간은 {neededSize}인데 사용 가능한 용량은 {freeSize}만 남아있습니다.", + "@notEnoughSpaceDialogMessage": {}, "missingSystemFilePickerDialogMessage": "기본 파일 선택기가 없거나 비활성화딥니다. 파일 선택기를 켜고 다시 시도하세요.", - + "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, other{이 작업은 다음 항목의 형식을 지원하지 않습니다: {types}.}}", - + "@unsupportedTypeDialogMessage": {}, "nameConflictDialogSingleSourceMessage": "이동할 폴더에 이름이 같은 파일이 있습니다.", + "@nameConflictDialogSingleSourceMessage": {}, "nameConflictDialogMultipleSourceMessage": "이름이 같은 파일이 있습니다.", - + "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "바로가기 라벨", + "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "추가", - + "@addShortcutButtonLabel": {}, "noMatchingAppDialogMessage": "이 작업을 처리할 수 있는 앱이 없습니다.", - + "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{이 항목을 휴지통으로 이동하시겠습니까?} other{항목 {count}개를 휴지통으로 이동하시겠습니까?}}", + "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{이 항목을 삭제하시겠습니까?} other{항목 {count}개를 삭제하시겠습니까?}}", + "@deleteEntriesConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogMessage": "이 작업을 계속하기 전에 항목의 날짜를 지정하시겠습니까?", + "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "날짜 지정하기", - + "@moveUndatedConfirmationDialogSetDate": {}, "videoResumeDialogMessage": "{time}부터 재개하시겠습니까?", + "@videoResumeDialogMessage": {}, "videoStartOverButtonLabel": "처음부터", + "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "이어서", - + "@videoResumeButtonLabel": {}, "setCoverDialogLatest": "최근 항목", + "@setCoverDialogLatest": {}, "setCoverDialogAuto": "자동 설정", + "@setCoverDialogAuto": {}, "setCoverDialogCustom": "직접 설정", - + "@setCoverDialogCustom": {}, "hideFilterConfirmationDialogMessage": "이 필터에 맞는 사진과 동영상이 보이지 않을 것입니다. “개인정보 보호” 설정을 수정하면 다시 보일 수 있습니다.\n\n이 필터를 숨기시겠습니까?", - + "@hideFilterConfirmationDialogMessage": {}, "newAlbumDialogTitle": "새 앨범 만들기", + "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "앨범 이름", + "@newAlbumDialogNameLabel": {}, "newAlbumDialogNameLabelAlreadyExistsHelper": "사용 중인 이름입니다", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "저장공간:", - + "@newAlbumDialogStorageLabel": {}, "renameAlbumDialogLabel": "앨범 이름", + "@renameAlbumDialogLabel": {}, "renameAlbumDialogLabelAlreadyExistsHelper": "사용 중인 이름입니다", - + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, "renameEntrySetPageTitle": "이름 변경", + "@renameEntrySetPageTitle": {}, "renameEntrySetPagePatternFieldLabel": "이름 양식", + "@renameEntrySetPagePatternFieldLabel": {}, "renameEntrySetPageInsertTooltip": "필드 추가", + "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "미리보기", - + "@renameEntrySetPagePreviewSectionTitle": {}, "renameProcessorCounter": "숫자 증가", + "@renameProcessorCounter": {}, "renameProcessorName": "이름", - + "@renameProcessorName": {}, "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, other{이 앨범의 항목 {count}개를 삭제하시겠습니까?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, other{이 앨범들의 항목 {count}개를 삭제하시겠습니까?}}", - + "@deleteMultiAlbumConfirmationDialogMessage": {}, "exportEntryDialogFormat": "형식:", + "@exportEntryDialogFormat": {}, "exportEntryDialogWidth": "가로", + "@exportEntryDialogWidth": {}, "exportEntryDialogHeight": "세로", - + "@exportEntryDialogHeight": {}, "renameEntryDialogLabel": "이름", - + "@renameEntryDialogLabel": {}, "editEntryDialogTargetFieldsHeader": "수정할 필드", - + "@editEntryDialogTargetFieldsHeader": {}, "editEntryDateDialogTitle": "날짜 및 시간", + "@editEntryDateDialogTitle": {}, "editEntryDateDialogSetCustom": "지정 날짜로 편집", + "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "다른 날짜에서 지정", + "@editEntryDateDialogCopyField": {}, "editEntryDateDialogCopyItem": "다른 항목에서 지정", + "@editEntryDateDialogCopyItem": {}, "editEntryDateDialogExtractFromTitle": "제목에서 추출", + "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "시간 이동", + "@editEntryDateDialogShift": {}, "editEntryDateDialogSourceFileModifiedDate": "파일 수정한 날짜", - + "@editEntryDateDialogSourceFileModifiedDate": {}, "durationDialogHours": "시간", + "@durationDialogHours": {}, "durationDialogMinutes": "분", + "@durationDialogMinutes": {}, "durationDialogSeconds": "초", - + "@durationDialogSeconds": {}, "editEntryLocationDialogTitle": "위치", + "@editEntryLocationDialogTitle": {}, "editEntryLocationDialogChooseOnMapTooltip": "지도에서 선택", + "@editEntryLocationDialogChooseOnMapTooltip": {}, "editEntryLocationDialogLatitude": "위도", + "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "경도", - + "@editEntryLocationDialogLongitude": {}, "locationPickerUseThisLocationButton": "이 위치 사용", - + "@locationPickerUseThisLocationButton": {}, "editEntryRatingDialogTitle": "별점", - + "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "메타데이터 삭제", + "@removeEntryMetadataDialogTitle": {}, "removeEntryMetadataDialogMore": "더 보기", - + "@removeEntryMetadataDialogMore": {}, "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP가 있어야 모션 사진에 포함되는 동영상을 재생할 수 있습니다.\n\n삭제하시겠습니까?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, "convertMotionPhotoToStillImageWarningDialogMessage": "확실합니까?", - + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, "videoSpeedDialogLabel": "재생 배속", - + "@videoSpeedDialogLabel": {}, "videoStreamSelectionDialogVideo": "동영상", + "@videoStreamSelectionDialogVideo": {}, "videoStreamSelectionDialogAudio": "오디오", + "@videoStreamSelectionDialogAudio": {}, "videoStreamSelectionDialogText": "자막", + "@videoStreamSelectionDialogText": {}, "videoStreamSelectionDialogOff": "해제", + "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "트랙", + "@videoStreamSelectionDialogTrack": {}, "videoStreamSelectionDialogNoSelection": "다른 트랙이 없습니다.", - + "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "정상 처리됐습니다", + "@genericSuccessFeedback": {}, "genericFailureFeedback": "오류가 발생했습니다", - + "@genericFailureFeedback": {}, "menuActionConfigureView": "보기 설정", + "@menuActionConfigureView": {}, "menuActionSelect": "선택", + "@menuActionSelect": {}, "menuActionSelectAll": "모두 선택", + "@menuActionSelectAll": {}, "menuActionSelectNone": "모두 해제", + "@menuActionSelectNone": {}, "menuActionMap": "지도", + "@menuActionMap": {}, "menuActionSlideshow": "슬라이드쇼", + "@menuActionSlideshow": {}, "menuActionStats": "통계", - + "@menuActionStats": {}, "viewDialogSortSectionTitle": "정렬", + "@viewDialogSortSectionTitle": {}, "viewDialogGroupSectionTitle": "묶음", + "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "배치", + "@viewDialogLayoutSectionTitle": {}, "viewDialogReverseSortOrder": "순서를 뒤바꾸기", - + "@viewDialogReverseSortOrder": {}, "tileLayoutMosaic": "모자이크", + "@tileLayoutMosaic": {}, "tileLayoutGrid": "바둑판", + "@tileLayoutGrid": {}, "tileLayoutList": "목록", - + "@tileLayoutList": {}, "coverDialogTabCover": "이미지", + "@coverDialogTabCover": {}, "coverDialogTabApp": "앱", + "@coverDialogTabApp": {}, "coverDialogTabColor": "색깔", - + "@coverDialogTabColor": {}, "appPickDialogTitle": "앱 선택", + "@appPickDialogTitle": {}, "appPickDialogNone": "없음", - + "@appPickDialogNone": {}, "aboutPageTitle": "앱 정보", + "@aboutPageTitle": {}, "aboutLinkLicense": "라이선스", + "@aboutLinkLicense": {}, "aboutLinkPolicy": "개인정보 보호정책", - + "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "버그 보고", + "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "앱 로그를 파일에 저장하기", + "@aboutBugSaveLogInstruction": {}, "aboutBugCopyInfoInstruction": "시스템 정보를 복사하기", + "@aboutBugCopyInfoInstruction": {}, "aboutBugCopyInfoButton": "복사", + "@aboutBugCopyInfoButton": {}, "aboutBugReportInstruction": "로그와 시스템 정보를 첨부하여 GitHub에서 이슈를 제출하기", + "@aboutBugReportInstruction": {}, "aboutBugReportButton": "제출", - + "@aboutBugReportButton": {}, "aboutCreditsSectionTitle": "크레딧", + "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "이 앱은", + "@aboutCreditsWorldAtlas1": {}, "aboutCreditsWorldAtlas2": "의 TopoJSON 파일(ISC 라이선스)을 이용합니다.", + "@aboutCreditsWorldAtlas2": {}, "aboutTranslatorsSectionTitle": "번역가", - + "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "오픈 소스 라이선스", + "@aboutLicensesSectionTitle": {}, "aboutLicensesBanner": "이 앱은 다음의 오픈 소스 패키지와 라이브러리를 이용합니다.", + "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "안드로이드 라이브러리", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, "aboutLicensesFlutterPluginsSectionTitle": "플러터 플러그인", + "@aboutLicensesFlutterPluginsSectionTitle": {}, "aboutLicensesFlutterPackagesSectionTitle": "플러터 패키지", + "@aboutLicensesFlutterPackagesSectionTitle": {}, "aboutLicensesDartPackagesSectionTitle": "다트 패키지", + "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "라이선스 모두 보기", - + "@aboutLicensesShowAllButtonLabel": {}, "policyPageTitle": "개인정보 보호정책", - + "@policyPageTitle": {}, "collectionPageTitle": "미디어", + "@collectionPageTitle": {}, "collectionPickPageTitle": "항목 선택", + "@collectionPickPageTitle": {}, "collectionSelectPageTitle": "항목 선택", - + "@collectionSelectPageTitle": {}, "collectionActionShowTitleSearch": "제목 필터 보기", + "@collectionActionShowTitleSearch": {}, "collectionActionHideTitleSearch": "제목 필터 숨기기", + "@collectionActionHideTitleSearch": {}, "collectionActionAddShortcut": "홈 화면에 추가", + "@collectionActionAddShortcut": {}, "collectionActionEmptyBin": "휴지통 비우기", + "@collectionActionEmptyBin": {}, "collectionActionCopy": "앨범으로 복사", + "@collectionActionCopy": {}, "collectionActionMove": "앨범으로 이동", + "@collectionActionMove": {}, "collectionActionRescan": "새로 분석", + "@collectionActionRescan": {}, "collectionActionEdit": "편집", - + "@collectionActionEdit": {}, "collectionSearchTitlesHintText": "제목 검색", - + "@collectionSearchTitlesHintText": {}, "collectionGroupAlbum": "앨범별로", + "@collectionGroupAlbum": {}, "collectionGroupMonth": "월별로", + "@collectionGroupMonth": {}, "collectionGroupDay": "날짜별로", + "@collectionGroupDay": {}, "collectionGroupNone": "묶음 없음", - + "@collectionGroupNone": {}, "sectionUnknown": "없음", + "@sectionUnknown": {}, "dateToday": "오늘", + "@dateToday": {}, "dateYesterday": "어제", + "@dateYesterday": {}, "dateThisMonth": "이번 달", + "@dateThisMonth": {}, "collectionDeleteFailureFeedback": "{count, plural, other{항목 {count}개를 삭제하지 못했습니다}}", + "@collectionDeleteFailureFeedback": {}, "collectionCopyFailureFeedback": "{count, plural, other{항목 {count}개를 복사하지 못했습니다}}", + "@collectionCopyFailureFeedback": {}, "collectionMoveFailureFeedback": "{count, plural, other{항목 {count}개를 이동하지 못했습니다}}", + "@collectionMoveFailureFeedback": {}, "collectionRenameFailureFeedback": "{count, plural, other{항목 {count}개의 이름을 변경하지 못했습니다}}", + "@collectionRenameFailureFeedback": {}, "collectionEditFailureFeedback": "{count, plural, other{항목 {count}개를 편집하지 못했습니다}}", + "@collectionEditFailureFeedback": {}, "collectionExportFailureFeedback": "{count, plural, other{항목 {count}개를 내보내지 못했습니다}}", + "@collectionExportFailureFeedback": {}, "collectionCopySuccessFeedback": "{count, plural, other{항목 {count}개를 복사했습니다}}", + "@collectionCopySuccessFeedback": {}, "collectionMoveSuccessFeedback": "{count, plural, other{항목 {count}개를 이동했습니다}}", + "@collectionMoveSuccessFeedback": {}, "collectionRenameSuccessFeedback": "{count, plural, other{항목 {count}개의 이름을 변경했습니다}}", + "@collectionRenameSuccessFeedback": {}, "collectionEditSuccessFeedback": "{count, plural, other{항목 {count}개를 편집했습니다}}", - + "@collectionEditSuccessFeedback": {}, "collectionEmptyFavourites": "즐겨찾기가 없습니다", + "@collectionEmptyFavourites": {}, "collectionEmptyVideos": "동영상이 없습니다", + "@collectionEmptyVideos": {}, "collectionEmptyImages": "사진이 없습니다", + "@collectionEmptyImages": {}, "collectionEmptyGrantAccessButtonLabel": "접근 허용", - + "@collectionEmptyGrantAccessButtonLabel": {}, "collectionSelectSectionTooltip": "묶음 선택", + "@collectionSelectSectionTooltip": {}, "collectionDeselectSectionTooltip": "묶음 선택 해제", - + "@collectionDeselectSectionTooltip": {}, "drawerAboutButton": "앱 정보", + "@drawerAboutButton": {}, "drawerSettingsButton": "설정", + "@drawerSettingsButton": {}, "drawerCollectionAll": "모든 미디어", + "@drawerCollectionAll": {}, "drawerCollectionFavourites": "즐겨찾기", + "@drawerCollectionFavourites": {}, "drawerCollectionImages": "사진", + "@drawerCollectionImages": {}, "drawerCollectionVideos": "동영상", + "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "애니메이션", + "@drawerCollectionAnimated": {}, "drawerCollectionMotionPhotos": "모션 사진", + "@drawerCollectionMotionPhotos": {}, "drawerCollectionPanoramas": "파노라마", + "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "Raw 이미지", + "@drawerCollectionRaws": {}, "drawerCollectionSphericalVideos": "360° 동영상", + "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "앨범", + "@drawerAlbumPage": {}, "drawerCountryPage": "국가", + "@drawerCountryPage": {}, "drawerTagPage": "태그", - + "@drawerTagPage": {}, "sortByDate": "날짜", + "@sortByDate": {}, "sortByName": "이름", + "@sortByName": {}, "sortByItemCount": "항목수", + "@sortByItemCount": {}, "sortBySize": "크기", + "@sortBySize": {}, "sortByAlbumFileName": "이름", + "@sortByAlbumFileName": {}, "sortByRating": "별점", - + "@sortByRating": {}, "sortOrderNewestFirst": "최근 날짜순", + "@sortOrderNewestFirst": {}, "sortOrderOldestFirst": "오래된 날짜순", + "@sortOrderOldestFirst": {}, "sortOrderAtoZ": "A~Z", + "@sortOrderAtoZ": {}, "sortOrderZtoA": "Z~A", + "@sortOrderZtoA": {}, "sortOrderHighestFirst": "높은 별점순", + "@sortOrderHighestFirst": {}, "sortOrderLowestFirst": "낮은 별점순", + "@sortOrderLowestFirst": {}, "sortOrderLargestFirst": "큰 파일순", + "@sortOrderLargestFirst": {}, "sortOrderSmallestFirst": "작은 파일순", - + "@sortOrderSmallestFirst": {}, "albumGroupTier": "단계별로", + "@albumGroupTier": {}, "albumGroupType": "유형별로", + "@albumGroupType": {}, "albumGroupVolume": "저장공간별로", + "@albumGroupVolume": {}, "albumGroupNone": "묶음 없음", - + "@albumGroupNone": {}, "albumMimeTypeMixed": "혼합", - + "@albumMimeTypeMixed": {}, "albumPickPageTitleCopy": "앨범으로 복사", + "@albumPickPageTitleCopy": {}, "albumPickPageTitleExport": "앨범으로 내보내기", + "@albumPickPageTitleExport": {}, "albumPickPageTitleMove": "앨범으로 이동", + "@albumPickPageTitleMove": {}, "albumPickPageTitlePick": "앨범 선택", - + "@albumPickPageTitlePick": {}, "albumCamera": "카메라", + "@albumCamera": {}, "albumDownload": "다운로드", + "@albumDownload": {}, "albumScreenshots": "스크린샷", + "@albumScreenshots": {}, "albumScreenRecordings": "화면 녹화 파일", + "@albumScreenRecordings": {}, "albumVideoCaptures": "동영상 캡처", - + "@albumVideoCaptures": {}, "albumPageTitle": "앨범", + "@albumPageTitle": {}, "albumEmpty": "앨범이 없습니다", + "@albumEmpty": {}, "createAlbumTooltip": "앨범 만들기", + "@createAlbumTooltip": {}, "createAlbumButtonLabel": "추가", + "@createAlbumButtonLabel": {}, "newFilterBanner": "신규", - + "@newFilterBanner": {}, "countryPageTitle": "국가", + "@countryPageTitle": {}, "countryEmpty": "국가가 없습니다", - + "@countryEmpty": {}, "tagPageTitle": "태그", + "@tagPageTitle": {}, "tagEmpty": "태그가 없습니다", - + "@tagEmpty": {}, "binPageTitle": "휴지통", - + "@binPageTitle": {}, "searchCollectionFieldHint": "미디어 검색", + "@searchCollectionFieldHint": {}, "searchRecentSectionTitle": "최근 검색기록", + "@searchRecentSectionTitle": {}, "searchDateSectionTitle": "날짜", + "@searchDateSectionTitle": {}, "searchAlbumsSectionTitle": "앨범", + "@searchAlbumsSectionTitle": {}, "searchCountriesSectionTitle": "국가", + "@searchCountriesSectionTitle": {}, "searchPlacesSectionTitle": "장소", + "@searchPlacesSectionTitle": {}, "searchTagsSectionTitle": "태그", + "@searchTagsSectionTitle": {}, "searchRatingSectionTitle": "별점", + "@searchRatingSectionTitle": {}, "searchMetadataSectionTitle": "메타데이터", - + "@searchMetadataSectionTitle": {}, "settingsPageTitle": "설정", + "@settingsPageTitle": {}, "settingsSystemDefault": "시스템 기본값", + "@settingsSystemDefault": {}, "settingsDefault": "기본", + "@settingsDefault": {}, "settingsDisabled": "사용 안함", - + "@settingsDisabled": {}, "settingsSearchFieldLabel": "설정 검색", + "@settingsSearchFieldLabel": {}, "settingsSearchEmpty": "결과가 없습니다", + "@settingsSearchEmpty": {}, "settingsActionExport": "내보내기", + "@settingsActionExport": {}, "settingsActionExportDialogTitle": "내보내기", + "@settingsActionExportDialogTitle": {}, "settingsActionImport": "가져오기", + "@settingsActionImport": {}, "settingsActionImportDialogTitle": "가져오기", - + "@settingsActionImportDialogTitle": {}, "appExportCovers": "대표 이미지", + "@appExportCovers": {}, "appExportFavourites": "즐겨찾기", + "@appExportFavourites": {}, "appExportSettings": "설정", - + "@appExportSettings": {}, "settingsNavigationSectionTitle": "탐색", + "@settingsNavigationSectionTitle": {}, "settingsHomeTile": "홈", + "@settingsHomeTile": {}, "settingsHomeDialogTitle": "홈", + "@settingsHomeDialogTitle": {}, "settingsShowBottomNavigationBar": "하단 탐색 모음 표시", + "@settingsShowBottomNavigationBar": {}, "settingsKeepScreenOnTile": "화면 자동 꺼짐 방지", + "@settingsKeepScreenOnTile": {}, "settingsKeepScreenOnDialogTitle": "화면 자동 꺼짐 방지", + "@settingsKeepScreenOnDialogTitle": {}, "settingsDoubleBackExit": "뒤로가기 두번 눌러 앱 종료하기", - + "@settingsDoubleBackExit": {}, "settingsConfirmationTile": "확정 대화상자", + "@settingsConfirmationTile": {}, "settingsConfirmationDialogTitle": "확정 대화상자", + "@settingsConfirmationDialogTitle": {}, "settingsConfirmationBeforeDeleteItems": "항목을 완전히 삭제 시", + "@settingsConfirmationBeforeDeleteItems": {}, "settingsConfirmationBeforeMoveToBinItems": "항목을 휴지통으로 이동 시", + "@settingsConfirmationBeforeMoveToBinItems": {}, "settingsConfirmationBeforeMoveUndatedItems": "날짜가 지정되지 않은 항목을 이동 시", + "@settingsConfirmationBeforeMoveUndatedItems": {}, "settingsConfirmationAfterMoveToBinItems": "항목을 휴지통으로 이동 후", - + "@settingsConfirmationAfterMoveToBinItems": {}, "settingsNavigationDrawerTile": "탐색 메뉴", + "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "탐색 메뉴", + "@settingsNavigationDrawerEditorPageTitle": {}, "settingsNavigationDrawerBanner": "항목을 길게 누른 후 이동하여 탐색 메뉴에 표시될 항목의 순서를 수정하세요.", + "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "유형", + "@settingsNavigationDrawerTabTypes": {}, "settingsNavigationDrawerTabAlbums": "앨범", + "@settingsNavigationDrawerTabAlbums": {}, "settingsNavigationDrawerTabPages": "페이지", + "@settingsNavigationDrawerTabPages": {}, "settingsNavigationDrawerAddAlbum": "앨범 추가", - + "@settingsNavigationDrawerAddAlbum": {}, "settingsThumbnailSectionTitle": "섬네일", + "@settingsThumbnailSectionTitle": {}, "settingsThumbnailOverlayTile": "오버레이", + "@settingsThumbnailOverlayTile": {}, "settingsThumbnailOverlayPageTitle": "오버레이", + "@settingsThumbnailOverlayPageTitle": {}, "settingsThumbnailShowFavouriteIcon": "즐겨찾기 아이콘 표시", + "@settingsThumbnailShowFavouriteIcon": {}, "settingsThumbnailShowTagIcon": "태그 아이콘 표시", + "@settingsThumbnailShowTagIcon": {}, "settingsThumbnailShowLocationIcon": "위치 아이콘 표시", + "@settingsThumbnailShowLocationIcon": {}, "settingsThumbnailShowMotionPhotoIcon": "모션 사진 아이콘 표시", + "@settingsThumbnailShowMotionPhotoIcon": {}, "settingsThumbnailShowRating": "별점 표시", + "@settingsThumbnailShowRating": {}, "settingsThumbnailShowRawIcon": "Raw 아이콘 표시", + "@settingsThumbnailShowRawIcon": {}, "settingsThumbnailShowVideoDuration": "동영상 길이 표시", - + "@settingsThumbnailShowVideoDuration": {}, "settingsCollectionQuickActionsTile": "빠른 작업", + "@settingsCollectionQuickActionsTile": {}, "settingsCollectionQuickActionEditorPageTitle": "빠른 작업", + "@settingsCollectionQuickActionEditorPageTitle": {}, "settingsCollectionQuickActionTabBrowsing": "탐색 시", + "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "선택 시", + "@settingsCollectionQuickActionTabSelecting": {}, "settingsCollectionBrowsingQuickActionEditorBanner": "버튼을 길게 누른 후 이동하여 항목 탐색할 때 표시될 버튼을 선택하세요.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "버튼을 길게 누른 후 이동하여 항목 선택할 때 표시될 버튼을 선택하세요.", - + "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "뷰어", + "@settingsViewerSectionTitle": {}, "settingsViewerGestureSideTapNext": "화면 측면에서 탭해서 이전/다음 항목 보기", + "@settingsViewerGestureSideTapNext": {}, "settingsViewerUseCutout": "컷아웃 영역 사용", + "@settingsViewerUseCutout": {}, "settingsViewerMaximumBrightness": "최대 밝기", + "@settingsViewerMaximumBrightness": {}, "settingsMotionPhotoAutoPlay": "모션 사진 자동 재생", + "@settingsMotionPhotoAutoPlay": {}, "settingsImageBackground": "이미지 배경", - + "@settingsImageBackground": {}, "settingsViewerQuickActionsTile": "빠른 작업", + "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "빠른 작업", + "@settingsViewerQuickActionEditorPageTitle": {}, "settingsViewerQuickActionEditorBanner": "버튼을 길게 누른 후 이동하여 뷰어에 표시될 버튼을 선택하세요.", + "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "표시될 버튼", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "추가 가능한 버튼", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, "settingsViewerQuickActionEmpty": "버튼이 없습니다", - + "@settingsViewerQuickActionEmpty": {}, "settingsViewerOverlayTile": "오버레이", + "@settingsViewerOverlayTile": {}, "settingsViewerOverlayPageTitle": "오버레이", + "@settingsViewerOverlayPageTitle": {}, "settingsViewerShowOverlayOnOpening": "열릴 때 표시", + "@settingsViewerShowOverlayOnOpening": {}, "settingsViewerShowMinimap": "미니맵 표시", + "@settingsViewerShowMinimap": {}, "settingsViewerShowInformation": "상세 정보 표시", + "@settingsViewerShowInformation": {}, "settingsViewerShowInformationSubtitle": "제목, 날짜, 장소 등 표시", + "@settingsViewerShowInformationSubtitle": {}, "settingsViewerShowShootingDetails": "촬영 정보 표시", + "@settingsViewerShowShootingDetails": {}, "settingsViewerShowOverlayThumbnails": "섬네일 표시", + "@settingsViewerShowOverlayThumbnails": {}, "settingsViewerEnableOverlayBlurEffect": "흐림 효과", - + "@settingsViewerEnableOverlayBlurEffect": {}, "settingsViewerSlideshowTile": "슬라이드쇼", + "@settingsViewerSlideshowTile": {}, "settingsViewerSlideshowPageTitle": "슬라이드쇼", + "@settingsViewerSlideshowPageTitle": {}, "settingsSlideshowRepeat": "반복", + "@settingsSlideshowRepeat": {}, "settingsSlideshowShuffle": "순서섞기", + "@settingsSlideshowShuffle": {}, "settingsSlideshowFillScreen": "화면 채우기", + "@settingsSlideshowFillScreen": {}, "settingsSlideshowAnimatedZoomEffect": "애니메이션 확대/축소 효과", + "@settingsSlideshowAnimatedZoomEffect": {}, "settingsSlideshowTransitionTile": "전환 효과", + "@settingsSlideshowTransitionTile": {}, "settingsSlideshowIntervalTile": "교체 주기", + "@settingsSlideshowIntervalTile": {}, "settingsSlideshowVideoPlaybackTile": "동영상 재생", + "@settingsSlideshowVideoPlaybackTile": {}, "settingsSlideshowVideoPlaybackDialogTitle": "동영상 재생", - + "@settingsSlideshowVideoPlaybackDialogTitle": {}, "settingsVideoPageTitle": "동영상 설정", + "@settingsVideoPageTitle": {}, "settingsVideoSectionTitle": "동영상", + "@settingsVideoSectionTitle": {}, "settingsVideoShowVideos": "미디어에 동영상 표시", + "@settingsVideoShowVideos": {}, "settingsVideoEnableHardwareAcceleration": "하드웨어 가속", + "@settingsVideoEnableHardwareAcceleration": {}, "settingsVideoAutoPlay": "자동 재생", + "@settingsVideoAutoPlay": {}, "settingsVideoLoopModeTile": "반복 모드", + "@settingsVideoLoopModeTile": {}, "settingsVideoLoopModeDialogTitle": "반복 모드", - + "@settingsVideoLoopModeDialogTitle": {}, "settingsSubtitleThemeTile": "자막", + "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "자막", + "@settingsSubtitleThemePageTitle": {}, "settingsSubtitleThemeSample": "샘플입니다.", + "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "정렬", + "@settingsSubtitleThemeTextAlignmentTile": {}, "settingsSubtitleThemeTextAlignmentDialogTitle": "정렬", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, "settingsSubtitleThemeTextSize": "글자 크기", + "@settingsSubtitleThemeTextSize": {}, "settingsSubtitleThemeShowOutline": "윤곽 및 그림자 표시", + "@settingsSubtitleThemeShowOutline": {}, "settingsSubtitleThemeTextColor": "글자 색상", + "@settingsSubtitleThemeTextColor": {}, "settingsSubtitleThemeTextOpacity": "글자 투명도", + "@settingsSubtitleThemeTextOpacity": {}, "settingsSubtitleThemeBackgroundColor": "배경 색상", + "@settingsSubtitleThemeBackgroundColor": {}, "settingsSubtitleThemeBackgroundOpacity": "배경 투명도", + "@settingsSubtitleThemeBackgroundOpacity": {}, "settingsSubtitleThemeTextAlignmentLeft": "왼쪽", + "@settingsSubtitleThemeTextAlignmentLeft": {}, "settingsSubtitleThemeTextAlignmentCenter": "가운데", + "@settingsSubtitleThemeTextAlignmentCenter": {}, "settingsSubtitleThemeTextAlignmentRight": "오른쪽", - + "@settingsSubtitleThemeTextAlignmentRight": {}, "settingsVideoControlsTile": "제어", + "@settingsVideoControlsTile": {}, "settingsVideoControlsPageTitle": "제어", + "@settingsVideoControlsPageTitle": {}, "settingsVideoButtonsTile": "버튼", + "@settingsVideoButtonsTile": {}, "settingsVideoGestureDoubleTapTogglePlay": "두 번 탭해서 재생이나 일시정지하기", + "@settingsVideoGestureDoubleTapTogglePlay": {}, "settingsVideoGestureSideDoubleTapSeek": "화면 측면에서 두 번 탭해서 앞뒤로 가기", - + "@settingsVideoGestureSideDoubleTapSeek": {}, "settingsPrivacySectionTitle": "개인정보 보호", + "@settingsPrivacySectionTitle": {}, "settingsAllowInstalledAppAccess": "설치된 앱의 목록 접근 허용", + "@settingsAllowInstalledAppAccess": {}, "settingsAllowInstalledAppAccessSubtitle": "앨범 표시 개선을 위해", + "@settingsAllowInstalledAppAccessSubtitle": {}, "settingsAllowErrorReporting": "오류 보고서 보내기", + "@settingsAllowErrorReporting": {}, "settingsSaveSearchHistory": "검색기록", + "@settingsSaveSearchHistory": {}, "settingsEnableBin": "휴지통 사용", + "@settingsEnableBin": {}, "settingsEnableBinSubtitle": "삭제한 항목을 30일 동안 보관하기", - + "@settingsEnableBinSubtitle": {}, "settingsHiddenItemsTile": "숨겨진 항목", + "@settingsHiddenItemsTile": {}, "settingsHiddenItemsPageTitle": "숨겨진 항목", - + "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "숨겨진 필터", + "@settingsHiddenItemsTabFilters": {}, "settingsHiddenFiltersBanner": "이 필터에 맞는 사진과 동영상이 숨겨지고 있으며 이 앱에서 보여지지 않을 것입니다.", + "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "숨겨진 필터가 없습니다", - + "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "숨겨진 경로", + "@settingsHiddenItemsTabPaths": {}, "settingsHiddenPathsBanner": "이 경로에 있는 사진과 동영상이 숨겨지고 있으며 이 앱에서 보여지지 않을 것입니다.", + "@settingsHiddenPathsBanner": {}, "addPathTooltip": "경로 추가", - + "@addPathTooltip": {}, "settingsStorageAccessTile": "저장공간 접근", + "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "저장공간 접근", + "@settingsStorageAccessPageTitle": {}, "settingsStorageAccessBanner": "어떤 폴더는 사용자의 허용을 받아야만 앱이 파일에 접근이 가능합니다. 이 화면에 허용을 받은 폴더를 확인할 수 있으며 원하지 않으면 취소할 수 있습니다.", + "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "접근 허용이 없습니다", + "@settingsStorageAccessEmpty": {}, "settingsStorageAccessRevokeTooltip": "취소", - + "@settingsStorageAccessRevokeTooltip": {}, "settingsAccessibilitySectionTitle": "접근성", + "@settingsAccessibilitySectionTitle": {}, "settingsRemoveAnimationsTile": "애니메이션 삭제", + "@settingsRemoveAnimationsTile": {}, "settingsRemoveAnimationsDialogTitle": "애니메이션 삭제", + "@settingsRemoveAnimationsDialogTitle": {}, "settingsTimeToTakeActionTile": "액션 취하기 전 대기 시간", - + "@settingsTimeToTakeActionTile": {}, "settingsDisplaySectionTitle": "디스플레이", + "@settingsDisplaySectionTitle": {}, "settingsThemeBrightnessTile": "테마", + "@settingsThemeBrightnessTile": {}, "settingsThemeBrightnessDialogTitle": "테마", + "@settingsThemeBrightnessDialogTitle": {}, "settingsThemeColorHighlights": "색 강조", + "@settingsThemeColorHighlights": {}, "settingsThemeEnableDynamicColor": "동적 색상", + "@settingsThemeEnableDynamicColor": {}, "settingsDisplayRefreshRateModeTile": "화면 재생률", + "@settingsDisplayRefreshRateModeTile": {}, "settingsDisplayRefreshRateModeDialogTitle": "화면 재생률", - + "@settingsDisplayRefreshRateModeDialogTitle": {}, "settingsLanguageSectionTitle": "언어 및 표시 형식", + "@settingsLanguageSectionTitle": {}, "settingsLanguageTile": "언어", + "@settingsLanguageTile": {}, "settingsLanguagePageTitle": "언어", + "@settingsLanguagePageTitle": {}, "settingsCoordinateFormatTile": "좌표 표현", + "@settingsCoordinateFormatTile": {}, "settingsCoordinateFormatDialogTitle": "좌표 표현", + "@settingsCoordinateFormatDialogTitle": {}, "settingsUnitSystemTile": "단위법", + "@settingsUnitSystemTile": {}, "settingsUnitSystemDialogTitle": "단위법", - + "@settingsUnitSystemDialogTitle": {}, "settingsScreenSaverPageTitle": "화면보호기", - + "@settingsScreenSaverPageTitle": {}, "settingsWidgetPageTitle": "사진 액자", + "@settingsWidgetPageTitle": {}, "settingsWidgetShowOutline": "윤곽", + "@settingsWidgetShowOutline": {}, "settingsWidgetOpenPage": "위젯을 탭하면", - + "@settingsWidgetOpenPage": {}, "settingsCollectionTile": "미디어", - + "@settingsCollectionTile": {}, "statsPageTitle": "통계", + "@statsPageTitle": {}, "statsWithGps": "{count, plural, other{{count}개 위치가 있음}}", + "@statsWithGps": {}, "statsTopCountriesSectionTitle": "국가 랭킹", + "@statsTopCountriesSectionTitle": {}, "statsTopPlacesSectionTitle": "장소 랭킹", + "@statsTopPlacesSectionTitle": {}, "statsTopTagsSectionTitle": "태그 랭킹", + "@statsTopTagsSectionTitle": {}, "statsTopAlbumsSectionTitle": "앨범 랭킹", - + "@statsTopAlbumsSectionTitle": {}, "viewerOpenPanoramaButtonLabel": "파노라마 열기", + "@viewerOpenPanoramaButtonLabel": {}, "viewerSetWallpaperButtonLabel": "설정", + "@viewerSetWallpaperButtonLabel": {}, "viewerErrorUnknown": "아이구!", + "@viewerErrorUnknown": {}, "viewerErrorDoesNotExist": "파일이 존재하지 않습니다.", - + "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "상세정보", + "@viewerInfoPageTitle": {}, "viewerInfoBackToViewerTooltip": "뷰어로", - + "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "알 수 없음", + "@viewerInfoUnknown": {}, "viewerInfoLabelDescription": "설명", + "@viewerInfoLabelDescription": {}, "viewerInfoLabelTitle": "제목", + "@viewerInfoLabelTitle": {}, "viewerInfoLabelDate": "날짜", + "@viewerInfoLabelDate": {}, "viewerInfoLabelResolution": "해상도", + "@viewerInfoLabelResolution": {}, "viewerInfoLabelSize": "크기", + "@viewerInfoLabelSize": {}, "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, "viewerInfoLabelPath": "경로", + "@viewerInfoLabelPath": {}, "viewerInfoLabelDuration": "길이", + "@viewerInfoLabelDuration": {}, "viewerInfoLabelOwner": "패키지", + "@viewerInfoLabelOwner": {}, "viewerInfoLabelCoordinates": "좌표", + "@viewerInfoLabelCoordinates": {}, "viewerInfoLabelAddress": "주소", - + "@viewerInfoLabelAddress": {}, "mapStyleDialogTitle": "지도 유형", + "@mapStyleDialogTitle": {}, "mapStyleTooltip": "지도 유형 선택", + "@mapStyleTooltip": {}, "mapZoomInTooltip": "확대", + "@mapZoomInTooltip": {}, "mapZoomOutTooltip": "축소", + "@mapZoomOutTooltip": {}, "mapPointNorthUpTooltip": "북쪽을 위로 가리키기", + "@mapPointNorthUpTooltip": {}, "mapAttributionOsmHot": "지도 데이터 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 기여자 • 타일 [HOT](https://www.hotosm.org/) • 호스팅 [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, "mapAttributionStamen": "지도 데이터 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 기여자 • 타일 [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, "openMapPageTooltip": "지도 페이지에서 보기", + "@openMapPageTooltip": {}, "mapEmptyRegion": "이 지역의 사진이 없습니다", - + "@mapEmptyRegion": {}, "viewerInfoOpenEmbeddedFailureFeedback": "첨부 데이터 추출 오류", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, "viewerInfoOpenLinkText": "열기", + "@viewerInfoOpenLinkText": {}, "viewerInfoViewXmlLinkText": "XML 보기", - + "@viewerInfoViewXmlLinkText": {}, "viewerInfoSearchFieldLabel": "메타데이터 검색", + "@viewerInfoSearchFieldLabel": {}, "viewerInfoSearchEmpty": "결과가 없습니다", + "@viewerInfoSearchEmpty": {}, "viewerInfoSearchSuggestionDate": "날짜 및 시간", + "@viewerInfoSearchSuggestionDate": {}, "viewerInfoSearchSuggestionDescription": "설명", + "@viewerInfoSearchSuggestionDescription": {}, "viewerInfoSearchSuggestionDimensions": "크기", + "@viewerInfoSearchSuggestionDimensions": {}, "viewerInfoSearchSuggestionResolution": "해상도", + "@viewerInfoSearchSuggestionResolution": {}, "viewerInfoSearchSuggestionRights": "권리", - + "@viewerInfoSearchSuggestionRights": {}, "wallpaperUseScrollEffect": "홈 화면에 스크롤 효과 사용", - + "@wallpaperUseScrollEffect": {}, "tagEditorPageTitle": "태그 수정", + "@tagEditorPageTitle": {}, "tagEditorPageNewTagFieldLabel": "새 태그", + "@tagEditorPageNewTagFieldLabel": {}, "tagEditorPageAddTagTooltip": "태그 추가", + "@tagEditorPageAddTagTooltip": {}, "tagEditorSectionRecent": "최근 이용기록", - + "@tagEditorSectionRecent": {}, "panoramaEnableSensorControl": "센서 제어 활성화", + "@panoramaEnableSensorControl": {}, "panoramaDisableSensorControl": "센서 제어 비활성화", - + "@panoramaDisableSensorControl": {}, "sourceViewerPageTitle": "소스 코드", - + "@sourceViewerPageTitle": {}, "filePickerShowHiddenFiles": "숨겨진 파일 표시", + "@filePickerShowHiddenFiles": {}, "filePickerDoNotShowHiddenFiles": "숨겨진 파일 표시 안함", + "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "다음에서 열기:", + "@filePickerOpenFrom": {}, "filePickerNoItems": "항목 없음", - "filePickerUseThisFolder": "이 폴더 사용" + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "이 폴더 사용", + "@filePickerUseThisFolder": {} } diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 271f254b2..1e59e2209 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -1,694 +1,1146 @@ { "appName": "Aves", + "@appName": {}, "welcomeMessage": "Welkom bij Aves", + "@welcomeMessage": {}, "welcomeOptional": "Optioneel", + "@welcomeOptional": {}, "welcomeTermsToggle": "Ik ga akkoord met de voorwaarden", + "@welcomeTermsToggle": {}, "itemCount": "{count, plural, =1{1 item} other{{count} items}}", - + "@itemCount": {}, "timeSeconds": "{seconds, plural, =1{1 seconde} other{{seconds} seconden}}", + "@timeSeconds": {}, "timeMinutes": "{minutes, plural, =1{1 minuut} other{{minutes} minuten}}", + "@timeMinutes": {}, "timeDays": "{days, plural, =1{1 dag} other{{days} dagen}}", + "@timeDays": {}, "focalLength": "{length} mm", - + "@focalLength": {}, "applyButtonLabel": "TOEPASSEN", + "@applyButtonLabel": {}, "deleteButtonLabel": "VERWIJDEREN", + "@deleteButtonLabel": {}, "nextButtonLabel": "VOLGENDE", + "@nextButtonLabel": {}, "showButtonLabel": "TONEN", + "@showButtonLabel": {}, "hideButtonLabel": "VERBERGEN", + "@hideButtonLabel": {}, "continueButtonLabel": "VERDER", - + "@continueButtonLabel": {}, "cancelTooltip": "Annuleren", + "@cancelTooltip": {}, "changeTooltip": "Aanpassen", + "@changeTooltip": {}, "clearTooltip": "Leegmaken", + "@clearTooltip": {}, "previousTooltip": "Vorige", + "@previousTooltip": {}, "nextTooltip": "Volgende", + "@nextTooltip": {}, "showTooltip": "Tonen", + "@showTooltip": {}, "hideTooltip": "Verbergen", + "@hideTooltip": {}, "actionRemove": "Verwijderen", + "@actionRemove": {}, "resetTooltip": "Resetten", + "@resetTooltip": {}, "saveTooltip": "Opslaan", + "@saveTooltip": {}, "pickTooltip": "Kies", - + "@pickTooltip": {}, "doubleBackExitMessage": "Tap nogmaals “Terug” om te sluiten.", + "@doubleBackExitMessage": {}, "doNotAskAgain": "Niet opnieuw vragen", - + "@doNotAskAgain": {}, "sourceStateLoading": "Laden", + "@sourceStateLoading": {}, "sourceStateCataloguing": "Catalogiseren", + "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "Landen lokaliseren", + "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "Plaatsen lokaliseren", - + "@sourceStateLocatingPlaces": {}, "chipActionDelete": "Verwijderen", + "@chipActionDelete": {}, "chipActionGoToAlbumPage": "Tonen Albums", + "@chipActionGoToAlbumPage": {}, "chipActionGoToCountryPage": "Tonen in Landen", + "@chipActionGoToCountryPage": {}, "chipActionGoToTagPage": "Tonen in Labels", + "@chipActionGoToTagPage": {}, "chipActionFilterOut": "Uitfilteren", + "@chipActionFilterOut": {}, "chipActionFilterIn": "Infilteren", + "@chipActionFilterIn": {}, "chipActionHide": "Verbergen", + "@chipActionHide": {}, "chipActionPin": "Bovenaan pinnen", + "@chipActionPin": {}, "chipActionUnpin": "Unpinnen", + "@chipActionUnpin": {}, "chipActionRename": "Hernoemen", + "@chipActionRename": {}, "chipActionSetCover": "Album achtergrond instellen", + "@chipActionSetCover": {}, "chipActionCreateAlbum": "Album aanmaken", - + "@chipActionCreateAlbum": {}, "entryActionCopyToClipboard": "Kopiëren naar Clipboard", + "@entryActionCopyToClipboard": {}, "entryActionDelete": "Verwijderen", + "@entryActionDelete": {}, "entryActionConvert": "Converteren", + "@entryActionConvert": {}, "entryActionExport": "Exporteren", + "@entryActionExport": {}, "entryActionInfo": "Info", + "@entryActionInfo": {}, "entryActionRename": "Hernoemen", + "@entryActionRename": {}, "entryActionRestore": "Herstellen", + "@entryActionRestore": {}, "entryActionRotateCCW": "Roteren tegen de klok in", + "@entryActionRotateCCW": {}, "entryActionRotateCW": "Roteren met de klok mee", + "@entryActionRotateCW": {}, "entryActionFlip": "Horizontaal omdraaien", + "@entryActionFlip": {}, "entryActionPrint": "Printen", + "@entryActionPrint": {}, "entryActionShare": "Delen", + "@entryActionShare": {}, "entryActionViewSource": "Bron bekijken", + "@entryActionViewSource": {}, "entryActionShowGeoTiffOnMap": "Tonen als map overlay", + "@entryActionShowGeoTiffOnMap": {}, "entryActionConvertMotionPhotoToStillImage": "Converteren naar stilstaand beeld", + "@entryActionConvertMotionPhotoToStillImage": {}, "entryActionViewMotionPhotoVideo": "Video openen", + "@entryActionViewMotionPhotoVideo": {}, "entryActionEdit": "Bewerken", + "@entryActionEdit": {}, "entryActionOpen": "Openen als", + "@entryActionOpen": {}, "entryActionSetAs": "Instellen als", + "@entryActionSetAs": {}, "entryActionOpenMap": "Tonen in map app", + "@entryActionOpenMap": {}, "entryActionRotateScreen": "Scherm roteren", + "@entryActionRotateScreen": {}, "entryActionAddFavourite": "Toevoegen aan favorieten", + "@entryActionAddFavourite": {}, "entryActionRemoveFavourite": "Verwijderen uit favorieten", - + "@entryActionRemoveFavourite": {}, "videoActionCaptureFrame": "Frame opnemen", + "@videoActionCaptureFrame": {}, "videoActionMute": "Dempen", + "@videoActionMute": {}, "videoActionUnmute": "Dempen opheffen", + "@videoActionUnmute": {}, "videoActionPause": "Pauzeren", + "@videoActionPause": {}, "videoActionPlay": "Afspelen", + "@videoActionPlay": {}, "videoActionReplay10": "10 seconden terug", + "@videoActionReplay10": {}, "videoActionSkip10": "10 seconden vooruit", + "@videoActionSkip10": {}, "videoActionSelectStreams": "Tracks selecteren", + "@videoActionSelectStreams": {}, "videoActionSetSpeed": "Afspeelsnelheid", + "@videoActionSetSpeed": {}, "videoActionSettings": "Instellingen", - + "@videoActionSettings": {}, "slideshowActionResume": "Hervatten", + "@slideshowActionResume": {}, "slideshowActionShowInCollection": "Tonen in Collectie", - + "@slideshowActionShowInCollection": {}, "entryInfoActionEditDate": "Bewerk datum & tijd", + "@entryInfoActionEditDate": {}, "entryInfoActionEditLocation": "Bewerk locatie", + "@entryInfoActionEditLocation": {}, "entryInfoActionEditTitleDescription": "Wijzig titel & omschrijving", + "@entryInfoActionEditTitleDescription": {}, "entryInfoActionEditRating": "Bewerk waardering", + "@entryInfoActionEditRating": {}, "entryInfoActionEditTags": "Bewerk labels", + "@entryInfoActionEditTags": {}, "entryInfoActionRemoveMetadata": "Verwijder metadata", - + "@entryInfoActionRemoveMetadata": {}, "filterBinLabel": "Prullenbak", + "@filterBinLabel": {}, "filterFavouriteLabel": "Favorieten", + "@filterFavouriteLabel": {}, "filterNoDateLabel": "Geen datum", + "@filterNoDateLabel": {}, "filterNoLocationLabel": "Geen locatie", + "@filterNoLocationLabel": {}, "filterNoRatingLabel": "Geen rating", + "@filterNoRatingLabel": {}, "filterNoTagLabel": "Geen label", + "@filterNoTagLabel": {}, "filterNoTitleLabel": "Geen titel", + "@filterNoTitleLabel": {}, "filterOnThisDayLabel": "Op deze dag", + "@filterOnThisDayLabel": {}, "filterRecentlyAddedLabel": "Recent toegevoegd", + "@filterRecentlyAddedLabel": {}, "filterRatingRejectedLabel": "Afgekeurd", + "@filterRatingRejectedLabel": {}, "filterTypeAnimatedLabel": "Geanimeerd", + "@filterTypeAnimatedLabel": {}, "filterTypeMotionPhotoLabel": "Bewegende Foto", + "@filterTypeMotionPhotoLabel": {}, "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, "filterTypeSphericalVideoLabel": "360° Video", + "@filterTypeSphericalVideoLabel": {}, "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, "filterMimeImageLabel": "Afbeelding", + "@filterMimeImageLabel": {}, "filterMimeVideoLabel": "Video", - + "@filterMimeVideoLabel": {}, "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, "coordinateFormatDecimal": "Decimale graden", + "@coordinateFormatDecimal": {}, "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, "coordinateDmsWest": "W", - + "@coordinateDmsWest": {}, "unitSystemMetric": "Metrisch", + "@unitSystemMetric": {}, "unitSystemImperial": "Imperiaal", - + "@unitSystemImperial": {}, "videoLoopModeNever": "Nooit", + "@videoLoopModeNever": {}, "videoLoopModeShortOnly": "Enkel korte videos", + "@videoLoopModeShortOnly": {}, "videoLoopModeAlways": "Altijd", - + "@videoLoopModeAlways": {}, "videoControlsPlay": "Afspelen", + "@videoControlsPlay": {}, "videoControlsPlaySeek": "Speel & zoek terug/vooruit", + "@videoControlsPlaySeek": {}, "videoControlsPlayOutside": "Openen met andere speler", + "@videoControlsPlayOutside": {}, "videoControlsNone": "Geen", - + "@videoControlsNone": {}, "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, "mapStyleGoogleHybrid": "Google Maps (Hybride)", + "@mapStyleGoogleHybrid": {}, "mapStyleGoogleTerrain": "Google Maps (Terrein)", + "@mapStyleGoogleTerrain": {}, "mapStyleHuaweiNormal": "Petal Maps", + "@mapStyleHuaweiNormal": {}, "mapStyleHuaweiTerrain": "Petal Maps (Terrein)", + "@mapStyleHuaweiTerrain": {}, "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, "mapStyleStamenToner": "Stamen Toner", + "@mapStyleStamenToner": {}, "mapStyleStamenWatercolor": "Stamen Waterkleur", - + "@mapStyleStamenWatercolor": {}, "nameConflictStrategyRename": "Hernoemen", + "@nameConflictStrategyRename": {}, "nameConflictStrategyReplace": "Vervangen", + "@nameConflictStrategyReplace": {}, "nameConflictStrategySkip": "Overslaan", - + "@nameConflictStrategySkip": {}, "keepScreenOnNever": "Nooit", + "@keepScreenOnNever": {}, "keepScreenOnViewerOnly": "Enkel Viewer pagina", + "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "Altijd", - + "@keepScreenOnAlways": {}, "accessibilityAnimationsRemove": "Scherm effecten uitschakelen", + "@accessibilityAnimationsRemove": {}, "accessibilityAnimationsKeep": "Scherm effecten houden", - + "@accessibilityAnimationsKeep": {}, "displayRefreshRatePreferHighest": "Hoogste waardering", + "@displayRefreshRatePreferHighest": {}, "displayRefreshRatePreferLowest": "Laagste waardering", - + "@displayRefreshRatePreferLowest": {}, "videoPlaybackSkip": "Overslaan", + "@videoPlaybackSkip": {}, "videoPlaybackMuted": "Gedempte afspelen", + "@videoPlaybackMuted": {}, "videoPlaybackWithSound": "Met geluid afspelen", - + "@videoPlaybackWithSound": {}, "themeBrightnessLight": "Licht", + "@themeBrightnessLight": {}, "themeBrightnessDark": "Donker", + "@themeBrightnessDark": {}, "themeBrightnessBlack": "Zwart", - + "@themeBrightnessBlack": {}, "viewerTransitionSlide": "Slide", + "@viewerTransitionSlide": {}, "viewerTransitionParallax": "Parallax", + "@viewerTransitionParallax": {}, "viewerTransitionFade": "Vervagen", + "@viewerTransitionFade": {}, "viewerTransitionZoomIn": "Inzoomen", + "@viewerTransitionZoomIn": {}, "viewerTransitionNone": "Geen", - + "@viewerTransitionNone": {}, "wallpaperTargetHome": "Home scherm", + "@wallpaperTargetHome": {}, "wallpaperTargetLock": "Vergrendel scherm", + "@wallpaperTargetLock": {}, "wallpaperTargetHomeLock": "Home and Vergrendel schermen", - + "@wallpaperTargetHomeLock": {}, "widgetOpenPageHome": "Open startscherm", + "@widgetOpenPageHome": {}, "widgetOpenPageViewer": "Open viewer", - + "@widgetOpenPageViewer": {}, "albumTierNew": "Nieuw", + "@albumTierNew": {}, "albumTierPinned": "Gepint", + "@albumTierPinned": {}, "albumTierSpecial": "Veelgebruikt", + "@albumTierSpecial": {}, "albumTierApps": "Apps", + "@albumTierApps": {}, "albumTierRegular": "Overige", - + "@albumTierRegular": {}, "storageVolumeDescriptionFallbackPrimary": "Internale opslag", + "@storageVolumeDescriptionFallbackPrimary": {}, "storageVolumeDescriptionFallbackNonPrimary": "SD kaart", + "@storageVolumeDescriptionFallbackNonPrimary": {}, "rootDirectoryDescription": "root map", + "@rootDirectoryDescription": {}, "otherDirectoryDescription": "“{name}” map", + "@otherDirectoryDescription": {}, "storageAccessDialogMessage": "Selecteer de {directory} van “{volume}”, in het volgende scherm om deze app er toegang toe te geven.", + "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "Deze applicatie mag geen bestanden wijzigen in de {directory} van “{volume}”,.\n\n Gebruik een vooraf geïnstalleerde filemanager of galerij-app om de items naar een andere map te verplaatsen.", + "@restrictedAccessDialogMessage": {}, "notEnoughSpaceDialogMessage": "Deze bewerking heeft {neededSize} vrije ruimte op “{volume}”, nodig om te voltooien, maar er is nog slechts {freeSize} over.", + "@notEnoughSpaceDialogMessage": {}, "missingSystemFilePickerDialogMessage": "De systeembestandskiezer ontbreekt of is uitgeschakeld. Schakel het in en probeer het opnieuw.", - + "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, other{Deze bewerking wordt niet ondersteund voor items van het volgende bestandstype: {types}.}}", - + "@unsupportedTypeDialogMessage": {}, "nameConflictDialogSingleSourceMessage": "Sommige bestanden in de doelmap hebben dezelfde naam.", + "@nameConflictDialogSingleSourceMessage": {}, "nameConflictDialogMultipleSourceMessage": "Sommige bestanden hebben dezelfde naam.", - + "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "Label snelkoppeling", + "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "TOEVOEGEN", - + "@addShortcutButtonLabel": {}, "noMatchingAppDialogMessage": "Er zijn geen apps die dit ondersteunen.", - + "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{Dit item naar de prullenbak verplaatsen??} other{Verplaats deze {count} items naar de prullenbak?}}", + "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Verwijder dit item?} other{Verwijder deze {count} items?}}", + "@deleteEntriesConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogMessage": "Datums opslaan voordat u doorgaat??", + "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Datums opslaan", - + "@moveUndatedConfirmationDialogSetDate": {}, "videoResumeDialogMessage": "Wil je het afspelen hervatten op {time}?", + "@videoResumeDialogMessage": {}, "videoStartOverButtonLabel": "OPNIEUW BEGINNEN", + "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "HERVAT", - + "@videoResumeButtonLabel": {}, "setCoverDialogLatest": "Laatste item", + "@setCoverDialogLatest": {}, "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, "setCoverDialogCustom": "Aangepast", - - "hideFilterConfirmationDialogMessage": "Overeenkomende foto’s en video’s worden verborgen binnen uw verzameling. Je kunt ze opnieuw weergeven via de “Privacy”-instellingen.\n\nWeet je zeker dat je ze wilt verbergen", - + "@setCoverDialogCustom": {}, + "hideFilterConfirmationDialogMessage": "Overeenkomende foto’s en video’s worden verborgen binnen uw verzameling. Je kunt ze opnieuw weergeven via de “Privacy”-instellingen.\n\nWeet je zeker dat je ze wilt verbergen?", + "@hideFilterConfirmationDialogMessage": {}, "newAlbumDialogTitle": "Nieuw Album", + "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "Albumnaam", + "@newAlbumDialogNameLabel": {}, "newAlbumDialogNameLabelAlreadyExistsHelper": "Map bestaat al", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "Opslag:", - + "@newAlbumDialogStorageLabel": {}, "renameAlbumDialogLabel": "Nieuwe naam", + "@renameAlbumDialogLabel": {}, "renameAlbumDialogLabelAlreadyExistsHelper": "Map bestaat al", - + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, "renameEntrySetPageTitle": "Hernoemen", + "@renameEntrySetPageTitle": {}, "renameEntrySetPagePatternFieldLabel": "Naamgevingspatroon", + "@renameEntrySetPagePatternFieldLabel": {}, "renameEntrySetPageInsertTooltip": "Veld invoegen", + "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "Voorbeeld", - + "@renameEntrySetPagePreviewSectionTitle": {}, "renameProcessorCounter": "Teller", + "@renameProcessorCounter": {}, "renameProcessorName": "Naam", - + "@renameProcessorName": {}, "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Verwijder dit album en het item binnen dit album?} other{Verwijder dit album en de {count} items binnen dit album?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Verwijder deze albums en het item binnen deze albums?} other{Verwijder dit album en de {count} items binnen deze albums?}}", - + "@deleteMultiAlbumConfirmationDialogMessage": {}, "exportEntryDialogFormat": "Formaat:", + "@exportEntryDialogFormat": {}, "exportEntryDialogWidth": "Breedte", + "@exportEntryDialogWidth": {}, "exportEntryDialogHeight": "Hoogte", - + "@exportEntryDialogHeight": {}, "renameEntryDialogLabel": "Nieuwe naam", - + "@renameEntryDialogLabel": {}, "editEntryDialogTargetFieldsHeader": "Velden om aan te passen", - + "@editEntryDialogTargetFieldsHeader": {}, "editEntryDateDialogTitle": "Datum & Tijd", + "@editEntryDateDialogTitle": {}, "editEntryDateDialogSetCustom": "Stel een custom datum in", + "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Kopiëren van andere datum", + "@editEntryDateDialogCopyField": {}, "editEntryDateDialogCopyItem": "Kopiëren van ander item", + "@editEntryDateDialogCopyItem": {}, "editEntryDateDialogExtractFromTitle": "Uit titel halen", + "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Verschuiven", + "@editEntryDateDialogShift": {}, "editEntryDateDialogSourceFileModifiedDate": "Wijzigingsdatum bestand", - + "@editEntryDateDialogSourceFileModifiedDate": {}, "durationDialogHours": "Uren", + "@durationDialogHours": {}, "durationDialogMinutes": "Minuten", - + "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Locatie", + "@editEntryLocationDialogTitle": {}, "editEntryLocationDialogChooseOnMapTooltip": "Kies op kaart", + "@editEntryLocationDialogChooseOnMapTooltip": {}, "editEntryLocationDialogLatitude": "Breedtegraad", + "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Lengtegraad", - + "@editEntryLocationDialogLongitude": {}, "locationPickerUseThisLocationButton": "Gebruik deze locatie", - + "@locationPickerUseThisLocationButton": {}, "editEntryRatingDialogTitle": "Beoordeling", - + "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "Verwijderen metadata", + "@removeEntryMetadataDialogTitle": {}, "removeEntryMetadataDialogMore": "Meer", - + "@removeEntryMetadataDialogMore": {}, "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP is vereist om de video in een bewegende foto af te spelen.\n\nWeet je zeker dat je deze wilt verwijderen?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, "convertMotionPhotoToStillImageWarningDialogMessage": "Weet je het zeker?", - + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, "videoSpeedDialogLabel": "Afspeelsnelheid", - + "@videoSpeedDialogLabel": {}, "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, "videoStreamSelectionDialogText": "Ondertiteling", + "@videoStreamSelectionDialogText": {}, "videoStreamSelectionDialogOff": "Uit", + "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "Nummer", + "@videoStreamSelectionDialogTrack": {}, "videoStreamSelectionDialogNoSelection": "Er zijn geen andere nummers.", - + "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "Klaar!", + "@genericSuccessFeedback": {}, "genericFailureFeedback": "Fout", - + "@genericFailureFeedback": {}, "menuActionConfigureView": "Beeld", + "@menuActionConfigureView": {}, "menuActionSelect": "Selecteer", + "@menuActionSelect": {}, "menuActionSelectAll": "Selecteer alles", + "@menuActionSelectAll": {}, "menuActionSelectNone": "Selectie ongedaan maken", + "@menuActionSelectNone": {}, "menuActionMap": "Kaart", + "@menuActionMap": {}, "menuActionSlideshow": "Diavoorstelling", + "@menuActionSlideshow": {}, "menuActionStats": "Statistieken", - + "@menuActionStats": {}, "viewDialogSortSectionTitle": "Sorteer", + "@viewDialogSortSectionTitle": {}, "viewDialogGroupSectionTitle": "Groeperen", + "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "Layout", + "@viewDialogLayoutSectionTitle": {}, "viewDialogReverseSortOrder": "Draai sorteerrichting om", - + "@viewDialogReverseSortOrder": {}, "tileLayoutMosaic": "Mozaïek", + "@tileLayoutMosaic": {}, "tileLayoutGrid": "Raster", + "@tileLayoutGrid": {}, "tileLayoutList": "Lijst", - + "@tileLayoutList": {}, "coverDialogTabCover": "Kaft", + "@coverDialogTabCover": {}, "coverDialogTabApp": "Applicatie", + "@coverDialogTabApp": {}, "coverDialogTabColor": "Kleur", - + "@coverDialogTabColor": {}, "appPickDialogTitle": "Kies applicatie", + "@appPickDialogTitle": {}, "appPickDialogNone": "Geen", - + "@appPickDialogNone": {}, "aboutPageTitle": "Over", + "@aboutPageTitle": {}, "aboutLinkLicense": "Licentie", + "@aboutLinkLicense": {}, "aboutLinkPolicy": "Privacy Policy", - + "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "Bug Reporteren", + "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "Sla applicatielogs op in een bestand", + "@aboutBugSaveLogInstruction": {}, "aboutBugCopyInfoInstruction": "Kopieer systeem informatie", + "@aboutBugCopyInfoInstruction": {}, "aboutBugCopyInfoButton": "Kopieer", + "@aboutBugCopyInfoButton": {}, "aboutBugReportInstruction": "Reporteer op GitHub met de logs en systeeminformatie", + "@aboutBugReportInstruction": {}, "aboutBugReportButton": "Reporteer", - + "@aboutBugReportButton": {}, "aboutCreditsSectionTitle": "Credits", + "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "Deze applicatie gebruikt een TopoJSON-bestand van", + "@aboutCreditsWorldAtlas1": {}, "aboutCreditsWorldAtlas2": "Gebruik makend van de ISC License.", + "@aboutCreditsWorldAtlas2": {}, "aboutTranslatorsSectionTitle": "Vdertalers", - + "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "Open-Source Licenties", + "@aboutLicensesSectionTitle": {}, "aboutLicensesBanner": "Deze app maakt gebruik van de volgende open-sourcepakketten en bibliotheken.", + "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "Android bibliotheken", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, "aboutLicensesFlutterPluginsSectionTitle": "Flutter Plugins", + "@aboutLicensesFlutterPluginsSectionTitle": {}, "aboutLicensesFlutterPackagesSectionTitle": "Flutter Packages", + "@aboutLicensesFlutterPackagesSectionTitle": {}, "aboutLicensesDartPackagesSectionTitle": "Dart Packages", + "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "Laat alle licenties zien", - + "@aboutLicensesShowAllButtonLabel": {}, "policyPageTitle": "Privacy Policy", - + "@policyPageTitle": {}, "collectionPageTitle": "Verzameling", + "@collectionPageTitle": {}, "collectionPickPageTitle": "Kies", + "@collectionPickPageTitle": {}, "collectionSelectPageTitle": "Selecteer items", - + "@collectionSelectPageTitle": {}, "collectionActionShowTitleSearch": "Laat titel filter zien", + "@collectionActionShowTitleSearch": {}, "collectionActionHideTitleSearch": "Verberg titel filter", + "@collectionActionHideTitleSearch": {}, "collectionActionAddShortcut": "Snelkoppeling aanmaken", + "@collectionActionAddShortcut": {}, "collectionActionEmptyBin": "Prullenbak leegmaken", + "@collectionActionEmptyBin": {}, "collectionActionCopy": "Kopieer naar Album", + "@collectionActionCopy": {}, "collectionActionMove": "Verplaats naar Album", + "@collectionActionMove": {}, "collectionActionRescan": "Opnieuw indexeren", + "@collectionActionRescan": {}, "collectionActionEdit": "Wijzigen", - + "@collectionActionEdit": {}, "collectionSearchTitlesHintText": "Zoek op titel", - + "@collectionSearchTitlesHintText": {}, "collectionGroupAlbum": "Op Albumnaam", + "@collectionGroupAlbum": {}, "collectionGroupMonth": "Op maand", + "@collectionGroupMonth": {}, "collectionGroupDay": "Op dag", + "@collectionGroupDay": {}, "collectionGroupNone": "Niet groeperen", - + "@collectionGroupNone": {}, "sectionUnknown": "Onbekend", + "@sectionUnknown": {}, "dateToday": "Vandaag", + "@dateToday": {}, "dateYesterday": "Gisteren", + "@dateYesterday": {}, "dateThisMonth": "Deze maand", + "@dateThisMonth": {}, "collectionDeleteFailureFeedback": "{count, plural, =1{Kan 1 item niet verwijderen} other{Kan {count} items niet verwijderen}}", + "@collectionDeleteFailureFeedback": {}, "collectionCopyFailureFeedback": "{count, plural, =1{Kan 1 item niet kopiëren} other{Kan {count} items niet kopiëren}}", + "@collectionCopyFailureFeedback": {}, "collectionMoveFailureFeedback": "{count, plural, =1{Kan 1 item niet verplaatsen} other{Kan {count} items niet verplaatsen}}", + "@collectionMoveFailureFeedback": {}, "collectionRenameFailureFeedback": "{count, plural, =1{Kan 1 item niet hernoemen} other{Kan {count} items niet hernoemen}}", + "@collectionRenameFailureFeedback": {}, "collectionEditFailureFeedback": "{count, plural, =1{Kan 1 item niet wijzigen} other{Kan {count} items niet wijzigen}}", + "@collectionEditFailureFeedback": {}, "collectionExportFailureFeedback": "{count, plural, =1{Kan 1 pagina niet exporteren} other{Kan {count} pagina’s niet exporteren}}", + "@collectionExportFailureFeedback": {}, "collectionCopySuccessFeedback": "{count, plural, =1{1 item gekopieerd} other{{count} items gekopieerd}}", + "@collectionCopySuccessFeedback": {}, "collectionMoveSuccessFeedback": "{count, plural, =1{1 item verplaatst} other{{count} items verplaatst}}", + "@collectionMoveSuccessFeedback": {}, "collectionRenameSuccessFeedback": "{count, plural, =1{1 item hernoemd} other{{count} items hernoemd}}", + "@collectionRenameSuccessFeedback": {}, "collectionEditSuccessFeedback": "{count, plural, =1{1 item gewijzigd} other{{count} items gewijzigd}}", - + "@collectionEditSuccessFeedback": {}, "collectionEmptyFavourites": "Geen favourieten", + "@collectionEmptyFavourites": {}, "collectionEmptyVideos": "Geen video’s", + "@collectionEmptyVideos": {}, "collectionEmptyImages": "Geen afbeeldingen", + "@collectionEmptyImages": {}, "collectionEmptyGrantAccessButtonLabel": "Toegang verlenen", - + "@collectionEmptyGrantAccessButtonLabel": {}, "collectionSelectSectionTooltip": "Selecteer sectie", + "@collectionSelectSectionTooltip": {}, "collectionDeselectSectionTooltip": "Deselecteer sectie", - + "@collectionDeselectSectionTooltip": {}, "drawerAboutButton": "Over", + "@drawerAboutButton": {}, "drawerSettingsButton": "Instellingen", + "@drawerSettingsButton": {}, "drawerCollectionAll": "Alle verzamelingen", + "@drawerCollectionAll": {}, "drawerCollectionFavourites": "Favourieten", + "@drawerCollectionFavourites": {}, "drawerCollectionImages": "Afbeeldingen", + "@drawerCollectionImages": {}, "drawerCollectionVideos": "Video’s", + "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "Animaties", + "@drawerCollectionAnimated": {}, "drawerCollectionMotionPhotos": "Bewegende foto’s", + "@drawerCollectionMotionPhotos": {}, "drawerCollectionPanoramas": "Panoramas", + "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "Raw foto’s", + "@drawerCollectionRaws": {}, "drawerCollectionSphericalVideos": "360° video’s", + "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "Albums", + "@drawerAlbumPage": {}, "drawerCountryPage": "Landen", + "@drawerCountryPage": {}, "drawerTagPage": "Labels", - + "@drawerTagPage": {}, "sortByDate": "Op datum", + "@sortByDate": {}, "sortByName": "Op naam", + "@sortByName": {}, "sortByItemCount": "Op aantal items", + "@sortByItemCount": {}, "sortBySize": "Op grootte", + "@sortBySize": {}, "sortByAlbumFileName": "Op album- en bestandsnaam", + "@sortByAlbumFileName": {}, "sortByRating": "Op rating", - + "@sortByRating": {}, "sortOrderNewestFirst": "Nieuwste eerst", + "@sortOrderNewestFirst": {}, "sortOrderOldestFirst": "Oudste eerst", + "@sortOrderOldestFirst": {}, "sortOrderAtoZ": "A tot Z", + "@sortOrderAtoZ": {}, "sortOrderZtoA": "Z tot A", + "@sortOrderZtoA": {}, "sortOrderHighestFirst": "Hoogste eerst", + "@sortOrderHighestFirst": {}, "sortOrderLowestFirst": "Laagste eerst", + "@sortOrderLowestFirst": {}, "sortOrderLargestFirst": "Grootste eerst", + "@sortOrderLargestFirst": {}, "sortOrderSmallestFirst": "Kleinste eerst", - + "@sortOrderSmallestFirst": {}, "albumGroupTier": "Op rang", + "@albumGroupTier": {}, "albumGroupType": "Op type", + "@albumGroupType": {}, "albumGroupVolume": "Op opslagvolume", + "@albumGroupVolume": {}, "albumGroupNone": "Niet groeperen", - + "@albumGroupNone": {}, "albumMimeTypeMixed": "Gemengd", - + "@albumMimeTypeMixed": {}, "albumPickPageTitleCopy": "Kopieer naar Album", + "@albumPickPageTitleCopy": {}, "albumPickPageTitleExport": "Exporteer naar Album", + "@albumPickPageTitleExport": {}, "albumPickPageTitleMove": "Verplaats naar Album", + "@albumPickPageTitleMove": {}, "albumPickPageTitlePick": "Kies Album", - + "@albumPickPageTitlePick": {}, "albumCamera": "Camera", + "@albumCamera": {}, "albumDownload": "Opslaan", + "@albumDownload": {}, "albumScreenshots": "Schermafbeeldingen", + "@albumScreenshots": {}, "albumScreenRecordings": "Schermopnames", + "@albumScreenRecordings": {}, "albumVideoCaptures": "Video opnames", - + "@albumVideoCaptures": {}, "albumPageTitle": "Albums", + "@albumPageTitle": {}, "albumEmpty": "Geen albums", + "@albumEmpty": {}, "createAlbumTooltip": "Album aanmaken", + "@createAlbumTooltip": {}, "createAlbumButtonLabel": "AANMAKEN", + "@createAlbumButtonLabel": {}, "newFilterBanner": "nieuw", - + "@newFilterBanner": {}, "countryPageTitle": "Landen", + "@countryPageTitle": {}, "countryEmpty": "Geen landen", - + "@countryEmpty": {}, "tagPageTitle": "Labels", + "@tagPageTitle": {}, "tagEmpty": "Geen labels", - + "@tagEmpty": {}, "binPageTitle": "Prullenbak", - + "@binPageTitle": {}, "searchCollectionFieldHint": "Doorzoek collectie", + "@searchCollectionFieldHint": {}, "searchRecentSectionTitle": "Recent", + "@searchRecentSectionTitle": {}, "searchDateSectionTitle": "Datum", + "@searchDateSectionTitle": {}, "searchAlbumsSectionTitle": "Albums", + "@searchAlbumsSectionTitle": {}, "searchCountriesSectionTitle": "Landen", + "@searchCountriesSectionTitle": {}, "searchPlacesSectionTitle": "Plaatsen", + "@searchPlacesSectionTitle": {}, "searchTagsSectionTitle": "Labels", + "@searchTagsSectionTitle": {}, "searchRatingSectionTitle": "Beoordeling", + "@searchRatingSectionTitle": {}, "searchMetadataSectionTitle": "Metadata", - + "@searchMetadataSectionTitle": {}, "settingsPageTitle": "Instellingen", + "@settingsPageTitle": {}, "settingsSystemDefault": "Systeem", + "@settingsSystemDefault": {}, "settingsDefault": "Standaard", + "@settingsDefault": {}, "settingsDisabled": "Uitgeschakeld", - + "@settingsDisabled": {}, "settingsSearchFieldLabel": "Instellingen doorzoeken", + "@settingsSearchFieldLabel": {}, "settingsSearchEmpty": "Geen instellingen gevonden", + "@settingsSearchEmpty": {}, "settingsActionExport": "Exporteer", + "@settingsActionExport": {}, "settingsActionExportDialogTitle": "Exporteer", + "@settingsActionExportDialogTitle": {}, "settingsActionImport": "Importeer", + "@settingsActionImport": {}, "settingsActionImportDialogTitle": "Importeer", - + "@settingsActionImportDialogTitle": {}, "appExportCovers": "Omslagen", + "@appExportCovers": {}, "appExportFavourites": "Favorieten", + "@appExportFavourites": {}, "appExportSettings": "Instellingen", - + "@appExportSettings": {}, "settingsNavigationSectionTitle": "Navigatie", + "@settingsNavigationSectionTitle": {}, "settingsHomeTile": "Startscherm", + "@settingsHomeTile": {}, "settingsHomeDialogTitle": "Startscherm", + "@settingsHomeDialogTitle": {}, "settingsShowBottomNavigationBar": "Laat onderste navigatiebalk zien", + "@settingsShowBottomNavigationBar": {}, "settingsKeepScreenOnTile": "Houd het scherm aan", + "@settingsKeepScreenOnTile": {}, "settingsKeepScreenOnDialogTitle": "Houd het scherm aan", + "@settingsKeepScreenOnDialogTitle": {}, "settingsDoubleBackExit": "Tik twee keer op “terug” om af te sluiten", - + "@settingsDoubleBackExit": {}, "settingsConfirmationTile": "Bevestigingsscherm", + "@settingsConfirmationTile": {}, "settingsConfirmationDialogTitle": "Bevestigingsschermen", + "@settingsConfirmationDialogTitle": {}, "settingsConfirmationBeforeDeleteItems": "Bevestig voordat je items voor altijd verwijdert", + "@settingsConfirmationBeforeDeleteItems": {}, "settingsConfirmationBeforeMoveToBinItems": "Bevestig voordat u items naar de prullenbak verplaatst", + "@settingsConfirmationBeforeMoveToBinItems": {}, "settingsConfirmationBeforeMoveUndatedItems": "Bevestigvoordat u ongedateerde items verplaatst", + "@settingsConfirmationBeforeMoveUndatedItems": {}, "settingsConfirmationAfterMoveToBinItems": "Toon bevestigingsbericht na het verplaatsen van items naar de prullenbak", - + "@settingsConfirmationAfterMoveToBinItems": {}, "settingsNavigationDrawerTile": "Navigatiemenu", + "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "Navigatiemenu", + "@settingsNavigationDrawerEditorPageTitle": {}, "settingsNavigationDrawerBanner": "Houd ingedrukt om menu-items te verplaatsen en opnieuw te ordenen.", + "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "Typen", + "@settingsNavigationDrawerTabTypes": {}, "settingsNavigationDrawerTabAlbums": "Albums", + "@settingsNavigationDrawerTabAlbums": {}, "settingsNavigationDrawerTabPages": "Pagina’s", + "@settingsNavigationDrawerTabPages": {}, "settingsNavigationDrawerAddAlbum": "Album toevoegen", - + "@settingsNavigationDrawerAddAlbum": {}, "settingsThumbnailSectionTitle": "Miniaturen", + "@settingsThumbnailSectionTitle": {}, "settingsThumbnailOverlayTile": "Overlay", + "@settingsThumbnailOverlayTile": {}, "settingsThumbnailOverlayPageTitle": "Overlay", + "@settingsThumbnailOverlayPageTitle": {}, "settingsThumbnailShowFavouriteIcon": "Favorieten icoon zichtbaar", + "@settingsThumbnailShowFavouriteIcon": {}, "settingsThumbnailShowTagIcon": "Label icoon zichtbaar", + "@settingsThumbnailShowTagIcon": {}, "settingsThumbnailShowLocationIcon": "Locatie icoon zichtbaar", + "@settingsThumbnailShowLocationIcon": {}, "settingsThumbnailShowMotionPhotoIcon": "Bewegende foto icoon zichtbaar", + "@settingsThumbnailShowMotionPhotoIcon": {}, "settingsThumbnailShowRating": "Rating zichtbaar", + "@settingsThumbnailShowRating": {}, "settingsThumbnailShowRawIcon": "RAW icoon zichtbaar", + "@settingsThumbnailShowRawIcon": {}, "settingsThumbnailShowVideoDuration": "Videoduur zichtbaar", - + "@settingsThumbnailShowVideoDuration": {}, "settingsCollectionQuickActionsTile": "Snelle bewerkingen", + "@settingsCollectionQuickActionsTile": {}, "settingsCollectionQuickActionEditorPageTitle": "Snelle bewerkingen", + "@settingsCollectionQuickActionEditorPageTitle": {}, "settingsCollectionQuickActionTabBrowsing": "Blader", + "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "Selecteren", + "@settingsCollectionQuickActionTabSelecting": {}, "settingsCollectionBrowsingQuickActionEditorBanner": "Houd ingedrukt om knoppen te verplaatsen en te selecteren welke acties worden weergegeven bij het bladeren door items.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "Houd ingedrukt om knoppen te verplaatsen en te selecteren welke acties worden weergegeven bij het selecteren van items.", - + "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "Voorbeeld", + "@settingsViewerSectionTitle": {}, "settingsViewerGestureSideTapNext": "Druk op het scherm om het vorige/volgende item weer te geven", + "@settingsViewerGestureSideTapNext": {}, "settingsViewerUseCutout": "Uitgesneden gebied gebruiken", + "@settingsViewerUseCutout": {}, "settingsViewerMaximumBrightness": "Maximale helderheid", + "@settingsViewerMaximumBrightness": {}, "settingsMotionPhotoAutoPlay": "Bewegingsfoto’s automatisch afspelen", + "@settingsMotionPhotoAutoPlay": {}, "settingsImageBackground": "Afbeeldingsachtergrond", - + "@settingsImageBackground": {}, "settingsViewerQuickActionsTile": "Snelle bewerkingen", + "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "Snelle bewerkingen", + "@settingsViewerQuickActionEditorPageTitle": {}, "settingsViewerQuickActionEditorBanner": "Houd ingedrukt om knoppen te verplaatsen en te selecteren welke acties in de viewer worden weergegeven.", + "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Zichtbare knoppen", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Beschikbare knoppen", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, "settingsViewerQuickActionEmpty": "Geen knoppen", - + "@settingsViewerQuickActionEmpty": {}, "settingsViewerOverlayTile": "Overlay", + "@settingsViewerOverlayTile": {}, "settingsViewerOverlayPageTitle": "Overlay", + "@settingsViewerOverlayPageTitle": {}, "settingsViewerShowOverlayOnOpening": "Zichtbaar bij openen", + "@settingsViewerShowOverlayOnOpening": {}, "settingsViewerShowMinimap": "Laat kleine kaart zien", + "@settingsViewerShowMinimap": {}, "settingsViewerShowInformation": "Laat informatie zien", + "@settingsViewerShowInformation": {}, "settingsViewerShowInformationSubtitle": "Laat titel, datum, locatie, etc zien.", + "@settingsViewerShowInformationSubtitle": {}, "settingsViewerShowShootingDetails": "Laat opnamedetails zien", + "@settingsViewerShowShootingDetails": {}, "settingsViewerShowOverlayThumbnails": "Laat miniaturen zien", + "@settingsViewerShowOverlayThumbnails": {}, "settingsViewerEnableOverlayBlurEffect": "Vervagingseffect", - + "@settingsViewerEnableOverlayBlurEffect": {}, "settingsViewerSlideshowTile": "Diavoorstelling", + "@settingsViewerSlideshowTile": {}, "settingsViewerSlideshowPageTitle": "Diavoorstelling", + "@settingsViewerSlideshowPageTitle": {}, "settingsSlideshowRepeat": "Herhalen", + "@settingsSlideshowRepeat": {}, "settingsSlideshowShuffle": "Shuffle", + "@settingsSlideshowShuffle": {}, "settingsSlideshowFillScreen": "Volledig scherm", + "@settingsSlideshowFillScreen": {}, "settingsSlideshowAnimatedZoomEffect": "Geanimeerd zoomeffect", + "@settingsSlideshowAnimatedZoomEffect": {}, "settingsSlideshowTransitionTile": "Overgang", + "@settingsSlideshowTransitionTile": {}, "settingsSlideshowIntervalTile": "Interval", + "@settingsSlideshowIntervalTile": {}, "settingsSlideshowVideoPlaybackTile": "Video afspelen", + "@settingsSlideshowVideoPlaybackTile": {}, "settingsSlideshowVideoPlaybackDialogTitle": "Video afspelen", - + "@settingsSlideshowVideoPlaybackDialogTitle": {}, "settingsVideoPageTitle": "Video Instellingen", + "@settingsVideoPageTitle": {}, "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, "settingsVideoShowVideos": "Videos", + "@settingsVideoShowVideos": {}, "settingsVideoEnableHardwareAcceleration": "Hardware acceleratie", + "@settingsVideoEnableHardwareAcceleration": {}, "settingsVideoAutoPlay": "Automatisch afspelen", + "@settingsVideoAutoPlay": {}, "settingsVideoLoopModeTile": "Herhaald afspelen", + "@settingsVideoLoopModeTile": {}, "settingsVideoLoopModeDialogTitle": "Herhaald afspelen", - + "@settingsVideoLoopModeDialogTitle": {}, "settingsSubtitleThemeTile": "Ondertiteling", + "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "Ondertiteling", + "@settingsSubtitleThemePageTitle": {}, "settingsSubtitleThemeSample": "Dit is een voorbeeld", + "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "Tekst uitlijnen", + "@settingsSubtitleThemeTextAlignmentTile": {}, "settingsSubtitleThemeTextAlignmentDialogTitle": "Tekst uitlijnen", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, "settingsSubtitleThemeTextSize": "Tekstgroote", + "@settingsSubtitleThemeTextSize": {}, "settingsSubtitleThemeShowOutline": "Laat omtrek en schaduw zien", + "@settingsSubtitleThemeShowOutline": {}, "settingsSubtitleThemeTextColor": "Tekstkleur", + "@settingsSubtitleThemeTextColor": {}, "settingsSubtitleThemeTextOpacity": "Tekstdoorzichtigheid", + "@settingsSubtitleThemeTextOpacity": {}, "settingsSubtitleThemeBackgroundColor": "Achtergrondkleur", + "@settingsSubtitleThemeBackgroundColor": {}, "settingsSubtitleThemeBackgroundOpacity": "Achtergronddoorzichtigheid", + "@settingsSubtitleThemeBackgroundOpacity": {}, "settingsSubtitleThemeTextAlignmentLeft": "Links", + "@settingsSubtitleThemeTextAlignmentLeft": {}, "settingsSubtitleThemeTextAlignmentCenter": "Midden", + "@settingsSubtitleThemeTextAlignmentCenter": {}, "settingsSubtitleThemeTextAlignmentRight": "Rechts", - + "@settingsSubtitleThemeTextAlignmentRight": {}, "settingsVideoControlsTile": "Bediening", + "@settingsVideoControlsTile": {}, "settingsVideoControlsPageTitle": "Bediening", + "@settingsVideoControlsPageTitle": {}, "settingsVideoButtonsTile": "Knoppen", + "@settingsVideoButtonsTile": {}, "settingsVideoGestureDoubleTapTogglePlay": "Dubbeltik om te spelen/pauzeren", + "@settingsVideoGestureDoubleTapTogglePlay": {}, "settingsVideoGestureSideDoubleTapSeek": "Dubbeltik op schermranden om achteruit/vooruit te zoeken", - + "@settingsVideoGestureSideDoubleTapSeek": {}, "settingsPrivacySectionTitle": "Privacy", + "@settingsPrivacySectionTitle": {}, "settingsAllowInstalledAppAccess": "Toegang tot app-inventaris toestaan", + "@settingsAllowInstalledAppAccess": {}, "settingsAllowInstalledAppAccessSubtitle": "Gebruikt om de albumweergave te verbeteren", + "@settingsAllowInstalledAppAccessSubtitle": {}, "settingsAllowErrorReporting": "Anonieme foutrapportage toestaan", + "@settingsAllowErrorReporting": {}, "settingsSaveSearchHistory": "Bewaar zoekgeschiedenis", + "@settingsSaveSearchHistory": {}, "settingsEnableBin": "Prullenbak gebruiken", + "@settingsEnableBin": {}, "settingsEnableBinSubtitle": "Bewaar verwijderde items 30 dagen", - + "@settingsEnableBinSubtitle": {}, "settingsHiddenItemsTile": "Verborgen items", + "@settingsHiddenItemsTile": {}, "settingsHiddenItemsPageTitle": "Verborgen Items", - + "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "Verborgen Filters", + "@settingsHiddenItemsTabFilters": {}, "settingsHiddenFiltersBanner": "Foto’s en video’s die overeenkomen met verborgen filters, worden niet weergegeven in uw verzameling.", + "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "Geen verborgen filters", - + "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "Verborgen paden", + "@settingsHiddenItemsTabPaths": {}, "settingsHiddenPathsBanner": "Foto’s en video’s in deze mappen, of een van hun submappen, verschijnen niet in uw verzameling.", + "@settingsHiddenPathsBanner": {}, "addPathTooltip": "Pad toevoegen", - + "@addPathTooltip": {}, "settingsStorageAccessTile": "Toegang tot opslag", + "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "Toegang tot opslag", + "@settingsStorageAccessPageTitle": {}, "settingsStorageAccessBanner": "Sommige mappen vereisen een expliciete toegangstoekenning om bestanden erin te wijzigen. U kunt hier directory’s bekijken waartoe u eerder toegang heeft verleend.", + "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "Geen toegang verleend", + "@settingsStorageAccessEmpty": {}, "settingsStorageAccessRevokeTooltip": "Herroepen", - + "@settingsStorageAccessRevokeTooltip": {}, "settingsAccessibilitySectionTitle": "Toegankelijkheid", + "@settingsAccessibilitySectionTitle": {}, "settingsRemoveAnimationsTile": "Animaties verwijderen", + "@settingsRemoveAnimationsTile": {}, "settingsRemoveAnimationsDialogTitle": "Animaties verwijderen", + "@settingsRemoveAnimationsDialogTitle": {}, "settingsTimeToTakeActionTile": "Tijd om actie te ondernemen", - + "@settingsTimeToTakeActionTile": {}, "settingsDisplaySectionTitle": "Scherm", + "@settingsDisplaySectionTitle": {}, "settingsThemeBrightnessTile": "Thema", + "@settingsThemeBrightnessTile": {}, "settingsThemeBrightnessDialogTitle": "Thema", + "@settingsThemeBrightnessDialogTitle": {}, "settingsThemeColorHighlights": "Kleur highlights", + "@settingsThemeColorHighlights": {}, "settingsThemeEnableDynamicColor": "Dynamische kleur", + "@settingsThemeEnableDynamicColor": {}, "settingsDisplayRefreshRateModeTile": "Vernieuwingsfrequentie weergeven", + "@settingsDisplayRefreshRateModeTile": {}, "settingsDisplayRefreshRateModeDialogTitle": "Vernieuwingsfrequentie", - + "@settingsDisplayRefreshRateModeDialogTitle": {}, "settingsLanguageSectionTitle": "Taal & landinstellingen", + "@settingsLanguageSectionTitle": {}, "settingsLanguageTile": "Taal", + "@settingsLanguageTile": {}, "settingsLanguagePageTitle": "Taal", + "@settingsLanguagePageTitle": {}, "settingsCoordinateFormatTile": "Coördinaten format", + "@settingsCoordinateFormatTile": {}, "settingsCoordinateFormatDialogTitle": "Coördinaten format", + "@settingsCoordinateFormatDialogTitle": {}, "settingsUnitSystemTile": "Eenheden", + "@settingsUnitSystemTile": {}, "settingsUnitSystemDialogTitle": "Eenheden", - + "@settingsUnitSystemDialogTitle": {}, "settingsScreenSaverPageTitle": "Schermbeveiliging", - + "@settingsScreenSaverPageTitle": {}, "settingsWidgetPageTitle": "Foto Lijstje", + "@settingsWidgetPageTitle": {}, "settingsWidgetShowOutline": "Contour", + "@settingsWidgetShowOutline": {}, "settingsWidgetOpenPage": "Wanneer u op de widget tikt", - + "@settingsWidgetOpenPage": {}, "settingsCollectionTile": "Verzameling", - + "@settingsCollectionTile": {}, "statsPageTitle": "Stats", + "@statsPageTitle": {}, "statsWithGps": "{count, plural, =1{1 item met locatie} other{{count} items met locatie}}", + "@statsWithGps": {}, "statsTopCountriesSectionTitle": "Top Landen", + "@statsTopCountriesSectionTitle": {}, "statsTopPlacesSectionTitle": "Top Plaatsen", + "@statsTopPlacesSectionTitle": {}, "statsTopTagsSectionTitle": "Top Labels", + "@statsTopTagsSectionTitle": {}, "statsTopAlbumsSectionTitle": "Top Albums", - + "@statsTopAlbumsSectionTitle": {}, "viewerOpenPanoramaButtonLabel": "OPEN PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, "viewerSetWallpaperButtonLabel": "ALS ACHTERGROND INSTELLEN", + "@viewerSetWallpaperButtonLabel": {}, "viewerErrorUnknown": "Oei!", + "@viewerErrorUnknown": {}, "viewerErrorDoesNotExist": "Het bestand bestaat niet meer.", - + "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "Info", + "@viewerInfoPageTitle": {}, "viewerInfoBackToViewerTooltip": "Terug naar viewer", - + "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "onbekendd", + "@viewerInfoUnknown": {}, "viewerInfoLabelDescription": "Omschrijving", + "@viewerInfoLabelDescription": {}, "viewerInfoLabelTitle": "Titel", + "@viewerInfoLabelTitle": {}, "viewerInfoLabelDate": "Datum", + "@viewerInfoLabelDate": {}, "viewerInfoLabelResolution": "Resolutie", + "@viewerInfoLabelResolution": {}, "viewerInfoLabelSize": "Grootte", + "@viewerInfoLabelSize": {}, "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, "viewerInfoLabelPath": "Pad", + "@viewerInfoLabelPath": {}, "viewerInfoLabelDuration": "Duur", + "@viewerInfoLabelDuration": {}, "viewerInfoLabelOwner": "Eigenaar", + "@viewerInfoLabelOwner": {}, "viewerInfoLabelCoordinates": "Coördinaten", + "@viewerInfoLabelCoordinates": {}, "viewerInfoLabelAddress": "Adres", - + "@viewerInfoLabelAddress": {}, "mapStyleDialogTitle": "Kaartstijl", + "@mapStyleDialogTitle": {}, "mapStyleTooltip": "Selecteer kaart stijl", + "@mapStyleTooltip": {}, "mapZoomInTooltip": "Inzoomen", + "@mapZoomInTooltip": {}, "mapZoomOutTooltip": "Uitzoomen", + "@mapZoomOutTooltip": {}, "mapPointNorthUpTooltip": "Noorden boven", + "@mapPointNorthUpTooltip": {}, "mapAttributionOsmHot": "Kaartgegevens © [OpenStreetMap](https://www.openstreetmap.org/copyright) bijdragers • Tegels door [HOT](https://www.hotosm.org/) • Gehost door [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, "mapAttributionStamen": "Kaartgegevens © [OpenStreetMap](https://www.openstreetmap.org/copyright) bijdragers • Tegels door [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, "openMapPageTooltip": "Bekijk op kaartpagina", + "@openMapPageTooltip": {}, "mapEmptyRegion": "Geen afbeeldingen in de geselecteerde regio", - + "@mapEmptyRegion": {}, "viewerInfoOpenEmbeddedFailureFeedback": "Kan ingesloten gegevens niet extraheren", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, "viewerInfoOpenLinkText": "Open", + "@viewerInfoOpenLinkText": {}, "viewerInfoViewXmlLinkText": "Bekijk XML", - + "@viewerInfoViewXmlLinkText": {}, "viewerInfoSearchFieldLabel": "Doorzoek metadata", + "@viewerInfoSearchFieldLabel": {}, "viewerInfoSearchEmpty": "Geen overeenkomstige zoeksleutels", + "@viewerInfoSearchEmpty": {}, "viewerInfoSearchSuggestionDate": "Datum & tijd", + "@viewerInfoSearchSuggestionDate": {}, "viewerInfoSearchSuggestionDescription": "Beschrijving", + "@viewerInfoSearchSuggestionDescription": {}, "viewerInfoSearchSuggestionDimensions": "Afmetingen", + "@viewerInfoSearchSuggestionDimensions": {}, "viewerInfoSearchSuggestionResolution": "Resolutie", + "@viewerInfoSearchSuggestionResolution": {}, "viewerInfoSearchSuggestionRights": "Rechten", - + "@viewerInfoSearchSuggestionRights": {}, "wallpaperUseScrollEffect": "Scroll-effect gebruiken op startscherm", - + "@wallpaperUseScrollEffect": {}, "tagEditorPageTitle": "Wijzig Labels", + "@tagEditorPageTitle": {}, "tagEditorPageNewTagFieldLabel": "Nieuw label", + "@tagEditorPageNewTagFieldLabel": {}, "tagEditorPageAddTagTooltip": "Label toevoegen", + "@tagEditorPageAddTagTooltip": {}, "tagEditorSectionRecent": "Recent", - + "@tagEditorSectionRecent": {}, "panoramaEnableSensorControl": "Sensor control inschakelen", + "@panoramaEnableSensorControl": {}, "panoramaDisableSensorControl": "Sensor control uitschakelen", - + "@panoramaDisableSensorControl": {}, "sourceViewerPageTitle": "Source", - + "@sourceViewerPageTitle": {}, "filePickerShowHiddenFiles": "Verborgen bestanden laten zien", + "@filePickerShowHiddenFiles": {}, "filePickerDoNotShowHiddenFiles": "Verborgen bestanden niet laten zien", + "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "Openen met", + "@filePickerOpenFrom": {}, "filePickerNoItems": "Geen items", - "filePickerUseThisFolder": "Deze map gebruiken" + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "Deze map gebruiken", + "@filePickerUseThisFolder": {} } diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 7b2aeda1c..1eeb6aa56 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -1,642 +1,1034 @@ { "appName": "Aves", + "@appName": {}, "welcomeMessage": "Aves'e Hoş Geldiniz", + "@welcomeMessage": {}, "welcomeOptional": "İsteğe bağlı", + "@welcomeOptional": {}, "welcomeTermsToggle": "Hüküm ve koşulları kabul ediyorum", + "@welcomeTermsToggle": {}, "itemCount": "{count, plural, =1{1 öğe} other{{count} öğe}}", - + "@itemCount": {}, "timeSeconds": "{seconds, plural, =1{1 saniye} other{{seconds} saniye}}", + "@timeSeconds": {}, "timeMinutes": "{minutes, plural, =1{1 dakika} other{{minutes} dakika}}", + "@timeMinutes": {}, "timeDays": "{days, plural, =1{1 gün} other{{days} gün}}", + "@timeDays": {}, "focalLength": "{length} mm", - + "@focalLength": {}, "applyButtonLabel": "UYGULA", + "@applyButtonLabel": {}, "deleteButtonLabel": "SİL", + "@deleteButtonLabel": {}, "nextButtonLabel": "SONRAKİ", + "@nextButtonLabel": {}, "showButtonLabel": "GÖSTER", + "@showButtonLabel": {}, "hideButtonLabel": "GİZLE", + "@hideButtonLabel": {}, "continueButtonLabel": "DEVAM ET", - + "@continueButtonLabel": {}, "cancelTooltip": "İptal et", + "@cancelTooltip": {}, "changeTooltip": "Değiştir", + "@changeTooltip": {}, "clearTooltip": "Temizle", + "@clearTooltip": {}, "previousTooltip": "Önceki", + "@previousTooltip": {}, "nextTooltip": "Sonraki", + "@nextTooltip": {}, "showTooltip": "Göster", + "@showTooltip": {}, "hideTooltip": "Gizle", + "@hideTooltip": {}, "actionRemove": "Kaldır", + "@actionRemove": {}, "resetTooltip": "Sıfırla", + "@resetTooltip": {}, "saveTooltip": "Kaydet", + "@saveTooltip": {}, "pickTooltip": "Seç", - + "@pickTooltip": {}, "doubleBackExitMessage": "Çıkmak için tekrar “geri”, düğmesine dokunun.", + "@doubleBackExitMessage": {}, "doNotAskAgain": "Bir daha sorma", - + "@doNotAskAgain": {}, "sourceStateLoading": "Yükleniyor", + "@sourceStateLoading": {}, "sourceStateCataloguing": "Kataloglanıyor", + "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "Ülkeler konumlandırılıyor", + "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "Konum belirleniyor", - + "@sourceStateLocatingPlaces": {}, "chipActionDelete": "Sil", + "@chipActionDelete": {}, "chipActionGoToAlbumPage": "Albümlerde göster", + "@chipActionGoToAlbumPage": {}, "chipActionGoToCountryPage": "Ülkelerde göster", + "@chipActionGoToCountryPage": {}, "chipActionGoToTagPage": "Etiketlerde göster", + "@chipActionGoToTagPage": {}, "chipActionHide": "Gizle", + "@chipActionHide": {}, "chipActionPin": "Başa sabitle", + "@chipActionPin": {}, "chipActionUnpin": "Baştan çıkar", + "@chipActionUnpin": {}, "chipActionRename": "Yeniden adlandır", + "@chipActionRename": {}, "chipActionSetCover": "Kapağı ayarla", + "@chipActionSetCover": {}, "chipActionCreateAlbum": "Albüm oluştur", - + "@chipActionCreateAlbum": {}, "entryActionCopyToClipboard": "Panoya kopyala", + "@entryActionCopyToClipboard": {}, "entryActionDelete": "Sil", + "@entryActionDelete": {}, "entryActionConvert": "Dönüştür", + "@entryActionConvert": {}, "entryActionExport": "Dışa aktar", + "@entryActionExport": {}, "entryActionInfo": "Bilgi", + "@entryActionInfo": {}, "entryActionRename": "Yeniden adlandır", + "@entryActionRename": {}, "entryActionRestore": "Dışa aktar", + "@entryActionRestore": {}, "entryActionRotateCCW": "Saat yönünün tersine döndür", + "@entryActionRotateCCW": {}, "entryActionRotateCW": "Saat yönünde döndür", + "@entryActionRotateCW": {}, "entryActionFlip": "Yatay olarak çevir", + "@entryActionFlip": {}, "entryActionPrint": "Yazdır", + "@entryActionPrint": {}, "entryActionShare": "Paylaş", + "@entryActionShare": {}, "entryActionViewSource": "Kaynağı görüntüle", + "@entryActionViewSource": {}, "entryActionShowGeoTiffOnMap": "Harita katmanı olarak göster", + "@entryActionShowGeoTiffOnMap": {}, "entryActionConvertMotionPhotoToStillImage": "Hareketsiz görüntüye dönüştür", + "@entryActionConvertMotionPhotoToStillImage": {}, "entryActionViewMotionPhotoVideo": "Videoyu aç", + "@entryActionViewMotionPhotoVideo": {}, "entryActionEdit": "Düzenle", + "@entryActionEdit": {}, "entryActionOpen": "Şununla aç", + "@entryActionOpen": {}, "entryActionSetAs": "Olarak ayarla", + "@entryActionSetAs": {}, "entryActionOpenMap": "Harita uygulamasında göster", + "@entryActionOpenMap": {}, "entryActionRotateScreen": "Ekranı döndür", + "@entryActionRotateScreen": {}, "entryActionAddFavourite": "Favorilere ekle", + "@entryActionAddFavourite": {}, "entryActionRemoveFavourite": "Favorilerden kaldır", - + "@entryActionRemoveFavourite": {}, "videoActionCaptureFrame": "Çerçeve yakala", + "@videoActionCaptureFrame": {}, "videoActionMute": "Sustur", + "@videoActionMute": {}, "videoActionUnmute": "Susturmayı kaldır", + "@videoActionUnmute": {}, "videoActionPause": "Duraklat", + "@videoActionPause": {}, "videoActionPlay": "Oynat", + "@videoActionPlay": {}, "videoActionReplay10": "10 saniye geri git", + "@videoActionReplay10": {}, "videoActionSkip10": "10 saniye ileri git", + "@videoActionSkip10": {}, "videoActionSelectStreams": "Parça seç", + "@videoActionSelectStreams": {}, "videoActionSetSpeed": "Oynatma hızı", + "@videoActionSetSpeed": {}, "videoActionSettings": "Ayarlar", - + "@videoActionSettings": {}, "entryInfoActionEditDate": "Tarih ve saati düzenle", + "@entryInfoActionEditDate": {}, "entryInfoActionEditLocation": "Konumu düzenle", + "@entryInfoActionEditLocation": {}, "entryInfoActionEditRating": "Derecelendirmeyi düzenle", + "@entryInfoActionEditRating": {}, "entryInfoActionEditTags": "Etiketleri düzenle", + "@entryInfoActionEditTags": {}, "entryInfoActionRemoveMetadata": "Meta verileri kaldır", - + "@entryInfoActionRemoveMetadata": {}, "filterBinLabel": "Geri dönüşüm kutusu", + "@filterBinLabel": {}, "filterFavouriteLabel": "Favori", + "@filterFavouriteLabel": {}, "filterNoLocationLabel": "Konumsuz", + "@filterNoLocationLabel": {}, "filterNoRatingLabel": "Derecelendirilmemiş", + "@filterNoRatingLabel": {}, "filterNoTagLabel": "Etiketsiz", + "@filterNoTagLabel": {}, "filterRatingRejectedLabel": "Reddedilmiş", + "@filterRatingRejectedLabel": {}, "filterTypeAnimatedLabel": "Hareketli", + "@filterTypeAnimatedLabel": {}, "filterTypeMotionPhotoLabel": "Hareketli Fotoğraf", + "@filterTypeMotionPhotoLabel": {}, "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, "filterTypeSphericalVideoLabel": "360° Video", + "@filterTypeSphericalVideoLabel": {}, "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, "filterMimeImageLabel": "Resim", + "@filterMimeImageLabel": {}, "filterMimeVideoLabel": "Video", - + "@filterMimeVideoLabel": {}, "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, "coordinateFormatDecimal": "Ondalık dereceler", + "@coordinateFormatDecimal": {}, "coordinateDms": "{coordinate} {direction}", - + "@coordinateDms": {}, "coordinateDmsNorth": "K", + "@coordinateDmsNorth": {}, "coordinateDmsSouth": "G", + "@coordinateDmsSouth": {}, "coordinateDmsEast": "D", + "@coordinateDmsEast": {}, "coordinateDmsWest": "B", - + "@coordinateDmsWest": {}, "unitSystemMetric": "Metrik", + "@unitSystemMetric": {}, "unitSystemImperial": "İngiliz", - + "@unitSystemImperial": {}, "videoLoopModeNever": "Asla", + "@videoLoopModeNever": {}, "videoLoopModeShortOnly": "Yalnızca kısa videolar", + "@videoLoopModeShortOnly": {}, "videoLoopModeAlways": "Her zaman", - + "@videoLoopModeAlways": {}, "videoControlsPlay": "Oynat", + "@videoControlsPlay": {}, "videoControlsPlaySeek": "Oynat ve ileri/geri git", + "@videoControlsPlaySeek": {}, "videoControlsPlayOutside": "Başka bir oynatıcı ile aç", + "@videoControlsPlayOutside": {}, "videoControlsNone": "Hiçbiri", - + "@videoControlsNone": {}, "mapStyleGoogleNormal": "Google Haritalar", + "@mapStyleGoogleNormal": {}, "mapStyleGoogleHybrid": "Google Haritalar (Hibrit)", + "@mapStyleGoogleHybrid": {}, "mapStyleGoogleTerrain": "Google Haritalar (Arazi)", + "@mapStyleGoogleTerrain": {}, "mapStyleHuaweiNormal": "Petal Haritalar", + "@mapStyleHuaweiNormal": {}, "mapStyleHuaweiTerrain": "Petal Haritalar (Arazi)", + "@mapStyleHuaweiTerrain": {}, "mapStyleOsmHot": "İnsancıl OSM", + "@mapStyleOsmHot": {}, "mapStyleStamenToner": "Stamen Tonik", + "@mapStyleStamenToner": {}, "mapStyleStamenWatercolor": "Stamen Suluboya", - + "@mapStyleStamenWatercolor": {}, "nameConflictStrategyRename": "Yeniden adlandır", + "@nameConflictStrategyRename": {}, "nameConflictStrategyReplace": "Değiştir", + "@nameConflictStrategyReplace": {}, "nameConflictStrategySkip": "Atla", - + "@nameConflictStrategySkip": {}, "keepScreenOnNever": "Asla", + "@keepScreenOnNever": {}, "keepScreenOnViewerOnly": "Yalnızca görüntüleyici sayfası", + "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "Her zaman", - + "@keepScreenOnAlways": {}, "accessibilityAnimationsRemove": "Ekran efektlerini önle", + "@accessibilityAnimationsRemove": {}, "accessibilityAnimationsKeep": "Ekran efektlerini koru", - + "@accessibilityAnimationsKeep": {}, "displayRefreshRatePreferHighest": "En yüksek oran", + "@displayRefreshRatePreferHighest": {}, "displayRefreshRatePreferLowest": "En düşük oran", - + "@displayRefreshRatePreferLowest": {}, "themeBrightnessLight": "Açık", + "@themeBrightnessLight": {}, "themeBrightnessDark": "Koyu", + "@themeBrightnessDark": {}, "themeBrightnessBlack": "Siyah", - + "@themeBrightnessBlack": {}, "albumTierNew": "Yeni", + "@albumTierNew": {}, "albumTierPinned": "Sabitlenmiş", + "@albumTierPinned": {}, "albumTierSpecial": "Genel", + "@albumTierSpecial": {}, "albumTierApps": "Uygulamalar", + "@albumTierApps": {}, "albumTierRegular": "Diğer", - + "@albumTierRegular": {}, "storageVolumeDescriptionFallbackPrimary": "Dahili depolama", + "@storageVolumeDescriptionFallbackPrimary": {}, "storageVolumeDescriptionFallbackNonPrimary": "SD kart", + "@storageVolumeDescriptionFallbackNonPrimary": {}, "rootDirectoryDescription": "kök dizin", + "@rootDirectoryDescription": {}, "otherDirectoryDescription": "“{name}” dizin", + "@otherDirectoryDescription": {}, "storageAccessDialogMessage": "Bu uygulamaya erişim sağlamak için lütfen bir sonraki ekranda “{volume}” öğesinin {directory} dizinini seçin.", + "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "Bu uygulamanın “{volume}” içindeki {directory} dosyaları değiştirmesine izin verilmiyor.\n\nÖğeleri başka bir dizine taşımak için lütfen önceden yüklenmiş bir dosya yöneticisi veya galeri uygulaması kullanın.", - "notEnoughSpaceDialogMessage": "Bu işlemin tamamlanması için “{volume}” üzerinde {needSize} boş alana ihtiyaç var, ancak yalnızca {freeSize} kaldı.", + "@restrictedAccessDialogMessage": {}, + "notEnoughSpaceDialogMessage": "Bu işlemin tamamlanması için “{volume}” üzerinde {neededSize} boş alana ihtiyaç var, ancak yalnızca {freeSize} kaldı.", + "@notEnoughSpaceDialogMessage": {}, "missingSystemFilePickerDialogMessage": "Sistem dosya seçicisi eksik veya devre dışı. Lütfen etkinleştirin ve tekrar deneyin.", - + "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, =1{Bu işlem aşağıdaki türdeki öğeler için desteklenmez: {types}.} other{Bu işlem aşağıdaki türlerdeki öğeler için desteklenmez: {types}.}}", - + "@unsupportedTypeDialogMessage": {}, "nameConflictDialogSingleSourceMessage": "Hedef klasördeki bazı dosyalar aynı ada sahip.", + "@nameConflictDialogSingleSourceMessage": {}, "nameConflictDialogMultipleSourceMessage": "Bazı dosyalar aynı ada sahip.", - + "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "Kısayol etiketi", + "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "EKLE", - + "@addShortcutButtonLabel": {}, "noMatchingAppDialogMessage": "Bununla ilgilenebilecek bir uygulama yok.", - + "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{Bu öğe geri dönüşüm kutusuna taşınsın mı?} other{Bu {count} madde geri dönüşüm kutusuna atılsın mı?}}", - + "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Bu öğe silinsin mi?} other{Bu {count} öğe silinsin mi?}}", - - "moveUndatedConfirmationDialogMessage": "Devam etmeden önce öğe tarihleri ​​kaydedilsin mi?", + "@deleteEntriesConfirmationDialogMessage": {}, + "moveUndatedConfirmationDialogMessage": "Devam etmeden önce öğe tarihleri kaydedilsin mi?", + "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Tarihleri kaydet", - + "@moveUndatedConfirmationDialogSetDate": {}, "videoResumeDialogMessage": "{time} itibarıyla oynatmaya devam etmek istiyor musunuz?", - + "@videoResumeDialogMessage": {}, "videoStartOverButtonLabel": "BAŞTAN BAŞLA", + "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "SÜRDÜR", - + "@videoResumeButtonLabel": {}, "setCoverDialogLatest": "Son öğe", + "@setCoverDialogLatest": {}, "setCoverDialogAuto": "Otomatik", + "@setCoverDialogAuto": {}, "setCoverDialogCustom": "Özel", - + "@setCoverDialogCustom": {}, "hideFilterConfirmationDialogMessage": "Eşleşen fotoğraf ve videolar koleksiyonunuzdan gizlenecektir. Bunları “Gizlilik”, ayarlarından tekrar gösterebilirsiniz.\n\nBunları gizlemek istediğinizden emin misiniz?", - + "@hideFilterConfirmationDialogMessage": {}, "newAlbumDialogTitle": "Yeni Albüm", + "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "Albüm adı", + "@newAlbumDialogNameLabel": {}, "newAlbumDialogNameLabelAlreadyExistsHelper": "Dizin zaten var", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "Depolama:", - + "@newAlbumDialogStorageLabel": {}, "renameAlbumDialogLabel": "Yeni ad", + "@renameAlbumDialogLabel": {}, "renameAlbumDialogLabelAlreadyExistsHelper": "Dizin zaten var", - + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, "renameEntrySetPageTitle": "Yeniden adlandır", + "@renameEntrySetPageTitle": {}, "renameEntrySetPagePatternFieldLabel": "İsimlendirme şekli", + "@renameEntrySetPagePatternFieldLabel": {}, "renameEntrySetPageInsertTooltip": "Alan ekle", + "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "Önizleme", - + "@renameEntrySetPagePreviewSectionTitle": {}, "renameProcessorCounter": "Sayaç", + "@renameProcessorCounter": {}, "renameProcessorName": "Ad", - + "@renameProcessorName": {}, "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Bu albüm ve öğesi silinsin mi?} other{Bu albüm ve {count} öğesi silinsin mi?}}", - + "@deleteSingleAlbumConfirmationDialogMessage": {}, "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Bu albümler ve öğeleri silinsin mi?} other{Bu albümler ve {count} öğesi silinsin mi?}}", - + "@deleteMultiAlbumConfirmationDialogMessage": {}, "exportEntryDialogFormat": "Biçim:", + "@exportEntryDialogFormat": {}, "exportEntryDialogWidth": "Genişlik", + "@exportEntryDialogWidth": {}, "exportEntryDialogHeight": "Yükseklik", - + "@exportEntryDialogHeight": {}, "renameEntryDialogLabel": "Yeni ad", - + "@renameEntryDialogLabel": {}, "editEntryDialogTargetFieldsHeader": "Değiştirilecek alanlar", - + "@editEntryDialogTargetFieldsHeader": {}, "editEntryDateDialogTitle": "Tarih ve Saat", + "@editEntryDateDialogTitle": {}, "editEntryDateDialogSetCustom": "Özel tarih ayarla", + "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Başka bir tarihten kopyala", + "@editEntryDateDialogCopyField": {}, "editEntryDateDialogCopyItem": "Başka bir öğeden kopyala", + "@editEntryDateDialogCopyItem": {}, "editEntryDateDialogExtractFromTitle": "Başlıktan ayıkla", + "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Değişim", + "@editEntryDateDialogShift": {}, "editEntryDateDialogSourceFileModifiedDate": "Dosya değiştirilme tarihi", - + "@editEntryDateDialogSourceFileModifiedDate": {}, "durationDialogHours": "Saat", + "@durationDialogHours": {}, "durationDialogMinutes": "Dakika", - + "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Konum", + "@editEntryLocationDialogTitle": {}, "editEntryLocationDialogChooseOnMapTooltip": "Harita üzerinde seç", + "@editEntryLocationDialogChooseOnMapTooltip": {}, "editEntryLocationDialogLatitude": "Enlem", + "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Boylam", - + "@editEntryLocationDialogLongitude": {}, "locationPickerUseThisLocationButton": "Bu konumu kullan", - + "@locationPickerUseThisLocationButton": {}, "editEntryRatingDialogTitle": "Derecelendirme", - + "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "Meta veri kaldırma", + "@removeEntryMetadataDialogTitle": {}, "removeEntryMetadataDialogMore": "Daha fazla", - + "@removeEntryMetadataDialogMore": {}, "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Hareketli bir fotoğrafın içindeki videoyu oynatmak için XMP gereklidir.\n\nKaldırmak istediğinizden emin misiniz?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, "convertMotionPhotoToStillImageWarningDialogMessage": "Emin misiniz?", - + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, "videoSpeedDialogLabel": "Oynatma hızı", - + "@videoSpeedDialogLabel": {}, "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, "videoStreamSelectionDialogAudio": "Ses", + "@videoStreamSelectionDialogAudio": {}, "videoStreamSelectionDialogText": "Altyazı", + "@videoStreamSelectionDialogText": {}, "videoStreamSelectionDialogOff": "Kapalı", + "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "Parça", + "@videoStreamSelectionDialogTrack": {}, "videoStreamSelectionDialogNoSelection": "Başka parça yok.", - + "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "Başarılı!", + "@genericSuccessFeedback": {}, "genericFailureFeedback": "Başarısız", - + "@genericFailureFeedback": {}, "menuActionConfigureView": "Görünüm", + "@menuActionConfigureView": {}, "menuActionSelect": "Seç", + "@menuActionSelect": {}, "menuActionSelectAll": "Hepsini seç", + "@menuActionSelectAll": {}, "menuActionSelectNone": "Hiçbirini seçme", + "@menuActionSelectNone": {}, "menuActionMap": "Harita", + "@menuActionMap": {}, "menuActionStats": "İstatistikler", - + "@menuActionStats": {}, "viewDialogSortSectionTitle": "Sırala", + "@viewDialogSortSectionTitle": {}, "viewDialogGroupSectionTitle": "Grup", + "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "Düzen", - + "@viewDialogLayoutSectionTitle": {}, "tileLayoutGrid": "Izgara", + "@tileLayoutGrid": {}, "tileLayoutList": "Liste", - + "@tileLayoutList": {}, "coverDialogTabCover": "Kapak", + "@coverDialogTabCover": {}, "coverDialogTabApp": "Uygulama", + "@coverDialogTabApp": {}, "coverDialogTabColor": "Renk", - + "@coverDialogTabColor": {}, "appPickDialogTitle": "Uygulama seç", + "@appPickDialogTitle": {}, "appPickDialogNone": "Yok", - + "@appPickDialogNone": {}, "aboutPageTitle": "Hakkında", + "@aboutPageTitle": {}, "aboutLinkLicense": "Lisans", + "@aboutLinkLicense": {}, "aboutLinkPolicy": "Gizlilik Politikası", - + "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "Hata Bildirimi", + "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "Uygulama günlüklerini bir dosyaya kaydet", + "@aboutBugSaveLogInstruction": {}, "aboutBugCopyInfoInstruction": "Sistem bilgilerini kopyala", + "@aboutBugCopyInfoInstruction": {}, "aboutBugCopyInfoButton": "Kopyala", + "@aboutBugCopyInfoButton": {}, "aboutBugReportInstruction": "GitHub'da günlükleri ve sistem bilgilerini içeren bir rapor oluştur", + "@aboutBugReportInstruction": {}, "aboutBugReportButton": "Raporla", - + "@aboutBugReportButton": {}, "aboutCreditsSectionTitle": "Kredi", + "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "Bu uygulama bir TopoJSON dosyası kullanır", + "@aboutCreditsWorldAtlas1": {}, "aboutCreditsWorldAtlas2": "ISC Lisansı kapsamında.", + "@aboutCreditsWorldAtlas2": {}, "aboutTranslatorsSectionTitle": "Tercümanlar", - + "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "Açık Kaynak Lisansları", + "@aboutLicensesSectionTitle": {}, "aboutLicensesBanner": "Bu uygulama aşağıdaki açık kaynaklı paketleri ve kütüphaneleri kullanır.", + "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "Android Kütüphaneleri", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, "aboutLicensesFlutterPluginsSectionTitle": "Flutter Eklentileri", + "@aboutLicensesFlutterPluginsSectionTitle": {}, "aboutLicensesFlutterPackagesSectionTitle": "Flutter Paketleri", + "@aboutLicensesFlutterPackagesSectionTitle": {}, "aboutLicensesDartPackagesSectionTitle": "Dart Paketleri", + "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "Tüm Lisansları Göster", - + "@aboutLicensesShowAllButtonLabel": {}, "policyPageTitle": "Gizlilik Politikası", - + "@policyPageTitle": {}, "collectionPageTitle": "Koleksiyon", + "@collectionPageTitle": {}, "collectionPickPageTitle": "Seç", + "@collectionPickPageTitle": {}, "collectionSelectPageTitle": "Öğeleri seç", - + "@collectionSelectPageTitle": {}, "collectionActionShowTitleSearch": "Başlık filtresini göster", + "@collectionActionShowTitleSearch": {}, "collectionActionHideTitleSearch": "Başlık filtresini gizle", + "@collectionActionHideTitleSearch": {}, "collectionActionAddShortcut": "Kısayol ekle", + "@collectionActionAddShortcut": {}, "collectionActionEmptyBin": "Boş çöp kutusu", + "@collectionActionEmptyBin": {}, "collectionActionCopy": "Albüme kopyala", + "@collectionActionCopy": {}, "collectionActionMove": "Albüme taşı", + "@collectionActionMove": {}, "collectionActionRescan": "Yeniden tara", + "@collectionActionRescan": {}, "collectionActionEdit": "Düzenle", - + "@collectionActionEdit": {}, "collectionSearchTitlesHintText": "Başlıkları ara", - + "@collectionSearchTitlesHintText": {}, "collectionGroupAlbum": "Albüme göre", + "@collectionGroupAlbum": {}, "collectionGroupMonth": "Aya göre", + "@collectionGroupMonth": {}, "collectionGroupDay": "Güne göre", + "@collectionGroupDay": {}, "collectionGroupNone": "Gruplama", - + "@collectionGroupNone": {}, "sectionUnknown": "Bilinmeyen", + "@sectionUnknown": {}, "dateToday": "Bugün", + "@dateToday": {}, "dateYesterday": "Dün", + "@dateYesterday": {}, "dateThisMonth": "Bu ay", + "@dateThisMonth": {}, "collectionDeleteFailureFeedback": "{count, plural, =1{1 öğe silinemedi} other{{count} öğe silinemedi}}", - + "@collectionDeleteFailureFeedback": {}, "collectionCopyFailureFeedback": "{count, plural, =1{1 öğe kopyalanamadı} other{{count} öğe kopyalanamadı}}", - + "@collectionCopyFailureFeedback": {}, "collectionMoveFailureFeedback": "{count, plural, =1{1 öğe taşınamadı} other{{count} öğe taşınamadı}}", - + "@collectionMoveFailureFeedback": {}, "collectionRenameFailureFeedback": "{count, plural, =1{1 öğenin adı değiştirilemedi} other{{count} öğenin adı değiştirilemedi}}", - + "@collectionRenameFailureFeedback": {}, "collectionEditFailureFeedback": "{count, plural, =1{1 öğe düzenlenemedi} other{{count} öğe düzenlenemedi}}", - - "collectionExportFailureFeedback": "{count, plural, =1{1 sayfa dışa aktarılamadı} other{{count} sayfa dışa aktarılamadı}", - + "@collectionEditFailureFeedback": {}, + "collectionExportFailureFeedback": "{count, plural, =1{1 sayfa dışa aktarılamadı} other{{count} sayfa dışa aktarılamadı}}", + "@collectionExportFailureFeedback": {}, "collectionCopySuccessFeedback": "{count, plural, =1{1 öğe kopyalandı} other{{count} öğe kopyalandı}}", - + "@collectionCopySuccessFeedback": {}, "collectionMoveSuccessFeedback": "{count, plural, =1{1 öğe taşındı} other{{count} öğe taşındı}}", - + "@collectionMoveSuccessFeedback": {}, "collectionRenameSuccessFeedback": "{count, plural, =1{1 öğenin adı değiştirildi} other{{count} öğenin adı değiştirildi}}", - + "@collectionRenameSuccessFeedback": {}, "collectionEditSuccessFeedback": "{count, plural, =1{1 öğe düzenlendi} other{{count} öğe düzenlendi}}", - + "@collectionEditSuccessFeedback": {}, "collectionEmptyFavourites": "Favori yok", + "@collectionEmptyFavourites": {}, "collectionEmptyVideos": "Video yok", + "@collectionEmptyVideos": {}, "collectionEmptyImages": "Resim yok", + "@collectionEmptyImages": {}, "collectionEmptyGrantAccessButtonLabel": "Erişim izni", - + "@collectionEmptyGrantAccessButtonLabel": {}, "collectionSelectSectionTooltip": "Bölüm seç", + "@collectionSelectSectionTooltip": {}, "collectionDeselectSectionTooltip": "Bölüm seçimini kaldır", - + "@collectionDeselectSectionTooltip": {}, "drawerAboutButton": "Hakkında", + "@drawerAboutButton": {}, "drawerSettingsButton": "Ayarlar", + "@drawerSettingsButton": {}, "drawerCollectionAll": "Tüm koleksiyon", + "@drawerCollectionAll": {}, "drawerCollectionFavourites": "Favoriler", + "@drawerCollectionFavourites": {}, "drawerCollectionImages": "Resimler", + "@drawerCollectionImages": {}, "drawerCollectionVideos": "Videolar", + "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "Hareketli", + "@drawerCollectionAnimated": {}, "drawerCollectionMotionPhotos": "Hareketli fotoğraflar", + "@drawerCollectionMotionPhotos": {}, "drawerCollectionPanoramas": "Panoramalar", + "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "Raw fotoğraflar", + "@drawerCollectionRaws": {}, "drawerCollectionSphericalVideos": "360° Videolar", + "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "Albümler", + "@drawerAlbumPage": {}, "drawerCountryPage": "Ülkeler", + "@drawerCountryPage": {}, "drawerTagPage": "Etiketler", - + "@drawerTagPage": {}, "sortByDate": "Tarihe göre", + "@sortByDate": {}, "sortByName": "Adına göre", + "@sortByName": {}, "sortByItemCount": "Öğe sayısına göre", + "@sortByItemCount": {}, "sortBySize": "Boyuta göre", + "@sortBySize": {}, "sortByAlbumFileName": "Albüm ve dosya adına göre", + "@sortByAlbumFileName": {}, "sortByRating": "Derecelendirmeye göre", - + "@sortByRating": {}, "albumGroupTier": "Kademeye göre", + "@albumGroupTier": {}, "albumGroupVolume": "Depolama hacmine göre", + "@albumGroupVolume": {}, "albumGroupNone": "Gruplama", - + "@albumGroupNone": {}, "albumPickPageTitleCopy": "Albüme kopyala", + "@albumPickPageTitleCopy": {}, "albumPickPageTitleExport": "Albüme aktar", + "@albumPickPageTitleExport": {}, "albumPickPageTitleMove": "Albüme taşı", + "@albumPickPageTitleMove": {}, "albumPickPageTitlePick": "Albüm seç", - + "@albumPickPageTitlePick": {}, "albumCamera": "Kamera", + "@albumCamera": {}, "albumDownload": "İndir", + "@albumDownload": {}, "albumScreenshots": "Ekran görüntüleri", + "@albumScreenshots": {}, "albumScreenRecordings": "Ekran kayıtları", + "@albumScreenRecordings": {}, "albumVideoCaptures": "Video çekimleri", - + "@albumVideoCaptures": {}, "albumPageTitle": "Albümler", + "@albumPageTitle": {}, "albumEmpty": "Albüm yok", + "@albumEmpty": {}, "createAlbumTooltip": "Albüm oluştur", + "@createAlbumTooltip": {}, "createAlbumButtonLabel": "OLUŞTUR", + "@createAlbumButtonLabel": {}, "newFilterBanner": "yeni", - + "@newFilterBanner": {}, "countryPageTitle": "Ülkeler", + "@countryPageTitle": {}, "countryEmpty": "Ülke yok", - + "@countryEmpty": {}, "tagPageTitle": "Etiketler", + "@tagPageTitle": {}, "tagEmpty": "Etiket yok", - + "@tagEmpty": {}, "binPageTitle": "Geri Dönüşüm Kutusu", - + "@binPageTitle": {}, "searchCollectionFieldHint": "Koleksiyonu ara", + "@searchCollectionFieldHint": {}, "searchRecentSectionTitle": "Yakın zamanda", + "@searchRecentSectionTitle": {}, "searchDateSectionTitle": "Tarih", + "@searchDateSectionTitle": {}, "searchAlbumsSectionTitle": "Albümler", + "@searchAlbumsSectionTitle": {}, "searchCountriesSectionTitle": "Ülkeler", + "@searchCountriesSectionTitle": {}, "searchPlacesSectionTitle": "Yerler", + "@searchPlacesSectionTitle": {}, "searchTagsSectionTitle": "Etiketler", + "@searchTagsSectionTitle": {}, "searchRatingSectionTitle": "Derecelendirmeler", - + "@searchRatingSectionTitle": {}, "settingsPageTitle": "Ayarlar", + "@settingsPageTitle": {}, "settingsSystemDefault": "Sistem", + "@settingsSystemDefault": {}, "settingsDefault": "Varsayılan", - + "@settingsDefault": {}, "settingsSearchFieldLabel": "Ayarlarda ara", + "@settingsSearchFieldLabel": {}, "settingsSearchEmpty": "Eşleşen ayar bulunamadı", + "@settingsSearchEmpty": {}, "settingsActionExport": "Dışa aktar", + "@settingsActionExport": {}, "settingsActionExportDialogTitle": "Dışa aktar", + "@settingsActionExportDialogTitle": {}, "settingsActionImport": "İçe aktar", + "@settingsActionImport": {}, "settingsActionImportDialogTitle": "İçe aktar", - + "@settingsActionImportDialogTitle": {}, "appExportCovers": "Kapaklar", + "@appExportCovers": {}, "appExportFavourites": "Favoriler", + "@appExportFavourites": {}, "appExportSettings": "Ayarlar", - + "@appExportSettings": {}, "settingsNavigationSectionTitle": "Gezinti", + "@settingsNavigationSectionTitle": {}, "settingsHomeTile": "Anasayfa", + "@settingsHomeTile": {}, "settingsHomeDialogTitle": "Anasayfa", + "@settingsHomeDialogTitle": {}, "settingsShowBottomNavigationBar": "Alt gezinti çubuğunu göster", + "@settingsShowBottomNavigationBar": {}, "settingsKeepScreenOnTile": "Ekranı açık tut", + "@settingsKeepScreenOnTile": {}, "settingsKeepScreenOnDialogTitle": "Ekranı Açık Tut", + "@settingsKeepScreenOnDialogTitle": {}, "settingsDoubleBackExit": "Çıkmak için iki kez “geri” düğmesine dokunun", - + "@settingsDoubleBackExit": {}, "settingsConfirmationTile": "Onaylama diyalogları", + "@settingsConfirmationTile": {}, "settingsConfirmationDialogTitle": "Onaylama Diyalogları", + "@settingsConfirmationDialogTitle": {}, "settingsConfirmationBeforeDeleteItems": "Öğeleri sonsuza dek silmeden önce sor", + "@settingsConfirmationBeforeDeleteItems": {}, "settingsConfirmationBeforeMoveToBinItems": "Eşyaları geri dönüşüm kutusuna atmadan önce sor", + "@settingsConfirmationBeforeMoveToBinItems": {}, "settingsConfirmationBeforeMoveUndatedItems": "Tarihsiz eşyaları taşımadan önce sor", - + "@settingsConfirmationBeforeMoveUndatedItems": {}, "settingsNavigationDrawerTile": "Gezinti menüsü", + "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "Gezinti Menüsü", + "@settingsNavigationDrawerEditorPageTitle": {}, "settingsNavigationDrawerBanner": "Menü öğelerini taşımak ve yeniden sıralamak için dokunun ve basılı tutun.", + "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "Türler", + "@settingsNavigationDrawerTabTypes": {}, "settingsNavigationDrawerTabAlbums": "Albümler", + "@settingsNavigationDrawerTabAlbums": {}, "settingsNavigationDrawerTabPages": "Sayfalar", + "@settingsNavigationDrawerTabPages": {}, "settingsNavigationDrawerAddAlbum": "Albüm ekle", - + "@settingsNavigationDrawerAddAlbum": {}, "settingsThumbnailSectionTitle": "Küçük resimler", + "@settingsThumbnailSectionTitle": {}, "settingsThumbnailOverlayTile": "Kaplama", + "@settingsThumbnailOverlayTile": {}, "settingsThumbnailOverlayPageTitle": "Kaplama", + "@settingsThumbnailOverlayPageTitle": {}, "settingsThumbnailShowFavouriteIcon": "Favori simgeyi göster", + "@settingsThumbnailShowFavouriteIcon": {}, "settingsThumbnailShowTagIcon": "Etiket simgesini göster", + "@settingsThumbnailShowTagIcon": {}, "settingsThumbnailShowLocationIcon": "Konum simgesini göster", + "@settingsThumbnailShowLocationIcon": {}, "settingsThumbnailShowMotionPhotoIcon": "Hareketli fotoğraf simgesini göster", + "@settingsThumbnailShowMotionPhotoIcon": {}, "settingsThumbnailShowRating": "Derecelendirmeyi göster", + "@settingsThumbnailShowRating": {}, "settingsThumbnailShowRawIcon": "Raw simgesini göster", + "@settingsThumbnailShowRawIcon": {}, "settingsThumbnailShowVideoDuration": "Video süresini göster", - + "@settingsThumbnailShowVideoDuration": {}, "settingsCollectionQuickActionsTile": "Hızlı eylemler", + "@settingsCollectionQuickActionsTile": {}, "settingsCollectionQuickActionEditorPageTitle": "Hızlı Eylemler", + "@settingsCollectionQuickActionEditorPageTitle": {}, "settingsCollectionQuickActionTabBrowsing": "Gözatma", + "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "Seçme", + "@settingsCollectionQuickActionTabSelecting": {}, "settingsCollectionBrowsingQuickActionEditorBanner": "Düğmeleri hareket ettirmek ve öğelere göz atarken hangi eylemlerin görüntüleneceğini seçmek için dokunun ve basılı tutun.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "Düğmeleri hareket ettirmek ve öğeleri seçerken hangi eylemlerin görüntüleneceğini seçmek için dokunun ve basılı tutun.", - + "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "Görüntüleyici", + "@settingsViewerSectionTitle": {}, "settingsViewerUseCutout": "Kesim alanını kullan", + "@settingsViewerUseCutout": {}, "settingsViewerMaximumBrightness": "Maksimum parlaklık", + "@settingsViewerMaximumBrightness": {}, "settingsMotionPhotoAutoPlay": "Hareketli fotoğrafları otomatik oynat", + "@settingsMotionPhotoAutoPlay": {}, "settingsImageBackground": "Resim arka planı", - + "@settingsImageBackground": {}, "settingsViewerQuickActionsTile": "Hızlı eylemler", + "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "Hızlı Eylemler", + "@settingsViewerQuickActionEditorPageTitle": {}, "settingsViewerQuickActionEditorBanner": "Düğmeleri hareket ettirmek ve görüntüleyicide hangi eylemlerin görüntüleneceğini seçmek için dokunun ve basılı tutun.", + "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Gösterilen Düğmeler", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Mevcut Düğmeler", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, "settingsViewerQuickActionEmpty": "Düğme yok", - + "@settingsViewerQuickActionEmpty": {}, "settingsViewerOverlayTile": "Kaplama", + "@settingsViewerOverlayTile": {}, "settingsViewerOverlayPageTitle": "Kaplama", + "@settingsViewerOverlayPageTitle": {}, "settingsViewerShowOverlayOnOpening": "Açılışta göster", + "@settingsViewerShowOverlayOnOpening": {}, "settingsViewerShowMinimap": "Mini haritayı göster", + "@settingsViewerShowMinimap": {}, "settingsViewerShowInformation": "Bilgileri göster", + "@settingsViewerShowInformation": {}, "settingsViewerShowInformationSubtitle": "Başlığı, tarihi, konumu vb. göster.", + "@settingsViewerShowInformationSubtitle": {}, "settingsViewerShowShootingDetails": "Çekim ayrıntılarını göster", + "@settingsViewerShowShootingDetails": {}, "settingsViewerShowOverlayThumbnails": "Küçük resimleri göster", + "@settingsViewerShowOverlayThumbnails": {}, "settingsViewerEnableOverlayBlurEffect": "Bulanıklık efekti", - + "@settingsViewerEnableOverlayBlurEffect": {}, "settingsVideoPageTitle": "Video Ayarları", + "@settingsVideoPageTitle": {}, "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, "settingsVideoShowVideos": "Videoları göster", + "@settingsVideoShowVideos": {}, "settingsVideoEnableHardwareAcceleration": "Donanım hızlandırma", + "@settingsVideoEnableHardwareAcceleration": {}, "settingsVideoAutoPlay": "Otomatik oynat", + "@settingsVideoAutoPlay": {}, "settingsVideoLoopModeTile": "Döngü modu", + "@settingsVideoLoopModeTile": {}, "settingsVideoLoopModeDialogTitle": "Döngü Modu", - + "@settingsVideoLoopModeDialogTitle": {}, "settingsSubtitleThemeTile": "Altyazılar", + "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "Altyazılar", + "@settingsSubtitleThemePageTitle": {}, "settingsSubtitleThemeSample": "Bu bir örnek.", + "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "Metin hizalama", + "@settingsSubtitleThemeTextAlignmentTile": {}, "settingsSubtitleThemeTextAlignmentDialogTitle": "Metin Hizalama", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, "settingsSubtitleThemeTextSize": "Metin boyutu", + "@settingsSubtitleThemeTextSize": {}, "settingsSubtitleThemeShowOutline": "Dış çizgiyi ve gölgeyi göster", + "@settingsSubtitleThemeShowOutline": {}, "settingsSubtitleThemeTextColor": "Metin rengi", + "@settingsSubtitleThemeTextColor": {}, "settingsSubtitleThemeTextOpacity": "Metin opaklığı", + "@settingsSubtitleThemeTextOpacity": {}, "settingsSubtitleThemeBackgroundColor": "Arka plan rengi", + "@settingsSubtitleThemeBackgroundColor": {}, "settingsSubtitleThemeBackgroundOpacity": "Arka plan opaklığı", + "@settingsSubtitleThemeBackgroundOpacity": {}, "settingsSubtitleThemeTextAlignmentLeft": "Sol", + "@settingsSubtitleThemeTextAlignmentLeft": {}, "settingsSubtitleThemeTextAlignmentCenter": "Merkez", + "@settingsSubtitleThemeTextAlignmentCenter": {}, "settingsSubtitleThemeTextAlignmentRight": "Sağ", - + "@settingsSubtitleThemeTextAlignmentRight": {}, "settingsVideoControlsTile": "Kontroller", + "@settingsVideoControlsTile": {}, "settingsVideoControlsPageTitle": "Kontroller", + "@settingsVideoControlsPageTitle": {}, "settingsVideoButtonsTile": "Düğmeler", + "@settingsVideoButtonsTile": {}, "settingsVideoGestureDoubleTapTogglePlay": "Oynatmak/duraklatmak için çift dokunun", + "@settingsVideoGestureDoubleTapTogglePlay": {}, "settingsVideoGestureSideDoubleTapSeek": "Geri/ileri aramak için ekran kenarlarına çift dokunun", - + "@settingsVideoGestureSideDoubleTapSeek": {}, "settingsPrivacySectionTitle": "Gizlilik", + "@settingsPrivacySectionTitle": {}, "settingsAllowInstalledAppAccess": "Uygulama envanterine erişime izin ver", + "@settingsAllowInstalledAppAccess": {}, "settingsAllowInstalledAppAccessSubtitle": "Albüm görüntüsünü iyileştirmek için kullanılır", + "@settingsAllowInstalledAppAccessSubtitle": {}, "settingsAllowErrorReporting": "Anonim hata raporlamasına izin ver", + "@settingsAllowErrorReporting": {}, "settingsSaveSearchHistory": "Arama geçmişini kaydet", + "@settingsSaveSearchHistory": {}, "settingsEnableBin": "Geri dönüşüm kutusunu kullan", + "@settingsEnableBin": {}, "settingsEnableBinSubtitle": "Silinen öğeleri 30 gün boyunca saklar", - + "@settingsEnableBinSubtitle": {}, "settingsHiddenItemsTile": "Gizli öğeler", + "@settingsHiddenItemsTile": {}, "settingsHiddenItemsPageTitle": "Gizli Öğeler", - + "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "Gizli Filtreler", + "@settingsHiddenItemsTabFilters": {}, "settingsHiddenFiltersBanner": "Gizli filtrelerle eşleşen fotoğraflar ve videolar koleksiyonunuzda görünmeyecektir.", + "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "Gizli filtre yok", - + "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "Gizli Yollar", + "@settingsHiddenItemsTabPaths": {}, "settingsHiddenPathsBanner": "Bu klasörlerdeki veya alt klasörlerindeki fotoğraflar ve videolar koleksiyonunuzda görünmeyecektir.", + "@settingsHiddenPathsBanner": {}, "addPathTooltip": "Yol ekle", - + "@addPathTooltip": {}, "settingsStorageAccessTile": "Depolama erişimi", + "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "Depolama Erişimi", + "@settingsStorageAccessPageTitle": {}, "settingsStorageAccessBanner": "Bazı dizinler, içlerindeki dosyaları değiştirmek için açık bir erişim izni gerektirir. Daha önce erişim izni verdiğiniz dizinleri buradan inceleyebilirsiniz.", + "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "Erişim izni yok", + "@settingsStorageAccessEmpty": {}, "settingsStorageAccessRevokeTooltip": "Geri al", - + "@settingsStorageAccessRevokeTooltip": {}, "settingsAccessibilitySectionTitle": "Erişilebilirlik", + "@settingsAccessibilitySectionTitle": {}, "settingsRemoveAnimationsTile": "Animasyonları kaldır", + "@settingsRemoveAnimationsTile": {}, "settingsRemoveAnimationsDialogTitle": "Animasyonları Kaldır", + "@settingsRemoveAnimationsDialogTitle": {}, "settingsTimeToTakeActionTile": "Harekete geçme zamanı", - + "@settingsTimeToTakeActionTile": {}, "settingsDisplaySectionTitle": "Ekran", + "@settingsDisplaySectionTitle": {}, "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, "settingsThemeColorHighlights": "Renk vurguları", + "@settingsThemeColorHighlights": {}, "settingsThemeEnableDynamicColor": "Dinamik renk", + "@settingsThemeEnableDynamicColor": {}, "settingsDisplayRefreshRateModeTile": "Görüntü yenileme hızı", + "@settingsDisplayRefreshRateModeTile": {}, "settingsDisplayRefreshRateModeDialogTitle": "Yenileme Hızı", - + "@settingsDisplayRefreshRateModeDialogTitle": {}, "settingsLanguageSectionTitle": "Dil ve Biçimler", + "@settingsLanguageSectionTitle": {}, "settingsLanguageTile": "Dil", + "@settingsLanguageTile": {}, "settingsLanguagePageTitle": "Dil", + "@settingsLanguagePageTitle": {}, "settingsCoordinateFormatTile": "Koordinat formatı", + "@settingsCoordinateFormatTile": {}, "settingsCoordinateFormatDialogTitle": "Koordinat Formatı", + "@settingsCoordinateFormatDialogTitle": {}, "settingsUnitSystemTile": "Birimler", + "@settingsUnitSystemTile": {}, "settingsUnitSystemDialogTitle": "Birimler", - + "@settingsUnitSystemDialogTitle": {}, "settingsWidgetPageTitle": "Fotoğraf Çerçevesi", - + "@settingsWidgetPageTitle": {}, "settingsCollectionTile": "Koleksiyon", - + "@settingsCollectionTile": {}, "statsPageTitle": "İstatistikler", + "@statsPageTitle": {}, "statsWithGps": "{count, plural, =1{1 konuma sahip öğe} other{{count} konuma sahip öğe}}", + "@statsWithGps": {}, "statsTopCountriesSectionTitle": "Başlıca Ülkeler", + "@statsTopCountriesSectionTitle": {}, "statsTopPlacesSectionTitle": "Başlıca Yerler", + "@statsTopPlacesSectionTitle": {}, "statsTopTagsSectionTitle": "Başlıca Etiketler", - + "@statsTopTagsSectionTitle": {}, "viewerOpenPanoramaButtonLabel": "PANORAMAYI AÇ", + "@viewerOpenPanoramaButtonLabel": {}, "viewerErrorUnknown": "Tüh!", + "@viewerErrorUnknown": {}, "viewerErrorDoesNotExist": "Dosya artık mevcut değil.", - + "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "Bilgi", + "@viewerInfoPageTitle": {}, "viewerInfoBackToViewerTooltip": "Görüntüleyiciye geri dön", - + "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "bilinmeyen", + "@viewerInfoUnknown": {}, "viewerInfoLabelTitle": "Başlık", + "@viewerInfoLabelTitle": {}, "viewerInfoLabelDate": "Tarih", + "@viewerInfoLabelDate": {}, "viewerInfoLabelResolution": "Çözünürlük", + "@viewerInfoLabelResolution": {}, "viewerInfoLabelSize": "Boyut", + "@viewerInfoLabelSize": {}, "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, "viewerInfoLabelPath": "Yol", + "@viewerInfoLabelPath": {}, "viewerInfoLabelDuration": "Süre", + "@viewerInfoLabelDuration": {}, "viewerInfoLabelOwner": "Sahibi", + "@viewerInfoLabelOwner": {}, "viewerInfoLabelCoordinates": "Koordinatlar", + "@viewerInfoLabelCoordinates": {}, "viewerInfoLabelAddress": "Adres", - + "@viewerInfoLabelAddress": {}, "mapStyleDialogTitle": "Harita Şekli", + "@mapStyleDialogTitle": {}, "mapStyleTooltip": "Harita şeklini seç", + "@mapStyleTooltip": {}, "mapZoomInTooltip": "Yakınlaştır", + "@mapZoomInTooltip": {}, "mapZoomOutTooltip": "Uzaklaştır", + "@mapZoomOutTooltip": {}, "mapPointNorthUpTooltip": "Kuzeyi göster", + "@mapPointNorthUpTooltip": {}, "mapAttributionOsmHot": "Harita verileri © [OpenStreetMap](https://www.openstreetmap.org/copyright) katkıda bulunanlar - Kutucuklar [HOT](https://www.hotosm.org/) tarafından hazırlanmıştır - [OSM France](https://openstreetmap.fr/) tarafından barındırılmaktadır", + "@mapAttributionOsmHot": {}, "mapAttributionStamen": "Harita verileri © [OpenStreetMap](https://www.openstreetmap.org/copyright) katkıda bulunanlar - Döşemeler [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, "openMapPageTooltip": "Harita sayfasında görüntüle", + "@openMapPageTooltip": {}, "mapEmptyRegion": "Bu bölgede resim yok", - + "@mapEmptyRegion": {}, "viewerInfoOpenEmbeddedFailureFeedback": "Gömülü veriler ayıklanamadı", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, "viewerInfoOpenLinkText": "Aç", + "@viewerInfoOpenLinkText": {}, "viewerInfoViewXmlLinkText": "XML'i Görüntüle", - + "@viewerInfoViewXmlLinkText": {}, "viewerInfoSearchFieldLabel": "Meta verileri ara", + "@viewerInfoSearchFieldLabel": {}, "viewerInfoSearchEmpty": "Eşleşen anahtar yok", + "@viewerInfoSearchEmpty": {}, "viewerInfoSearchSuggestionDate": "Tarih ve saat", + "@viewerInfoSearchSuggestionDate": {}, "viewerInfoSearchSuggestionDescription": "Açıklama", + "@viewerInfoSearchSuggestionDescription": {}, "viewerInfoSearchSuggestionDimensions": "Boyutlar", + "@viewerInfoSearchSuggestionDimensions": {}, "viewerInfoSearchSuggestionResolution": "Çözünürlük", + "@viewerInfoSearchSuggestionResolution": {}, "viewerInfoSearchSuggestionRights": "Haklar", - + "@viewerInfoSearchSuggestionRights": {}, "tagEditorPageTitle": "Etiketleri Düzenle", + "@tagEditorPageTitle": {}, "tagEditorPageNewTagFieldLabel": "Yeni etiket", + "@tagEditorPageNewTagFieldLabel": {}, "tagEditorPageAddTagTooltip": "Etiket ekle", + "@tagEditorPageAddTagTooltip": {}, "tagEditorSectionRecent": "Yakın zamanda", - + "@tagEditorSectionRecent": {}, "panoramaEnableSensorControl": "Sensör kontrolünü etkinleştir", + "@panoramaEnableSensorControl": {}, "panoramaDisableSensorControl": "Sensör kontrolünü devre dışı bırak", - + "@panoramaDisableSensorControl": {}, "sourceViewerPageTitle": "Kaynak", - + "@sourceViewerPageTitle": {}, "filePickerShowHiddenFiles": "Gizli dosyaları göster", + "@filePickerShowHiddenFiles": {}, "filePickerDoNotShowHiddenFiles": "Gizli dosyaları gösterme", + "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "Şuradan aç", + "@filePickerOpenFrom": {}, "filePickerNoItems": "Öğe yok", - "filePickerUseThisFolder": "Bu klasörü kullan" + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "Bu klasörü kullan", + "@filePickerUseThisFolder": {} } From 71d86c5424c8dc7aaedd053464b866400128c051 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Wed, 19 Oct 2022 22:36:58 +0200 Subject: [PATCH 07/53] l10n by weblate (#358) Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/el/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translation: Aves/App - Main Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> From 12c82772101c8e04a39d316f8a3bb4482d65a7ac Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Thu, 20 Oct 2022 00:47:06 +0200 Subject: [PATCH 08/53] l10n by weblate (#363) Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Weblate <noreply@weblate.org> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/el/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/it/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/el/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> --- android/app/src/main/res/values-de/strings.xml | 2 +- fastlane/metadata/android/el/short_description.txt | 2 +- fastlane/metadata/android/it/full_description.txt | 4 ++-- fastlane/metadata/android/it/short_description.txt | 2 +- fastlane/metadata/android/ja/full_description.txt | 6 ++---- fastlane/metadata/android/pt-BR/full_description.txt | 2 +- fastlane/metadata/android/pt-BR/short_description.txt | 2 +- fastlane/metadata/android/tr/full_description.txt | 2 +- fastlane/metadata/android/zh-CN/full_description.txt | 2 +- fastlane/metadata/android/zh-CN/short_description.txt | 2 +- 10 files changed, 12 insertions(+), 14 deletions(-) diff --git a/android/app/src/main/res/values-de/strings.xml b/android/app/src/main/res/values-de/strings.xml index d4c317a8c..1fa49e8a6 100644 --- a/android/app/src/main/res/values-de/strings.xml +++ b/android/app/src/main/res/values-de/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Aves</string> <string name="app_widget_label">Bilderrahmen</string> diff --git a/fastlane/metadata/android/el/short_description.txt b/fastlane/metadata/android/el/short_description.txt index fd9a88558..f1ebd1f6a 100644 --- a/fastlane/metadata/android/el/short_description.txt +++ b/fastlane/metadata/android/el/short_description.txt @@ -1 +1 @@ -Συλλογή φωτογραφιών και εξερεύνηση των μεταδεδομένων. \ No newline at end of file +Συλλογή φωτογραφιών και εξερεύνηση των μεταδεδομένων \ No newline at end of file diff --git a/fastlane/metadata/android/it/full_description.txt b/fastlane/metadata/android/it/full_description.txt index 502df17e5..6a0659c07 100644 --- a/fastlane/metadata/android/it/full_description.txt +++ b/fastlane/metadata/android/it/full_description.txt @@ -1,5 +1,5 @@ -<i>Aves</i> può gestire tutti i tipi di immagini e video, compresi i tipici JPEG e MP4, ma anche cose più esotiche come <b>TIFF multipagina, SVG, vecchi AVI e molto di più</b>! Scansiona la tua collezione di media per identificare <b>foto in movimento</b>, <b>panorami</b> (le foto sferiche), <b>video a 360°</b>, così come i file <b>GeoTIFF</b>. +<i>Aves</i> può gestire tutti i tipi di immagini e video, compresi i tipici JPEG e MP4, ma anche cose più esotiche come <b>TIFF multipagina, SVG, vecchi AVI e molto di più</b>! Scansiona la tua collezione di media per identificare <b>foto in movimento</b>, <b>panorami</b> (le foto sferiche), <b>video a 360°</b>, così come i file <b>GeoTIFF</b>. <b>Navigazione e ricerca</b> sono una parte importante di <i>Aves</i>. L'obiettivo è che gli utenti passino facilmente dagli album alle foto, ai tag, alle mappe, ecc. -<i>Aves</i> si integra con Android (da <b>API 19 a 33</b>, cioè da KitKat ad Android 13) con caratteristiche come <b>collegamenti alle app</b> e la gestione della <b>ricerca globale</b>. Funziona anche come <b>visualizzazione e raccolta di media</b>. +<i>Aves</i> si integra con Android (da <b>API 19 a 33</b>, cioè da KitKat ad Android 13) con caratteristiche come <b>collegamenti alle app</b> e la gestione della <b>ricerca globale</b>. Funziona anche come <b>visualizzazione e raccolta di media</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/it/short_description.txt b/fastlane/metadata/android/it/short_description.txt index 09b239bbe..9eb3e64e2 100644 --- a/fastlane/metadata/android/it/short_description.txt +++ b/fastlane/metadata/android/it/short_description.txt @@ -1 +1 @@ -Galleria e esploratore di metadati +Galleria e esploratore di metadati \ No newline at end of file diff --git a/fastlane/metadata/android/ja/full_description.txt b/fastlane/metadata/android/ja/full_description.txt index 07e57595b..996e794a5 100644 --- a/fastlane/metadata/android/ja/full_description.txt +++ b/fastlane/metadata/android/ja/full_description.txt @@ -1,7 +1,5 @@ -<i>Aves</i>はあらゆる画像や動画を扱うことができ、一般的なJPEGやMP4はもちろん、 <b>マルチページTIFF、SVG、古いAVIなどの珍しい形式にも対応</b>しています! +<i>Aves</i>はあらゆる画像や動画を扱うことができ、一般的なJPEGやMP4はもちろん、 <b>マルチページTIFF、SVG、古いAVIなどの珍しい形式にも対応</b>しています! メディアコレクションをスキャンして、<b>モーションフォト</b>、<b>パノラマ</b>(Photo Sphere)、<b>360°動画</b>、<b>GeoTIFF</b>ファイルなどを識別します。 -メディアコレクションをスキャンして、<b>モーションフォト</b>、<b>パノラマ</b>(Photo Sphere)、<b>360°動画</b>、<b>GeoTIFF</b>ファイルなどを識別します。 - -<b>ナビゲーションと検索</b>は、Avesの重要な部分です。アルバムから写真、タグ、地図などへ簡単に移動できます。 +<b>ナビゲーションと検索</b>は、<i>Aves</i>の重要な部分です。アルバムから写真、タグ、地図などへ簡単に移動できます。 <i>Aves</i>は、<b>アプリショートカット</b>や<b>グローバル検索</b>などの機能を、Android(<b>API 19から33まで</b>、つまりAndroid 4.4から13 Lまで)と統合しています。また、<b>メディアビューワー</b>や<b>メディアピッカー</b>としても機能します。 \ No newline at end of file diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt index 657c4fa54..a095036ca 100644 --- a/fastlane/metadata/android/pt-BR/full_description.txt +++ b/fastlane/metadata/android/pt-BR/full_description.txt @@ -2,4 +2,4 @@ <b>Navegação e pesquisa</b> é uma parte importante do <i>Aves</i>. O objetivo é que os usuários fluam facilmente de álbuns para fotos, etiquetas, mapas, etc. -<i>Aves</i> integra com Android (de <b>API 19 para 33</b>, i.e. de KitKat para Android 13) com recursos como <b>atalhos de apps</b> e <b>pesquisa global</b> manipulação. Também funciona como um <b>visualizador e selecionador de mídia</b>. +<i>Aves</i> integra com Android (de <b>API 19 para 33</b>, i.e. de KitKat para Android 13) com recursos como <b>atalhos de apps</b> e <b>pesquisa global</b> manipulação. Também funciona como um <b>visualizador e selecionador de mídia</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/pt-BR/short_description.txt b/fastlane/metadata/android/pt-BR/short_description.txt index df48f8c44..ddf48df4d 100644 --- a/fastlane/metadata/android/pt-BR/short_description.txt +++ b/fastlane/metadata/android/pt-BR/short_description.txt @@ -1 +1 @@ -Galeria e explorador de metadados +Galeria e explorador de metadados \ No newline at end of file diff --git a/fastlane/metadata/android/tr/full_description.txt b/fastlane/metadata/android/tr/full_description.txt index 507df09bf..c966a3094 100644 --- a/fastlane/metadata/android/tr/full_description.txt +++ b/fastlane/metadata/android/tr/full_description.txt @@ -2,4 +2,4 @@ <b>Gezinme ve arama</b> <i>Aves'in</i> önemli bir parçasıdır. Amaç, kullanıcıların albümlerden fotoğraflara, etiketlerden haritalara vb. kolayca geçmesini sağlamaktır. -<i>Aves</i>, <b>uygulama kısayolları</b> ve <b>global arama<b> işleme gibi özelliklerle Android (<b>API 19'dan 33'ye</b>, yani KitKat'tan Android 13'ye kadar) ile entegre olur. Ayrıca bir <b>medya görüntüleyici ve alıcı</b> olarak da çalışır. \ No newline at end of file +<i>Aves</i>, <b>uygulama kısayolları</b> ve <b>global arama</b> işleme gibi özelliklerle Android (<b>API 19'dan 33'ye</b>, yani KitKat'tan Android 13'ye kadar) ile entegre olur. Ayrıca bir <b>medya görüntüleyici ve alıcı</b> olarak da çalışır. \ No newline at end of file diff --git a/fastlane/metadata/android/zh-CN/full_description.txt b/fastlane/metadata/android/zh-CN/full_description.txt index ad4a076d4..60e648f54 100644 --- a/fastlane/metadata/android/zh-CN/full_description.txt +++ b/fastlane/metadata/android/zh-CN/full_description.txt @@ -2,4 +2,4 @@ <b>导航与搜索</b>是 <i>Aves</i> 的核心功能之一,旨在帮助用户在相册、照片、标签、地图等之间轻松切换。 -<i> Aves</i> 与 Android(<b>API 19-33</b>,即从 KitKat 到 Android 13)集成,具有<b>快捷方式</b>和<b>全局搜索</b>等功能。它还可用作<b>媒体查看器和选择器<b>。 +<i> Aves</i> 与 Android(<b>API 19-33</b>,即从 KitKat 到 Android 13)集成,具有<b>快捷方式</b>和<b>全局搜索</b>等功能。它还可用作<b>媒体查看器和选择器</b>。 \ No newline at end of file diff --git a/fastlane/metadata/android/zh-CN/short_description.txt b/fastlane/metadata/android/zh-CN/short_description.txt index 0a4ad6803..0837be9a6 100644 --- a/fastlane/metadata/android/zh-CN/short_description.txt +++ b/fastlane/metadata/android/zh-CN/short_description.txt @@ -1 +1 @@ -相册和元数据浏览器 +相册和元数据浏览器 \ No newline at end of file From c77a9f670a819dfc341213c854915516a3c77449 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Thu, 20 Oct 2022 11:56:07 +0200 Subject: [PATCH 09/53] upgraded Flutter to stable v3.3.5 --- .github/workflows/check.yml | 2 +- .github/workflows/release.yml | 10 +++++----- CHANGELOG.md | 4 ++++ pubspec.lock | 32 +++++++++++++++--------------- scripts/apply_flavor_huawei.sh | 4 ++++ scripts/apply_flavor_izzy.sh | 4 ++++ scripts/apply_flavor_play.sh | 4 ++++ scripts/pub_get_all.sh | 7 +++++-- scripts/pub_upgrade_all.sh | 7 +++++-- scripts/screenshot_post_process.sh | 4 ++++ shaders_3.3.4.sksl.json | 1 - shaders_3.3.5.sksl.json | 1 + test_driver/utils/adb_utils.dart | 2 +- 13 files changed, 54 insertions(+), 28 deletions(-) delete mode 100644 shaders_3.3.4.sksl.json create mode 100644 shaders_3.3.5.sksl.json diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index a4fd88b54..9db2bb842 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -17,7 +17,7 @@ jobs: # Available versions may lag behind https://github.com/flutter/flutter.git - uses: subosito/flutter-action@v2 with: - flutter-version: '3.3.4' + flutter-version: '3.3.5' channel: 'stable' - name: Clone the repository. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 92122dc20..89be3e49e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: # Available versions may lag behind https://github.com/flutter/flutter.git - uses: subosito/flutter-action@v2 with: - flutter-version: '3.3.4' + flutter-version: '3.3.5' channel: 'stable' # Workaround for this Android Gradle Plugin issue (supposedly fixed in AGP 4.1): @@ -56,15 +56,15 @@ jobs: rm release.keystore.asc mkdir outputs (cd scripts/; ./apply_flavor_play.sh) - flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.4.sksl.json + flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.5.sksl.json cp build/app/outputs/bundle/playRelease/*.aab outputs - flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.4.sksl.json + flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.5.sksl.json cp build/app/outputs/apk/play/release/*.apk outputs (cd scripts/; ./apply_flavor_huawei.sh) - flutter build apk -t lib/main_huawei.dart --flavor huawei --bundle-sksl-path shaders_3.3.4.sksl.json + flutter build apk -t lib/main_huawei.dart --flavor huawei --bundle-sksl-path shaders_3.3.5.sksl.json cp build/app/outputs/apk/huawei/release/*.apk outputs (cd scripts/; ./apply_flavor_izzy.sh) - flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_3.3.4.sksl.json + flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_3.3.5.sksl.json cp build/app/outputs/apk/izzy/release/*.apk outputs rm $AVES_STORE_FILE env: diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b463c943..120d0bf6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ All notable changes to this project will be documented in this file. - Collection / Info: edit MP4 metadata (date / location / title / description / rating / tags) - Widget: option to open collection on tap +### Changed + +- upgraded Flutter to stable v3.3.5 + ### Fixed - rendering of panoramas with inconsistent metadata diff --git a/pubspec.lock b/pubspec.lock index dc2df58ff..ac700ef9d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,7 +14,7 @@ packages: name: _flutterfire_internals url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.0.4" analyzer: dependency: transitive description: @@ -126,14 +126,14 @@ packages: name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "5.7.7" + version: "5.8.1" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "2.8.10" + version: "3.0.1" collection: dependency: "direct main" description: @@ -147,14 +147,14 @@ packages: name: connectivity_plus url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" connectivity_plus_platform_interface: dependency: transitive description: name: connectivity_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.2.2" + version: "1.2.3" convert: dependency: transitive description: @@ -210,14 +210,14 @@ packages: name: device_info_plus url: "https://pub.dartlang.org" source: hosted - version: "7.0.0" + version: "7.0.1" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "6.0.0" + version: "6.0.1" dynamic_color: dependency: "direct main" description: @@ -284,7 +284,7 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.24.0" + version: "2.0.0" firebase_core_platform_interface: dependency: transitive description: @@ -298,21 +298,21 @@ packages: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.7.3" + version: "2.0.0" firebase_crashlytics: dependency: transitive description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.9.0" + version: "3.0.1" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.3.0" + version: "3.3.2" flex_color_picker: dependency: "direct main" description: @@ -659,14 +659,14 @@ packages: name: package_info_plus url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.1" palette_generator: dependency: "direct main" description: @@ -738,7 +738,7 @@ packages: name: permission_handler url: "https://pub.dartlang.org" source: hosted - version: "10.1.0" + version: "10.2.0" permission_handler_android: dependency: transitive description: @@ -995,14 +995,14 @@ packages: name: source_map_stack_trace url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" source_maps: dependency: transitive description: name: source_maps url: "https://pub.dartlang.org" source: hosted - version: "0.10.10" + version: "0.10.11" source_span: dependency: transitive description: diff --git a/scripts/apply_flavor_huawei.sh b/scripts/apply_flavor_huawei.sh index 6a89cf577..d8d4465ed 100755 --- a/scripts/apply_flavor_huawei.sh +++ b/scripts/apply_flavor_huawei.sh @@ -1,4 +1,8 @@ #!/bin/bash +if [ ! -d "scripts" ]; then + cd .. +fi + PUBSPEC_PATH="../pubspec.yaml" flutter clean diff --git a/scripts/apply_flavor_izzy.sh b/scripts/apply_flavor_izzy.sh index 31af6b867..c0afcacf6 100755 --- a/scripts/apply_flavor_izzy.sh +++ b/scripts/apply_flavor_izzy.sh @@ -1,4 +1,8 @@ #!/bin/bash +if [ ! -d "scripts" ]; then + cd .. +fi + PUBSPEC_PATH="../pubspec.yaml" flutter clean diff --git a/scripts/apply_flavor_play.sh b/scripts/apply_flavor_play.sh index a02b9a00d..7c7d54d87 100755 --- a/scripts/apply_flavor_play.sh +++ b/scripts/apply_flavor_play.sh @@ -1,4 +1,8 @@ #!/bin/bash +if [ ! -d "scripts" ]; then + cd .. +fi + PUBSPEC_PATH="../pubspec.yaml" flutter clean diff --git a/scripts/pub_get_all.sh b/scripts/pub_get_all.sh index 9d9755d80..1d54d706c 100755 --- a/scripts/pub_get_all.sh +++ b/scripts/pub_get_all.sh @@ -1,7 +1,10 @@ #!/bin/bash -cd .. +if [ ! -d "scripts" ]; then + cd .. +fi + flutter pub get -cd plugins +cd plugins || exit for plugin in $(ls -d *); do cd $plugin flutter pub get diff --git a/scripts/pub_upgrade_all.sh b/scripts/pub_upgrade_all.sh index b744db615..54395f117 100755 --- a/scripts/pub_upgrade_all.sh +++ b/scripts/pub_upgrade_all.sh @@ -1,7 +1,10 @@ #!/bin/bash -cd .. +if [ ! -d "scripts" ]; then + cd .. +fi + flutter pub upgrade -cd plugins +cd plugins || exit for plugin in $(ls -d *); do cd $plugin flutter pub upgrade diff --git a/scripts/screenshot_post_process.sh b/scripts/screenshot_post_process.sh index 1f34dc20c..cc48d7696 100755 --- a/scripts/screenshot_post_process.sh +++ b/scripts/screenshot_post_process.sh @@ -1,4 +1,8 @@ #!/bin/bash +if [ ! -d "scripts" ]; then + cd .. +fi + # process raw screenshots from test driver to generate: # - scaled down versions for IzzyOnDroid # - framed versions for Google Play diff --git a/shaders_3.3.4.sksl.json b/shaders_3.3.4.sksl.json deleted file mode 100644 index e335f6e5d..000000000 --- a/shaders_3.3.4.sksl.json +++ /dev/null @@ -1 +0,0 @@ -{"platform":"android","name":"SM G970N","engineRevision":"c08d7d5efc9aa6eb3c30cfb3be6dc09bca5e7631","data":{"HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAEQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIBAIAAAABLCIIBAAAAABAEGABBAMAACAIAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADhAwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CglyZXR1cm4gYmxlbmRfbW9kdWxhdGUoTWF0cml4RWZmZWN0X1MxX2MwKF9zcmMpLCBfc3JjKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEJsZW5kX1MxKG91dHB1dENvbG9yX1MwLCBoYWxmNCgxKSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAACRAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0IHZjb3ZlcmFnZV9TMDsKZmxhdCBpbiBmbG9hdDQgdmdlb21TdWJzZXRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQAAEAQAAAAGQCBAMQAAAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzAueSwgdWNsYW1wX1MxX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEADZABYAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAADsAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","GEMAAAYAAEHAAAARC4EAAAQWBQAAAAAAAAAQAAAAIBCAAAGQAEAAAAAQAAAABAEQAEAAAAA":"CQAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAOAAAAaW5TaGFkb3dQYXJhbXMAAAEAAAAAAAAA","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIBSQB5VRECGAEAAAMAAAAAAAAAAACAA4AAAACAAAAAAACCAYAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAKPABAAAAAAB2AAAAAAACAAAAAEBSAAAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAACzBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBmbG9hdDIgdWludlJhZGlpWFlfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBFbGxpcHRpY2FsUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CglmbG9hdDIgWiA9IGR4eSAqIHVpbnZSYWRpaVhZX1MxLnh5OwoJaGFsZiBpbXBsaWNpdCA9IGhhbGYoZG90KFosIGR4eSkgLSAxLjApOwoJaGFsZiBncmFkX2RvdCA9IGhhbGYoNC4wICogZG90KFosIFopKTsKCWdyYWRfZG90ID0gbWF4KGdyYWRfZG90LCAxLjBlLTQpOwoJaGFsZiBhcHByb3hfZGlzdCA9IGltcGxpY2l0ICogaGFsZihpbnZlcnNlc3FydChncmFkX2RvdCkpOwoJaGFsZiBhbHBoYSA9IGNsYW1wKDAuNSArIGFwcHJveF9kaXN0LCAwLjAsIDEuMCk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEVsbGlwdGljYWxSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAABAEAAAABJYQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IHN1YnNldENvb3JkLng7CgljbGFtcGVkQ29vcmQueSA9IGNsYW1wKHN1YnNldENvb3JkLnksIHVjbGFtcF9TMV9jMF9jMF9jMC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAudyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAIAAEAAAABJYQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IGNsYW1wKHN1YnNldENvb3JkLngsIHVjbGFtcF9TMV9jMF9jMF9jMC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueik7CgljbGFtcGVkQ29vcmQueSA9IHN1YnNldENvb3JkLnk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAACEA2X4PLOGEAAAAAAAAACAAAAAVQQAAQAAAAAQCDIBCAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGAARAGQWMHGBRIAAAAABQAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYTRVAADQAAAOAEARAFQJAABBADAAAILBYAACCYUQD777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlCwAAAGluQ2xpcFBsYW5lAAwAAABpbklzZWN0UGxhbmUBAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABZQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMABAAOAAAABAAAAAAABBAMAAA":"CQAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","BYIBQAAABQAAIAABBYAAAEIXBAAP777777777777AAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAABAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAIAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CQAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAGIBIAAABAAAAANAEAAAAAAAAAAAAAABAAOAAAABAAAAAAABBAMAAAAA":"CQAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAAKAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","B2AAQAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAoAAABpbkNvdmVyYWdlAAABAAAAAAAAAA==","AYAA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAEAQAAAAGQCBAMQACAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIAHSADQAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","B2ABSAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","EABQAAAAAEAAAAAQAABQAAIOAAABCFYIAAKAUDAAAAAAAAABAAAAAAAAAAANAAIAAAABAAAAACAJAAIAAAAA":"CQAAAExTS1OhAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgZmxvYXQyIHZJbnRUZXh0dXJlQ29vcmRzX1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIERpc3RhbmNlRmllbGRQYXRoCglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJdkludFRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkczsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8yX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGZsb2F0MiB2SW50VGV4dHVyZUNvb3Jkc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBEaXN0YW5jZUZpZWxkUGF0aAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQyIHV2ID0gdlRleHR1cmVDb29yZHNfUzA7CgloYWxmNCB0ZXhDb2xvcjsKCXsKCQl0ZXhDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLnJycnI7Cgl9CgloYWxmIGRpc3RhbmNlID0gNy45Njg3NSoodGV4Q29sb3IuciAtIDAuNTAxOTYwNzg0MzEpOwoJaGFsZiBhZndpZHRoOwoJYWZ3aWR0aCA9IGFicygwLjY1KmhhbGYoZEZkeCh2SW50VGV4dHVyZUNvb3Jkc19TMC54KSkpOwoJaGFsZiB2YWwgPSBzbW9vdGhzdGVwKC1hZndpZHRoLCBhZndpZHRoLCBkaXN0YW5jZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KHZhbCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAZCBRE4GNEACAAAOAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAAAHBQAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY2xlX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZiBkOwoJaWYgKGludCgzKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWQgPSBoYWxmKChsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSAtIDEuMCkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJZWxzZSAKCXsKCQlkID0gaGFsZigoMS4wIC0gbGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykpICogdWNpcmNsZV9TMS56KTsKCX0KCWlmIChpbnQoMykgPT0ga0ZpbGxBQV9TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCXJldHVybiBoYWxmNChfaW5wdXQgKiBzYXR1cmF0ZShkKSk7Cgl9CgllbHNlIAoJewoJCXJldHVybiBoYWxmNChkID4gMC41ID8gX2lucHV0IDogaGFsZjQoMC4wKSk7Cgl9Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZV9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGACQAGAAAAAQAAAAAAAQQGAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAB3QA6AAAEAAAAAAAMAAPEAEAAABAAAAAAB2AAAAAAACAAAAAEBSAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAA2BQAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzI7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MyOwppbiBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglhbHBoYSA9IDEuMCAtIGFscGhhOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CmhhbGY0IENpcmN1bGFyUlJlY3RfUzIoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MyLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MyLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzIueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCWhhbGY0IG91dHB1dF9TMjsKCW91dHB1dF9TMiA9IENpcmN1bGFyUlJlY3RfUzIob3V0cHV0X1MxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMjsKCX0KfQoAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAAAAIAAAABLAIABAAAAABAEGABBAMAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADOAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAAA5AAAAAAABAAAAACAZAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgAAAABdAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","HTQAAGAABBYAAAEIXBAAAGEAMAAAAAAAAAAAAAAAQAHAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IACgAAAGluUXVhZEVkZ2UAAAEAAAAAAAAA","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAAEAQCAAAAAVREEAQAAAAAQCDAAQQGAABAEAAAAAAH4AQAAAAAEAAAAAQGIAAAAAAA":"CQAAAExTS1PfAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMCkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAEAFAAAjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfZnJhbWVidWZmZXJfZmV0Y2g6IHJlcXVpcmUKdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cmlub3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMF9jMC54eSwgdWNsYW1wX1MxX2MwX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKF9pbnB1dCk7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBNYXRyaXhFZmZlY3RfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYgU2hhZGVyCgkJaGFsZjQgX2RzdENvbG9yID0gc2tfRnJhZ0NvbG9yOwoJCXNrX0ZyYWdDb2xvciA9IGJsZW5kX3NyYyhvdXRwdXRfUzEsIF9kc3RDb2xvcik7CgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q292ZXJhZ2VfUzAgKiBza19GcmFnQ29sb3IgKyAoaGFsZjQoMS4wKSAtIG91dHB1dENvdmVyYWdlX1MwKSAqIF9kc3RDb2xvcjsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAAAgBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdCB2Y292ZXJhZ2VfUzA7CmZsYXQgaW4gZmxvYXQ0IHZnZW9tU3Vic2V0X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","DBAAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAIAAAAAAAAAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1NVAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludDIgY29vcmRzID0gaW50MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJaW50IHRleElkeCA9IGNvb3Jkcy54ID4+IDEzOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGNvb3Jkcy54ICYgMHgxRkZGLCBjb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAAFoCAAB1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzFfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7CglpZiAodlRleEluZGV4X1MwID09IDApIAoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWVsc2UgCgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzFfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAIAAQAAAAAQGIA":"CQAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAMAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBDbGFtcGVkR3JhZGllbnRfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSAoaGFsZjQoMS4wKSAtIG91dHB1dF9TMSkgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAAAAEAAAABJYQAAAAAAAAIAAAAAWCBAAAABAAAAANAECAZAAAAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAAgFAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdUluY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmMiB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFsxM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgX2Nvb3Jkcyk7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChfaW5wdXQsIGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzApICogX2Nvb3Jkcy54eTEpOwp9CmhhbGY0IFNtb290aF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBjb29yZCwgaGFsZjIgb2Zmc2V0QW5kS2VybmVsKSAKewoJcmV0dXJuIE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChjb29yZCArIG9mZnNldEFuZEtlcm5lbC54ICogdUluY3JlbWVudF9TMV9jMCkpICogb2Zmc2V0QW5kS2VybmVsLnk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBjb2xvciA9IGhhbGY0KDApOwoJZmxvYXQyIGNvb3JkID0gdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cglmb3IgKGludCBpPTA7IGk8MTM7ICsraSkgCgl7CgkJY29sb3IgKz0gU21vb3RoX1MxX2MwKF9pbnB1dCwgY29vcmQsIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwW2ldKTsKCX0KCXJldHVybiBjb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DASAAAAAQAAWAABAYAAQBYH7777Z6QQBAEAAAAAAEAAAAAAAEBSAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA=="}} \ No newline at end of file diff --git a/shaders_3.3.5.sksl.json b/shaders_3.3.5.sksl.json new file mode 100644 index 000000000..569bad1a7 --- /dev/null +++ b/shaders_3.3.5.sksl.json @@ -0,0 +1 @@ +{"platform":"android","name":"SM G970N","engineRevision":"3ad69d7be3a7231aab5525db322fc699f098315f","data":{"HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGACQAGAAAAAQAAAAAAAQQGAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAACEA2X4PLOGEAAAAAAAAACAAAAAVQQAAQAAAAAQCDIBCAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAIAAEAAAABJYQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IGNsYW1wKHN1YnNldENvb3JkLngsIHVjbGFtcF9TMV9jMF9jMF9jMC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueik7CgljbGFtcGVkQ29vcmQueSA9IHN1YnNldENvb3JkLnk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAB3QA6AAAEAAAAAAAMAAPEAEAAABAAAAAAB2AAAAAAACAAAAAEBSAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAA2BQAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzI7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MyOwppbiBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglhbHBoYSA9IDEuMCAtIGFscGhhOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CmhhbGY0IENpcmN1bGFyUlJlY3RfUzIoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MyLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MyLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzIueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCWhhbGY0IG91dHB1dF9TMjsKCW91dHB1dF9TMiA9IENpcmN1bGFyUlJlY3RfUzIob3V0cHV0X1MxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMjsKCX0KfQoAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAKPABAAAAAAB2AAAAAAACAAAAAEBSAAAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAACzBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBmbG9hdDIgdWludlJhZGlpWFlfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBFbGxpcHRpY2FsUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CglmbG9hdDIgWiA9IGR4eSAqIHVpbnZSYWRpaVhZX1MxLnh5OwoJaGFsZiBpbXBsaWNpdCA9IGhhbGYoZG90KFosIGR4eSkgLSAxLjApOwoJaGFsZiBncmFkX2RvdCA9IGhhbGYoNC4wICogZG90KFosIFopKTsKCWdyYWRfZG90ID0gbWF4KGdyYWRfZG90LCAxLjBlLTQpOwoJaGFsZiBhcHByb3hfZGlzdCA9IGltcGxpY2l0ICogaGFsZihpbnZlcnNlc3FydChncmFkX2RvdCkpOwoJaGFsZiBhbHBoYSA9IGNsYW1wKDAuNSArIGFwcHJveF9kaXN0LCAwLjAsIDEuMCk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEVsbGlwdGljYWxSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","DASAAAAAQAAWAABAYAAQBYH7777Z6QQBAEAAAAAAEAAAAAAAEBSAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABZQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEADZABYAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAADsAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIAHSADQAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAABAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAIAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CQAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAACRAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0IHZjb3ZlcmFnZV9TMDsKZmxhdCBpbiBmbG9hdDQgdmdlb21TdWJzZXRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAAEAQCAAAAAVREEAQAAAAAQCDAAQQGAABAEAAAAAAH4AQAAAAAEAAAAAQGIAAAAAAA":"CQAAAExTS1PfAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMCkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAEAFAAAjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfZnJhbWVidWZmZXJfZmV0Y2g6IHJlcXVpcmUKdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cmlub3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMF9jMC54eSwgdWNsYW1wX1MxX2MwX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKF9pbnB1dCk7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBNYXRyaXhFZmZlY3RfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYgU2hhZGVyCgkJaGFsZjQgX2RzdENvbG9yID0gc2tfRnJhZ0NvbG9yOwoJCXNrX0ZyYWdDb2xvciA9IGJsZW5kX3NyYyhvdXRwdXRfUzEsIF9kc3RDb2xvcik7CgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q292ZXJhZ2VfUzAgKiBza19GcmFnQ29sb3IgKyAoaGFsZjQoMS4wKSAtIG91dHB1dENvdmVyYWdlX1MwKSAqIF9kc3RDb2xvcjsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAFBQATAAAAAAFAAMAAAABAAAAAAABBAMAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAABYBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBmbG9hdDIgdWludlJhZGlpWFlfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgRWxsaXB0aWNhbFJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJZmxvYXQyIFogPSBkeHkgKiB1aW52UmFkaWlYWV9TMS54eTsKCWhhbGYgaW1wbGljaXQgPSBoYWxmKGRvdChaLCBkeHkpIC0gMS4wKTsKCWhhbGYgZ3JhZF9kb3QgPSBoYWxmKDQuMCAqIGRvdChaLCBaKSk7CglncmFkX2RvdCA9IG1heChncmFkX2RvdCwgMS4wZS00KTsKCWhhbGYgYXBwcm94X2Rpc3QgPSBpbXBsaWNpdCAqIGhhbGYoaW52ZXJzZXNxcnQoZ3JhZF9kb3QpKTsKCWhhbGYgYWxwaGEgPSBjbGFtcCgwLjUgKyBhcHByb3hfZGlzdCwgMC4wLCAxLjApOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gRWxsaXB0aWNhbFJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAAAQAAAAGQCBAMQACAAAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzAueCwgdWNsYW1wX1MxX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIBSQB5VRECGAEAAAMAAAAAAAAAAACAA4AAAACAAAAAAACCAYAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIBAIAAAABLCIIBAAAAABAEGABBAMAACAIAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADhAwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CglyZXR1cm4gYmxlbmRfbW9kdWxhdGUoTWF0cml4RWZmZWN0X1MxX2MwKF9zcmMpLCBfc3JjKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEJsZW5kX1MxKG91dHB1dENvbG9yX1MwLCBoYWxmNCgxKSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAAAAIAAAABLAIABAAAAABAEGABBAMAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADOAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAEAQAAAAGQCBAMQACAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","B2ABSAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAABAEAAAABJYQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IHN1YnNldENvb3JkLng7CgljbGFtcGVkQ29vcmQueSA9IGNsYW1wKHN1YnNldENvb3JkLnksIHVjbGFtcF9TMV9jMF9jMF9jMC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAudyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAEQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAAAgBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdCB2Y292ZXJhZ2VfUzA7CmZsYXQgaW4gZmxvYXQ0IHZnZW9tU3Vic2V0X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","HTQAAGAABBYAAAEIXBAAAGEAMAAAAAAAAAAAAAAAQAHAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IACgAAAGluUXVhZEVkZ2UAAAEAAAAAAAAA","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMADSAB4QAAAAAEAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CQAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAAB3AwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAAKAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","AYTRVAADQAAAOAEARAFQJAABBADAAAILBYAACCYUQD777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlCwAAAGluQ2xpcFBsYW5lAAwAAABpbklzZWN0UGxhbmUBAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAuAIAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","AYAA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CQAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgxKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMABAAOAAAABAAAAAAABBAMAAA":"CQAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGAARAGQWMHGBRIAAAAABQAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADBAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAEwMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdCBkeDAgPSB1aW5uZXJSZWN0X1MxLkwgLSBza19GcmFnQ29vcmQueDsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgoZmxvYXQyKG1heChkeDAsIGR4eTEueCksIGR4eTEueSksIDAuMCk7CgloYWxmIHRvcEFscGhhID0gaGFsZihzYXR1cmF0ZShza19GcmFnQ29vcmQueSAtIHVpbm5lclJlY3RfUzEuVCkpOwoJaGFsZiBhbHBoYSA9IHRvcEFscGhhICogaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","B2AAQAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAoAAABpbkNvdmVyYWdlAAABAAAAAAAAAA==","BYIBQAAABQAAIAABBYAAAEIXBAAP777777777777AAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQAAEAQAAAAGQCBAMQAAAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzAueSwgdWNsYW1wX1MxX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQJAAAAAAABAEAAAABJSQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEwXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IHN1YnNldENvb3JkLng7CgljbGFtcGVkQ29vcmQueSA9IGNsYW1wKHN1YnNldENvb3JkLnksIHVjbGFtcF9TMV9jMF9jMF9jMC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAudyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEwOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAIAAQAAAAAQGIA":"CQAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAMAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBDbGFtcGVkR3JhZGllbnRfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSAoaGFsZjQoMS4wKSAtIG91dHB1dF9TMSkgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAAA5AAAAAAABAAAAACAZAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgAAAABdAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAAAAEAAAABJYQAAAAAAAAIAAAAAWCBAAAABAAAAANAECAZAAAAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAAgFAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdUluY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmMiB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFsxM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgX2Nvb3Jkcyk7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChfaW5wdXQsIGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzApICogX2Nvb3Jkcy54eTEpOwp9CmhhbGY0IFNtb290aF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBjb29yZCwgaGFsZjIgb2Zmc2V0QW5kS2VybmVsKSAKewoJcmV0dXJuIE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChjb29yZCArIG9mZnNldEFuZEtlcm5lbC54ICogdUluY3JlbWVudF9TMV9jMCkpICogb2Zmc2V0QW5kS2VybmVsLnk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBjb2xvciA9IGhhbGY0KDApOwoJZmxvYXQyIGNvb3JkID0gdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cglmb3IgKGludCBpPTA7IGk8MTM7ICsraSkgCgl7CgkJY29sb3IgKz0gU21vb3RoX1MxX2MwKF9pbnB1dCwgY29vcmQsIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwW2ldKTsKCX0KCXJldHVybiBjb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","EABQAAAAAEAAAAAQAABQAAIOAAABCFYIAAKAUDAAAAAAAAABAAAAAAAAAAANAAIAAAABAAAAACAJAAIAAAAA":"CQAAAExTS1OhAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgZmxvYXQyIHZJbnRUZXh0dXJlQ29vcmRzX1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIERpc3RhbmNlRmllbGRQYXRoCglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJdkludFRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkczsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8yX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGZsb2F0MiB2SW50VGV4dHVyZUNvb3Jkc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBEaXN0YW5jZUZpZWxkUGF0aAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQyIHV2ID0gdlRleHR1cmVDb29yZHNfUzA7CgloYWxmNCB0ZXhDb2xvcjsKCXsKCQl0ZXhDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLnJycnI7Cgl9CgloYWxmIGRpc3RhbmNlID0gNy45Njg3NSoodGV4Q29sb3IuciAtIDAuNTAxOTYwNzg0MzEpOwoJaGFsZiBhZndpZHRoOwoJYWZ3aWR0aCA9IGFicygwLjY1KmhhbGYoZEZkeCh2SW50VGV4dHVyZUNvb3Jkc19TMC54KSkpOwoJaGFsZiB2YWwgPSBzbW9vdGhzdGVwKC1hZndpZHRoLCBhZndpZHRoLCBkaXN0YW5jZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KHZhbCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAZCBRE4GNEACAAAOAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAAAHBQAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY2xlX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZiBkOwoJaWYgKGludCgzKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWQgPSBoYWxmKChsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSAtIDEuMCkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJZWxzZSAKCXsKCQlkID0gaGFsZigoMS4wIC0gbGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykpICogdWNpcmNsZV9TMS56KTsKCX0KCWlmIChpbnQoMykgPT0ga0ZpbGxBQV9TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCXJldHVybiBoYWxmNChfaW5wdXQgKiBzYXR1cmF0ZShkKSk7Cgl9CgllbHNlIAoJewoJCXJldHVybiBoYWxmNChkID4gMC41ID8gX2lucHV0IDogaGFsZjQoMC4wKSk7Cgl9Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZV9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQJAAAAAAIAAEAAAABJSQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEwXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IGNsYW1wKHN1YnNldENvb3JkLngsIHVjbGFtcF9TMV9jMF9jMF9jMC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueik7CgljbGFtcGVkQ29vcmQueSA9IHN1YnNldENvb3JkLnk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEwOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","GEMAAAYAAEHAAAARC4EAAAQWBQAAAAAAAAAQAAAAIBCAAAGQAEAAAAAQAAAABAEQAEAAAAA":"CQAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAOAAAAaW5TaGFkb3dQYXJhbXMAAAEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAGIBIAAABAAAAANAEAAAAAAAAAAAAAABAAOAAAABAAAAAAABBAMAAAAA":"CQAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAAKAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA="}} \ No newline at end of file diff --git a/test_driver/utils/adb_utils.dart b/test_driver/utils/adb_utils.dart index c56f43758..8d86ab570 100644 --- a/test_driver/utils/adb_utils.dart +++ b/test_driver/utils/adb_utils.dart @@ -19,7 +19,7 @@ String get adb { you need to use the -d, -e, or -s option to specify the target device to which the command should be directed. */ -const List<String> adbDeviceParam = []; // '[]', '[-d]', '[-e]', or '[-s, <serial_number>]' +const List<String> adbDeviceParam = ['-d']; // `[]`, `['-d']`, `['-e']`, or `['-s', <serial_number>]` Future<void> runAdb(List<String> args) async { await Process.run(adb, [...adbDeviceParam, ...args]); From efe6d1759b299fea5200ec7c5e6c879ede700da8 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Thu, 20 Oct 2022 19:04:51 +0900 Subject: [PATCH 10/53] Update README.md --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c07305529..5fa15ad96 100644 --- a/README.md +++ b/README.md @@ -89,11 +89,16 @@ Aves requires a few permissions to do its job: ### Code -At this stage this project does *not* accept PRs, except for translations. +At this stage this project does *not* accept PRs. ### Translations -If you want to translate this app in your language and share the result, [there is a guide](https://github.com/deckerst/aves/wiki/Contributing-to-Translations). English, Korean and French are already handled by me. Russian, German, Spanish, Portuguese, Indonesian, Japanese, Italian, Chinese, Turkish & Dutch are handled by generous volunteers. +Translations are powered by [Weblate](https://hosted.weblate.org/engage/aves/) and the effort of wonderfully generous volunteers. +<a href="https://hosted.weblate.org/engage/aves/"> +<img src="https://hosted.weblate.org/widgets/aves/-/multi-auto.svg" alt="Translation status" /> +</a> + +If you want to translate this app in your language and share the result, [there is a guide](https://github.com/deckerst/aves/wiki/Contributing-to-Translations). ### Donations From 1ae2ceb62a949e6a6fc5e1bfbc21a5e1426af9c9 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Sat, 22 Oct 2022 12:27:34 +0200 Subject: [PATCH 11/53] minor --- lib/services/android_app_service.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/services/android_app_service.dart b/lib/services/android_app_service.dart index ee55f8dca..b21f4ee8d 100644 --- a/lib/services/android_app_service.dart +++ b/lib/services/android_app_service.dart @@ -36,6 +36,7 @@ class PlatformAndroidAppService implements AndroidAppService { 'com.kakao.talk': {'KakaoTalkDownload'}, 'com.sony.playmemories.mobile': {'Imaging Edge Mobile'}, 'nekox.messenger': {'NekoX'}, + 'org.telegram.messenger': {'Telegram Images', 'Telegram Video'}, }; @override From 2db168051e1909c27b64493f7c103708dca095d0 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Sat, 22 Oct 2022 20:05:57 +0200 Subject: [PATCH 12/53] fixed failing scan of items copied to SD card on older devices --- CHANGELOG.md | 1 + .../model/provider/MediaStoreImageProvider.kt | 122 +++++++++++------- pubspec.lock | 18 +-- 3 files changed, 82 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 120d0bf6b..ad89e996e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file. ### Fixed - rendering of panoramas with inconsistent metadata +- failing scan of items copied to SD card on older devices ## <a id="v1.7.1"></a>[v1.7.1] - 2022-10-09 diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt index d13143269..1e92c2e86 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/MediaStoreImageProvider.kt @@ -32,6 +32,7 @@ import java.io.File import java.io.OutputStream import java.util.* import java.util.concurrent.CompletableFuture +import kotlin.coroutines.Continuation import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine @@ -784,61 +785,82 @@ class MediaStoreImageProvider : ImageProvider() { } suspend fun scanNewPath(context: Context, path: String, mimeType: String): FieldMap = - suspendCoroutine { cont -> - MediaScannerConnection.scanFile(context, arrayOf(path), arrayOf(mimeType)) { _, newUri: Uri? -> - fun scanUri(uri: Uri?): FieldMap? { - uri ?: return null + suspendCoroutine { cont -> tryScanNewPath(context, path = path, mimeType = mimeType, cont) } - // we retrieve updated fields as the renamed/moved file became a new entry in the Media Store - val projection = arrayOf( - MediaStore.MediaColumns.DATE_ADDED, - MediaStore.MediaColumns.DATE_MODIFIED, - ) - try { - val cursor = context.contentResolver.query(uri, projection, null, null, null) - if (cursor != null && cursor.moveToFirst()) { - val newFields = HashMap<String, Any?>() - newFields["uri"] = uri.toString() - newFields["contentId"] = uri.tryParseId() - newFields["path"] = path - cursor.getColumnIndex(MediaStore.MediaColumns.DATE_ADDED).let { if (it != -1) newFields["dateAddedSecs"] = cursor.getInt(it) } - cursor.getColumnIndex(MediaStore.MediaColumns.DATE_MODIFIED).let { if (it != -1) newFields["dateModifiedSecs"] = cursor.getInt(it) } - cursor.close() - return newFields - } - } catch (e: Exception) { - Log.w(LOG_TAG, "failed to scan uri=$uri", e) - } - return null - } - - if (newUri != null) { - var contentUri: Uri? = null - // `newURI` is possibly a file media URI (e.g. "content://media/12a9-8b42/file/62872") - // but we need an image/video media URI (e.g. "content://media/external/images/media/62872") - val contentId = newUri.tryParseId() - if (contentId != null) { - if (isImage(mimeType)) { - contentUri = ContentUris.withAppendedId(IMAGE_CONTENT_URI, contentId) - } else if (isVideo(mimeType)) { - contentUri = ContentUris.withAppendedId(VIDEO_CONTENT_URI, contentId) - } - } - - // prefer image/video content URI, fallback to original URI (possibly a file content URI) - val newFields = scanUri(contentUri) ?: scanUri(newUri) - - if (newFields != null) { - cont.resume(newFields) - } else { - cont.resumeWithException(Exception("failed to get item details from provider at contentUri=$contentUri (from newUri=$newUri)")) - } - } else { - cont.resumeWithException(Exception("failed to get URI of item at path=$path")) + private fun tryScanNewPath(context: Context, path: String, mimeType: String, cont: Continuation<FieldMap>, iteration: Int = 0) { + // `scanFile` may (e.g. when copying to SD card on Android 10 (API 29)): + // 1) yield no URI, + // 2) yield a temporary URI that fails when queried, + // 3) yield a temporary URI that succeeds when queried right away, but the Media Store actually won't have an entry for it until device reboot. + if (iteration > 5) { + // give up + cont.resumeWithException(Exception("failed to scan new path=$path after $iteration iterations")) + return + } else if (iteration > 0) { + // waiting and retrying just once usually works out for cases 1) and 2) + Thread.sleep(iteration * 100L) + } else if (iteration == 0 && Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + // waiting before the first scan usually works out for case 3) + StorageUtils.getVolumePath(context, path)?.let { volumePath -> + if (volumePath != StorageUtils.getPrimaryVolumePath(context)) { + Thread.sleep(100L) } } } + MediaScannerConnection.scanFile(context, arrayOf(path), arrayOf(mimeType)) { _, newUri: Uri? -> + fun scanUri(uri: Uri?): FieldMap? { + uri ?: return null + + // we retrieve updated fields as the renamed/moved file became a new entry in the Media Store + val projection = arrayOf( + MediaStore.MediaColumns.DATE_ADDED, + MediaStore.MediaColumns.DATE_MODIFIED, + ) + try { + val cursor = context.contentResolver.query(uri, projection, null, null, null) + if (cursor != null && cursor.moveToFirst()) { + val newFields = HashMap<String, Any?>() + newFields["uri"] = uri.toString() + newFields["contentId"] = uri.tryParseId() + newFields["path"] = path + cursor.getColumnIndex(MediaStore.MediaColumns.DATE_ADDED).let { if (it != -1) newFields["dateAddedSecs"] = cursor.getInt(it) } + cursor.getColumnIndex(MediaStore.MediaColumns.DATE_MODIFIED).let { if (it != -1) newFields["dateModifiedSecs"] = cursor.getInt(it) } + cursor.close() + return newFields + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to scan uri=$uri", e) + } + return null + } + + if (newUri != null) { + var contentUri: Uri? = null + // `newURI` is possibly a file media URI (e.g. "content://media/12a9-8b42/file/62872") + // but we need an image/video media URI (e.g. "content://media/external/images/media/62872") + val contentId = newUri.tryParseId() + if (contentId != null) { + if (isImage(mimeType)) { + contentUri = ContentUris.withAppendedId(IMAGE_CONTENT_URI, contentId) + } else if (isVideo(mimeType)) { + contentUri = ContentUris.withAppendedId(VIDEO_CONTENT_URI, contentId) + } + } + + // prefer image/video content URI, fallback to original URI (possibly a file content URI) + val newFields = scanUri(contentUri) ?: scanUri(newUri) + + if (newFields != null) { + cont.resume(newFields) + return@scanFile + } + } + + tryScanNewPath(context, path = path, mimeType = mimeType, cont, iteration + 1) + } + } + fun getContentUriForPath(context: Context, path: String): Uri? { val projection = arrayOf(MediaStore.MediaColumns._ID) val selection = "${MediaColumns.PATH} = ?" diff --git a/pubspec.lock b/pubspec.lock index ac700ef9d..c5bc51a83 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,7 +14,7 @@ packages: name: _flutterfire_internals url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "1.0.5" analyzer: dependency: transitive description: @@ -126,14 +126,14 @@ packages: name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "5.8.1" + version: "5.8.2" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" collection: dependency: "direct main" description: @@ -147,7 +147,7 @@ packages: name: connectivity_plus url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" connectivity_plus_platform_interface: dependency: transitive description: @@ -284,7 +284,7 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0" firebase_core_platform_interface: dependency: transitive description: @@ -305,14 +305,14 @@ packages: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.3.2" + version: "3.3.3" flex_color_picker: dependency: "direct main" description: @@ -545,7 +545,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.1" lists: dependency: transitive description: @@ -724,7 +724,7 @@ packages: name: pdf url: "https://pub.dartlang.org" source: hosted - version: "3.8.3" + version: "3.8.4" percent_indicator: dependency: "direct main" description: From e6fd46558ac39ea93a23fb1d4eaed3e170985fcf Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Sun, 23 Oct 2022 17:07:40 +0200 Subject: [PATCH 13/53] #105 mp4 rotation --- CHANGELOG.md | 2 +- .../thibault/aves/metadata/Mp4ParserHelper.kt | 107 +++++++++++------- .../aves/model/provider/ImageProvider.kt | 29 +++-- lib/model/entry.dart | 10 +- lib/model/entry_metadata_edition.dart | 71 +++++++++--- lib/model/metadata/fields.dart | 4 + .../collection/entry_set_action_delegate.dart | 6 +- lib/widgets/common/thumbnail/image.dart | 6 +- lib/widgets/viewer/debug/debug_page.dart | 3 +- lib/widgets/viewer/entry_vertical_pager.dart | 8 +- .../viewer/overlay/viewer_buttons.dart | 49 +++++--- lib/widgets/viewer/video/controller.dart | 9 +- lib/widgets/viewer/video/fijkplayer.dart | 3 + .../viewer/visual/entry_page_view.dart | 2 +- 14 files changed, 207 insertions(+), 102 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad89e996e..c08c86547 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ All notable changes to this project will be documented in this file. ### Added -- Collection / Info: edit MP4 metadata (date / location / title / description / rating / tags) +- Collection / Info: edit MP4 metadata (date / location / title / description / rating / tags / rotation) - Widget: option to open collection on tap ### Changed diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt index 21c7f0967..d9cd24c6e 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Mp4ParserHelper.kt @@ -2,61 +2,19 @@ package deckers.thibault.aves.metadata import android.content.Context import android.net.Uri -import deckers.thibault.aves.utils.LogUtils import deckers.thibault.aves.utils.StorageUtils import org.mp4parser.* import org.mp4parser.boxes.UserBox import org.mp4parser.boxes.apple.AppleGPSCoordinatesBox -import org.mp4parser.boxes.iso14496.part12.FreeBox -import org.mp4parser.boxes.iso14496.part12.MediaDataBox -import org.mp4parser.boxes.iso14496.part12.MovieBox -import org.mp4parser.boxes.iso14496.part12.UserDataBox +import org.mp4parser.boxes.iso14496.part12.* import org.mp4parser.support.AbstractBox +import org.mp4parser.support.Matrix import org.mp4parser.tools.Path import java.io.ByteArrayOutputStream import java.io.FileInputStream import java.nio.channels.Channels object Mp4ParserHelper { - private val LOG_TAG = LogUtils.createTag<Mp4ParserHelper>() - - fun updateLocation(isoFile: IsoFile, locationIso6709: String?) { - // Apple GPS Coordinates Box can be in various locations: - // - moov[0]/udta[0]/©xyz - // - moov[0]/meta[0]/ilst/©xyz - // - others? - isoFile.removeBoxes(AppleGPSCoordinatesBox::class.java, true) - - locationIso6709 ?: return - - val movieBox = isoFile.movieBox - var userDataBox = Path.getPath<UserDataBox>(movieBox, UserDataBox.TYPE) - if (userDataBox == null) { - userDataBox = UserDataBox() - movieBox.addBox(userDataBox) - } - - userDataBox.addBox(AppleGPSCoordinatesBox().apply { - value = locationIso6709 - }) - } - - fun updateXmp(isoFile: IsoFile, xmp: String?) { - val xmpBox = isoFile.xmpBox - if (xmp != null) { - val xmpData = xmp.toByteArray(Charsets.UTF_8) - if (xmpBox == null) { - isoFile.addBox(UserBox(XMP.mp4Uuid).apply { - data = xmpData - }) - } else { - xmpBox.data = xmpData - } - } else if (xmpBox != null) { - isoFile.removeBox(xmpBox) - } - } - fun computeEdits(context: Context, uri: Uri, modifier: (isoFile: IsoFile) -> Unit): List<Pair<Long, ByteArray>> { // we can skip uninteresting boxes with a seekable data source val pfd = StorageUtils.openInputFileDescriptor(context, uri) ?: throw Exception("failed to open file descriptor for uri=$uri") @@ -135,6 +93,67 @@ object Mp4ParserHelper { // extensions + fun IsoFile.updateLocation(locationIso6709: String?) { + // Apple GPS Coordinates Box can be in various locations: + // - moov[0]/udta[0]/©xyz + // - moov[0]/meta[0]/ilst/©xyz + // - others? + removeBoxes(AppleGPSCoordinatesBox::class.java, true) + + locationIso6709 ?: return + + var userDataBox = Path.getPath<UserDataBox>(movieBox, UserDataBox.TYPE) + if (userDataBox == null) { + userDataBox = UserDataBox() + movieBox.addBox(userDataBox) + } + + userDataBox.addBox(AppleGPSCoordinatesBox().apply { + value = locationIso6709 + }) + } + + fun IsoFile.updateRotation(degrees: Int): Boolean { + val matrix: Matrix = when (degrees) { + 0 -> Matrix.ROTATE_0 + 90 -> Matrix.ROTATE_90 + 180 -> Matrix.ROTATE_180 + 270 -> Matrix.ROTATE_270 + else -> throw Exception("failed because of invalid rotation degrees=$degrees") + } + + var success = false + movieBox.getBoxes(TrackHeaderBox::class.java, true).filter { tkhd -> + if (!tkhd.isParsed) { + tkhd.parseDetails() + } + tkhd.width > 0 && tkhd.height > 0 + }.forEach { tkhd -> + if (!setOf(Matrix.ROTATE_0, Matrix.ROTATE_90, Matrix.ROTATE_180, Matrix.ROTATE_270).contains(tkhd.matrix)) { + throw Exception("failed because existing matrix is not a simple rotation matrix") + } + tkhd.matrix = matrix + success = true + } + return success + } + + fun IsoFile.updateXmp(xmp: String?) { + val xmpBox = xmpBox + if (xmp != null) { + val xmpData = xmp.toByteArray(Charsets.UTF_8) + if (xmpBox == null) { + addBox(UserBox(XMP.mp4Uuid).apply { + data = xmpData + }) + } else { + xmpBox.data = xmpData + } + } else if (xmpBox != null) { + removeBox(xmpBox) + } + } + private fun IsoFile.getBoxOffset(test: (box: Box) -> Boolean): Long? { var offset = 0L for (box in boxes) { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt index 5a62d29e6..9976f44b6 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt @@ -26,6 +26,9 @@ import deckers.thibault.aves.metadata.Metadata.TYPE_EXIF import deckers.thibault.aves.metadata.Metadata.TYPE_IPTC import deckers.thibault.aves.metadata.Metadata.TYPE_MP4 import deckers.thibault.aves.metadata.Metadata.TYPE_XMP +import deckers.thibault.aves.metadata.Mp4ParserHelper.updateLocation +import deckers.thibault.aves.metadata.Mp4ParserHelper.updateRotation +import deckers.thibault.aves.metadata.Mp4ParserHelper.updateXmp import deckers.thibault.aves.metadata.PixyMetaHelper.extendedXmpDocString import deckers.thibault.aves.metadata.PixyMetaHelper.xmpDocString import deckers.thibault.aves.model.AvesEntry @@ -563,7 +566,8 @@ abstract class ImageProvider { uri: Uri, mimeType: String, callback: ImageOpCallback, - fields: Map<*, *> + fieldsToEdit: Map<*, *>, + newFields: FieldMap? = null, ): Boolean { if (mimeType != MimeTypes.MP4) { callback.onFailure(UnsupportedOperationException("unsupported mimeType=$mimeType")) @@ -572,12 +576,18 @@ abstract class ImageProvider { try { val edits = Mp4ParserHelper.computeEdits(context, uri) { isoFile -> - fields.forEach { kv -> + fieldsToEdit.forEach { kv -> val tag = kv.key as String val value = kv.value as String? when (tag) { - "gpsCoordinates" -> Mp4ParserHelper.updateLocation(isoFile, value) - "xmp" -> Mp4ParserHelper.updateXmp(isoFile, value) + "gpsCoordinates" -> isoFile.updateLocation(value) + "rotationDegrees" -> { + val degrees = value?.toIntOrNull() ?: throw Exception("failed because of invalid rotation=$value") + if (isoFile.updateRotation(degrees) && newFields != null) { + newFields["rotationDegrees"] = degrees + } + } + "xmp" -> isoFile.updateXmp(value) } } } @@ -637,7 +647,7 @@ abstract class ImageProvider { uri = uri, mimeType = mimeType, callback = callback, - fields = mapOf("xmp" to coreXmp), + fieldsToEdit = mapOf("xmp" to coreXmp), ) } @@ -898,6 +908,7 @@ abstract class ImageProvider { autoCorrectTrailerOffset: Boolean, callback: ImageOpCallback, ) { + val newFields: FieldMap = hashMapOf() if (modifier.containsKey(TYPE_EXIF)) { val fields = modifier[TYPE_EXIF] as Map<*, *>? if (fields != null && fields.isNotEmpty()) { @@ -970,15 +981,16 @@ abstract class ImageProvider { } if (modifier.containsKey(TYPE_MP4)) { - val fields = modifier[TYPE_MP4] as Map<*, *>? - if (fields != null && fields.isNotEmpty()) { + val fieldsToEdit = modifier[TYPE_MP4] as Map<*, *>? + if (fieldsToEdit != null && fieldsToEdit.isNotEmpty()) { if (!editMp4Metadata( context = context, path = path, uri = uri, mimeType = mimeType, callback = callback, - fields = fields, + fieldsToEdit = fieldsToEdit, + newFields = newFields, ) ) return } @@ -1003,7 +1015,6 @@ abstract class ImageProvider { } } - val newFields: FieldMap = hashMapOf() scanPostMetadataEdit(context, path, uri, mimeType, newFields, callback) } diff --git a/lib/model/entry.dart b/lib/model/entry.dart index 3ee822edd..c42f47af2 100644 --- a/lib/model/entry.dart +++ b/lib/model/entry.dart @@ -47,7 +47,7 @@ class AvesEntry { List<AvesEntry>? burstEntries; - final AChangeNotifier imageChangeNotifier = AChangeNotifier(), metadataChangeNotifier = AChangeNotifier(), addressChangeNotifier = AChangeNotifier(); + final AChangeNotifier visualChangeNotifier = AChangeNotifier(), metadataChangeNotifier = AChangeNotifier(), addressChangeNotifier = AChangeNotifier(); AvesEntry({ required int? id, @@ -176,7 +176,7 @@ class AvesEntry { } void dispose() { - imageChangeNotifier.dispose(); + visualChangeNotifier.dispose(); metadataChangeNotifier.dispose(); addressChangeNotifier.dispose(); } @@ -292,7 +292,9 @@ class AvesEntry { bool get canEditTags => canEdit && canEditXmp; - bool get canRotateAndFlip => canEdit && canEditExif; + bool get canRotate => canEdit && (canEditExif || mimeType == MimeTypes.mp4); + + bool get canFlip => canEdit && canEditExif; bool get canEditExif => MimeTypes.canEditExif(mimeType); @@ -712,7 +714,7 @@ class AvesEntry { ) async { if ((!MimeTypes.refersToSameType(oldMimeType, mimeType) && !MimeTypes.isVideo(oldMimeType)) || oldDateModifiedSecs != dateModifiedSecs || oldRotationDegrees != rotationDegrees || oldIsFlipped != isFlipped) { await EntryCache.evict(uri, oldMimeType, oldDateModifiedSecs, oldRotationDegrees, oldIsFlipped); - imageChangeNotifier.notify(); + visualChangeNotifier.notify(); } } diff --git a/lib/model/entry_metadata_edition.dart b/lib/model/entry_metadata_edition.dart index 9593add22..ef1f42a2a 100644 --- a/lib/model/entry_metadata_edition.dart +++ b/lib/model/entry_metadata_edition.dart @@ -20,7 +20,7 @@ import 'package:xml/xml.dart'; extension ExtraAvesEntryMetadataEdition on AvesEntry { Future<Set<EntryDataType>> editDate(DateModifier userModifier) async { - final Set<EntryDataType> dataTypes = {}; + final dataTypes = <EntryDataType>{}; final appliedModifier = await _applyDateModifierToEntry(userModifier); if (appliedModifier == null) { @@ -83,8 +83,8 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { } Future<Set<EntryDataType>> editLocation(LatLng? latLng) async { - final Set<EntryDataType> dataTypes = {}; - final Map<MetadataType, dynamic> metadata = {}; + final dataTypes = <EntryDataType>{}; + final metadata = <MetadataType, dynamic>{}; final missingDate = await _missingDateCheckAndExifEdit(dataTypes); @@ -151,8 +151,8 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { return dataTypes; } - Future<Set<EntryDataType>> _changeOrientation(Future<Map<String, dynamic>> Function() apply) async { - final Set<EntryDataType> dataTypes = {}; + Future<Set<EntryDataType>> _changeExifOrientation(Future<Map<String, dynamic>> Function() apply) async { + final dataTypes = <EntryDataType>{}; await _missingDateCheckAndExifEdit(dataTypes); @@ -170,12 +170,51 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { return dataTypes; } + Future<Set<EntryDataType>> _rotateMp4(int rotationDegrees) async { + final dataTypes = <EntryDataType>{}; + + final missingDate = await _missingDateCheckAndExifEdit(dataTypes); + + final mp4Fields = <MetadataField, String?>{ + MetadataField.mp4RotationDegrees: rotationDegrees.toString(), + }; + + if (missingDate != null) { + final xmpParts = await _editXmp((descriptions) { + editCreateDateXmp(descriptions, missingDate); + return true; + }); + mp4Fields[MetadataField.mp4Xmp] = xmpParts[xmpCoreKey]; + } + + final metadata = <MetadataType, dynamic>{ + MetadataType.mp4: Map<String, String?>.fromEntries(mp4Fields.entries.map((kv) => MapEntry(kv.key.toPlatform!, kv.value))), + }; + + final newFields = await metadataEditService.editMetadata(this, metadata); + // applying fields is only useful for a smoother visual change, + // as proper refreshing and persistence happens at the caller level + await applyNewFields(newFields, persist: false); + if (newFields.isNotEmpty) { + dataTypes.addAll({ + EntryDataType.basic, + EntryDataType.aspectRatio, + EntryDataType.catalog, + }); + } + return dataTypes; + } + Future<Set<EntryDataType>> rotate({required bool clockwise}) { - return _changeOrientation(() => metadataEditService.rotate(this, clockwise: clockwise)); + if (mimeType == MimeTypes.mp4) { + return _rotateMp4((rotationDegrees + (clockwise ? 90 : -90) + 360) % 360); + } else { + return _changeExifOrientation(() => metadataEditService.rotate(this, clockwise: clockwise)); + } } Future<Set<EntryDataType>> flip() { - return _changeOrientation(() => metadataEditService.flip(this)); + return _changeExifOrientation(() => metadataEditService.flip(this)); } // write title: @@ -186,8 +225,8 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { // - IPTC / caption-abstract, if IPTC exists // - XMP / dc:description Future<Set<EntryDataType>> editTitleDescription(Map<DescriptionField, String?> fields) async { - final Set<EntryDataType> dataTypes = {}; - final Map<MetadataType, dynamic> metadata = {}; + final dataTypes = <EntryDataType>{}; + final metadata = <MetadataType, dynamic>{}; final missingDate = await _missingDateCheckAndExifEdit(dataTypes); @@ -256,8 +295,8 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { // - IPTC / keywords, if IPTC exists // - XMP / dc:subject Future<Set<EntryDataType>> editTags(Set<String> tags) async { - final Set<EntryDataType> dataTypes = {}; - final Map<MetadataType, dynamic> metadata = {}; + final dataTypes = <EntryDataType>{}; + final metadata = <MetadataType, dynamic>{}; final missingDate = await _missingDateCheckAndExifEdit(dataTypes); @@ -294,8 +333,8 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { // - Exif / Rating // - Exif / RatingPercent Future<Set<EntryDataType>> editRating(int? rating) async { - final Set<EntryDataType> dataTypes = {}; - final Map<MetadataType, dynamic> metadata = {}; + final dataTypes = <EntryDataType>{}; + final metadata = <MetadataType, dynamic>{}; final missingDate = await _missingDateCheckAndExifEdit(dataTypes); @@ -322,8 +361,8 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { // - XMP / GCamera:MicroVideo* // - XMP / GCamera:MotionPhoto* Future<Set<EntryDataType>> removeTrailerVideo() async { - final Set<EntryDataType> dataTypes = {}; - final Map<MetadataType, dynamic> metadata = {}; + final dataTypes = <EntryDataType>{}; + final metadata = <MetadataType, dynamic>{}; if (!canEditXmp) return dataTypes; @@ -347,7 +386,7 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry { } Future<Set<EntryDataType>> removeMetadata(Set<MetadataType> types) async { - final Set<EntryDataType> dataTypes = {}; + final dataTypes = <EntryDataType>{}; final newFields = await metadataEditService.removeTypes(this, types); if (newFields.isNotEmpty) { diff --git a/lib/model/metadata/fields.dart b/lib/model/metadata/fields.dart index 8628717e9..b6b279226 100644 --- a/lib/model/metadata/fields.dart +++ b/lib/model/metadata/fields.dart @@ -38,6 +38,7 @@ enum MetadataField { exifGpsVersionId, exifImageDescription, mp4GpsCoordinates, + mp4RotationDegrees, mp4Xmp, xmpXmpCreateDate, } @@ -120,6 +121,7 @@ extension ExtraMetadataField on MetadataField { case MetadataField.exifImageDescription: return MetadataType.exif; case MetadataField.mp4GpsCoordinates: + case MetadataField.mp4RotationDegrees: case MetadataField.mp4Xmp: return MetadataType.mp4; case MetadataField.xmpXmpCreateDate: @@ -134,6 +136,8 @@ extension ExtraMetadataField on MetadataField { switch (this) { case MetadataField.mp4GpsCoordinates: return 'gpsCoordinates'; + case MetadataField.mp4RotationDegrees: + return 'rotationDegrees'; case MetadataField.mp4Xmp: return 'xmp'; default: diff --git a/lib/widgets/collection/entry_set_action_delegate.dart b/lib/widgets/collection/entry_set_action_delegate.dart index 420faab2d..32c8bfe5d 100644 --- a/lib/widgets/collection/entry_set_action_delegate.dart +++ b/lib/widgets/collection/entry_set_action_delegate.dart @@ -370,7 +370,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware Set<String> obsoleteTags = todoItems.expand((entry) => entry.tags).toSet(); Set<String> obsoleteCountryCodes = todoItems.where((entry) => entry.hasAddress).map((entry) => entry.addressDetails?.countryCode).whereNotNull().toSet(); - final Set<EntryDataType> dataTypes = {}; + final dataTypes = <EntryDataType>{}; final source = context.read<CollectionSource>(); source.pauseMonitoring(); var cancelled = false; @@ -463,14 +463,14 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware } Future<void> _rotate(BuildContext context, {required bool clockwise}) async { - final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.canRotateAndFlip); + final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.canRotate); if (entries == null || entries.isEmpty) return; await _edit(context, entries, (entry) => entry.rotate(clockwise: clockwise)); } Future<void> _flip(BuildContext context) async { - final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.canRotateAndFlip); + final entries = await _getEditableTargetItems(context, canEdit: (entry) => entry.canFlip); if (entries == null || entries.isEmpty) return; await _edit(context, entries, (entry) => entry.flip()); diff --git a/lib/widgets/common/thumbnail/image.dart b/lib/widgets/common/thumbnail/image.dart index 8567539e6..ae89a1577 100644 --- a/lib/widgets/common/thumbnail/image.dart +++ b/lib/widgets/common/thumbnail/image.dart @@ -88,12 +88,12 @@ class _ThumbnailImageState extends State<ThumbnailImage> { } void _registerWidget(ThumbnailImage widget) { - widget.entry.imageChangeNotifier.addListener(_onImageChanged); + widget.entry.visualChangeNotifier.addListener(_onVisualChanged); _initProvider(); } void _unregisterWidget(ThumbnailImage widget) { - widget.entry.imageChangeNotifier.removeListener(_onImageChanged); + widget.entry.visualChangeNotifier.removeListener(_onVisualChanged); _pauseProvider(); _currentProviderStream?.stopListening(); _currentProviderStream = null; @@ -313,7 +313,7 @@ class _ThumbnailImageState extends State<ThumbnailImage> { } // when the entry image itself changed (e.g. after rotation) - void _onImageChanged() async { + void _onVisualChanged() async { // rebuild to refresh the thumbnails _pauseProvider(); _initProvider(); diff --git a/lib/widgets/viewer/debug/debug_page.dart b/lib/widgets/viewer/debug/debug_page.dart index 589462ba8..24d6c9d3f 100644 --- a/lib/widgets/viewer/debug/debug_page.dart +++ b/lib/widgets/viewer/debug/debug_page.dart @@ -141,7 +141,8 @@ class ViewerDebugPage extends StatelessWidget { 'canEdit': '${entry.canEdit}', 'canEditDate': '${entry.canEditDate}', 'canEditTags': '${entry.canEditTags}', - 'canRotateAndFlip': '${entry.canRotateAndFlip}', + 'canRotate': '${entry.canRotate}', + 'canFlip': '${entry.canFlip}', 'tags': '${entry.tags}', }, ), diff --git a/lib/widgets/viewer/entry_vertical_pager.dart b/lib/widgets/viewer/entry_vertical_pager.dart index 5a06022f4..7ffd3cf1c 100644 --- a/lib/widgets/viewer/entry_vertical_pager.dart +++ b/lib/widgets/viewer/entry_vertical_pager.dart @@ -104,7 +104,7 @@ class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> { ..clear(); widget.verticalPager.removeListener(_onVerticalPageControllerChanged); widget.entryNotifier.removeListener(_onEntryChanged); - _oldEntry?.imageChangeNotifier.removeListener(_onImageChanged); + _oldEntry?.visualChangeNotifier.removeListener(_onVisualChanged); } @override @@ -264,12 +264,12 @@ class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> { // when the entry changed (e.g. by scrolling through the PageView, or if the entry got deleted) Future<void> _onEntryChanged() async { - _oldEntry?.imageChangeNotifier.removeListener(_onImageChanged); + _oldEntry?.visualChangeNotifier.removeListener(_onVisualChanged); _oldEntry = entry; final _entry = entry; if (_entry != null) { - _entry.imageChangeNotifier.addListener(_onImageChanged); + _entry.visualChangeNotifier.addListener(_onVisualChanged); // make sure to locate the entry, // so that we can display the address instead of coordinates // even when initial collection locating has not reached this entry yet @@ -286,7 +286,7 @@ class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> { } // when the entry image itself changed (e.g. after rotation) - void _onImageChanged() async { + void _onVisualChanged() async { // rebuild to refresh the Image inside ImagePage if (mounted) { setState(() {}); diff --git a/lib/widgets/viewer/overlay/viewer_buttons.dart b/lib/widgets/viewer/overlay/viewer_buttons.dart index fbe0a3342..aef53584e 100644 --- a/lib/widgets/viewer/overlay/viewer_buttons.dart +++ b/lib/widgets/viewer/overlay/viewer_buttons.dart @@ -4,10 +4,10 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/app_bar/favourite_toggler.dart'; import 'package:aves/widgets/common/basic/menu.dart'; import 'package:aves/widgets/common/basic/popup_menu_button.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; -import 'package:aves/widgets/common/app_bar/favourite_toggler.dart'; import 'package:aves/widgets/viewer/action/entry_action_delegate.dart'; import 'package:aves/widgets/viewer/multipage/conductor.dart'; import 'package:aves/widgets/viewer/notifications.dart'; @@ -70,8 +70,9 @@ class ViewerButtons extends StatelessWidget { return targetEntry.canEdit; case EntryAction.rotateCCW: case EntryAction.rotateCW: + return targetEntry.canRotate; case EntryAction.flip: - return targetEntry.canRotateAndFlip; + return targetEntry.canFlip; case EntryAction.convert: case EntryAction.print: return !targetEntry.isVideo && device.canPrint; @@ -161,7 +162,7 @@ class ViewerButtonRowContent extends StatelessWidget { @override Widget build(BuildContext context) { - final hasOverflowMenu = pageEntry.canRotateAndFlip || topLevelActions.isNotEmpty || exportActions.isNotEmpty || videoActions.isNotEmpty; + final hasOverflowMenu = pageEntry.canRotate || pageEntry.canFlip || topLevelActions.isNotEmpty || exportActions.isNotEmpty || videoActions.isNotEmpty; return Selector<VideoConductor, AvesVideoController?>( selector: (context, vc) => vc.getController(pageEntry), builder: (context, videoController, child) { @@ -183,7 +184,7 @@ class ViewerButtonRowContent extends StatelessWidget { final exportInternalActions = exportActions.whereNot(EntryActions.exportExternal.contains).toList(); final exportExternalActions = exportActions.where(EntryActions.exportExternal.contains).toList(); return [ - if (pageEntry.canRotateAndFlip) _buildRotateAndFlipMenuItems(context), + if (pageEntry.canRotate || pageEntry.canFlip) _buildRotateAndFlipMenuItems(context), ...topLevelActions.map((action) => _buildPopupMenuItem(context, action, videoController)), if (exportActions.isNotEmpty) PopupMenuItem<EntryAction>( @@ -357,6 +358,18 @@ class ViewerButtonRowContent extends StatelessWidget { } PopupMenuItem<EntryAction> _buildRotateAndFlipMenuItems(BuildContext context) { + bool canApply(EntryAction action) { + switch (action) { + case EntryAction.rotateCCW: + case EntryAction.rotateCW: + return pageEntry.canRotate; + case EntryAction.flip: + return pageEntry.canFlip; + default: + return true; + } + } + Widget buildDivider() => const SizedBox( height: 16, child: VerticalDivider( @@ -373,6 +386,7 @@ class ViewerButtonRowContent extends StatelessWidget { clipBehavior: Clip.antiAlias, child: PopupMenuItem( value: action, + enabled: canApply(action), child: Tooltip( message: action.getText(context), child: Center(child: action.getIcon()), @@ -382,20 +396,27 @@ class ViewerButtonRowContent extends StatelessWidget { ); return PopupMenuItem( + padding: EdgeInsets.zero, child: IconTheme.merge( data: IconThemeData( color: ListTileTheme.of(context).iconColor, ), - child: Row( - children: [ - buildDivider(), - buildItem(EntryAction.rotateCCW), - buildDivider(), - buildItem(EntryAction.rotateCW), - buildDivider(), - buildItem(EntryAction.flip), - buildDivider(), - ], + child: ColoredBox( + color: PopupMenuTheme.of(context).color!, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + children: [ + buildDivider(), + buildItem(EntryAction.rotateCCW), + buildDivider(), + buildItem(EntryAction.rotateCW), + buildDivider(), + buildItem(EntryAction.flip), + buildDivider(), + ], + ), + ), ), ), ); diff --git a/lib/widgets/viewer/video/controller.dart b/lib/widgets/viewer/video/controller.dart index 7c02997f4..280ed42cb 100644 --- a/lib/widgets/viewer/video/controller.dart +++ b/lib/widgets/viewer/video/controller.dart @@ -13,14 +13,17 @@ abstract class AvesVideoController { AvesEntry get entry => _entry; - AvesVideoController(AvesEntry entry, {required this.persistPlayback}) : _entry = entry; - static const resumeTimeSaveMinProgress = .05; static const resumeTimeSaveMaxProgress = .95; static const resumeTimeSaveMinDuration = Duration(minutes: 2); + AvesVideoController(AvesEntry entry, {required this.persistPlayback}) : _entry = entry { + entry.visualChangeNotifier.addListener(onVisualChanged); + } + @mustCallSuper Future<void> dispose() async { + entry.visualChangeNotifier.removeListener(onVisualChanged); await _savePlaybackState(); } @@ -76,6 +79,8 @@ abstract class AvesVideoController { return resumeTime; } + void onVisualChanged(); + Future<void> play(); Future<void> pause(); diff --git a/lib/widgets/viewer/video/fijkplayer.dart b/lib/widgets/viewer/video/fijkplayer.dart index 2954be504..6377b87be 100644 --- a/lib/widgets/viewer/video/fijkplayer.dart +++ b/lib/widgets/viewer/video/fijkplayer.dart @@ -293,6 +293,9 @@ class IjkPlayerAvesVideoController extends AvesVideoController { _valueStreamController.add(_instance.value); } + @override + void onVisualChanged() => _init(startMillis: currentPosition); + @override Future<void> play() async { if (isReady) { diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index f767b8d67..fd400b3df 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -137,7 +137,7 @@ class _EntryPageViewState extends State<EntryPageView> with SingleTickerProvider @override Widget build(BuildContext context) { Widget child = AnimatedBuilder( - animation: entry.imageChangeNotifier, + animation: entry.visualChangeNotifier, builder: (context, child) { Widget? child; if (entry.isSvg) { From f617dd2f049574e9cb2f191704c2d9af9d1f3112 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Sun, 23 Oct 2022 23:27:26 +0200 Subject: [PATCH 14/53] l10n by weblate (#365) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Allan Nordhøy <epost@anotheragency.no> Co-authored-by: Daniel <its.ghost.message@gmail.com> Co-authored-by: Havokdan <havokdan@yahoo.com.br> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Piotr K <1337.kelt@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Weblate <noreply@weblate.org> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: امیر جهانگرد <ijahangard.a@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/el/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/id/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/it/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/el/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/pl/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: Allan Nordhøy <epost@anotheragency.no> Co-authored-by: Daniel <its.ghost.message@gmail.com> Co-authored-by: Havokdan <havokdan@yahoo.com.br> Co-authored-by: Piotr K <1337.kelt@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: امیر جهانگرد <ijahangard.a@gmail.com> --- .../app/src/main/res/values-fa/strings.xml | 11 + .../app/src/main/res/values-fr/strings.xml | 2 +- .../app/src/main/res/values-it/strings.xml | 2 +- .../app/src/main/res/values-ja/strings.xml | 22 +- .../app/src/main/res/values-ko/strings.xml | 2 +- .../src/main/res/values-nb-rNO/strings.xml | 12 + .../app/src/main/res/values-pl/strings.xml | 12 + .../src/main/res/values-pt-rBR/strings.xml | 2 + .../app/src/main/res/values-pt/strings.xml | 2 +- .../app/src/main/res/values-ru/strings.xml | 2 +- .../app/src/main/res/values-zh/strings.xml | 2 +- .../metadata/android/fa/full_description.txt | 5 + .../metadata/android/fa/short_description.txt | 1 + .../metadata/android/fr/full_description.txt | 5 + .../metadata/android/fr/short_description.txt | 1 + .../metadata/android/ko/full_description.txt | 5 + .../metadata/android/ko/short_description.txt | 1 + .../android/nb_NO/full_description.txt | 5 + .../android/nb_NO/short_description.txt | 1 + .../metadata/android/nl/full_description.txt | 5 + .../metadata/android/nl/short_description.txt | 1 + .../metadata/android/pl/full_description.txt | 5 + .../metadata/android/pl/short_description.txt | 1 + .../android/pt_BR/full_description.txt | 5 + .../android/pt_BR/short_description.txt | 1 + .../metadata/android/ru/full_description.txt | 5 + .../metadata/android/ru/short_description.txt | 1 + lib/l10n/app_el.arb | 2 +- lib/l10n/app_es.arb | 64 +- lib/l10n/app_fa.arb | 1 + lib/l10n/app_id.arb | 678 +++++++++--- lib/l10n/app_it.arb | 36 +- lib/l10n/app_nb_NO.arb | 989 ++++++++++++++++++ lib/l10n/app_nl.arb | 8 +- lib/l10n/app_pl.arb | 188 ++++ lib/l10n/app_pt.arb | 694 +++++++++--- lib/l10n/app_pt_BR.arb | 1 + lib/l10n/app_ru.arb | 698 +++++++++--- lib/l10n/app_zh.arb | 694 +++++++++--- 39 files changed, 3647 insertions(+), 525 deletions(-) create mode 100644 android/app/src/main/res/values-fa/strings.xml create mode 100644 android/app/src/main/res/values-nb-rNO/strings.xml create mode 100644 android/app/src/main/res/values-pl/strings.xml create mode 100644 android/app/src/main/res/values-pt-rBR/strings.xml create mode 100644 fastlane/metadata/android/fa/full_description.txt create mode 100644 fastlane/metadata/android/fa/short_description.txt create mode 100644 fastlane/metadata/android/fr/full_description.txt create mode 100644 fastlane/metadata/android/fr/short_description.txt create mode 100644 fastlane/metadata/android/ko/full_description.txt create mode 100644 fastlane/metadata/android/ko/short_description.txt create mode 100644 fastlane/metadata/android/nb_NO/full_description.txt create mode 100644 fastlane/metadata/android/nb_NO/short_description.txt create mode 100644 fastlane/metadata/android/nl/full_description.txt create mode 100644 fastlane/metadata/android/nl/short_description.txt create mode 100644 fastlane/metadata/android/pl/full_description.txt create mode 100644 fastlane/metadata/android/pl/short_description.txt create mode 100644 fastlane/metadata/android/pt_BR/full_description.txt create mode 100644 fastlane/metadata/android/pt_BR/short_description.txt create mode 100644 fastlane/metadata/android/ru/full_description.txt create mode 100644 fastlane/metadata/android/ru/short_description.txt create mode 100644 lib/l10n/app_fa.arb create mode 100644 lib/l10n/app_nb_NO.arb create mode 100644 lib/l10n/app_pl.arb create mode 100644 lib/l10n/app_pt_BR.arb diff --git a/android/app/src/main/res/values-fa/strings.xml b/android/app/src/main/res/values-fa/strings.xml new file mode 100644 index 000000000..bffe34c3f --- /dev/null +++ b/android/app/src/main/res/values-fa/strings.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="videos_shortcut_short_label">ویدئو ها</string> + <string name="analysis_channel_name">کنکاش رسانه</string> + <string name="analysis_service_description">کنکاش تصاویر و ویدئو ها</string> + <string name="search_shortcut_short_label">جستجو</string> + <string name="wallpaper">کاغذدیواری</string> + <string name="analysis_notification_default_title">در حال کنکاش رسانه‌ها</string> + <string name="analysis_notification_action_stop">توقف کردن</string> + <string name="app_widget_label">قاب عکس</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-fr/strings.xml b/android/app/src/main/res/values-fr/strings.xml index 9310bcb90..6104e3059 100644 --- a/android/app/src/main/res/values-fr/strings.xml +++ b/android/app/src/main/res/values-fr/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Aves</string> <string name="app_widget_label">Cadre photo</string> diff --git a/android/app/src/main/res/values-it/strings.xml b/android/app/src/main/res/values-it/strings.xml index d01d270fc..cffcd1296 100644 --- a/android/app/src/main/res/values-it/strings.xml +++ b/android/app/src/main/res/values-it/strings.xml @@ -9,4 +9,4 @@ <string name="analysis_service_description">Scansione immagini &amp; videos</string> <string name="analysis_notification_default_title">Scansione in corso</string> <string name="analysis_notification_action_stop">Annulla</string> -</resources> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-ja/strings.xml b/android/app/src/main/res/values-ja/strings.xml index fd266ed73..d7f678e4b 100644 --- a/android/app/src/main/res/values-ja/strings.xml +++ b/android/app/src/main/res/values-ja/strings.xml @@ -1,12 +1,12 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="app_name">Aves</string> - <string name="app_widget_label">フォトフレーム</string> - <string name="wallpaper">壁紙</string> - <string name="search_shortcut_short_label">検索</string> - <string name="videos_shortcut_short_label">動画</string> - <string name="analysis_channel_name">メディアスキャン</string> - <string name="analysis_service_description">画像と動画をスキャン</string> - <string name="analysis_notification_default_title">メディアをスキャン中</string> - <string name="analysis_notification_action_stop">停止</string> +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">フォトフレーム</string> + <string name="wallpaper">壁紙</string> + <string name="search_shortcut_short_label">検索</string> + <string name="videos_shortcut_short_label">動画</string> + <string name="analysis_channel_name">メディアスキャン</string> + <string name="analysis_service_description">画像と動画をスキャン</string> + <string name="analysis_notification_default_title">メディアをスキャン中</string> + <string name="analysis_notification_action_stop">停止</string> </resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-ko/strings.xml b/android/app/src/main/res/values-ko/strings.xml index 726821585..a226d003b 100644 --- a/android/app/src/main/res/values-ko/strings.xml +++ b/android/app/src/main/res/values-ko/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">아베스</string> <string name="app_widget_label">사진 액자</string> diff --git a/android/app/src/main/res/values-nb-rNO/strings.xml b/android/app/src/main/res/values-nb-rNO/strings.xml new file mode 100644 index 000000000..fb6d8bcfb --- /dev/null +++ b/android/app/src/main/res/values-nb-rNO/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="videos_shortcut_short_label">Videoer</string> + <string name="analysis_channel_name">Mediaskanning</string> + <string name="analysis_service_description">Skann bilder og videoer</string> + <string name="analysis_notification_default_title">Skanning av media</string> + <string name="app_widget_label">Bilderamme</string> + <string name="wallpaper">Bakgrunnsbilde</string> + <string name="search_shortcut_short_label">Søk</string> + <string name="analysis_notification_action_stop">Stopp</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-pl/strings.xml b/android/app/src/main/res/values-pl/strings.xml new file mode 100644 index 000000000..1e53b15c3 --- /dev/null +++ b/android/app/src/main/res/values-pl/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_widget_label">Ramka Zdjęcia</string> + <string name="search_shortcut_short_label">Szukaj</string> + <string name="videos_shortcut_short_label">Filmy</string> + <string name="analysis_channel_name">Skan mediów</string> + <string name="analysis_service_description">Skan obrazów &amp; filmów</string> + <string name="analysis_notification_default_title">Skanowanie mediów</string> + <string name="analysis_notification_action_stop">Zatrzymaj</string> + <string name="app_name">Aves</string> + <string name="wallpaper">Tapeta</string> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-pt-rBR/strings.xml b/android/app/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/android/app/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources></resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-pt/strings.xml b/android/app/src/main/res/values-pt/strings.xml index 0f9e6f5d1..17abf2439 100644 --- a/android/app/src/main/res/values-pt/strings.xml +++ b/android/app/src/main/res/values-pt/strings.xml @@ -9,4 +9,4 @@ <string name="analysis_service_description">Digitalizar imagens &amp; vídeos</string> <string name="analysis_notification_default_title">Digitalizando mídia</string> <string name="analysis_notification_action_stop">Pare</string> -</resources> +</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml index 8b5d7fdcf..65f801bc9 100644 --- a/android/app/src/main/res/values-ru/strings.xml +++ b/android/app/src/main/res/values-ru/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Aves</string> <string name="app_widget_label">Фоторамка</string> diff --git a/android/app/src/main/res/values-zh/strings.xml b/android/app/src/main/res/values-zh/strings.xml index c3453296f..7b454e26b 100644 --- a/android/app/src/main/res/values-zh/strings.xml +++ b/android/app/src/main/res/values-zh/strings.xml @@ -9,4 +9,4 @@ <string name="analysis_service_description">扫描图像 &amp; 视频</string> <string name="analysis_notification_default_title">正在扫描媒体库</string> <string name="analysis_notification_action_stop">停止</string> -</resources> +</resources> \ No newline at end of file diff --git a/fastlane/metadata/android/fa/full_description.txt b/fastlane/metadata/android/fa/full_description.txt new file mode 100644 index 000000000..8806906a1 --- /dev/null +++ b/fastlane/metadata/android/fa/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (from <b>API 19 to 33</b>, i.e. from KitKat to Android 13) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/fa/short_description.txt b/fastlane/metadata/android/fa/short_description.txt new file mode 100644 index 000000000..8c9445bd5 --- /dev/null +++ b/fastlane/metadata/android/fa/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/fr/full_description.txt b/fastlane/metadata/android/fr/full_description.txt new file mode 100644 index 000000000..8806906a1 --- /dev/null +++ b/fastlane/metadata/android/fr/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (from <b>API 19 to 33</b>, i.e. from KitKat to Android 13) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr/short_description.txt new file mode 100644 index 000000000..8c9445bd5 --- /dev/null +++ b/fastlane/metadata/android/fr/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/ko/full_description.txt b/fastlane/metadata/android/ko/full_description.txt new file mode 100644 index 000000000..8806906a1 --- /dev/null +++ b/fastlane/metadata/android/ko/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (from <b>API 19 to 33</b>, i.e. from KitKat to Android 13) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ko/short_description.txt b/fastlane/metadata/android/ko/short_description.txt new file mode 100644 index 000000000..8c9445bd5 --- /dev/null +++ b/fastlane/metadata/android/ko/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/nb_NO/full_description.txt b/fastlane/metadata/android/nb_NO/full_description.txt new file mode 100644 index 000000000..e796f03bc --- /dev/null +++ b/fastlane/metadata/android/nb_NO/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> kan håndtere alle slags bilder og videoer, inkludert JPEG og MP4, men også mer eksotiske formater som <b>TIFF-filer over flere sider, SVG-er, gamle AVI-er, med mer</b>! Det skanner mediasamlingen din for å identifisere <b>bevegelige bilder</b>, <b>panoramaer</b> (også kjent som bildesirkler), <b>360°-videoer</b>, og også <b>GeoTIFF</b>-filer. + +<b>Navigasjon og søk</b> er en viktig del av <i>Aves</i>. Målet er at brukere enkelt skal kunne ta seg fra album, til bilder, til etiketter, til kart, osv. + +<i>Aves</i> integrates with Android (from <b>API 19 to 33</b>, i.e. from KitKat to Android 13) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/nb_NO/short_description.txt b/fastlane/metadata/android/nb_NO/short_description.txt new file mode 100644 index 000000000..487ce5b0c --- /dev/null +++ b/fastlane/metadata/android/nb_NO/short_description.txt @@ -0,0 +1 @@ +Galleri- og metadatautforsker \ No newline at end of file diff --git a/fastlane/metadata/android/nl/full_description.txt b/fastlane/metadata/android/nl/full_description.txt new file mode 100644 index 000000000..8806906a1 --- /dev/null +++ b/fastlane/metadata/android/nl/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (from <b>API 19 to 33</b>, i.e. from KitKat to Android 13) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/nl/short_description.txt b/fastlane/metadata/android/nl/short_description.txt new file mode 100644 index 000000000..8c9445bd5 --- /dev/null +++ b/fastlane/metadata/android/nl/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/pl/full_description.txt b/fastlane/metadata/android/pl/full_description.txt new file mode 100644 index 000000000..983675856 --- /dev/null +++ b/fastlane/metadata/android/pl/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> obsługuje wszelkiego rodzaju obrazy i filmy, w tym typowe pliki JPEG i MP4 ale także bardziej egzotyczne formaty takie jak <b>wielostronnicowe pliki TIFF, SVG, stare pliki AVI i wiele więcej</b>! Skanuje twoją kolekcję multimediów aby zidentyfikować <b>ruchome zdjęcia</b>, <b>panoramy</b> (inaczej zdjęcia sferyczne), <b>filmy 360°</b>, a także pliki <b>GeoTIFF</b>. + +<b>Nawigacja i wyszukiwanie</b> jest ważną częścią <i>Aves</i>. Celem jest aby użytkownicy mogli łatwo przechodzić od albumów do zdjęć, tagów, map itp. + +<i>Aves</i> integruje się z Androidem (od <b>API 19 do 33</b>, czyli od KitKata do Androida 13) z funkcjami takimi jak <b>widżety</b>, <b>skróty do aplikacji</b>, <b>wygaszacz ekranu</b> i <b>obsługa globalnego wyszukiwania</b>. Działa również jako <b>przeglądarka i selektor mediów</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/pl/short_description.txt b/fastlane/metadata/android/pl/short_description.txt new file mode 100644 index 000000000..5c80f2040 --- /dev/null +++ b/fastlane/metadata/android/pl/short_description.txt @@ -0,0 +1 @@ +Galeria i przeglądarka metadanych \ No newline at end of file diff --git a/fastlane/metadata/android/pt_BR/full_description.txt b/fastlane/metadata/android/pt_BR/full_description.txt new file mode 100644 index 000000000..8806906a1 --- /dev/null +++ b/fastlane/metadata/android/pt_BR/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (from <b>API 19 to 33</b>, i.e. from KitKat to Android 13) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/pt_BR/short_description.txt b/fastlane/metadata/android/pt_BR/short_description.txt new file mode 100644 index 000000000..8c9445bd5 --- /dev/null +++ b/fastlane/metadata/android/pt_BR/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt new file mode 100644 index 000000000..8806906a1 --- /dev/null +++ b/fastlane/metadata/android/ru/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. + +<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. + +<i>Aves</i> integrates with Android (from <b>API 19 to 33</b>, i.e. from KitKat to Android 13) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ru/short_description.txt b/fastlane/metadata/android/ru/short_description.txt new file mode 100644 index 000000000..8c9445bd5 --- /dev/null +++ b/fastlane/metadata/android/ru/short_description.txt @@ -0,0 +1 @@ +Gallery and metadata explorer \ No newline at end of file diff --git a/lib/l10n/app_el.arb b/lib/l10n/app_el.arb index c7b2619b3..5843cb288 100644 --- a/lib/l10n/app_el.arb +++ b/lib/l10n/app_el.arb @@ -323,7 +323,7 @@ "@rootDirectoryDescription": {}, "otherDirectoryDescription": "«{name}» κατάλογος", "@otherDirectoryDescription": {}, - "storageAccessDialogMessage": "Παρακαλώ επιλέξτε τον {directory} του «{volume}» στην επόμενη οθόνη για να δώσετε πρόσβαση στην εφαρμογή", + "storageAccessDialogMessage": "Παρακαλώ επιλέξτε τον {directory} του «{volume}» στην επόμενη οθόνη για να δώσετε πρόσβαση στην εφαρμογή.", "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "Αυτή η εφαρμογή δεν επιτρέπεται να τροποποιεί αρχεία στο {directory} του «{volume}».\n\nΠαρακαλώ χρησιμοποιήστε μια άλλη εφαρμογή διαχείρισης αρχείων ή συλλογή φωτογραφιών για να μετακινήσετε τα στοιχεία αλλού.", "@restrictedAccessDialogMessage": {}, diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 62027cb06..3b8e2bb60 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1084,5 +1084,67 @@ "filePickerNoItems": "Sin elementos", "@filePickerNoItems": {}, "filePickerUseThisFolder": "Usar esta carpeta", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "chipActionFilterOut": "Filtrar", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Filtrar en", + "@chipActionFilterIn": {}, + "entryInfoActionEditTitleDescription": "Editar título y descripción", + "@entryInfoActionEditTitleDescription": {}, + "filterNoDateLabel": "Sin fecha", + "@filterNoDateLabel": {}, + "filterNoTitleLabel": "Sin título", + "@filterNoTitleLabel": {}, + "filterRecentlyAddedLabel": "Recientemente añadido", + "@filterRecentlyAddedLabel": {}, + "viewerTransitionNone": "Ninguno", + "@viewerTransitionNone": {}, + "widgetOpenPageHome": "Casa abierta", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "Colección abierta", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "Visor abierto", + "@widgetOpenPageViewer": {}, + "durationDialogSeconds": "Segundos", + "@durationDialogSeconds": {}, + "viewDialogReverseSortOrder": "Orden de clasificación inverso", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "Mosaico", + "@tileLayoutMosaic": {}, + "sortOrderNewestFirst": "El más nuevo primero", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Los más viejos primero", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "De la A a la Z", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "De la Z a la A", + "@sortOrderZtoA": {}, + "albumGroupType": "Por tipo", + "@albumGroupType": {}, + "albumMimeTypeMixed": "Mezclado", + "@albumMimeTypeMixed": {}, + "searchMetadataSectionTitle": "Metadatos", + "@searchMetadataSectionTitle": {}, + "settingsDisabled": "Desactivado", + "@settingsDisabled": {}, + "settingsConfirmationAfterMoveToBinItems": "Mostrar mensaje después de mover elementos a la papelera de reciclaje", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsSlideshowAnimatedZoomEffect": "Efecto de zoom animado", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsWidgetOpenPage": "Al pulsar sobre el widget", + "@settingsWidgetOpenPage": {}, + "statsTopAlbumsSectionTitle": "Álbumes principales", + "@statsTopAlbumsSectionTitle": {}, + "viewerInfoLabelDescription": "Descripción", + "@viewerInfoLabelDescription": {}, + "wallpaperUseScrollEffect": "Usar el efecto de desplazamiento en la pantalla de inicio", + "@wallpaperUseScrollEffect": {}, + "sortOrderHighestFirst": "El mas alto primero", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Más bajo primero", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "El más grande primero", + "@sortOrderLargestFirst": {}, + "sortOrderSmallestFirst": "El más pequeño primero", + "@sortOrderSmallestFirst": {} } diff --git a/lib/l10n/app_fa.arb b/lib/l10n/app_fa.arb new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/lib/l10n/app_fa.arb @@ -0,0 +1 @@ +{} diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index d75c0352f..139d7fc94 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -1,678 +1,1120 @@ { "appName": "Aves", + "@appName": {}, "welcomeMessage": "Selamat datang ke Aves", + "@welcomeMessage": {}, "welcomeOptional": "Opsional", + "@welcomeOptional": {}, "welcomeTermsToggle": "Saya menyetujui syarat dan ketentuan", + "@welcomeTermsToggle": {}, "itemCount": "{count, plural, other{{count} benda}}", - + "@itemCount": {}, "timeSeconds": "{seconds, plural, other{{seconds} detik}}", + "@timeSeconds": {}, "timeMinutes": "{minutes, plural, other{{minutes} menit}}", + "@timeMinutes": {}, "timeDays": "{days, plural, other{{days} hari}}", + "@timeDays": {}, "focalLength": "{length} mm", - + "@focalLength": {}, "applyButtonLabel": "TERAPKAN", + "@applyButtonLabel": {}, "deleteButtonLabel": "BUANG", + "@deleteButtonLabel": {}, "nextButtonLabel": "SELANJUTNYA", + "@nextButtonLabel": {}, "showButtonLabel": "TAMPILKAN", + "@showButtonLabel": {}, "hideButtonLabel": "SEMBUNYIKAN", + "@hideButtonLabel": {}, "continueButtonLabel": "SELANJUTNYA", - + "@continueButtonLabel": {}, "cancelTooltip": "Batal", + "@cancelTooltip": {}, "changeTooltip": "Ganti", + "@changeTooltip": {}, "clearTooltip": "Hapus", + "@clearTooltip": {}, "previousTooltip": "Sebelumnya", + "@previousTooltip": {}, "nextTooltip": "Selanjutnya", + "@nextTooltip": {}, "showTooltip": "Tampilkan", + "@showTooltip": {}, "hideTooltip": "Sembunyikan", + "@hideTooltip": {}, "actionRemove": "Hapus", + "@actionRemove": {}, "resetTooltip": "Ulang", + "@resetTooltip": {}, "saveTooltip": "Simpan", + "@saveTooltip": {}, "pickTooltip": "Pilih", - + "@pickTooltip": {}, "doubleBackExitMessage": "Ketuk “kembali” lagi untuk keluar.", + "@doubleBackExitMessage": {}, "doNotAskAgain": "Jangan tanya lagi", - + "@doNotAskAgain": {}, "sourceStateLoading": "Memuat", + "@sourceStateLoading": {}, "sourceStateCataloguing": "Mengkataloging", + "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "Mencari negara", + "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "Mencari tempat", - + "@sourceStateLocatingPlaces": {}, "chipActionDelete": "Hapus", + "@chipActionDelete": {}, "chipActionGoToAlbumPage": "Tampilkan di Album", + "@chipActionGoToAlbumPage": {}, "chipActionGoToCountryPage": "Tampilkan di Negara", + "@chipActionGoToCountryPage": {}, "chipActionGoToTagPage": "Tampilkan di Label", + "@chipActionGoToTagPage": {}, "chipActionHide": "Sembunyikan", + "@chipActionHide": {}, "chipActionPin": "Sematkan ke atas", + "@chipActionPin": {}, "chipActionUnpin": "Lepas sematan dari atas", + "@chipActionUnpin": {}, "chipActionRename": "Ganti nama", + "@chipActionRename": {}, "chipActionSetCover": "Setel sampul", + "@chipActionSetCover": {}, "chipActionCreateAlbum": "Buat album", - + "@chipActionCreateAlbum": {}, "entryActionCopyToClipboard": "Salin ke papan klip", + "@entryActionCopyToClipboard": {}, "entryActionDelete": "Hapus", + "@entryActionDelete": {}, "entryActionConvert": "Ubah", + "@entryActionConvert": {}, "entryActionExport": "Ekspor", + "@entryActionExport": {}, "entryActionInfo": "Info", + "@entryActionInfo": {}, "entryActionRename": "Ganti nama", + "@entryActionRename": {}, "entryActionRestore": "Pulihkan", + "@entryActionRestore": {}, "entryActionRotateCCW": "Putar berlawanan arah jarum jam", + "@entryActionRotateCCW": {}, "entryActionRotateCW": "Putar searah jarum jam", + "@entryActionRotateCW": {}, "entryActionFlip": "Balik secara horisontal", + "@entryActionFlip": {}, "entryActionPrint": "Cetak", + "@entryActionPrint": {}, "entryActionShare": "Bagikan", + "@entryActionShare": {}, "entryActionViewSource": "Lihat sumber", + "@entryActionViewSource": {}, "entryActionShowGeoTiffOnMap": "Tampilkan sebagai hamparan peta", + "@entryActionShowGeoTiffOnMap": {}, "entryActionConvertMotionPhotoToStillImage": "Ubah ke gambar tetap", + "@entryActionConvertMotionPhotoToStillImage": {}, "entryActionViewMotionPhotoVideo": "Buka video", + "@entryActionViewMotionPhotoVideo": {}, "entryActionEdit": "Ubah", + "@entryActionEdit": {}, "entryActionOpen": "Buka dengan", + "@entryActionOpen": {}, "entryActionSetAs": "Tetapkan sebagai", + "@entryActionSetAs": {}, "entryActionOpenMap": "Tampilkan di peta", + "@entryActionOpenMap": {}, "entryActionRotateScreen": "Putar layar", + "@entryActionRotateScreen": {}, "entryActionAddFavourite": "Tambahkan ke favorit", + "@entryActionAddFavourite": {}, "entryActionRemoveFavourite": "Hapus dari favorit", - + "@entryActionRemoveFavourite": {}, "videoActionCaptureFrame": "Tangkap bingkai", + "@videoActionCaptureFrame": {}, "videoActionMute": "Matikan Suara", + "@videoActionMute": {}, "videoActionUnmute": "Hidupkan Suara", + "@videoActionUnmute": {}, "videoActionPause": "Hentikan", + "@videoActionPause": {}, "videoActionPlay": "Mainkan", + "@videoActionPlay": {}, "videoActionReplay10": "Mundurkan 10 detik", + "@videoActionReplay10": {}, "videoActionSkip10": "Majukan 10 detik", + "@videoActionSkip10": {}, "videoActionSelectStreams": "Pilih trek", + "@videoActionSelectStreams": {}, "videoActionSetSpeed": "Kecepatan pemutaran", + "@videoActionSetSpeed": {}, "videoActionSettings": "Pengaturan", - + "@videoActionSettings": {}, "slideshowActionResume": "Lanjutkan", + "@slideshowActionResume": {}, "slideshowActionShowInCollection": "Tampilkan di Koleksi", - + "@slideshowActionShowInCollection": {}, "entryInfoActionEditDate": "Ubah tanggal & waktu", + "@entryInfoActionEditDate": {}, "entryInfoActionEditLocation": "Ubah lokasi", + "@entryInfoActionEditLocation": {}, "entryInfoActionEditTitleDescription": "Ubah judul & deskripsi", + "@entryInfoActionEditTitleDescription": {}, "entryInfoActionEditRating": "Ubah nilai", + "@entryInfoActionEditRating": {}, "entryInfoActionEditTags": "Ubah label", + "@entryInfoActionEditTags": {}, "entryInfoActionRemoveMetadata": "Hapus metadata", - + "@entryInfoActionRemoveMetadata": {}, "filterBinLabel": "Tong sampah", + "@filterBinLabel": {}, "filterFavouriteLabel": "Favorit", + "@filterFavouriteLabel": {}, "filterNoDateLabel": "Tak ada tanggal", + "@filterNoDateLabel": {}, "filterNoLocationLabel": "Lokasi yang tidak ditemukan", + "@filterNoLocationLabel": {}, "filterNoRatingLabel": "Belum diberi nilai", + "@filterNoRatingLabel": {}, "filterNoTagLabel": "Tidak dilabel", + "@filterNoTagLabel": {}, "filterNoTitleLabel": "Tak ada judul", + "@filterNoTitleLabel": {}, "filterOnThisDayLabel": "Di hari ini", + "@filterOnThisDayLabel": {}, "filterRecentlyAddedLabel": "Baru-baru ini ditambahkan", + "@filterRecentlyAddedLabel": {}, "filterRatingRejectedLabel": "Ditolak", + "@filterRatingRejectedLabel": {}, "filterTypeAnimatedLabel": "Teranimasi", + "@filterTypeAnimatedLabel": {}, "filterTypeMotionPhotoLabel": "Foto bergerak", + "@filterTypeMotionPhotoLabel": {}, "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, "filterTypeSphericalVideoLabel": "Vidio 360°", + "@filterTypeSphericalVideoLabel": {}, "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, "filterMimeImageLabel": "Gambar", + "@filterMimeImageLabel": {}, "filterMimeVideoLabel": "Video", - + "@filterMimeVideoLabel": {}, "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, "coordinateFormatDecimal": "Derajat desimal", + "@coordinateFormatDecimal": {}, "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, "coordinateDmsWest": "W", - + "@coordinateDmsWest": {}, "unitSystemMetric": "Metrik", + "@unitSystemMetric": {}, "unitSystemImperial": "Imperial", - + "@unitSystemImperial": {}, "videoLoopModeNever": "Jangan pernah", + "@videoLoopModeNever": {}, "videoLoopModeShortOnly": "Hanya video pendek", + "@videoLoopModeShortOnly": {}, "videoLoopModeAlways": "Selalu", - + "@videoLoopModeAlways": {}, "videoControlsPlay": "Putar", + "@videoControlsPlay": {}, "videoControlsPlaySeek": "Putar dan cari", + "@videoControlsPlaySeek": {}, "videoControlsPlayOutside": "Buka dengan pemutar lain", + "@videoControlsPlayOutside": {}, "videoControlsNone": "Tidak ada", - + "@videoControlsNone": {}, "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "@mapStyleGoogleHybrid": {}, "mapStyleGoogleTerrain": "Google Maps (Terrain)", + "@mapStyleGoogleTerrain": {}, "mapStyleHuaweiNormal": "Petal Maps", + "@mapStyleHuaweiNormal": {}, "mapStyleHuaweiTerrain": "Petal Maps (Terrain)", + "@mapStyleHuaweiTerrain": {}, "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, "mapStyleStamenToner": "Stamen Toner", + "@mapStyleStamenToner": {}, "mapStyleStamenWatercolor": "Stamen Watercolor", - + "@mapStyleStamenWatercolor": {}, "nameConflictStrategyRename": "Ganti nama", + "@nameConflictStrategyRename": {}, "nameConflictStrategyReplace": "Ganti", + "@nameConflictStrategyReplace": {}, "nameConflictStrategySkip": "Lewati", - + "@nameConflictStrategySkip": {}, "keepScreenOnNever": "Jangan pernah", + "@keepScreenOnNever": {}, "keepScreenOnViewerOnly": "Hanya halaman penonton", + "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "Selalu", - + "@keepScreenOnAlways": {}, "accessibilityAnimationsRemove": "Cegah efek layar", + "@accessibilityAnimationsRemove": {}, "accessibilityAnimationsKeep": "Simpan efek layar", - + "@accessibilityAnimationsKeep": {}, "displayRefreshRatePreferHighest": "Penyegaran tertinggi", + "@displayRefreshRatePreferHighest": {}, "displayRefreshRatePreferLowest": "Penyegaran terendah", - + "@displayRefreshRatePreferLowest": {}, "videoPlaybackSkip": "Lewati", + "@videoPlaybackSkip": {}, "videoPlaybackMuted": "Mainkan bisu", + "@videoPlaybackMuted": {}, "videoPlaybackWithSound": "Mainkan dengan suara", - + "@videoPlaybackWithSound": {}, "themeBrightnessLight": "Terang", + "@themeBrightnessLight": {}, "themeBrightnessDark": "Gelap", + "@themeBrightnessDark": {}, "themeBrightnessBlack": "Hitam", - + "@themeBrightnessBlack": {}, "viewerTransitionSlide": "Menggeser", + "@viewerTransitionSlide": {}, "viewerTransitionParallax": "Paralaks", + "@viewerTransitionParallax": {}, "viewerTransitionFade": "Memudar", + "@viewerTransitionFade": {}, "viewerTransitionZoomIn": "Membesar", - + "@viewerTransitionZoomIn": {}, "wallpaperTargetHome": "Tampilan depan", + "@wallpaperTargetHome": {}, "wallpaperTargetLock": "Tampilan kunci", + "@wallpaperTargetLock": {}, "wallpaperTargetHomeLock": "Tampilan depan dan kunci", - + "@wallpaperTargetHomeLock": {}, "albumTierNew": "Baru", + "@albumTierNew": {}, "albumTierPinned": "Disemat", + "@albumTierPinned": {}, "albumTierSpecial": "Biasa", + "@albumTierSpecial": {}, "albumTierApps": "Aplikasi", + "@albumTierApps": {}, "albumTierRegular": "Lainnya", - + "@albumTierRegular": {}, "storageVolumeDescriptionFallbackPrimary": "Penyimpanan internal", + "@storageVolumeDescriptionFallbackPrimary": {}, "storageVolumeDescriptionFallbackNonPrimary": "kartu SD", + "@storageVolumeDescriptionFallbackNonPrimary": {}, "rootDirectoryDescription": "direktori root", + "@rootDirectoryDescription": {}, "otherDirectoryDescription": "direktori “{name}”", + "@otherDirectoryDescription": {}, "storageAccessDialogMessage": "Silahkan pilih {directory} dari “{volume}” di layar berikutnya untuk memberikan akses aplikasi ini ke sana.", + "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "Aplikasi ini tidak diizinkan untuk mengubah file di {directory} dari “{volume}”.\n\nSilahkan pakai aplikasi Manager File atau aplikasi gallery untuk gerakkan benda ke direktori lain.", + "@restrictedAccessDialogMessage": {}, "notEnoughSpaceDialogMessage": "Operasi ini memerlukan {neededSize} ruang kosong di “{volume}” untuk menyelesaikan, tetapi hanya ada {freeSize} tersisa.", + "@notEnoughSpaceDialogMessage": {}, "missingSystemFilePickerDialogMessage": "Pemilih file sistem tidak ada atau dinonaktifkan. Harap aktifkan dan coba lagi.", - + "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, other{Operasi ini tidak didukung untuk benda dari jenis berikut: {types}.}}", - + "@unsupportedTypeDialogMessage": {}, "nameConflictDialogSingleSourceMessage": "Beberapa file di folder tujuan memiliki nama yang sama.", + "@nameConflictDialogSingleSourceMessage": {}, "nameConflictDialogMultipleSourceMessage": "Beberapa file memiliki nama yang sama.", - + "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "Label pintasan", + "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "TAMBAH", - + "@addShortcutButtonLabel": {}, "noMatchingAppDialogMessage": "Tidak ada aplikasi yang cocok untuk menangani ini.", - + "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{Pindahkan benda ini ke tong sampah?} other{Pindahkan {count} benda ke tempat sampah?}}", + "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Anda yakin ingin menghapus benda ini?} other{Apakah Anda yakin ingin menghapus {count} benda?}}", + "@deleteEntriesConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogMessage": "Beberapa benda tidak mempunyai tanggal metadata. Tanggal mereka sekarang akan diatur ulang dengan operasi ini kecuali ada tanggal metadata yang ditetapkan.", + "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Atur tanggal", - + "@moveUndatedConfirmationDialogSetDate": {}, "videoResumeDialogMessage": "Apakah Anda ingin melanjutkan di {time}?", + "@videoResumeDialogMessage": {}, "videoStartOverButtonLabel": "ULANG DARI AWAL", + "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "LANJUT", - + "@videoResumeButtonLabel": {}, "setCoverDialogLatest": "Benda terbaru", + "@setCoverDialogLatest": {}, "setCoverDialogAuto": "Otomatis", + "@setCoverDialogAuto": {}, "setCoverDialogCustom": "Kustom", - + "@setCoverDialogCustom": {}, "hideFilterConfirmationDialogMessage": "Foto dan video yang cocok akan disembunyikan dari koleksi Anda. Anda dapat menampilkannya lagi dari pengaturan “Privasi”.\n\nApakah Anda yakin ingin menyembunyikannya?", - + "@hideFilterConfirmationDialogMessage": {}, "newAlbumDialogTitle": "Album Baru", + "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "Nama album", + "@newAlbumDialogNameLabel": {}, "newAlbumDialogNameLabelAlreadyExistsHelper": "Direktori sudah ada", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "Penyimpanan:", - + "@newAlbumDialogStorageLabel": {}, "renameAlbumDialogLabel": "Nama baru", + "@renameAlbumDialogLabel": {}, "renameAlbumDialogLabelAlreadyExistsHelper": "Direktori sudah ada", - + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, "renameEntrySetPageTitle": "Ganti nama", + "@renameEntrySetPageTitle": {}, "renameEntrySetPagePatternFieldLabel": "Pola penamaan", + "@renameEntrySetPagePatternFieldLabel": {}, "renameEntrySetPageInsertTooltip": "Masukkan bidang", + "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "Pratinjau", - + "@renameEntrySetPagePreviewSectionTitle": {}, "renameProcessorCounter": "Penghitungan", + "@renameProcessorCounter": {}, "renameProcessorName": "Nama", - + "@renameProcessorName": {}, "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Apakah Anda yakin ingin menghapus album ini dan bendanya?} other{Apakah Anda yakin ingin menghapus album ini dan {count} bendanya?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Apakah Anda yakin ingin menghapus album ini dan bendanya?} other{Apakah Anda yakin ingin menghapus album ini dan {count} bendanya?}}", - + "@deleteMultiAlbumConfirmationDialogMessage": {}, "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, "exportEntryDialogWidth": "Lebar", + "@exportEntryDialogWidth": {}, "exportEntryDialogHeight": "Tinggi", - + "@exportEntryDialogHeight": {}, "renameEntryDialogLabel": "Nama baru", - + "@renameEntryDialogLabel": {}, "editEntryDialogTargetFieldsHeader": "Bidang untuk dimodifikasikan", - + "@editEntryDialogTargetFieldsHeader": {}, "editEntryDateDialogTitle": "Tanggal & Waktu", + "@editEntryDateDialogTitle": {}, "editEntryDateDialogSetCustom": "Atur tanggal khusus", + "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Salin dari tanggal lain", + "@editEntryDateDialogCopyField": {}, "editEntryDateDialogCopyItem": "Salin dari benda lain", + "@editEntryDateDialogCopyItem": {}, "editEntryDateDialogExtractFromTitle": "Ekstrak dari judul", + "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Geser", + "@editEntryDateDialogShift": {}, "editEntryDateDialogSourceFileModifiedDate": "Tanggal modifikasi file", - + "@editEntryDateDialogSourceFileModifiedDate": {}, "durationDialogHours": "Jam", + "@durationDialogHours": {}, "durationDialogMinutes": "Menit", - + "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Lokasi", + "@editEntryLocationDialogTitle": {}, "editEntryLocationDialogChooseOnMapTooltip": "Pilih di peta", + "@editEntryLocationDialogChooseOnMapTooltip": {}, "editEntryLocationDialogLatitude": "Garis lintang", + "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Garis bujur", - + "@editEntryLocationDialogLongitude": {}, "locationPickerUseThisLocationButton": "Gunakan lokasi ini", - + "@locationPickerUseThisLocationButton": {}, "editEntryRatingDialogTitle": "Nilai", - + "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "Penghapusan Metadata", + "@removeEntryMetadataDialogTitle": {}, "removeEntryMetadataDialogMore": "Lebih Banyak", - + "@removeEntryMetadataDialogMore": {}, "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP diperlukan untuk memutar video di dalam Foto bergerak.\n\nAnda yakin ingin menghapusnya?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, "convertMotionPhotoToStillImageWarningDialogMessage": "Apakah kamu yakin?", - + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, "videoSpeedDialogLabel": "Kecepatan pemutaran", - + "@videoSpeedDialogLabel": {}, "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, "videoStreamSelectionDialogAudio": "Audio", + "@videoStreamSelectionDialogAudio": {}, "videoStreamSelectionDialogText": "Subjudul", + "@videoStreamSelectionDialogText": {}, "videoStreamSelectionDialogOff": "Mati", + "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "Trek", + "@videoStreamSelectionDialogTrack": {}, "videoStreamSelectionDialogNoSelection": "Tidak ada Trek yang lain.", - + "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "Selesai!", + "@genericSuccessFeedback": {}, "genericFailureFeedback": "Gagal", - + "@genericFailureFeedback": {}, "menuActionConfigureView": "Tata letak", + "@menuActionConfigureView": {}, "menuActionSelect": "Pilih", + "@menuActionSelect": {}, "menuActionSelectAll": "Pilih semua", + "@menuActionSelectAll": {}, "menuActionSelectNone": "Pilih tidak ada", + "@menuActionSelectNone": {}, "menuActionMap": "Peta", + "@menuActionMap": {}, "menuActionSlideshow": "Tampilan slide", + "@menuActionSlideshow": {}, "menuActionStats": "Statistik", - + "@menuActionStats": {}, "viewDialogSortSectionTitle": "Sortir", + "@viewDialogSortSectionTitle": {}, "viewDialogGroupSectionTitle": "Grup", + "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "Tata letak", + "@viewDialogLayoutSectionTitle": {}, "viewDialogReverseSortOrder": "Urutan pengurutan terbalik", - + "@viewDialogReverseSortOrder": {}, "tileLayoutGrid": "Grid", + "@tileLayoutGrid": {}, "tileLayoutList": "Daftar", - + "@tileLayoutList": {}, "coverDialogTabCover": "Kover", + "@coverDialogTabCover": {}, "coverDialogTabApp": "Aplikasi", + "@coverDialogTabApp": {}, "coverDialogTabColor": "Warna", - + "@coverDialogTabColor": {}, "appPickDialogTitle": "Pilih Aplikasi", + "@appPickDialogTitle": {}, "appPickDialogNone": "Tidak ada", - + "@appPickDialogNone": {}, "aboutPageTitle": "Tentang", + "@aboutPageTitle": {}, "aboutLinkLicense": "Lisensi", + "@aboutLinkLicense": {}, "aboutLinkPolicy": "Aturan Privasi", - + "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "Lapor Bug", + "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "Simpan log aplikasi ke file", + "@aboutBugSaveLogInstruction": {}, "aboutBugCopyInfoInstruction": "Salin informasi sistem", + "@aboutBugCopyInfoInstruction": {}, "aboutBugCopyInfoButton": "Salin", + "@aboutBugCopyInfoButton": {}, "aboutBugReportInstruction": "Laporkan ke GitHub dengan log dan informasi sistem", + "@aboutBugReportInstruction": {}, "aboutBugReportButton": "Rapor", - + "@aboutBugReportButton": {}, "aboutCreditsSectionTitle": "Kredit", + "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "Aplikasi ini menggunakan file TopoJSON dari", + "@aboutCreditsWorldAtlas1": {}, "aboutCreditsWorldAtlas2": "dibawah Lisensi ISC.", + "@aboutCreditsWorldAtlas2": {}, "aboutTranslatorsSectionTitle": "Penerjemah", - + "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "Lisensi Sumber Terbuka", + "@aboutLicensesSectionTitle": {}, "aboutLicensesBanner": "Aplikasi ini menggunakan paket dan perpustakaan sumber terbuka berikut.", + "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "Perpustakaan Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, "aboutLicensesFlutterPluginsSectionTitle": "Plugin Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, "aboutLicensesFlutterPackagesSectionTitle": "Paket Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, "aboutLicensesDartPackagesSectionTitle": "Paket Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "Tampilkan Semua Lisensi", - + "@aboutLicensesShowAllButtonLabel": {}, "policyPageTitle": "Aturan Privasi", - + "@policyPageTitle": {}, "collectionPageTitle": "Koleksi", + "@collectionPageTitle": {}, "collectionPickPageTitle": "Pilih", + "@collectionPickPageTitle": {}, "collectionSelectPageTitle": "Pilih benda", - + "@collectionSelectPageTitle": {}, "collectionActionShowTitleSearch": "Tampilkan filter judul", + "@collectionActionShowTitleSearch": {}, "collectionActionHideTitleSearch": "Sembunyikan filter judul", + "@collectionActionHideTitleSearch": {}, "collectionActionAddShortcut": "Tambahkan pintasan", + "@collectionActionAddShortcut": {}, "collectionActionEmptyBin": "Kosongkan tong sampah", + "@collectionActionEmptyBin": {}, "collectionActionCopy": "Salin ke album", + "@collectionActionCopy": {}, "collectionActionMove": "Pindah ke album", + "@collectionActionMove": {}, "collectionActionRescan": "Pindai ulang", + "@collectionActionRescan": {}, "collectionActionEdit": "Ubah", - + "@collectionActionEdit": {}, "collectionSearchTitlesHintText": "Cari judul", - + "@collectionSearchTitlesHintText": {}, "collectionGroupAlbum": "Lewat album", + "@collectionGroupAlbum": {}, "collectionGroupMonth": "Lewat bulan", + "@collectionGroupMonth": {}, "collectionGroupDay": "Lewat hari", + "@collectionGroupDay": {}, "collectionGroupNone": "Jangan kelompokkan", - + "@collectionGroupNone": {}, "sectionUnknown": "Tidak dikenal", + "@sectionUnknown": {}, "dateToday": "Hari ini", + "@dateToday": {}, "dateYesterday": "Kemaren", + "@dateYesterday": {}, "dateThisMonth": "Bulan ini", + "@dateThisMonth": {}, "collectionDeleteFailureFeedback": "{count, plural, other{Gagal untuk menghapus {count} benda}}", + "@collectionDeleteFailureFeedback": {}, "collectionCopyFailureFeedback": "{count, plural, other{Gagal untuk menyalin {count} benda}}", + "@collectionCopyFailureFeedback": {}, "collectionMoveFailureFeedback": "{count, plural, other{Gagal untuk menggerakkan {count} benda}}", + "@collectionMoveFailureFeedback": {}, "collectionRenameFailureFeedback": "{count, plural, other{Gagal untuk menggantikan nama {count} benda}}", + "@collectionRenameFailureFeedback": {}, "collectionEditFailureFeedback": "{count, plural, other{Gagal untuk mengubah {count} benda}}", + "@collectionEditFailureFeedback": {}, "collectionExportFailureFeedback": "{count, plural, other{Gagal untuk mengekspor {count} halaman}}", + "@collectionExportFailureFeedback": {}, "collectionCopySuccessFeedback": "{count, plural, other{Menyalin {count} benda}}", + "@collectionCopySuccessFeedback": {}, "collectionMoveSuccessFeedback": "{count, plural, other{{count} benda terpindah}}", + "@collectionMoveSuccessFeedback": {}, "collectionRenameSuccessFeedback": "{count, plural, other{Tergantikan nama untuk {count} benda}}", + "@collectionRenameSuccessFeedback": {}, "collectionEditSuccessFeedback": "{count, plural, other{Mengubah {count} benda}}", - + "@collectionEditSuccessFeedback": {}, "collectionEmptyFavourites": "Tidak ada favorit", + "@collectionEmptyFavourites": {}, "collectionEmptyVideos": "Tidak ada video", + "@collectionEmptyVideos": {}, "collectionEmptyImages": "Tidak ada gambar", + "@collectionEmptyImages": {}, "collectionEmptyGrantAccessButtonLabel": "Berikan akses", - + "@collectionEmptyGrantAccessButtonLabel": {}, "collectionSelectSectionTooltip": "Pilih bagian", + "@collectionSelectSectionTooltip": {}, "collectionDeselectSectionTooltip": "Batalkan pilihan bagian", - + "@collectionDeselectSectionTooltip": {}, "drawerAboutButton": "Tentang", + "@drawerAboutButton": {}, "drawerSettingsButton": "Pengaturan", + "@drawerSettingsButton": {}, "drawerCollectionAll": "Semua koleksi", + "@drawerCollectionAll": {}, "drawerCollectionFavourites": "Favorit", + "@drawerCollectionFavourites": {}, "drawerCollectionImages": "Gambar", + "@drawerCollectionImages": {}, "drawerCollectionVideos": "Video", + "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "Teranimasi", + "@drawerCollectionAnimated": {}, "drawerCollectionMotionPhotos": "Foto bergerak", + "@drawerCollectionMotionPhotos": {}, "drawerCollectionPanoramas": "Panorama", + "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "Foto Raw", + "@drawerCollectionRaws": {}, "drawerCollectionSphericalVideos": "Video 360°", + "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "Album", + "@drawerAlbumPage": {}, "drawerCountryPage": "Negara", + "@drawerCountryPage": {}, "drawerTagPage": "Label", - + "@drawerTagPage": {}, "sortByDate": "Lewat tanggal", + "@sortByDate": {}, "sortByName": "Lewat nama", + "@sortByName": {}, "sortByItemCount": "Lewat jumlah benda", + "@sortByItemCount": {}, "sortBySize": "Lewat ukuran", + "@sortBySize": {}, "sortByAlbumFileName": "Lewat nama album & file", + "@sortByAlbumFileName": {}, "sortByRating": "Lewat nilai", - + "@sortByRating": {}, "sortOrderNewestFirst": "Terbaru pertama", + "@sortOrderNewestFirst": {}, "sortOrderOldestFirst": "Tertua pertama", + "@sortOrderOldestFirst": {}, "sortOrderAtoZ": "A ke Z", + "@sortOrderAtoZ": {}, "sortOrderZtoA": "Z ke A", + "@sortOrderZtoA": {}, "sortOrderHighestFirst": "Tertinggi pertama", + "@sortOrderHighestFirst": {}, "sortOrderLowestFirst": "Terendah pertama", + "@sortOrderLowestFirst": {}, "sortOrderLargestFirst": "Terbesar pertama", + "@sortOrderLargestFirst": {}, "sortOrderSmallestFirst": "Terkecil pertama", - + "@sortOrderSmallestFirst": {}, "albumGroupTier": "Lewat tingkat", + "@albumGroupTier": {}, "albumGroupVolume": "Lewat volume penyimpanan", + "@albumGroupVolume": {}, "albumGroupNone": "Jangan kelompokkan", - + "@albumGroupNone": {}, "albumPickPageTitleCopy": "Salin ke Album", + "@albumPickPageTitleCopy": {}, "albumPickPageTitleExport": "Ekspor ke Album", + "@albumPickPageTitleExport": {}, "albumPickPageTitleMove": "Pindah ke Album", + "@albumPickPageTitleMove": {}, "albumPickPageTitlePick": "Pilih Album", - + "@albumPickPageTitlePick": {}, "albumCamera": "Kamera", + "@albumCamera": {}, "albumDownload": "Download", + "@albumDownload": {}, "albumScreenshots": "Tangkapan layar", + "@albumScreenshots": {}, "albumScreenRecordings": "Rekaman layar", + "@albumScreenRecordings": {}, "albumVideoCaptures": "Tangkapan Video", - + "@albumVideoCaptures": {}, "albumPageTitle": "Album", + "@albumPageTitle": {}, "albumEmpty": "Tidak ada album", + "@albumEmpty": {}, "createAlbumTooltip": "Buat album", + "@createAlbumTooltip": {}, "createAlbumButtonLabel": "BUAT", + "@createAlbumButtonLabel": {}, "newFilterBanner": "baru", - + "@newFilterBanner": {}, "countryPageTitle": "Negara", + "@countryPageTitle": {}, "countryEmpty": "Tidak ada negara", - + "@countryEmpty": {}, "tagPageTitle": "Label", + "@tagPageTitle": {}, "tagEmpty": "Tidak ada label", - + "@tagEmpty": {}, "binPageTitle": "Tong Sampah", - + "@binPageTitle": {}, "searchCollectionFieldHint": "Cari koleksi", + "@searchCollectionFieldHint": {}, "searchRecentSectionTitle": "Terkini", + "@searchRecentSectionTitle": {}, "searchDateSectionTitle": "Tanggal", + "@searchDateSectionTitle": {}, "searchAlbumsSectionTitle": "Album", + "@searchAlbumsSectionTitle": {}, "searchCountriesSectionTitle": "Negara", + "@searchCountriesSectionTitle": {}, "searchPlacesSectionTitle": "Tempat", + "@searchPlacesSectionTitle": {}, "searchTagsSectionTitle": "Label", + "@searchTagsSectionTitle": {}, "searchRatingSectionTitle": "Nilai", + "@searchRatingSectionTitle": {}, "searchMetadataSectionTitle": "Metadata", - + "@searchMetadataSectionTitle": {}, "settingsPageTitle": "Pengaturan", + "@settingsPageTitle": {}, "settingsSystemDefault": "Sistem", + "@settingsSystemDefault": {}, "settingsDefault": "Default", - + "@settingsDefault": {}, "settingsSearchFieldLabel": "Cari peraturan", + "@settingsSearchFieldLabel": {}, "settingsSearchEmpty": "Tidak ada peraturan yang cocok", + "@settingsSearchEmpty": {}, "settingsActionExport": "Ekspor", + "@settingsActionExport": {}, "settingsActionExportDialogTitle": "Ekspor", + "@settingsActionExportDialogTitle": {}, "settingsActionImport": "Impor", + "@settingsActionImport": {}, "settingsActionImportDialogTitle": "Impor", - + "@settingsActionImportDialogTitle": {}, "appExportCovers": "Sampul", + "@appExportCovers": {}, "appExportFavourites": "Favorit", + "@appExportFavourites": {}, "appExportSettings": "Pengaturan", - + "@appExportSettings": {}, "settingsNavigationSectionTitle": "Navigasi", + "@settingsNavigationSectionTitle": {}, "settingsHomeTile": "Beranda", + "@settingsHomeTile": {}, "settingsHomeDialogTitle": "Beranda", + "@settingsHomeDialogTitle": {}, "settingsShowBottomNavigationBar": "Tampilkan bilah navigasi bawah", + "@settingsShowBottomNavigationBar": {}, "settingsKeepScreenOnTile": "Biarkan layarnya menyala", + "@settingsKeepScreenOnTile": {}, "settingsKeepScreenOnDialogTitle": "Biarkan Layarnya Menyala", + "@settingsKeepScreenOnDialogTitle": {}, "settingsDoubleBackExit": "Ketuk “kembali” dua kali untuk keluar", - + "@settingsDoubleBackExit": {}, "settingsConfirmationTile": "Dialog konfirmasi", + "@settingsConfirmationTile": {}, "settingsConfirmationDialogTitle": "Dialog Konfirmasi", + "@settingsConfirmationDialogTitle": {}, "settingsConfirmationBeforeDeleteItems": "Tanya sebelum menghapus benda selamanya", + "@settingsConfirmationBeforeDeleteItems": {}, "settingsConfirmationBeforeMoveToBinItems": "Tanya sebelum memindahkan benda ke tong sampah", + "@settingsConfirmationBeforeMoveToBinItems": {}, "settingsConfirmationBeforeMoveUndatedItems": "Tanyakan sebelum memindahkan barang tanpa metadata tanggal", + "@settingsConfirmationBeforeMoveUndatedItems": {}, "settingsConfirmationAfterMoveToBinItems": "Tampilkan pesan setelah menggerakkan barang ke tong sampah", - + "@settingsConfirmationAfterMoveToBinItems": {}, "settingsNavigationDrawerTile": "Menu navigasi", + "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "Menu Navigasi", + "@settingsNavigationDrawerEditorPageTitle": {}, "settingsNavigationDrawerBanner": "Sentuh dan tahan untuk memindahkan dan menyusun ulang benda menu.", + "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "Tipe", + "@settingsNavigationDrawerTabTypes": {}, "settingsNavigationDrawerTabAlbums": "Album", + "@settingsNavigationDrawerTabAlbums": {}, "settingsNavigationDrawerTabPages": "Halaman", + "@settingsNavigationDrawerTabPages": {}, "settingsNavigationDrawerAddAlbum": "Tambahkan album", - + "@settingsNavigationDrawerAddAlbum": {}, "settingsThumbnailSectionTitle": "Thumbnail", + "@settingsThumbnailSectionTitle": {}, "settingsThumbnailOverlayTile": "Hamparan", + "@settingsThumbnailOverlayTile": {}, "settingsThumbnailOverlayPageTitle": "Hamparan", + "@settingsThumbnailOverlayPageTitle": {}, "settingsThumbnailShowFavouriteIcon": "Tampilkan ikon favorit", + "@settingsThumbnailShowFavouriteIcon": {}, "settingsThumbnailShowTagIcon": "Tampilkan ikon label", + "@settingsThumbnailShowTagIcon": {}, "settingsThumbnailShowLocationIcon": "Tampilkan ikon lokasi", + "@settingsThumbnailShowLocationIcon": {}, "settingsThumbnailShowMotionPhotoIcon": "Tampilkan ikon Foto bergerak", + "@settingsThumbnailShowMotionPhotoIcon": {}, "settingsThumbnailShowRating": "Tampilkan nilai", + "@settingsThumbnailShowRating": {}, "settingsThumbnailShowRawIcon": "Tampilkan ikon raw", + "@settingsThumbnailShowRawIcon": {}, "settingsThumbnailShowVideoDuration": "Tampilkan durasi video", - + "@settingsThumbnailShowVideoDuration": {}, "settingsCollectionQuickActionsTile": "Aksi cepat", + "@settingsCollectionQuickActionsTile": {}, "settingsCollectionQuickActionEditorPageTitle": "Aksi Cepat", + "@settingsCollectionQuickActionEditorPageTitle": {}, "settingsCollectionQuickActionTabBrowsing": "Menjelajah", + "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "Memilih", + "@settingsCollectionQuickActionTabSelecting": {}, "settingsCollectionBrowsingQuickActionEditorBanner": "Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan saat menelusuri benda.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan saat memilih benda.", - + "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "Penonton", + "@settingsViewerSectionTitle": {}, "settingsViewerGestureSideTapNext": "Ketuk tepi layar untuk menampilkan benda sebelumnya/berikutnya", + "@settingsViewerGestureSideTapNext": {}, "settingsViewerUseCutout": "Gunakan area potongan", + "@settingsViewerUseCutout": {}, "settingsViewerMaximumBrightness": "Kecerahan maksimum", + "@settingsViewerMaximumBrightness": {}, "settingsMotionPhotoAutoPlay": "Putar foto bergerak otomatis", + "@settingsMotionPhotoAutoPlay": {}, "settingsImageBackground": "Latar belakang gambar", - + "@settingsImageBackground": {}, "settingsViewerQuickActionsTile": "Aksi cepat", + "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "Aksi Cepat", + "@settingsViewerQuickActionEditorPageTitle": {}, "settingsViewerQuickActionEditorBanner": "Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan di penampil.", + "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Tombol yang Ditampilkan", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Tombol yang tersedia", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, "settingsViewerQuickActionEmpty": "Tidak ada tombol", - + "@settingsViewerQuickActionEmpty": {}, "settingsViewerOverlayTile": "Hamparan", + "@settingsViewerOverlayTile": {}, "settingsViewerOverlayPageTitle": "Hamparan", + "@settingsViewerOverlayPageTitle": {}, "settingsViewerShowOverlayOnOpening": "Tampilkan saat pembukaan", + "@settingsViewerShowOverlayOnOpening": {}, "settingsViewerShowMinimap": "Tampilkan minimap", + "@settingsViewerShowMinimap": {}, "settingsViewerShowInformation": "Tampilkan informasi", + "@settingsViewerShowInformation": {}, "settingsViewerShowInformationSubtitle": "Tampilkan judul, tanggal, lokasi, dll.", + "@settingsViewerShowInformationSubtitle": {}, "settingsViewerShowShootingDetails": "Tampilkan detail pemotretan", + "@settingsViewerShowShootingDetails": {}, "settingsViewerShowOverlayThumbnails": "Tampilkan thumbnail", + "@settingsViewerShowOverlayThumbnails": {}, "settingsViewerEnableOverlayBlurEffect": "Efek Kabur", - + "@settingsViewerEnableOverlayBlurEffect": {}, "settingsViewerSlideshowTile": "Tampilan slide", + "@settingsViewerSlideshowTile": {}, "settingsViewerSlideshowPageTitle": "Tampilan Slide", + "@settingsViewerSlideshowPageTitle": {}, "settingsSlideshowRepeat": "Ulangi", + "@settingsSlideshowRepeat": {}, "settingsSlideshowShuffle": "Acak", + "@settingsSlideshowShuffle": {}, "settingsSlideshowFillScreen": "Isi layar", + "@settingsSlideshowFillScreen": {}, "settingsSlideshowTransitionTile": "Transisi", + "@settingsSlideshowTransitionTile": {}, "settingsSlideshowIntervalTile": "Interval", + "@settingsSlideshowIntervalTile": {}, "settingsSlideshowVideoPlaybackTile": "Putaran ulang video", + "@settingsSlideshowVideoPlaybackTile": {}, "settingsSlideshowVideoPlaybackDialogTitle": "Putaran Ulang Video", - + "@settingsSlideshowVideoPlaybackDialogTitle": {}, "settingsVideoPageTitle": "Pengaturan Video", + "@settingsVideoPageTitle": {}, "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, "settingsVideoShowVideos": "Tampilkan video", + "@settingsVideoShowVideos": {}, "settingsVideoEnableHardwareAcceleration": "Akselerasi perangkat keras", + "@settingsVideoEnableHardwareAcceleration": {}, "settingsVideoAutoPlay": "Putar otomatis", + "@settingsVideoAutoPlay": {}, "settingsVideoLoopModeTile": "Putar ulang", + "@settingsVideoLoopModeTile": {}, "settingsVideoLoopModeDialogTitle": "Putar Ulang", - + "@settingsVideoLoopModeDialogTitle": {}, "settingsSubtitleThemeTile": "Subjudul", + "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "Subjudul", + "@settingsSubtitleThemePageTitle": {}, "settingsSubtitleThemeSample": "Ini adalah sampel.", + "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "Perataan teks", + "@settingsSubtitleThemeTextAlignmentTile": {}, "settingsSubtitleThemeTextAlignmentDialogTitle": "Perataan Teks", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, "settingsSubtitleThemeTextSize": "Ukuran teks", + "@settingsSubtitleThemeTextSize": {}, "settingsSubtitleThemeShowOutline": "Tampilkan garis besar dan bayangan", + "@settingsSubtitleThemeShowOutline": {}, "settingsSubtitleThemeTextColor": "Warna teks", + "@settingsSubtitleThemeTextColor": {}, "settingsSubtitleThemeTextOpacity": "Opasitas teks", + "@settingsSubtitleThemeTextOpacity": {}, "settingsSubtitleThemeBackgroundColor": "Warna latar belakang", + "@settingsSubtitleThemeBackgroundColor": {}, "settingsSubtitleThemeBackgroundOpacity": "Opasitas latar belakang", + "@settingsSubtitleThemeBackgroundOpacity": {}, "settingsSubtitleThemeTextAlignmentLeft": "Kiri", + "@settingsSubtitleThemeTextAlignmentLeft": {}, "settingsSubtitleThemeTextAlignmentCenter": "Tengah", + "@settingsSubtitleThemeTextAlignmentCenter": {}, "settingsSubtitleThemeTextAlignmentRight": "Kanan", - + "@settingsSubtitleThemeTextAlignmentRight": {}, "settingsVideoControlsTile": "Kontrol", + "@settingsVideoControlsTile": {}, "settingsVideoControlsPageTitle": "Kontrol", + "@settingsVideoControlsPageTitle": {}, "settingsVideoButtonsTile": "Tombol", + "@settingsVideoButtonsTile": {}, "settingsVideoGestureDoubleTapTogglePlay": "Ketuk dua kali untuk mainkan/hentikan", + "@settingsVideoGestureDoubleTapTogglePlay": {}, "settingsVideoGestureSideDoubleTapSeek": "Ketuk dua kali di tepi layar untuk mencari kebelakang/kedepan", - + "@settingsVideoGestureSideDoubleTapSeek": {}, "settingsPrivacySectionTitle": "Privasi", + "@settingsPrivacySectionTitle": {}, "settingsAllowInstalledAppAccess": "Izinkan akses ke inventori aplikasi", + "@settingsAllowInstalledAppAccess": {}, "settingsAllowInstalledAppAccessSubtitle": "Digunakan untuk meningkatkan tampilan album", + "@settingsAllowInstalledAppAccessSubtitle": {}, "settingsAllowErrorReporting": "Izinkan pelaporan kesalahan secara anonim", + "@settingsAllowErrorReporting": {}, "settingsSaveSearchHistory": "Simpan riwayat pencarian", + "@settingsSaveSearchHistory": {}, "settingsEnableBin": "Gunakan tong sampah", + "@settingsEnableBin": {}, "settingsEnableBinSubtitle": "Simpan benda yang dihapus selama 30 hari", - + "@settingsEnableBinSubtitle": {}, "settingsHiddenItemsTile": "Benda tersembunyi", + "@settingsHiddenItemsTile": {}, "settingsHiddenItemsPageTitle": "Benda Tersembunyi", - + "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "Filter Tersembunyi", + "@settingsHiddenItemsTabFilters": {}, "settingsHiddenFiltersBanner": "Foto dan video filter tersembunyi yang cocok tidak akan muncul di koleksi Anda.", + "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "Tidak ada filter tersembunyi", - + "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "Jalan Tersembunyi", + "@settingsHiddenItemsTabPaths": {}, "settingsHiddenPathsBanner": "Foto dan video di folder ini, atau subfoldernya, tidak akan muncul di koleksi Anda.", + "@settingsHiddenPathsBanner": {}, "addPathTooltip": "Tambahkan jalan", - + "@addPathTooltip": {}, "settingsStorageAccessTile": "Akses penyimpanan", + "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "Akses Penyimpanan", + "@settingsStorageAccessPageTitle": {}, "settingsStorageAccessBanner": "Beberapa direktori memerlukan pemberian akses eksplisit untuk memodifikasi file di dalamnya. Anda dapat meninjau direktori yang anda beri akses sebelumnya di sini.", + "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "Tidak ada akses", + "@settingsStorageAccessEmpty": {}, "settingsStorageAccessRevokeTooltip": "Tarik kembali", - + "@settingsStorageAccessRevokeTooltip": {}, "settingsAccessibilitySectionTitle": "Aksesibilitas", + "@settingsAccessibilitySectionTitle": {}, "settingsRemoveAnimationsTile": "Hapus animasi", + "@settingsRemoveAnimationsTile": {}, "settingsRemoveAnimationsDialogTitle": "Hapus Animasi", + "@settingsRemoveAnimationsDialogTitle": {}, "settingsTimeToTakeActionTile": "Waktu untuk mengambil tindakan", - + "@settingsTimeToTakeActionTile": {}, "settingsDisplaySectionTitle": "Tampilan", + "@settingsDisplaySectionTitle": {}, "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, "settingsThemeColorHighlights": "Highlight warna", + "@settingsThemeColorHighlights": {}, "settingsThemeEnableDynamicColor": "Warna dinamis", + "@settingsThemeEnableDynamicColor": {}, "settingsDisplayRefreshRateModeTile": "Tingkat penyegaran tampilan", + "@settingsDisplayRefreshRateModeTile": {}, "settingsDisplayRefreshRateModeDialogTitle": "Tingkat Penyegaran", - + "@settingsDisplayRefreshRateModeDialogTitle": {}, "settingsLanguageSectionTitle": "Bahasa & Format", + "@settingsLanguageSectionTitle": {}, "settingsLanguageTile": "Bahasa", + "@settingsLanguageTile": {}, "settingsLanguagePageTitle": "Bahasa", + "@settingsLanguagePageTitle": {}, "settingsCoordinateFormatTile": "Format koordinat", + "@settingsCoordinateFormatTile": {}, "settingsCoordinateFormatDialogTitle": "Format Koordinat", + "@settingsCoordinateFormatDialogTitle": {}, "settingsUnitSystemTile": "Unit", + "@settingsUnitSystemTile": {}, "settingsUnitSystemDialogTitle": "Unit", - + "@settingsUnitSystemDialogTitle": {}, "settingsScreenSaverPageTitle": "Screensaver", - + "@settingsScreenSaverPageTitle": {}, "settingsWidgetPageTitle": "Bingkai Foto", + "@settingsWidgetPageTitle": {}, "settingsWidgetShowOutline": "Garis luar", - + "@settingsWidgetShowOutline": {}, "settingsCollectionTile": "Koleksi", - + "@settingsCollectionTile": {}, "statsPageTitle": "Statistik", + "@statsPageTitle": {}, "statsWithGps": "{count, plural, other{{count} benda dengan lokasi}}", + "@statsWithGps": {}, "statsTopCountriesSectionTitle": "Negara Teratas", + "@statsTopCountriesSectionTitle": {}, "statsTopPlacesSectionTitle": "Tempat Teratas", + "@statsTopPlacesSectionTitle": {}, "statsTopTagsSectionTitle": "Label Teratas", - + "@statsTopTagsSectionTitle": {}, "viewerOpenPanoramaButtonLabel": "BUKA PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, "viewerSetWallpaperButtonLabel": "TETAPKAN SEBAGAI WALLPAPER", + "@viewerSetWallpaperButtonLabel": {}, "viewerErrorUnknown": "Ups!", + "@viewerErrorUnknown": {}, "viewerErrorDoesNotExist": "File tidak ada lagi.", - + "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "Info", + "@viewerInfoPageTitle": {}, "viewerInfoBackToViewerTooltip": "Kembali ke penonton", - + "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "tidak dikenal", + "@viewerInfoUnknown": {}, "viewerInfoLabelDescription": "Deskripsi", + "@viewerInfoLabelDescription": {}, "viewerInfoLabelTitle": "Judul", + "@viewerInfoLabelTitle": {}, "viewerInfoLabelDate": "Tanggal", + "@viewerInfoLabelDate": {}, "viewerInfoLabelResolution": "Resolusi", + "@viewerInfoLabelResolution": {}, "viewerInfoLabelSize": "Ukuran", + "@viewerInfoLabelSize": {}, "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, "viewerInfoLabelPath": "Jalan", + "@viewerInfoLabelPath": {}, "viewerInfoLabelDuration": "Durasi", + "@viewerInfoLabelDuration": {}, "viewerInfoLabelOwner": "Dimiliki oleh", + "@viewerInfoLabelOwner": {}, "viewerInfoLabelCoordinates": "Koordinat", + "@viewerInfoLabelCoordinates": {}, "viewerInfoLabelAddress": "Alamat", - + "@viewerInfoLabelAddress": {}, "mapStyleDialogTitle": "Gaya Peta", + "@mapStyleDialogTitle": {}, "mapStyleTooltip": "Pilih gaya peta", + "@mapStyleTooltip": {}, "mapZoomInTooltip": "Perbesar", + "@mapZoomInTooltip": {}, "mapZoomOutTooltip": "Perkecil", + "@mapZoomOutTooltip": {}, "mapPointNorthUpTooltip": "Arahkan ke utara ke atas", + "@mapPointNorthUpTooltip": {}, "mapAttributionOsmHot": "Data peta © [OpenStreetMap](https://www.openstreetmap.org/copyright) kontributor • Tile oleh [HOT](https://www.hotosm.org/) • Diselenggarakan oleh [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, "mapAttributionStamen": "Data peta © [OpenStreetMap](https://www.openstreetmap.org/copyright) kontributor • Tile oleh [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, "openMapPageTooltip": "Lihat di halaman Peta", + "@openMapPageTooltip": {}, "mapEmptyRegion": "Tidak ada gambar di wilayah ini", - + "@mapEmptyRegion": {}, "viewerInfoOpenEmbeddedFailureFeedback": "Gagal mengekstrak data yang disematkan", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, "viewerInfoOpenLinkText": "Buka", + "@viewerInfoOpenLinkText": {}, "viewerInfoViewXmlLinkText": "Tampilkan XML", - + "@viewerInfoViewXmlLinkText": {}, "viewerInfoSearchFieldLabel": "Cari metadata", + "@viewerInfoSearchFieldLabel": {}, "viewerInfoSearchEmpty": "Tidak ada kata kunci yang cocok", + "@viewerInfoSearchEmpty": {}, "viewerInfoSearchSuggestionDate": "Tanggal & waktu", + "@viewerInfoSearchSuggestionDate": {}, "viewerInfoSearchSuggestionDescription": "Deskripsi", + "@viewerInfoSearchSuggestionDescription": {}, "viewerInfoSearchSuggestionDimensions": "Dimensi", + "@viewerInfoSearchSuggestionDimensions": {}, "viewerInfoSearchSuggestionResolution": "Resolusi", + "@viewerInfoSearchSuggestionResolution": {}, "viewerInfoSearchSuggestionRights": "Hak", - + "@viewerInfoSearchSuggestionRights": {}, "tagEditorPageTitle": "Ubah Label", + "@tagEditorPageTitle": {}, "tagEditorPageNewTagFieldLabel": "Label baru", + "@tagEditorPageNewTagFieldLabel": {}, "tagEditorPageAddTagTooltip": "Tambah label", + "@tagEditorPageAddTagTooltip": {}, "tagEditorSectionRecent": "Terkini", - + "@tagEditorSectionRecent": {}, "panoramaEnableSensorControl": "Aktifkan kontrol sensor", + "@panoramaEnableSensorControl": {}, "panoramaDisableSensorControl": "Nonaktifkan kontrol sensor", - + "@panoramaDisableSensorControl": {}, "sourceViewerPageTitle": "Sumber", - + "@sourceViewerPageTitle": {}, "filePickerShowHiddenFiles": "Tampilkan file tersembunyi", + "@filePickerShowHiddenFiles": {}, "filePickerDoNotShowHiddenFiles": "Jangan tampilkan file tersembunyi", + "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "Buka dari", + "@filePickerOpenFrom": {}, "filePickerNoItems": "Tidak ada benda", - "filePickerUseThisFolder": "Gunakan folder ini" + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "Gunakan folder ini", + "@filePickerUseThisFolder": {} } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index aba29bda9..05c844e62 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -51,7 +51,7 @@ "@saveTooltip": {}, "pickTooltip": "Seleziona", "@pickTooltip": {}, - "doubleBackExitMessage": "Tocca di nuovo «indietro» per uscire", + "doubleBackExitMessage": "Tocca di nuovo «indietro» per uscire.", "@doubleBackExitMessage": {}, "doNotAskAgain": "Non chiedere di nuovo", "@doNotAskAgain": {}, @@ -323,25 +323,25 @@ "@rootDirectoryDescription": {}, "otherDirectoryDescription": "cartella «{name}»", "@otherDirectoryDescription": {}, - "storageAccessDialogMessage": "Si prega di selezionare la {directory} di «{volume}» nella prossima schermata per dare accesso a questa applicazione", + "storageAccessDialogMessage": "Si prega di selezionare la {directory} di «{volume}» nella prossima schermata per dare accesso a questa applicazione.", "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "Questa applicazione non è autorizzata a modificare i file nella {directory} di «{volume}»", "@restrictedAccessDialogMessage": {}, "notEnoughSpaceDialogMessage": "Questa operazione ha bisogno di {neededSize} di spazio libero su «{volume}» per essere completata, ma è rimasto solo {freeSize}.", "@notEnoughSpaceDialogMessage": {}, - "missingSystemFilePickerDialogMessage": "Il selezionatore file di sistema è mancante o disabilitato. Per favore abilitalo e riprova", + "missingSystemFilePickerDialogMessage": "Il selezionatore file di sistema è mancante o disabilitato. Per favore abilitalo e riprova.", "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, =1{Questa operazione non è supportata per elementi del seguente tipo: {types}.} other{Questa operazione non è supportata per elementi dei seguenti tipi: {types}.}}", "@unsupportedTypeDialogMessage": {}, - "nameConflictDialogSingleSourceMessage": "Alcuni file nella cartella di destinazione hanno lo stesso nome", + "nameConflictDialogSingleSourceMessage": "Alcuni file nella cartella di destinazione hanno lo stesso nome.", "@nameConflictDialogSingleSourceMessage": {}, - "nameConflictDialogMultipleSourceMessage": "Alcuni file hanno lo stesso nome", + "nameConflictDialogMultipleSourceMessage": "Alcuni file hanno lo stesso nome.", "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "Etichetta della scorciatoia", "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "AGGIUNGI", "@addShortcutButtonLabel": {}, - "noMatchingAppDialogMessage": "Non ci sono app che possono gestire questo", + "noMatchingAppDialogMessage": "Non ci sono app che possono gestire questo.", "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{Spostare questo elemento nel cestino?} other{Spostare questi {count} elementi nel cestino?}}", "@binEntriesConfirmationDialogMessage": {}, @@ -453,7 +453,7 @@ "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "Traccia", "@videoStreamSelectionDialogTrack": {}, - "videoStreamSelectionDialogNoSelection": "Non ci sono altre tracce", + "videoStreamSelectionDialogNoSelection": "Non ci sono altre tracce.", "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "Fatto!", "@genericSuccessFeedback": {}, @@ -519,13 +519,13 @@ "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "Questa applicazione utilizza un file TopoJSON di", "@aboutCreditsWorldAtlas1": {}, - "aboutCreditsWorldAtlas2": "sotto licenza ISC", + "aboutCreditsWorldAtlas2": "sotto licenza ISC.", "@aboutCreditsWorldAtlas2": {}, "aboutTranslatorsSectionTitle": "Traduttori", "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "Licenze Open-Source", "@aboutLicensesSectionTitle": {}, - "aboutLicensesBanner": "Questa applicazione utilizza i seguenti pacchetti e librerie open-source", + "aboutLicensesBanner": "Questa applicazione utilizza i seguenti pacchetti e librerie open-source.", "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "Librerie Android", "@aboutLicensesAndroidLibrariesSectionTitle": {}, @@ -789,7 +789,7 @@ "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "Menu di navigazione", "@settingsNavigationDrawerEditorPageTitle": {}, - "settingsNavigationDrawerBanner": "Tocca e tieni premuto per spostare e riordinare gli elementi del menu", + "settingsNavigationDrawerBanner": "Tocca e tieni premuto per spostare e riordinare gli elementi del menu.", "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "Tipi", "@settingsNavigationDrawerTabTypes": {}, @@ -827,9 +827,9 @@ "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "Selezione", "@settingsCollectionQuickActionTabSelecting": {}, - "settingsCollectionBrowsingQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate durante la navigazione degli elementi", + "settingsCollectionBrowsingQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate durante la navigazione degli elementi.", "@settingsCollectionBrowsingQuickActionEditorBanner": {}, - "settingsCollectionSelectionQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate quando si selezionano gli elementi", + "settingsCollectionSelectionQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono visualizzate quando si selezionano gli elementi.", "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "Visualizzazione", "@settingsViewerSectionTitle": {}, @@ -847,7 +847,7 @@ "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "Azioni rapide", "@settingsViewerQuickActionEditorPageTitle": {}, - "settingsViewerQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono mostrate durante la visualizione", + "settingsViewerQuickActionEditorBanner": "Tocca e tieni premuto per spostare i pulsanti e selezionare quali azioni vengono mostrate durante la visualizione.", "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Pulsanti visualizzati", "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, @@ -911,7 +911,7 @@ "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "Sottotitoli", "@settingsSubtitleThemePageTitle": {}, - "settingsSubtitleThemeSample": "Questo è un campione", + "settingsSubtitleThemeSample": "Questo è un campione.", "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "Allineamento del testo", "@settingsSubtitleThemeTextAlignmentTile": {}, @@ -965,13 +965,13 @@ "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "Filtri nascosti", "@settingsHiddenItemsTabFilters": {}, - "settingsHiddenFiltersBanner": "Le foto e i video che corrispondono ai filtri nascosti non appariranno nella tua collezione", + "settingsHiddenFiltersBanner": "Le foto e i video che corrispondono ai filtri nascosti non appariranno nella tua collezione.", "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "Nessun filtro nascosto", "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "Percorsi nascosti", "@settingsHiddenItemsTabPaths": {}, - "settingsHiddenPathsBanner": "Le foto e i video in queste cartelle, o in qualsiasi loro sottocartella, non appariranno nella tua collezione", + "settingsHiddenPathsBanner": "Le foto e i video in queste cartelle, o in qualsiasi loro sottocartella, non appariranno nella tua collezione.", "@settingsHiddenPathsBanner": {}, "addPathTooltip": "Aggiungi percorso", "@addPathTooltip": {}, @@ -979,7 +979,7 @@ "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "Accesso a tutti i file", "@settingsStorageAccessPageTitle": {}, - "settingsStorageAccessBanner": "Alcune cartelle richiedono una concessione di accesso esplicita per modificare i file al loro interno. Puoi rivedere qui le cartelle a cui hai dato accesso in precedenza", + "settingsStorageAccessBanner": "Alcune cartelle richiedono una concessione di accesso esplicita per modificare i file al loro interno. Puoi rivedere qui le cartelle a cui hai dato accesso in precedenza.", "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "Nessuna autorizzazione concessa", "@settingsStorageAccessEmpty": {}, @@ -1049,7 +1049,7 @@ "@viewerSetWallpaperButtonLabel": {}, "viewerErrorUnknown": "Ops!", "@viewerErrorUnknown": {}, - "viewerErrorDoesNotExist": "Il file non esiste più", + "viewerErrorDoesNotExist": "Il file non esiste più.", "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "Info", "@viewerInfoPageTitle": {}, diff --git a/lib/l10n/app_nb_NO.arb b/lib/l10n/app_nb_NO.arb new file mode 100644 index 000000000..84f809a56 --- /dev/null +++ b/lib/l10n/app_nb_NO.arb @@ -0,0 +1,989 @@ +{ + "welcomeOptional": "Valgfritt", + "@welcomeOptional": {}, + "deleteButtonLabel": "Slett", + "@deleteButtonLabel": {}, + "focalLength": "{length} mm", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "changeTooltip": "Endre", + "@changeTooltip": {}, + "clearTooltip": "Tøm", + "@clearTooltip": {}, + "previousTooltip": "Forrige", + "@previousTooltip": {}, + "nextTooltip": "Neste", + "@nextTooltip": {}, + "doNotAskAgain": "Ikke spør igjen", + "@doNotAskAgain": {}, + "chipActionGoToAlbumPage": "Vis i album", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Vis i land", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Vis i etiketter", + "@chipActionGoToTagPage": {}, + "doubleBackExitMessage": "Trykk «Tilbake» igjen for å avslutte.", + "@doubleBackExitMessage": {}, + "chipActionUnpin": "Løsne fra toppen", + "@chipActionUnpin": {}, + "chipActionRename": "Gi nytt navn", + "@chipActionRename": {}, + "chipActionFilterOut": "Ekskluder", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Inkluder", + "@chipActionFilterIn": {}, + "entryActionCopyToClipboard": "Kopier til utklippstavle", + "@entryActionCopyToClipboard": {}, + "entryActionRename": "Gi nytt navn", + "@entryActionRename": {}, + "entryActionOpen": "Åpne med", + "@entryActionOpen": {}, + "entryActionSetAs": "Sett som", + "@entryActionSetAs": {}, + "entryActionRotateCCW": "Roter mot klokken", + "@entryActionRotateCCW": {}, + "entryActionRotateCW": "Roter med klokken", + "@entryActionRotateCW": {}, + "entryActionShare": "Del", + "@entryActionShare": {}, + "entryActionViewSource": "Vis kilde", + "@entryActionViewSource": {}, + "entryActionShowGeoTiffOnMap": "Vis som overlagskart", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Konverter til stillbilde", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Åpne video", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Rediger", + "@entryActionEdit": {}, + "entryActionAddFavourite": "Legg til i favoritter", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Fjern fra favoritter", + "@entryActionRemoveFavourite": {}, + "videoActionMute": "Forstum", + "@videoActionMute": {}, + "videoActionUnmute": "Opphev forstummelse", + "@videoActionUnmute": {}, + "videoActionReplay10": "Blafre bakover 10 sekunder", + "@videoActionReplay10": {}, + "videoActionSkip10": "Blafre forover 10 sekunder", + "@videoActionSkip10": {}, + "videoActionSetSpeed": "Avspillingshastighet", + "@videoActionSetSpeed": {}, + "videoActionSettings": "Innstillinger", + "@videoActionSettings": {}, + "entryInfoActionEditTitleDescription": "Rediger navn og beskrivelse", + "@entryInfoActionEditTitleDescription": {}, + "filterNoDateLabel": "Udatert", + "@filterNoDateLabel": {}, + "filterNoLocationLabel": "Uten posisjon", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Uvurdert", + "@filterNoRatingLabel": {}, + "filterTypeRawLabel": "Rådata", + "@filterTypeRawLabel": {}, + "filterNoTagLabel": "Uten etiketter", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Uten navn", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "På denne dagen", + "@filterOnThisDayLabel": {}, + "filterRatingRejectedLabel": "Avslått", + "@filterRatingRejectedLabel": {}, + "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, + "mapStyleGoogleHybrid": "Google Maps Hybrid (fiendekartet)", + "@mapStyleGoogleHybrid": {}, + "mapStyleGoogleTerrain": "Google Maps Terreng (fiendekartet)", + "@mapStyleGoogleTerrain": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "mapStyleOsmHot": "Humanitært OSM", + "@mapStyleOsmHot": {}, + "accessibilityAnimationsRemove": "Forhindre skjermeffekter", + "@accessibilityAnimationsRemove": {}, + "accessibilityAnimationsKeep": "Behold skjermeffekter", + "@accessibilityAnimationsKeep": {}, + "themeBrightnessDark": "Mørk", + "@themeBrightnessDark": {}, + "themeBrightnessLight": "Lys", + "@themeBrightnessLight": {}, + "viewerTransitionZoomIn": "Forstørr", + "@viewerTransitionZoomIn": {}, + "storageVolumeDescriptionFallbackPrimary": "Internlagring", + "@storageVolumeDescriptionFallbackPrimary": {}, + "storageVolumeDescriptionFallbackNonPrimary": "SD-kort", + "@storageVolumeDescriptionFallbackNonPrimary": {}, + "rootDirectoryDescription": "rotmappe", + "@rootDirectoryDescription": {}, + "widgetOpenPageCollection": "Åpne samling", + "@widgetOpenPageCollection": {}, + "nameConflictDialogMultipleSourceMessage": "Noen filer har samme navn.", + "@nameConflictDialogMultipleSourceMessage": {}, + "moveUndatedConfirmationDialogSetDate": "Lagre datoer", + "@moveUndatedConfirmationDialogSetDate": {}, + "videoResumeButtonLabel": "Fortsett", + "@videoResumeButtonLabel": {}, + "renameEntrySetPageTitle": "Gi nytt navn", + "@renameEntrySetPageTitle": {}, + "exportEntryDialogFormat": "Format:", + "@exportEntryDialogFormat": {}, + "editEntryDateDialogTitle": "Dato og tid", + "@editEntryDateDialogTitle": {}, + "editEntryDateDialogSetCustom": "Sett egendefinert dato", + "@editEntryDateDialogSetCustom": {}, + "editEntryDateDialogCopyField": "Kopier fra annen dato", + "@editEntryDateDialogCopyField": {}, + "editEntryLocationDialogLatitude": "Breddegrad", + "@editEntryLocationDialogLatitude": {}, + "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, + "videoStreamSelectionDialogAudio": "Lyd", + "@videoStreamSelectionDialogAudio": {}, + "videoStreamSelectionDialogOff": "Av", + "@videoStreamSelectionDialogOff": {}, + "genericSuccessFeedback": "Ferdig", + "@genericSuccessFeedback": {}, + "genericFailureFeedback": "Mislykket", + "@genericFailureFeedback": {}, + "menuActionSelect": "Velg", + "@menuActionSelect": {}, + "menuActionSlideshow": "Lysbildevisning", + "@menuActionSlideshow": {}, + "menuActionStats": "Statistikk", + "@menuActionStats": {}, + "appPickDialogNone": "Ingen", + "@appPickDialogNone": {}, + "aboutPageTitle": "Om", + "@aboutPageTitle": {}, + "aboutLinkLicense": "Lisens", + "@aboutLinkLicense": {}, + "aboutLinkPolicy": "Personvernspraksis", + "@aboutLinkPolicy": {}, + "aboutCreditsWorldAtlas2": "under ISC-lisens.", + "@aboutCreditsWorldAtlas2": {}, + "aboutTranslatorsSectionTitle": "Oversettere", + "@aboutTranslatorsSectionTitle": {}, + "aboutLicensesSectionTitle": "Frie lisenser", + "@aboutLicensesSectionTitle": {}, + "policyPageTitle": "Personvernspraksis", + "@policyPageTitle": {}, + "aboutLicensesFlutterPackagesSectionTitle": "Flutter-pakker", + "@aboutLicensesFlutterPackagesSectionTitle": {}, + "aboutLicensesDartPackagesSectionTitle": "Dart-pakker", + "@aboutLicensesDartPackagesSectionTitle": {}, + "collectionActionShowTitleSearch": "Vis navnefilter", + "@collectionActionShowTitleSearch": {}, + "collectionActionHideTitleSearch": "Skjul navnefilter", + "@collectionActionHideTitleSearch": {}, + "collectionSearchTitlesHintText": "Søk etter navn", + "@collectionSearchTitlesHintText": {}, + "collectionGroupMonth": "Etter måned", + "@collectionGroupMonth": {}, + "collectionEmptyImages": "Ingen bilder", + "@collectionEmptyImages": {}, + "drawerAboutButton": "Om", + "@drawerAboutButton": {}, + "drawerSettingsButton": "Innstillinger", + "@drawerSettingsButton": {}, + "drawerCollectionFavourites": "Favoritter", + "@drawerCollectionFavourites": {}, + "drawerCollectionAll": "Alle samlinger", + "@drawerCollectionAll": {}, + "sortOrderAtoZ": "A-Å", + "@sortOrderAtoZ": {}, + "sortOrderZtoA": "Å-A", + "@sortOrderZtoA": {}, + "newFilterBanner": "ny", + "@newFilterBanner": {}, + "settingsNavigationSectionTitle": "Navigasjon", + "@settingsNavigationSectionTitle": {}, + "settingsHomeTile": "Hjem", + "@settingsHomeTile": {}, + "settingsHomeDialogTitle": "Hjem", + "@settingsHomeDialogTitle": {}, + "settingsDisabled": "Avskrudd", + "@settingsDisabled": {}, + "settingsSearchFieldLabel": "Søkeinnstillinger", + "@settingsSearchFieldLabel": {}, + "settingsSearchEmpty": "Ingen samsvarende innstilling", + "@settingsSearchEmpty": {}, + "settingsShowBottomNavigationBar": "Vis navigasjonsfelt på bunnen", + "@settingsShowBottomNavigationBar": {}, + "settingsKeepScreenOnTile": "Behold skjermen påslått", + "@settingsKeepScreenOnTile": {}, + "settingsKeepScreenOnDialogTitle": "Behold skjermen påslått", + "@settingsKeepScreenOnDialogTitle": {}, + "settingsDoubleBackExit": "Trykk «Tilbake» to ganger for å avslutte", + "@settingsDoubleBackExit": {}, + "settingsNavigationDrawerTile": "Navigasjonsmeny", + "@settingsNavigationDrawerTile": {}, + "settingsNavigationDrawerEditorPageTitle": "Navigasjonsmeny", + "@settingsNavigationDrawerEditorPageTitle": {}, + "settingsNavigationDrawerTabAlbums": "Album", + "@settingsNavigationDrawerTabAlbums": {}, + "settingsNavigationDrawerTabPages": "Sider", + "@settingsNavigationDrawerTabPages": {}, + "settingsViewerQuickActionEditorPageTitle": "Hurtighandlinger", + "@settingsViewerQuickActionEditorPageTitle": {}, + "settingsViewerShowInformationSubtitle": "Vis navn, dato, posisjon, osv.", + "@settingsViewerShowInformationSubtitle": {}, + "settingsViewerSlideshowPageTitle": "Lysbildevisning", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowAnimatedZoomEffect": "Animert forstørrelseseffekt", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsSlideshowTransitionTile": "Overgang", + "@settingsSlideshowTransitionTile": {}, + "settingsSlideshowVideoPlaybackTile": "Videoavspilling", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsVideoPageTitle": "Videoinnstillinger", + "@settingsVideoPageTitle": {}, + "settingsVideoSectionTitle": "Video", + "@settingsVideoSectionTitle": {}, + "settingsVideoEnableHardwareAcceleration": "Maskinvareakselerasjon", + "@settingsVideoEnableHardwareAcceleration": {}, + "settingsVideoLoopModeTile": "Gjentagelsesmodus", + "@settingsVideoLoopModeTile": {}, + "settingsVideoLoopModeDialogTitle": "Gjentagelsesmodus", + "@settingsVideoLoopModeDialogTitle": {}, + "settingsSubtitleThemeTextAlignmentDialogTitle": "Tekstjustering", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, + "settingsSubtitleThemeTextColor": "Tekstfarge", + "@settingsSubtitleThemeTextColor": {}, + "settingsSubtitleThemeTextOpacity": "Tekst-dekkevne", + "@settingsSubtitleThemeTextOpacity": {}, + "settingsSubtitleThemeBackgroundColor": "Bakgrunnsfarge", + "@settingsSubtitleThemeBackgroundColor": {}, + "settingsSubtitleThemeBackgroundOpacity": "Bakgrunnsdekkevne", + "@settingsSubtitleThemeBackgroundOpacity": {}, + "settingsSubtitleThemeTextAlignmentRight": "Høyre", + "@settingsSubtitleThemeTextAlignmentRight": {}, + "settingsVideoControlsTile": "Kontroller", + "@settingsVideoControlsTile": {}, + "settingsVideoGestureDoubleTapTogglePlay": "Dobbelttrykk for å spille/pause", + "@settingsVideoGestureDoubleTapTogglePlay": {}, + "settingsPrivacySectionTitle": "Personvern", + "@settingsPrivacySectionTitle": {}, + "settingsEnableBin": "Bruk papirkurv", + "@settingsEnableBin": {}, + "settingsHiddenItemsTile": "Skjulte elementer", + "@settingsHiddenItemsTile": {}, + "settingsHiddenItemsPageTitle": "Skjulte elementer", + "@settingsHiddenItemsPageTitle": {}, + "settingsRemoveAnimationsTile": "Fjern animasjoner", + "@settingsRemoveAnimationsTile": {}, + "settingsDisplaySectionTitle": "Visning", + "@settingsDisplaySectionTitle": {}, + "settingsThemeBrightnessTile": "Drakt", + "@settingsThemeBrightnessTile": {}, + "settingsCoordinateFormatDialogTitle": "Koordinatformat", + "@settingsCoordinateFormatDialogTitle": {}, + "settingsUnitSystemTile": "Enheter", + "@settingsUnitSystemTile": {}, + "settingsScreenSaverPageTitle": "Skjermsparer", + "@settingsScreenSaverPageTitle": {}, + "statsTopCountriesSectionTitle": "Toppland", + "@statsTopCountriesSectionTitle": {}, + "statsTopPlacesSectionTitle": "Toppsteder", + "@statsTopPlacesSectionTitle": {}, + "statsTopTagsSectionTitle": "Topp-etiketter", + "@statsTopTagsSectionTitle": {}, + "statsTopAlbumsSectionTitle": "Topp-album", + "@statsTopAlbumsSectionTitle": {}, + "viewerInfoLabelDescription": "Beskrivelse", + "@viewerInfoLabelDescription": {}, + "viewerInfoLabelTitle": "Navn", + "@viewerInfoLabelTitle": {}, + "viewerInfoLabelResolution": "Oppløsning", + "@viewerInfoLabelResolution": {}, + "viewerInfoLabelSize": "Størrelse", + "@viewerInfoLabelSize": {}, + "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, + "viewerInfoLabelPath": "Sti", + "@viewerInfoLabelPath": {}, + "viewerInfoLabelDuration": "Varighet", + "@viewerInfoLabelDuration": {}, + "viewerInfoLabelOwner": "Eier", + "@viewerInfoLabelOwner": {}, + "viewerInfoLabelCoordinates": "Koordinater", + "@viewerInfoLabelCoordinates": {}, + "viewerInfoLabelAddress": "Adresse", + "@viewerInfoLabelAddress": {}, + "openMapPageTooltip": "Vis på kartsiden", + "@openMapPageTooltip": {}, + "viewerInfoOpenLinkText": "Åpne", + "@viewerInfoOpenLinkText": {}, + "viewerInfoViewXmlLinkText": "Vis XML", + "@viewerInfoViewXmlLinkText": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Velkommen", + "@welcomeMessage": {}, + "welcomeTermsToggle": "Jeg samtykker til vilkår og betingelser", + "@welcomeTermsToggle": {}, + "filterRecentlyAddedLabel": "Nylig tillagt", + "@filterRecentlyAddedLabel": {}, + "filterTypeAnimatedLabel": "Animert", + "@filterTypeAnimatedLabel": {}, + "nextButtonLabel": "Neste", + "@nextButtonLabel": {}, + "continueButtonLabel": "Fortsett", + "@continueButtonLabel": {}, + "sourceStateLoading": "Laster inn …", + "@sourceStateLoading": {}, + "chipActionCreateAlbum": "Opprett album", + "@chipActionCreateAlbum": {}, + "collectionGroupAlbum": "Etter album", + "@collectionGroupAlbum": {}, + "showButtonLabel": "Vis", + "@showButtonLabel": {}, + "hideButtonLabel": "Skjul", + "@hideButtonLabel": {}, + "cancelTooltip": "Avbryt", + "@cancelTooltip": {}, + "showTooltip": "Vis", + "@showTooltip": {}, + "actionRemove": "Fjern", + "@actionRemove": {}, + "pickTooltip": "Velg", + "@pickTooltip": {}, + "chipActionSetCover": "Sett omslag", + "@chipActionSetCover": {}, + "hideTooltip": "Skjul", + "@hideTooltip": {}, + "saveTooltip": "Lagre", + "@saveTooltip": {}, + "resetTooltip": "Tilbakestill", + "@resetTooltip": {}, + "chipActionDelete": "Slett", + "@chipActionDelete": {}, + "entryActionRotateScreen": "Roter skjerm", + "@entryActionRotateScreen": {}, + "videoActionPlay": "Spill", + "@videoActionPlay": {}, + "entryInfoActionEditTags": "Rediger etiketter", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Fjern metadata", + "@entryInfoActionRemoveMetadata": {}, + "chipActionHide": "Skjul", + "@chipActionHide": {}, + "chipActionPin": "Fest til toppen", + "@chipActionPin": {}, + "entryActionDelete": "Slett", + "@entryActionDelete": {}, + "entryActionExport": "Eksporter", + "@entryActionExport": {}, + "videoActionPause": "Pause", + "@videoActionPause": {}, + "entryActionConvert": "Konverter", + "@entryActionConvert": {}, + "entryActionOpenMap": "Vis i kartprogram", + "@entryActionOpenMap": {}, + "entryActionInfo": "Info", + "@entryActionInfo": {}, + "entryActionRestore": "Gjenopprett", + "@entryActionRestore": {}, + "aboutBugSaveLogInstruction": "Lagre programlogger til fil", + "@aboutBugSaveLogInstruction": {}, + "aboutBugCopyInfoButton": "Kopier", + "@aboutBugCopyInfoButton": {}, + "slideshowActionShowInCollection": "Vis i samling", + "@slideshowActionShowInCollection": {}, + "sortOrderLargestFirst": "Største først", + "@sortOrderLargestFirst": {}, + "entryInfoActionEditDate": "Rediger dato og tid", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditRating": "Rediger vurdering", + "@entryInfoActionEditRating": {}, + "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, + "filterTypeMotionPhotoLabel": "Bevegelig bilde", + "@filterTypeMotionPhotoLabel": {}, + "filterMimeImageLabel": "Bilde", + "@filterMimeImageLabel": {}, + "filterMimeVideoLabel": "Video", + "@filterMimeVideoLabel": {}, + "coordinateDmsWest": "V", + "@coordinateDmsWest": {}, + "filterTypeSphericalVideoLabel": "360°-video", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, + "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, + "coordinateFormatDecimal": "Desimalgrader", + "@coordinateFormatDecimal": {}, + "coordinateDmsEast": "Ø", + "@coordinateDmsEast": {}, + "videoLoopModeNever": "Aldri", + "@videoLoopModeNever": {}, + "videoLoopModeAlways": "Alltid", + "@videoLoopModeAlways": {}, + "keepScreenOnNever": "Aldri", + "@keepScreenOnNever": {}, + "albumTierRegular": "Andre", + "@albumTierRegular": {}, + "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, + "renameEntrySetPagePatternFieldLabel": "Navngivningsmønster", + "@renameEntrySetPagePatternFieldLabel": {}, + "unitSystemMetric": "Metrisk", + "@unitSystemMetric": {}, + "unitSystemImperial": "Engelske måleenheter", + "@unitSystemImperial": {}, + "keepScreenOnAlways": "Alltid", + "@keepScreenOnAlways": {}, + "wallpaperTargetLock": "Lås skjerm", + "@wallpaperTargetLock": {}, + "albumTierApps": "Programmer", + "@albumTierApps": {}, + "videoLoopModeShortOnly": "Kun korte videoer", + "@videoLoopModeShortOnly": {}, + "videoControlsPlay": "Spill", + "@videoControlsPlay": {}, + "videoControlsPlaySeek": "Spill og blafre forover/bakover", + "@videoControlsPlaySeek": {}, + "videoControlsPlayOutside": "Åpne med annen avspiller", + "@videoControlsPlayOutside": {}, + "videoControlsNone": "Ingen", + "@videoControlsNone": {}, + "mapStyleGoogleNormal": "Google Maps (fiendekartet)", + "@mapStyleGoogleNormal": {}, + "videoPlaybackSkip": "Hopp over", + "@videoPlaybackSkip": {}, + "newAlbumDialogNameLabelAlreadyExistsHelper": "Mappen finnes allerede", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, + "filePickerShowHiddenFiles": "Vis skjulte filer", + "@filePickerShowHiddenFiles": {}, + "themeBrightnessBlack": "Svart", + "@themeBrightnessBlack": {}, + "albumTierNew": "Ny", + "@albumTierNew": {}, + "albumTierPinned": "Festet", + "@albumTierPinned": {}, + "renameEntrySetPagePreviewSectionTitle": "Forhåndsvis", + "@renameEntrySetPagePreviewSectionTitle": {}, + "renameProcessorCounter": "Teller", + "@renameProcessorCounter": {}, + "viewerTransitionNone": "Ingen", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Hjemmeskjerm", + "@wallpaperTargetHome": {}, + "wallpaperTargetHomeLock": "Hjem- og låseskjermer", + "@wallpaperTargetHomeLock": {}, + "otherDirectoryDescription": "«{name}»-mappen", + "@otherDirectoryDescription": { + "placeholders": { + "name": { + "type": "String", + "example": "Pictures", + "description": "the name of a specific directory" + } + } + }, + "addShortcutDialogLabel": "Snarveisetikett", + "@addShortcutDialogLabel": {}, + "setCoverDialogCustom": "Egendefinert", + "@setCoverDialogCustom": {}, + "newAlbumDialogTitle": "Nytt album", + "@newAlbumDialogTitle": {}, + "addShortcutButtonLabel": "Legg til", + "@addShortcutButtonLabel": {}, + "newAlbumDialogNameLabel": "Albumsnavn", + "@newAlbumDialogNameLabel": {}, + "newAlbumDialogStorageLabel": "Lagring:", + "@newAlbumDialogStorageLabel": {}, + "durationDialogSeconds": "Sekunder", + "@durationDialogSeconds": {}, + "removeEntryMetadataDialogMore": "Mer", + "@removeEntryMetadataDialogMore": {}, + "menuActionSelectAll": "Velg alle", + "@menuActionSelectAll": {}, + "appPickDialogTitle": "Velg program", + "@appPickDialogTitle": {}, + "renameEntrySetPageInsertTooltip": "Sett inn felt", + "@renameEntrySetPageInsertTooltip": {}, + "exportEntryDialogWidth": "Bredde", + "@exportEntryDialogWidth": {}, + "renameEntryDialogLabel": "Nytt navn", + "@renameEntryDialogLabel": {}, + "collectionActionMove": "Flytt til album", + "@collectionActionMove": {}, + "renameAlbumDialogLabel": "Nytt navn", + "@renameAlbumDialogLabel": {}, + "renameAlbumDialogLabelAlreadyExistsHelper": "Mappen finnes allerede", + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, + "renameProcessorName": "Navn", + "@renameProcessorName": {}, + "editEntryLocationDialogLongitude": "Lengdegrad", + "@editEntryLocationDialogLongitude": {}, + "exportEntryDialogHeight": "Høyde", + "@exportEntryDialogHeight": {}, + "collectionActionRescan": "Skann igjen", + "@collectionActionRescan": {}, + "sortOrderSmallestFirst": "Minste først", + "@sortOrderSmallestFirst": {}, + "albumGroupNone": "Ikke grupper", + "@albumGroupNone": {}, + "editEntryDialogTargetFieldsHeader": "Felter å endre", + "@editEntryDialogTargetFieldsHeader": {}, + "editEntryDateDialogCopyItem": "Kopier fra annet element", + "@editEntryDateDialogCopyItem": {}, + "durationDialogMinutes": "Minutter", + "@durationDialogMinutes": {}, + "editEntryLocationDialogChooseOnMapTooltip": "Velg på kartet", + "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryRatingDialogTitle": "Vurdering", + "@editEntryRatingDialogTitle": {}, + "removeEntryMetadataDialogTitle": "Metadatafjerning", + "@removeEntryMetadataDialogTitle": {}, + "convertMotionPhotoToStillImageWarningDialogMessage": "Er du sikker?", + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, + "videoSpeedDialogLabel": "Avspillingshastighet", + "@videoSpeedDialogLabel": {}, + "menuActionConfigureView": "Vis", + "@menuActionConfigureView": {}, + "menuActionMap": "Kart", + "@menuActionMap": {}, + "viewDialogGroupSectionTitle": "Gruppe", + "@viewDialogGroupSectionTitle": {}, + "tileLayoutList": "Liste", + "@tileLayoutList": {}, + "collectionPickPageTitle": "Velg", + "@collectionPickPageTitle": {}, + "menuActionSelectNone": "Fravelg alt", + "@menuActionSelectNone": {}, + "coverDialogTabCover": "Omslag", + "@coverDialogTabCover": {}, + "coverDialogTabApp": "Program", + "@coverDialogTabApp": {}, + "collectionEmptyFavourites": "Ingen favoritter", + "@collectionEmptyFavourites": {}, + "viewDialogSortSectionTitle": "Sortering", + "@viewDialogSortSectionTitle": {}, + "tileLayoutGrid": "Rutenett", + "@tileLayoutGrid": {}, + "coverDialogTabColor": "Farge", + "@coverDialogTabColor": {}, + "aboutBugSectionTitle": "Feilrapport", + "@aboutBugSectionTitle": {}, + "aboutBugReportButton": "Rapporter", + "@aboutBugReportButton": {}, + "aboutCreditsWorldAtlas1": "Dette programmet bruker en TopoJSON-fil fra", + "@aboutCreditsWorldAtlas1": {}, + "collectionPageTitle": "Samling", + "@collectionPageTitle": {}, + "aboutBugCopyInfoInstruction": "Kopier systeminfo", + "@aboutBugCopyInfoInstruction": {}, + "aboutCreditsSectionTitle": "Bidragsytere", + "@aboutCreditsSectionTitle": {}, + "aboutLicensesShowAllButtonLabel": "Vis alle lisenser", + "@aboutLicensesShowAllButtonLabel": {}, + "collectionActionAddShortcut": "Legg til snarvei", + "@collectionActionAddShortcut": {}, + "dateToday": "I dag", + "@dateToday": {}, + "searchDateSectionTitle": "Dato", + "@searchDateSectionTitle": {}, + "collectionSelectPageTitle": "Velg elementer", + "@collectionSelectPageTitle": {}, + "collectionActionEmptyBin": "Tøm papirkurv", + "@collectionActionEmptyBin": {}, + "collectionActionCopy": "Kopier til album", + "@collectionActionCopy": {}, + "dateYesterday": "I går", + "@dateYesterday": {}, + "drawerCollectionImages": "Bilder", + "@drawerCollectionImages": {}, + "collectionActionEdit": "Rediger", + "@collectionActionEdit": {}, + "collectionGroupDay": "Etter dag", + "@collectionGroupDay": {}, + "dateThisMonth": "Denne måneden", + "@dateThisMonth": {}, + "collectionGroupNone": "Ikke grupper", + "@collectionGroupNone": {}, + "drawerCollectionAnimated": "Animert", + "@drawerCollectionAnimated": {}, + "drawerCollectionSphericalVideos": "360°-videoer", + "@drawerCollectionSphericalVideos": {}, + "sortByDate": "Etter dato", + "@sortByDate": {}, + "sectionUnknown": "Ukjent", + "@sectionUnknown": {}, + "collectionEmptyVideos": "Ingen videoer", + "@collectionEmptyVideos": {}, + "drawerCountryPage": "Land", + "@drawerCountryPage": {}, + "collectionEmptyGrantAccessButtonLabel": "Innvilg tilgang", + "@collectionEmptyGrantAccessButtonLabel": {}, + "drawerCollectionVideos": "Videoer", + "@drawerCollectionVideos": {}, + "drawerTagPage": "Etiketter", + "@drawerTagPage": {}, + "drawerCollectionMotionPhotos": "Bevegelige bilder", + "@drawerCollectionMotionPhotos": {}, + "drawerCollectionRaws": "Rådatabilder", + "@drawerCollectionRaws": {}, + "drawerAlbumPage": "Album", + "@drawerAlbumPage": {}, + "sortOrderHighestFirst": "Høyeste først", + "@sortOrderHighestFirst": {}, + "sortOrderLowestFirst": "Laveste først", + "@sortOrderLowestFirst": {}, + "countryEmpty": "Ingen land", + "@countryEmpty": {}, + "drawerCollectionPanoramas": "Panoramaer", + "@drawerCollectionPanoramas": {}, + "searchRecentSectionTitle": "Nylige", + "@searchRecentSectionTitle": {}, + "sourceViewerPageTitle": "Kilde", + "@sourceViewerPageTitle": {}, + "sortByName": "Etter navn", + "@sortByName": {}, + "sortByItemCount": "Etter antall elementer", + "@sortByItemCount": {}, + "sortBySize": "Etter størrelse", + "@sortBySize": {}, + "sortByAlbumFileName": "Etter album og filnavn", + "@sortByAlbumFileName": {}, + "sortByRating": "Etter vurdering", + "@sortByRating": {}, + "sortOrderNewestFirst": "Nyeste først", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "Eldste først", + "@sortOrderOldestFirst": {}, + "albumCamera": "Kamera", + "@albumCamera": {}, + "albumScreenshots": "Skjermavbildninger", + "@albumScreenshots": {}, + "albumPageTitle": "Album", + "@albumPageTitle": {}, + "tagPageTitle": "Etiketter", + "@tagPageTitle": {}, + "settingsViewerShowInformation": "Vis info", + "@settingsViewerShowInformation": {}, + "albumGroupType": "Etter type", + "@albumGroupType": {}, + "albumGroupVolume": "Etter lagringsdataområde", + "@albumGroupVolume": {}, + "albumMimeTypeMixed": "Blandet", + "@albumMimeTypeMixed": {}, + "albumPickPageTitleCopy": "Kopier til album", + "@albumPickPageTitleCopy": {}, + "albumPickPageTitlePick": "Velg album", + "@albumPickPageTitlePick": {}, + "albumDownload": "Last ned", + "@albumDownload": {}, + "createAlbumButtonLabel": "Opprett", + "@createAlbumButtonLabel": {}, + "searchRatingSectionTitle": "Vurderinger", + "@searchRatingSectionTitle": {}, + "settingsSystemDefault": "Systemforvalg", + "@settingsSystemDefault": {}, + "albumPickPageTitleExport": "Eksporter til album", + "@albumPickPageTitleExport": {}, + "albumPickPageTitleMove": "Flytt til album", + "@albumPickPageTitleMove": {}, + "albumScreenRecordings": "Skjermopptak", + "@albumScreenRecordings": {}, + "albumVideoCaptures": "Videoopptak", + "@albumVideoCaptures": {}, + "albumEmpty": "Ingen album", + "@albumEmpty": {}, + "createAlbumTooltip": "Opprett album", + "@createAlbumTooltip": {}, + "binPageTitle": "Papirkurv", + "@binPageTitle": {}, + "countryPageTitle": "Land", + "@countryPageTitle": {}, + "tagEmpty": "Ingen etiketter", + "@tagEmpty": {}, + "searchAlbumsSectionTitle": "Album", + "@searchAlbumsSectionTitle": {}, + "searchMetadataSectionTitle": "Metadata", + "@searchMetadataSectionTitle": {}, + "settingsPageTitle": "Innstillinger", + "@settingsPageTitle": {}, + "settingsActionExportDialogTitle": "Eksporter", + "@settingsActionExportDialogTitle": {}, + "searchCollectionFieldHint": "Søk i samling", + "@searchCollectionFieldHint": {}, + "searchCountriesSectionTitle": "Land", + "@searchCountriesSectionTitle": {}, + "settingsDefault": "Forvalg", + "@settingsDefault": {}, + "settingsActionExport": "Eksporter", + "@settingsActionExport": {}, + "settingsActionImport": "Importer", + "@settingsActionImport": {}, + "settingsActionImportDialogTitle": "Importer", + "@settingsActionImportDialogTitle": {}, + "searchPlacesSectionTitle": "Steder", + "@searchPlacesSectionTitle": {}, + "searchTagsSectionTitle": "Etiketter", + "@searchTagsSectionTitle": {}, + "appExportCovers": "Omslag", + "@appExportCovers": {}, + "appExportFavourites": "Favoritter", + "@appExportFavourites": {}, + "appExportSettings": "Innstillinger", + "@appExportSettings": {}, + "settingsConfirmationDialogTitle": "Bekreftelsesdialoger", + "@settingsConfirmationDialogTitle": {}, + "settingsConfirmationTile": "Bekreftelsesdialoger", + "@settingsConfirmationTile": {}, + "settingsThumbnailSectionTitle": "Miniatyrbilder", + "@settingsThumbnailSectionTitle": {}, + "timeMinutes": "{minutes, plural, =1{1 minutt} other{{minutes} minutter}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeDays": "{days, plural, =1{1 dag} other{{days} dager}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "itemCount": "{count, plural, =1{1 element} other{{count} elementer}}", + "@itemCount": { + "placeholders": { + "count": {} + } + }, + "timeSeconds": "{seconds, plural, =1{1 sekund} other{{seconds} sekunder}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "applyButtonLabel": "Bruk", + "@applyButtonLabel": {}, + "sourceStateCataloguing": "Katalogisering", + "@sourceStateCataloguing": {}, + "entryActionPrint": "Skriv ut", + "@entryActionPrint": {}, + "filterFavouriteLabel": "Favorittmerk", + "@filterFavouriteLabel": {}, + "filterBinLabel": "Papirkurv", + "@filterBinLabel": {}, + "nameConflictStrategyRename": "Gi nytt navn", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Erstatt", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Hopp over", + "@nameConflictStrategySkip": {}, + "videoPlaybackWithSound": "Spill med lyd", + "@videoPlaybackWithSound": {}, + "videoPlaybackMuted": "Spill forstummet", + "@videoPlaybackMuted": {}, + "videoStartOverButtonLabel": "Start om igjen", + "@videoStartOverButtonLabel": {}, + "noMatchingAppDialogMessage": "Ingen programmer kan håndtere dette.", + "@noMatchingAppDialogMessage": {}, + "videoResumeDialogMessage": "Fortsett avspilling fra {time}?", + "@videoResumeDialogMessage": { + "placeholders": { + "time": { + "type": "String", + "example": "13:37" + } + } + }, + "settingsNavigationDrawerTabTypes": "Typer", + "@settingsNavigationDrawerTabTypes": {}, + "settingsNavigationDrawerAddAlbum": "Legg til album", + "@settingsNavigationDrawerAddAlbum": {}, + "settingsViewerQuickActionsTile": "Hurtighandlinger", + "@settingsViewerQuickActionsTile": {}, + "tagEditorPageTitle": "Rediger etiketter", + "@tagEditorPageTitle": {}, + "settingsViewerShowMinimap": "Vis minikart", + "@settingsViewerShowMinimap": {}, + "settingsSubtitleThemePageTitle": "Undertekster", + "@settingsSubtitleThemePageTitle": {}, + "settingsUnitSystemDialogTitle": "Enheter", + "@settingsUnitSystemDialogTitle": {}, + "settingsViewerShowOverlayThumbnails": "Vis miniatyrbilder", + "@settingsViewerShowOverlayThumbnails": {}, + "settingsSlideshowFillScreen": "Fyll skjermen", + "@settingsSlideshowFillScreen": {}, + "settingsVideoShowVideos": "Vis videoer", + "@settingsVideoShowVideos": {}, + "settingsViewerSlideshowTile": "Lysbildevisning", + "@settingsViewerSlideshowTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Videoavspilling", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "settingsVideoAutoPlay": "Automatisk avspilling", + "@settingsVideoAutoPlay": {}, + "settingsSubtitleThemeTextSize": "Tekststørrelse", + "@settingsSubtitleThemeTextSize": {}, + "settingsVideoButtonsTile": "Knapper", + "@settingsVideoButtonsTile": {}, + "settingsSlideshowRepeat": "Gjenta", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowIntervalTile": "Intervall", + "@settingsSlideshowIntervalTile": {}, + "settingsSubtitleThemeTile": "Undertekster", + "@settingsSubtitleThemeTile": {}, + "settingsSubtitleThemeTextAlignmentTile": "Tekstjustering", + "@settingsSubtitleThemeTextAlignmentTile": {}, + "settingsSubtitleThemeTextAlignmentLeft": "Venstre", + "@settingsSubtitleThemeTextAlignmentLeft": {}, + "settingsSubtitleThemeTextAlignmentCenter": "Midten", + "@settingsSubtitleThemeTextAlignmentCenter": {}, + "settingsVideoControlsPageTitle": "Kontroller", + "@settingsVideoControlsPageTitle": {}, + "settingsHiddenItemsTabFilters": "Skjulte filtre", + "@settingsHiddenItemsTabFilters": {}, + "settingsThemeEnableDynamicColor": "Dynamisk farge", + "@settingsThemeEnableDynamicColor": {}, + "mapZoomOutTooltip": "Forminsk", + "@mapZoomOutTooltip": {}, + "viewerInfoPageTitle": "Info", + "@viewerInfoPageTitle": {}, + "settingsSaveSearchHistory": "Lagre søkehistorikk", + "@settingsSaveSearchHistory": {}, + "settingsEnableBinSubtitle": "Behold slettede elementer i 30 dager", + "@settingsEnableBinSubtitle": {}, + "settingsAccessibilitySectionTitle": "Tilgjengelighet", + "@settingsAccessibilitySectionTitle": {}, + "tagEditorPageNewTagFieldLabel": "Ny etikett", + "@tagEditorPageNewTagFieldLabel": {}, + "settingsRemoveAnimationsDialogTitle": "Fjern animasjoner", + "@settingsRemoveAnimationsDialogTitle": {}, + "settingsLanguageTile": "Språk", + "@settingsLanguageTile": {}, + "settingsLanguagePageTitle": "Språk", + "@settingsLanguagePageTitle": {}, + "viewerInfoUnknown": "ukjent", + "@viewerInfoUnknown": {}, + "settingsThemeBrightnessDialogTitle": "Drakt", + "@settingsThemeBrightnessDialogTitle": {}, + "settingsCoordinateFormatTile": "Koordinatformat", + "@settingsCoordinateFormatTile": {}, + "settingsCollectionTile": "Samling", + "@settingsCollectionTile": {}, + "statsPageTitle": "Statistikk", + "@statsPageTitle": {}, + "viewerInfoLabelDate": "Dato", + "@viewerInfoLabelDate": {}, + "mapStyleDialogTitle": "Kartstil", + "@mapStyleDialogTitle": {}, + "mapStyleTooltip": "Velg kartstil", + "@mapStyleTooltip": {}, + "mapZoomInTooltip": "Forstørr", + "@mapZoomInTooltip": {}, + "mapPointNorthUpTooltip": "Nord oppover", + "@mapPointNorthUpTooltip": {}, + "viewerInfoSearchSuggestionDescription": "Beskrivelse", + "@viewerInfoSearchSuggestionDescription": {}, + "viewerInfoSearchFieldLabel": "Søk metadata", + "@viewerInfoSearchFieldLabel": {}, + "viewerInfoSearchSuggestionDate": "Dato og tid", + "@viewerInfoSearchSuggestionDate": {}, + "viewerInfoSearchSuggestionDimensions": "Dimensjoner", + "@viewerInfoSearchSuggestionDimensions": {}, + "tagEditorSectionRecent": "Nylig", + "@tagEditorSectionRecent": {}, + "viewerInfoSearchSuggestionResolution": "Oppløsning", + "@viewerInfoSearchSuggestionResolution": {}, + "viewerInfoSearchSuggestionRights": "Rettigheter", + "@viewerInfoSearchSuggestionRights": {}, + "tagEditorPageAddTagTooltip": "Legg til etikett", + "@tagEditorPageAddTagTooltip": {}, + "filePickerDoNotShowHiddenFiles": "Ikke vis skjulte filer", + "@filePickerDoNotShowHiddenFiles": {}, + "filePickerOpenFrom": "Åpne fra", + "@filePickerOpenFrom": {}, + "filePickerNoItems": "Ingen elementer", + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "Bruk denne mappen", + "@filePickerUseThisFolder": {}, + "sourceStateLocatingCountries": "Lokalisering av land", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Lokalisering av steder", + "@sourceStateLocatingPlaces": {}, + "entryActionFlip": "Vend vannrett", + "@entryActionFlip": {}, + "slideshowActionResume": "Fortsett", + "@slideshowActionResume": {}, + "displayRefreshRatePreferHighest": "Høyeste takt", + "@displayRefreshRatePreferHighest": {}, + "displayRefreshRatePreferLowest": "Laveste takt", + "@displayRefreshRatePreferLowest": {}, + "viewerTransitionSlide": "Glidende", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Parallakse", + "@viewerTransitionParallax": {}, + "widgetOpenPageHome": "Åpne startside", + "@widgetOpenPageHome": {}, + "widgetOpenPageViewer": "Åpne visning", + "@widgetOpenPageViewer": {}, + "durationDialogHours": "Timer", + "@durationDialogHours": {}, + "aboutLicensesBanner": "Programmet bruker følgende frie pakker og bibliotek.", + "@aboutLicensesBanner": {}, + "aboutLicensesAndroidLibrariesSectionTitle": "Android-bibliotek", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, + "aboutLicensesFlutterPluginsSectionTitle": "Flutter-programtillegg", + "@aboutLicensesFlutterPluginsSectionTitle": {}, + "aboutBugReportInstruction": "Innrapporter på GitHub med loggføring og systeminfo", + "@aboutBugReportInstruction": {}, + "settingsSubtitleThemeShowOutline": "Vis omriss og skygge", + "@settingsSubtitleThemeShowOutline": {}, + "settingsVideoGestureSideDoubleTapSeek": "Dobbelttrykk på skjermkantene for å blafre forover/bakover", + "@settingsVideoGestureSideDoubleTapSeek": {}, + "settingsAllowInstalledAppAccessSubtitle": "Brukt til forbedring av albumsvisning", + "@settingsAllowInstalledAppAccessSubtitle": {}, + "settingsAllowErrorReporting": "Tillat anonym feilrapportering", + "@settingsAllowErrorReporting": {}, + "settingsStorageAccessPageTitle": "Lagringstilgang", + "@settingsStorageAccessPageTitle": {}, + "settingsStorageAccessRevokeTooltip": "Tilbakekall", + "@settingsStorageAccessRevokeTooltip": {}, + "settingsLanguageSectionTitle": "Språk og formater", + "@settingsLanguageSectionTitle": {}, + "settingsWidgetPageTitle": "Bilderamme", + "@settingsWidgetPageTitle": {}, + "settingsWidgetShowOutline": "Omriss", + "@settingsWidgetShowOutline": {}, + "settingsWidgetOpenPage": "Når miniprogrammet trykkes", + "@settingsWidgetOpenPage": {}, + "viewerOpenPanoramaButtonLabel": "Åpne panorama", + "@viewerOpenPanoramaButtonLabel": {}, + "viewerSetWallpaperButtonLabel": "Sett som bakgrunnsbilde", + "@viewerSetWallpaperButtonLabel": {}, + "viewerErrorUnknown": "Oida.", + "@viewerErrorUnknown": {}, + "viewerInfoBackToViewerTooltip": "Tilbake til visning", + "@viewerInfoBackToViewerTooltip": {}, + "mapAttributionOsmHot": "Kartdata © [OpenStreetMap](https://www.openstreetmap.org/copyright)-bidragsyterne • Flis av [HOT](https://www.hotosm.org) • Vertstjent av [OSM France](https://openstreetmap.fr)", + "@mapAttributionOsmHot": {}, + "panoramaEnableSensorControl": "Skru på sensorstyring", + "@panoramaEnableSensorControl": {}, + "panoramaDisableSensorControl": "Skru av sensorstyring", + "@panoramaDisableSensorControl": {}, + "nameConflictDialogSingleSourceMessage": "Noen filer i målmappen har samme navn.", + "@nameConflictDialogSingleSourceMessage": {} +} diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 1e59e2209..bab5aefaa 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -303,8 +303,6 @@ "@wallpaperTargetHomeLock": {}, "widgetOpenPageHome": "Open startscherm", "@widgetOpenPageHome": {}, - "widgetOpenPageViewer": "Open viewer", - "@widgetOpenPageViewer": {}, "albumTierNew": "Nieuw", "@albumTierNew": {}, "albumTierPinned": "Gepint", @@ -501,8 +499,6 @@ "@aboutPageTitle": {}, "aboutLinkLicense": "Licentie", "@aboutLinkLicense": {}, - "aboutLinkPolicy": "Privacy Policy", - "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "Bug Reporteren", "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "Sla applicatielogs op in een bestand", @@ -537,8 +533,6 @@ "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "Laat alle licenties zien", "@aboutLicensesShowAllButtonLabel": {}, - "policyPageTitle": "Privacy Policy", - "@policyPageTitle": {}, "collectionPageTitle": "Verzameling", "@collectionPageTitle": {}, "collectionPickPageTitle": "Kies", @@ -911,7 +905,7 @@ "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "Ondertiteling", "@settingsSubtitleThemePageTitle": {}, - "settingsSubtitleThemeSample": "Dit is een voorbeeld", + "settingsSubtitleThemeSample": "Dit is een voorbeeld.", "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "Tekst uitlijnen", "@settingsSubtitleThemeTextAlignmentTile": {}, diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb new file mode 100644 index 000000000..b8d2e39c1 --- /dev/null +++ b/lib/l10n/app_pl.arb @@ -0,0 +1,188 @@ +{ + "actionRemove": "Usuń", + "@actionRemove": {}, + "applyButtonLabel": "ZASTOSUJ", + "@applyButtonLabel": {}, + "changeTooltip": "Zmień", + "@changeTooltip": {}, + "nextTooltip": "Następny", + "@nextTooltip": {}, + "hideTooltip": "Ukryj", + "@hideTooltip": {}, + "resetTooltip": "Zresetuj", + "@resetTooltip": {}, + "pickTooltip": "Wybierz", + "@pickTooltip": {}, + "doubleBackExitMessage": "Tapnij ponownie \"wstecz\" aby wyjść.", + "@doubleBackExitMessage": {}, + "saveTooltip": "Zapisz", + "@saveTooltip": {}, + "doNotAskAgain": "Nie pytaj ponownie", + "@doNotAskAgain": {}, + "sourceStateLoading": "Ładowanie", + "@sourceStateLoading": {}, + "sourceStateLocatingCountries": "Lokowanie krajów", + "@sourceStateLocatingCountries": {}, + "chipActionGoToCountryPage": "Pokaż w Krajach", + "@chipActionGoToCountryPage": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Witaj w Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Opcjonalny", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Akceptuję warunki i zasady", + "@welcomeTermsToggle": {}, + "deleteButtonLabel": "USUŃ", + "@deleteButtonLabel": {}, + "nextButtonLabel": "NASTĘPNY", + "@nextButtonLabel": {}, + "showButtonLabel": "POKAŻ", + "@showButtonLabel": {}, + "hideButtonLabel": "UKRYJ", + "@hideButtonLabel": {}, + "continueButtonLabel": "KONTYNUUJ", + "@continueButtonLabel": {}, + "cancelTooltip": "Anuluj", + "@cancelTooltip": {}, + "clearTooltip": "Wyczyść", + "@clearTooltip": {}, + "previousTooltip": "Poprzedni", + "@previousTooltip": {}, + "showTooltip": "Pokaż", + "@showTooltip": {}, + "chipActionFilterIn": "Filtrować", + "@chipActionFilterIn": {}, + "chipActionPin": "Przypnij na górze", + "@chipActionPin": {}, + "chipActionUnpin": "Odepnij z góry", + "@chipActionUnpin": {}, + "chipActionRename": "Zmień nazwę", + "@chipActionRename": {}, + "chipActionSetCover": "Ustaw okładkę", + "@chipActionSetCover": {}, + "entryActionDelete": "Usuń", + "@entryActionDelete": {}, + "entryActionConvert": "Konwertuj", + "@entryActionConvert": {}, + "entryActionExport": "Eksport", + "@entryActionExport": {}, + "videoActionCaptureFrame": "Ramka do przechwytywania", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Wycisz", + "@videoActionMute": {}, + "videoActionUnmute": "Wyłącz wyciszenie", + "@videoActionUnmute": {}, + "videoActionPause": "Pauza", + "@videoActionPause": {}, + "videoActionPlay": "Graj", + "@videoActionPlay": {}, + "videoActionReplay10": "Przewiń do tyłu 10 sekund", + "@videoActionReplay10": {}, + "videoActionSkip10": "Przewiń do przodu 10 sekund", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Wybierz ścieżki", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Prędkość odtwarzania", + "@videoActionSetSpeed": {}, + "videoActionSettings": "Ustawienia", + "@videoActionSettings": {}, + "slideshowActionResume": "Wznów", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Pokaż w Kolekcji", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Edytuj datę & godzinę", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditLocation": "Edytuj lokalizację", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTitleDescription": "Edytuj tytuł & opis", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Edytuj ocenę", + "@entryInfoActionEditRating": {}, + "entryInfoActionEditTags": "Edytuj tagi", + "@entryInfoActionEditTags": {}, + "entryInfoActionRemoveMetadata": "Usuń metadatę", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Kosz", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Ulubione", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Niedatowany", + "@filterNoDateLabel": {}, + "filterNoRatingLabel": "Nieoceniony", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Nieoznakowany", + "@filterNoTagLabel": {}, + "filterNoTitleLabel": "Bez tytułu", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Tego dnia", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Ostatnio dodany", + "@filterRecentlyAddedLabel": {}, + "filterTypeMotionPhotoLabel": "Ruchome Zdjęcie", + "@filterTypeMotionPhotoLabel": {}, + "filterTypePanoramaLabel": "Zdjęcie sferyczne", + "@filterTypePanoramaLabel": {}, + "entryActionFlip": "Obróć w poziomie", + "@entryActionFlip": {}, + "entryActionShare": "Udostępnij", + "@entryActionShare": {}, + "entryActionViewSource": "Pokaż źródło", + "@entryActionViewSource": {}, + "entryActionOpenMap": "Pokaż w aplikacji mapy", + "@entryActionOpenMap": {}, + "sourceStateCataloguing": "Katalogowanie", + "@sourceStateCataloguing": {}, + "sourceStateLocatingPlaces": "Lokowanie miejsc", + "@sourceStateLocatingPlaces": {}, + "chipActionFilterOut": "Odfiltruj", + "@chipActionFilterOut": {}, + "chipActionCreateAlbum": "Utwórz album", + "@chipActionCreateAlbum": {}, + "entryActionRotateCCW": "Obróć w lewo", + "@entryActionRotateCCW": {}, + "chipActionDelete": "Usuń", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Pokaż w Albumach", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToTagPage": "Pokaż w Tagach", + "@chipActionGoToTagPage": {}, + "entryActionCopyToClipboard": "Skopiuj do schowka", + "@entryActionCopyToClipboard": {}, + "chipActionHide": "Schowaj", + "@chipActionHide": {}, + "entryActionPrint": "Drukuj", + "@entryActionPrint": {}, + "entryActionShowGeoTiffOnMap": "Pokaż jako nakładkę mapy", + "@entryActionShowGeoTiffOnMap": {}, + "entryActionConvertMotionPhotoToStillImage": "Konwertuj na nieruchomy obraz", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionEdit": "Edycja", + "@entryActionEdit": {}, + "entryActionOpen": "Otwórz z", + "@entryActionOpen": {}, + "entryActionViewMotionPhotoVideo": "Otwórz film", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionRotateScreen": "Obróć ekran", + "@entryActionRotateScreen": {}, + "entryActionRemoveFavourite": "Usuń z ulubionych", + "@entryActionRemoveFavourite": {}, + "entryActionSetAs": "Ustaw jako", + "@entryActionSetAs": {}, + "entryActionAddFavourite": "Dodaj do ulubionych", + "@entryActionAddFavourite": {}, + "filterNoLocationLabel": "Nieumiejscowiony", + "@filterNoLocationLabel": {}, + "filterRatingRejectedLabel": "Odrzucony", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animowany", + "@filterTypeAnimatedLabel": {}, + "entryActionRename": "Zmień nazwę", + "@entryActionRename": {}, + "entryActionRotateCW": "Obróć w prawo", + "@entryActionRotateCW": {}, + "entryActionInfo": "Informacje", + "@entryActionInfo": {}, + "entryActionRestore": "Przywróć", + "@entryActionRestore": {} +} diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index db0575d29..c6a48ff21 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -1,694 +1,1146 @@ { "appName": "Aves", + "@appName": {}, "welcomeMessage": "Bem-vindo ao Aves", + "@welcomeMessage": {}, "welcomeOptional": "Opcional", + "@welcomeOptional": {}, "welcomeTermsToggle": "Eu concordo com os Termos e Condições", + "@welcomeTermsToggle": {}, "itemCount": "{count, plural, =1{1 item} other{{count} itens}}", - + "@itemCount": {}, "timeSeconds": "{seconds, plural, =1{1 segundo} other{{seconds} segundos}}", + "@timeSeconds": {}, "timeMinutes": "{minutes, plural, =1{1 minuto} other{{minutes} minutos}}", + "@timeMinutes": {}, "timeDays": "{days, plural, =1{1 dia} other{{days} dias}}", + "@timeDays": {}, "focalLength": "{length} mm", - + "@focalLength": {}, "applyButtonLabel": "APLIQUE", + "@applyButtonLabel": {}, "deleteButtonLabel": "EXCLUIR", + "@deleteButtonLabel": {}, "nextButtonLabel": "PROXIMO", + "@nextButtonLabel": {}, "showButtonLabel": "MOSTRAR", + "@showButtonLabel": {}, "hideButtonLabel": "OCULTAR", + "@hideButtonLabel": {}, "continueButtonLabel": "CONTINUAR", - + "@continueButtonLabel": {}, "cancelTooltip": "Cancela", + "@cancelTooltip": {}, "changeTooltip": "Mudar", + "@changeTooltip": {}, "clearTooltip": "Claro", + "@clearTooltip": {}, "previousTooltip": "Anterior", + "@previousTooltip": {}, "nextTooltip": "Proximo", + "@nextTooltip": {}, "showTooltip": "Mostrar", + "@showTooltip": {}, "hideTooltip": "Ocultar", + "@hideTooltip": {}, "actionRemove": "Remover", + "@actionRemove": {}, "resetTooltip": "Resetar", + "@resetTooltip": {}, "saveTooltip": "Salve", + "@saveTooltip": {}, "pickTooltip": "Escolher", - + "@pickTooltip": {}, "doubleBackExitMessage": "Toque em “voltar” novamente para sair.", + "@doubleBackExitMessage": {}, "doNotAskAgain": "Não pergunte novamente", - + "@doNotAskAgain": {}, "sourceStateLoading": "Carregando", + "@sourceStateLoading": {}, "sourceStateCataloguing": "Catalogação", + "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "Localizando países", + "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "Localizando lugares", - + "@sourceStateLocatingPlaces": {}, "chipActionDelete": "Deletar", + "@chipActionDelete": {}, "chipActionGoToAlbumPage": "Mostrar nos Álbuns", + "@chipActionGoToAlbumPage": {}, "chipActionGoToCountryPage": "Mostrar em Países", + "@chipActionGoToCountryPage": {}, "chipActionGoToTagPage": "Mostrar em Etiquetas", + "@chipActionGoToTagPage": {}, "chipActionFilterOut": "Filtrar dentro", + "@chipActionFilterOut": {}, "chipActionFilterIn": "Filtrar fora", + "@chipActionFilterIn": {}, "chipActionHide": "Ocultar", + "@chipActionHide": {}, "chipActionPin": "Fixar no topo", + "@chipActionPin": {}, "chipActionUnpin": "Desafixar do topo", + "@chipActionUnpin": {}, "chipActionRename": "Renomear", + "@chipActionRename": {}, "chipActionSetCover": "Definir capa", + "@chipActionSetCover": {}, "chipActionCreateAlbum": "Criar álbum", - + "@chipActionCreateAlbum": {}, "entryActionCopyToClipboard": "Copiar para área de transferência", + "@entryActionCopyToClipboard": {}, "entryActionDelete": "Excluir", + "@entryActionDelete": {}, "entryActionExport": "Exportar", + "@entryActionExport": {}, "entryActionInfo": "Informações", + "@entryActionInfo": {}, "entryActionConvert": "Converter", + "@entryActionConvert": {}, "entryActionRename": "Renomear", + "@entryActionRename": {}, "entryActionRestore": "Restaurar", + "@entryActionRestore": {}, "entryActionRotateCCW": "Rotacionar para esquerda", + "@entryActionRotateCCW": {}, "entryActionRotateCW": "Rotacionar para direita", + "@entryActionRotateCW": {}, "entryActionFlip": "Virar horizontalmente", + "@entryActionFlip": {}, "entryActionPrint": "Imprimir", + "@entryActionPrint": {}, "entryActionShare": "Compartilhado", + "@entryActionShare": {}, "entryActionViewSource": "Ver fonte", + "@entryActionViewSource": {}, "entryActionShowGeoTiffOnMap": "Mostrar como sobreposição de mapa", + "@entryActionShowGeoTiffOnMap": {}, "entryActionConvertMotionPhotoToStillImage": "Converter para imagem estática", + "@entryActionConvertMotionPhotoToStillImage": {}, "entryActionViewMotionPhotoVideo": "Abrir vídeo", + "@entryActionViewMotionPhotoVideo": {}, "entryActionEdit": "Editar", + "@entryActionEdit": {}, "entryActionOpen": "Abrir com", + "@entryActionOpen": {}, "entryActionSetAs": "Definir como", + "@entryActionSetAs": {}, "entryActionOpenMap": "Mostrar no aplicativo de mapa", + "@entryActionOpenMap": {}, "entryActionRotateScreen": "Girar a tela", + "@entryActionRotateScreen": {}, "entryActionAddFavourite": "Adicionar aos favoritos", + "@entryActionAddFavourite": {}, "entryActionRemoveFavourite": "Remova dos favoritos", - + "@entryActionRemoveFavourite": {}, "videoActionCaptureFrame": "Capturar quadro", + "@videoActionCaptureFrame": {}, "videoActionMute": "Mudo", + "@videoActionMute": {}, "videoActionUnmute": "Ativar mudo", + "@videoActionUnmute": {}, "videoActionPause": "Pausa", + "@videoActionPause": {}, "videoActionPlay": "Toque", + "@videoActionPlay": {}, "videoActionReplay10": "Retroceda 10 segundos", + "@videoActionReplay10": {}, "videoActionSkip10": "Avançar 10 segundos", + "@videoActionSkip10": {}, "videoActionSelectStreams": "Selecione as faixas", + "@videoActionSelectStreams": {}, "videoActionSetSpeed": "Velocidade de reprodução", + "@videoActionSetSpeed": {}, "videoActionSettings": "Configurações", - + "@videoActionSettings": {}, "slideshowActionResume": "Retomar", + "@slideshowActionResume": {}, "slideshowActionShowInCollection": "Mostrar na Coleção", - + "@slideshowActionShowInCollection": {}, "entryInfoActionEditDate": "Editar data e hora", + "@entryInfoActionEditDate": {}, "entryInfoActionEditLocation": "Editar localização", + "@entryInfoActionEditLocation": {}, "entryInfoActionEditTitleDescription": "Editar título e descrição", + "@entryInfoActionEditTitleDescription": {}, "entryInfoActionEditRating": "Editar classificação", + "@entryInfoActionEditRating": {}, "entryInfoActionEditTags": "Editar etiquetas", + "@entryInfoActionEditTags": {}, "entryInfoActionRemoveMetadata": "Remover metadados", - + "@entryInfoActionRemoveMetadata": {}, "filterBinLabel": "Lixeira", + "@filterBinLabel": {}, "filterFavouriteLabel": "Favorito", + "@filterFavouriteLabel": {}, "filterNoDateLabel": "Sem data", + "@filterNoDateLabel": {}, "filterNoLocationLabel": "Não localizado", + "@filterNoLocationLabel": {}, "filterNoRatingLabel": "Sem classificação", + "@filterNoRatingLabel": {}, "filterNoTagLabel": "Sem etiqueta", + "@filterNoTagLabel": {}, "filterNoTitleLabel": "Sem título", + "@filterNoTitleLabel": {}, "filterOnThisDayLabel": "Neste dia", + "@filterOnThisDayLabel": {}, "filterRecentlyAddedLabel": "Adicionado recentemente", + "@filterRecentlyAddedLabel": {}, "filterRatingRejectedLabel": "Rejeitado", + "@filterRatingRejectedLabel": {}, "filterTypeAnimatedLabel": "Animado", + "@filterTypeAnimatedLabel": {}, "filterTypeMotionPhotoLabel": "Foto em movimento", + "@filterTypeMotionPhotoLabel": {}, "filterTypePanoramaLabel": "Panorama", + "@filterTypePanoramaLabel": {}, "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, "filterTypeSphericalVideoLabel": "360° vídeo", + "@filterTypeSphericalVideoLabel": {}, "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, "filterMimeImageLabel": "Imagem", + "@filterMimeImageLabel": {}, "filterMimeVideoLabel": "Vídeo", - + "@filterMimeVideoLabel": {}, "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, "coordinateFormatDecimal": "Graus decimais", + "@coordinateFormatDecimal": {}, "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, "coordinateDmsEast": "L", + "@coordinateDmsEast": {}, "coordinateDmsWest": "O", - + "@coordinateDmsWest": {}, "unitSystemMetric": "Métrica", + "@unitSystemMetric": {}, "unitSystemImperial": "Imperial", - + "@unitSystemImperial": {}, "videoLoopModeNever": "Nunca", + "@videoLoopModeNever": {}, "videoLoopModeShortOnly": "Apenas vídeos curtos", + "@videoLoopModeShortOnly": {}, "videoLoopModeAlways": "Sempre", - + "@videoLoopModeAlways": {}, "videoControlsPlay": "Começar", + "@videoControlsPlay": {}, "videoControlsPlaySeek": "Começar e procurar", + "@videoControlsPlaySeek": {}, "videoControlsPlayOutside": "Abrir com outro player", + "@videoControlsPlayOutside": {}, "videoControlsNone": "Nenhum", - + "@videoControlsNone": {}, "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, "mapStyleGoogleHybrid": "Google Maps (Híbrido)", + "@mapStyleGoogleHybrid": {}, "mapStyleGoogleTerrain": "Google Maps (Terreno)", + "@mapStyleGoogleTerrain": {}, "mapStyleHuaweiNormal": "Petal Maps", + "@mapStyleHuaweiNormal": {}, "mapStyleHuaweiTerrain": "Petal Maps (Terreno)", + "@mapStyleHuaweiTerrain": {}, "mapStyleOsmHot": "OSM Humanitário", + "@mapStyleOsmHot": {}, "mapStyleStamenToner": "Stamen Toner (Monocromático)", + "@mapStyleStamenToner": {}, "mapStyleStamenWatercolor": "Stamen Watercolor (Aquarela)", - + "@mapStyleStamenWatercolor": {}, "nameConflictStrategyRename": "Renomear", + "@nameConflictStrategyRename": {}, "nameConflictStrategyReplace": "Substituir", + "@nameConflictStrategyReplace": {}, "nameConflictStrategySkip": "Pular", - + "@nameConflictStrategySkip": {}, "keepScreenOnNever": "Nunca", + "@keepScreenOnNever": {}, "keepScreenOnViewerOnly": "Somente página do visualizador", + "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "Sempre", - + "@keepScreenOnAlways": {}, "accessibilityAnimationsRemove": "Prevenir efeitos de tela", + "@accessibilityAnimationsRemove": {}, "accessibilityAnimationsKeep": "Manter efeitos de tela", - + "@accessibilityAnimationsKeep": {}, "displayRefreshRatePreferHighest": "Taxa mais alta", + "@displayRefreshRatePreferHighest": {}, "displayRefreshRatePreferLowest": "Taxa mais baixa", - + "@displayRefreshRatePreferLowest": {}, "videoPlaybackSkip": "Pular", + "@videoPlaybackSkip": {}, "videoPlaybackMuted": "Reproduzir sem som", + "@videoPlaybackMuted": {}, "videoPlaybackWithSound": "Reproduzir com som", - + "@videoPlaybackWithSound": {}, "themeBrightnessLight": "Claro", + "@themeBrightnessLight": {}, "themeBrightnessDark": "Escuro", + "@themeBrightnessDark": {}, "themeBrightnessBlack": "Preto", - + "@themeBrightnessBlack": {}, "viewerTransitionSlide": "Deslizar", + "@viewerTransitionSlide": {}, "viewerTransitionParallax": "Parallax", + "@viewerTransitionParallax": {}, "viewerTransitionFade": "Desvaneça", + "@viewerTransitionFade": {}, "viewerTransitionZoomIn": "Mais zoom", + "@viewerTransitionZoomIn": {}, "viewerTransitionNone": "Nenhum", - + "@viewerTransitionNone": {}, "wallpaperTargetHome": "Tela inicial", + "@wallpaperTargetHome": {}, "wallpaperTargetLock": "Tela de bloqueio", + "@wallpaperTargetLock": {}, "wallpaperTargetHomeLock": "Telas iniciais e de bloqueio", - + "@wallpaperTargetHomeLock": {}, "widgetOpenPageHome": "Abrir inicial", + "@widgetOpenPageHome": {}, "widgetOpenPageViewer": "Abrir visualizador", - + "@widgetOpenPageViewer": {}, "albumTierNew": "Novo", + "@albumTierNew": {}, "albumTierPinned": "Fixada", + "@albumTierPinned": {}, "albumTierSpecial": "Comum", + "@albumTierSpecial": {}, "albumTierApps": "Aplicativos", + "@albumTierApps": {}, "albumTierRegular": "Outras", - + "@albumTierRegular": {}, "storageVolumeDescriptionFallbackPrimary": "Armazenamento interno", + "@storageVolumeDescriptionFallbackPrimary": {}, "storageVolumeDescriptionFallbackNonPrimary": "cartão SD", + "@storageVolumeDescriptionFallbackNonPrimary": {}, "rootDirectoryDescription": "diretório raiz", + "@rootDirectoryDescription": {}, "otherDirectoryDescription": "diretório “{name}”", + "@otherDirectoryDescription": {}, "storageAccessDialogMessage": "Selecione o {directory} de “{volume}” na próxima tela para dar acesso a este aplicativo.", + "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "Este aplicativo não tem permissão para modificar arquivos no {directory} de “{volume}”.\n\nUse um gerenciador de arquivos ou aplicativo de galeria pré-instalado para mover os itens para outro diretório.", + "@restrictedAccessDialogMessage": {}, "notEnoughSpaceDialogMessage": "Esta operação precisa {neededSize} de espaço livre em “{volume}” para completar, mas só {freeSize} restantes.", + "@notEnoughSpaceDialogMessage": {}, "missingSystemFilePickerDialogMessage": "O seletor de arquivos do sistema está ausente ou desabilitado. Por favor, habilite e tente novamente.", - + "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, =1{Esta operação não é suportada para itens do seguinte tipo: {types}.} other{Esta operação não é suportada para itens dos seguintes tipos: {types}.}}", - + "@unsupportedTypeDialogMessage": {}, "nameConflictDialogSingleSourceMessage": "Alguns arquivos na pasta de destino têm o mesmo nome.", + "@nameConflictDialogSingleSourceMessage": {}, "nameConflictDialogMultipleSourceMessage": "Alguns arquivos têm o mesmo nome.", - + "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "Rótulo de atalho", + "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "ADICIONAR", - + "@addShortcutButtonLabel": {}, "noMatchingAppDialogMessage": "Não há aplicativos que possam lidar com isso.", - + "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{Mover esse item para a lixeira?} other{Mova estes {count} itens para a lixeira?}}", + "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Tem certeza de que deseja excluir este item?} other{Tem certeza de que deseja excluir estes {count} itens?}}", + "@deleteEntriesConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogMessage": "Alguns itens não têm data de metadados. Sua data atual será redefinida por esta operação, a menos que um data de metadados é definida.", + "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Definir data", - + "@moveUndatedConfirmationDialogSetDate": {}, "videoResumeDialogMessage": "Deseja continuar jogando em {time}?", + "@videoResumeDialogMessage": {}, "videoStartOverButtonLabel": "RECOMEÇAR", + "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "RETOMAR", - + "@videoResumeButtonLabel": {}, "setCoverDialogLatest": "Último item", + "@setCoverDialogLatest": {}, "setCoverDialogAuto": "Auto", + "@setCoverDialogAuto": {}, "setCoverDialogCustom": "Personalizado", - + "@setCoverDialogCustom": {}, "hideFilterConfirmationDialogMessage": "Fotos e vídeos correspondentes serão ocultados da sua coleção. Você pode mostrá-los novamente nas configurações de “Privacidade”.\n\nTem certeza de que deseja ocultá-los?", - + "@hideFilterConfirmationDialogMessage": {}, "newAlbumDialogTitle": "Novo álbum", + "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "Nome do álbum", + "@newAlbumDialogNameLabel": {}, "newAlbumDialogNameLabelAlreadyExistsHelper": "O diretório já existe", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "Armazenar:", - + "@newAlbumDialogStorageLabel": {}, "renameAlbumDialogLabel": "Novo nome", + "@renameAlbumDialogLabel": {}, "renameAlbumDialogLabelAlreadyExistsHelper": "O diretório já existe", - + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, "renameEntrySetPageTitle": "Renomear", + "@renameEntrySetPageTitle": {}, "renameEntrySetPagePatternFieldLabel": "Padrão de nomeação", + "@renameEntrySetPagePatternFieldLabel": {}, "renameEntrySetPageInsertTooltip": "Inserir campo", + "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "Visualizar", - + "@renameEntrySetPagePreviewSectionTitle": {}, "renameProcessorCounter": "Contador", + "@renameProcessorCounter": {}, "renameProcessorName": "Nome", - + "@renameProcessorName": {}, "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Tem certeza de que deseja excluir este álbum e seu item?} other{Tem certeza de que deseja excluir este álbum e seus {count} itens?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Tem certeza de que deseja excluir estes álbuns e seus itens?} other{Tem certeza de que deseja excluir estes álbuns e seus {count} itens?}}", - + "@deleteMultiAlbumConfirmationDialogMessage": {}, "exportEntryDialogFormat": "Formato:", + "@exportEntryDialogFormat": {}, "exportEntryDialogWidth": "Largura", + "@exportEntryDialogWidth": {}, "exportEntryDialogHeight": "Altura", - + "@exportEntryDialogHeight": {}, "renameEntryDialogLabel": "Novo nome", - + "@renameEntryDialogLabel": {}, "editEntryDialogTargetFieldsHeader": "Campos para modificar", - + "@editEntryDialogTargetFieldsHeader": {}, "editEntryDateDialogTitle": "Data e hora", + "@editEntryDateDialogTitle": {}, "editEntryDateDialogSetCustom": "Definir data personalizada", + "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Copiar de outra data", + "@editEntryDateDialogCopyField": {}, "editEntryDateDialogCopyItem": "Copiar de outro item", + "@editEntryDateDialogCopyItem": {}, "editEntryDateDialogExtractFromTitle": "Extrair do título", + "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Mudança", + "@editEntryDateDialogShift": {}, "editEntryDateDialogSourceFileModifiedDate": "Data de modificação do arquivo", - + "@editEntryDateDialogSourceFileModifiedDate": {}, "durationDialogHours": "Horas", + "@durationDialogHours": {}, "durationDialogMinutes": "Minutos", - + "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Localização", + "@editEntryLocationDialogTitle": {}, "editEntryLocationDialogChooseOnMapTooltip": "Escolha no mapa", + "@editEntryLocationDialogChooseOnMapTooltip": {}, "editEntryLocationDialogLatitude": "Latitude", + "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Longitude", - + "@editEntryLocationDialogLongitude": {}, "locationPickerUseThisLocationButton": "Usar essa localização", - + "@locationPickerUseThisLocationButton": {}, "editEntryRatingDialogTitle": "Avaliação", - + "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "Remoção de metadados", + "@removeEntryMetadataDialogTitle": {}, "removeEntryMetadataDialogMore": "Mais", - + "@removeEntryMetadataDialogMore": {}, "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP é necessário para reproduzir o vídeo dentro de uma foto em movimento.\n\nTem certeza de que deseja removê-lo?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, "convertMotionPhotoToStillImageWarningDialogMessage": "Tem certeza?", - + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, "videoSpeedDialogLabel": "Velocidade de reprodução", - + "@videoSpeedDialogLabel": {}, "videoStreamSelectionDialogVideo": "Video", + "@videoStreamSelectionDialogVideo": {}, "videoStreamSelectionDialogAudio": "Áudio", + "@videoStreamSelectionDialogAudio": {}, "videoStreamSelectionDialogText": "Legendas", + "@videoStreamSelectionDialogText": {}, "videoStreamSelectionDialogOff": "Fora", + "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "Acompanhar", + "@videoStreamSelectionDialogTrack": {}, "videoStreamSelectionDialogNoSelection": "Não há outras faixas.", - + "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "Feito!", + "@genericSuccessFeedback": {}, "genericFailureFeedback": "Falhou", - + "@genericFailureFeedback": {}, "menuActionConfigureView": "Visualizar", + "@menuActionConfigureView": {}, "menuActionSelect": "Selecionar", + "@menuActionSelect": {}, "menuActionSelectAll": "Selecionar tudo", + "@menuActionSelectAll": {}, "menuActionSelectNone": "Selecione nenhum", + "@menuActionSelectNone": {}, "menuActionMap": "Mapa", + "@menuActionMap": {}, "menuActionSlideshow": "Apresentação de slides", + "@menuActionSlideshow": {}, "menuActionStats": "Estatísticas", - + "@menuActionStats": {}, "viewDialogSortSectionTitle": "Organizar", + "@viewDialogSortSectionTitle": {}, "viewDialogGroupSectionTitle": "Grupo", + "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "Layout", + "@viewDialogLayoutSectionTitle": {}, "viewDialogReverseSortOrder": "Ordem de classificação inversa", - + "@viewDialogReverseSortOrder": {}, "tileLayoutMosaic": "Mosaico", + "@tileLayoutMosaic": {}, "tileLayoutGrid": "Grid", + "@tileLayoutGrid": {}, "tileLayoutList": "Lista", - + "@tileLayoutList": {}, "coverDialogTabCover": "Capa", + "@coverDialogTabCover": {}, "coverDialogTabApp": "Aplicativo", + "@coverDialogTabApp": {}, "coverDialogTabColor": "Cor", - + "@coverDialogTabColor": {}, "appPickDialogTitle": "Escolha o aplicativo", + "@appPickDialogTitle": {}, "appPickDialogNone": "Nenhum", - + "@appPickDialogNone": {}, "aboutPageTitle": "Sobre", + "@aboutPageTitle": {}, "aboutLinkLicense": "Licença", + "@aboutLinkLicense": {}, "aboutLinkPolicy": "Política de Privacidade", - + "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "Relatório de erro", + "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "Salvar registros de aplicativos em um arquivo", + "@aboutBugSaveLogInstruction": {}, "aboutBugCopyInfoInstruction": "Copiar informações do sistema", + "@aboutBugCopyInfoInstruction": {}, "aboutBugCopyInfoButton": "Copiar", + "@aboutBugCopyInfoButton": {}, "aboutBugReportInstruction": "Relatório no GitHub com os logs e informações do sistema", + "@aboutBugReportInstruction": {}, "aboutBugReportButton": "Relatório", - + "@aboutBugReportButton": {}, "aboutCreditsSectionTitle": "Créditos", + "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "Este aplicativo usa um arquivo de TopoJSON", + "@aboutCreditsWorldAtlas1": {}, "aboutCreditsWorldAtlas2": "sob licença ISC.", + "@aboutCreditsWorldAtlas2": {}, "aboutTranslatorsSectionTitle": "Tradutores", - + "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "Licenças de código aberto", + "@aboutLicensesSectionTitle": {}, "aboutLicensesBanner": "Este aplicativo usa os seguintes pacotes e bibliotecas de código aberto.", + "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "Bibliotecas Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, "aboutLicensesFlutterPluginsSectionTitle": "Plug-ins Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, "aboutLicensesFlutterPackagesSectionTitle": "Pacotes Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, "aboutLicensesDartPackagesSectionTitle": "Pacotes Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "Mostrar todas as licenças", - + "@aboutLicensesShowAllButtonLabel": {}, "policyPageTitle": "Política de Privacidade", - + "@policyPageTitle": {}, "collectionPageTitle": "Coleção", + "@collectionPageTitle": {}, "collectionPickPageTitle": "Escolher", + "@collectionPickPageTitle": {}, "collectionSelectPageTitle": "Selecionar itens", - + "@collectionSelectPageTitle": {}, "collectionActionShowTitleSearch": "Mostrar filtro de título", + "@collectionActionShowTitleSearch": {}, "collectionActionHideTitleSearch": "Ocultar filtro de título", + "@collectionActionHideTitleSearch": {}, "collectionActionAddShortcut": "Adicionar atalho", + "@collectionActionAddShortcut": {}, "collectionActionEmptyBin": "Caixa vazia", + "@collectionActionEmptyBin": {}, "collectionActionCopy": "Copiar para o álbum", + "@collectionActionCopy": {}, "collectionActionMove": "Mover para o álbum", + "@collectionActionMove": {}, "collectionActionRescan": "Reexaminar", + "@collectionActionRescan": {}, "collectionActionEdit": "Editar", - + "@collectionActionEdit": {}, "collectionSearchTitlesHintText": "Pesquisar títulos", - + "@collectionSearchTitlesHintText": {}, "collectionGroupAlbum": "Por álbum", + "@collectionGroupAlbum": {}, "collectionGroupMonth": "Por mês", + "@collectionGroupMonth": {}, "collectionGroupDay": "Por dia", + "@collectionGroupDay": {}, "collectionGroupNone": "Não agrupe", - + "@collectionGroupNone": {}, "sectionUnknown": "Desconhecido", + "@sectionUnknown": {}, "dateToday": "Hoje", + "@dateToday": {}, "dateYesterday": "Ontem", + "@dateYesterday": {}, "dateThisMonth": "Este mês", + "@dateThisMonth": {}, "collectionDeleteFailureFeedback": "{count, plural, =1{Falha ao excluir 1 item} other{Falha ao excluir {count} itens}}", + "@collectionDeleteFailureFeedback": {}, "collectionCopyFailureFeedback": "{count, plural, =1{Falha ao copiar 1 item} other{Falha ao copiar {count} itens}}", + "@collectionCopyFailureFeedback": {}, "collectionMoveFailureFeedback": "{count, plural, =1{Falha ao mover 1 item} other{Falha ao mover {count} itens}}", + "@collectionMoveFailureFeedback": {}, "collectionRenameFailureFeedback": "{count, plural, =1{Falhei em renomear 1 item} other{Falha ao renomear {count} itens}}", + "@collectionRenameFailureFeedback": {}, "collectionEditFailureFeedback": "{count, plural, =1{Falha ao editar 1 item} other{Falha ao editar {count} itens}}", + "@collectionEditFailureFeedback": {}, "collectionExportFailureFeedback": "{count, plural, =1{Falha ao exportar 1 página} other{Falha ao exportar {count} páginas}}", + "@collectionExportFailureFeedback": {}, "collectionCopySuccessFeedback": "{count, plural, =1{1 item copiado} other{Copiado {count} itens}}", + "@collectionCopySuccessFeedback": {}, "collectionMoveSuccessFeedback": "{count, plural, =1{1 item movido} other{Mudou-se {count} itens}}", + "@collectionMoveSuccessFeedback": {}, "collectionRenameSuccessFeedback": "{count, plural, =1{1 item renomeado} other{Renomeado {count} itens}}", + "@collectionRenameSuccessFeedback": {}, "collectionEditSuccessFeedback": "{count, plural, =1{Editado 1 item} other{Editado {count} itens}}", - + "@collectionEditSuccessFeedback": {}, "collectionEmptyFavourites": "Nenhum favorito", + "@collectionEmptyFavourites": {}, "collectionEmptyVideos": "Nenhum video", + "@collectionEmptyVideos": {}, "collectionEmptyImages": "Nenhuma image", + "@collectionEmptyImages": {}, "collectionEmptyGrantAccessButtonLabel": "Garantir acesso", - + "@collectionEmptyGrantAccessButtonLabel": {}, "collectionSelectSectionTooltip": "Selecionar seção", + "@collectionSelectSectionTooltip": {}, "collectionDeselectSectionTooltip": "Desmarcar seção", - + "@collectionDeselectSectionTooltip": {}, "drawerAboutButton": "Sobre", + "@drawerAboutButton": {}, "drawerSettingsButton": "Configurações", + "@drawerSettingsButton": {}, "drawerCollectionAll": "Toda a coleção", + "@drawerCollectionAll": {}, "drawerCollectionFavourites": "Favoritos", + "@drawerCollectionFavourites": {}, "drawerCollectionImages": "Imagens", + "@drawerCollectionImages": {}, "drawerCollectionVideos": "Vídeos", + "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "Animado", + "@drawerCollectionAnimated": {}, "drawerCollectionMotionPhotos": "Fotos em movimento", + "@drawerCollectionMotionPhotos": {}, "drawerCollectionPanoramas": "Panoramas", + "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "Fotos Raw", + "@drawerCollectionRaws": {}, "drawerCollectionSphericalVideos": "360° Videos", + "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "Álbuns", + "@drawerAlbumPage": {}, "drawerCountryPage": "Países", + "@drawerCountryPage": {}, "drawerTagPage": "Etiquetas", - + "@drawerTagPage": {}, "sortByDate": "Por data", + "@sortByDate": {}, "sortByName": "Por nome", + "@sortByName": {}, "sortByItemCount": "Por contagem de itens", + "@sortByItemCount": {}, "sortBySize": "Por tamanho", + "@sortBySize": {}, "sortByAlbumFileName": "Por álbum e nome de arquivo", + "@sortByAlbumFileName": {}, "sortByRating": "Por classificação", - + "@sortByRating": {}, "sortOrderNewestFirst": "Os mais novos primeiro", + "@sortOrderNewestFirst": {}, "sortOrderOldestFirst": "Mais velhos primeiro", + "@sortOrderOldestFirst": {}, "sortOrderAtoZ": "A a Z", + "@sortOrderAtoZ": {}, "sortOrderZtoA": "Z a A", + "@sortOrderZtoA": {}, "sortOrderHighestFirst": "Mais alto primeiro", + "@sortOrderHighestFirst": {}, "sortOrderLowestFirst": "Mais baixo primeiro", + "@sortOrderLowestFirst": {}, "sortOrderLargestFirst": "Maior primeiro", + "@sortOrderLargestFirst": {}, "sortOrderSmallestFirst": "Menor primeiro", - + "@sortOrderSmallestFirst": {}, "albumGroupType": "Por tipo", + "@albumGroupType": {}, "albumGroupTier": "Por nível", + "@albumGroupTier": {}, "albumGroupVolume": "Por volume de armazenamento", + "@albumGroupVolume": {}, "albumGroupNone": "Não agrupe", - + "@albumGroupNone": {}, "albumMimeTypeMixed": "Misturado", - + "@albumMimeTypeMixed": {}, "albumPickPageTitleCopy": "Copiar para o álbum", + "@albumPickPageTitleCopy": {}, "albumPickPageTitleExport": "Exportar para o álbum", + "@albumPickPageTitleExport": {}, "albumPickPageTitleMove": "Mover para o álbum", + "@albumPickPageTitleMove": {}, "albumPickPageTitlePick": "Escolher álbum", - + "@albumPickPageTitlePick": {}, "albumCamera": "Câmera", + "@albumCamera": {}, "albumDownload": "Download", + "@albumDownload": {}, "albumScreenshots": "Capturas de tela", + "@albumScreenshots": {}, "albumScreenRecordings": "Gravações de tela", + "@albumScreenRecordings": {}, "albumVideoCaptures": "Capturas de vídeo", - + "@albumVideoCaptures": {}, "albumPageTitle": "Álbuns", + "@albumPageTitle": {}, "albumEmpty": "Nenhum álbum", + "@albumEmpty": {}, "createAlbumTooltip": "Criar álbum", + "@createAlbumTooltip": {}, "createAlbumButtonLabel": "CRIA", + "@createAlbumButtonLabel": {}, "newFilterBanner": "novo", - + "@newFilterBanner": {}, "countryPageTitle": "Países", + "@countryPageTitle": {}, "countryEmpty": "Nenhum país", - + "@countryEmpty": {}, "tagPageTitle": "Etiquetas", + "@tagPageTitle": {}, "tagEmpty": "Sem etiquetas", - + "@tagEmpty": {}, "binPageTitle": "Lixeira", - + "@binPageTitle": {}, "searchCollectionFieldHint": "Pesquisar coleção", + "@searchCollectionFieldHint": {}, "searchRecentSectionTitle": "Recente", + "@searchRecentSectionTitle": {}, "searchDateSectionTitle": "Data", + "@searchDateSectionTitle": {}, "searchAlbumsSectionTitle": "Álbuns", + "@searchAlbumsSectionTitle": {}, "searchCountriesSectionTitle": "Países", + "@searchCountriesSectionTitle": {}, "searchPlacesSectionTitle": "Locais", + "@searchPlacesSectionTitle": {}, "searchTagsSectionTitle": "Etiquetas", + "@searchTagsSectionTitle": {}, "searchRatingSectionTitle": "Classificações", + "@searchRatingSectionTitle": {}, "searchMetadataSectionTitle": "Metadados", - + "@searchMetadataSectionTitle": {}, "settingsPageTitle": "Configurações", + "@settingsPageTitle": {}, "settingsSystemDefault": "Sistema", + "@settingsSystemDefault": {}, "settingsDefault": "Padrão", + "@settingsDefault": {}, "settingsDisabled": "Desativada", - + "@settingsDisabled": {}, "settingsSearchFieldLabel": "Pesquisar configuração", + "@settingsSearchFieldLabel": {}, "settingsSearchEmpty": "Nenhuma configuração correspondente", + "@settingsSearchEmpty": {}, "settingsActionExport": "Exportar", + "@settingsActionExport": {}, "settingsActionExportDialogTitle": "Exportar", + "@settingsActionExportDialogTitle": {}, "settingsActionImport": "Importar", + "@settingsActionImport": {}, "settingsActionImportDialogTitle": "Importar", - + "@settingsActionImportDialogTitle": {}, "appExportCovers": "Capas", + "@appExportCovers": {}, "appExportFavourites": "Favoritos", + "@appExportFavourites": {}, "appExportSettings": "Configurações", - + "@appExportSettings": {}, "settingsNavigationSectionTitle": "Navegação", + "@settingsNavigationSectionTitle": {}, "settingsHomeTile": "Início", + "@settingsHomeTile": {}, "settingsHomeDialogTitle": "Início", + "@settingsHomeDialogTitle": {}, "settingsShowBottomNavigationBar": "Mostrar barra de navegação inferior", + "@settingsShowBottomNavigationBar": {}, "settingsKeepScreenOnTile": "Manter a tela ligada", + "@settingsKeepScreenOnTile": {}, "settingsKeepScreenOnDialogTitle": "Manter a tela ligada", + "@settingsKeepScreenOnDialogTitle": {}, "settingsDoubleBackExit": "Toque em “voltar” duas vezes para sair", - + "@settingsDoubleBackExit": {}, "settingsConfirmationTile": "Caixas de diálogo de confirmação", + "@settingsConfirmationTile": {}, "settingsConfirmationDialogTitle": "Caixas de diálogo de confirmação", + "@settingsConfirmationDialogTitle": {}, "settingsConfirmationBeforeDeleteItems": "Pergunte antes de excluir itens para sempre", + "@settingsConfirmationBeforeDeleteItems": {}, "settingsConfirmationBeforeMoveToBinItems": "Pergunte antes de mover itens para a lixeira", + "@settingsConfirmationBeforeMoveToBinItems": {}, "settingsConfirmationBeforeMoveUndatedItems": "Pergunte antes de mover itens sem data de metadados", + "@settingsConfirmationBeforeMoveUndatedItems": {}, "settingsConfirmationAfterMoveToBinItems": "Mostrar mensagem depois de mover itens para a lixeira", - + "@settingsConfirmationAfterMoveToBinItems": {}, "settingsNavigationDrawerTile": "Menu de navegação", + "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "Menu de navegação", + "@settingsNavigationDrawerEditorPageTitle": {}, "settingsNavigationDrawerBanner": "Toque e segure para mover e reordenar os itens do menu.", + "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "Tipos", + "@settingsNavigationDrawerTabTypes": {}, "settingsNavigationDrawerTabAlbums": "Álbuns", + "@settingsNavigationDrawerTabAlbums": {}, "settingsNavigationDrawerTabPages": "Páginas", + "@settingsNavigationDrawerTabPages": {}, "settingsNavigationDrawerAddAlbum": "Adicionar álbum", - + "@settingsNavigationDrawerAddAlbum": {}, "settingsThumbnailSectionTitle": "Miniaturas", + "@settingsThumbnailSectionTitle": {}, "settingsThumbnailOverlayTile": "Sobreposição", + "@settingsThumbnailOverlayTile": {}, "settingsThumbnailOverlayPageTitle": "Sobreposição", + "@settingsThumbnailOverlayPageTitle": {}, "settingsThumbnailShowFavouriteIcon": "Mostrar ícone favorito", + "@settingsThumbnailShowFavouriteIcon": {}, "settingsThumbnailShowTagIcon": "Mostrar ícone de etiqueta", + "@settingsThumbnailShowTagIcon": {}, "settingsThumbnailShowLocationIcon": "Mostrar ícone de localização", + "@settingsThumbnailShowLocationIcon": {}, "settingsThumbnailShowMotionPhotoIcon": "Mostrar ícone de foto em movimento", + "@settingsThumbnailShowMotionPhotoIcon": {}, "settingsThumbnailShowRating": "Mostrar classificação", + "@settingsThumbnailShowRating": {}, "settingsThumbnailShowRawIcon": "Mostrar ícone raw", + "@settingsThumbnailShowRawIcon": {}, "settingsThumbnailShowVideoDuration": "Mostrar duração do vídeo", - + "@settingsThumbnailShowVideoDuration": {}, "settingsCollectionQuickActionsTile": "Ações rápidas", + "@settingsCollectionQuickActionsTile": {}, "settingsCollectionQuickActionEditorPageTitle": "Ações rápidas", + "@settingsCollectionQuickActionEditorPageTitle": {}, "settingsCollectionQuickActionTabBrowsing": "Navegando", + "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "Selecionando", + "@settingsCollectionQuickActionTabSelecting": {}, "settingsCollectionBrowsingQuickActionEditorBanner": "Toque e segure para mover os botões e selecionar quais ações são exibidas ao navegar pelos itens.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "Toque e segure para mover os botões e selecionar quais ações são exibidas ao selecionar itens.", - + "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "Visualizador", + "@settingsViewerSectionTitle": {}, "settingsViewerGestureSideTapNext": "Toque nas bordas da tela para mostrar anterior/seguinte", + "@settingsViewerGestureSideTapNext": {}, "settingsViewerUseCutout": "Usar área de recorte", + "@settingsViewerUseCutout": {}, "settingsViewerMaximumBrightness": "Brilho máximo", + "@settingsViewerMaximumBrightness": {}, "settingsMotionPhotoAutoPlay": "Reprodução automática de fotos em movimento", + "@settingsMotionPhotoAutoPlay": {}, "settingsImageBackground": "Plano de fundo da imagem", - + "@settingsImageBackground": {}, "settingsViewerQuickActionsTile": "Ações rápidas", + "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "Ações rápidas", + "@settingsViewerQuickActionEditorPageTitle": {}, "settingsViewerQuickActionEditorBanner": "Toque e segure para mover os botões e selecionar quais ações são exibidas no visualizador.", + "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Botões exibidos", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Botões disponíveis", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, "settingsViewerQuickActionEmpty": "Sem botões", - + "@settingsViewerQuickActionEmpty": {}, "settingsViewerOverlayTile": "Sobreposição", + "@settingsViewerOverlayTile": {}, "settingsViewerOverlayPageTitle": "Sobreposição", + "@settingsViewerOverlayPageTitle": {}, "settingsViewerShowOverlayOnOpening": "Mostrar na abertura", + "@settingsViewerShowOverlayOnOpening": {}, "settingsViewerShowMinimap": "Mostrar minimapa", + "@settingsViewerShowMinimap": {}, "settingsViewerShowInformation": "Mostrar informações", + "@settingsViewerShowInformation": {}, "settingsViewerShowInformationSubtitle": "Mostrar título, data, local, etc.", + "@settingsViewerShowInformationSubtitle": {}, "settingsViewerShowShootingDetails": "Mostrar detalhes de disparo", + "@settingsViewerShowShootingDetails": {}, "settingsViewerShowOverlayThumbnails": "Mostrar miniaturas", + "@settingsViewerShowOverlayThumbnails": {}, "settingsViewerEnableOverlayBlurEffect": "Efeito de desfoque", - + "@settingsViewerEnableOverlayBlurEffect": {}, "settingsViewerSlideshowTile": "Apresentação de slides", + "@settingsViewerSlideshowTile": {}, "settingsViewerSlideshowPageTitle": "Apresentação de slides", + "@settingsViewerSlideshowPageTitle": {}, "settingsSlideshowRepeat": "Repetir", + "@settingsSlideshowRepeat": {}, "settingsSlideshowShuffle": "Embaralhar", + "@settingsSlideshowShuffle": {}, "settingsSlideshowFillScreen": "Preencher tela", + "@settingsSlideshowFillScreen": {}, "settingsSlideshowAnimatedZoomEffect": "Efeito de zoom animado", + "@settingsSlideshowAnimatedZoomEffect": {}, "settingsSlideshowTransitionTile": "Transição", + "@settingsSlideshowTransitionTile": {}, "settingsSlideshowIntervalTile": "Intervalo", + "@settingsSlideshowIntervalTile": {}, "settingsSlideshowVideoPlaybackTile": "Reprodução de vídeo", + "@settingsSlideshowVideoPlaybackTile": {}, "settingsSlideshowVideoPlaybackDialogTitle": "Reprodução de vídeo", - + "@settingsSlideshowVideoPlaybackDialogTitle": {}, "settingsVideoPageTitle": "Configurações de vídeo", + "@settingsVideoPageTitle": {}, "settingsVideoSectionTitle": "Vídeo", + "@settingsVideoSectionTitle": {}, "settingsVideoShowVideos": "Mostrar vídeos", + "@settingsVideoShowVideos": {}, "settingsVideoEnableHardwareAcceleration": "Aceleraçao do hardware", + "@settingsVideoEnableHardwareAcceleration": {}, "settingsVideoAutoPlay": "Reprodução automática", + "@settingsVideoAutoPlay": {}, "settingsVideoLoopModeTile": "Modo de loop", + "@settingsVideoLoopModeTile": {}, "settingsVideoLoopModeDialogTitle": "Modo de loop", - + "@settingsVideoLoopModeDialogTitle": {}, "settingsSubtitleThemeTile": "Legendas", + "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "Legendas", + "@settingsSubtitleThemePageTitle": {}, "settingsSubtitleThemeSample": "Esta é uma amostra.", + "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "Alinhamento de texto", + "@settingsSubtitleThemeTextAlignmentTile": {}, "settingsSubtitleThemeTextAlignmentDialogTitle": "Alinhamento de Texto", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, "settingsSubtitleThemeTextSize": "Tamanho do texto", + "@settingsSubtitleThemeTextSize": {}, "settingsSubtitleThemeShowOutline": "Mostrar contorno e sombra", + "@settingsSubtitleThemeShowOutline": {}, "settingsSubtitleThemeTextColor": "Cor do texto", + "@settingsSubtitleThemeTextColor": {}, "settingsSubtitleThemeTextOpacity": "Opacidade do texto", + "@settingsSubtitleThemeTextOpacity": {}, "settingsSubtitleThemeBackgroundColor": "Cor de fundo", + "@settingsSubtitleThemeBackgroundColor": {}, "settingsSubtitleThemeBackgroundOpacity": "Opacidade do plano de fundo", + "@settingsSubtitleThemeBackgroundOpacity": {}, "settingsSubtitleThemeTextAlignmentLeft": "Esquerda", + "@settingsSubtitleThemeTextAlignmentLeft": {}, "settingsSubtitleThemeTextAlignmentCenter": "Centro", + "@settingsSubtitleThemeTextAlignmentCenter": {}, "settingsSubtitleThemeTextAlignmentRight": "Direita", - + "@settingsSubtitleThemeTextAlignmentRight": {}, "settingsVideoControlsTile": "Controles", + "@settingsVideoControlsTile": {}, "settingsVideoControlsPageTitle": "Controles", + "@settingsVideoControlsPageTitle": {}, "settingsVideoButtonsTile": "Botões", + "@settingsVideoButtonsTile": {}, "settingsVideoGestureDoubleTapTogglePlay": "Toque duas vezes para reproduzir/pausar", + "@settingsVideoGestureDoubleTapTogglePlay": {}, "settingsVideoGestureSideDoubleTapSeek": "Toque duas vezes nas bordas da tela buscar para trás/para frente", - + "@settingsVideoGestureSideDoubleTapSeek": {}, "settingsPrivacySectionTitle": "Privacidade", + "@settingsPrivacySectionTitle": {}, "settingsAllowInstalledAppAccess": "Permitir acesso ao inventário de aplicativos", + "@settingsAllowInstalledAppAccess": {}, "settingsAllowInstalledAppAccessSubtitle": "Usado para melhorar a exibição do álbum", + "@settingsAllowInstalledAppAccessSubtitle": {}, "settingsAllowErrorReporting": "Permitir relatórios de erros anônimos", + "@settingsAllowErrorReporting": {}, "settingsSaveSearchHistory": "Salvar histórico de pesquisa", + "@settingsSaveSearchHistory": {}, "settingsEnableBin": "Usar lixeira", + "@settingsEnableBin": {}, "settingsEnableBinSubtitle": "Manter itens excluídos por 30 dias", - + "@settingsEnableBinSubtitle": {}, "settingsHiddenItemsTile": "Itens ocultos", + "@settingsHiddenItemsTile": {}, "settingsHiddenItemsPageTitle": "Itens ocultos", - + "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "Filtros ocultos", + "@settingsHiddenItemsTabFilters": {}, "settingsHiddenFiltersBanner": "Fotos e vídeos que correspondem a filtros ocultos não aparecerão em sua coleção.", + "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "Sem filtros ocultos", - + "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "Caminhos Ocultos", + "@settingsHiddenItemsTabPaths": {}, "settingsHiddenPathsBanner": "Fotos e vídeos nessas pastas, ou em qualquer uma de suas subpastas, não aparecerão em sua coleção.", + "@settingsHiddenPathsBanner": {}, "addPathTooltip": "Adicionar caminho", - + "@addPathTooltip": {}, "settingsStorageAccessTile": "Acesso ao armazenamento", + "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "Acesso ao armazenamento", + "@settingsStorageAccessPageTitle": {}, "settingsStorageAccessBanner": "Alguns diretórios exigem uma concessão de acesso explícito para modificar arquivos neles. Você pode revisar aqui os diretórios aos quais você deu acesso anteriormente.", + "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "Sem concessões de acesso", + "@settingsStorageAccessEmpty": {}, "settingsStorageAccessRevokeTooltip": "Revogar", - + "@settingsStorageAccessRevokeTooltip": {}, "settingsAccessibilitySectionTitle": "Acessibilidade", + "@settingsAccessibilitySectionTitle": {}, "settingsRemoveAnimationsTile": "Remover animações", + "@settingsRemoveAnimationsTile": {}, "settingsRemoveAnimationsDialogTitle": "Remover Animações", + "@settingsRemoveAnimationsDialogTitle": {}, "settingsTimeToTakeActionTile": "Tempo para executar uma ação", - + "@settingsTimeToTakeActionTile": {}, "settingsDisplaySectionTitle": "Tela", + "@settingsDisplaySectionTitle": {}, "settingsThemeBrightnessTile": "Tema", + "@settingsThemeBrightnessTile": {}, "settingsThemeBrightnessDialogTitle": "Tema", + "@settingsThemeBrightnessDialogTitle": {}, "settingsThemeColorHighlights": "Destaques de cores", + "@settingsThemeColorHighlights": {}, "settingsThemeEnableDynamicColor": "Cor dinâmica", + "@settingsThemeEnableDynamicColor": {}, "settingsDisplayRefreshRateModeTile": "Taxa de atualização de exibição", + "@settingsDisplayRefreshRateModeTile": {}, "settingsDisplayRefreshRateModeDialogTitle": "Taxa de atualização", - + "@settingsDisplayRefreshRateModeDialogTitle": {}, "settingsLanguageSectionTitle": "Idioma e Formatos", + "@settingsLanguageSectionTitle": {}, "settingsLanguageTile": "Língua", + "@settingsLanguageTile": {}, "settingsLanguagePageTitle": "Língua", + "@settingsLanguagePageTitle": {}, "settingsCoordinateFormatTile": "Formato de coordenadas", + "@settingsCoordinateFormatTile": {}, "settingsCoordinateFormatDialogTitle": "Formato de coordenadas", + "@settingsCoordinateFormatDialogTitle": {}, "settingsUnitSystemTile": "Unidades", + "@settingsUnitSystemTile": {}, "settingsUnitSystemDialogTitle": "Unidades", - + "@settingsUnitSystemDialogTitle": {}, "settingsScreenSaverPageTitle": "Protetor de tela", - + "@settingsScreenSaverPageTitle": {}, "settingsWidgetPageTitle": "Porta-retratos", + "@settingsWidgetPageTitle": {}, "settingsWidgetShowOutline": "Contorno", + "@settingsWidgetShowOutline": {}, "settingsWidgetOpenPage": "Ao tocar no widget", - + "@settingsWidgetOpenPage": {}, "settingsCollectionTile": "Coleção", - + "@settingsCollectionTile": {}, "statsPageTitle": "Estatísticas", + "@statsPageTitle": {}, "statsWithGps": "{count, plural, =1{1 item com localização} other{{count} itens com localização}}", + "@statsWithGps": {}, "statsTopCountriesSectionTitle": "Principais Países", + "@statsTopCountriesSectionTitle": {}, "statsTopPlacesSectionTitle": "Principais Lugares", + "@statsTopPlacesSectionTitle": {}, "statsTopTagsSectionTitle": "Principais Etiquetas", + "@statsTopTagsSectionTitle": {}, "statsTopAlbumsSectionTitle": "Principais Álbuns", - + "@statsTopAlbumsSectionTitle": {}, "viewerOpenPanoramaButtonLabel": "ABRIR PANORAMA", + "@viewerOpenPanoramaButtonLabel": {}, "viewerSetWallpaperButtonLabel": "DEFINIR PAPEL DE PAREDE", + "@viewerSetWallpaperButtonLabel": {}, "viewerErrorUnknown": "Algo não está certo!", + "@viewerErrorUnknown": {}, "viewerErrorDoesNotExist": "O arquivo não existe mais.", - + "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "Informações", + "@viewerInfoPageTitle": {}, "viewerInfoBackToViewerTooltip": "Voltar ao visualizador", - + "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "desconhecido", + "@viewerInfoUnknown": {}, "viewerInfoLabelDescription": "Descrição", + "@viewerInfoLabelDescription": {}, "viewerInfoLabelTitle": "Título", + "@viewerInfoLabelTitle": {}, "viewerInfoLabelDate": "Data", + "@viewerInfoLabelDate": {}, "viewerInfoLabelResolution": "Resolução", + "@viewerInfoLabelResolution": {}, "viewerInfoLabelSize": "Tamanho", + "@viewerInfoLabelSize": {}, "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, "viewerInfoLabelPath": "Caminho", + "@viewerInfoLabelPath": {}, "viewerInfoLabelDuration": "Duração", + "@viewerInfoLabelDuration": {}, "viewerInfoLabelOwner": "Propriedade de", + "@viewerInfoLabelOwner": {}, "viewerInfoLabelCoordinates": "Coordenadas", + "@viewerInfoLabelCoordinates": {}, "viewerInfoLabelAddress": "Endereço", - + "@viewerInfoLabelAddress": {}, "mapStyleDialogTitle": "Estilo do mapa", + "@mapStyleDialogTitle": {}, "mapStyleTooltip": "Selecione o estilo do mapa", + "@mapStyleTooltip": {}, "mapZoomInTooltip": "Mais zoom", + "@mapZoomInTooltip": {}, "mapZoomOutTooltip": "Reduzir o zoom", + "@mapZoomOutTooltip": {}, "mapPointNorthUpTooltip": "Aponte para o norte para cima", + "@mapPointNorthUpTooltip": {}, "mapAttributionOsmHot": "Dados do mapa © [OpenStreetMap](https://www.openstreetmap.org/copyright) colaboradores • Blocos por [HOT](https://www.hotosm.org/) • Hospedado por [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, "mapAttributionStamen": "Dados do mapa © [OpenStreetMap](https://www.openstreetmap.org/copyright) colaboradores • Blocos por [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, "openMapPageTooltip": "Visualizar na página do mapa", + "@openMapPageTooltip": {}, "mapEmptyRegion": "Nenhuma imagem nesta região", - + "@mapEmptyRegion": {}, "viewerInfoOpenEmbeddedFailureFeedback": "Falha ao extrair dados incorporados", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, "viewerInfoOpenLinkText": "Abrir", + "@viewerInfoOpenLinkText": {}, "viewerInfoViewXmlLinkText": "Visualizar XML", - + "@viewerInfoViewXmlLinkText": {}, "viewerInfoSearchFieldLabel": "Pesquisar metadados", + "@viewerInfoSearchFieldLabel": {}, "viewerInfoSearchEmpty": "Nenhuma chave correspondente", + "@viewerInfoSearchEmpty": {}, "viewerInfoSearchSuggestionDate": "Data e Hora", + "@viewerInfoSearchSuggestionDate": {}, "viewerInfoSearchSuggestionDescription": "Descrição", + "@viewerInfoSearchSuggestionDescription": {}, "viewerInfoSearchSuggestionDimensions": "Dimensões", + "@viewerInfoSearchSuggestionDimensions": {}, "viewerInfoSearchSuggestionResolution": "Resolução", + "@viewerInfoSearchSuggestionResolution": {}, "viewerInfoSearchSuggestionRights": "Direitos", - + "@viewerInfoSearchSuggestionRights": {}, "wallpaperUseScrollEffect": "Use o efeito de rolagem na tela inicial", - + "@wallpaperUseScrollEffect": {}, "tagEditorPageTitle": "Editar etiquetas", + "@tagEditorPageTitle": {}, "tagEditorPageNewTagFieldLabel": "Nova etiqueta", + "@tagEditorPageNewTagFieldLabel": {}, "tagEditorPageAddTagTooltip": "Adicionar etiqueta", + "@tagEditorPageAddTagTooltip": {}, "tagEditorSectionRecent": "Recente", - + "@tagEditorSectionRecent": {}, "panoramaEnableSensorControl": "Ativar o controle do sensor", + "@panoramaEnableSensorControl": {}, "panoramaDisableSensorControl": "Desabilitar o controle do sensor", - + "@panoramaDisableSensorControl": {}, "sourceViewerPageTitle": "Fonte", - + "@sourceViewerPageTitle": {}, "filePickerShowHiddenFiles": "Mostrar arquivos ocultos", + "@filePickerShowHiddenFiles": {}, "filePickerDoNotShowHiddenFiles": "Não mostre arquivos ocultos", + "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "Abrir de", + "@filePickerOpenFrom": {}, "filePickerNoItems": "Nenhum itens", - "filePickerUseThisFolder": "Usar esta pasta" + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "Usar esta pasta", + "@filePickerUseThisFolder": {} } diff --git a/lib/l10n/app_pt_BR.arb b/lib/l10n/app_pt_BR.arb new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/lib/l10n/app_pt_BR.arb @@ -0,0 +1 @@ +{} diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 1c7f68575..438970498 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -1,694 +1,1150 @@ { "appName": "Aves", + "@appName": {}, "welcomeMessage": "Добро пожаловать в Aves", + "@welcomeMessage": {}, "welcomeOptional": "Опционально", + "@welcomeOptional": {}, "welcomeTermsToggle": "Я согласен с условиями и положениями", + "@welcomeTermsToggle": {}, "itemCount": "{count, plural, =1{1 объект} few{{count} объекта} other{{count} объектов}}", - + "@itemCount": {}, "timeSeconds": "{seconds, plural, =1{1 секунда} few{{seconds} секунды} other{{seconds} секунд}}", + "@timeSeconds": {}, "timeMinutes": "{minutes, plural, =1{1 минута} few{{minutes} минуты} other{{minutes} минут}}", + "@timeMinutes": {}, "timeDays": "{days, plural, =1{1 день} few{{days} дня} other{{days} дней}}", + "@timeDays": {}, "focalLength": "{length} mm", - + "@focalLength": {}, "applyButtonLabel": "ПРИМЕНИТЬ", + "@applyButtonLabel": {}, "deleteButtonLabel": "УДАЛИТЬ", + "@deleteButtonLabel": {}, "nextButtonLabel": "ДАЛЕЕ", + "@nextButtonLabel": {}, "showButtonLabel": "ПОКАЗАТЬ", + "@showButtonLabel": {}, "hideButtonLabel": "СКРЫТЬ", + "@hideButtonLabel": {}, "continueButtonLabel": "ПРОДОЛЖИТЬ", - + "@continueButtonLabel": {}, "cancelTooltip": "Отмена", + "@cancelTooltip": {}, "changeTooltip": "Изменить", + "@changeTooltip": {}, "clearTooltip": "Очистить", + "@clearTooltip": {}, "previousTooltip": "Предыдущий", + "@previousTooltip": {}, "nextTooltip": "Следующий", + "@nextTooltip": {}, "showTooltip": "Показать", + "@showTooltip": {}, "hideTooltip": "Скрыть", + "@hideTooltip": {}, "actionRemove": "Удалить", + "@actionRemove": {}, "resetTooltip": "Сбросить", + "@resetTooltip": {}, "saveTooltip": "Сохранить", + "@saveTooltip": {}, "pickTooltip": "Выбрать", - + "@pickTooltip": {}, "doubleBackExitMessage": "Нажмите «Назад» еще раз, чтобы выйти.", + "@doubleBackExitMessage": {}, "doNotAskAgain": "Больше не спрашивать", - + "@doNotAskAgain": {}, "sourceStateLoading": "Загрузка", + "@sourceStateLoading": {}, "sourceStateCataloguing": "Каталогизация", + "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "Расположение стран", + "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "Расположение локаций", - + "@sourceStateLocatingPlaces": {}, "chipActionDelete": "Удалить", + "@chipActionDelete": {}, "chipActionGoToAlbumPage": "Показать в Альбомах", + "@chipActionGoToAlbumPage": {}, "chipActionGoToCountryPage": "Показать в Странах", + "@chipActionGoToCountryPage": {}, "chipActionGoToTagPage": "Показать в тегах", + "@chipActionGoToTagPage": {}, "chipActionFilterOut": "Исключить", + "@chipActionFilterOut": {}, "chipActionFilterIn": "Включить", + "@chipActionFilterIn": {}, "chipActionHide": "Скрыть", + "@chipActionHide": {}, "chipActionPin": "Закрепить", + "@chipActionPin": {}, "chipActionUnpin": "Открепить", + "@chipActionUnpin": {}, "chipActionRename": "Переименовать", + "@chipActionRename": {}, "chipActionSetCover": "Установить обложку", + "@chipActionSetCover": {}, "chipActionCreateAlbum": "Создать альбом", - + "@chipActionCreateAlbum": {}, "entryActionCopyToClipboard": "Скопировать в буфер обмена", + "@entryActionCopyToClipboard": {}, "entryActionDelete": "Удалить", + "@entryActionDelete": {}, "entryActionConvert": "Конвертировать", + "@entryActionConvert": {}, "entryActionExport": "Экспорт", + "@entryActionExport": {}, "entryActionInfo": "Информация", + "@entryActionInfo": {}, "entryActionRename": "Переименовать", + "@entryActionRename": {}, "entryActionRestore": "Восстановить", + "@entryActionRestore": {}, "entryActionRotateCCW": "Повернуть против часовой стрелки", + "@entryActionRotateCCW": {}, "entryActionRotateCW": "Повернуть по часовой стрелки", + "@entryActionRotateCW": {}, "entryActionFlip": "Отразить по горизонтали", + "@entryActionFlip": {}, "entryActionPrint": "Печать", + "@entryActionPrint": {}, "entryActionShare": "Поделиться", + "@entryActionShare": {}, "entryActionViewSource": "Посмотреть источник", + "@entryActionViewSource": {}, "entryActionShowGeoTiffOnMap": "Показать на карте", + "@entryActionShowGeoTiffOnMap": {}, "entryActionConvertMotionPhotoToStillImage": "Конвертировать в статичное изображение", + "@entryActionConvertMotionPhotoToStillImage": {}, "entryActionViewMotionPhotoVideo": "Открыть видео", + "@entryActionViewMotionPhotoVideo": {}, "entryActionEdit": "Изменить", + "@entryActionEdit": {}, "entryActionOpen": "Открыть с помощью", + "@entryActionOpen": {}, "entryActionSetAs": "Установить как", + "@entryActionSetAs": {}, "entryActionOpenMap": "Показать на карте", + "@entryActionOpenMap": {}, "entryActionRotateScreen": "Повернуть экран", + "@entryActionRotateScreen": {}, "entryActionAddFavourite": "Добавить в избранное", + "@entryActionAddFavourite": {}, "entryActionRemoveFavourite": "Удалить из избранного", - + "@entryActionRemoveFavourite": {}, "videoActionCaptureFrame": "Сохранить кадр", + "@videoActionCaptureFrame": {}, "videoActionMute": "Выключить звук", + "@videoActionMute": {}, "videoActionUnmute": "Включить звук", + "@videoActionUnmute": {}, "videoActionPause": "Стоп", + "@videoActionPause": {}, "videoActionPlay": "Играть", + "@videoActionPlay": {}, "videoActionReplay10": "Перемотка на 10 секунд назад", + "@videoActionReplay10": {}, "videoActionSkip10": "Перемотка на 10 секунд вперёд", + "@videoActionSkip10": {}, "videoActionSelectStreams": "Выбрать дорожку", + "@videoActionSelectStreams": {}, "videoActionSetSpeed": "Скорость вопспроизведения", + "@videoActionSetSpeed": {}, "videoActionSettings": "Настройки", - + "@videoActionSettings": {}, "slideshowActionResume": "Продолжить", + "@slideshowActionResume": {}, "slideshowActionShowInCollection": "Показать в Коллекции", - + "@slideshowActionShowInCollection": {}, "entryInfoActionEditDate": "Изменить дату и время", + "@entryInfoActionEditDate": {}, "entryInfoActionEditLocation": "Изменить местоположение", + "@entryInfoActionEditLocation": {}, "entryInfoActionEditTitleDescription": "Изменить название & описание", + "@entryInfoActionEditTitleDescription": {}, "entryInfoActionEditRating": "Изменить рейтинг", + "@entryInfoActionEditRating": {}, "entryInfoActionEditTags": "Изменить теги", + "@entryInfoActionEditTags": {}, "entryInfoActionRemoveMetadata": "Удалить метаданные", - + "@entryInfoActionRemoveMetadata": {}, "filterBinLabel": "Корзина", + "@filterBinLabel": {}, "filterFavouriteLabel": "Избранное", + "@filterFavouriteLabel": {}, "filterNoDateLabel": "Без даты", + "@filterNoDateLabel": {}, "filterNoLocationLabel": "Без местоположения", + "@filterNoLocationLabel": {}, "filterNoRatingLabel": "Без рейтинга", + "@filterNoRatingLabel": {}, "filterNoTagLabel": "Без тегов", + "@filterNoTagLabel": {}, "filterNoTitleLabel": "Без названия", + "@filterNoTitleLabel": {}, "filterOnThisDayLabel": "В этот день", + "@filterOnThisDayLabel": {}, "filterRecentlyAddedLabel": "Недавно добавленные", + "@filterRecentlyAddedLabel": {}, "filterRatingRejectedLabel": "Отклонённое", + "@filterRatingRejectedLabel": {}, "filterTypeAnimatedLabel": "GIF", + "@filterTypeAnimatedLabel": {}, "filterTypeMotionPhotoLabel": "Живое фото", + "@filterTypeMotionPhotoLabel": {}, "filterTypePanoramaLabel": "Панорама", + "@filterTypePanoramaLabel": {}, "filterTypeRawLabel": "RAW", + "@filterTypeRawLabel": {}, "filterTypeSphericalVideoLabel": "360° видео", + "@filterTypeSphericalVideoLabel": {}, "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, "filterMimeImageLabel": "Изображение", + "@filterMimeImageLabel": {}, "filterMimeVideoLabel": "Видео", - + "@filterMimeVideoLabel": {}, "coordinateFormatDms": "Градусы, минуты и секунды", + "@coordinateFormatDms": {}, "coordinateFormatDecimal": "Десятичные градусы", + "@coordinateFormatDecimal": {}, "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, "coordinateDmsNorth": "с. ш.", + "@coordinateDmsNorth": {}, "coordinateDmsSouth": "ю. ш.", + "@coordinateDmsSouth": {}, "coordinateDmsEast": "в. д.", + "@coordinateDmsEast": {}, "coordinateDmsWest": "з. д.", - + "@coordinateDmsWest": {}, "unitSystemMetric": "Метрические", + "@unitSystemMetric": {}, "unitSystemImperial": "Имперские", - + "@unitSystemImperial": {}, "videoLoopModeNever": "Никогда", + "@videoLoopModeNever": {}, "videoLoopModeShortOnly": "Только для коротких видео", + "@videoLoopModeShortOnly": {}, "videoLoopModeAlways": "Всегда", - + "@videoLoopModeAlways": {}, "videoControlsPlay": "Воспроизведение", + "@videoControlsPlay": {}, "videoControlsPlaySeek": "Воспроизведение и переход на позицию", + "@videoControlsPlaySeek": {}, "videoControlsPlayOutside": "Открыть в другом видеоплеере", + "@videoControlsPlayOutside": {}, "videoControlsNone": "Ничего", - + "@videoControlsNone": {}, "mapStyleGoogleNormal": "Google Карты", + "@mapStyleGoogleNormal": {}, "mapStyleGoogleHybrid": "Google Карты (Гибридный)", + "@mapStyleGoogleHybrid": {}, "mapStyleGoogleTerrain": "Google Карты (Местность)", + "@mapStyleGoogleTerrain": {}, "mapStyleHuaweiNormal": "Petal Карты", + "@mapStyleHuaweiNormal": {}, "mapStyleHuaweiTerrain": "Petal Карты (Местность)", + "@mapStyleHuaweiTerrain": {}, "mapStyleOsmHot": "Команда гуманитарной картопомощи", + "@mapStyleOsmHot": {}, "mapStyleStamenToner": "Stamen Toner", + "@mapStyleStamenToner": {}, "mapStyleStamenWatercolor": "Stamen Watercolor", - + "@mapStyleStamenWatercolor": {}, "nameConflictStrategyRename": "Переименовать", + "@nameConflictStrategyRename": {}, "nameConflictStrategyReplace": "Заменить", + "@nameConflictStrategyReplace": {}, "nameConflictStrategySkip": "Пропустить", - + "@nameConflictStrategySkip": {}, "keepScreenOnNever": "Никогда", + "@keepScreenOnNever": {}, "keepScreenOnViewerOnly": "Только в просмотрщике", + "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "Всегда", - + "@keepScreenOnAlways": {}, "accessibilityAnimationsRemove": "Предотвратить экранные эффекты", + "@accessibilityAnimationsRemove": {}, "accessibilityAnimationsKeep": "Сохранить экранные эффекты", - + "@accessibilityAnimationsKeep": {}, "displayRefreshRatePreferHighest": "Наивысшая частота", + "@displayRefreshRatePreferHighest": {}, "displayRefreshRatePreferLowest": "Наименьшая частота", - + "@displayRefreshRatePreferLowest": {}, "videoPlaybackSkip": "Пропустить", + "@videoPlaybackSkip": {}, "videoPlaybackMuted": "Играть без звука", + "@videoPlaybackMuted": {}, "videoPlaybackWithSound": "Играть со звуком", - + "@videoPlaybackWithSound": {}, "themeBrightnessLight": "Светлая", + "@themeBrightnessLight": {}, "themeBrightnessDark": "Тёмная", + "@themeBrightnessDark": {}, "themeBrightnessBlack": "Чёрная", - + "@themeBrightnessBlack": {}, "viewerTransitionSlide": "Скольжение", + "@viewerTransitionSlide": {}, "viewerTransitionParallax": "Параллакс", + "@viewerTransitionParallax": {}, "viewerTransitionFade": "Затухание", + "@viewerTransitionFade": {}, "viewerTransitionZoomIn": "Приближение", + "@viewerTransitionZoomIn": {}, "viewerTransitionNone": "Нет", - + "@viewerTransitionNone": {}, "wallpaperTargetHome": "Домашний экран", + "@wallpaperTargetHome": {}, "wallpaperTargetLock": "Экран блокировки", + "@wallpaperTargetLock": {}, "wallpaperTargetHomeLock": "Домашний экран и экран блокировки", - + "@wallpaperTargetHomeLock": {}, "widgetOpenPageHome": "Открыть главную страницу", + "@widgetOpenPageHome": {}, "widgetOpenPageViewer": "Просмотр текущего", - + "@widgetOpenPageViewer": {}, "albumTierNew": "Новые", + "@albumTierNew": {}, "albumTierPinned": "Закрепленные", + "@albumTierPinned": {}, "albumTierSpecial": "Стандартные", + "@albumTierSpecial": {}, "albumTierApps": "Приложения", + "@albumTierApps": {}, "albumTierRegular": "Другие", - + "@albumTierRegular": {}, "storageVolumeDescriptionFallbackPrimary": "Внутренняя память", + "@storageVolumeDescriptionFallbackPrimary": {}, "storageVolumeDescriptionFallbackNonPrimary": "SD-карта", + "@storageVolumeDescriptionFallbackNonPrimary": {}, "rootDirectoryDescription": "корневой каталог", + "@rootDirectoryDescription": {}, "otherDirectoryDescription": "каталог «{name}»", + "@otherDirectoryDescription": {}, "storageAccessDialogMessage": "Пожалуйста, выберите {directory} на накопителе «{volume}» на следующем экране, чтобы предоставить этому приложению доступ к нему.", + "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "Этому приложению не разрешается изменять файлы в каталоге {directory} накопителя «{volume}».\n\nПожалуйста, используйте предустановленный файловый менеджер или галерею, чтобы переместить объекты в другой каталог.", + "@restrictedAccessDialogMessage": {}, "notEnoughSpaceDialogMessage": "Для завершения этой операции требуется {neededSize} свободного места на «{volume}», но осталось только {freeSize}.", + "@notEnoughSpaceDialogMessage": {}, "missingSystemFilePickerDialogMessage": "Системное приложение выбора файлов отсутствует или отключено. Пожалуйста, включите его и повторите попытку.", - + "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, =1{Эта операция не поддерживается для объектов следующего формата: {types}.} other{Эта операция не поддерживается для объектов следующих форматов: {types}.}}", - + "@unsupportedTypeDialogMessage": {}, "nameConflictDialogSingleSourceMessage": "Некоторые файлы в папке назначения имеют одно и то же имя.", + "@nameConflictDialogSingleSourceMessage": {}, "nameConflictDialogMultipleSourceMessage": "Некоторые файлы имеют одно и то же имя.", - + "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "Название ярлыка", + "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "СОЗДАТЬ", - + "@addShortcutButtonLabel": {}, "noMatchingAppDialogMessage": "Нет приложений, которые могли бы с этим справиться.", - + "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{Переместить этот объект в корзину?} few{Переместить эти {count} объекта в корзину?} other{Переместить эти {count} объектов в корзину?}}", + "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Вы уверены, что хотите удалить этот объект?} few{Вы уверены, что хотите удалить эти {count} объекта?} other{Вы уверены, что хотите удалить эти {count} объектов?}}", + "@deleteEntriesConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogMessage": "Некоторые объекты не имеют даты в метаданных. Их текущая дата будет сброшена с помощью этой операции, если не задана дата в метаданных.", + "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Установить дату", - + "@moveUndatedConfirmationDialogSetDate": {}, "videoResumeDialogMessage": "Хотите ли вы возобновить воспроизведение на {time}?", + "@videoResumeDialogMessage": {}, "videoStartOverButtonLabel": "ВОСПРОИЗВЕСТИ СНАЧАЛА", + "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "ПРОДОЛЖИТЬ", - + "@videoResumeButtonLabel": {}, "setCoverDialogLatest": "Последний объект", + "@setCoverDialogLatest": {}, "setCoverDialogAuto": "Авто", + "@setCoverDialogAuto": {}, "setCoverDialogCustom": "Собственная", - + "@setCoverDialogCustom": {}, "hideFilterConfirmationDialogMessage": "Соответствующие фотографии и видео будут скрыты из вашей коллекции. Вы можете показать их снова в настройках в разделе «Конфиденциальность».\n\nВы уверены, что хотите их скрыть?", - + "@hideFilterConfirmationDialogMessage": {}, "newAlbumDialogTitle": "Новый альбом", + "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "Название альбома", + "@newAlbumDialogNameLabel": {}, "newAlbumDialogNameLabelAlreadyExistsHelper": "Каталог уже существует", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "Накопитель:", - + "@newAlbumDialogStorageLabel": {}, "renameAlbumDialogLabel": "Новое название", + "@renameAlbumDialogLabel": {}, "renameAlbumDialogLabelAlreadyExistsHelper": "Каталог уже существует", - + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, "renameEntrySetPageTitle": "Переименовать", + "@renameEntrySetPageTitle": {}, "renameEntrySetPagePatternFieldLabel": "Образец наименования", + "@renameEntrySetPagePatternFieldLabel": {}, "renameEntrySetPageInsertTooltip": "Вставить поле", + "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "Предпросмотр", - + "@renameEntrySetPagePreviewSectionTitle": {}, "renameProcessorCounter": "Счётчик", + "@renameProcessorCounter": {}, "renameProcessorName": "Название", - + "@renameProcessorName": {}, "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Вы уверены, что хотите удалить этот альбом и его объект?} few{Вы уверены, что хотите удалить этот альбом и его {count} объекта?} other{Вы уверены, что хотите удалить этот альбом и его {count} объектов?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Вы уверены, что хотите удалить эти альбомы и их объекты?} few{Вы уверены, что хотите удалить эти альбомы и их {count} объекта?} other{Вы уверены, что хотите удалить эти альбомы и их {count} объектов?}}", - + "@deleteMultiAlbumConfirmationDialogMessage": {}, "exportEntryDialogFormat": "Формат:", + "@exportEntryDialogFormat": {}, "exportEntryDialogWidth": "Ширина", + "@exportEntryDialogWidth": {}, "exportEntryDialogHeight": "Высота", - + "@exportEntryDialogHeight": {}, "renameEntryDialogLabel": "Новое название", - + "@renameEntryDialogLabel": {}, "editEntryDialogTargetFieldsHeader": "Поля для изменения", - + "@editEntryDialogTargetFieldsHeader": {}, "editEntryDateDialogTitle": "Дата и время", + "@editEntryDateDialogTitle": {}, "editEntryDateDialogSetCustom": "Установить дату", + "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Копировать с другой даты", + "@editEntryDateDialogCopyField": {}, "editEntryDateDialogCopyItem": "Скопировать из другого объекта", + "@editEntryDateDialogCopyItem": {}, "editEntryDateDialogExtractFromTitle": "Извлечь из названия", + "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Сдвиг", + "@editEntryDateDialogShift": {}, "editEntryDateDialogSourceFileModifiedDate": "Дата изменения файла", - + "@editEntryDateDialogSourceFileModifiedDate": {}, "durationDialogHours": "Часов", + "@durationDialogHours": {}, "durationDialogMinutes": "Минут", - + "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Местоположение", + "@editEntryLocationDialogTitle": {}, "editEntryLocationDialogChooseOnMapTooltip": "Выбрать на карте", + "@editEntryLocationDialogChooseOnMapTooltip": {}, "editEntryLocationDialogLatitude": "Широта", + "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Долгота", - + "@editEntryLocationDialogLongitude": {}, "locationPickerUseThisLocationButton": "Использовать это местоположение", - + "@locationPickerUseThisLocationButton": {}, "editEntryRatingDialogTitle": "Рейтинг", - + "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "Удаление метаданных", + "@removeEntryMetadataDialogTitle": {}, "removeEntryMetadataDialogMore": "Дополнительно", - + "@removeEntryMetadataDialogMore": {}, "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "Для воспроизведения видео внутри этой живой фотографии требуется XMP профиль.\n\nВы уверены, что хотите удалить его?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, "convertMotionPhotoToStillImageWarningDialogMessage": "Вы уверены?", - + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, "videoSpeedDialogLabel": "Скорость воспроизведения", - + "@videoSpeedDialogLabel": {}, "videoStreamSelectionDialogVideo": "Видео", + "@videoStreamSelectionDialogVideo": {}, "videoStreamSelectionDialogAudio": "Аудио", + "@videoStreamSelectionDialogAudio": {}, "videoStreamSelectionDialogText": "Субтитры", + "@videoStreamSelectionDialogText": {}, "videoStreamSelectionDialogOff": "Отключено", + "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "Дорожка", + "@videoStreamSelectionDialogTrack": {}, "videoStreamSelectionDialogNoSelection": "Других дорожек нет.", - + "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "Выполнено!", + "@genericSuccessFeedback": {}, "genericFailureFeedback": "Не удалось", - + "@genericFailureFeedback": {}, "menuActionConfigureView": "Вид", + "@menuActionConfigureView": {}, "menuActionSelect": "Выбрать", + "@menuActionSelect": {}, "menuActionSelectAll": "Выбрать все", + "@menuActionSelectAll": {}, "menuActionSelectNone": "Снять выделение", + "@menuActionSelectNone": {}, "menuActionMap": "Карта", + "@menuActionMap": {}, "menuActionSlideshow": "Слайд-шоу", + "@menuActionSlideshow": {}, "menuActionStats": "Статистика", - + "@menuActionStats": {}, "viewDialogSortSectionTitle": "Сортировка", + "@viewDialogSortSectionTitle": {}, "viewDialogGroupSectionTitle": "Группировка", + "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "Макет", + "@viewDialogLayoutSectionTitle": {}, "viewDialogReverseSortOrder": "Обратный порядок сортировки", - + "@viewDialogReverseSortOrder": {}, "tileLayoutMosaic": "Мозайка", + "@tileLayoutMosaic": {}, "tileLayoutGrid": "Сетка", + "@tileLayoutGrid": {}, "tileLayoutList": "Список", - + "@tileLayoutList": {}, "coverDialogTabCover": "Обложка", + "@coverDialogTabCover": {}, "coverDialogTabApp": "Приложение", + "@coverDialogTabApp": {}, "coverDialogTabColor": "Цвет", - + "@coverDialogTabColor": {}, "appPickDialogTitle": "Выберите приложение", + "@appPickDialogTitle": {}, "appPickDialogNone": "Ничего", - + "@appPickDialogNone": {}, "aboutPageTitle": "О нас", + "@aboutPageTitle": {}, "aboutLinkLicense": "Лицензия", + "@aboutLinkLicense": {}, "aboutLinkPolicy": "Политика конфиденциальности", - + "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "Отчет об ошибке", + "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "Сохраните логи приложения в файл", + "@aboutBugSaveLogInstruction": {}, "aboutBugCopyInfoInstruction": "Скопируйте системную информацию", + "@aboutBugCopyInfoInstruction": {}, "aboutBugCopyInfoButton": "Скопировать", + "@aboutBugCopyInfoButton": {}, "aboutBugReportInstruction": "Отправьте отчёт об ошибке на GitHub вместе с логами и системной информацией", + "@aboutBugReportInstruction": {}, "aboutBugReportButton": "Отправить", - + "@aboutBugReportButton": {}, "aboutCreditsSectionTitle": "Благодарности", + "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "Это приложение использует файл TopoJSON из", + "@aboutCreditsWorldAtlas1": {}, "aboutCreditsWorldAtlas2": "под лицензией ISC.", + "@aboutCreditsWorldAtlas2": {}, "aboutTranslatorsSectionTitle": "Переводчики", - + "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "Лицензии с открытым исходным кодом", + "@aboutLicensesSectionTitle": {}, "aboutLicensesBanner": "Это приложение использует следующие пакеты и библиотеки с открытым исходным кодом.", + "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "Библиотеки Android", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, "aboutLicensesFlutterPluginsSectionTitle": "Плагины Flutter", + "@aboutLicensesFlutterPluginsSectionTitle": {}, "aboutLicensesFlutterPackagesSectionTitle": "Пакеты Flutter", + "@aboutLicensesFlutterPackagesSectionTitle": {}, "aboutLicensesDartPackagesSectionTitle": "Пакеты Dart", + "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "Показать все лицензии", - + "@aboutLicensesShowAllButtonLabel": {}, "policyPageTitle": "Политика конфиденциальности", - + "@policyPageTitle": {}, "collectionPageTitle": "Коллекция", + "@collectionPageTitle": {}, "collectionPickPageTitle": "Выбрать", + "@collectionPickPageTitle": {}, "collectionSelectPageTitle": "Выберите объекты", - + "@collectionSelectPageTitle": {}, "collectionActionShowTitleSearch": "Показать фильтр заголовка", + "@collectionActionShowTitleSearch": {}, "collectionActionHideTitleSearch": "Скрыть фильтр заголовка", + "@collectionActionHideTitleSearch": {}, "collectionActionAddShortcut": "Добавить ярлык", + "@collectionActionAddShortcut": {}, "collectionActionEmptyBin": "Очистить корзину", + "@collectionActionEmptyBin": {}, "collectionActionCopy": "Скопировать в альбом", + "@collectionActionCopy": {}, "collectionActionMove": "Переместить в альбом", + "@collectionActionMove": {}, "collectionActionRescan": "Пересканировать", + "@collectionActionRescan": {}, "collectionActionEdit": "Изменить", - + "@collectionActionEdit": {}, "collectionSearchTitlesHintText": "Поиск заголовков", - + "@collectionSearchTitlesHintText": {}, "collectionGroupAlbum": "По альбому", + "@collectionGroupAlbum": {}, "collectionGroupMonth": "По месяцу", + "@collectionGroupMonth": {}, "collectionGroupDay": "По дню", + "@collectionGroupDay": {}, "collectionGroupNone": "Не группировать", - + "@collectionGroupNone": {}, "sectionUnknown": "Неизвестно", + "@sectionUnknown": {}, "dateToday": "Сегодня", + "@dateToday": {}, "dateYesterday": "Вчера", + "@dateYesterday": {}, "dateThisMonth": "В этом месяце", + "@dateThisMonth": {}, "collectionDeleteFailureFeedback": "{count, plural, =1{Не удалось удалить 1 объект} few{Не удалось удалить {count} объекта} other{Не удалось удалить {count} объектов}}", + "@collectionDeleteFailureFeedback": {}, "collectionCopyFailureFeedback": "{count, plural, =1{Не удалось скопировать 1 объект} few{Не удалось скопировать {count} объекта} other{Не удалось скопировать {count} объектов}}", + "@collectionCopyFailureFeedback": {}, "collectionMoveFailureFeedback": "{count, plural, =1{Не удалось переместить 1 объект} few{Не удалось переместить {count} объекта} other{Не удалось переместить {count} объектов}}", + "@collectionMoveFailureFeedback": {}, "collectionRenameFailureFeedback": "{count, plural, =1{Не удалось переименовать 1 объект} few{Не удалось переименовать (count) объекта} other{Не удалось переименовать (count) объектов}}", + "@collectionRenameFailureFeedback": {}, "collectionEditFailureFeedback": "{count, plural, =1{Не удалось изменить 1 объект} few{Не удалось изменить {count} объекта} other{Не удалось изменить {count} объектов}}", + "@collectionEditFailureFeedback": {}, "collectionExportFailureFeedback": "{count, plural, =1{Не удалось экспортировать 1 страницу} few{Не удалось экспортировать {count} страницы} other{Не удалось экспортировать {count} страниц}}", + "@collectionExportFailureFeedback": {}, "collectionCopySuccessFeedback": "{count, plural, =1{Скопирован 1 объект} few{Скопировано {count} объекта} other{Скопировано {count} объектов}}", + "@collectionCopySuccessFeedback": {}, "collectionMoveSuccessFeedback": "{count, plural, =1{Перемещён 1 объект} few{Перемещено {count} объекта} other{Перемещено {count} объектов}}", + "@collectionMoveSuccessFeedback": {}, "collectionRenameSuccessFeedback": "{count, plural, =1{Переименован 1 объект} few{Переименовао {count} объекта} other{Переименовано {count} объектов}}", + "@collectionRenameSuccessFeedback": {}, "collectionEditSuccessFeedback": "{count, plural, =1{Изменён 1 объект} few{Изменено {count} объекта} other{Изменено {count} объектов}}", - + "@collectionEditSuccessFeedback": {}, "collectionEmptyFavourites": "Нет избранных", + "@collectionEmptyFavourites": {}, "collectionEmptyVideos": "Нет видео", + "@collectionEmptyVideos": {}, "collectionEmptyImages": "Нет изображений", + "@collectionEmptyImages": {}, "collectionEmptyGrantAccessButtonLabel": "Предоставить доступ", - + "@collectionEmptyGrantAccessButtonLabel": {}, "collectionSelectSectionTooltip": "Выбрать раздел", + "@collectionSelectSectionTooltip": {}, "collectionDeselectSectionTooltip": "Снять выбор с раздела", - + "@collectionDeselectSectionTooltip": {}, "drawerAboutButton": "О нас", + "@drawerAboutButton": {}, "drawerSettingsButton": "Настройки", + "@drawerSettingsButton": {}, "drawerCollectionAll": "Вся коллекция", + "@drawerCollectionAll": {}, "drawerCollectionFavourites": "Избранное", + "@drawerCollectionFavourites": {}, "drawerCollectionImages": "Изображения", + "@drawerCollectionImages": {}, "drawerCollectionVideos": "Видео", + "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "GIF", + "@drawerCollectionAnimated": {}, "drawerCollectionMotionPhotos": "Живые фото", + "@drawerCollectionMotionPhotos": {}, "drawerCollectionPanoramas": "Панорамы", + "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "RAW", + "@drawerCollectionRaws": {}, "drawerCollectionSphericalVideos": "360° видео", + "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "Альбомы", + "@drawerAlbumPage": {}, "drawerCountryPage": "Страны", + "@drawerCountryPage": {}, "drawerTagPage": "Теги", - + "@drawerTagPage": {}, "sortByDate": "По дате", + "@sortByDate": {}, "sortByName": "По названию", + "@sortByName": {}, "sortByItemCount": "По количеству объектов", + "@sortByItemCount": {}, "sortBySize": "По размеру", + "@sortBySize": {}, "sortByAlbumFileName": "По имени альбома и файла", + "@sortByAlbumFileName": {}, "sortByRating": "По рейтингу", - + "@sortByRating": {}, "sortOrderNewestFirst": "Сначала новые", + "@sortOrderNewestFirst": {}, "sortOrderOldestFirst": "Сначала старые", + "@sortOrderOldestFirst": {}, "sortOrderAtoZ": "От А до Я", + "@sortOrderAtoZ": {}, "sortOrderZtoA": "От Я до А", + "@sortOrderZtoA": {}, "sortOrderHighestFirst": "Сначала с высоким", + "@sortOrderHighestFirst": {}, "sortOrderLowestFirst": "Сначала с низким", + "@sortOrderLowestFirst": {}, "sortOrderLargestFirst": "Сначала большие", + "@sortOrderLargestFirst": {}, "sortOrderSmallestFirst": "Сначала маленькие", - + "@sortOrderSmallestFirst": {}, "albumGroupTier": "По уровню", + "@albumGroupTier": {}, "albumGroupType": "По типу", + "@albumGroupType": {}, "albumGroupVolume": "По накопителю", + "@albumGroupVolume": {}, "albumGroupNone": "Не группировать", - + "@albumGroupNone": {}, "albumMimeTypeMixed": "Разное", - + "@albumMimeTypeMixed": {}, "albumPickPageTitleCopy": "Копировать в альбом", + "@albumPickPageTitleCopy": {}, "albumPickPageTitleExport": "Экспорт в альбом", + "@albumPickPageTitleExport": {}, "albumPickPageTitleMove": "Переместить в альбом", + "@albumPickPageTitleMove": {}, "albumPickPageTitlePick": "Выберите альбом", - + "@albumPickPageTitlePick": {}, "albumCamera": "Камера", + "@albumCamera": {}, "albumDownload": "Загрузки", + "@albumDownload": {}, "albumScreenshots": "Скриншоты", + "@albumScreenshots": {}, "albumScreenRecordings": "Записи экрана", + "@albumScreenRecordings": {}, "albumVideoCaptures": "Видеозаписи", - + "@albumVideoCaptures": {}, "albumPageTitle": "Альбомы", + "@albumPageTitle": {}, "albumEmpty": "Нет альбомов", + "@albumEmpty": {}, "createAlbumTooltip": "Создать альбом", + "@createAlbumTooltip": {}, "createAlbumButtonLabel": "СОЗДАТЬ", + "@createAlbumButtonLabel": {}, "newFilterBanner": "новый", - + "@newFilterBanner": {}, "countryPageTitle": "Страны", + "@countryPageTitle": {}, "countryEmpty": "Нет стран", - + "@countryEmpty": {}, "tagPageTitle": "Теги", + "@tagPageTitle": {}, "tagEmpty": "Нет тегов", - + "@tagEmpty": {}, "binPageTitle": "Корзина", - + "@binPageTitle": {}, "searchCollectionFieldHint": "Поиск по коллекции", + "@searchCollectionFieldHint": {}, "searchRecentSectionTitle": "Недавние", + "@searchRecentSectionTitle": {}, "searchDateSectionTitle": "Дата", + "@searchDateSectionTitle": {}, "searchAlbumsSectionTitle": "Альбомы", + "@searchAlbumsSectionTitle": {}, "searchCountriesSectionTitle": "Страны", + "@searchCountriesSectionTitle": {}, "searchPlacesSectionTitle": "Локации", + "@searchPlacesSectionTitle": {}, "searchTagsSectionTitle": "Теги", + "@searchTagsSectionTitle": {}, "searchRatingSectionTitle": "Рейтинги", + "@searchRatingSectionTitle": {}, "searchMetadataSectionTitle": "Метаданные", - + "@searchMetadataSectionTitle": {}, "settingsPageTitle": "Настройки", + "@settingsPageTitle": {}, "settingsSystemDefault": "Система", + "@settingsSystemDefault": {}, "settingsDefault": "По умолчанию", + "@settingsDefault": {}, "settingsDisabled": "Выключено", - + "@settingsDisabled": {}, "settingsSearchFieldLabel": "Поиск настроек", + "@settingsSearchFieldLabel": {}, "settingsSearchEmpty": "Нет соответствующих настроек", + "@settingsSearchEmpty": {}, "settingsActionExport": "Экспорт", + "@settingsActionExport": {}, "settingsActionExportDialogTitle": "Экспорт", + "@settingsActionExportDialogTitle": {}, "settingsActionImport": "Импорт", + "@settingsActionImport": {}, "settingsActionImportDialogTitle": "Импорт", - + "@settingsActionImportDialogTitle": {}, "appExportCovers": "Обложки", + "@appExportCovers": {}, "appExportFavourites": "Избранное", + "@appExportFavourites": {}, "appExportSettings": "Настройки", - + "@appExportSettings": {}, "settingsNavigationSectionTitle": "Навигация", + "@settingsNavigationSectionTitle": {}, "settingsHomeTile": "Домашний каталог", + "@settingsHomeTile": {}, "settingsHomeDialogTitle": "Домашний каталог", + "@settingsHomeDialogTitle": {}, "settingsShowBottomNavigationBar": "Показать нижнюю панель навигации", + "@settingsShowBottomNavigationBar": {}, "settingsKeepScreenOnTile": "Держать экран включенным", + "@settingsKeepScreenOnTile": {}, "settingsKeepScreenOnDialogTitle": "Держать экран включенным", + "@settingsKeepScreenOnDialogTitle": {}, "settingsDoubleBackExit": "Дважды нажмите «Назад», чтобы выйти", - + "@settingsDoubleBackExit": {}, "settingsConfirmationTile": "Диалоги подтверждения", + "@settingsConfirmationTile": {}, "settingsConfirmationDialogTitle": "Диалоги подтверждения", + "@settingsConfirmationDialogTitle": {}, "settingsConfirmationBeforeDeleteItems": "Спросить, прежде чем удалять объекты навсегда", + "@settingsConfirmationBeforeDeleteItems": {}, "settingsConfirmationBeforeMoveToBinItems": "Спросить, прежде чем перемещать объекты в корзину", + "@settingsConfirmationBeforeMoveToBinItems": {}, "settingsConfirmationBeforeMoveUndatedItems": "Спросить, прежде чем перемещать объекты без даты в метаданных", + "@settingsConfirmationBeforeMoveUndatedItems": {}, "settingsConfirmationAfterMoveToBinItems": "Показывать сообщение после перемещения в корзину", - + "@settingsConfirmationAfterMoveToBinItems": {}, "settingsNavigationDrawerTile": "Навигационное меню", + "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "Навигационное меню", + "@settingsNavigationDrawerEditorPageTitle": {}, "settingsNavigationDrawerBanner": "Нажмите и удерживайте, чтобы переместить и изменить порядок пунктов меню.", + "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "Типы", + "@settingsNavigationDrawerTabTypes": {}, "settingsNavigationDrawerTabAlbums": "Альбомы", + "@settingsNavigationDrawerTabAlbums": {}, "settingsNavigationDrawerTabPages": "Страницы", + "@settingsNavigationDrawerTabPages": {}, "settingsNavigationDrawerAddAlbum": "Добавить альбом", - + "@settingsNavigationDrawerAddAlbum": {}, "settingsThumbnailSectionTitle": "Эскизы", + "@settingsThumbnailSectionTitle": {}, "settingsThumbnailOverlayTile": "Наложение", + "@settingsThumbnailOverlayTile": {}, "settingsThumbnailOverlayPageTitle": "Наложение", + "@settingsThumbnailOverlayPageTitle": {}, "settingsThumbnailShowFavouriteIcon": "Показать значок избранного", + "@settingsThumbnailShowFavouriteIcon": {}, "settingsThumbnailShowTagIcon": "Показать значок тега", + "@settingsThumbnailShowTagIcon": {}, "settingsThumbnailShowLocationIcon": "Показать значок местоположения", + "@settingsThumbnailShowLocationIcon": {}, "settingsThumbnailShowMotionPhotoIcon": "Показать значок «живого фото»", + "@settingsThumbnailShowMotionPhotoIcon": {}, "settingsThumbnailShowRating": "Показать рейтинг", + "@settingsThumbnailShowRating": {}, "settingsThumbnailShowRawIcon": "Показать значок RAW-файла", + "@settingsThumbnailShowRawIcon": {}, "settingsThumbnailShowVideoDuration": "Показать продолжительность видео", - + "@settingsThumbnailShowVideoDuration": {}, "settingsCollectionQuickActionsTile": "Быстрые действия", + "@settingsCollectionQuickActionsTile": {}, "settingsCollectionQuickActionEditorPageTitle": "Быстрые действия", + "@settingsCollectionQuickActionEditorPageTitle": {}, "settingsCollectionQuickActionTabBrowsing": "Просмотр", + "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "Выбор", + "@settingsCollectionQuickActionTabSelecting": {}, "settingsCollectionBrowsingQuickActionEditorBanner": "Нажмите и удерживайте для перемещения кнопок и выбора действий, отображаемых при просмотре объектов.", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "Нажмите и удерживайте, чтобы переместить кнопки и выбрать, какие действия будут отображаться при выборе элементов.", - + "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "Просмотрщик", + "@settingsViewerSectionTitle": {}, "settingsViewerGestureSideTapNext": "Нажатие на край экрана для перехода назад/вперед", + "@settingsViewerGestureSideTapNext": {}, "settingsViewerUseCutout": "Использовать область выреза", + "@settingsViewerUseCutout": {}, "settingsViewerMaximumBrightness": "Максимальная яркость", + "@settingsViewerMaximumBrightness": {}, "settingsMotionPhotoAutoPlay": "Автовоспроизведение «живых фото»", + "@settingsMotionPhotoAutoPlay": {}, "settingsImageBackground": "Фон изображения", - + "@settingsImageBackground": {}, "settingsViewerQuickActionsTile": "Быстрые действия", + "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "Быстрые действия", + "@settingsViewerQuickActionEditorPageTitle": {}, "settingsViewerQuickActionEditorBanner": "Нажмите и удерживайте для перемещения кнопок и выбора действий, отображаемых в просмотрщике.", + "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "Отображаемые кнопки", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "Доступные кнопки", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, "settingsViewerQuickActionEmpty": "Нет кнопок", - + "@settingsViewerQuickActionEmpty": {}, "settingsViewerOverlayTile": "Наложение", + "@settingsViewerOverlayTile": {}, "settingsViewerOverlayPageTitle": "Наложение", + "@settingsViewerOverlayPageTitle": {}, "settingsViewerShowOverlayOnOpening": "Показать наложение при открытии", + "@settingsViewerShowOverlayOnOpening": {}, "settingsViewerShowMinimap": "Показать миникарту", + "@settingsViewerShowMinimap": {}, "settingsViewerShowInformation": "Показать информацию", + "@settingsViewerShowInformation": {}, "settingsViewerShowInformationSubtitle": "Показать название, дату, местоположение и т.д.", + "@settingsViewerShowInformationSubtitle": {}, "settingsViewerShowShootingDetails": "Показать детали съёмки", + "@settingsViewerShowShootingDetails": {}, "settingsViewerShowOverlayThumbnails": "Показать эскизы", + "@settingsViewerShowOverlayThumbnails": {}, "settingsViewerEnableOverlayBlurEffect": "Наложение эффекта размытия", - + "@settingsViewerEnableOverlayBlurEffect": {}, "settingsViewerSlideshowTile": "Слайд-шоу", + "@settingsViewerSlideshowTile": {}, "settingsViewerSlideshowPageTitle": "Слайд-шоу", + "@settingsViewerSlideshowPageTitle": {}, "settingsSlideshowRepeat": "Повтор", + "@settingsSlideshowRepeat": {}, "settingsSlideshowShuffle": "Вперемешку", + "@settingsSlideshowShuffle": {}, "settingsSlideshowFillScreen": "Полный экран", + "@settingsSlideshowFillScreen": {}, "settingsSlideshowAnimatedZoomEffect": "Анимация зум эффекта", + "@settingsSlideshowAnimatedZoomEffect": {}, "settingsSlideshowTransitionTile": "Эффект перехода", + "@settingsSlideshowTransitionTile": {}, "settingsSlideshowIntervalTile": "Интервал", + "@settingsSlideshowIntervalTile": {}, "settingsSlideshowVideoPlaybackTile": "Проигрывание видео", + "@settingsSlideshowVideoPlaybackTile": {}, "settingsSlideshowVideoPlaybackDialogTitle": "Проигрывание Видео", - + "@settingsSlideshowVideoPlaybackDialogTitle": {}, "settingsVideoPageTitle": "Настройки видео", + "@settingsVideoPageTitle": {}, "settingsVideoSectionTitle": "Видео", + "@settingsVideoSectionTitle": {}, "settingsVideoShowVideos": "Показать видео", + "@settingsVideoShowVideos": {}, "settingsVideoEnableHardwareAcceleration": "Аппаратное ускорение", + "@settingsVideoEnableHardwareAcceleration": {}, "settingsVideoAutoPlay": "Автозапуск воспроизведения", + "@settingsVideoAutoPlay": {}, "settingsVideoLoopModeTile": "Циклический режим", + "@settingsVideoLoopModeTile": {}, "settingsVideoLoopModeDialogTitle": "Цикличный режим", - + "@settingsVideoLoopModeDialogTitle": {}, "settingsSubtitleThemeTile": "Субтитры", + "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "Субтитры", + "@settingsSubtitleThemePageTitle": {}, "settingsSubtitleThemeSample": "Образец.", + "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "Выравнивание текста", + "@settingsSubtitleThemeTextAlignmentTile": {}, "settingsSubtitleThemeTextAlignmentDialogTitle": "Выравнивание текста", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, "settingsSubtitleThemeTextSize": "Размер текста", + "@settingsSubtitleThemeTextSize": {}, "settingsSubtitleThemeShowOutline": "Показать контур и тень", + "@settingsSubtitleThemeShowOutline": {}, "settingsSubtitleThemeTextColor": "Цвет текста", + "@settingsSubtitleThemeTextColor": {}, "settingsSubtitleThemeTextOpacity": "Непрозрачность текста", + "@settingsSubtitleThemeTextOpacity": {}, "settingsSubtitleThemeBackgroundColor": "Цвет фона", + "@settingsSubtitleThemeBackgroundColor": {}, "settingsSubtitleThemeBackgroundOpacity": "Непрозрачность фона", + "@settingsSubtitleThemeBackgroundOpacity": {}, "settingsSubtitleThemeTextAlignmentLeft": "По левой стороне", + "@settingsSubtitleThemeTextAlignmentLeft": {}, "settingsSubtitleThemeTextAlignmentCenter": "По центру", + "@settingsSubtitleThemeTextAlignmentCenter": {}, "settingsSubtitleThemeTextAlignmentRight": "По правой стороне", - + "@settingsSubtitleThemeTextAlignmentRight": {}, "settingsVideoControlsTile": "Элементы управления", + "@settingsVideoControlsTile": {}, "settingsVideoControlsPageTitle": "Элементы управления", + "@settingsVideoControlsPageTitle": {}, "settingsVideoButtonsTile": "Кнопки", + "@settingsVideoButtonsTile": {}, "settingsVideoGestureDoubleTapTogglePlay": "Двойное нажатие для воспроизведения/паузы", + "@settingsVideoGestureDoubleTapTogglePlay": {}, "settingsVideoGestureSideDoubleTapSeek": "Двойное нажатие на края экрана для перехода назад/вперёд", - + "@settingsVideoGestureSideDoubleTapSeek": {}, "settingsPrivacySectionTitle": "Конфиденциальность", + "@settingsPrivacySectionTitle": {}, "settingsAllowInstalledAppAccess": "Разрешить доступ к библиотеке приложения", + "@settingsAllowInstalledAppAccess": {}, "settingsAllowInstalledAppAccessSubtitle": "Используется для улучшения отображения альбомов", + "@settingsAllowInstalledAppAccessSubtitle": {}, "settingsAllowErrorReporting": "Разрешить анонимную отправку логов", + "@settingsAllowErrorReporting": {}, "settingsSaveSearchHistory": "Сохранять историю поиска", + "@settingsSaveSearchHistory": {}, "settingsEnableBin": "Использовать корзину", + "@settingsEnableBin": {}, "settingsEnableBinSubtitle": "Хранить удалённые объекты в течение 30 дней", - + "@settingsEnableBinSubtitle": {}, "settingsHiddenItemsTile": "Скрытые объекты", + "@settingsHiddenItemsTile": {}, "settingsHiddenItemsPageTitle": "Скрытые объекты", - + "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "Скрытые фильтры", + "@settingsHiddenItemsTabFilters": {}, "settingsHiddenFiltersBanner": "Фотографии и видео, соответствующие скрытым фильтрам, не появятся в вашей коллекции.", + "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "Нет скрытых фильтров", - + "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "Скрытые каталоги", + "@settingsHiddenItemsTabPaths": {}, "settingsHiddenPathsBanner": "Фотографии и видео в этих каталогах или любых их вложенных каталогах не будут отображаться в вашей коллекции.", + "@settingsHiddenPathsBanner": {}, "addPathTooltip": "Добавить каталог", - + "@addPathTooltip": {}, "settingsStorageAccessTile": "Доступ к хранилищу", + "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "Доступ к хранилищу", + "@settingsStorageAccessPageTitle": {}, "settingsStorageAccessBanner": "Некоторые каталоги требуют обязательного предоставления доступа для изменения файлов в них. Вы можете просмотреть здесь каталоги, к которым вы ранее предоставили доступ.", + "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "Нет прав доступа", + "@settingsStorageAccessEmpty": {}, "settingsStorageAccessRevokeTooltip": "Отменить", - + "@settingsStorageAccessRevokeTooltip": {}, "settingsAccessibilitySectionTitle": "Специальные возможности", + "@settingsAccessibilitySectionTitle": {}, "settingsRemoveAnimationsTile": "Удалить анимацию", + "@settingsRemoveAnimationsTile": {}, "settingsRemoveAnimationsDialogTitle": "Удалить анимацию", + "@settingsRemoveAnimationsDialogTitle": {}, "settingsTimeToTakeActionTile": "Время на выполнение действия", - + "@settingsTimeToTakeActionTile": {}, "settingsDisplaySectionTitle": "Отображение", + "@settingsDisplaySectionTitle": {}, "settingsThemeBrightnessTile": "Тема", + "@settingsThemeBrightnessTile": {}, "settingsThemeBrightnessDialogTitle": "Тема", + "@settingsThemeBrightnessDialogTitle": {}, "settingsThemeColorHighlights": "Цветовые акценты", + "@settingsThemeColorHighlights": {}, "settingsThemeEnableDynamicColor": "Динамический цвет", + "@settingsThemeEnableDynamicColor": {}, "settingsDisplayRefreshRateModeTile": "Частота обновления экрана", + "@settingsDisplayRefreshRateModeTile": {}, "settingsDisplayRefreshRateModeDialogTitle": "Частота обновления", - + "@settingsDisplayRefreshRateModeDialogTitle": {}, "settingsLanguageSectionTitle": "Язык и форматы", + "@settingsLanguageSectionTitle": {}, "settingsLanguageTile": "Язык", + "@settingsLanguageTile": {}, "settingsLanguagePageTitle": "Язык", + "@settingsLanguagePageTitle": {}, "settingsCoordinateFormatTile": "Формат координат", + "@settingsCoordinateFormatTile": {}, "settingsCoordinateFormatDialogTitle": "Формат координат", + "@settingsCoordinateFormatDialogTitle": {}, "settingsUnitSystemTile": "Единицы измерения", + "@settingsUnitSystemTile": {}, "settingsUnitSystemDialogTitle": "Единицы измерения", - + "@settingsUnitSystemDialogTitle": {}, "settingsScreenSaverPageTitle": "Скринсейвер", - + "@settingsScreenSaverPageTitle": {}, "settingsWidgetPageTitle": "Фоторамка", + "@settingsWidgetPageTitle": {}, "settingsWidgetShowOutline": "Выделение", + "@settingsWidgetShowOutline": {}, "settingsWidgetOpenPage": "При нажатии на виджет", - + "@settingsWidgetOpenPage": {}, "settingsCollectionTile": "Коллекция", - + "@settingsCollectionTile": {}, "statsPageTitle": "Статистика", + "@statsPageTitle": {}, "statsWithGps": "{count, plural, =1{1 объект с местоположением} few{{count} объекта с местоположением} other{{count} объектов с местоположением}}", + "@statsWithGps": {}, "statsTopCountriesSectionTitle": "Топ стран", + "@statsTopCountriesSectionTitle": {}, "statsTopPlacesSectionTitle": "Топ локаций", + "@statsTopPlacesSectionTitle": {}, "statsTopTagsSectionTitle": "Топ тегов", + "@statsTopTagsSectionTitle": {}, "statsTopAlbumsSectionTitle": "Топ альбомов", - + "@statsTopAlbumsSectionTitle": {}, "viewerOpenPanoramaButtonLabel": "ОТКРЫТЬ ПАНОРАМУ", + "@viewerOpenPanoramaButtonLabel": {}, "viewerSetWallpaperButtonLabel": "УСТАНОВИТЬ КАК ОБОИ", + "@viewerSetWallpaperButtonLabel": {}, "viewerErrorUnknown": "Упс!", + "@viewerErrorUnknown": {}, "viewerErrorDoesNotExist": "Файл больше не существует.", - + "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "Информация", + "@viewerInfoPageTitle": {}, "viewerInfoBackToViewerTooltip": "Вернуться к просмотрщику", - + "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "неизвестный", + "@viewerInfoUnknown": {}, "viewerInfoLabelDescription": "Описание", + "@viewerInfoLabelDescription": {}, "viewerInfoLabelTitle": "Название", + "@viewerInfoLabelTitle": {}, "viewerInfoLabelDate": "Дата", + "@viewerInfoLabelDate": {}, "viewerInfoLabelResolution": "Разрешение", + "@viewerInfoLabelResolution": {}, "viewerInfoLabelSize": "Размер", + "@viewerInfoLabelSize": {}, "viewerInfoLabelUri": "Идентификатор", + "@viewerInfoLabelUri": {}, "viewerInfoLabelPath": "Расположение", + "@viewerInfoLabelPath": {}, "viewerInfoLabelDuration": "Продолжительность", + "@viewerInfoLabelDuration": {}, "viewerInfoLabelOwner": "Владелец", + "@viewerInfoLabelOwner": {}, "viewerInfoLabelCoordinates": "Координаты", + "@viewerInfoLabelCoordinates": {}, "viewerInfoLabelAddress": "Адрес", - + "@viewerInfoLabelAddress": {}, "mapStyleDialogTitle": "Стиль карты", + "@mapStyleDialogTitle": {}, "mapStyleTooltip": "Выберите стиль карты", + "@mapStyleTooltip": {}, "mapZoomInTooltip": "Увеличить", + "@mapZoomInTooltip": {}, "mapZoomOutTooltip": "Уменьшить", + "@mapZoomOutTooltip": {}, "mapPointNorthUpTooltip": "Повернуть на север", + "@mapPointNorthUpTooltip": {}, "mapAttributionOsmHot": "Данные карты © [OpenStreetMap](https://www.openstreetmap.org/copyright) помощники • Плитки [HOT](https://www.hotosm.org/) • Размещена на [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, "mapAttributionStamen": "Данные карты © [OpenStreetMap](https://www.openstreetmap.org/copyright) помощники • Плитки [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, "openMapPageTooltip": "Просмотреть на странице карты", + "@openMapPageTooltip": {}, "mapEmptyRegion": "Нет изображений в этом регионе", - + "@mapEmptyRegion": {}, "viewerInfoOpenEmbeddedFailureFeedback": "Не удалось извлечь встроенные данные", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, "viewerInfoOpenLinkText": "Открыть", + "@viewerInfoOpenLinkText": {}, "viewerInfoViewXmlLinkText": "Просмотр XML", - + "@viewerInfoViewXmlLinkText": {}, "viewerInfoSearchFieldLabel": "Поиск метаданных", + "@viewerInfoSearchFieldLabel": {}, "viewerInfoSearchEmpty": "Нет подходящих ключей", + "@viewerInfoSearchEmpty": {}, "viewerInfoSearchSuggestionDate": "Дата и время", + "@viewerInfoSearchSuggestionDate": {}, "viewerInfoSearchSuggestionDescription": "Описание", + "@viewerInfoSearchSuggestionDescription": {}, "viewerInfoSearchSuggestionDimensions": "Измерения", + "@viewerInfoSearchSuggestionDimensions": {}, "viewerInfoSearchSuggestionResolution": "Разрешение", + "@viewerInfoSearchSuggestionResolution": {}, "viewerInfoSearchSuggestionRights": "Права", - + "@viewerInfoSearchSuggestionRights": {}, "wallpaperUseScrollEffect": "Эффект прокрутки на домашнем экране", - + "@wallpaperUseScrollEffect": {}, "tagEditorPageTitle": "Изменить теги", + "@tagEditorPageTitle": {}, "tagEditorPageNewTagFieldLabel": "Новый тег", + "@tagEditorPageNewTagFieldLabel": {}, "tagEditorPageAddTagTooltip": "Добавить тег", + "@tagEditorPageAddTagTooltip": {}, "tagEditorSectionRecent": "Недавние", - + "@tagEditorSectionRecent": {}, "panoramaEnableSensorControl": "Включить сенсорное управление", + "@panoramaEnableSensorControl": {}, "panoramaDisableSensorControl": "Отключить сенсорное управление", - + "@panoramaDisableSensorControl": {}, "sourceViewerPageTitle": "Источник", - + "@sourceViewerPageTitle": {}, "filePickerShowHiddenFiles": "Показывать скрытые файлы", + "@filePickerShowHiddenFiles": {}, "filePickerDoNotShowHiddenFiles": "Не показывать скрытые файлы", + "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "Открыть", + "@filePickerOpenFrom": {}, "filePickerNoItems": "Ничего нет.", - "filePickerUseThisFolder": "Использовать эту папку" + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "Использовать эту папку", + "@filePickerUseThisFolder": {}, + "durationDialogSeconds": "Секунд", + "@durationDialogSeconds": {}, + "widgetOpenPageCollection": "Открыть коллекцию", + "@widgetOpenPageCollection": {} } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 42c8e30ce..3820f7816 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -1,694 +1,1146 @@ { "appName": "Aves", + "@appName": {}, "welcomeMessage": "欢迎使用 Aves", + "@welcomeMessage": {}, "welcomeOptional": "可选", + "@welcomeOptional": {}, "welcomeTermsToggle": "我同意这些使用条款和条件", + "@welcomeTermsToggle": {}, "itemCount": "{count, plural, other{{count} 项}}", - + "@itemCount": {}, "timeSeconds": "{seconds, plural, other{{seconds} 秒}}", + "@timeSeconds": {}, "timeMinutes": "{minutes, plural, other{{minutes} 分}}", + "@timeMinutes": {}, "timeDays": "{days, plural, other{{days} 天}}", + "@timeDays": {}, "focalLength": "{length} mm", - + "@focalLength": {}, "applyButtonLabel": "应用", + "@applyButtonLabel": {}, "deleteButtonLabel": "删除", + "@deleteButtonLabel": {}, "nextButtonLabel": "下一步", + "@nextButtonLabel": {}, "showButtonLabel": "显示", + "@showButtonLabel": {}, "hideButtonLabel": "隐藏", + "@hideButtonLabel": {}, "continueButtonLabel": "继续", - + "@continueButtonLabel": {}, "cancelTooltip": "取消", + "@cancelTooltip": {}, "changeTooltip": "更改", + "@changeTooltip": {}, "clearTooltip": "清除", + "@clearTooltip": {}, "previousTooltip": "上一组", + "@previousTooltip": {}, "nextTooltip": "下一组", + "@nextTooltip": {}, "showTooltip": "显示", + "@showTooltip": {}, "hideTooltip": "隐藏", + "@hideTooltip": {}, "actionRemove": "移除", + "@actionRemove": {}, "resetTooltip": "重置", + "@resetTooltip": {}, "saveTooltip": "保存", + "@saveTooltip": {}, "pickTooltip": "挑选", - + "@pickTooltip": {}, "doubleBackExitMessage": "再按一次退出", + "@doubleBackExitMessage": {}, "doNotAskAgain": "不再询问", - + "@doNotAskAgain": {}, "sourceStateLoading": "加载中", + "@sourceStateLoading": {}, "sourceStateCataloguing": "正在进行编目", + "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "正在定位国家", + "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "正在定位地点", - + "@sourceStateLocatingPlaces": {}, "chipActionDelete": "删除", + "@chipActionDelete": {}, "chipActionGoToAlbumPage": "在相册中显示", + "@chipActionGoToAlbumPage": {}, "chipActionGoToCountryPage": "在国家中显示", + "@chipActionGoToCountryPage": {}, "chipActionGoToTagPage": "在标签中显示", + "@chipActionGoToTagPage": {}, "chipActionFilterOut": "滤除", + "@chipActionFilterOut": {}, "chipActionFilterIn": "筛选", + "@chipActionFilterIn": {}, "chipActionHide": "隐藏", + "@chipActionHide": {}, "chipActionPin": "置顶", + "@chipActionPin": {}, "chipActionUnpin": "取消置顶", + "@chipActionUnpin": {}, "chipActionRename": "重命名", + "@chipActionRename": {}, "chipActionSetCover": "设置封面", + "@chipActionSetCover": {}, "chipActionCreateAlbum": "创建相册", - + "@chipActionCreateAlbum": {}, "entryActionCopyToClipboard": "复制到剪贴板", + "@entryActionCopyToClipboard": {}, "entryActionDelete": "删除", + "@entryActionDelete": {}, "entryActionConvert": "转换", + "@entryActionConvert": {}, "entryActionExport": "导出", + "@entryActionExport": {}, "entryActionInfo": "信息", + "@entryActionInfo": {}, "entryActionRename": "重命名", + "@entryActionRename": {}, "entryActionRestore": "恢复", + "@entryActionRestore": {}, "entryActionRotateCCW": "逆时针旋转", + "@entryActionRotateCCW": {}, "entryActionRotateCW": "顺时针旋转", + "@entryActionRotateCW": {}, "entryActionFlip": "水平翻转", + "@entryActionFlip": {}, "entryActionPrint": "打印", + "@entryActionPrint": {}, "entryActionShare": "分享", + "@entryActionShare": {}, "entryActionViewSource": "查看源码", + "@entryActionViewSource": {}, "entryActionShowGeoTiffOnMap": "显示为地图叠加层", + "@entryActionShowGeoTiffOnMap": {}, "entryActionConvertMotionPhotoToStillImage": "转换为静态图像", + "@entryActionConvertMotionPhotoToStillImage": {}, "entryActionViewMotionPhotoVideo": "打开视频", + "@entryActionViewMotionPhotoVideo": {}, "entryActionEdit": "编辑", + "@entryActionEdit": {}, "entryActionOpen": "打开方式", + "@entryActionOpen": {}, "entryActionSetAs": "设置为", + "@entryActionSetAs": {}, "entryActionOpenMap": "在地图应用中显示", + "@entryActionOpenMap": {}, "entryActionRotateScreen": "旋转屏幕", + "@entryActionRotateScreen": {}, "entryActionAddFavourite": "加为收藏", + "@entryActionAddFavourite": {}, "entryActionRemoveFavourite": "取消收藏", - + "@entryActionRemoveFavourite": {}, "videoActionCaptureFrame": "捕获帧", + "@videoActionCaptureFrame": {}, "videoActionMute": "静音", + "@videoActionMute": {}, "videoActionUnmute": "取消静音", + "@videoActionUnmute": {}, "videoActionPause": "暂停", + "@videoActionPause": {}, "videoActionPlay": "播放", + "@videoActionPlay": {}, "videoActionReplay10": "前进 10 秒", + "@videoActionReplay10": {}, "videoActionSkip10": "后退 10 秒", + "@videoActionSkip10": {}, "videoActionSelectStreams": "选择音轨", + "@videoActionSelectStreams": {}, "videoActionSetSpeed": "播放速度", + "@videoActionSetSpeed": {}, "videoActionSettings": "设置", - + "@videoActionSettings": {}, "slideshowActionResume": "继续", + "@slideshowActionResume": {}, "slideshowActionShowInCollection": "在媒体集中显示", - + "@slideshowActionShowInCollection": {}, "entryInfoActionEditDate": "编辑日期和时间", + "@entryInfoActionEditDate": {}, "entryInfoActionEditLocation": "编辑位置", + "@entryInfoActionEditLocation": {}, "entryInfoActionEditTitleDescription": "编辑标题和描述", + "@entryInfoActionEditTitleDescription": {}, "entryInfoActionEditRating": "修改评分", + "@entryInfoActionEditRating": {}, "entryInfoActionEditTags": "编辑标签", + "@entryInfoActionEditTags": {}, "entryInfoActionRemoveMetadata": "移除元数据", - + "@entryInfoActionRemoveMetadata": {}, "filterBinLabel": "回收站", + "@filterBinLabel": {}, "filterFavouriteLabel": "收藏夹", + "@filterFavouriteLabel": {}, "filterNoDateLabel": "未注明日期", + "@filterNoDateLabel": {}, "filterNoLocationLabel": "未定位", + "@filterNoLocationLabel": {}, "filterNoRatingLabel": "未评分", + "@filterNoRatingLabel": {}, "filterNoTagLabel": "无标签", + "@filterNoTagLabel": {}, "filterNoTitleLabel": "无标题", + "@filterNoTitleLabel": {}, "filterOnThisDayLabel": "选择日期", + "@filterOnThisDayLabel": {}, "filterRecentlyAddedLabel": "最近添加", + "@filterRecentlyAddedLabel": {}, "filterRatingRejectedLabel": "拒绝", + "@filterRatingRejectedLabel": {}, "filterTypeAnimatedLabel": "动画", + "@filterTypeAnimatedLabel": {}, "filterTypeMotionPhotoLabel": "动态照片", + "@filterTypeMotionPhotoLabel": {}, "filterTypePanoramaLabel": "全景图", + "@filterTypePanoramaLabel": {}, "filterTypeRawLabel": "Raw", + "@filterTypeRawLabel": {}, "filterTypeSphericalVideoLabel": "360° 视频", + "@filterTypeSphericalVideoLabel": {}, "filterTypeGeotiffLabel": "GeoTIFF", + "@filterTypeGeotiffLabel": {}, "filterMimeImageLabel": "图像", + "@filterMimeImageLabel": {}, "filterMimeVideoLabel": "视频", - + "@filterMimeVideoLabel": {}, "coordinateFormatDms": "DMS", + "@coordinateFormatDms": {}, "coordinateFormatDecimal": "十进制度", + "@coordinateFormatDecimal": {}, "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": {}, "coordinateDmsNorth": "N", + "@coordinateDmsNorth": {}, "coordinateDmsSouth": "S", + "@coordinateDmsSouth": {}, "coordinateDmsEast": "E", + "@coordinateDmsEast": {}, "coordinateDmsWest": "W", - + "@coordinateDmsWest": {}, "unitSystemMetric": "公制", + "@unitSystemMetric": {}, "unitSystemImperial": "英制", - + "@unitSystemImperial": {}, "videoLoopModeNever": "从不", + "@videoLoopModeNever": {}, "videoLoopModeShortOnly": "仅短视频", + "@videoLoopModeShortOnly": {}, "videoLoopModeAlways": "始终", - + "@videoLoopModeAlways": {}, "videoControlsPlay": "播放", + "@videoControlsPlay": {}, "videoControlsPlaySeek": "播放和步进/步退", + "@videoControlsPlaySeek": {}, "videoControlsPlayOutside": "用其他播放器打开", + "@videoControlsPlayOutside": {}, "videoControlsNone": "无", - + "@videoControlsNone": {}, "mapStyleGoogleNormal": "Google 地图", + "@mapStyleGoogleNormal": {}, "mapStyleGoogleHybrid": "Google 地图 (卫星图像)", + "@mapStyleGoogleHybrid": {}, "mapStyleGoogleTerrain": "Google 地图 (地形)", + "@mapStyleGoogleTerrain": {}, "mapStyleHuaweiNormal": "Petal 地图", + "@mapStyleHuaweiNormal": {}, "mapStyleHuaweiTerrain": "Petal 地图 (地形)", + "@mapStyleHuaweiTerrain": {}, "mapStyleOsmHot": "Humanitarian OSM", + "@mapStyleOsmHot": {}, "mapStyleStamenToner": "Stamen Toner", + "@mapStyleStamenToner": {}, "mapStyleStamenWatercolor": "Stamen Watercolor", - + "@mapStyleStamenWatercolor": {}, "nameConflictStrategyRename": "重命名", + "@nameConflictStrategyRename": {}, "nameConflictStrategyReplace": "替换", + "@nameConflictStrategyReplace": {}, "nameConflictStrategySkip": "跳过", - + "@nameConflictStrategySkip": {}, "keepScreenOnNever": "从不", + "@keepScreenOnNever": {}, "keepScreenOnViewerOnly": "仅查看器页面", + "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "始终", - + "@keepScreenOnAlways": {}, "accessibilityAnimationsRemove": "禁用屏幕效果", + "@accessibilityAnimationsRemove": {}, "accessibilityAnimationsKeep": "保留屏幕效果", - + "@accessibilityAnimationsKeep": {}, "displayRefreshRatePreferHighest": "最高刷新率", + "@displayRefreshRatePreferHighest": {}, "displayRefreshRatePreferLowest": "最低刷新率", - + "@displayRefreshRatePreferLowest": {}, "videoPlaybackSkip": "跳过", + "@videoPlaybackSkip": {}, "videoPlaybackMuted": "静音播放", + "@videoPlaybackMuted": {}, "videoPlaybackWithSound": "带音播放", - + "@videoPlaybackWithSound": {}, "themeBrightnessLight": "浅色", + "@themeBrightnessLight": {}, "themeBrightnessDark": "深色", + "@themeBrightnessDark": {}, "themeBrightnessBlack": "黑色", - + "@themeBrightnessBlack": {}, "viewerTransitionSlide": "滑动", + "@viewerTransitionSlide": {}, "viewerTransitionParallax": "视差滚动", + "@viewerTransitionParallax": {}, "viewerTransitionFade": "淡入淡出", + "@viewerTransitionFade": {}, "viewerTransitionZoomIn": "放大", + "@viewerTransitionZoomIn": {}, "viewerTransitionNone": "无", - + "@viewerTransitionNone": {}, "wallpaperTargetHome": "主屏幕", + "@wallpaperTargetHome": {}, "wallpaperTargetLock": "锁屏界面", + "@wallpaperTargetLock": {}, "wallpaperTargetHomeLock": "主屏幕 + 锁屏界面", - + "@wallpaperTargetHomeLock": {}, "widgetOpenPageHome": "打开主页", + "@widgetOpenPageHome": {}, "widgetOpenPageViewer": "打开查看器", - + "@widgetOpenPageViewer": {}, "albumTierNew": "新的", + "@albumTierNew": {}, "albumTierPinned": "钉选", + "@albumTierPinned": {}, "albumTierSpecial": "普通", + "@albumTierSpecial": {}, "albumTierApps": "应用", + "@albumTierApps": {}, "albumTierRegular": "其他", - + "@albumTierRegular": {}, "storageVolumeDescriptionFallbackPrimary": "内部存储", + "@storageVolumeDescriptionFallbackPrimary": {}, "storageVolumeDescriptionFallbackNonPrimary": "SD 卡", + "@storageVolumeDescriptionFallbackNonPrimary": {}, "rootDirectoryDescription": "根目录", + "@rootDirectoryDescription": {}, "otherDirectoryDescription": "“{name}” 目录", + "@otherDirectoryDescription": {}, "storageAccessDialogMessage": "请在下一屏幕中选择“{volume}”的{directory},以授予本应用对其的访问权限", + "@storageAccessDialogMessage": {}, "restrictedAccessDialogMessage": "本应用无权修改“{volume}”的{directory}中的文件\n\n请使用预装的文件管理器或图库应用将项目移至其他目录", + "@restrictedAccessDialogMessage": {}, "notEnoughSpaceDialogMessage": "此操作需要“{volume}”上具有 {neededSize} 可用空间才能完成,实际仅剩 {freeSize}", + "@notEnoughSpaceDialogMessage": {}, "missingSystemFilePickerDialogMessage": "系统文件选择器缺失或被禁用,请将其启用后再试", - + "@missingSystemFilePickerDialogMessage": {}, "unsupportedTypeDialogMessage": "{count, plural, other{此操作不支持以下类型的项目: {types}.}}", - + "@unsupportedTypeDialogMessage": {}, "nameConflictDialogSingleSourceMessage": "目标文件夹中具有同名文件", + "@nameConflictDialogSingleSourceMessage": {}, "nameConflictDialogMultipleSourceMessage": "存在同名文件", - + "@nameConflictDialogMultipleSourceMessage": {}, "addShortcutDialogLabel": "快捷方式标签", + "@addShortcutDialogLabel": {}, "addShortcutButtonLabel": "添加", - + "@addShortcutButtonLabel": {}, "noMatchingAppDialogMessage": "无对应的处理程序", - + "@noMatchingAppDialogMessage": {}, "binEntriesConfirmationDialogMessage": "{count, plural, =1{将此项移至回收站?} other{将这 {count} 项移至回收站?}}", + "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{删除此项?} other{删除这 {count} 项?}}", + "@deleteEntriesConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogMessage": "继续之前保存项目日期?", + "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "保存日期", - + "@moveUndatedConfirmationDialogSetDate": {}, "videoResumeDialogMessage": "想接着在 {time} 继续播放吗?", + "@videoResumeDialogMessage": {}, "videoStartOverButtonLabel": "从头播放", + "@videoStartOverButtonLabel": {}, "videoResumeButtonLabel": "继续", - + "@videoResumeButtonLabel": {}, "setCoverDialogLatest": "最新项", + "@setCoverDialogLatest": {}, "setCoverDialogAuto": "自动", + "@setCoverDialogAuto": {}, "setCoverDialogCustom": "自定义", - + "@setCoverDialogCustom": {}, "hideFilterConfirmationDialogMessage": "匹配的照片和视频将从收藏中隐藏,你可以通过“隐私”设置中再次显示它们\n\n确定要将其隐藏吗?", - + "@hideFilterConfirmationDialogMessage": {}, "newAlbumDialogTitle": "新相册", + "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "相册名称", + "@newAlbumDialogNameLabel": {}, "newAlbumDialogNameLabelAlreadyExistsHelper": "目录已存在", + "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "存储:", - + "@newAlbumDialogStorageLabel": {}, "renameAlbumDialogLabel": "新名称", + "@renameAlbumDialogLabel": {}, "renameAlbumDialogLabelAlreadyExistsHelper": "目录已存在", - + "@renameAlbumDialogLabelAlreadyExistsHelper": {}, "renameEntrySetPageTitle": "重命名", + "@renameEntrySetPageTitle": {}, "renameEntrySetPagePatternFieldLabel": "命名模式", + "@renameEntrySetPagePatternFieldLabel": {}, "renameEntrySetPageInsertTooltip": "插入字段", + "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "预览", - + "@renameEntrySetPagePreviewSectionTitle": {}, "renameProcessorCounter": "计数器", + "@renameProcessorCounter": {}, "renameProcessorName": "名称", - + "@renameProcessorName": {}, "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{删除此相册及其内容?} other{删除此相册及其 {count} 项内容?}}", + "@deleteSingleAlbumConfirmationDialogMessage": {}, "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{删除这些相册及其内容?} other{删除这些相册及其 {count} 项内容?}}", - + "@deleteMultiAlbumConfirmationDialogMessage": {}, "exportEntryDialogFormat": "格式:", + "@exportEntryDialogFormat": {}, "exportEntryDialogWidth": "宽度", + "@exportEntryDialogWidth": {}, "exportEntryDialogHeight": "高度", - + "@exportEntryDialogHeight": {}, "renameEntryDialogLabel": "新名称", - + "@renameEntryDialogLabel": {}, "editEntryDialogTargetFieldsHeader": "待修改的字段", - + "@editEntryDialogTargetFieldsHeader": {}, "editEntryDateDialogTitle": "日期和时间", + "@editEntryDateDialogTitle": {}, "editEntryDateDialogSetCustom": "设置自定义日期", + "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "复制自其他日期", + "@editEntryDateDialogCopyField": {}, "editEntryDateDialogCopyItem": "复制自其他项目", + "@editEntryDateDialogCopyItem": {}, "editEntryDateDialogExtractFromTitle": "从标题提取", + "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "转移", + "@editEntryDateDialogShift": {}, "editEntryDateDialogSourceFileModifiedDate": "文件修改日期", - + "@editEntryDateDialogSourceFileModifiedDate": {}, "durationDialogHours": "时", + "@durationDialogHours": {}, "durationDialogMinutes": "分", - + "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "位置", + "@editEntryLocationDialogTitle": {}, "editEntryLocationDialogChooseOnMapTooltip": "从地图上选择", + "@editEntryLocationDialogChooseOnMapTooltip": {}, "editEntryLocationDialogLatitude": "纬度", + "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "经度", - + "@editEntryLocationDialogLongitude": {}, "locationPickerUseThisLocationButton": "使用此位置", - + "@locationPickerUseThisLocationButton": {}, "editEntryRatingDialogTitle": "评分", - + "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "元数据移除工具", + "@removeEntryMetadataDialogTitle": {}, "removeEntryMetadataDialogMore": "更多", - + "@removeEntryMetadataDialogMore": {}, "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "播放动态照片中的视频需要 XMP\n\n确定要删除它吗?", + "@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {}, "convertMotionPhotoToStillImageWarningDialogMessage": "你确定吗?", - + "@convertMotionPhotoToStillImageWarningDialogMessage": {}, "videoSpeedDialogLabel": "播放速度", - + "@videoSpeedDialogLabel": {}, "videoStreamSelectionDialogVideo": "视频", + "@videoStreamSelectionDialogVideo": {}, "videoStreamSelectionDialogAudio": "音频", + "@videoStreamSelectionDialogAudio": {}, "videoStreamSelectionDialogText": "字幕", + "@videoStreamSelectionDialogText": {}, "videoStreamSelectionDialogOff": "关", + "@videoStreamSelectionDialogOff": {}, "videoStreamSelectionDialogTrack": "音轨", + "@videoStreamSelectionDialogTrack": {}, "videoStreamSelectionDialogNoSelection": "无其他音轨", - + "@videoStreamSelectionDialogNoSelection": {}, "genericSuccessFeedback": "完成!", + "@genericSuccessFeedback": {}, "genericFailureFeedback": "失败", - + "@genericFailureFeedback": {}, "menuActionConfigureView": "查看", + "@menuActionConfigureView": {}, "menuActionSelect": "选择", + "@menuActionSelect": {}, "menuActionSelectAll": "全选", + "@menuActionSelectAll": {}, "menuActionSelectNone": "全不选", + "@menuActionSelectNone": {}, "menuActionMap": "地图", + "@menuActionMap": {}, "menuActionSlideshow": "幻灯片", + "@menuActionSlideshow": {}, "menuActionStats": "统计", - + "@menuActionStats": {}, "viewDialogSortSectionTitle": "排序", + "@viewDialogSortSectionTitle": {}, "viewDialogGroupSectionTitle": "分组", + "@viewDialogGroupSectionTitle": {}, "viewDialogLayoutSectionTitle": "布局", + "@viewDialogLayoutSectionTitle": {}, "viewDialogReverseSortOrder": "反向排序", - + "@viewDialogReverseSortOrder": {}, "tileLayoutMosaic": "马赛克", + "@tileLayoutMosaic": {}, "tileLayoutGrid": "网格", + "@tileLayoutGrid": {}, "tileLayoutList": "列表", - + "@tileLayoutList": {}, "coverDialogTabCover": "封面", + "@coverDialogTabCover": {}, "coverDialogTabApp": "应用", + "@coverDialogTabApp": {}, "coverDialogTabColor": "颜色", - + "@coverDialogTabColor": {}, "appPickDialogTitle": "选择应用", + "@appPickDialogTitle": {}, "appPickDialogNone": "无", - + "@appPickDialogNone": {}, "aboutPageTitle": "关于", + "@aboutPageTitle": {}, "aboutLinkLicense": "许可协议", + "@aboutLinkLicense": {}, "aboutLinkPolicy": "隐私政策", - + "@aboutLinkPolicy": {}, "aboutBugSectionTitle": "报告错误", + "@aboutBugSectionTitle": {}, "aboutBugSaveLogInstruction": "将应用日志保存到文件", + "@aboutBugSaveLogInstruction": {}, "aboutBugCopyInfoInstruction": "复制系统信息", + "@aboutBugCopyInfoInstruction": {}, "aboutBugCopyInfoButton": "复制", + "@aboutBugCopyInfoButton": {}, "aboutBugReportInstruction": "在 GitHub 上报告日志和系统信息", + "@aboutBugReportInstruction": {}, "aboutBugReportButton": "报告", - + "@aboutBugReportButton": {}, "aboutCreditsSectionTitle": "鸣谢", + "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "本应用使用的 TopoJSON 文件来自", + "@aboutCreditsWorldAtlas1": {}, "aboutCreditsWorldAtlas2": "符合 ISC 许可协议", + "@aboutCreditsWorldAtlas2": {}, "aboutTranslatorsSectionTitle": "翻译人员", - + "@aboutTranslatorsSectionTitle": {}, "aboutLicensesSectionTitle": "开源许可协议", + "@aboutLicensesSectionTitle": {}, "aboutLicensesBanner": "本应用使用以下开源软件包和库", + "@aboutLicensesBanner": {}, "aboutLicensesAndroidLibrariesSectionTitle": "Android Libraries", + "@aboutLicensesAndroidLibrariesSectionTitle": {}, "aboutLicensesFlutterPluginsSectionTitle": "Flutter Plugins", + "@aboutLicensesFlutterPluginsSectionTitle": {}, "aboutLicensesFlutterPackagesSectionTitle": "Flutter Packages", + "@aboutLicensesFlutterPackagesSectionTitle": {}, "aboutLicensesDartPackagesSectionTitle": "Dart Packages", + "@aboutLicensesDartPackagesSectionTitle": {}, "aboutLicensesShowAllButtonLabel": "显示所有许可协议", - + "@aboutLicensesShowAllButtonLabel": {}, "policyPageTitle": "隐私政策", - + "@policyPageTitle": {}, "collectionPageTitle": "媒体集", + "@collectionPageTitle": {}, "collectionPickPageTitle": "挑选", + "@collectionPickPageTitle": {}, "collectionSelectPageTitle": "选择项目", - + "@collectionSelectPageTitle": {}, "collectionActionShowTitleSearch": "显示标题过滤器", + "@collectionActionShowTitleSearch": {}, "collectionActionHideTitleSearch": "隐藏标题过滤器", + "@collectionActionHideTitleSearch": {}, "collectionActionAddShortcut": "添加快捷方式", + "@collectionActionAddShortcut": {}, "collectionActionEmptyBin": "清空回收站", + "@collectionActionEmptyBin": {}, "collectionActionCopy": "复制到相册", + "@collectionActionCopy": {}, "collectionActionMove": "移至相册", + "@collectionActionMove": {}, "collectionActionRescan": "重新扫描", + "@collectionActionRescan": {}, "collectionActionEdit": "编辑", - + "@collectionActionEdit": {}, "collectionSearchTitlesHintText": "搜索标题", - + "@collectionSearchTitlesHintText": {}, "collectionGroupAlbum": "按相册", + "@collectionGroupAlbum": {}, "collectionGroupMonth": "按月份", + "@collectionGroupMonth": {}, "collectionGroupDay": "按天", + "@collectionGroupDay": {}, "collectionGroupNone": "不分组", - + "@collectionGroupNone": {}, "sectionUnknown": "未知", + "@sectionUnknown": {}, "dateToday": "今天", + "@dateToday": {}, "dateYesterday": "昨天", + "@dateYesterday": {}, "dateThisMonth": "本月", + "@dateThisMonth": {}, "collectionDeleteFailureFeedback": "{count, plural, other{{count} 项删除失败}}", + "@collectionDeleteFailureFeedback": {}, "collectionCopyFailureFeedback": "{count, plural, other{{count} 项复制失败}}", + "@collectionCopyFailureFeedback": {}, "collectionMoveFailureFeedback": "{count, plural, other{{count} 项移动失败}}", + "@collectionMoveFailureFeedback": {}, "collectionRenameFailureFeedback": "{count, plural, other{{count} 项重命名失败}}", + "@collectionRenameFailureFeedback": {}, "collectionEditFailureFeedback": "{count, plural, other{{count} 项编辑失败}}", + "@collectionEditFailureFeedback": {}, "collectionExportFailureFeedback": "{count, plural, other{{count} 页导出失败}}", + "@collectionExportFailureFeedback": {}, "collectionCopySuccessFeedback": "{count, plural, other{已复制 {count} 项}}", + "@collectionCopySuccessFeedback": {}, "collectionMoveSuccessFeedback": "{count, plural, other{已移动 {count} 项}}", + "@collectionMoveSuccessFeedback": {}, "collectionRenameSuccessFeedback": "{count, plural, other{已重命名 {count} 项}}", + "@collectionRenameSuccessFeedback": {}, "collectionEditSuccessFeedback": "{count, plural, other{已编辑 {count} 项}}", - + "@collectionEditSuccessFeedback": {}, "collectionEmptyFavourites": "无收藏项", + "@collectionEmptyFavourites": {}, "collectionEmptyVideos": "无视频", + "@collectionEmptyVideos": {}, "collectionEmptyImages": "无图像", + "@collectionEmptyImages": {}, "collectionEmptyGrantAccessButtonLabel": "授予访问权限", - + "@collectionEmptyGrantAccessButtonLabel": {}, "collectionSelectSectionTooltip": "选择部分", + "@collectionSelectSectionTooltip": {}, "collectionDeselectSectionTooltip": "取消选择部分", - + "@collectionDeselectSectionTooltip": {}, "drawerAboutButton": "关于", + "@drawerAboutButton": {}, "drawerSettingsButton": "设置", + "@drawerSettingsButton": {}, "drawerCollectionAll": "所有媒体集", + "@drawerCollectionAll": {}, "drawerCollectionFavourites": "收藏夹", + "@drawerCollectionFavourites": {}, "drawerCollectionImages": "图像", + "@drawerCollectionImages": {}, "drawerCollectionVideos": "视频", + "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "动画", + "@drawerCollectionAnimated": {}, "drawerCollectionMotionPhotos": "动态照片", + "@drawerCollectionMotionPhotos": {}, "drawerCollectionPanoramas": "全景图", + "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "Raw 照片", + "@drawerCollectionRaws": {}, "drawerCollectionSphericalVideos": "360° 视频", + "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "相册", + "@drawerAlbumPage": {}, "drawerCountryPage": "国家", + "@drawerCountryPage": {}, "drawerTagPage": "标签", - + "@drawerTagPage": {}, "sortByDate": "按日期", + "@sortByDate": {}, "sortByName": "按名称", + "@sortByName": {}, "sortByItemCount": "按数量", + "@sortByItemCount": {}, "sortBySize": "按大小", + "@sortBySize": {}, "sortByAlbumFileName": "按相册和文件名", + "@sortByAlbumFileName": {}, "sortByRating": "按评分", - + "@sortByRating": {}, "sortOrderNewestFirst": "降序", + "@sortOrderNewestFirst": {}, "sortOrderOldestFirst": "升序", + "@sortOrderOldestFirst": {}, "sortOrderAtoZ": "A — Z", + "@sortOrderAtoZ": {}, "sortOrderZtoA": "Z — A", + "@sortOrderZtoA": {}, "sortOrderHighestFirst": "由高到低", + "@sortOrderHighestFirst": {}, "sortOrderLowestFirst": "由低到高", + "@sortOrderLowestFirst": {}, "sortOrderLargestFirst": "由大到小", + "@sortOrderLargestFirst": {}, "sortOrderSmallestFirst": "由小到大", - + "@sortOrderSmallestFirst": {}, "albumGroupTier": "按层级", + "@albumGroupTier": {}, "albumGroupType": "按类型", + "@albumGroupType": {}, "albumGroupVolume": "按存储卷", + "@albumGroupVolume": {}, "albumGroupNone": "不分组", - + "@albumGroupNone": {}, "albumMimeTypeMixed": "混合", - + "@albumMimeTypeMixed": {}, "albumPickPageTitleCopy": "复制到相册", + "@albumPickPageTitleCopy": {}, "albumPickPageTitleExport": "导出到相册", + "@albumPickPageTitleExport": {}, "albumPickPageTitleMove": "移至相册", + "@albumPickPageTitleMove": {}, "albumPickPageTitlePick": "选择相册", - + "@albumPickPageTitlePick": {}, "albumCamera": "相机", + "@albumCamera": {}, "albumDownload": "下载", + "@albumDownload": {}, "albumScreenshots": "截图", + "@albumScreenshots": {}, "albumScreenRecordings": "屏幕录制", + "@albumScreenRecordings": {}, "albumVideoCaptures": "视频捕获", - + "@albumVideoCaptures": {}, "albumPageTitle": "相册", + "@albumPageTitle": {}, "albumEmpty": "无相册", + "@albumEmpty": {}, "createAlbumTooltip": "创建相册", + "@createAlbumTooltip": {}, "createAlbumButtonLabel": "创建", + "@createAlbumButtonLabel": {}, "newFilterBanner": "新的", - + "@newFilterBanner": {}, "countryPageTitle": "国家", + "@countryPageTitle": {}, "countryEmpty": "无国家", - + "@countryEmpty": {}, "tagPageTitle": "标签", + "@tagPageTitle": {}, "tagEmpty": "无标签", - + "@tagEmpty": {}, "binPageTitle": "回收站", - + "@binPageTitle": {}, "searchCollectionFieldHint": "搜索媒体集", + "@searchCollectionFieldHint": {}, "searchRecentSectionTitle": "最近", + "@searchRecentSectionTitle": {}, "searchDateSectionTitle": "日期", + "@searchDateSectionTitle": {}, "searchAlbumsSectionTitle": "相册", + "@searchAlbumsSectionTitle": {}, "searchCountriesSectionTitle": "国家", + "@searchCountriesSectionTitle": {}, "searchPlacesSectionTitle": "地点", + "@searchPlacesSectionTitle": {}, "searchTagsSectionTitle": "标签", + "@searchTagsSectionTitle": {}, "searchRatingSectionTitle": "评分", + "@searchRatingSectionTitle": {}, "searchMetadataSectionTitle": "元数据", - + "@searchMetadataSectionTitle": {}, "settingsPageTitle": "设置", + "@settingsPageTitle": {}, "settingsSystemDefault": "系统", + "@settingsSystemDefault": {}, "settingsDefault": "默认", + "@settingsDefault": {}, "settingsDisabled": "禁用", - + "@settingsDisabled": {}, "settingsSearchFieldLabel": "搜索设置", + "@settingsSearchFieldLabel": {}, "settingsSearchEmpty": "无匹配设置项", + "@settingsSearchEmpty": {}, "settingsActionExport": "导出", + "@settingsActionExport": {}, "settingsActionExportDialogTitle": "导出", + "@settingsActionExportDialogTitle": {}, "settingsActionImport": "导入", + "@settingsActionImport": {}, "settingsActionImportDialogTitle": "导入", - + "@settingsActionImportDialogTitle": {}, "appExportCovers": "封面", + "@appExportCovers": {}, "appExportFavourites": "收藏夹", + "@appExportFavourites": {}, "appExportSettings": "设置", - + "@appExportSettings": {}, "settingsNavigationSectionTitle": "导航", + "@settingsNavigationSectionTitle": {}, "settingsHomeTile": "主页", + "@settingsHomeTile": {}, "settingsHomeDialogTitle": "主页", + "@settingsHomeDialogTitle": {}, "settingsShowBottomNavigationBar": "显示底部导航栏", + "@settingsShowBottomNavigationBar": {}, "settingsKeepScreenOnTile": "保持亮屏", + "@settingsKeepScreenOnTile": {}, "settingsKeepScreenOnDialogTitle": "保持亮屏", + "@settingsKeepScreenOnDialogTitle": {}, "settingsDoubleBackExit": "按两次返回键退出", - + "@settingsDoubleBackExit": {}, "settingsConfirmationTile": "确认对话框", + "@settingsConfirmationTile": {}, "settingsConfirmationDialogTitle": "确认对话框", + "@settingsConfirmationDialogTitle": {}, "settingsConfirmationBeforeDeleteItems": "永久删除项目之前询问", + "@settingsConfirmationBeforeDeleteItems": {}, "settingsConfirmationBeforeMoveToBinItems": "移至回收站之前询问", + "@settingsConfirmationBeforeMoveToBinItems": {}, "settingsConfirmationBeforeMoveUndatedItems": "移动未注明日期的项目之前询问", + "@settingsConfirmationBeforeMoveUndatedItems": {}, "settingsConfirmationAfterMoveToBinItems": "移至回收站后显示消息", - + "@settingsConfirmationAfterMoveToBinItems": {}, "settingsNavigationDrawerTile": "导航栏菜单", + "@settingsNavigationDrawerTile": {}, "settingsNavigationDrawerEditorPageTitle": "导航栏菜单", + "@settingsNavigationDrawerEditorPageTitle": {}, "settingsNavigationDrawerBanner": "长按移动和重新排序菜单项", + "@settingsNavigationDrawerBanner": {}, "settingsNavigationDrawerTabTypes": "类型", + "@settingsNavigationDrawerTabTypes": {}, "settingsNavigationDrawerTabAlbums": "相册", + "@settingsNavigationDrawerTabAlbums": {}, "settingsNavigationDrawerTabPages": "页面", + "@settingsNavigationDrawerTabPages": {}, "settingsNavigationDrawerAddAlbum": "添加相册", - + "@settingsNavigationDrawerAddAlbum": {}, "settingsThumbnailSectionTitle": "缩略图", + "@settingsThumbnailSectionTitle": {}, "settingsThumbnailOverlayTile": "叠加层", + "@settingsThumbnailOverlayTile": {}, "settingsThumbnailOverlayPageTitle": "叠加层", + "@settingsThumbnailOverlayPageTitle": {}, "settingsThumbnailShowFavouriteIcon": "显示收藏图标", + "@settingsThumbnailShowFavouriteIcon": {}, "settingsThumbnailShowTagIcon": "显示标签图标", + "@settingsThumbnailShowTagIcon": {}, "settingsThumbnailShowLocationIcon": "显示位置图标", + "@settingsThumbnailShowLocationIcon": {}, "settingsThumbnailShowMotionPhotoIcon": "显示动态照片图标", + "@settingsThumbnailShowMotionPhotoIcon": {}, "settingsThumbnailShowRating": "显示评分", + "@settingsThumbnailShowRating": {}, "settingsThumbnailShowRawIcon": "显示 raw 图标", + "@settingsThumbnailShowRawIcon": {}, "settingsThumbnailShowVideoDuration": "显示视频时长", - + "@settingsThumbnailShowVideoDuration": {}, "settingsCollectionQuickActionsTile": "快速操作", + "@settingsCollectionQuickActionsTile": {}, "settingsCollectionQuickActionEditorPageTitle": "快速操作", + "@settingsCollectionQuickActionEditorPageTitle": {}, "settingsCollectionQuickActionTabBrowsing": "浏览", + "@settingsCollectionQuickActionTabBrowsing": {}, "settingsCollectionQuickActionTabSelecting": "选择", + "@settingsCollectionQuickActionTabSelecting": {}, "settingsCollectionBrowsingQuickActionEditorBanner": "按住并拖拽可移动按钮并选择浏览项目时显示的操作", + "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "按住并拖拽可移动按钮并选择选择项目时显示的操作", - + "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "查看器", + "@settingsViewerSectionTitle": {}, "settingsViewerGestureSideTapNext": "轻触屏幕边缘显示上/下一个项目", + "@settingsViewerGestureSideTapNext": {}, "settingsViewerUseCutout": "使用剪切区域", + "@settingsViewerUseCutout": {}, "settingsViewerMaximumBrightness": "最大亮度", + "@settingsViewerMaximumBrightness": {}, "settingsMotionPhotoAutoPlay": "自动播放动态照片", + "@settingsMotionPhotoAutoPlay": {}, "settingsImageBackground": "图像背景", - + "@settingsImageBackground": {}, "settingsViewerQuickActionsTile": "快速操作", + "@settingsViewerQuickActionsTile": {}, "settingsViewerQuickActionEditorPageTitle": "快速操作", + "@settingsViewerQuickActionEditorPageTitle": {}, "settingsViewerQuickActionEditorBanner": "按住并拖拽可移动按钮并选择查看器中显示的操作", + "@settingsViewerQuickActionEditorBanner": {}, "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "显示的按钮", + "@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {}, "settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "可用按钮", + "@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {}, "settingsViewerQuickActionEmpty": "无按钮", - + "@settingsViewerQuickActionEmpty": {}, "settingsViewerOverlayTile": "叠加层", + "@settingsViewerOverlayTile": {}, "settingsViewerOverlayPageTitle": "叠加层", + "@settingsViewerOverlayPageTitle": {}, "settingsViewerShowOverlayOnOpening": "打开时显示", + "@settingsViewerShowOverlayOnOpening": {}, "settingsViewerShowMinimap": "显示小地图", + "@settingsViewerShowMinimap": {}, "settingsViewerShowInformation": "显示信息", + "@settingsViewerShowInformation": {}, "settingsViewerShowInformationSubtitle": "显示标题、日期、位置等", + "@settingsViewerShowInformationSubtitle": {}, "settingsViewerShowShootingDetails": "显示拍摄详情", + "@settingsViewerShowShootingDetails": {}, "settingsViewerShowOverlayThumbnails": "显示缩略图", + "@settingsViewerShowOverlayThumbnails": {}, "settingsViewerEnableOverlayBlurEffect": "模糊特效", - + "@settingsViewerEnableOverlayBlurEffect": {}, "settingsViewerSlideshowTile": "幻灯片", + "@settingsViewerSlideshowTile": {}, "settingsViewerSlideshowPageTitle": "幻灯片", + "@settingsViewerSlideshowPageTitle": {}, "settingsSlideshowRepeat": "重复", + "@settingsSlideshowRepeat": {}, "settingsSlideshowShuffle": "随机播放", + "@settingsSlideshowShuffle": {}, "settingsSlideshowFillScreen": "填充屏幕", + "@settingsSlideshowFillScreen": {}, "settingsSlideshowAnimatedZoomEffect": "动画缩放效果", + "@settingsSlideshowAnimatedZoomEffect": {}, "settingsSlideshowTransitionTile": "过渡动画", + "@settingsSlideshowTransitionTile": {}, "settingsSlideshowIntervalTile": "时间间隔", + "@settingsSlideshowIntervalTile": {}, "settingsSlideshowVideoPlaybackTile": "视频回放", + "@settingsSlideshowVideoPlaybackTile": {}, "settingsSlideshowVideoPlaybackDialogTitle": "视频回放", - + "@settingsSlideshowVideoPlaybackDialogTitle": {}, "settingsVideoPageTitle": "视频设置", + "@settingsVideoPageTitle": {}, "settingsVideoSectionTitle": "视频", + "@settingsVideoSectionTitle": {}, "settingsVideoShowVideos": "显示视频", + "@settingsVideoShowVideos": {}, "settingsVideoEnableHardwareAcceleration": "硬件加速", + "@settingsVideoEnableHardwareAcceleration": {}, "settingsVideoAutoPlay": "自动播放", + "@settingsVideoAutoPlay": {}, "settingsVideoLoopModeTile": "循环模式", + "@settingsVideoLoopModeTile": {}, "settingsVideoLoopModeDialogTitle": "循环模式", - + "@settingsVideoLoopModeDialogTitle": {}, "settingsSubtitleThemeTile": "字幕", + "@settingsSubtitleThemeTile": {}, "settingsSubtitleThemePageTitle": "字幕", + "@settingsSubtitleThemePageTitle": {}, "settingsSubtitleThemeSample": "这是一个字幕示例。", + "@settingsSubtitleThemeSample": {}, "settingsSubtitleThemeTextAlignmentTile": "对齐方式", + "@settingsSubtitleThemeTextAlignmentTile": {}, "settingsSubtitleThemeTextAlignmentDialogTitle": "对齐方式", + "@settingsSubtitleThemeTextAlignmentDialogTitle": {}, "settingsSubtitleThemeTextSize": "文本大小", + "@settingsSubtitleThemeTextSize": {}, "settingsSubtitleThemeShowOutline": "显示轮廓和阴影", + "@settingsSubtitleThemeShowOutline": {}, "settingsSubtitleThemeTextColor": "文本颜色", + "@settingsSubtitleThemeTextColor": {}, "settingsSubtitleThemeTextOpacity": "文本透明度", + "@settingsSubtitleThemeTextOpacity": {}, "settingsSubtitleThemeBackgroundColor": "背景色", + "@settingsSubtitleThemeBackgroundColor": {}, "settingsSubtitleThemeBackgroundOpacity": "背景透明度", + "@settingsSubtitleThemeBackgroundOpacity": {}, "settingsSubtitleThemeTextAlignmentLeft": "居左", + "@settingsSubtitleThemeTextAlignmentLeft": {}, "settingsSubtitleThemeTextAlignmentCenter": "居中", + "@settingsSubtitleThemeTextAlignmentCenter": {}, "settingsSubtitleThemeTextAlignmentRight": "居右", - + "@settingsSubtitleThemeTextAlignmentRight": {}, "settingsVideoControlsTile": "控件", + "@settingsVideoControlsTile": {}, "settingsVideoControlsPageTitle": "控件", + "@settingsVideoControlsPageTitle": {}, "settingsVideoButtonsTile": "按钮", + "@settingsVideoButtonsTile": {}, "settingsVideoGestureDoubleTapTogglePlay": "双击播放/暂停", + "@settingsVideoGestureDoubleTapTogglePlay": {}, "settingsVideoGestureSideDoubleTapSeek": "双击屏幕边缘步进/步退", - + "@settingsVideoGestureSideDoubleTapSeek": {}, "settingsPrivacySectionTitle": "隐私", + "@settingsPrivacySectionTitle": {}, "settingsAllowInstalledAppAccess": "允许访问应用清单", + "@settingsAllowInstalledAppAccess": {}, "settingsAllowInstalledAppAccessSubtitle": "用于改善相册显示结果", + "@settingsAllowInstalledAppAccessSubtitle": {}, "settingsAllowErrorReporting": "允许匿名错误报告", + "@settingsAllowErrorReporting": {}, "settingsSaveSearchHistory": "保存搜索历史记录", + "@settingsSaveSearchHistory": {}, "settingsEnableBin": "启用回收站", + "@settingsEnableBin": {}, "settingsEnableBinSubtitle": "将删除项保留 30 天", - + "@settingsEnableBinSubtitle": {}, "settingsHiddenItemsTile": "隐藏项", + "@settingsHiddenItemsTile": {}, "settingsHiddenItemsPageTitle": "隐藏项", - + "@settingsHiddenItemsPageTitle": {}, "settingsHiddenItemsTabFilters": "隐藏过滤器", + "@settingsHiddenItemsTabFilters": {}, "settingsHiddenFiltersBanner": "匹配隐藏过滤器的照片和视频将不会出现在你的媒体集中", + "@settingsHiddenFiltersBanner": {}, "settingsHiddenFiltersEmpty": "无隐藏过滤器", - + "@settingsHiddenFiltersEmpty": {}, "settingsHiddenItemsTabPaths": "隐藏路径", + "@settingsHiddenItemsTabPaths": {}, "settingsHiddenPathsBanner": "以下文件夹及其子文件夹中的照片和视频将不会出现在你的媒体集中", + "@settingsHiddenPathsBanner": {}, "addPathTooltip": "添加路径", - + "@addPathTooltip": {}, "settingsStorageAccessTile": "存储访问", + "@settingsStorageAccessTile": {}, "settingsStorageAccessPageTitle": "存储访问", + "@settingsStorageAccessPageTitle": {}, "settingsStorageAccessBanner": "某些目录需要具有明确的访问权限才能修改其中的文件,你可以在此处查看你之前已授予访问权限的目录", + "@settingsStorageAccessBanner": {}, "settingsStorageAccessEmpty": "尚未授予访问权限", + "@settingsStorageAccessEmpty": {}, "settingsStorageAccessRevokeTooltip": "撤消", - + "@settingsStorageAccessRevokeTooltip": {}, "settingsAccessibilitySectionTitle": "无障碍", + "@settingsAccessibilitySectionTitle": {}, "settingsRemoveAnimationsTile": "移除动画", + "@settingsRemoveAnimationsTile": {}, "settingsRemoveAnimationsDialogTitle": "移除动画", + "@settingsRemoveAnimationsDialogTitle": {}, "settingsTimeToTakeActionTile": "生效时间", - + "@settingsTimeToTakeActionTile": {}, "settingsDisplaySectionTitle": "显示", + "@settingsDisplaySectionTitle": {}, "settingsThemeBrightnessTile": "主题", + "@settingsThemeBrightnessTile": {}, "settingsThemeBrightnessDialogTitle": "主题", + "@settingsThemeBrightnessDialogTitle": {}, "settingsThemeColorHighlights": "色彩强调", + "@settingsThemeColorHighlights": {}, "settingsThemeEnableDynamicColor": "动态色彩", + "@settingsThemeEnableDynamicColor": {}, "settingsDisplayRefreshRateModeTile": "显示刷新率", + "@settingsDisplayRefreshRateModeTile": {}, "settingsDisplayRefreshRateModeDialogTitle": "刷新率", - + "@settingsDisplayRefreshRateModeDialogTitle": {}, "settingsLanguageSectionTitle": "语言和格式", + "@settingsLanguageSectionTitle": {}, "settingsLanguageTile": "界面语言", + "@settingsLanguageTile": {}, "settingsLanguagePageTitle": "界面语言", + "@settingsLanguagePageTitle": {}, "settingsCoordinateFormatTile": "坐标格式", + "@settingsCoordinateFormatTile": {}, "settingsCoordinateFormatDialogTitle": "坐标格式", + "@settingsCoordinateFormatDialogTitle": {}, "settingsUnitSystemTile": "单位", + "@settingsUnitSystemTile": {}, "settingsUnitSystemDialogTitle": "单位", - + "@settingsUnitSystemDialogTitle": {}, "settingsScreenSaverPageTitle": "屏保", - + "@settingsScreenSaverPageTitle": {}, "settingsWidgetPageTitle": "相框", + "@settingsWidgetPageTitle": {}, "settingsWidgetShowOutline": "轮廓", + "@settingsWidgetShowOutline": {}, "settingsWidgetOpenPage": "轻触小部件时", - + "@settingsWidgetOpenPage": {}, "settingsCollectionTile": "媒体集", - + "@settingsCollectionTile": {}, "statsPageTitle": "统计", + "@statsPageTitle": {}, "statsWithGps": "{count, plural, other{{count} 项带位置信息}}", + "@statsWithGps": {}, "statsTopCountriesSectionTitle": "热门国家", + "@statsTopCountriesSectionTitle": {}, "statsTopPlacesSectionTitle": "热门地点", + "@statsTopPlacesSectionTitle": {}, "statsTopTagsSectionTitle": "热门标签", + "@statsTopTagsSectionTitle": {}, "statsTopAlbumsSectionTitle": "热门相册", - + "@statsTopAlbumsSectionTitle": {}, "viewerOpenPanoramaButtonLabel": "打开全景", + "@viewerOpenPanoramaButtonLabel": {}, "viewerSetWallpaperButtonLabel": "设置壁纸", + "@viewerSetWallpaperButtonLabel": {}, "viewerErrorUnknown": "糟糕!", + "@viewerErrorUnknown": {}, "viewerErrorDoesNotExist": "该文件不存在", - + "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "信息", + "@viewerInfoPageTitle": {}, "viewerInfoBackToViewerTooltip": "返回查看器", - + "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "未知", + "@viewerInfoUnknown": {}, "viewerInfoLabelDescription": "备注", + "@viewerInfoLabelDescription": {}, "viewerInfoLabelTitle": "标题", + "@viewerInfoLabelTitle": {}, "viewerInfoLabelDate": "日期", + "@viewerInfoLabelDate": {}, "viewerInfoLabelResolution": "分辨率", + "@viewerInfoLabelResolution": {}, "viewerInfoLabelSize": "大小", + "@viewerInfoLabelSize": {}, "viewerInfoLabelUri": "URI", + "@viewerInfoLabelUri": {}, "viewerInfoLabelPath": "路径", + "@viewerInfoLabelPath": {}, "viewerInfoLabelDuration": "时长", + "@viewerInfoLabelDuration": {}, "viewerInfoLabelOwner": "所有者", + "@viewerInfoLabelOwner": {}, "viewerInfoLabelCoordinates": "坐标", + "@viewerInfoLabelCoordinates": {}, "viewerInfoLabelAddress": "地址", - + "@viewerInfoLabelAddress": {}, "mapStyleDialogTitle": "地图样式", + "@mapStyleDialogTitle": {}, "mapStyleTooltip": "选择地图样式", + "@mapStyleTooltip": {}, "mapZoomInTooltip": "放大", + "@mapZoomInTooltip": {}, "mapZoomOutTooltip": "缩小", + "@mapZoomOutTooltip": {}, "mapPointNorthUpTooltip": "上北下南", + "@mapPointNorthUpTooltip": {}, "mapAttributionOsmHot": "地图数据由 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 贡献 • 绘制于 [HOT](https://www.hotosm.org/) • 主办方 [OSM France](https://openstreetmap.fr/)", + "@mapAttributionOsmHot": {}, "mapAttributionStamen": "地图数据由 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 贡献 • 绘制于 [Stamen Design](http://stamen.com), [CC BY 3.0](http://creativecommons.org/licenses/by/3.0)", + "@mapAttributionStamen": {}, "openMapPageTooltip": "在地图页面上查看", + "@openMapPageTooltip": {}, "mapEmptyRegion": "该地区没有图片", - + "@mapEmptyRegion": {}, "viewerInfoOpenEmbeddedFailureFeedback": "提取嵌入数据失败", + "@viewerInfoOpenEmbeddedFailureFeedback": {}, "viewerInfoOpenLinkText": "打开", + "@viewerInfoOpenLinkText": {}, "viewerInfoViewXmlLinkText": "查看 XML", - + "@viewerInfoViewXmlLinkText": {}, "viewerInfoSearchFieldLabel": "搜索元数据", + "@viewerInfoSearchFieldLabel": {}, "viewerInfoSearchEmpty": "无匹配键", + "@viewerInfoSearchEmpty": {}, "viewerInfoSearchSuggestionDate": "日期和时间", + "@viewerInfoSearchSuggestionDate": {}, "viewerInfoSearchSuggestionDescription": "描述", + "@viewerInfoSearchSuggestionDescription": {}, "viewerInfoSearchSuggestionDimensions": "尺寸", + "@viewerInfoSearchSuggestionDimensions": {}, "viewerInfoSearchSuggestionResolution": "分辨率", + "@viewerInfoSearchSuggestionResolution": {}, "viewerInfoSearchSuggestionRights": "所有权", - + "@viewerInfoSearchSuggestionRights": {}, "wallpaperUseScrollEffect": "在主屏幕上使用滚动效果", - + "@wallpaperUseScrollEffect": {}, "tagEditorPageTitle": "编辑标签", + "@tagEditorPageTitle": {}, "tagEditorPageNewTagFieldLabel": "新标签", + "@tagEditorPageNewTagFieldLabel": {}, "tagEditorPageAddTagTooltip": "添加标签", + "@tagEditorPageAddTagTooltip": {}, "tagEditorSectionRecent": "最近", - + "@tagEditorSectionRecent": {}, "panoramaEnableSensorControl": "启用传感器控制", + "@panoramaEnableSensorControl": {}, "panoramaDisableSensorControl": "禁用传感器控制", - + "@panoramaDisableSensorControl": {}, "sourceViewerPageTitle": "源码", - + "@sourceViewerPageTitle": {}, "filePickerShowHiddenFiles": "显示隐藏文件", + "@filePickerShowHiddenFiles": {}, "filePickerDoNotShowHiddenFiles": "不显示隐藏文件", + "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "打开自", + "@filePickerOpenFrom": {}, "filePickerNoItems": "无项目", - "filePickerUseThisFolder": "使用此文件夹" + "@filePickerNoItems": {}, + "filePickerUseThisFolder": "使用此文件夹", + "@filePickerUseThisFolder": {} } From 31810813c82df61e24fc72ab01f809ffdf7ac495 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Mon, 24 Oct 2022 11:38:53 +0200 Subject: [PATCH 15/53] l10n by weblate (#367) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Allan Nordhøy <epost@anotheragency.no> Co-authored-by: Daniel <its.ghost.message@gmail.com> Co-authored-by: Havokdan <havokdan@yahoo.com.br> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Piotr K <1337.kelt@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Weblate <noreply@weblate.org> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: امیر جهانگرد <ijahangard.a@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/el/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/id/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/it/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/el/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/pl/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: Allan Nordhøy <epost@anotheragency.no> Co-authored-by: Daniel <its.ghost.message@gmail.com> Co-authored-by: Havokdan <havokdan@yahoo.com.br> Co-authored-by: Piotr K <1337.kelt@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: امیر جهانگرد <ijahangard.a@gmail.com> --- .../src/main/res/values-pt-rBR/strings.xml | 2 - .../metadata/android/pl/full_description.txt | 2 +- .../android/pt_BR/full_description.txt | 5 -- .../android/pt_BR/short_description.txt | 1 - lib/l10n/app_pt.arb | 30 +++++---- lib/l10n/app_pt_BR.arb | 65 ++++++++++++++++++- 6 files changed, 81 insertions(+), 24 deletions(-) delete mode 100644 android/app/src/main/res/values-pt-rBR/strings.xml delete mode 100644 fastlane/metadata/android/pt_BR/full_description.txt delete mode 100644 fastlane/metadata/android/pt_BR/short_description.txt diff --git a/android/app/src/main/res/values-pt-rBR/strings.xml b/android/app/src/main/res/values-pt-rBR/strings.xml deleted file mode 100644 index a6b3daec9..000000000 --- a/android/app/src/main/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources></resources> \ No newline at end of file diff --git a/fastlane/metadata/android/pl/full_description.txt b/fastlane/metadata/android/pl/full_description.txt index 983675856..2c26d7bb2 100644 --- a/fastlane/metadata/android/pl/full_description.txt +++ b/fastlane/metadata/android/pl/full_description.txt @@ -1,5 +1,5 @@ <i>Aves</i> obsługuje wszelkiego rodzaju obrazy i filmy, w tym typowe pliki JPEG i MP4 ale także bardziej egzotyczne formaty takie jak <b>wielostronnicowe pliki TIFF, SVG, stare pliki AVI i wiele więcej</b>! Skanuje twoją kolekcję multimediów aby zidentyfikować <b>ruchome zdjęcia</b>, <b>panoramy</b> (inaczej zdjęcia sferyczne), <b>filmy 360°</b>, a także pliki <b>GeoTIFF</b>. -<b>Nawigacja i wyszukiwanie</b> jest ważną częścią <i>Aves</i>. Celem jest aby użytkownicy mogli łatwo przechodzić od albumów do zdjęć, tagów, map itp. +<b>Nawigacja i wyszukiwanie</b> jest ważną częścią <i>Aves</i>. Celem jest aby użytkownicy mogli łatwo przechodzić od albumów do zdjęć, tagów, map itd. <i>Aves</i> integruje się z Androidem (od <b>API 19 do 33</b>, czyli od KitKata do Androida 13) z funkcjami takimi jak <b>widżety</b>, <b>skróty do aplikacji</b>, <b>wygaszacz ekranu</b> i <b>obsługa globalnego wyszukiwania</b>. Działa również jako <b>przeglądarka i selektor mediów</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/pt_BR/full_description.txt b/fastlane/metadata/android/pt_BR/full_description.txt deleted file mode 100644 index 8806906a1..000000000 --- a/fastlane/metadata/android/pt_BR/full_description.txt +++ /dev/null @@ -1,5 +0,0 @@ -<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. - -<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. - -<i>Aves</i> integrates with Android (from <b>API 19 to 33</b>, i.e. from KitKat to Android 13) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/pt_BR/short_description.txt b/fastlane/metadata/android/pt_BR/short_description.txt deleted file mode 100644 index 8c9445bd5..000000000 --- a/fastlane/metadata/android/pt_BR/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -Gallery and metadata explorer \ No newline at end of file diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index c6a48ff21..aca84d7e8 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -17,11 +17,11 @@ "@timeDays": {}, "focalLength": "{length} mm", "@focalLength": {}, - "applyButtonLabel": "APLIQUE", + "applyButtonLabel": "APLICAR", "@applyButtonLabel": {}, "deleteButtonLabel": "EXCLUIR", "@deleteButtonLabel": {}, - "nextButtonLabel": "PROXIMO", + "nextButtonLabel": "SEGUINTE", "@nextButtonLabel": {}, "showButtonLabel": "MOSTRAR", "@showButtonLabel": {}, @@ -29,15 +29,15 @@ "@hideButtonLabel": {}, "continueButtonLabel": "CONTINUAR", "@continueButtonLabel": {}, - "cancelTooltip": "Cancela", + "cancelTooltip": "Cancelar", "@cancelTooltip": {}, "changeTooltip": "Mudar", "@changeTooltip": {}, - "clearTooltip": "Claro", + "clearTooltip": "Limpar", "@clearTooltip": {}, "previousTooltip": "Anterior", "@previousTooltip": {}, - "nextTooltip": "Proximo", + "nextTooltip": "Seguinte", "@nextTooltip": {}, "showTooltip": "Mostrar", "@showTooltip": {}, @@ -45,31 +45,31 @@ "@hideTooltip": {}, "actionRemove": "Remover", "@actionRemove": {}, - "resetTooltip": "Resetar", + "resetTooltip": "Redefinir", "@resetTooltip": {}, - "saveTooltip": "Salve", + "saveTooltip": "Salvar", "@saveTooltip": {}, "pickTooltip": "Escolher", "@pickTooltip": {}, - "doubleBackExitMessage": "Toque em “voltar” novamente para sair.", + "doubleBackExitMessage": "Toque “voltar” novamente para sair.", "@doubleBackExitMessage": {}, - "doNotAskAgain": "Não pergunte novamente", + "doNotAskAgain": "Não perguntar novamente", "@doNotAskAgain": {}, "sourceStateLoading": "Carregando", "@sourceStateLoading": {}, - "sourceStateCataloguing": "Catalogação", + "sourceStateCataloguing": "Catalogando", "@sourceStateCataloguing": {}, "sourceStateLocatingCountries": "Localizando países", "@sourceStateLocatingCountries": {}, "sourceStateLocatingPlaces": "Localizando lugares", "@sourceStateLocatingPlaces": {}, - "chipActionDelete": "Deletar", + "chipActionDelete": "Excluir", "@chipActionDelete": {}, "chipActionGoToAlbumPage": "Mostrar nos Álbuns", "@chipActionGoToAlbumPage": {}, - "chipActionGoToCountryPage": "Mostrar em Países", + "chipActionGoToCountryPage": "Mostrar nos Países", "@chipActionGoToCountryPage": {}, - "chipActionGoToTagPage": "Mostrar em Etiquetas", + "chipActionGoToTagPage": "Mostrar nas Etiquetas", "@chipActionGoToTagPage": {}, "chipActionFilterOut": "Filtrar dentro", "@chipActionFilterOut": {}, @@ -1142,5 +1142,7 @@ "filePickerNoItems": "Nenhum itens", "@filePickerNoItems": {}, "filePickerUseThisFolder": "Usar esta pasta", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "widgetOpenPageCollection": "Abrir coleção", + "@widgetOpenPageCollection": {} } diff --git a/lib/l10n/app_pt_BR.arb b/lib/l10n/app_pt_BR.arb index 0967ef424..c7295586c 100644 --- a/lib/l10n/app_pt_BR.arb +++ b/lib/l10n/app_pt_BR.arb @@ -1 +1,64 @@ -{} +{ + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Bem-vindo ao Aves", + "@welcomeMessage": {}, + "welcomeOptional": "Opcional", + "@welcomeOptional": {}, + "applyButtonLabel": "APLICAR", + "@applyButtonLabel": {}, + "deleteButtonLabel": "EXCLUIR", + "@deleteButtonLabel": {}, + "nextButtonLabel": "SEGUINTE", + "@nextButtonLabel": {}, + "showButtonLabel": "MOSTRAR", + "@showButtonLabel": {}, + "hideButtonLabel": "OCULTAR", + "@hideButtonLabel": {}, + "continueButtonLabel": "CONTINUAR", + "@continueButtonLabel": {}, + "cancelTooltip": "Cancelar", + "@cancelTooltip": {}, + "clearTooltip": "Limpar", + "@clearTooltip": {}, + "nextTooltip": "Seguinte", + "@nextTooltip": {}, + "showTooltip": "Mostrar", + "@showTooltip": {}, + "hideTooltip": "Ocultar", + "@hideTooltip": {}, + "actionRemove": "Remover", + "@actionRemove": {}, + "resetTooltip": "Redefinir", + "@resetTooltip": {}, + "saveTooltip": "Salvar", + "@saveTooltip": {}, + "pickTooltip": "Escolher", + "@pickTooltip": {}, + "doubleBackExitMessage": "Toque \"voltar\" novamente para sair.", + "@doubleBackExitMessage": {}, + "doNotAskAgain": "Não perguntar novamente", + "@doNotAskAgain": {}, + "sourceStateLoading": "Carregando", + "@sourceStateLoading": {}, + "sourceStateCataloguing": "Catalogando", + "@sourceStateCataloguing": {}, + "sourceStateLocatingCountries": "Localizando países", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Localizando lugares", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Excluir", + "@chipActionDelete": {}, + "chipActionGoToAlbumPage": "Mostrar nos Álbuns", + "@chipActionGoToAlbumPage": {}, + "chipActionGoToCountryPage": "Mostrar nos Países", + "@chipActionGoToCountryPage": {}, + "chipActionGoToTagPage": "Mostrar nas Etiquetas", + "@chipActionGoToTagPage": {}, + "changeTooltip": "Mudar", + "@changeTooltip": {}, + "previousTooltip": "Anterior", + "@previousTooltip": {}, + "welcomeTermsToggle": "Eu concordo com os termos e condições", + "@welcomeTermsToggle": {} +} From 514cb5a230471b3ded1ab11845c891060960f072 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Mon, 24 Oct 2022 11:43:02 +0200 Subject: [PATCH 16/53] Translations update from Hosted Weblate (#369) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * l10n by weblate Co-authored-by: Allan Nordhøy <epost@anotheragency.no> Co-authored-by: Daniel <its.ghost.message@gmail.com> Co-authored-by: Havokdan <havokdan@yahoo.com.br> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Piotr K <1337.kelt@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Weblate <noreply@weblate.org> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: امیر جهانگرد <ijahangard.a@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/el/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/id/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/it/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/el/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/pl/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description * Deleted translation using Weblate (Portuguese (Brazil)) * Deleted translation using Weblate (Portuguese (Brazil)) * Deleted translation using Weblate (Portuguese (Brazil)) Co-authored-by: Allan Nordhøy <epost@anotheragency.no> Co-authored-by: Daniel <its.ghost.message@gmail.com> Co-authored-by: Havokdan <havokdan@yahoo.com.br> Co-authored-by: Piotr K <1337.kelt@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: امیر جهانگرد <ijahangard.a@gmail.com> --- .../android/pt-BR/full_description.txt | 5 -- .../android/pt-BR/short_description.txt | 1 - lib/l10n/app_pt_BR.arb | 64 ------------------- 3 files changed, 70 deletions(-) delete mode 100644 fastlane/metadata/android/pt-BR/full_description.txt delete mode 100644 fastlane/metadata/android/pt-BR/short_description.txt delete mode 100644 lib/l10n/app_pt_BR.arb diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt deleted file mode 100644 index a095036ca..000000000 --- a/fastlane/metadata/android/pt-BR/full_description.txt +++ /dev/null @@ -1,5 +0,0 @@ -<i>Aves</i> pode lidar com todos os tipos de imagens e vídeos, incluindo seus típicos JPEGs e MP4s, mas também coisas mais exóticas como <b>páginas múltiplas TIFFs, SVGs, AVIs antigos e muito mais</b>! Ele verifica sua coleção de mídia para identificar <b>fotos em movimento</b>, <b>panoramas</b> (aka photo spheres), <b>vídeos em 360°</b>, assim como <b>GeoTIFF</b> arquivos. - -<b>Navegação e pesquisa</b> é uma parte importante do <i>Aves</i>. O objetivo é que os usuários fluam facilmente de álbuns para fotos, etiquetas, mapas, etc. - -<i>Aves</i> integra com Android (de <b>API 19 para 33</b>, i.e. de KitKat para Android 13) com recursos como <b>atalhos de apps</b> e <b>pesquisa global</b> manipulação. Também funciona como um <b>visualizador e selecionador de mídia</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/pt-BR/short_description.txt b/fastlane/metadata/android/pt-BR/short_description.txt deleted file mode 100644 index ddf48df4d..000000000 --- a/fastlane/metadata/android/pt-BR/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -Galeria e explorador de metadados \ No newline at end of file diff --git a/lib/l10n/app_pt_BR.arb b/lib/l10n/app_pt_BR.arb deleted file mode 100644 index c7295586c..000000000 --- a/lib/l10n/app_pt_BR.arb +++ /dev/null @@ -1,64 +0,0 @@ -{ - "appName": "Aves", - "@appName": {}, - "welcomeMessage": "Bem-vindo ao Aves", - "@welcomeMessage": {}, - "welcomeOptional": "Opcional", - "@welcomeOptional": {}, - "applyButtonLabel": "APLICAR", - "@applyButtonLabel": {}, - "deleteButtonLabel": "EXCLUIR", - "@deleteButtonLabel": {}, - "nextButtonLabel": "SEGUINTE", - "@nextButtonLabel": {}, - "showButtonLabel": "MOSTRAR", - "@showButtonLabel": {}, - "hideButtonLabel": "OCULTAR", - "@hideButtonLabel": {}, - "continueButtonLabel": "CONTINUAR", - "@continueButtonLabel": {}, - "cancelTooltip": "Cancelar", - "@cancelTooltip": {}, - "clearTooltip": "Limpar", - "@clearTooltip": {}, - "nextTooltip": "Seguinte", - "@nextTooltip": {}, - "showTooltip": "Mostrar", - "@showTooltip": {}, - "hideTooltip": "Ocultar", - "@hideTooltip": {}, - "actionRemove": "Remover", - "@actionRemove": {}, - "resetTooltip": "Redefinir", - "@resetTooltip": {}, - "saveTooltip": "Salvar", - "@saveTooltip": {}, - "pickTooltip": "Escolher", - "@pickTooltip": {}, - "doubleBackExitMessage": "Toque \"voltar\" novamente para sair.", - "@doubleBackExitMessage": {}, - "doNotAskAgain": "Não perguntar novamente", - "@doNotAskAgain": {}, - "sourceStateLoading": "Carregando", - "@sourceStateLoading": {}, - "sourceStateCataloguing": "Catalogando", - "@sourceStateCataloguing": {}, - "sourceStateLocatingCountries": "Localizando países", - "@sourceStateLocatingCountries": {}, - "sourceStateLocatingPlaces": "Localizando lugares", - "@sourceStateLocatingPlaces": {}, - "chipActionDelete": "Excluir", - "@chipActionDelete": {}, - "chipActionGoToAlbumPage": "Mostrar nos Álbuns", - "@chipActionGoToAlbumPage": {}, - "chipActionGoToCountryPage": "Mostrar nos Países", - "@chipActionGoToCountryPage": {}, - "chipActionGoToTagPage": "Mostrar nas Etiquetas", - "@chipActionGoToTagPage": {}, - "changeTooltip": "Mudar", - "@changeTooltip": {}, - "previousTooltip": "Anterior", - "@previousTooltip": {}, - "welcomeTermsToggle": "Eu concordo com os termos e condições", - "@welcomeTermsToggle": {} -} From d4cc6817f1d29ff4787e0b9dabeb20c1226d6aaf Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Mon, 24 Oct 2022 12:17:24 +0200 Subject: [PATCH 17/53] l10n by weblate (#371) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Allan Nordhøy <epost@anotheragency.no> Co-authored-by: Daniel <its.ghost.message@gmail.com> Co-authored-by: Havokdan <havokdan@yahoo.com.br> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Piotr K <1337.kelt@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Weblate <noreply@weblate.org> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: امیر جهانگرد <ijahangard.a@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/el/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/id/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/it/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/el/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/pt/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: Allan Nordhøy <epost@anotheragency.no> Co-authored-by: Daniel <its.ghost.message@gmail.com> Co-authored-by: Havokdan <havokdan@yahoo.com.br> Co-authored-by: Piotr K <1337.kelt@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: امیر جهانگرد <ijahangard.a@gmail.com> --- fastlane/metadata/android/pt_BR/full_description.txt | 5 +++++ fastlane/metadata/android/pt_BR/short_description.txt | 1 + 2 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/pt_BR/full_description.txt create mode 100644 fastlane/metadata/android/pt_BR/short_description.txt diff --git a/fastlane/metadata/android/pt_BR/full_description.txt b/fastlane/metadata/android/pt_BR/full_description.txt new file mode 100644 index 000000000..a095036ca --- /dev/null +++ b/fastlane/metadata/android/pt_BR/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> pode lidar com todos os tipos de imagens e vídeos, incluindo seus típicos JPEGs e MP4s, mas também coisas mais exóticas como <b>páginas múltiplas TIFFs, SVGs, AVIs antigos e muito mais</b>! Ele verifica sua coleção de mídia para identificar <b>fotos em movimento</b>, <b>panoramas</b> (aka photo spheres), <b>vídeos em 360°</b>, assim como <b>GeoTIFF</b> arquivos. + +<b>Navegação e pesquisa</b> é uma parte importante do <i>Aves</i>. O objetivo é que os usuários fluam facilmente de álbuns para fotos, etiquetas, mapas, etc. + +<i>Aves</i> integra com Android (de <b>API 19 para 33</b>, i.e. de KitKat para Android 13) com recursos como <b>atalhos de apps</b> e <b>pesquisa global</b> manipulação. Também funciona como um <b>visualizador e selecionador de mídia</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/pt_BR/short_description.txt b/fastlane/metadata/android/pt_BR/short_description.txt new file mode 100644 index 000000000..ddf48df4d --- /dev/null +++ b/fastlane/metadata/android/pt_BR/short_description.txt @@ -0,0 +1 @@ +Galeria e explorador de metadados \ No newline at end of file From 95741743c8515497170e61c19a2140c0523301a5 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Mon, 24 Oct 2022 16:17:15 +0200 Subject: [PATCH 18/53] l10n by weblate (#372) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Allan Nordhøy <epost@anotheragency.no> Co-authored-by: Daniel <its.ghost.message@gmail.com> Co-authored-by: Havokdan <havokdan@yahoo.com.br> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Piotr K <1337.kelt@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Weblate <noreply@weblate.org> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: امیر جهانگرد <ijahangard.a@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/el/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/id/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/es/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/it/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/el/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/es/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/pl/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/pt/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: Allan Nordhøy <epost@anotheragency.no> Co-authored-by: Daniel <its.ghost.message@gmail.com> Co-authored-by: Havokdan <havokdan@yahoo.com.br> Co-authored-by: Piotr K <1337.kelt@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: امیر جهانگرد <ijahangard.a@gmail.com> --- fastlane/metadata/android/fa/short_description.txt | 2 +- fastlane/metadata/android/{pt_BR => pt-BR}/full_description.txt | 0 .../metadata/android/{pt_BR => pt-BR}/short_description.txt | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename fastlane/metadata/android/{pt_BR => pt-BR}/full_description.txt (100%) rename fastlane/metadata/android/{pt_BR => pt-BR}/short_description.txt (100%) diff --git a/fastlane/metadata/android/fa/short_description.txt b/fastlane/metadata/android/fa/short_description.txt index 8c9445bd5..0cebfe9ce 100644 --- a/fastlane/metadata/android/fa/short_description.txt +++ b/fastlane/metadata/android/fa/short_description.txt @@ -1 +1 @@ -Gallery and metadata explorer \ No newline at end of file +پویشگر گالری و فراداده \ No newline at end of file diff --git a/fastlane/metadata/android/pt_BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/full_description.txt rename to fastlane/metadata/android/pt-BR/full_description.txt diff --git a/fastlane/metadata/android/pt_BR/short_description.txt b/fastlane/metadata/android/pt-BR/short_description.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/short_description.txt rename to fastlane/metadata/android/pt-BR/short_description.txt From a6594ba7e4be5ccccd1dae066903bd77aa57951c Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Mon, 24 Oct 2022 17:02:49 +0200 Subject: [PATCH 19/53] fixed filename --- lib/l10n/{app_nb_NO.arb => app_nb.arb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/l10n/{app_nb_NO.arb => app_nb.arb} (100%) diff --git a/lib/l10n/app_nb_NO.arb b/lib/l10n/app_nb.arb similarity index 100% rename from lib/l10n/app_nb_NO.arb rename to lib/l10n/app_nb.arb From 6ed39d78049a88fb4a342dcc0a924144af7e1e1e Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Mon, 24 Oct 2022 17:08:50 +0200 Subject: [PATCH 20/53] l10n: fixed filename --- fastlane/metadata/android/{nb_NO => nb-NO}/full_description.txt | 0 fastlane/metadata/android/{nb_NO => nb-NO}/short_description.txt | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename fastlane/metadata/android/{nb_NO => nb-NO}/full_description.txt (100%) rename fastlane/metadata/android/{nb_NO => nb-NO}/short_description.txt (100%) diff --git a/fastlane/metadata/android/nb_NO/full_description.txt b/fastlane/metadata/android/nb-NO/full_description.txt similarity index 100% rename from fastlane/metadata/android/nb_NO/full_description.txt rename to fastlane/metadata/android/nb-NO/full_description.txt diff --git a/fastlane/metadata/android/nb_NO/short_description.txt b/fastlane/metadata/android/nb-NO/short_description.txt similarity index 100% rename from fastlane/metadata/android/nb_NO/short_description.txt rename to fastlane/metadata/android/nb-NO/short_description.txt From 8164b64bff61298cc0d8f270cca0e5e98f741bde Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Tue, 25 Oct 2022 13:01:02 +0200 Subject: [PATCH 21/53] l10n by weblate (#374) Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Weblate <noreply@weblate.org> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/gl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/el/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/gl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/es/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/gl/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/gl/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: gallegonovato <fran-carro@hotmail.es> --- .../app/src/main/res/values-gl/strings.xml | 12 + .../android/es-MX/full_description.txt | 2 +- .../metadata/android/gl/full_description.txt | 5 + .../metadata/android/gl/short_description.txt | 1 + lib/l10n/app_de.arb | 6 +- lib/l10n/app_el.arb | 6 +- lib/l10n/app_es.arb | 16 +- lib/l10n/app_gl.arb | 302 ++++++++++++++++++ lib/l10n/app_it.arb | 10 +- lib/l10n/app_pt.arb | 12 +- lib/l10n/app_zh.arb | 6 +- 11 files changed, 355 insertions(+), 23 deletions(-) create mode 100644 android/app/src/main/res/values-gl/strings.xml create mode 100644 fastlane/metadata/android/gl/full_description.txt create mode 100644 fastlane/metadata/android/gl/short_description.txt create mode 100644 lib/l10n/app_gl.arb diff --git a/android/app/src/main/res/values-gl/strings.xml b/android/app/src/main/res/values-gl/strings.xml new file mode 100644 index 000000000..6be7c113e --- /dev/null +++ b/android/app/src/main/res/values-gl/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Aves</string> + <string name="app_widget_label">Marco de fotos</string> + <string name="wallpaper">Fondo da pantalla</string> + <string name="search_shortcut_short_label">Procura</string> + <string name="videos_shortcut_short_label">Vídeos</string> + <string name="analysis_channel_name">Escaneo multimedia</string> + <string name="analysis_service_description">Escanealas imaxes e os vídeos</string> + <string name="analysis_notification_default_title">Escaneando medios</string> + <string name="analysis_notification_action_stop">Pare</string> +</resources> \ No newline at end of file diff --git a/fastlane/metadata/android/es-MX/full_description.txt b/fastlane/metadata/android/es-MX/full_description.txt index 510b47759..ab4e2e977 100644 --- a/fastlane/metadata/android/es-MX/full_description.txt +++ b/fastlane/metadata/android/es-MX/full_description.txt @@ -2,4 +2,4 @@ La <b>navegación y búsqueda</b> son partes importantes de <i>Aves</i>. Su propósito es que los usuarios puedan fácimente ir de álbumes a fotos, etiquetas, mapas, etc. -<i>Aves</i> se integra con Android (desde <b>API 19 a 33</b>, por ej. desde KitKat hasta Android 13) con características como <b>vínculos de aplicación</b> y manejo de <b>búsqueda global</b>. También funciona como un <b>visor y seleccionador multimedia</b>. \ No newline at end of file +<i>Aves</i> se integra con Android (desde <b>API 19 a 33</b>, es decir, desde KitKat a Android 13) con funciones como <b>widgets</b>, <b>accesos directos a aplicaciones </b>, manejo de <b>salvapantallas</b> y <b>búsqueda global</b>. También funciona como un <b>visor y selector de medios</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/gl/full_description.txt b/fastlane/metadata/android/gl/full_description.txt new file mode 100644 index 000000000..3d487367e --- /dev/null +++ b/fastlane/metadata/android/gl/full_description.txt @@ -0,0 +1,5 @@ +<i>Aves</i> pode xestionar todo tipo de imaxes e vídeos, incluídos os teus JPEG e MP4 típicos, pero tamén cousas máis exóticas como <b>TIFF de varias páxinas, SVG, AVI antigos e moito máis</b>. Analiza a túa colección multimedia para identificar <b>fotos en movemento</b>, <b>panoramas</b> (tamén coñecidos como fotografías esféricas), <b>vídeos de 360°</b>, así como <b>GeoTIFF</b> ficheiros. + +A <b>navegación e busca</b> é unha parte importante de <i>Aves</i>. O obxectivo é que os usuarios poidan fluír facilmente de álbums a fotos, a etiquetas a mapas, etc. + +<i>Aves</i> intégrase con Android (de <b>API 19 a 33</b>, é dicir, de KitKat a Android 13) con funcións como <b>widgets</b>, <b>atallos de aplicacións </b>, <b>salvapantallas</b> e manexo da <b>busca global</b>. Tamén funciona como <b>visor e selector de medios</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/gl/short_description.txt b/fastlane/metadata/android/gl/short_description.txt new file mode 100644 index 000000000..f691b66a4 --- /dev/null +++ b/fastlane/metadata/android/gl/short_description.txt @@ -0,0 +1 @@ +Galería e explorador de metadatos \ No newline at end of file diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 0da4bca99..10418859c 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -1142,5 +1142,9 @@ "filePickerNoItems": "Keine Elemente", "@filePickerNoItems": {}, "filePickerUseThisFolder": "Diesen Ordner verwenden", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "widgetOpenPageCollection": "Sammlung öffnen", + "@widgetOpenPageCollection": {}, + "durationDialogSeconds": "Sekunden", + "@durationDialogSeconds": {} } diff --git a/lib/l10n/app_el.arb b/lib/l10n/app_el.arb index 5843cb288..93c10c6f9 100644 --- a/lib/l10n/app_el.arb +++ b/lib/l10n/app_el.arb @@ -1142,5 +1142,9 @@ "filePickerNoItems": "Κανένα στοιχείο", "@filePickerNoItems": {}, "filePickerUseThisFolder": "Χρησιμοποιήστε αυτόν τον φάκελο", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "widgetOpenPageCollection": "Ανοιχτή συλλογή", + "@widgetOpenPageCollection": {}, + "durationDialogSeconds": "Δευτερόλεπτα", + "@durationDialogSeconds": {} } diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 3b8e2bb60..ed74feecb 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -329,7 +329,7 @@ "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{¿Está seguro de borrar este elemento?} other{¿Está seguro de querer borrar {count} elementos?}}", "@deleteEntriesConfirmationDialogMessage": {}, - "moveUndatedConfirmationDialogMessage": "Algunos elementos no poseen fecha en sus metadatos. Su fecha actual será reemplazada por esta operación a menos que una fecha de metadatos sea fijada.", + "moveUndatedConfirmationDialogMessage": "¿Guardar las fechas de los elementos antes de proceder?", "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Fijar fecha", "@moveUndatedConfirmationDialogSetDate": {}, @@ -599,7 +599,7 @@ "@drawerCollectionFavourites": {}, "drawerCollectionImages": "Imágenes", "@drawerCollectionImages": {}, - "drawerCollectionVideos": "Videos", + "drawerCollectionVideos": "Vídeos", "@drawerCollectionVideos": {}, "drawerCollectionAnimated": "Animaciones", "@drawerCollectionAnimated": {}, @@ -1099,12 +1099,6 @@ "@filterRecentlyAddedLabel": {}, "viewerTransitionNone": "Ninguno", "@viewerTransitionNone": {}, - "widgetOpenPageHome": "Casa abierta", - "@widgetOpenPageHome": {}, - "widgetOpenPageCollection": "Colección abierta", - "@widgetOpenPageCollection": {}, - "widgetOpenPageViewer": "Visor abierto", - "@widgetOpenPageViewer": {}, "durationDialogSeconds": "Segundos", "@durationDialogSeconds": {}, "viewDialogReverseSortOrder": "Orden de clasificación inverso", @@ -1113,7 +1107,7 @@ "@tileLayoutMosaic": {}, "sortOrderNewestFirst": "El más nuevo primero", "@sortOrderNewestFirst": {}, - "sortOrderOldestFirst": "Los más viejos primero", + "sortOrderOldestFirst": "El más viejo primero", "@sortOrderOldestFirst": {}, "sortOrderAtoZ": "De la A a la Z", "@sortOrderAtoZ": {}, @@ -1139,9 +1133,9 @@ "@viewerInfoLabelDescription": {}, "wallpaperUseScrollEffect": "Usar el efecto de desplazamiento en la pantalla de inicio", "@wallpaperUseScrollEffect": {}, - "sortOrderHighestFirst": "El mas alto primero", + "sortOrderHighestFirst": "El más alto primero", "@sortOrderHighestFirst": {}, - "sortOrderLowestFirst": "Más bajo primero", + "sortOrderLowestFirst": "El más bajo primero", "@sortOrderLowestFirst": {}, "sortOrderLargestFirst": "El más grande primero", "@sortOrderLargestFirst": {}, diff --git a/lib/l10n/app_gl.arb b/lib/l10n/app_gl.arb new file mode 100644 index 000000000..a921609c0 --- /dev/null +++ b/lib/l10n/app_gl.arb @@ -0,0 +1,302 @@ +{ + "entryActionConvert": "Converter", + "@entryActionConvert": {}, + "entryActionExport": "Exportar", + "@entryActionExport": {}, + "entryActionRotateCCW": "Xire no sentido antihorario", + "@entryActionRotateCCW": {}, + "entryActionInfo": "Información", + "@entryActionInfo": {}, + "entryActionRename": "Cambialo nome", + "@entryActionRename": {}, + "chipActionCreateAlbum": "Crear álbum", + "@chipActionCreateAlbum": {}, + "entryActionDelete": "Eliminar", + "@entryActionDelete": {}, + "entryActionCopyToClipboard": "Copiar ao portapapeis", + "@entryActionCopyToClipboard": {}, + "entryActionRestore": "Restaurar", + "@entryActionRestore": {}, + "entryActionRotateCW": "Xira no sentido das agullas do reloxo", + "@entryActionRotateCW": {}, + "entryActionFlip": "Xire horizontalmente", + "@entryActionFlip": {}, + "entryActionPrint": "Imprimir", + "@entryActionPrint": {}, + "entryActionViewSource": "Ver fonte", + "@entryActionViewSource": {}, + "entryActionShare": "Compartir", + "@entryActionShare": {}, + "entryActionShowGeoTiffOnMap": "Mostrar como superposición de mapa", + "@entryActionShowGeoTiffOnMap": {}, + "filterNoTitleLabel": "Sen título", + "@filterNoTitleLabel": {}, + "entryActionConvertMotionPhotoToStillImage": "Converter a imaxe fixa", + "@entryActionConvertMotionPhotoToStillImage": {}, + "entryActionViewMotionPhotoVideo": "Abrir vídeo", + "@entryActionViewMotionPhotoVideo": {}, + "entryActionEdit": "Editar", + "@entryActionEdit": {}, + "entryInfoActionEditLocation": "Editar localización", + "@entryInfoActionEditLocation": {}, + "entryInfoActionEditTags": "Editar etiquetas", + "@entryInfoActionEditTags": {}, + "filterRecentlyAddedLabel": "Engadida recentemente", + "@filterRecentlyAddedLabel": {}, + "filterTypeSphericalVideoLabel": "Vídeo 360°", + "@filterTypeSphericalVideoLabel": {}, + "filterTypeMotionPhotoLabel": "Foto en movemento", + "@filterTypeMotionPhotoLabel": {}, + "filterMimeImageLabel": "Imaxe", + "@filterMimeImageLabel": {}, + "welcomeOptional": "Opcional", + "@welcomeOptional": {}, + "welcomeTermsToggle": "Acepto os termos e condicións", + "@welcomeTermsToggle": {}, + "nextButtonLabel": "SEGUINTE", + "@nextButtonLabel": {}, + "showButtonLabel": "AMOSAR", + "@showButtonLabel": {}, + "hideButtonLabel": "OCULTAR", + "@hideButtonLabel": {}, + "continueButtonLabel": "PROSEGUIR", + "@continueButtonLabel": {}, + "cancelTooltip": "Cancelar", + "@cancelTooltip": {}, + "sourceStateLocatingCountries": "Localización dos países", + "@sourceStateLocatingCountries": {}, + "sourceStateLocatingPlaces": "Localización dos lugares", + "@sourceStateLocatingPlaces": {}, + "chipActionDelete": "Eliminar", + "@chipActionDelete": {}, + "chipActionGoToTagPage": "Amosalas etiquetas", + "@chipActionGoToTagPage": {}, + "chipActionGoToCountryPage": "Amosar en países", + "@chipActionGoToCountryPage": {}, + "chipActionGoToAlbumPage": "Amosar en álbums", + "@chipActionGoToAlbumPage": {}, + "chipActionFilterOut": "Filtrar", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "Filtrar", + "@chipActionFilterIn": {}, + "chipActionHide": "Agochar", + "@chipActionHide": {}, + "chipActionPin": "Fixar na parte superior", + "@chipActionPin": {}, + "chipActionUnpin": "Desbloquear dende arriba", + "@chipActionUnpin": {}, + "chipActionRename": "Cambialo nome", + "@chipActionRename": {}, + "chipActionSetCover": "Fixala cubierta", + "@chipActionSetCover": {}, + "entryActionOpen": "Abrir con", + "@entryActionOpen": {}, + "entryActionSetAs": "Definido como", + "@entryActionSetAs": {}, + "entryActionOpenMap": "Mostrar na aplicación de mapas", + "@entryActionOpenMap": {}, + "entryActionRotateScreen": "Xire a pantalla", + "@entryActionRotateScreen": {}, + "entryActionAddFavourite": "Engadir a favoritos", + "@entryActionAddFavourite": {}, + "entryActionRemoveFavourite": "Eliminar dos favoritos", + "@entryActionRemoveFavourite": {}, + "videoActionCaptureFrame": "Cadro de captura", + "@videoActionCaptureFrame": {}, + "videoActionMute": "Silenciar", + "@videoActionMute": {}, + "videoActionUnmute": "Activalo silencio", + "@videoActionUnmute": {}, + "videoActionPause": "Pausa", + "@videoActionPause": {}, + "videoActionPlay": "Reproducir", + "@videoActionPlay": {}, + "videoActionReplay10": "Busca atrás 10 segundos", + "@videoActionReplay10": {}, + "videoActionSkip10": "Busca adiante 10 segundos", + "@videoActionSkip10": {}, + "videoActionSelectStreams": "Seleccionalas pistas", + "@videoActionSelectStreams": {}, + "videoActionSetSpeed": "Velocidade de reprodución", + "@videoActionSetSpeed": {}, + "videoActionSettings": "Configuración", + "@videoActionSettings": {}, + "slideshowActionResume": "Resumo", + "@slideshowActionResume": {}, + "slideshowActionShowInCollection": "Mostrar na colección", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditDate": "Editar data e hora", + "@entryInfoActionEditDate": {}, + "entryInfoActionEditTitleDescription": "Editar título e descrición", + "@entryInfoActionEditTitleDescription": {}, + "entryInfoActionEditRating": "Editar valoración", + "@entryInfoActionEditRating": {}, + "entryInfoActionRemoveMetadata": "Eliminar metadatos", + "@entryInfoActionRemoveMetadata": {}, + "filterBinLabel": "Papeleira de reciclaxe", + "@filterBinLabel": {}, + "filterFavouriteLabel": "Favorito", + "@filterFavouriteLabel": {}, + "filterNoDateLabel": "Sen data", + "@filterNoDateLabel": {}, + "filterNoLocationLabel": "Sen localizar", + "@filterNoLocationLabel": {}, + "filterNoRatingLabel": "Sen clasificar", + "@filterNoRatingLabel": {}, + "filterNoTagLabel": "Sen etiquetar", + "@filterNoTagLabel": {}, + "filterOnThisDayLabel": "Neste día", + "@filterOnThisDayLabel": {}, + "filterRatingRejectedLabel": "Rexeitado", + "@filterRatingRejectedLabel": {}, + "filterTypeAnimatedLabel": "Animado", + "@filterTypeAnimatedLabel": {}, + "filterTypePanoramaLabel": "Panorámica", + "@filterTypePanoramaLabel": {}, + "filterTypeRawLabel": "Raw (Formato do ficheiro)", + "@filterTypeRawLabel": {}, + "filterTypeGeotiffLabel": "GeoTIFF (Formato de ficheiro)", + "@filterTypeGeotiffLabel": {}, + "filterMimeVideoLabel": "Vídeo", + "@filterMimeVideoLabel": {}, + "mapStyleStamenToner": "Stamen Maps - Stamen Design", + "@mapStyleStamenToner": {}, + "mapStyleStamenWatercolor": "Stamen Watercolor (con sombreamento e cores)", + "@mapStyleStamenWatercolor": {}, + "nameConflictStrategyRename": "Renomear", + "@nameConflictStrategyRename": {}, + "nameConflictStrategyReplace": "Trocar", + "@nameConflictStrategyReplace": {}, + "nameConflictStrategySkip": "Saltar", + "@nameConflictStrategySkip": {}, + "keepScreenOnNever": "Nunca", + "@keepScreenOnNever": {}, + "keepScreenOnViewerOnly": "Páxina da visualización só", + "@keepScreenOnViewerOnly": {}, + "keepScreenOnAlways": "Sempre", + "@keepScreenOnAlways": {}, + "appName": "Aves", + "@appName": {}, + "welcomeMessage": "Benvido a Aves", + "@welcomeMessage": {}, + "itemCount": "{count, plural, =1{1 elementos} other{{count} elementos}}", + "@itemCount": { + "placeholders": { + "count": {} + } + }, + "timeSeconds": "{seconds, plural, =1{1 segundo} other{{seconds} segundos}}", + "@timeSeconds": { + "placeholders": { + "seconds": {} + } + }, + "timeMinutes": "{minutes, plural, =1{1 minuto} other{{minutes} minutos}}", + "@timeMinutes": { + "placeholders": { + "minutes": {} + } + }, + "timeDays": "{days, plural, =1{1 día} other{{days} días}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, + "focalLength": "{length} milímetro", + "@focalLength": { + "placeholders": { + "length": { + "type": "String", + "example": "5.4" + } + } + }, + "applyButtonLabel": "APLICAR", + "@applyButtonLabel": {}, + "deleteButtonLabel": "ELIMINAR", + "@deleteButtonLabel": {}, + "changeTooltip": "Trocar", + "@changeTooltip": {}, + "clearTooltip": "Limpar", + "@clearTooltip": {}, + "previousTooltip": "Anterior", + "@previousTooltip": {}, + "saveTooltip": "Gardar", + "@saveTooltip": {}, + "nextTooltip": "Seguinte", + "@nextTooltip": {}, + "showTooltip": "Amosar", + "@showTooltip": {}, + "hideTooltip": "Agochar", + "@hideTooltip": {}, + "resetTooltip": "Restituír", + "@resetTooltip": {}, + "doNotAskAgain": "Non volvas preguntar", + "@doNotAskAgain": {}, + "actionRemove": "Remover", + "@actionRemove": {}, + "pickTooltip": "Escolla", + "@pickTooltip": {}, + "sourceStateCataloguing": "Catalogación", + "@sourceStateCataloguing": {}, + "doubleBackExitMessage": "Prema \"atrás\" de novo para saír.", + "@doubleBackExitMessage": {}, + "sourceStateLoading": "Cargando", + "@sourceStateLoading": {}, + "coordinateFormatDms": "DMS (Sistema de xestión documental)", + "@coordinateFormatDms": {}, + "coordinateFormatDecimal": "Graos decimais", + "@coordinateFormatDecimal": {}, + "coordinateDms": "{coordinate} {direction}", + "@coordinateDms": { + "placeholders": { + "coordinate": { + "type": "String", + "example": "38° 41′ 47.72″" + }, + "direction": { + "type": "String", + "example": "S" + } + } + }, + "mapStyleGoogleTerrain": "Google Maps (Terreo)", + "@mapStyleGoogleTerrain": {}, + "coordinateDmsNorth": "Norte", + "@coordinateDmsNorth": {}, + "coordinateDmsSouth": "Sur", + "@coordinateDmsSouth": {}, + "coordinateDmsEast": "Leste", + "@coordinateDmsEast": {}, + "coordinateDmsWest": "Oeste", + "@coordinateDmsWest": {}, + "unitSystemMetric": "Métrico", + "@unitSystemMetric": {}, + "unitSystemImperial": "Imperial", + "@unitSystemImperial": {}, + "videoControlsPlay": "Reproducir", + "@videoControlsPlay": {}, + "mapStyleHuaweiNormal": "Petal Maps (Huawei)", + "@mapStyleHuaweiNormal": {}, + "videoLoopModeNever": "Nunca", + "@videoLoopModeNever": {}, + "videoLoopModeAlways": "Sempre", + "@videoLoopModeAlways": {}, + "videoControlsPlaySeek": "Reprroduce e busca cara atrás/adelante", + "@videoControlsPlaySeek": {}, + "videoControlsPlayOutside": "Abrir con outro xogador", + "@videoControlsPlayOutside": {}, + "videoControlsNone": "Ningún", + "@videoControlsNone": {}, + "mapStyleGoogleNormal": "Google Maps", + "@mapStyleGoogleNormal": {}, + "videoLoopModeShortOnly": "Só vídeos curtos", + "@videoLoopModeShortOnly": {}, + "mapStyleGoogleHybrid": "Google Maps (híbrido)", + "@mapStyleGoogleHybrid": {}, + "mapStyleHuaweiTerrain": "Petal Maps (Terreo)", + "@mapStyleHuaweiTerrain": {}, + "mapStyleOsmHot": "Humanitarian OpenStreetMap Team", + "@mapStyleOsmHot": {} +} diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 05c844e62..e5acbc332 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -325,7 +325,7 @@ "@otherDirectoryDescription": {}, "storageAccessDialogMessage": "Si prega di selezionare la {directory} di «{volume}» nella prossima schermata per dare accesso a questa applicazione.", "@storageAccessDialogMessage": {}, - "restrictedAccessDialogMessage": "Questa applicazione non è autorizzata a modificare i file nella {directory} di «{volume}»", + "restrictedAccessDialogMessage": "Questa applicazione non è autorizzata a modificare i file nella {directory} di «{volume}».\n\nUtilizzare un gestore di file o un’applicazione di galleria preinstallata per spostare gli elementi in un’altra directory.", "@restrictedAccessDialogMessage": {}, "notEnoughSpaceDialogMessage": "Questa operazione ha bisogno di {neededSize} di spazio libero su «{volume}» per essere completata, ma è rimasto solo {freeSize}.", "@notEnoughSpaceDialogMessage": {}, @@ -833,7 +833,7 @@ "@settingsCollectionSelectionQuickActionEditorBanner": {}, "settingsViewerSectionTitle": "Visualizzazione", "@settingsViewerSectionTitle": {}, - "settingsViewerGestureSideTapNext": "Tocca i bordi dello schermo per visualizzare l'elemento precedente/successivo", + "settingsViewerGestureSideTapNext": "Tocca i bordi dello schermo per visualizzare l’elemento precedente/successivo", "@settingsViewerGestureSideTapNext": {}, "settingsViewerUseCutout": "Usa area di ritaglio", "@settingsViewerUseCutout": {}, @@ -1142,5 +1142,9 @@ "filePickerNoItems": "Nessun elemento", "@filePickerNoItems": {}, "filePickerUseThisFolder": "Usa questa cartella", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "widgetOpenPageCollection": "Collezione aperta", + "@widgetOpenPageCollection": {}, + "durationDialogSeconds": "Secondi", + "@durationDialogSeconds": {} } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index aca84d7e8..499baa798 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -287,7 +287,7 @@ "@themeBrightnessBlack": {}, "viewerTransitionSlide": "Deslizar", "@viewerTransitionSlide": {}, - "viewerTransitionParallax": "Parallax", + "viewerTransitionParallax": "Paralaxe", "@viewerTransitionParallax": {}, "viewerTransitionFade": "Desvaneça", "@viewerTransitionFade": {}, @@ -347,7 +347,7 @@ "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Tem certeza de que deseja excluir este item?} other{Tem certeza de que deseja excluir estes {count} itens?}}", "@deleteEntriesConfirmationDialogMessage": {}, - "moveUndatedConfirmationDialogMessage": "Alguns itens não têm data de metadados. Sua data atual será redefinida por esta operação, a menos que um data de metadados é definida.", + "moveUndatedConfirmationDialogMessage": "Salvar as datas dos itens antes de continuar?", "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Definir data", "@moveUndatedConfirmationDialogSetDate": {}, @@ -483,7 +483,7 @@ "@viewDialogReverseSortOrder": {}, "tileLayoutMosaic": "Mosaico", "@tileLayoutMosaic": {}, - "tileLayoutGrid": "Grid", + "tileLayoutGrid": "Rede", "@tileLayoutGrid": {}, "tileLayoutList": "Lista", "@tileLayoutList": {}, @@ -631,7 +631,7 @@ "@drawerCollectionPanoramas": {}, "drawerCollectionRaws": "Fotos Raw", "@drawerCollectionRaws": {}, - "drawerCollectionSphericalVideos": "360° Videos", + "drawerCollectionSphericalVideos": "Vídeos 360°", "@drawerCollectionSphericalVideos": {}, "drawerAlbumPage": "Álbuns", "@drawerAlbumPage": {}, @@ -1144,5 +1144,7 @@ "filePickerUseThisFolder": "Usar esta pasta", "@filePickerUseThisFolder": {}, "widgetOpenPageCollection": "Abrir coleção", - "@widgetOpenPageCollection": {} + "@widgetOpenPageCollection": {}, + "durationDialogSeconds": "Segundos", + "@durationDialogSeconds": {} } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 3820f7816..7f788c315 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -1142,5 +1142,9 @@ "filePickerNoItems": "无项目", "@filePickerNoItems": {}, "filePickerUseThisFolder": "使用此文件夹", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "widgetOpenPageCollection": "打开媒体集", + "@widgetOpenPageCollection": {}, + "durationDialogSeconds": "秒", + "@durationDialogSeconds": {} } From 68ed8adc98f2774b5f95099d50ffc3cec72153a8 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Tue, 25 Oct 2022 13:03:43 +0200 Subject: [PATCH 22/53] l10n: fixed key --- lib/l10n/app_de.arb | 4 +- lib/l10n/app_el.arb | 4 +- lib/l10n/app_en.arb | 2 +- lib/l10n/app_es.arb | 4 +- lib/l10n/app_fr.arb | 4 +- lib/l10n/app_id.arb | 4 +- lib/l10n/app_it.arb | 4 +- lib/l10n/app_ja.arb | 4 +- lib/l10n/app_ko.arb | 4 +- lib/l10n/app_nb.arb | 4 +- lib/l10n/app_nl.arb | 4 +- lib/l10n/app_pt.arb | 4 +- lib/l10n/app_ru.arb | 4 +- lib/l10n/app_tr.arb | 4 +- lib/l10n/app_zh.arb | 4 +- .../entry_editors/edit_date_dialog.dart | 2 +- untranslated.json | 1150 ++++++++++++++++- 17 files changed, 1171 insertions(+), 39 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 10418859c..0bb8859d8 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -409,8 +409,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Von anderem Datum kopieren", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "Von einem anderen Element kopieren", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "Von einem anderen Element kopieren", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "Auszug aus dem Titel", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Verschieben", diff --git a/lib/l10n/app_el.arb b/lib/l10n/app_el.arb index 93c10c6f9..bc115d245 100644 --- a/lib/l10n/app_el.arb +++ b/lib/l10n/app_el.arb @@ -409,8 +409,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Αντιγραφή από άλλη ημερομηνία", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "Αντιγραφή από άλλο στοιχείο", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "Αντιγραφή από άλλο στοιχείο", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "Εξαγωγή από το όνομα του κάθε αρχείου", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Μετατόπιση", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index df0578d68..8547df6ca 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -374,12 +374,12 @@ "renameEntryDialogLabel": "New name", + "editEntryDialogCopyFromItem": "Copy from other item", "editEntryDialogTargetFieldsHeader": "Fields to modify", "editEntryDateDialogTitle": "Date & Time", "editEntryDateDialogSetCustom": "Set custom date", "editEntryDateDialogCopyField": "Copy from other date", - "editEntryDateDialogCopyItem": "Copy from other item", "editEntryDateDialogExtractFromTitle": "Extract from title", "editEntryDateDialogShift": "Shift", "editEntryDateDialogSourceFileModifiedDate": "File modified date", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index ed74feecb..71207ff5b 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -391,8 +391,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Copiar de otra fecha", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "Copiar de otro elemento", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "Copiar de otro elemento", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "Extraer del título", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Cambiar", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 5f8994117..ba91525be 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -411,8 +411,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Copier d’une autre date", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "Copier d’un autre élément", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "Copier d’un autre élément", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "Extraire du titre", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Décaler", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 139d7fc94..0d8ecea7c 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -399,8 +399,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Salin dari tanggal lain", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "Salin dari benda lain", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "Salin dari benda lain", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "Ekstrak dari judul", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Geser", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index e5acbc332..e10f12ae3 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -409,8 +409,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Copia da un’altra data", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "Copia da un altro elemento", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "Copia da un altro elemento", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "Estrai dal titolo", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Turno", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index eb874252b..9be5470fd 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -391,8 +391,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "他の日からコピーする", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "他のアイテムからコピーする", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "他のアイテムからコピーする", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "タイトルから抽出する", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "シフト", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index b71461b26..f74e0c978 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -411,8 +411,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "다른 날짜에서 지정", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "다른 항목에서 지정", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "다른 항목에서 지정", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "제목에서 추출", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "시간 이동", diff --git a/lib/l10n/app_nb.arb b/lib/l10n/app_nb.arb index 84f809a56..e1f252d26 100644 --- a/lib/l10n/app_nb.arb +++ b/lib/l10n/app_nb.arb @@ -545,8 +545,8 @@ "@albumGroupNone": {}, "editEntryDialogTargetFieldsHeader": "Felter å endre", "@editEntryDialogTargetFieldsHeader": {}, - "editEntryDateDialogCopyItem": "Kopier fra annet element", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "Kopier fra annet element", + "@editEntryDialogCopyFromItem": {}, "durationDialogMinutes": "Minutter", "@durationDialogMinutes": {}, "editEntryLocationDialogChooseOnMapTooltip": "Velg på kartet", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index bab5aefaa..124f8bbc8 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -407,8 +407,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Kopiëren van andere datum", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "Kopiëren van ander item", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "Kopiëren van ander item", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "Uit titel halen", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Verschuiven", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 499baa798..359a55dc0 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -409,8 +409,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Copiar de outra data", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "Copiar de outro item", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "Copiar de outro item", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "Extrair do título", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Mudança", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 438970498..17c799031 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -409,8 +409,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Копировать с другой даты", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "Скопировать из другого объекта", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "Скопировать из другого объекта", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "Извлечь из названия", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Сдвиг", diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 1eeb6aa56..ffed60dce 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -365,8 +365,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "Başka bir tarihten kopyala", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "Başka bir öğeden kopyala", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "Başka bir öğeden kopyala", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "Başlıktan ayıkla", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "Değişim", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 7f788c315..f7a0d5256 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -409,8 +409,8 @@ "@editEntryDateDialogSetCustom": {}, "editEntryDateDialogCopyField": "复制自其他日期", "@editEntryDateDialogCopyField": {}, - "editEntryDateDialogCopyItem": "复制自其他项目", - "@editEntryDateDialogCopyItem": {}, + "editEntryDialogCopyFromItem": "复制自其他项目", + "@editEntryDialogCopyFromItem": {}, "editEntryDateDialogExtractFromTitle": "从标题提取", "@editEntryDateDialogExtractFromTitle": {}, "editEntryDateDialogShift": "转移", diff --git a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart index 5121814f0..1a2a0b936 100644 --- a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart @@ -288,7 +288,7 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { case DateEditAction.copyField: return l10n.editEntryDateDialogCopyField; case DateEditAction.copyItem: - return l10n.editEntryDateDialogCopyItem; + return l10n.editEntryDialogCopyFromItem; case DateEditAction.extractFromTitle: return l10n.editEntryDateDialogExtractFromTitle; case DateEditAction.shift: diff --git a/untranslated.json b/untranslated.json index 8ac863c76..1a79ac754 100644 --- a/untranslated.json +++ b/untranslated.json @@ -9,20 +9,335 @@ "durationDialogSeconds" ], - "es": [ + "fa": [ + "appName", + "welcomeMessage", + "welcomeOptional", + "welcomeTermsToggle", + "itemCount", + "timeSeconds", + "timeMinutes", + "timeDays", + "focalLength", + "applyButtonLabel", + "deleteButtonLabel", + "nextButtonLabel", + "showButtonLabel", + "hideButtonLabel", + "continueButtonLabel", + "cancelTooltip", + "changeTooltip", + "clearTooltip", + "previousTooltip", + "nextTooltip", + "showTooltip", + "hideTooltip", + "actionRemove", + "resetTooltip", + "saveTooltip", + "pickTooltip", + "doubleBackExitMessage", + "doNotAskAgain", + "sourceStateLoading", + "sourceStateCataloguing", + "sourceStateLocatingCountries", + "sourceStateLocatingPlaces", + "chipActionDelete", + "chipActionGoToAlbumPage", + "chipActionGoToCountryPage", + "chipActionGoToTagPage", "chipActionFilterOut", "chipActionFilterIn", + "chipActionHide", + "chipActionPin", + "chipActionUnpin", + "chipActionRename", + "chipActionSetCover", + "chipActionCreateAlbum", + "entryActionCopyToClipboard", + "entryActionDelete", + "entryActionConvert", + "entryActionExport", + "entryActionInfo", + "entryActionRename", + "entryActionRestore", + "entryActionRotateCCW", + "entryActionRotateCW", + "entryActionFlip", + "entryActionPrint", + "entryActionShare", + "entryActionViewSource", + "entryActionShowGeoTiffOnMap", + "entryActionConvertMotionPhotoToStillImage", + "entryActionViewMotionPhotoVideo", + "entryActionEdit", + "entryActionOpen", + "entryActionSetAs", + "entryActionOpenMap", + "entryActionRotateScreen", + "entryActionAddFavourite", + "entryActionRemoveFavourite", + "videoActionCaptureFrame", + "videoActionMute", + "videoActionUnmute", + "videoActionPause", + "videoActionPlay", + "videoActionReplay10", + "videoActionSkip10", + "videoActionSelectStreams", + "videoActionSetSpeed", + "videoActionSettings", + "slideshowActionResume", + "slideshowActionShowInCollection", + "entryInfoActionEditDate", + "entryInfoActionEditLocation", "entryInfoActionEditTitleDescription", + "entryInfoActionEditRating", + "entryInfoActionEditTags", + "entryInfoActionRemoveMetadata", + "filterBinLabel", + "filterFavouriteLabel", "filterNoDateLabel", + "filterNoLocationLabel", + "filterNoRatingLabel", + "filterNoTagLabel", "filterNoTitleLabel", + "filterOnThisDayLabel", "filterRecentlyAddedLabel", + "filterRatingRejectedLabel", + "filterTypeAnimatedLabel", + "filterTypeMotionPhotoLabel", + "filterTypePanoramaLabel", + "filterTypeRawLabel", + "filterTypeSphericalVideoLabel", + "filterTypeGeotiffLabel", + "filterMimeImageLabel", + "filterMimeVideoLabel", + "coordinateFormatDms", + "coordinateFormatDecimal", + "coordinateDms", + "coordinateDmsNorth", + "coordinateDmsSouth", + "coordinateDmsEast", + "coordinateDmsWest", + "unitSystemMetric", + "unitSystemImperial", + "videoLoopModeNever", + "videoLoopModeShortOnly", + "videoLoopModeAlways", + "videoControlsPlay", + "videoControlsPlaySeek", + "videoControlsPlayOutside", + "videoControlsNone", + "mapStyleGoogleNormal", + "mapStyleGoogleHybrid", + "mapStyleGoogleTerrain", + "mapStyleHuaweiNormal", + "mapStyleHuaweiTerrain", + "mapStyleOsmHot", + "mapStyleStamenToner", + "mapStyleStamenWatercolor", + "nameConflictStrategyRename", + "nameConflictStrategyReplace", + "nameConflictStrategySkip", + "keepScreenOnNever", + "keepScreenOnViewerOnly", + "keepScreenOnAlways", + "accessibilityAnimationsRemove", + "accessibilityAnimationsKeep", + "displayRefreshRatePreferHighest", + "displayRefreshRatePreferLowest", + "videoPlaybackSkip", + "videoPlaybackMuted", + "videoPlaybackWithSound", + "themeBrightnessLight", + "themeBrightnessDark", + "themeBrightnessBlack", + "viewerTransitionSlide", + "viewerTransitionParallax", + "viewerTransitionFade", + "viewerTransitionZoomIn", "viewerTransitionNone", + "wallpaperTargetHome", + "wallpaperTargetLock", + "wallpaperTargetHomeLock", "widgetOpenPageHome", "widgetOpenPageCollection", "widgetOpenPageViewer", + "albumTierNew", + "albumTierPinned", + "albumTierSpecial", + "albumTierApps", + "albumTierRegular", + "storageVolumeDescriptionFallbackPrimary", + "storageVolumeDescriptionFallbackNonPrimary", + "rootDirectoryDescription", + "otherDirectoryDescription", + "storageAccessDialogMessage", + "restrictedAccessDialogMessage", + "notEnoughSpaceDialogMessage", + "missingSystemFilePickerDialogMessage", + "unsupportedTypeDialogMessage", + "nameConflictDialogSingleSourceMessage", + "nameConflictDialogMultipleSourceMessage", + "addShortcutDialogLabel", + "addShortcutButtonLabel", + "noMatchingAppDialogMessage", + "binEntriesConfirmationDialogMessage", + "deleteEntriesConfirmationDialogMessage", + "moveUndatedConfirmationDialogMessage", + "moveUndatedConfirmationDialogSetDate", + "videoResumeDialogMessage", + "videoStartOverButtonLabel", + "videoResumeButtonLabel", + "setCoverDialogLatest", + "setCoverDialogAuto", + "setCoverDialogCustom", + "hideFilterConfirmationDialogMessage", + "newAlbumDialogTitle", + "newAlbumDialogNameLabel", + "newAlbumDialogNameLabelAlreadyExistsHelper", + "newAlbumDialogStorageLabel", + "renameAlbumDialogLabel", + "renameAlbumDialogLabelAlreadyExistsHelper", + "renameEntrySetPageTitle", + "renameEntrySetPagePatternFieldLabel", + "renameEntrySetPageInsertTooltip", + "renameEntrySetPagePreviewSectionTitle", + "renameProcessorCounter", + "renameProcessorName", + "deleteSingleAlbumConfirmationDialogMessage", + "deleteMultiAlbumConfirmationDialogMessage", + "exportEntryDialogFormat", + "exportEntryDialogWidth", + "exportEntryDialogHeight", + "renameEntryDialogLabel", + "editEntryDialogTargetFieldsHeader", + "editEntryDateDialogTitle", + "editEntryDateDialogSetCustom", + "editEntryDateDialogCopyField", + "editEntryDialogCopyFromItem", + "editEntryDateDialogExtractFromTitle", + "editEntryDateDialogShift", + "editEntryDateDialogSourceFileModifiedDate", + "durationDialogHours", + "durationDialogMinutes", "durationDialogSeconds", + "editEntryLocationDialogTitle", + "editEntryLocationDialogChooseOnMapTooltip", + "editEntryLocationDialogLatitude", + "editEntryLocationDialogLongitude", + "locationPickerUseThisLocationButton", + "editEntryRatingDialogTitle", + "removeEntryMetadataDialogTitle", + "removeEntryMetadataDialogMore", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage", + "convertMotionPhotoToStillImageWarningDialogMessage", + "videoSpeedDialogLabel", + "videoStreamSelectionDialogVideo", + "videoStreamSelectionDialogAudio", + "videoStreamSelectionDialogText", + "videoStreamSelectionDialogOff", + "videoStreamSelectionDialogTrack", + "videoStreamSelectionDialogNoSelection", + "genericSuccessFeedback", + "genericFailureFeedback", + "menuActionConfigureView", + "menuActionSelect", + "menuActionSelectAll", + "menuActionSelectNone", + "menuActionMap", + "menuActionSlideshow", + "menuActionStats", + "viewDialogSortSectionTitle", + "viewDialogGroupSectionTitle", + "viewDialogLayoutSectionTitle", "viewDialogReverseSortOrder", "tileLayoutMosaic", + "tileLayoutGrid", + "tileLayoutList", + "coverDialogTabCover", + "coverDialogTabApp", + "coverDialogTabColor", + "appPickDialogTitle", + "appPickDialogNone", + "aboutPageTitle", + "aboutLinkLicense", + "aboutLinkPolicy", + "aboutBugSectionTitle", + "aboutBugSaveLogInstruction", + "aboutBugCopyInfoInstruction", + "aboutBugCopyInfoButton", + "aboutBugReportInstruction", + "aboutBugReportButton", + "aboutCreditsSectionTitle", + "aboutCreditsWorldAtlas1", + "aboutCreditsWorldAtlas2", + "aboutTranslatorsSectionTitle", + "aboutLicensesSectionTitle", + "aboutLicensesBanner", + "aboutLicensesAndroidLibrariesSectionTitle", + "aboutLicensesFlutterPluginsSectionTitle", + "aboutLicensesFlutterPackagesSectionTitle", + "aboutLicensesDartPackagesSectionTitle", + "aboutLicensesShowAllButtonLabel", + "policyPageTitle", + "collectionPageTitle", + "collectionPickPageTitle", + "collectionSelectPageTitle", + "collectionActionShowTitleSearch", + "collectionActionHideTitleSearch", + "collectionActionAddShortcut", + "collectionActionEmptyBin", + "collectionActionCopy", + "collectionActionMove", + "collectionActionRescan", + "collectionActionEdit", + "collectionSearchTitlesHintText", + "collectionGroupAlbum", + "collectionGroupMonth", + "collectionGroupDay", + "collectionGroupNone", + "sectionUnknown", + "dateToday", + "dateYesterday", + "dateThisMonth", + "collectionDeleteFailureFeedback", + "collectionCopyFailureFeedback", + "collectionMoveFailureFeedback", + "collectionRenameFailureFeedback", + "collectionEditFailureFeedback", + "collectionExportFailureFeedback", + "collectionCopySuccessFeedback", + "collectionMoveSuccessFeedback", + "collectionRenameSuccessFeedback", + "collectionEditSuccessFeedback", + "collectionEmptyFavourites", + "collectionEmptyVideos", + "collectionEmptyImages", + "collectionEmptyGrantAccessButtonLabel", + "collectionSelectSectionTooltip", + "collectionDeselectSectionTooltip", + "drawerAboutButton", + "drawerSettingsButton", + "drawerCollectionAll", + "drawerCollectionFavourites", + "drawerCollectionImages", + "drawerCollectionVideos", + "drawerCollectionAnimated", + "drawerCollectionMotionPhotos", + "drawerCollectionPanoramas", + "drawerCollectionRaws", + "drawerCollectionSphericalVideos", + "drawerAlbumPage", + "drawerCountryPage", + "drawerTagPage", + "sortByDate", + "sortByName", + "sortByItemCount", + "sortBySize", + "sortByAlbumFileName", + "sortByRating", "sortOrderNewestFirst", "sortOrderOldestFirst", "sortOrderAtoZ", @@ -31,16 +346,244 @@ "sortOrderLowestFirst", "sortOrderLargestFirst", "sortOrderSmallestFirst", + "albumGroupTier", "albumGroupType", + "albumGroupVolume", + "albumGroupNone", "albumMimeTypeMixed", + "albumPickPageTitleCopy", + "albumPickPageTitleExport", + "albumPickPageTitleMove", + "albumPickPageTitlePick", + "albumCamera", + "albumDownload", + "albumScreenshots", + "albumScreenRecordings", + "albumVideoCaptures", + "albumPageTitle", + "albumEmpty", + "createAlbumTooltip", + "createAlbumButtonLabel", + "newFilterBanner", + "countryPageTitle", + "countryEmpty", + "tagPageTitle", + "tagEmpty", + "binPageTitle", + "searchCollectionFieldHint", + "searchRecentSectionTitle", + "searchDateSectionTitle", + "searchAlbumsSectionTitle", + "searchCountriesSectionTitle", + "searchPlacesSectionTitle", + "searchTagsSectionTitle", + "searchRatingSectionTitle", "searchMetadataSectionTitle", + "settingsPageTitle", + "settingsSystemDefault", + "settingsDefault", "settingsDisabled", + "settingsSearchFieldLabel", + "settingsSearchEmpty", + "settingsActionExport", + "settingsActionExportDialogTitle", + "settingsActionImport", + "settingsActionImportDialogTitle", + "appExportCovers", + "appExportFavourites", + "appExportSettings", + "settingsNavigationSectionTitle", + "settingsHomeTile", + "settingsHomeDialogTitle", + "settingsShowBottomNavigationBar", + "settingsKeepScreenOnTile", + "settingsKeepScreenOnDialogTitle", + "settingsDoubleBackExit", + "settingsConfirmationTile", + "settingsConfirmationDialogTitle", + "settingsConfirmationBeforeDeleteItems", + "settingsConfirmationBeforeMoveToBinItems", + "settingsConfirmationBeforeMoveUndatedItems", "settingsConfirmationAfterMoveToBinItems", + "settingsNavigationDrawerTile", + "settingsNavigationDrawerEditorPageTitle", + "settingsNavigationDrawerBanner", + "settingsNavigationDrawerTabTypes", + "settingsNavigationDrawerTabAlbums", + "settingsNavigationDrawerTabPages", + "settingsNavigationDrawerAddAlbum", + "settingsThumbnailSectionTitle", + "settingsThumbnailOverlayTile", + "settingsThumbnailOverlayPageTitle", + "settingsThumbnailShowFavouriteIcon", + "settingsThumbnailShowTagIcon", + "settingsThumbnailShowLocationIcon", + "settingsThumbnailShowMotionPhotoIcon", + "settingsThumbnailShowRating", + "settingsThumbnailShowRawIcon", + "settingsThumbnailShowVideoDuration", + "settingsCollectionQuickActionsTile", + "settingsCollectionQuickActionEditorPageTitle", + "settingsCollectionQuickActionTabBrowsing", + "settingsCollectionQuickActionTabSelecting", + "settingsCollectionBrowsingQuickActionEditorBanner", + "settingsCollectionSelectionQuickActionEditorBanner", + "settingsViewerSectionTitle", + "settingsViewerGestureSideTapNext", + "settingsViewerUseCutout", + "settingsViewerMaximumBrightness", + "settingsMotionPhotoAutoPlay", + "settingsImageBackground", + "settingsViewerQuickActionsTile", + "settingsViewerQuickActionEditorPageTitle", + "settingsViewerQuickActionEditorBanner", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle", + "settingsViewerQuickActionEmpty", + "settingsViewerOverlayTile", + "settingsViewerOverlayPageTitle", + "settingsViewerShowOverlayOnOpening", + "settingsViewerShowMinimap", + "settingsViewerShowInformation", + "settingsViewerShowInformationSubtitle", + "settingsViewerShowShootingDetails", + "settingsViewerShowOverlayThumbnails", + "settingsViewerEnableOverlayBlurEffect", + "settingsViewerSlideshowTile", + "settingsViewerSlideshowPageTitle", + "settingsSlideshowRepeat", + "settingsSlideshowShuffle", + "settingsSlideshowFillScreen", "settingsSlideshowAnimatedZoomEffect", + "settingsSlideshowTransitionTile", + "settingsSlideshowIntervalTile", + "settingsSlideshowVideoPlaybackTile", + "settingsSlideshowVideoPlaybackDialogTitle", + "settingsVideoPageTitle", + "settingsVideoSectionTitle", + "settingsVideoShowVideos", + "settingsVideoEnableHardwareAcceleration", + "settingsVideoAutoPlay", + "settingsVideoLoopModeTile", + "settingsVideoLoopModeDialogTitle", + "settingsSubtitleThemeTile", + "settingsSubtitleThemePageTitle", + "settingsSubtitleThemeSample", + "settingsSubtitleThemeTextAlignmentTile", + "settingsSubtitleThemeTextAlignmentDialogTitle", + "settingsSubtitleThemeTextSize", + "settingsSubtitleThemeShowOutline", + "settingsSubtitleThemeTextColor", + "settingsSubtitleThemeTextOpacity", + "settingsSubtitleThemeBackgroundColor", + "settingsSubtitleThemeBackgroundOpacity", + "settingsSubtitleThemeTextAlignmentLeft", + "settingsSubtitleThemeTextAlignmentCenter", + "settingsSubtitleThemeTextAlignmentRight", + "settingsVideoControlsTile", + "settingsVideoControlsPageTitle", + "settingsVideoButtonsTile", + "settingsVideoGestureDoubleTapTogglePlay", + "settingsVideoGestureSideDoubleTapSeek", + "settingsPrivacySectionTitle", + "settingsAllowInstalledAppAccess", + "settingsAllowInstalledAppAccessSubtitle", + "settingsAllowErrorReporting", + "settingsSaveSearchHistory", + "settingsEnableBin", + "settingsEnableBinSubtitle", + "settingsHiddenItemsTile", + "settingsHiddenItemsPageTitle", + "settingsHiddenItemsTabFilters", + "settingsHiddenFiltersBanner", + "settingsHiddenFiltersEmpty", + "settingsHiddenItemsTabPaths", + "settingsHiddenPathsBanner", + "addPathTooltip", + "settingsStorageAccessTile", + "settingsStorageAccessPageTitle", + "settingsStorageAccessBanner", + "settingsStorageAccessEmpty", + "settingsStorageAccessRevokeTooltip", + "settingsAccessibilitySectionTitle", + "settingsRemoveAnimationsTile", + "settingsRemoveAnimationsDialogTitle", + "settingsTimeToTakeActionTile", + "settingsDisplaySectionTitle", + "settingsThemeBrightnessTile", + "settingsThemeBrightnessDialogTitle", + "settingsThemeColorHighlights", + "settingsThemeEnableDynamicColor", + "settingsDisplayRefreshRateModeTile", + "settingsDisplayRefreshRateModeDialogTitle", + "settingsLanguageSectionTitle", + "settingsLanguageTile", + "settingsLanguagePageTitle", + "settingsCoordinateFormatTile", + "settingsCoordinateFormatDialogTitle", + "settingsUnitSystemTile", + "settingsUnitSystemDialogTitle", + "settingsScreenSaverPageTitle", + "settingsWidgetPageTitle", + "settingsWidgetShowOutline", "settingsWidgetOpenPage", + "settingsCollectionTile", + "statsPageTitle", + "statsWithGps", + "statsTopCountriesSectionTitle", + "statsTopPlacesSectionTitle", + "statsTopTagsSectionTitle", "statsTopAlbumsSectionTitle", + "viewerOpenPanoramaButtonLabel", + "viewerSetWallpaperButtonLabel", + "viewerErrorUnknown", + "viewerErrorDoesNotExist", + "viewerInfoPageTitle", + "viewerInfoBackToViewerTooltip", + "viewerInfoUnknown", "viewerInfoLabelDescription", - "wallpaperUseScrollEffect" + "viewerInfoLabelTitle", + "viewerInfoLabelDate", + "viewerInfoLabelResolution", + "viewerInfoLabelSize", + "viewerInfoLabelUri", + "viewerInfoLabelPath", + "viewerInfoLabelDuration", + "viewerInfoLabelOwner", + "viewerInfoLabelCoordinates", + "viewerInfoLabelAddress", + "mapStyleDialogTitle", + "mapStyleTooltip", + "mapZoomInTooltip", + "mapZoomOutTooltip", + "mapPointNorthUpTooltip", + "mapAttributionOsmHot", + "mapAttributionStamen", + "openMapPageTooltip", + "mapEmptyRegion", + "viewerInfoOpenEmbeddedFailureFeedback", + "viewerInfoOpenLinkText", + "viewerInfoViewXmlLinkText", + "viewerInfoSearchFieldLabel", + "viewerInfoSearchEmpty", + "viewerInfoSearchSuggestionDate", + "viewerInfoSearchSuggestionDescription", + "viewerInfoSearchSuggestionDimensions", + "viewerInfoSearchSuggestionResolution", + "viewerInfoSearchSuggestionRights", + "wallpaperUseScrollEffect", + "tagEditorPageTitle", + "tagEditorPageNewTagFieldLabel", + "tagEditorPageAddTagTooltip", + "tagEditorSectionRecent", + "panoramaEnableSensorControl", + "panoramaDisableSensorControl", + "sourceViewerPageTitle", + "filePickerShowHiddenFiles", + "filePickerDoNotShowHiddenFiles", + "filePickerOpenFrom", + "filePickerNoItems", + "filePickerUseThisFolder" ], "id": [ @@ -101,18 +644,607 @@ "wallpaperUseScrollEffect" ], + "nb": [ + "videoActionCaptureFrame", + "videoActionSelectStreams", + "entryInfoActionEditLocation", + "coordinateFormatDms", + "mapStyleHuaweiNormal", + "mapStyleHuaweiTerrain", + "mapStyleStamenToner", + "mapStyleStamenWatercolor", + "keepScreenOnViewerOnly", + "viewerTransitionFade", + "albumTierSpecial", + "storageAccessDialogMessage", + "restrictedAccessDialogMessage", + "notEnoughSpaceDialogMessage", + "missingSystemFilePickerDialogMessage", + "unsupportedTypeDialogMessage", + "binEntriesConfirmationDialogMessage", + "deleteEntriesConfirmationDialogMessage", + "moveUndatedConfirmationDialogMessage", + "setCoverDialogLatest", + "hideFilterConfirmationDialogMessage", + "deleteSingleAlbumConfirmationDialogMessage", + "deleteMultiAlbumConfirmationDialogMessage", + "editEntryDateDialogExtractFromTitle", + "editEntryDateDialogShift", + "editEntryDateDialogSourceFileModifiedDate", + "editEntryLocationDialogTitle", + "locationPickerUseThisLocationButton", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage", + "videoStreamSelectionDialogText", + "videoStreamSelectionDialogTrack", + "videoStreamSelectionDialogNoSelection", + "viewDialogLayoutSectionTitle", + "viewDialogReverseSortOrder", + "tileLayoutMosaic", + "collectionDeleteFailureFeedback", + "collectionCopyFailureFeedback", + "collectionMoveFailureFeedback", + "collectionRenameFailureFeedback", + "collectionEditFailureFeedback", + "collectionExportFailureFeedback", + "collectionCopySuccessFeedback", + "collectionMoveSuccessFeedback", + "collectionRenameSuccessFeedback", + "collectionEditSuccessFeedback", + "collectionSelectSectionTooltip", + "collectionDeselectSectionTooltip", + "albumGroupTier", + "settingsConfirmationBeforeDeleteItems", + "settingsConfirmationBeforeMoveToBinItems", + "settingsConfirmationBeforeMoveUndatedItems", + "settingsConfirmationAfterMoveToBinItems", + "settingsNavigationDrawerBanner", + "settingsThumbnailOverlayTile", + "settingsThumbnailOverlayPageTitle", + "settingsThumbnailShowFavouriteIcon", + "settingsThumbnailShowTagIcon", + "settingsThumbnailShowLocationIcon", + "settingsThumbnailShowMotionPhotoIcon", + "settingsThumbnailShowRating", + "settingsThumbnailShowRawIcon", + "settingsThumbnailShowVideoDuration", + "settingsCollectionQuickActionsTile", + "settingsCollectionQuickActionEditorPageTitle", + "settingsCollectionQuickActionTabBrowsing", + "settingsCollectionQuickActionTabSelecting", + "settingsCollectionBrowsingQuickActionEditorBanner", + "settingsCollectionSelectionQuickActionEditorBanner", + "settingsViewerSectionTitle", + "settingsViewerGestureSideTapNext", + "settingsViewerUseCutout", + "settingsViewerMaximumBrightness", + "settingsMotionPhotoAutoPlay", + "settingsImageBackground", + "settingsViewerQuickActionEditorBanner", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle", + "settingsViewerQuickActionEmpty", + "settingsViewerOverlayTile", + "settingsViewerOverlayPageTitle", + "settingsViewerShowOverlayOnOpening", + "settingsViewerShowShootingDetails", + "settingsViewerEnableOverlayBlurEffect", + "settingsSlideshowShuffle", + "settingsSubtitleThemeSample", + "settingsAllowInstalledAppAccess", + "settingsHiddenFiltersBanner", + "settingsHiddenFiltersEmpty", + "settingsHiddenItemsTabPaths", + "settingsHiddenPathsBanner", + "addPathTooltip", + "settingsStorageAccessTile", + "settingsStorageAccessBanner", + "settingsStorageAccessEmpty", + "settingsTimeToTakeActionTile", + "settingsThemeColorHighlights", + "settingsDisplayRefreshRateModeTile", + "settingsDisplayRefreshRateModeDialogTitle", + "statsWithGps", + "viewerErrorDoesNotExist", + "mapAttributionStamen", + "mapEmptyRegion", + "viewerInfoOpenEmbeddedFailureFeedback", + "viewerInfoSearchEmpty", + "wallpaperUseScrollEffect" + ], + "nl": [ "widgetOpenPageCollection", - "durationDialogSeconds" + "widgetOpenPageViewer", + "durationDialogSeconds", + "aboutLinkPolicy", + "policyPageTitle" + ], + + "pl": [ + "itemCount", + "timeSeconds", + "timeMinutes", + "timeDays", + "focalLength", + "filterTypeRawLabel", + "filterTypeSphericalVideoLabel", + "filterTypeGeotiffLabel", + "filterMimeImageLabel", + "filterMimeVideoLabel", + "coordinateFormatDms", + "coordinateFormatDecimal", + "coordinateDms", + "coordinateDmsNorth", + "coordinateDmsSouth", + "coordinateDmsEast", + "coordinateDmsWest", + "unitSystemMetric", + "unitSystemImperial", + "videoLoopModeNever", + "videoLoopModeShortOnly", + "videoLoopModeAlways", + "videoControlsPlay", + "videoControlsPlaySeek", + "videoControlsPlayOutside", + "videoControlsNone", + "mapStyleGoogleNormal", + "mapStyleGoogleHybrid", + "mapStyleGoogleTerrain", + "mapStyleHuaweiNormal", + "mapStyleHuaweiTerrain", + "mapStyleOsmHot", + "mapStyleStamenToner", + "mapStyleStamenWatercolor", + "nameConflictStrategyRename", + "nameConflictStrategyReplace", + "nameConflictStrategySkip", + "keepScreenOnNever", + "keepScreenOnViewerOnly", + "keepScreenOnAlways", + "accessibilityAnimationsRemove", + "accessibilityAnimationsKeep", + "displayRefreshRatePreferHighest", + "displayRefreshRatePreferLowest", + "videoPlaybackSkip", + "videoPlaybackMuted", + "videoPlaybackWithSound", + "themeBrightnessLight", + "themeBrightnessDark", + "themeBrightnessBlack", + "viewerTransitionSlide", + "viewerTransitionParallax", + "viewerTransitionFade", + "viewerTransitionZoomIn", + "viewerTransitionNone", + "wallpaperTargetHome", + "wallpaperTargetLock", + "wallpaperTargetHomeLock", + "widgetOpenPageHome", + "widgetOpenPageCollection", + "widgetOpenPageViewer", + "albumTierNew", + "albumTierPinned", + "albumTierSpecial", + "albumTierApps", + "albumTierRegular", + "storageVolumeDescriptionFallbackPrimary", + "storageVolumeDescriptionFallbackNonPrimary", + "rootDirectoryDescription", + "otherDirectoryDescription", + "storageAccessDialogMessage", + "restrictedAccessDialogMessage", + "notEnoughSpaceDialogMessage", + "missingSystemFilePickerDialogMessage", + "unsupportedTypeDialogMessage", + "nameConflictDialogSingleSourceMessage", + "nameConflictDialogMultipleSourceMessage", + "addShortcutDialogLabel", + "addShortcutButtonLabel", + "noMatchingAppDialogMessage", + "binEntriesConfirmationDialogMessage", + "deleteEntriesConfirmationDialogMessage", + "moveUndatedConfirmationDialogMessage", + "moveUndatedConfirmationDialogSetDate", + "videoResumeDialogMessage", + "videoStartOverButtonLabel", + "videoResumeButtonLabel", + "setCoverDialogLatest", + "setCoverDialogAuto", + "setCoverDialogCustom", + "hideFilterConfirmationDialogMessage", + "newAlbumDialogTitle", + "newAlbumDialogNameLabel", + "newAlbumDialogNameLabelAlreadyExistsHelper", + "newAlbumDialogStorageLabel", + "renameAlbumDialogLabel", + "renameAlbumDialogLabelAlreadyExistsHelper", + "renameEntrySetPageTitle", + "renameEntrySetPagePatternFieldLabel", + "renameEntrySetPageInsertTooltip", + "renameEntrySetPagePreviewSectionTitle", + "renameProcessorCounter", + "renameProcessorName", + "deleteSingleAlbumConfirmationDialogMessage", + "deleteMultiAlbumConfirmationDialogMessage", + "exportEntryDialogFormat", + "exportEntryDialogWidth", + "exportEntryDialogHeight", + "renameEntryDialogLabel", + "editEntryDialogTargetFieldsHeader", + "editEntryDateDialogTitle", + "editEntryDateDialogSetCustom", + "editEntryDateDialogCopyField", + "editEntryDialogCopyFromItem", + "editEntryDateDialogExtractFromTitle", + "editEntryDateDialogShift", + "editEntryDateDialogSourceFileModifiedDate", + "durationDialogHours", + "durationDialogMinutes", + "durationDialogSeconds", + "editEntryLocationDialogTitle", + "editEntryLocationDialogChooseOnMapTooltip", + "editEntryLocationDialogLatitude", + "editEntryLocationDialogLongitude", + "locationPickerUseThisLocationButton", + "editEntryRatingDialogTitle", + "removeEntryMetadataDialogTitle", + "removeEntryMetadataDialogMore", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage", + "convertMotionPhotoToStillImageWarningDialogMessage", + "videoSpeedDialogLabel", + "videoStreamSelectionDialogVideo", + "videoStreamSelectionDialogAudio", + "videoStreamSelectionDialogText", + "videoStreamSelectionDialogOff", + "videoStreamSelectionDialogTrack", + "videoStreamSelectionDialogNoSelection", + "genericSuccessFeedback", + "genericFailureFeedback", + "menuActionConfigureView", + "menuActionSelect", + "menuActionSelectAll", + "menuActionSelectNone", + "menuActionMap", + "menuActionSlideshow", + "menuActionStats", + "viewDialogSortSectionTitle", + "viewDialogGroupSectionTitle", + "viewDialogLayoutSectionTitle", + "viewDialogReverseSortOrder", + "tileLayoutMosaic", + "tileLayoutGrid", + "tileLayoutList", + "coverDialogTabCover", + "coverDialogTabApp", + "coverDialogTabColor", + "appPickDialogTitle", + "appPickDialogNone", + "aboutPageTitle", + "aboutLinkLicense", + "aboutLinkPolicy", + "aboutBugSectionTitle", + "aboutBugSaveLogInstruction", + "aboutBugCopyInfoInstruction", + "aboutBugCopyInfoButton", + "aboutBugReportInstruction", + "aboutBugReportButton", + "aboutCreditsSectionTitle", + "aboutCreditsWorldAtlas1", + "aboutCreditsWorldAtlas2", + "aboutTranslatorsSectionTitle", + "aboutLicensesSectionTitle", + "aboutLicensesBanner", + "aboutLicensesAndroidLibrariesSectionTitle", + "aboutLicensesFlutterPluginsSectionTitle", + "aboutLicensesFlutterPackagesSectionTitle", + "aboutLicensesDartPackagesSectionTitle", + "aboutLicensesShowAllButtonLabel", + "policyPageTitle", + "collectionPageTitle", + "collectionPickPageTitle", + "collectionSelectPageTitle", + "collectionActionShowTitleSearch", + "collectionActionHideTitleSearch", + "collectionActionAddShortcut", + "collectionActionEmptyBin", + "collectionActionCopy", + "collectionActionMove", + "collectionActionRescan", + "collectionActionEdit", + "collectionSearchTitlesHintText", + "collectionGroupAlbum", + "collectionGroupMonth", + "collectionGroupDay", + "collectionGroupNone", + "sectionUnknown", + "dateToday", + "dateYesterday", + "dateThisMonth", + "collectionDeleteFailureFeedback", + "collectionCopyFailureFeedback", + "collectionMoveFailureFeedback", + "collectionRenameFailureFeedback", + "collectionEditFailureFeedback", + "collectionExportFailureFeedback", + "collectionCopySuccessFeedback", + "collectionMoveSuccessFeedback", + "collectionRenameSuccessFeedback", + "collectionEditSuccessFeedback", + "collectionEmptyFavourites", + "collectionEmptyVideos", + "collectionEmptyImages", + "collectionEmptyGrantAccessButtonLabel", + "collectionSelectSectionTooltip", + "collectionDeselectSectionTooltip", + "drawerAboutButton", + "drawerSettingsButton", + "drawerCollectionAll", + "drawerCollectionFavourites", + "drawerCollectionImages", + "drawerCollectionVideos", + "drawerCollectionAnimated", + "drawerCollectionMotionPhotos", + "drawerCollectionPanoramas", + "drawerCollectionRaws", + "drawerCollectionSphericalVideos", + "drawerAlbumPage", + "drawerCountryPage", + "drawerTagPage", + "sortByDate", + "sortByName", + "sortByItemCount", + "sortBySize", + "sortByAlbumFileName", + "sortByRating", + "sortOrderNewestFirst", + "sortOrderOldestFirst", + "sortOrderAtoZ", + "sortOrderZtoA", + "sortOrderHighestFirst", + "sortOrderLowestFirst", + "sortOrderLargestFirst", + "sortOrderSmallestFirst", + "albumGroupTier", + "albumGroupType", + "albumGroupVolume", + "albumGroupNone", + "albumMimeTypeMixed", + "albumPickPageTitleCopy", + "albumPickPageTitleExport", + "albumPickPageTitleMove", + "albumPickPageTitlePick", + "albumCamera", + "albumDownload", + "albumScreenshots", + "albumScreenRecordings", + "albumVideoCaptures", + "albumPageTitle", + "albumEmpty", + "createAlbumTooltip", + "createAlbumButtonLabel", + "newFilterBanner", + "countryPageTitle", + "countryEmpty", + "tagPageTitle", + "tagEmpty", + "binPageTitle", + "searchCollectionFieldHint", + "searchRecentSectionTitle", + "searchDateSectionTitle", + "searchAlbumsSectionTitle", + "searchCountriesSectionTitle", + "searchPlacesSectionTitle", + "searchTagsSectionTitle", + "searchRatingSectionTitle", + "searchMetadataSectionTitle", + "settingsPageTitle", + "settingsSystemDefault", + "settingsDefault", + "settingsDisabled", + "settingsSearchFieldLabel", + "settingsSearchEmpty", + "settingsActionExport", + "settingsActionExportDialogTitle", + "settingsActionImport", + "settingsActionImportDialogTitle", + "appExportCovers", + "appExportFavourites", + "appExportSettings", + "settingsNavigationSectionTitle", + "settingsHomeTile", + "settingsHomeDialogTitle", + "settingsShowBottomNavigationBar", + "settingsKeepScreenOnTile", + "settingsKeepScreenOnDialogTitle", + "settingsDoubleBackExit", + "settingsConfirmationTile", + "settingsConfirmationDialogTitle", + "settingsConfirmationBeforeDeleteItems", + "settingsConfirmationBeforeMoveToBinItems", + "settingsConfirmationBeforeMoveUndatedItems", + "settingsConfirmationAfterMoveToBinItems", + "settingsNavigationDrawerTile", + "settingsNavigationDrawerEditorPageTitle", + "settingsNavigationDrawerBanner", + "settingsNavigationDrawerTabTypes", + "settingsNavigationDrawerTabAlbums", + "settingsNavigationDrawerTabPages", + "settingsNavigationDrawerAddAlbum", + "settingsThumbnailSectionTitle", + "settingsThumbnailOverlayTile", + "settingsThumbnailOverlayPageTitle", + "settingsThumbnailShowFavouriteIcon", + "settingsThumbnailShowTagIcon", + "settingsThumbnailShowLocationIcon", + "settingsThumbnailShowMotionPhotoIcon", + "settingsThumbnailShowRating", + "settingsThumbnailShowRawIcon", + "settingsThumbnailShowVideoDuration", + "settingsCollectionQuickActionsTile", + "settingsCollectionQuickActionEditorPageTitle", + "settingsCollectionQuickActionTabBrowsing", + "settingsCollectionQuickActionTabSelecting", + "settingsCollectionBrowsingQuickActionEditorBanner", + "settingsCollectionSelectionQuickActionEditorBanner", + "settingsViewerSectionTitle", + "settingsViewerGestureSideTapNext", + "settingsViewerUseCutout", + "settingsViewerMaximumBrightness", + "settingsMotionPhotoAutoPlay", + "settingsImageBackground", + "settingsViewerQuickActionsTile", + "settingsViewerQuickActionEditorPageTitle", + "settingsViewerQuickActionEditorBanner", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle", + "settingsViewerQuickActionEmpty", + "settingsViewerOverlayTile", + "settingsViewerOverlayPageTitle", + "settingsViewerShowOverlayOnOpening", + "settingsViewerShowMinimap", + "settingsViewerShowInformation", + "settingsViewerShowInformationSubtitle", + "settingsViewerShowShootingDetails", + "settingsViewerShowOverlayThumbnails", + "settingsViewerEnableOverlayBlurEffect", + "settingsViewerSlideshowTile", + "settingsViewerSlideshowPageTitle", + "settingsSlideshowRepeat", + "settingsSlideshowShuffle", + "settingsSlideshowFillScreen", + "settingsSlideshowAnimatedZoomEffect", + "settingsSlideshowTransitionTile", + "settingsSlideshowIntervalTile", + "settingsSlideshowVideoPlaybackTile", + "settingsSlideshowVideoPlaybackDialogTitle", + "settingsVideoPageTitle", + "settingsVideoSectionTitle", + "settingsVideoShowVideos", + "settingsVideoEnableHardwareAcceleration", + "settingsVideoAutoPlay", + "settingsVideoLoopModeTile", + "settingsVideoLoopModeDialogTitle", + "settingsSubtitleThemeTile", + "settingsSubtitleThemePageTitle", + "settingsSubtitleThemeSample", + "settingsSubtitleThemeTextAlignmentTile", + "settingsSubtitleThemeTextAlignmentDialogTitle", + "settingsSubtitleThemeTextSize", + "settingsSubtitleThemeShowOutline", + "settingsSubtitleThemeTextColor", + "settingsSubtitleThemeTextOpacity", + "settingsSubtitleThemeBackgroundColor", + "settingsSubtitleThemeBackgroundOpacity", + "settingsSubtitleThemeTextAlignmentLeft", + "settingsSubtitleThemeTextAlignmentCenter", + "settingsSubtitleThemeTextAlignmentRight", + "settingsVideoControlsTile", + "settingsVideoControlsPageTitle", + "settingsVideoButtonsTile", + "settingsVideoGestureDoubleTapTogglePlay", + "settingsVideoGestureSideDoubleTapSeek", + "settingsPrivacySectionTitle", + "settingsAllowInstalledAppAccess", + "settingsAllowInstalledAppAccessSubtitle", + "settingsAllowErrorReporting", + "settingsSaveSearchHistory", + "settingsEnableBin", + "settingsEnableBinSubtitle", + "settingsHiddenItemsTile", + "settingsHiddenItemsPageTitle", + "settingsHiddenItemsTabFilters", + "settingsHiddenFiltersBanner", + "settingsHiddenFiltersEmpty", + "settingsHiddenItemsTabPaths", + "settingsHiddenPathsBanner", + "addPathTooltip", + "settingsStorageAccessTile", + "settingsStorageAccessPageTitle", + "settingsStorageAccessBanner", + "settingsStorageAccessEmpty", + "settingsStorageAccessRevokeTooltip", + "settingsAccessibilitySectionTitle", + "settingsRemoveAnimationsTile", + "settingsRemoveAnimationsDialogTitle", + "settingsTimeToTakeActionTile", + "settingsDisplaySectionTitle", + "settingsThemeBrightnessTile", + "settingsThemeBrightnessDialogTitle", + "settingsThemeColorHighlights", + "settingsThemeEnableDynamicColor", + "settingsDisplayRefreshRateModeTile", + "settingsDisplayRefreshRateModeDialogTitle", + "settingsLanguageSectionTitle", + "settingsLanguageTile", + "settingsLanguagePageTitle", + "settingsCoordinateFormatTile", + "settingsCoordinateFormatDialogTitle", + "settingsUnitSystemTile", + "settingsUnitSystemDialogTitle", + "settingsScreenSaverPageTitle", + "settingsWidgetPageTitle", + "settingsWidgetShowOutline", + "settingsWidgetOpenPage", + "settingsCollectionTile", + "statsPageTitle", + "statsWithGps", + "statsTopCountriesSectionTitle", + "statsTopPlacesSectionTitle", + "statsTopTagsSectionTitle", + "statsTopAlbumsSectionTitle", + "viewerOpenPanoramaButtonLabel", + "viewerSetWallpaperButtonLabel", + "viewerErrorUnknown", + "viewerErrorDoesNotExist", + "viewerInfoPageTitle", + "viewerInfoBackToViewerTooltip", + "viewerInfoUnknown", + "viewerInfoLabelDescription", + "viewerInfoLabelTitle", + "viewerInfoLabelDate", + "viewerInfoLabelResolution", + "viewerInfoLabelSize", + "viewerInfoLabelUri", + "viewerInfoLabelPath", + "viewerInfoLabelDuration", + "viewerInfoLabelOwner", + "viewerInfoLabelCoordinates", + "viewerInfoLabelAddress", + "mapStyleDialogTitle", + "mapStyleTooltip", + "mapZoomInTooltip", + "mapZoomOutTooltip", + "mapPointNorthUpTooltip", + "mapAttributionOsmHot", + "mapAttributionStamen", + "openMapPageTooltip", + "mapEmptyRegion", + "viewerInfoOpenEmbeddedFailureFeedback", + "viewerInfoOpenLinkText", + "viewerInfoViewXmlLinkText", + "viewerInfoSearchFieldLabel", + "viewerInfoSearchEmpty", + "viewerInfoSearchSuggestionDate", + "viewerInfoSearchSuggestionDescription", + "viewerInfoSearchSuggestionDimensions", + "viewerInfoSearchSuggestionResolution", + "viewerInfoSearchSuggestionRights", + "wallpaperUseScrollEffect", + "tagEditorPageTitle", + "tagEditorPageNewTagFieldLabel", + "tagEditorPageAddTagTooltip", + "tagEditorSectionRecent", + "panoramaEnableSensorControl", + "panoramaDisableSensorControl", + "sourceViewerPageTitle", + "filePickerShowHiddenFiles", + "filePickerDoNotShowHiddenFiles", + "filePickerOpenFrom", + "filePickerNoItems", + "filePickerUseThisFolder" ], "pt": [ - "widgetOpenPageCollection", - "durationDialogSeconds" - ], - - "ru": [ - "widgetOpenPageCollection", "durationDialogSeconds" ], From 5b960d0a9043082dd5c4bd32ae6408966ffb3b6d Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Tue, 25 Oct 2022 19:23:33 +0200 Subject: [PATCH 23/53] #361 #329 info: edit location by copying from other item --- CHANGELOG.md | 3 +- lib/l10n/app_de.arb | 4 +- lib/l10n/app_el.arb | 4 +- lib/l10n/app_en.arb | 3 +- lib/l10n/app_es.arb | 4 +- lib/l10n/app_fr.arb | 4 +- lib/l10n/app_id.arb | 4 +- lib/l10n/app_it.arb | 4 +- lib/l10n/app_ja.arb | 4 +- lib/l10n/app_ko.arb | 4 +- lib/l10n/app_nb.arb | 4 +- lib/l10n/app_nl.arb | 4 +- lib/l10n/app_pt.arb | 4 +- lib/l10n/app_ru.arb | 4 +- lib/l10n/app_tr.arb | 4 +- lib/l10n/app_zh.arb | 4 +- lib/model/entry_metadata_edition.dart | 3 +- lib/model/metadata/date_modifier.dart | 2 +- .../metadata/enums/date_edit_action.dart | 22 + .../metadata/enums/date_field_source.dart | 36 ++ lib/model/metadata/enums/enums.dart | 46 ++ .../metadata/enums/location_edit_action.dart | 18 + .../{enums.dart => enums/metadata_type.dart} | 59 +-- lib/model/metadata/fields.dart | 2 +- .../metadata/metadata_edit_service.dart | 3 +- .../common/action_mixins/entry_editor.dart | 6 +- .../common/action_mixins/entry_storage.dart | 2 +- .../entry_editors/edit_date_dialog.dart | 60 +-- .../entry_editors/edit_location_dialog.dart | 292 +++++++---- .../entry_editors/remove_metadata_dialog.dart | 3 +- untranslated.json | 491 +++++++++++++++++- 31 files changed, 865 insertions(+), 242 deletions(-) create mode 100644 lib/model/metadata/enums/date_edit_action.dart create mode 100644 lib/model/metadata/enums/date_field_source.dart create mode 100644 lib/model/metadata/enums/enums.dart create mode 100644 lib/model/metadata/enums/location_edit_action.dart rename lib/model/metadata/{enums.dart => enums/metadata_type.dart} (52%) diff --git a/CHANGELOG.md b/CHANGELOG.md index c08c86547..b9caf9a0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,8 @@ All notable changes to this project will be documented in this file. ### Added -- Collection / Info: edit MP4 metadata (date / location / title / description / rating / tags / rotation) +- Info: edit MP4 metadata (date / location / title / description / rating / tags / rotation) +- Info: edit location by copying from other item - Widget: option to open collection on tap ### Changed diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 0bb8859d8..b3cadec16 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -423,8 +423,8 @@ "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Standort", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "Auf Karte wählen", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "Auf Karte wählen", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "Breitengrad", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Längengrad", diff --git a/lib/l10n/app_el.arb b/lib/l10n/app_el.arb index bc115d245..4ce65dfb3 100644 --- a/lib/l10n/app_el.arb +++ b/lib/l10n/app_el.arb @@ -423,8 +423,8 @@ "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Τοποθεσια", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "Επιλογή στο χάρτη", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "Επιλογή στο χάρτη", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "Γεωγραφικό πλάτος", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Γεωγραφικό μήκος", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 8547df6ca..b550afe67 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -389,7 +389,8 @@ "durationDialogSeconds": "Seconds", "editEntryLocationDialogTitle": "Location", - "editEntryLocationDialogChooseOnMapTooltip": "Choose on map", + "editEntryLocationDialogSetCustom": "Set custom location", + "editEntryLocationDialogChooseOnMap": "Choose on map", "editEntryLocationDialogLatitude": "Latitude", "editEntryLocationDialogLongitude": "Longitude", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 71207ff5b..f8e703b4d 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -405,8 +405,8 @@ "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Ubicación", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "Elegir en el mapa", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "Elegir en el mapa", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "Latitud", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Longitud", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index ba91525be..2f51dc8b9 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -427,8 +427,8 @@ "@durationDialogSeconds": {}, "editEntryLocationDialogTitle": "Lieu", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "Sélectionner sur la carte", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "Sélectionner sur la carte", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "Latitude", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Longitude", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 0d8ecea7c..aa6795688 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -413,8 +413,8 @@ "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Lokasi", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "Pilih di peta", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "Pilih di peta", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "Garis lintang", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Garis bujur", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index e10f12ae3..f0a89124b 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -423,8 +423,8 @@ "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Posizione", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "Scegli sulla mappa", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "Scegli sulla mappa", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "Latitudine", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Longitudine", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 9be5470fd..d5edd97a1 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -405,8 +405,8 @@ "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "位置情報", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "地図上で選択", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "地図上で選択", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "緯度", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "経度", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index f74e0c978..5d0fb62b5 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -427,8 +427,8 @@ "@durationDialogSeconds": {}, "editEntryLocationDialogTitle": "위치", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "지도에서 선택", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "지도에서 선택", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "위도", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "경도", diff --git a/lib/l10n/app_nb.arb b/lib/l10n/app_nb.arb index e1f252d26..4ff98958f 100644 --- a/lib/l10n/app_nb.arb +++ b/lib/l10n/app_nb.arb @@ -549,8 +549,8 @@ "@editEntryDialogCopyFromItem": {}, "durationDialogMinutes": "Minutter", "@durationDialogMinutes": {}, - "editEntryLocationDialogChooseOnMapTooltip": "Velg på kartet", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "Velg på kartet", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryRatingDialogTitle": "Vurdering", "@editEntryRatingDialogTitle": {}, "removeEntryMetadataDialogTitle": "Metadatafjerning", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 124f8bbc8..048e0b368 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -421,8 +421,8 @@ "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Locatie", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "Kies op kaart", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "Kies op kaart", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "Breedtegraad", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Lengtegraad", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 359a55dc0..40190d034 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -423,8 +423,8 @@ "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Localização", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "Escolha no mapa", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "Escolha no mapa", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "Latitude", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Longitude", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 17c799031..e9f829220 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -423,8 +423,8 @@ "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Местоположение", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "Выбрать на карте", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "Выбрать на карте", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "Широта", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Долгота", diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index ffed60dce..9bd204037 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -379,8 +379,8 @@ "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "Konum", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "Harita üzerinde seç", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "Harita üzerinde seç", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "Enlem", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "Boylam", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index f7a0d5256..8b5feacb7 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -423,8 +423,8 @@ "@durationDialogMinutes": {}, "editEntryLocationDialogTitle": "位置", "@editEntryLocationDialogTitle": {}, - "editEntryLocationDialogChooseOnMapTooltip": "从地图上选择", - "@editEntryLocationDialogChooseOnMapTooltip": {}, + "editEntryLocationDialogChooseOnMap": "从地图上选择", + "@editEntryLocationDialogChooseOnMap": {}, "editEntryLocationDialogLatitude": "纬度", "@editEntryLocationDialogLatitude": {}, "editEntryLocationDialogLongitude": "经度", diff --git a/lib/model/entry_metadata_edition.dart b/lib/model/entry_metadata_edition.dart index ef1f42a2a..0c5b60298 100644 --- a/lib/model/entry_metadata_edition.dart +++ b/lib/model/entry_metadata_edition.dart @@ -3,7 +3,8 @@ import 'dart:io'; import 'package:aves/model/entry.dart'; import 'package:aves/model/metadata/date_modifier.dart'; -import 'package:aves/model/metadata/enums.dart'; +import 'package:aves/model/metadata/enums/date_field_source.dart'; +import 'package:aves/model/metadata/enums/enums.dart'; import 'package:aves/model/metadata/fields.dart'; import 'package:aves/ref/exif.dart'; import 'package:aves/ref/iptc.dart'; diff --git a/lib/model/metadata/date_modifier.dart b/lib/model/metadata/date_modifier.dart index 53be123cd..7f373ac50 100644 --- a/lib/model/metadata/date_modifier.dart +++ b/lib/model/metadata/date_modifier.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/metadata/enums.dart'; +import 'package:aves/model/metadata/enums/enums.dart'; import 'package:aves/model/metadata/fields.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/model/metadata/enums/date_edit_action.dart b/lib/model/metadata/enums/date_edit_action.dart new file mode 100644 index 000000000..4d48b4f0e --- /dev/null +++ b/lib/model/metadata/enums/date_edit_action.dart @@ -0,0 +1,22 @@ +import 'package:aves/model/metadata/enums/enums.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraDateEditAction on DateEditAction { + String getText(BuildContext context) { + switch (this) { + case DateEditAction.setCustom: + return context.l10n.editEntryDateDialogSetCustom; + case DateEditAction.copyField: + return context.l10n.editEntryDateDialogCopyField; + case DateEditAction.copyItem: + return context.l10n.editEntryDialogCopyFromItem; + case DateEditAction.extractFromTitle: + return context.l10n.editEntryDateDialogExtractFromTitle; + case DateEditAction.shift: + return context.l10n.editEntryDateDialogShift; + case DateEditAction.remove: + return context.l10n.actionRemove; + } + } +} diff --git a/lib/model/metadata/enums/date_field_source.dart b/lib/model/metadata/enums/date_field_source.dart new file mode 100644 index 000000000..3f3d12a25 --- /dev/null +++ b/lib/model/metadata/enums/date_field_source.dart @@ -0,0 +1,36 @@ +import 'package:aves/model/metadata/enums/enums.dart'; +import 'package:aves/model/metadata/fields.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraDateFieldSource on DateFieldSource { + String getText(BuildContext context) { + switch (this) { + case DateFieldSource.fileModifiedDate: + return context.l10n.editEntryDateDialogSourceFileModifiedDate; + case DateFieldSource.exifDate: + return 'Exif date'; + case DateFieldSource.exifDateOriginal: + return 'Exif original date'; + case DateFieldSource.exifDateDigitized: + return 'Exif digitized date'; + case DateFieldSource.exifGpsDate: + return 'Exif GPS date'; + } + } + + MetadataField? toMetadataField() { + switch (this) { + case DateFieldSource.fileModifiedDate: + return null; + case DateFieldSource.exifDate: + return MetadataField.exifDate; + case DateFieldSource.exifDateOriginal: + return MetadataField.exifDateOriginal; + case DateFieldSource.exifDateDigitized: + return MetadataField.exifDateDigitized; + case DateFieldSource.exifGpsDate: + return MetadataField.exifGpsDatestamp; + } + } +} diff --git a/lib/model/metadata/enums/enums.dart b/lib/model/metadata/enums/enums.dart new file mode 100644 index 000000000..7d8a54ec6 --- /dev/null +++ b/lib/model/metadata/enums/enums.dart @@ -0,0 +1,46 @@ +enum DateEditAction { + setCustom, + copyField, + copyItem, + extractFromTitle, + shift, + remove, +} + +enum DateFieldSource { + fileModifiedDate, + exifDate, + exifDateOriginal, + exifDateDigitized, + exifGpsDate, +} + +enum LocationEditAction { + chooseOnMap, + copyItem, + setCustom, + remove, +} + +enum MetadataType { + // JPEG COM marker or GIF comment + comment, + // Exif: https://en.wikipedia.org/wiki/Exif + exif, + // ICC profile: https://en.wikipedia.org/wiki/ICC_profile + iccProfile, + // IPTC: https://en.wikipedia.org/wiki/IPTC_Information_Interchange_Model + iptc, + // JPEG APP0 / JFIF: https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format + jfif, + // JPEG APP14 / Adobe: https://www.exiftool.org/TagNames/JPEG.html#Adobe + jpegAdobe, + // JPEG APP12 / Ducky: https://www.exiftool.org/TagNames/APP12.html#Ducky + jpegDucky, + // ISO User Data box content, etc. + mp4, + // Photoshop IRB: https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ + photoshopIrb, + // XMP: https://en.wikipedia.org/wiki/Extensible_Metadata_Platform + xmp, +} diff --git a/lib/model/metadata/enums/location_edit_action.dart b/lib/model/metadata/enums/location_edit_action.dart new file mode 100644 index 000000000..5c0f25424 --- /dev/null +++ b/lib/model/metadata/enums/location_edit_action.dart @@ -0,0 +1,18 @@ +import 'package:aves/model/metadata/enums/enums.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraLocationEditAction on LocationEditAction { + String getText(BuildContext context) { + switch (this) { + case LocationEditAction.chooseOnMap: + return context.l10n.editEntryLocationDialogChooseOnMap; + case LocationEditAction.copyItem: + return context.l10n.editEntryDialogCopyFromItem; + case LocationEditAction.setCustom: + return context.l10n.editEntryLocationDialogSetCustom; + case LocationEditAction.remove: + return context.l10n.actionRemove; + } + } +} diff --git a/lib/model/metadata/enums.dart b/lib/model/metadata/enums/metadata_type.dart similarity index 52% rename from lib/model/metadata/enums.dart rename to lib/model/metadata/enums/metadata_type.dart index dead66e4f..e7481d5ae 100644 --- a/lib/model/metadata/enums.dart +++ b/lib/model/metadata/enums/metadata_type.dart @@ -1,44 +1,4 @@ -import 'package:aves/model/metadata/fields.dart'; - -enum DateEditAction { - setCustom, - copyField, - copyItem, - extractFromTitle, - shift, - remove, -} - -enum DateFieldSource { - fileModifiedDate, - exifDate, - exifDateOriginal, - exifDateDigitized, - exifGpsDate, -} - -enum MetadataType { - // JPEG COM marker or GIF comment - comment, - // Exif: https://en.wikipedia.org/wiki/Exif - exif, - // ICC profile: https://en.wikipedia.org/wiki/ICC_profile - iccProfile, - // IPTC: https://en.wikipedia.org/wiki/IPTC_Information_Interchange_Model - iptc, - // JPEG APP0 / JFIF: https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format - jfif, - // JPEG APP14 / Adobe: https://www.exiftool.org/TagNames/JPEG.html#Adobe - jpegAdobe, - // JPEG APP12 / Ducky: https://www.exiftool.org/TagNames/APP12.html#Ducky - jpegDucky, - // ISO User Data box content, etc. - mp4, - // Photoshop IRB: https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ - photoshopIrb, - // XMP: https://en.wikipedia.org/wiki/Extensible_Metadata_Platform - xmp, -} +import 'package:aves/model/metadata/enums/enums.dart'; class MetadataTypes { static const main = { @@ -114,20 +74,3 @@ extension ExtraMetadataType on MetadataType { } } } - -extension ExtraDateFieldSource on DateFieldSource { - MetadataField? toMetadataField() { - switch (this) { - case DateFieldSource.fileModifiedDate: - return null; - case DateFieldSource.exifDate: - return MetadataField.exifDate; - case DateFieldSource.exifDateOriginal: - return MetadataField.exifDateOriginal; - case DateFieldSource.exifDateDigitized: - return MetadataField.exifDateDigitized; - case DateFieldSource.exifGpsDate: - return MetadataField.exifGpsDatestamp; - } - } -} diff --git a/lib/model/metadata/fields.dart b/lib/model/metadata/fields.dart index b6b279226..552909243 100644 --- a/lib/model/metadata/fields.dart +++ b/lib/model/metadata/fields.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/metadata/enums.dart'; +import 'package:aves/model/metadata/enums/enums.dart'; enum MetadataField { exifDate, diff --git a/lib/services/metadata/metadata_edit_service.dart b/lib/services/metadata/metadata_edit_service.dart index 1ab75766b..aeb8aec66 100644 --- a/lib/services/metadata/metadata_edit_service.dart +++ b/lib/services/metadata/metadata_edit_service.dart @@ -2,7 +2,8 @@ import 'dart:async'; import 'package:aves/model/entry.dart'; import 'package:aves/model/metadata/date_modifier.dart'; -import 'package:aves/model/metadata/enums.dart'; +import 'package:aves/model/metadata/enums/enums.dart'; +import 'package:aves/model/metadata/enums/metadata_type.dart'; import 'package:aves/model/metadata/fields.dart'; import 'package:aves/services/common/services.dart'; import 'package:collection/collection.dart'; diff --git a/lib/widgets/common/action_mixins/entry_editor.dart b/lib/widgets/common/action_mixins/entry_editor.dart index fab741142..612b0cacf 100644 --- a/lib/widgets/common/action_mixins/entry_editor.dart +++ b/lib/widgets/common/action_mixins/entry_editor.dart @@ -1,7 +1,7 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_metadata_edition.dart'; import 'package:aves/model/metadata/date_modifier.dart'; -import 'package:aves/model/metadata/enums.dart'; +import 'package:aves/model/metadata/enums/enums.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/ref/mime_types.dart'; import 'package:aves/services/common/services.dart'; @@ -33,12 +33,12 @@ mixin EntryEditorMixin { Future<LatLng?> selectLocation(BuildContext context, Set<AvesEntry> entries, CollectionLens? collection) async { if (entries.isEmpty) return null; - final initialLocation = entries.firstWhereOrNull((entry) => entry.hasGps)?.latLng; + final entry = entries.firstWhereOrNull((entry) => entry.hasGps) ?? entries.first; return showDialog<LatLng>( context: context, builder: (context) => EditEntryLocationDialog( - initialLocation: initialLocation, + entry: entry, collection: collection, ), ); diff --git a/lib/widgets/common/action_mixins/entry_storage.dart b/lib/widgets/common/action_mixins/entry_storage.dart index c5aaaa7e9..03ec5bc2c 100644 --- a/lib/widgets/common/action_mixins/entry_storage.dart +++ b/lib/widgets/common/action_mixins/entry_storage.dart @@ -8,7 +8,7 @@ import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/trash.dart'; import 'package:aves/model/highlight.dart'; import 'package:aves/model/metadata/date_modifier.dart'; -import 'package:aves/model/metadata/enums.dart'; +import 'package:aves/model/metadata/enums/enums.dart'; import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; diff --git a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart index 1a2a0b936..11d2fed61 100644 --- a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart @@ -1,6 +1,8 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/metadata/date_modifier.dart'; -import 'package:aves/model/metadata/enums.dart'; +import 'package:aves/model/metadata/enums/date_edit_action.dart'; +import 'package:aves/model/metadata/enums/date_field_source.dart'; +import 'package:aves/model/metadata/enums/enums.dart'; import 'package:aves/model/metadata/fields.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/theme/durations.dart'; @@ -36,7 +38,7 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { DateEditAction _action = DateEditAction.setCustom; DateFieldSource _copyFieldSource = DateFieldSource.fileModifiedDate; late AvesEntry _copyItemSource; - late DateTime _setDateTime; + late DateTime _customDateTime; late ValueNotifier<int> _shiftHour, _shiftMinute; late ValueNotifier<String> _shiftSign; bool _showOptions = false; @@ -47,13 +49,13 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { @override void initState() { super.initState(); - _initSet(); + _initCustom(); _initCopyItem(); _initShift(minutesInHour); } - void _initSet() { - _setDateTime = widget.entry.bestDate ?? DateTime.now(); + void _initCustom() { + _customDateTime = widget.entry.bestDate ?? DateTime.now(); } void _initCopyItem() { @@ -84,7 +86,7 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { padding: const EdgeInsets.only(left: 16, top: 8, right: 16), child: TextDropdownButton<DateEditAction>( values: DateEditAction.values, - valueText: (v) => _actionText(context, v), + valueText: (v) => v.getText(context), value: _action, onChanged: (v) => setState(() => _action = v!), isExpanded: true, @@ -143,7 +145,7 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { padding: const EdgeInsetsDirectional.only(start: 16, end: 8), child: Row( children: [ - Expanded(child: Text(formatDateTime(_setDateTime, locale, use24hour))), + Expanded(child: Text(formatDateTime(_customDateTime, locale, use24hour))), IconButton( icon: const Icon(AIcons.edit), onPressed: _editDate, @@ -159,7 +161,7 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { padding: const EdgeInsets.only(left: 16, top: 0, right: 16), child: TextDropdownButton<DateFieldSource>( values: DateFieldSource.values, - valueText: (v) => _setSourceText(context, v), + valueText: (v) => v.getText(context), value: _copyFieldSource, onChanged: (v) => setState(() => _copyFieldSource = v!), isExpanded: true, @@ -280,44 +282,10 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { ); } - String _actionText(BuildContext context, DateEditAction action) { - final l10n = context.l10n; - switch (action) { - case DateEditAction.setCustom: - return l10n.editEntryDateDialogSetCustom; - case DateEditAction.copyField: - return l10n.editEntryDateDialogCopyField; - case DateEditAction.copyItem: - return l10n.editEntryDialogCopyFromItem; - case DateEditAction.extractFromTitle: - return l10n.editEntryDateDialogExtractFromTitle; - case DateEditAction.shift: - return l10n.editEntryDateDialogShift; - case DateEditAction.remove: - return l10n.actionRemove; - } - } - - String _setSourceText(BuildContext context, DateFieldSource source) { - final l10n = context.l10n; - switch (source) { - case DateFieldSource.fileModifiedDate: - return l10n.editEntryDateDialogSourceFileModifiedDate; - case DateFieldSource.exifDate: - return 'Exif date'; - case DateFieldSource.exifDateOriginal: - return 'Exif original date'; - case DateFieldSource.exifDateDigitized: - return 'Exif digitized date'; - case DateFieldSource.exifGpsDate: - return 'Exif GPS date'; - } - } - Future<void> _editDate() async { final _date = await showDatePicker( context: context, - initialDate: _setDateTime, + initialDate: _customDateTime, firstDate: DateTime(0), lastDate: DateTime(2100), confirmText: context.l10n.nextButtonLabel, @@ -326,11 +294,11 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { final _time = await showTimePicker( context: context, - initialTime: TimeOfDay.fromDateTime(_setDateTime), + initialTime: TimeOfDay.fromDateTime(_customDateTime), ); if (_time == null) return; - setState(() => _setDateTime = DateTime( + setState(() => _customDateTime = DateTime( _date.year, _date.month, _date.day, @@ -366,7 +334,7 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> { // whether each item supports Exif edition switch (_action) { case DateEditAction.setCustom: - return DateModifier.setCustom(const {}, _setDateTime); + return DateModifier.setCustom(const {}, _customDateTime); case DateEditAction.copyField: return DateModifier.copyField(_copyFieldSource); case DateEditAction.copyItem: diff --git a/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart index c490b9ee8..fd169f457 100644 --- a/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart @@ -1,22 +1,32 @@ +import 'package:aves/model/entry.dart'; +import 'package:aves/model/metadata/enums/enums.dart'; +import 'package:aves/model/metadata/enums/location_edit_action.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; import 'package:aves/utils/constants.dart'; +import 'package:aves/widgets/common/basic/text_dropdown_button.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/item_pick_dialog.dart'; +import 'package:aves/widgets/dialogs/item_picker.dart'; import 'package:aves/widgets/dialogs/location_pick_dialog.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:latlong2/latlong.dart'; +import 'package:provider/provider.dart'; class EditEntryLocationDialog extends StatefulWidget { - final LatLng? initialLocation; + final AvesEntry entry; final CollectionLens? collection; const EditEntryLocationDialog({ super.key, - required this.initialLocation, + required this.entry, this.collection, }); @@ -25,9 +35,10 @@ class EditEntryLocationDialog extends StatefulWidget { } class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> { - _LocationAction _action = _LocationAction.set; + LocationEditAction _action = LocationEditAction.chooseOnMap; + LatLng? _mapCoordinates; + late AvesEntry _copyItemSource; final TextEditingController _latitudeController = TextEditingController(), _longitudeController = TextEditingController(); - final FocusNode _latitudeFocusNode = FocusNode(), _longitudeFocusNode = FocusNode(); final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false); NumberFormat get coordinateFormatter => NumberFormat('0.000000', context.l10n.localeName); @@ -35,15 +46,35 @@ class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> { @override void initState() { super.initState(); - _latitudeFocusNode.addListener(_onLatLngFocusChange); - _longitudeFocusNode.addListener(_onLatLngFocusChange); - WidgetsBinding.instance.addPostFrameCallback((_) => _setLocation(context, widget.initialLocation)); + _initMapCoordinates(); + _initCopyItem(); + _initCustom(); + } + + void _initMapCoordinates() { + _mapCoordinates = widget.entry.latLng; + } + + void _initCopyItem() { + _copyItemSource = widget.entry; + } + + void _initCustom() { + WidgetsBinding.instance.addPostFrameCallback((_) { + final latLng = widget.entry.latLng; + if (latLng != null) { + _latitudeController.text = coordinateFormatter.format(latLng.latitude); + _longitudeController.text = coordinateFormatter.format(latLng.longitude); + } else { + _latitudeController.text = ''; + _longitudeController.text = ''; + } + setState(_validate); + }); } @override void dispose() { - _latitudeFocusNode.removeListener(_onLatLngFocusChange); - _longitudeFocusNode.removeListener(_onLatLngFocusChange); _latitudeController.dispose(); _longitudeController.dispose(); super.dispose(); @@ -62,64 +93,36 @@ class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> { return AvesDialog( title: l10n.editEntryLocationDialogTitle, scrollableContent: [ - RadioListTile<_LocationAction>( - value: _LocationAction.set, - groupValue: _action, - onChanged: (v) => setState(() { - _action = v!; - _validate(); - }), - title: Row( - crossAxisAlignment: CrossAxisAlignment.start, + Padding( + padding: const EdgeInsets.only(left: 16, top: 8, right: 16), + child: TextDropdownButton<LocationEditAction>( + values: LocationEditAction.values, + valueText: (v) => v.getText(context), + value: _action, + onChanged: (v) => setState(() { + _action = v!; + _validate(); + }), + isExpanded: true, + dropdownColor: Themes.thirdLayerColor(context), + ), + ), + AnimatedSwitcher( + duration: context.read<DurationsData>().formTransition, + switchInCurve: Curves.easeInOutCubic, + switchOutCurve: Curves.easeInOutCubic, + transitionBuilder: _formTransitionBuilder, + child: Column( + key: ValueKey(_action), + mainAxisSize: MainAxisSize.min, children: [ - Expanded( - child: Column( - children: [ - TextField( - controller: _latitudeController, - focusNode: _latitudeFocusNode, - decoration: InputDecoration( - labelText: l10n.editEntryLocationDialogLatitude, - hintText: coordinateFormatter.format(Constants.pointNemo.latitude), - ), - onChanged: (_) => _validate(), - ), - TextField( - controller: _longitudeController, - focusNode: _longitudeFocusNode, - decoration: InputDecoration( - labelText: l10n.editEntryLocationDialogLongitude, - hintText: coordinateFormatter.format(Constants.pointNemo.longitude), - ), - onChanged: (_) => _validate(), - ), - ], - ), - ), - const SizedBox(width: 8), - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: IconButton( - icon: const Icon(AIcons.map), - onPressed: _pickLocation, - tooltip: l10n.editEntryLocationDialogChooseOnMapTooltip, - ), - ), + if (_action == LocationEditAction.chooseOnMap) _buildChooseOnMapContent(context), + if (_action == LocationEditAction.copyItem) _buildCopyItemContent(context), + if (_action == LocationEditAction.setCustom) _buildSetCustomContent(context), ], ), - contentPadding: const EdgeInsetsDirectional.only(start: 16, end: 8), - ), - RadioListTile<_LocationAction>( - value: _LocationAction.remove, - groupValue: _action, - onChanged: (v) => setState(() { - _action = v!; - _latitudeFocusNode.unfocus(); - _longitudeFocusNode.unfocus(); - _validate(); - }), - title: Text(l10n.actionRemove), ), + const SizedBox(height: 8), ], actions: [ TextButton( @@ -142,22 +145,32 @@ class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> { ); } - void _onLatLngFocusChange() { - if (_latitudeFocusNode.hasFocus || _longitudeFocusNode.hasFocus) { - setState(() { - _action = _LocationAction.set; - _validate(); - }); - } - } + Widget _formTransitionBuilder(Widget child, Animation<double> animation) => FadeTransition( + opacity: animation, + child: SizeTransition( + sizeFactor: animation, + axisAlignment: -1, + child: child, + ), + ); - void _setLocation(BuildContext context, LatLng? latLng) { - _latitudeController.text = latLng != null ? coordinateFormatter.format(latLng.latitude) : ''; - _longitudeController.text = latLng != null ? coordinateFormatter.format(latLng.longitude) : ''; - setState(() { - _action = _LocationAction.set; - _validate(); - }); + Widget _buildChooseOnMapContent(BuildContext context) { + final l10n = context.l10n; + + return Padding( + padding: const EdgeInsetsDirectional.only(start: 16, end: 8), + child: Row( + children: [ + Expanded(child: _toText(context, _mapCoordinates)), + const SizedBox(width: 8), + IconButton( + icon: const Icon(AIcons.map), + onPressed: _pickLocation, + tooltip: l10n.editEntryLocationDialogChooseOnMap, + ), + ], + ), + ); } Future<void> _pickLocation() async { @@ -176,7 +189,7 @@ class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> { : null; return LocationPickDialog( collection: mapCollection, - initialLocation: _parseLatLng(), + initialLocation: _mapCoordinates, ); }, fullscreenDialog: true, @@ -184,7 +197,102 @@ class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> { ); if (latLng != null) { settings.mapDefaultCenter = latLng; - _setLocation(context, latLng); + setState(() { + _mapCoordinates = latLng; + _validate(); + }); + } + } + + Widget _buildCopyItemContent(BuildContext context) { + return Padding( + padding: const EdgeInsetsDirectional.only(start: 16, end: 8), + child: Row( + children: [ + Expanded(child: _toText(context, _copyItemSource.latLng)), + const SizedBox(width: 8), + ItemPicker( + extent: 48, + entry: _copyItemSource, + onTap: _pickCopyItemSource, + ), + ], + ), + ); + } + + Future<void> _pickCopyItemSource() async { + final _collection = widget.collection; + if (_collection == null) return; + + final entry = await Navigator.push<AvesEntry>( + context, + MaterialPageRoute( + settings: const RouteSettings(name: ItemPickDialog.routeName), + builder: (context) => ItemPickDialog( + collection: CollectionLens( + source: _collection.source, + ), + ), + fullscreenDialog: true, + ), + ); + if (entry != null) { + setState(() { + _copyItemSource = entry; + _validate(); + }); + } + } + + Widget _buildSetCustomContent(BuildContext context) { + final l10n = context.l10n; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + children: [ + TextField( + controller: _latitudeController, + decoration: InputDecoration( + labelText: l10n.editEntryLocationDialogLatitude, + hintText: coordinateFormatter.format(Constants.pointNemo.latitude), + ), + onChanged: (_) => _validate(), + ), + TextField( + controller: _longitudeController, + decoration: InputDecoration( + labelText: l10n.editEntryLocationDialogLongitude, + hintText: coordinateFormatter.format(Constants.pointNemo.longitude), + ), + onChanged: (_) => _validate(), + ), + ], + ), + ), + ], + ), + ); + } + + Text _toText(BuildContext context, LatLng? latLng) { + final l10n = context.l10n; + if (latLng != null) { + return Text( + ExtraCoordinateFormat.toDMS(l10n, latLng).join('\n'), + ); + } else { + return Text( + l10n.viewerInfoUnknown, + style: TextStyle( + color: Theme.of(context).textTheme.bodySmall!.color, + ), + ); } } @@ -205,12 +313,18 @@ class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> { return LatLng(lat, lng); } - Future<void> _validate() async { + void _validate() { switch (_action) { - case _LocationAction.set: + case LocationEditAction.chooseOnMap: + _isValidNotifier.value = _mapCoordinates != null; + break; + case LocationEditAction.copyItem: + _isValidNotifier.value = _copyItemSource.hasGps; + break; + case LocationEditAction.setCustom: _isValidNotifier.value = _parseLatLng() != null; break; - case _LocationAction.remove: + case LocationEditAction.remove: _isValidNotifier.value = true; break; } @@ -218,14 +332,18 @@ class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> { void _submit(BuildContext context) { switch (_action) { - case _LocationAction.set: + case LocationEditAction.chooseOnMap: + Navigator.pop(context, _mapCoordinates); + break; + case LocationEditAction.copyItem: + Navigator.pop(context, _copyItemSource.latLng); + break; + case LocationEditAction.setCustom: Navigator.pop(context, _parseLatLng()); break; - case _LocationAction.remove: + case LocationEditAction.remove: Navigator.pop(context, LatLng(0, 0)); break; } } } - -enum _LocationAction { set, remove } diff --git a/lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart b/lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart index 1cb08eec6..027d69406 100644 --- a/lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/remove_metadata_dialog.dart @@ -1,4 +1,5 @@ -import 'package:aves/model/metadata/enums.dart'; +import 'package:aves/model/metadata/enums/enums.dart'; +import 'package:aves/model/metadata/enums/metadata_type.dart'; import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/ref/brand_colors.dart'; diff --git a/untranslated.json b/untranslated.json index 1a79ac754..e00e4cc87 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,12 +1,17 @@ { "de": [ - "widgetOpenPageCollection", - "durationDialogSeconds" + "editEntryLocationDialogSetCustom" ], "el": [ + "editEntryLocationDialogSetCustom" + ], + + "es": [ + "widgetOpenPageHome", "widgetOpenPageCollection", - "durationDialogSeconds" + "widgetOpenPageViewer", + "editEntryLocationDialogSetCustom" ], "fa": [ @@ -212,11 +217,11 @@ "exportEntryDialogWidth", "exportEntryDialogHeight", "renameEntryDialogLabel", + "editEntryDialogCopyFromItem", "editEntryDialogTargetFieldsHeader", "editEntryDateDialogTitle", "editEntryDateDialogSetCustom", "editEntryDateDialogCopyField", - "editEntryDialogCopyFromItem", "editEntryDateDialogExtractFromTitle", "editEntryDateDialogShift", "editEntryDateDialogSourceFileModifiedDate", @@ -224,7 +229,457 @@ "durationDialogMinutes", "durationDialogSeconds", "editEntryLocationDialogTitle", - "editEntryLocationDialogChooseOnMapTooltip", + "editEntryLocationDialogSetCustom", + "editEntryLocationDialogChooseOnMap", + "editEntryLocationDialogLatitude", + "editEntryLocationDialogLongitude", + "locationPickerUseThisLocationButton", + "editEntryRatingDialogTitle", + "removeEntryMetadataDialogTitle", + "removeEntryMetadataDialogMore", + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage", + "convertMotionPhotoToStillImageWarningDialogMessage", + "videoSpeedDialogLabel", + "videoStreamSelectionDialogVideo", + "videoStreamSelectionDialogAudio", + "videoStreamSelectionDialogText", + "videoStreamSelectionDialogOff", + "videoStreamSelectionDialogTrack", + "videoStreamSelectionDialogNoSelection", + "genericSuccessFeedback", + "genericFailureFeedback", + "menuActionConfigureView", + "menuActionSelect", + "menuActionSelectAll", + "menuActionSelectNone", + "menuActionMap", + "menuActionSlideshow", + "menuActionStats", + "viewDialogSortSectionTitle", + "viewDialogGroupSectionTitle", + "viewDialogLayoutSectionTitle", + "viewDialogReverseSortOrder", + "tileLayoutMosaic", + "tileLayoutGrid", + "tileLayoutList", + "coverDialogTabCover", + "coverDialogTabApp", + "coverDialogTabColor", + "appPickDialogTitle", + "appPickDialogNone", + "aboutPageTitle", + "aboutLinkLicense", + "aboutLinkPolicy", + "aboutBugSectionTitle", + "aboutBugSaveLogInstruction", + "aboutBugCopyInfoInstruction", + "aboutBugCopyInfoButton", + "aboutBugReportInstruction", + "aboutBugReportButton", + "aboutCreditsSectionTitle", + "aboutCreditsWorldAtlas1", + "aboutCreditsWorldAtlas2", + "aboutTranslatorsSectionTitle", + "aboutLicensesSectionTitle", + "aboutLicensesBanner", + "aboutLicensesAndroidLibrariesSectionTitle", + "aboutLicensesFlutterPluginsSectionTitle", + "aboutLicensesFlutterPackagesSectionTitle", + "aboutLicensesDartPackagesSectionTitle", + "aboutLicensesShowAllButtonLabel", + "policyPageTitle", + "collectionPageTitle", + "collectionPickPageTitle", + "collectionSelectPageTitle", + "collectionActionShowTitleSearch", + "collectionActionHideTitleSearch", + "collectionActionAddShortcut", + "collectionActionEmptyBin", + "collectionActionCopy", + "collectionActionMove", + "collectionActionRescan", + "collectionActionEdit", + "collectionSearchTitlesHintText", + "collectionGroupAlbum", + "collectionGroupMonth", + "collectionGroupDay", + "collectionGroupNone", + "sectionUnknown", + "dateToday", + "dateYesterday", + "dateThisMonth", + "collectionDeleteFailureFeedback", + "collectionCopyFailureFeedback", + "collectionMoveFailureFeedback", + "collectionRenameFailureFeedback", + "collectionEditFailureFeedback", + "collectionExportFailureFeedback", + "collectionCopySuccessFeedback", + "collectionMoveSuccessFeedback", + "collectionRenameSuccessFeedback", + "collectionEditSuccessFeedback", + "collectionEmptyFavourites", + "collectionEmptyVideos", + "collectionEmptyImages", + "collectionEmptyGrantAccessButtonLabel", + "collectionSelectSectionTooltip", + "collectionDeselectSectionTooltip", + "drawerAboutButton", + "drawerSettingsButton", + "drawerCollectionAll", + "drawerCollectionFavourites", + "drawerCollectionImages", + "drawerCollectionVideos", + "drawerCollectionAnimated", + "drawerCollectionMotionPhotos", + "drawerCollectionPanoramas", + "drawerCollectionRaws", + "drawerCollectionSphericalVideos", + "drawerAlbumPage", + "drawerCountryPage", + "drawerTagPage", + "sortByDate", + "sortByName", + "sortByItemCount", + "sortBySize", + "sortByAlbumFileName", + "sortByRating", + "sortOrderNewestFirst", + "sortOrderOldestFirst", + "sortOrderAtoZ", + "sortOrderZtoA", + "sortOrderHighestFirst", + "sortOrderLowestFirst", + "sortOrderLargestFirst", + "sortOrderSmallestFirst", + "albumGroupTier", + "albumGroupType", + "albumGroupVolume", + "albumGroupNone", + "albumMimeTypeMixed", + "albumPickPageTitleCopy", + "albumPickPageTitleExport", + "albumPickPageTitleMove", + "albumPickPageTitlePick", + "albumCamera", + "albumDownload", + "albumScreenshots", + "albumScreenRecordings", + "albumVideoCaptures", + "albumPageTitle", + "albumEmpty", + "createAlbumTooltip", + "createAlbumButtonLabel", + "newFilterBanner", + "countryPageTitle", + "countryEmpty", + "tagPageTitle", + "tagEmpty", + "binPageTitle", + "searchCollectionFieldHint", + "searchRecentSectionTitle", + "searchDateSectionTitle", + "searchAlbumsSectionTitle", + "searchCountriesSectionTitle", + "searchPlacesSectionTitle", + "searchTagsSectionTitle", + "searchRatingSectionTitle", + "searchMetadataSectionTitle", + "settingsPageTitle", + "settingsSystemDefault", + "settingsDefault", + "settingsDisabled", + "settingsSearchFieldLabel", + "settingsSearchEmpty", + "settingsActionExport", + "settingsActionExportDialogTitle", + "settingsActionImport", + "settingsActionImportDialogTitle", + "appExportCovers", + "appExportFavourites", + "appExportSettings", + "settingsNavigationSectionTitle", + "settingsHomeTile", + "settingsHomeDialogTitle", + "settingsShowBottomNavigationBar", + "settingsKeepScreenOnTile", + "settingsKeepScreenOnDialogTitle", + "settingsDoubleBackExit", + "settingsConfirmationTile", + "settingsConfirmationDialogTitle", + "settingsConfirmationBeforeDeleteItems", + "settingsConfirmationBeforeMoveToBinItems", + "settingsConfirmationBeforeMoveUndatedItems", + "settingsConfirmationAfterMoveToBinItems", + "settingsNavigationDrawerTile", + "settingsNavigationDrawerEditorPageTitle", + "settingsNavigationDrawerBanner", + "settingsNavigationDrawerTabTypes", + "settingsNavigationDrawerTabAlbums", + "settingsNavigationDrawerTabPages", + "settingsNavigationDrawerAddAlbum", + "settingsThumbnailSectionTitle", + "settingsThumbnailOverlayTile", + "settingsThumbnailOverlayPageTitle", + "settingsThumbnailShowFavouriteIcon", + "settingsThumbnailShowTagIcon", + "settingsThumbnailShowLocationIcon", + "settingsThumbnailShowMotionPhotoIcon", + "settingsThumbnailShowRating", + "settingsThumbnailShowRawIcon", + "settingsThumbnailShowVideoDuration", + "settingsCollectionQuickActionsTile", + "settingsCollectionQuickActionEditorPageTitle", + "settingsCollectionQuickActionTabBrowsing", + "settingsCollectionQuickActionTabSelecting", + "settingsCollectionBrowsingQuickActionEditorBanner", + "settingsCollectionSelectionQuickActionEditorBanner", + "settingsViewerSectionTitle", + "settingsViewerGestureSideTapNext", + "settingsViewerUseCutout", + "settingsViewerMaximumBrightness", + "settingsMotionPhotoAutoPlay", + "settingsImageBackground", + "settingsViewerQuickActionsTile", + "settingsViewerQuickActionEditorPageTitle", + "settingsViewerQuickActionEditorBanner", + "settingsViewerQuickActionEditorDisplayedButtonsSectionTitle", + "settingsViewerQuickActionEditorAvailableButtonsSectionTitle", + "settingsViewerQuickActionEmpty", + "settingsViewerOverlayTile", + "settingsViewerOverlayPageTitle", + "settingsViewerShowOverlayOnOpening", + "settingsViewerShowMinimap", + "settingsViewerShowInformation", + "settingsViewerShowInformationSubtitle", + "settingsViewerShowShootingDetails", + "settingsViewerShowOverlayThumbnails", + "settingsViewerEnableOverlayBlurEffect", + "settingsViewerSlideshowTile", + "settingsViewerSlideshowPageTitle", + "settingsSlideshowRepeat", + "settingsSlideshowShuffle", + "settingsSlideshowFillScreen", + "settingsSlideshowAnimatedZoomEffect", + "settingsSlideshowTransitionTile", + "settingsSlideshowIntervalTile", + "settingsSlideshowVideoPlaybackTile", + "settingsSlideshowVideoPlaybackDialogTitle", + "settingsVideoPageTitle", + "settingsVideoSectionTitle", + "settingsVideoShowVideos", + "settingsVideoEnableHardwareAcceleration", + "settingsVideoAutoPlay", + "settingsVideoLoopModeTile", + "settingsVideoLoopModeDialogTitle", + "settingsSubtitleThemeTile", + "settingsSubtitleThemePageTitle", + "settingsSubtitleThemeSample", + "settingsSubtitleThemeTextAlignmentTile", + "settingsSubtitleThemeTextAlignmentDialogTitle", + "settingsSubtitleThemeTextSize", + "settingsSubtitleThemeShowOutline", + "settingsSubtitleThemeTextColor", + "settingsSubtitleThemeTextOpacity", + "settingsSubtitleThemeBackgroundColor", + "settingsSubtitleThemeBackgroundOpacity", + "settingsSubtitleThemeTextAlignmentLeft", + "settingsSubtitleThemeTextAlignmentCenter", + "settingsSubtitleThemeTextAlignmentRight", + "settingsVideoControlsTile", + "settingsVideoControlsPageTitle", + "settingsVideoButtonsTile", + "settingsVideoGestureDoubleTapTogglePlay", + "settingsVideoGestureSideDoubleTapSeek", + "settingsPrivacySectionTitle", + "settingsAllowInstalledAppAccess", + "settingsAllowInstalledAppAccessSubtitle", + "settingsAllowErrorReporting", + "settingsSaveSearchHistory", + "settingsEnableBin", + "settingsEnableBinSubtitle", + "settingsHiddenItemsTile", + "settingsHiddenItemsPageTitle", + "settingsHiddenItemsTabFilters", + "settingsHiddenFiltersBanner", + "settingsHiddenFiltersEmpty", + "settingsHiddenItemsTabPaths", + "settingsHiddenPathsBanner", + "addPathTooltip", + "settingsStorageAccessTile", + "settingsStorageAccessPageTitle", + "settingsStorageAccessBanner", + "settingsStorageAccessEmpty", + "settingsStorageAccessRevokeTooltip", + "settingsAccessibilitySectionTitle", + "settingsRemoveAnimationsTile", + "settingsRemoveAnimationsDialogTitle", + "settingsTimeToTakeActionTile", + "settingsDisplaySectionTitle", + "settingsThemeBrightnessTile", + "settingsThemeBrightnessDialogTitle", + "settingsThemeColorHighlights", + "settingsThemeEnableDynamicColor", + "settingsDisplayRefreshRateModeTile", + "settingsDisplayRefreshRateModeDialogTitle", + "settingsLanguageSectionTitle", + "settingsLanguageTile", + "settingsLanguagePageTitle", + "settingsCoordinateFormatTile", + "settingsCoordinateFormatDialogTitle", + "settingsUnitSystemTile", + "settingsUnitSystemDialogTitle", + "settingsScreenSaverPageTitle", + "settingsWidgetPageTitle", + "settingsWidgetShowOutline", + "settingsWidgetOpenPage", + "settingsCollectionTile", + "statsPageTitle", + "statsWithGps", + "statsTopCountriesSectionTitle", + "statsTopPlacesSectionTitle", + "statsTopTagsSectionTitle", + "statsTopAlbumsSectionTitle", + "viewerOpenPanoramaButtonLabel", + "viewerSetWallpaperButtonLabel", + "viewerErrorUnknown", + "viewerErrorDoesNotExist", + "viewerInfoPageTitle", + "viewerInfoBackToViewerTooltip", + "viewerInfoUnknown", + "viewerInfoLabelDescription", + "viewerInfoLabelTitle", + "viewerInfoLabelDate", + "viewerInfoLabelResolution", + "viewerInfoLabelSize", + "viewerInfoLabelUri", + "viewerInfoLabelPath", + "viewerInfoLabelDuration", + "viewerInfoLabelOwner", + "viewerInfoLabelCoordinates", + "viewerInfoLabelAddress", + "mapStyleDialogTitle", + "mapStyleTooltip", + "mapZoomInTooltip", + "mapZoomOutTooltip", + "mapPointNorthUpTooltip", + "mapAttributionOsmHot", + "mapAttributionStamen", + "openMapPageTooltip", + "mapEmptyRegion", + "viewerInfoOpenEmbeddedFailureFeedback", + "viewerInfoOpenLinkText", + "viewerInfoViewXmlLinkText", + "viewerInfoSearchFieldLabel", + "viewerInfoSearchEmpty", + "viewerInfoSearchSuggestionDate", + "viewerInfoSearchSuggestionDescription", + "viewerInfoSearchSuggestionDimensions", + "viewerInfoSearchSuggestionResolution", + "viewerInfoSearchSuggestionRights", + "wallpaperUseScrollEffect", + "tagEditorPageTitle", + "tagEditorPageNewTagFieldLabel", + "tagEditorPageAddTagTooltip", + "tagEditorSectionRecent", + "panoramaEnableSensorControl", + "panoramaDisableSensorControl", + "sourceViewerPageTitle", + "filePickerShowHiddenFiles", + "filePickerDoNotShowHiddenFiles", + "filePickerOpenFrom", + "filePickerNoItems", + "filePickerUseThisFolder" + ], + + "fr": [ + "editEntryLocationDialogSetCustom" + ], + + "gl": [ + "accessibilityAnimationsRemove", + "accessibilityAnimationsKeep", + "displayRefreshRatePreferHighest", + "displayRefreshRatePreferLowest", + "videoPlaybackSkip", + "videoPlaybackMuted", + "videoPlaybackWithSound", + "themeBrightnessLight", + "themeBrightnessDark", + "themeBrightnessBlack", + "viewerTransitionSlide", + "viewerTransitionParallax", + "viewerTransitionFade", + "viewerTransitionZoomIn", + "viewerTransitionNone", + "wallpaperTargetHome", + "wallpaperTargetLock", + "wallpaperTargetHomeLock", + "widgetOpenPageHome", + "widgetOpenPageCollection", + "widgetOpenPageViewer", + "albumTierNew", + "albumTierPinned", + "albumTierSpecial", + "albumTierApps", + "albumTierRegular", + "storageVolumeDescriptionFallbackPrimary", + "storageVolumeDescriptionFallbackNonPrimary", + "rootDirectoryDescription", + "otherDirectoryDescription", + "storageAccessDialogMessage", + "restrictedAccessDialogMessage", + "notEnoughSpaceDialogMessage", + "missingSystemFilePickerDialogMessage", + "unsupportedTypeDialogMessage", + "nameConflictDialogSingleSourceMessage", + "nameConflictDialogMultipleSourceMessage", + "addShortcutDialogLabel", + "addShortcutButtonLabel", + "noMatchingAppDialogMessage", + "binEntriesConfirmationDialogMessage", + "deleteEntriesConfirmationDialogMessage", + "moveUndatedConfirmationDialogMessage", + "moveUndatedConfirmationDialogSetDate", + "videoResumeDialogMessage", + "videoStartOverButtonLabel", + "videoResumeButtonLabel", + "setCoverDialogLatest", + "setCoverDialogAuto", + "setCoverDialogCustom", + "hideFilterConfirmationDialogMessage", + "newAlbumDialogTitle", + "newAlbumDialogNameLabel", + "newAlbumDialogNameLabelAlreadyExistsHelper", + "newAlbumDialogStorageLabel", + "renameAlbumDialogLabel", + "renameAlbumDialogLabelAlreadyExistsHelper", + "renameEntrySetPageTitle", + "renameEntrySetPagePatternFieldLabel", + "renameEntrySetPageInsertTooltip", + "renameEntrySetPagePreviewSectionTitle", + "renameProcessorCounter", + "renameProcessorName", + "deleteSingleAlbumConfirmationDialogMessage", + "deleteMultiAlbumConfirmationDialogMessage", + "exportEntryDialogFormat", + "exportEntryDialogWidth", + "exportEntryDialogHeight", + "renameEntryDialogLabel", + "editEntryDialogCopyFromItem", + "editEntryDialogTargetFieldsHeader", + "editEntryDateDialogTitle", + "editEntryDateDialogSetCustom", + "editEntryDateDialogCopyField", + "editEntryDateDialogExtractFromTitle", + "editEntryDateDialogShift", + "editEntryDateDialogSourceFileModifiedDate", + "durationDialogHours", + "durationDialogMinutes", + "durationDialogSeconds", + "editEntryLocationDialogTitle", + "editEntryLocationDialogSetCustom", + "editEntryLocationDialogChooseOnMap", "editEntryLocationDialogLatitude", "editEntryLocationDialogLongitude", "locationPickerUseThisLocationButton", @@ -594,6 +1049,7 @@ "widgetOpenPageCollection", "widgetOpenPageViewer", "durationDialogSeconds", + "editEntryLocationDialogSetCustom", "tileLayoutMosaic", "albumGroupType", "albumMimeTypeMixed", @@ -605,8 +1061,7 @@ ], "it": [ - "widgetOpenPageCollection", - "durationDialogSeconds" + "editEntryLocationDialogSetCustom" ], "ja": [ @@ -621,6 +1076,7 @@ "widgetOpenPageCollection", "widgetOpenPageViewer", "durationDialogSeconds", + "editEntryLocationDialogSetCustom", "viewDialogReverseSortOrder", "tileLayoutMosaic", "sortOrderNewestFirst", @@ -644,6 +1100,10 @@ "wallpaperUseScrollEffect" ], + "ko": [ + "editEntryLocationDialogSetCustom" + ], + "nb": [ "videoActionCaptureFrame", "videoActionSelectStreams", @@ -672,6 +1132,7 @@ "editEntryDateDialogShift", "editEntryDateDialogSourceFileModifiedDate", "editEntryLocationDialogTitle", + "editEntryLocationDialogSetCustom", "locationPickerUseThisLocationButton", "removeEntryMetadataMotionPhotoXmpWarningDialogMessage", "videoStreamSelectionDialogText", @@ -756,6 +1217,7 @@ "widgetOpenPageCollection", "widgetOpenPageViewer", "durationDialogSeconds", + "editEntryLocationDialogSetCustom", "aboutLinkPolicy", "policyPageTitle" ], @@ -870,11 +1332,11 @@ "exportEntryDialogWidth", "exportEntryDialogHeight", "renameEntryDialogLabel", + "editEntryDialogCopyFromItem", "editEntryDialogTargetFieldsHeader", "editEntryDateDialogTitle", "editEntryDateDialogSetCustom", "editEntryDateDialogCopyField", - "editEntryDialogCopyFromItem", "editEntryDateDialogExtractFromTitle", "editEntryDateDialogShift", "editEntryDateDialogSourceFileModifiedDate", @@ -882,7 +1344,8 @@ "durationDialogMinutes", "durationDialogSeconds", "editEntryLocationDialogTitle", - "editEntryLocationDialogChooseOnMapTooltip", + "editEntryLocationDialogSetCustom", + "editEntryLocationDialogChooseOnMap", "editEntryLocationDialogLatitude", "editEntryLocationDialogLongitude", "locationPickerUseThisLocationButton", @@ -1245,7 +1708,11 @@ ], "pt": [ - "durationDialogSeconds" + "editEntryLocationDialogSetCustom" + ], + + "ru": [ + "editEntryLocationDialogSetCustom" ], "tr": [ @@ -1273,6 +1740,7 @@ "widgetOpenPageCollection", "widgetOpenPageViewer", "durationDialogSeconds", + "editEntryLocationDialogSetCustom", "menuActionSlideshow", "viewDialogReverseSortOrder", "tileLayoutMosaic", @@ -1310,7 +1778,6 @@ ], "zh": [ - "widgetOpenPageCollection", - "durationDialogSeconds" + "editEntryLocationDialogSetCustom" ] } From 9fa977a7c1ad6e5976f7883f48a96ef23a46bd67 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Tue, 25 Oct 2022 23:13:58 +0200 Subject: [PATCH 24/53] improved xmp --- .../channel/calls/MetadataFetchHandler.kt | 30 +++++++++++-------- .../viewer/info/metadata/xmp_ns/misc.dart | 2 ++ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt index 0f053d2a4..70cc77434 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt @@ -125,8 +125,8 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { var foundExif = false var foundXmp = false - fun processXmp(xmpMeta: XMPMeta, dirMap: MutableMap<String, String>) { - if (foundXmp) return + fun processXmp(xmpMeta: XMPMeta, dirMap: MutableMap<String, String>, allowMultiple: Boolean = false) { + if (foundXmp && !allowMultiple) return foundXmp = true try { for (prop in xmpMeta) { @@ -340,7 +340,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { } if (dir is XmpDirectory) { - processXmp(dir.xmpMeta, dirMap) + processXmp(dir.xmpMeta, dirMap, allowMultiple = true) } } @@ -492,8 +492,8 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { var foundExif = false var foundXmp = false - fun processXmp(xmpMeta: XMPMeta) { - if (foundXmp) return + fun processXmp(xmpMeta: XMPMeta, allowMultiple: Boolean = false) { + if (foundXmp && !allowMultiple) return foundXmp = true try { if (xmpMeta.doesPropExist(XMP.DC_SUBJECT_PROP_NAME)) { @@ -599,7 +599,9 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { // XMP if (!isLargeMp4(mimeType, sizeBytes)) { - metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach(::processXmp) + metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach { + processXmp(it, allowMultiple = true) + } // XMP fallback to IPTC if (!metadataMap.containsKey(KEY_XMP_TITLE) || !metadataMap.containsKey(KEY_XMP_SUBJECTS)) { @@ -905,8 +907,8 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { val fields: FieldMap = hashMapOf() var foundXmp = false - fun processXmp(xmpMeta: XMPMeta) { - if (foundXmp) return + fun processXmp(xmpMeta: XMPMeta, allowMultiple: Boolean = false) { + if (foundXmp && !allowMultiple) return foundXmp = true try { xmpMeta.getSafeInt(XMP.GPANO_CROPPED_AREA_LEFT_PROP_NAME) { fields["croppedAreaLeft"] = it } @@ -925,7 +927,9 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> val metadata = Helper.safeRead(input) - metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach(::processXmp) + metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach { + processXmp(it, allowMultiple = true) + } } } catch (e: Exception) { Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for mimeType=$mimeType uri=$uri", e) @@ -991,8 +995,8 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { val xmpStrings = mutableListOf<String>() var foundXmp = false - fun processXmp(xmpMeta: XMPMeta) { - if (foundXmp) return + fun processXmp(xmpMeta: XMPMeta, allowMultiple: Boolean = false) { + if (foundXmp && !allowMultiple) return foundXmp = true try { xmpStrings.add(XMPMetaFactory.serializeToString(xmpMeta, xmpSerializeOptions)) @@ -1005,7 +1009,9 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> val metadata = Helper.safeRead(input) - metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach(::processXmp) + metadata.getDirectoriesOfType(XmpDirectory::class.java).map { it.xmpMeta }.forEach { + processXmp(it, allowMultiple = true) + } } } catch (e: Exception) { result.error("getXmp-exception", "failed to read XMP for mimeType=$mimeType uri=$uri", e.message) diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart b/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart index 95e216007..17c31f8a2 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/misc.dart @@ -79,6 +79,8 @@ class XmpPlusNamespace extends XmpNamespace { @override late final List<XmpCardData> cards = [ + XmpCardData(RegExp(nsPrefix + r'CopyrightOwner\[(\d+)\]/(.*)')), + XmpCardData(RegExp(nsPrefix + r'ImageCreator\[(\d+)\]/(.*)')), XmpCardData(RegExp(nsPrefix + r'Licensor\[(\d+)\]/(.*)')), ]; } From 8ed8787c248872e05f6b996f8be33fc80e3aac53 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Wed, 26 Oct 2022 12:11:30 +0200 Subject: [PATCH 25/53] #242 info: edit tags with dynamic placeholders for country / place --- CHANGELOG.md | 1 + lib/l10n/app_en.arb | 4 + lib/model/filters/placeholder.dart | 95 +++++++++++++++++++ .../common/action_mixins/entry_editor.dart | 22 ++++- .../entry_editors/edit_tags_dialog.dart | 81 +++++++++------- untranslated.json | 79 ++++++++++++--- 6 files changed, 232 insertions(+), 50 deletions(-) create mode 100644 lib/model/filters/placeholder.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index b9caf9a0e..44c05057f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Info: edit MP4 metadata (date / location / title / description / rating / tags / rotation) - Info: edit location by copying from other item +- Info: edit tags with dynamic placeholders for country / place - Widget: option to open collection on tap ### Changed diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index b550afe67..47e0028f8 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -868,6 +868,10 @@ "tagEditorPageNewTagFieldLabel": "New tag", "tagEditorPageAddTagTooltip": "Add tag", "tagEditorSectionRecent": "Recent", + "tagEditorSectionPlaceholders": "Placeholders", + + "tagPlaceholderCountry": "Country", + "tagPlaceholderPlace": "Place", "panoramaEnableSensorControl": "Enable sensor control", "panoramaDisableSensorControl": "Disable sensor control", diff --git a/lib/model/filters/placeholder.dart b/lib/model/filters/placeholder.dart new file mode 100644 index 000000000..a53ff307d --- /dev/null +++ b/lib/model/filters/placeholder.dart @@ -0,0 +1,95 @@ +import 'package:aves/model/entry.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +class PlaceholderFilter extends CollectionFilter { + static const type = 'placeholder'; + + static const _country = 'country'; + static const _place = 'place'; + + final String placeholder; + late final IconData _icon; + + static final country = PlaceholderFilter._private(_country); + static final place = PlaceholderFilter._private(_place); + + @override + List<Object?> get props => [placeholder]; + + PlaceholderFilter._private(this.placeholder) : super(reversed: false) { + switch (placeholder) { + case _country: + case _place: + _icon = AIcons.location; + break; + } + } + + factory PlaceholderFilter.fromMap(Map<String, dynamic> json) { + return PlaceholderFilter._private( + json['placeholder'], + ); + } + + @override + Map<String, dynamic> toMap() => { + 'type': type, + 'placeholder': placeholder, + }; + + Future<String?> toTag(AvesEntry entry) async { + switch (placeholder) { + case _country: + case _place: + if (!entry.isCatalogued) { + await entry.catalog(background: false, force: false, persist: true); + } + if (!entry.hasGps) return null; + + if (!entry.hasFineAddress) { + await entry.locate(background: false, force: false, geocoderLocale: settings.appliedLocale); + } + final address = entry.addressDetails; + if (address == null) return null; + + if (placeholder == _country) return address.countryName; + if (placeholder == _place) return address.place; + break; + } + return null; + } + + @override + EntryFilter get positiveTest => (entry) => throw Exception('this is not a test'); + + @override + bool get exclusiveProp => false; + + @override + String get universalLabel => placeholder; + + @override + String getLabel(BuildContext context) { + switch (placeholder) { + case _country: + return context.l10n.tagPlaceholderCountry; + case _place: + return context.l10n.tagPlaceholderPlace; + default: + return placeholder; + } + } + + @override + Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(_icon, size: size); + + @override + String get category => type; + + @override + String get key => '$type-$placeholder'; +} diff --git a/lib/widgets/common/action_mixins/entry_editor.dart b/lib/widgets/common/action_mixins/entry_editor.dart index 612b0cacf..ec36e7f91 100644 --- a/lib/widgets/common/action_mixins/entry_editor.dart +++ b/lib/widgets/common/action_mixins/entry_editor.dart @@ -1,5 +1,8 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_metadata_edition.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/placeholder.dart'; +import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/metadata/date_modifier.dart'; import 'package:aves/model/metadata/enums/enums.dart'; import 'package:aves/model/source/collection_lens.dart'; @@ -74,17 +77,32 @@ mixin EntryEditorMixin { Future<Map<AvesEntry, Set<String>>?> selectTags(BuildContext context, Set<AvesEntry> entries) async { if (entries.isEmpty) return null; - final tagsByEntry = Map.fromEntries(entries.map((v) => MapEntry(v, v.tags.toSet()))); + final filtersByEntry = Map.fromEntries(entries.map((v) { + // use `<CollectionFilter>{...}` instead of `toSet()` to circumvent an implicit typing issue, as of Dart v2.18.2 + final filters = <CollectionFilter>{...v.tags.map(TagFilter.new)}; + return MapEntry(v, filters); + })); await Navigator.push( context, MaterialPageRoute( settings: const RouteSettings(name: TagEditorPage.routeName), builder: (context) => TagEditorPage( - tagsByEntry: tagsByEntry, + filtersByEntry: filtersByEntry, ), ), ); + final tagsByEntry = <AvesEntry, Set<String>>{}; + await Future.forEach(filtersByEntry.entries, (kv) async { + final entry = kv.key; + final filters = kv.value; + final tags = filters.whereType<TagFilter>().map((v) => v.tag).toSet(); + tagsByEntry[entry] = tags; + + final placeholderTags = await Future.wait(filters.whereType<PlaceholderFilter>().map((v) => v.toTag(entry))); + tags.addAll(placeholderTags.whereNotNull().where((v) => v.isNotEmpty)); + }); + return tagsByEntry; } diff --git a/lib/widgets/dialogs/entry_editors/edit_tags_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_tags_dialog.dart index 7ce92e34c..6f91fadf4 100644 --- a/lib/widgets/dialogs/entry_editors/edit_tags_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_tags_dialog.dart @@ -1,6 +1,8 @@ import 'dart:math'; import 'package:aves/model/entry.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/filters/placeholder.dart'; import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/theme/durations.dart'; @@ -9,18 +11,17 @@ import 'package:aves/widgets/common/expandable_filter_row.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; -import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class TagEditorPage extends StatefulWidget { static const routeName = '/info/tag_editor'; - final Map<AvesEntry, Set<String>> tagsByEntry; + final Map<AvesEntry, Set<CollectionFilter>> filtersByEntry; const TagEditorPage({ super.key, - required this.tagsByEntry, + required this.filtersByEntry, }); @override @@ -31,14 +32,15 @@ class _TagEditorPageState extends State<TagEditorPage> { final TextEditingController _newTagTextController = TextEditingController(); final FocusNode _newTagTextFocusNode = FocusNode(); final ValueNotifier<String?> _expandedSectionNotifier = ValueNotifier(null); - late final List<String> _topTags; + late final List<CollectionFilter> _topTags; + late final List<PlaceholderFilter> _placeholders = [PlaceholderFilter.country, PlaceholderFilter.place]; - static final List<String> _recentTags = []; + static final List<CollectionFilter> _recentTags = []; static const Color untaggedColor = Colors.blueGrey; static const int tagHistoryCount = 10; - Map<AvesEntry, Set<String>> get tagsByEntry => widget.tagsByEntry; + Map<AvesEntry, Set<CollectionFilter>> get tagsByEntry => widget.filtersByEntry; @override void initState() { @@ -50,11 +52,11 @@ class _TagEditorPageState extends State<TagEditorPage> { Widget build(BuildContext context) { final l10n = context.l10n; final showCount = tagsByEntry.length > 1; - final Map<String, int> entryCountByTag = {}; + final Map<CollectionFilter, int> entryCountByTag = {}; tagsByEntry.entries.forEach((kv) { kv.value.forEach((tag) => entryCountByTag[tag] = (entryCountByTag[tag] ?? 0) + 1); }); - List<MapEntry<String, int>> sortedTags = _sortEntryCountByTag(entryCountByTag); + List<MapEntry<CollectionFilter, int>> sortedTags = _sortEntryCountByTag(entryCountByTag); return MediaQueryDataProvider( child: Scaffold( @@ -76,9 +78,10 @@ class _TagEditorPageState extends State<TagEditorPage> { valueListenable: _newTagTextController, builder: (context, value, child) { final upQuery = value.text.trim().toUpperCase(); - bool containQuery(String s) => s.toUpperCase().contains(upQuery); - final recentFilters = _recentTags.where(containQuery).map(TagFilter.new).toList(); - final topTagFilters = _topTags.where(containQuery).map(TagFilter.new).toList(); + bool containQuery(CollectionFilter v) => v.getLabel(context).toUpperCase().contains(upQuery); + final recentFilters = _recentTags.where(containQuery).toList(); + final topTagFilters = _topTags.where(containQuery).toList(); + final placeholderFilters = _placeholders.where(containQuery).toList(); return ListView( children: [ Padding( @@ -95,7 +98,7 @@ class _TagEditorPageState extends State<TagEditorPage> { ), autofocus: true, onSubmitted: (newTag) { - _addTag(newTag); + _addCustomTag(newTag); _newTagTextFocusNode.requestFocus(); }, ), @@ -105,7 +108,7 @@ class _TagEditorPageState extends State<TagEditorPage> { builder: (context, value, child) { return IconButton( icon: const Icon(AIcons.add), - onPressed: value.text.isEmpty ? null : () => _addTag(_newTagTextController.text), + onPressed: value.text.isEmpty ? null : () => _addCustomTag(_newTagTextController.text), tooltip: l10n.tagEditorPageAddTagTooltip, ); }, @@ -138,13 +141,12 @@ class _TagEditorPageState extends State<TagEditorPage> { spacing: 8, runSpacing: 8, children: sortedTags.map((kv) { - final tag = kv.key; return AvesFilterChip( - filter: TagFilter(tag), + filter: kv.key, removable: true, showGenericIcon: false, leadingOverride: showCount ? _TagCount(count: kv.value) : null, - onTap: (filter) => _removeTag(tag), + onTap: _removeTag, onLongPress: null, ); }).toList(), @@ -167,6 +169,12 @@ class _TagEditorPageState extends State<TagEditorPage> { expandedNotifier: _expandedSectionNotifier, onTap: _addTag, ), + _FilterRow( + title: l10n.tagEditorSectionPlaceholders, + filters: placeholderFilters, + expandedNotifier: _expandedSectionNotifier, + onTap: _addTag, + ), ], ); }, @@ -184,49 +192,54 @@ class _TagEditorPageState extends State<TagEditorPage> { visibleEntries?.forEach((entry) { entry.tags.forEach((tag) => entryCountByTag[tag] = (entryCountByTag[tag] ?? 0) + 1); }); - List<MapEntry<String, int>> sortedTopTags = _sortEntryCountByTag(entryCountByTag); + List<MapEntry<CollectionFilter, int>> sortedTopTags = _sortEntryCountByTag(entryCountByTag.map((key, value) => MapEntry(TagFilter(key), value))); _topTags = sortedTopTags.map((kv) => kv.key).toList(); } - List<MapEntry<String, int>> _sortEntryCountByTag(Map<String, int> entryCountByTag) { + List<MapEntry<CollectionFilter, int>> _sortEntryCountByTag(Map<CollectionFilter, int> entryCountByTag) { return entryCountByTag.entries.toList() ..sort((kv1, kv2) { final c = kv2.value.compareTo(kv1.value); - return c != 0 ? c : compareAsciiUpperCaseNatural(kv1.key, kv2.key); + return c != 0 ? c : kv1.key.compareTo(kv2.key); }); } void _reset() { setState(() => tagsByEntry.forEach((entry, tags) { + final Set<TagFilter> originalFilters = entry.tags.map(TagFilter.new).toSet(); tags ..clear() - ..addAll(entry.tags); + ..addAll(originalFilters); })); } - void _addTag(String newTag) { + void _addCustomTag(String newTag) { if (newTag.isNotEmpty) { - setState(() { - _recentTags - ..remove(newTag) - ..insert(0, newTag) - ..removeRange(min(tagHistoryCount, _recentTags.length), _recentTags.length); - tagsByEntry.forEach((entry, tags) => tags.add(newTag)); - }); - _newTagTextController.clear(); + _addTag(TagFilter(newTag)); } } - void _removeTag(String tag) { - setState(() => tagsByEntry.forEach((entry, tags) => tags.remove(tag))); + void _addTag(CollectionFilter newTag) { + setState(() { + _recentTags + ..remove(newTag) + ..insert(0, newTag) + ..removeRange(min(tagHistoryCount, _recentTags.length), _recentTags.length); + tagsByEntry.forEach((entry, tags) => tags.add(newTag)); + }); + _newTagTextController.clear(); + } + + void _removeTag(CollectionFilter filter) { + setState(() => tagsByEntry.forEach((entry, filters) => filters.remove(filter))); } } class _FilterRow extends StatelessWidget { final String title; - final List<TagFilter> filters; + final List<CollectionFilter> filters; final ValueNotifier<String?> expandedNotifier; - final void Function(String tag) onTap; + final void Function(CollectionFilter filter) onTap; const _FilterRow({ required this.title, @@ -244,7 +257,7 @@ class _FilterRow extends StatelessWidget { filters: filters, expandedNotifier: expandedNotifier, showGenericIcon: false, - onTap: (filter) => onTap((filter as TagFilter).tag), + onTap: onTap, onLongPress: null, ); } diff --git a/untranslated.json b/untranslated.json index e00e4cc87..1e893420e 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,17 +1,26 @@ { "de": [ - "editEntryLocationDialogSetCustom" + "editEntryLocationDialogSetCustom", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "el": [ - "editEntryLocationDialogSetCustom" + "editEntryLocationDialogSetCustom", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "es": [ "widgetOpenPageHome", "widgetOpenPageCollection", "widgetOpenPageViewer", - "editEntryLocationDialogSetCustom" + "editEntryLocationDialogSetCustom", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "fa": [ @@ -582,6 +591,9 @@ "tagEditorPageNewTagFieldLabel", "tagEditorPageAddTagTooltip", "tagEditorSectionRecent", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace", "panoramaEnableSensorControl", "panoramaDisableSensorControl", "sourceViewerPageTitle", @@ -593,7 +605,10 @@ ], "fr": [ - "editEntryLocationDialogSetCustom" + "editEntryLocationDialogSetCustom", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "gl": [ @@ -1031,6 +1046,9 @@ "tagEditorPageNewTagFieldLabel", "tagEditorPageAddTagTooltip", "tagEditorSectionRecent", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace", "panoramaEnableSensorControl", "panoramaDisableSensorControl", "sourceViewerPageTitle", @@ -1057,11 +1075,17 @@ "settingsSlideshowAnimatedZoomEffect", "settingsWidgetOpenPage", "statsTopAlbumsSectionTitle", - "wallpaperUseScrollEffect" + "wallpaperUseScrollEffect", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "it": [ - "editEntryLocationDialogSetCustom" + "editEntryLocationDialogSetCustom", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "ja": [ @@ -1097,11 +1121,17 @@ "settingsWidgetOpenPage", "statsTopAlbumsSectionTitle", "viewerInfoLabelDescription", - "wallpaperUseScrollEffect" + "wallpaperUseScrollEffect", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "ko": [ - "editEntryLocationDialogSetCustom" + "editEntryLocationDialogSetCustom", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "nb": [ @@ -1210,7 +1240,10 @@ "mapEmptyRegion", "viewerInfoOpenEmbeddedFailureFeedback", "viewerInfoSearchEmpty", - "wallpaperUseScrollEffect" + "wallpaperUseScrollEffect", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "nl": [ @@ -1219,7 +1252,10 @@ "durationDialogSeconds", "editEntryLocationDialogSetCustom", "aboutLinkPolicy", - "policyPageTitle" + "policyPageTitle", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "pl": [ @@ -1697,6 +1733,9 @@ "tagEditorPageNewTagFieldLabel", "tagEditorPageAddTagTooltip", "tagEditorSectionRecent", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace", "panoramaEnableSensorControl", "panoramaDisableSensorControl", "sourceViewerPageTitle", @@ -1708,11 +1747,17 @@ ], "pt": [ - "editEntryLocationDialogSetCustom" + "editEntryLocationDialogSetCustom", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "ru": [ - "editEntryLocationDialogSetCustom" + "editEntryLocationDialogSetCustom", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "tr": [ @@ -1774,10 +1819,16 @@ "statsTopAlbumsSectionTitle", "viewerSetWallpaperButtonLabel", "viewerInfoLabelDescription", - "wallpaperUseScrollEffect" + "wallpaperUseScrollEffect", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ], "zh": [ - "editEntryLocationDialogSetCustom" + "editEntryLocationDialogSetCustom", + "tagEditorSectionPlaceholders", + "tagPlaceholderCountry", + "tagPlaceholderPlace" ] } From de7c8c47d0b841bb748c4c1f2eea1d1b52298f6b Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Fri, 4 Nov 2022 18:10:58 +0100 Subject: [PATCH 26/53] upgraded Flutter to stable v3.3.7 --- .github/workflows/check.yml | 2 +- .github/workflows/release.yml | 10 +++++----- CHANGELOG.md | 2 +- android/app/build.gradle | 2 +- pubspec.lock | 36 +++++++++++++++++------------------ shaders_3.3.5.sksl.json | 1 - shaders_3.3.7.sksl.json | 1 + 7 files changed, 27 insertions(+), 27 deletions(-) delete mode 100644 shaders_3.3.5.sksl.json create mode 100644 shaders_3.3.7.sksl.json diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 9db2bb842..4ce7f7c64 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -17,7 +17,7 @@ jobs: # Available versions may lag behind https://github.com/flutter/flutter.git - uses: subosito/flutter-action@v2 with: - flutter-version: '3.3.5' + flutter-version: '3.3.7' channel: 'stable' - name: Clone the repository. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 89be3e49e..550aaea91 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: # Available versions may lag behind https://github.com/flutter/flutter.git - uses: subosito/flutter-action@v2 with: - flutter-version: '3.3.5' + flutter-version: '3.3.7' channel: 'stable' # Workaround for this Android Gradle Plugin issue (supposedly fixed in AGP 4.1): @@ -56,15 +56,15 @@ jobs: rm release.keystore.asc mkdir outputs (cd scripts/; ./apply_flavor_play.sh) - flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.5.sksl.json + flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.7.sksl.json cp build/app/outputs/bundle/playRelease/*.aab outputs - flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.5.sksl.json + flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.7.sksl.json cp build/app/outputs/apk/play/release/*.apk outputs (cd scripts/; ./apply_flavor_huawei.sh) - flutter build apk -t lib/main_huawei.dart --flavor huawei --bundle-sksl-path shaders_3.3.5.sksl.json + flutter build apk -t lib/main_huawei.dart --flavor huawei --bundle-sksl-path shaders_3.3.7.sksl.json cp build/app/outputs/apk/huawei/release/*.apk outputs (cd scripts/; ./apply_flavor_izzy.sh) - flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_3.3.5.sksl.json + flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_3.3.7.sksl.json cp build/app/outputs/apk/izzy/release/*.apk outputs rm $AVES_STORE_FILE env: diff --git a/CHANGELOG.md b/CHANGELOG.md index 44c05057f..18a83f755 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ All notable changes to this project will be documented in this file. ### Changed -- upgraded Flutter to stable v3.3.5 +- upgraded Flutter to stable v3.3.7 ### Fixed diff --git a/android/app/build.gradle b/android/app/build.gradle index 3bfc8dff9..2a01cf432 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -167,7 +167,7 @@ dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' implementation 'androidx.core:core-ktx:1.9.0' - implementation 'androidx.exifinterface:exifinterface:1.3.4' + implementation 'androidx.exifinterface:exifinterface:1.3.5' implementation 'androidx.multidex:multidex:2.0.1' implementation 'com.caverock:androidsvg-aar:1.4' diff --git a/pubspec.lock b/pubspec.lock index c5bc51a83..82e3ee82f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,7 +14,7 @@ packages: name: _flutterfire_internals url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.0.7" analyzer: dependency: transitive description: @@ -126,14 +126,14 @@ packages: name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "5.8.2" + version: "5.8.4" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.0.4" collection: dependency: "direct main" description: @@ -210,14 +210,14 @@ packages: name: device_info_plus url: "https://pub.dartlang.org" source: hosted - version: "7.0.1" + version: "8.0.0" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "6.0.1" + version: "7.0.0" dynamic_color: dependency: "direct main" description: @@ -284,35 +284,35 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.5.1" + version: "4.5.2" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.1" firebase_crashlytics: dependency: transitive description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.0.4" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.3.3" + version: "3.3.5" flex_color_picker: dependency: "direct main" description: @@ -390,7 +390,7 @@ packages: name: flutter_markdown url: "https://pub.dartlang.org" source: hosted - version: "0.6.12" + version: "0.6.13" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -461,7 +461,7 @@ packages: name: google_maps_flutter_android url: "https://pub.dartlang.org" source: hosted - version: "2.3.2" + version: "2.3.3" google_maps_flutter_ios: dependency: transitive description: @@ -773,7 +773,7 @@ packages: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "5.1.0" platform: dependency: transitive description: @@ -976,7 +976,7 @@ packages: name: shelf_web_socket url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.0.3" sky_engine: dependency: transitive description: flutter @@ -1016,14 +1016,14 @@ packages: name: sqflite url: "https://pub.dartlang.org" source: hosted - version: "2.1.0+1" + version: "2.2.0+3" sqflite_common: dependency: transitive description: name: sqflite_common url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.4.0+2" stack_trace: dependency: transitive description: @@ -1044,7 +1044,7 @@ packages: name: stream_transform url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.0" streams_channel: dependency: "direct main" description: @@ -1144,7 +1144,7 @@ packages: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.19" + version: "6.0.21" url_launcher_ios: dependency: transitive description: diff --git a/shaders_3.3.5.sksl.json b/shaders_3.3.5.sksl.json deleted file mode 100644 index 569bad1a7..000000000 --- a/shaders_3.3.5.sksl.json +++ /dev/null @@ -1 +0,0 @@ -{"platform":"android","name":"SM G970N","engineRevision":"3ad69d7be3a7231aab5525db322fc699f098315f","data":{"HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGACQAGAAAAAQAAAAAAAQQGAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAACEA2X4PLOGEAAAAAAAAACAAAAAVQQAAQAAAAAQCDIBCAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAIAAEAAAABJYQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IGNsYW1wKHN1YnNldENvb3JkLngsIHVjbGFtcF9TMV9jMF9jMF9jMC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueik7CgljbGFtcGVkQ29vcmQueSA9IHN1YnNldENvb3JkLnk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAB3QA6AAAEAAAAAAAMAAPEAEAAABAAAAAAB2AAAAAAACAAAAAEBSAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAA2BQAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzI7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MyOwppbiBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglhbHBoYSA9IDEuMCAtIGFscGhhOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CmhhbGY0IENpcmN1bGFyUlJlY3RfUzIoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MyLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MyLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzIueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCWhhbGY0IG91dHB1dF9TMjsKCW91dHB1dF9TMiA9IENpcmN1bGFyUlJlY3RfUzIob3V0cHV0X1MxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMjsKCX0KfQoAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAKPABAAAAAAB2AAAAAAACAAAAAEBSAAAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAACzBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBmbG9hdDIgdWludlJhZGlpWFlfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBFbGxpcHRpY2FsUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CglmbG9hdDIgWiA9IGR4eSAqIHVpbnZSYWRpaVhZX1MxLnh5OwoJaGFsZiBpbXBsaWNpdCA9IGhhbGYoZG90KFosIGR4eSkgLSAxLjApOwoJaGFsZiBncmFkX2RvdCA9IGhhbGYoNC4wICogZG90KFosIFopKTsKCWdyYWRfZG90ID0gbWF4KGdyYWRfZG90LCAxLjBlLTQpOwoJaGFsZiBhcHByb3hfZGlzdCA9IGltcGxpY2l0ICogaGFsZihpbnZlcnNlc3FydChncmFkX2RvdCkpOwoJaGFsZiBhbHBoYSA9IGNsYW1wKDAuNSArIGFwcHJveF9kaXN0LCAwLjAsIDEuMCk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEVsbGlwdGljYWxSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","DASAAAAAQAAWAABAYAAQBYH7777Z6QQBAEAAAAAAEAAAAAAAEBSAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABZQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEADZABYAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAADsAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIAHSADQAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAABAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAIAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CQAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAACRAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0IHZjb3ZlcmFnZV9TMDsKZmxhdCBpbiBmbG9hdDQgdmdlb21TdWJzZXRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAAEAQCAAAAAVREEAQAAAAAQCDAAQQGAABAEAAAAAAH4AQAAAAAEAAAAAQGIAAAAAAA":"CQAAAExTS1PfAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMCkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAEAFAAAjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfZnJhbWVidWZmZXJfZmV0Y2g6IHJlcXVpcmUKdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cmlub3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMF9jMC54eSwgdWNsYW1wX1MxX2MwX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKF9pbnB1dCk7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBNYXRyaXhFZmZlY3RfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYgU2hhZGVyCgkJaGFsZjQgX2RzdENvbG9yID0gc2tfRnJhZ0NvbG9yOwoJCXNrX0ZyYWdDb2xvciA9IGJsZW5kX3NyYyhvdXRwdXRfUzEsIF9kc3RDb2xvcik7CgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q292ZXJhZ2VfUzAgKiBza19GcmFnQ29sb3IgKyAoaGFsZjQoMS4wKSAtIG91dHB1dENvdmVyYWdlX1MwKSAqIF9kc3RDb2xvcjsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAFBQATAAAAAAFAAMAAAABAAAAAAABBAMAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAABYBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBmbG9hdDIgdWludlJhZGlpWFlfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgRWxsaXB0aWNhbFJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJZmxvYXQyIFogPSBkeHkgKiB1aW52UmFkaWlYWV9TMS54eTsKCWhhbGYgaW1wbGljaXQgPSBoYWxmKGRvdChaLCBkeHkpIC0gMS4wKTsKCWhhbGYgZ3JhZF9kb3QgPSBoYWxmKDQuMCAqIGRvdChaLCBaKSk7CglncmFkX2RvdCA9IG1heChncmFkX2RvdCwgMS4wZS00KTsKCWhhbGYgYXBwcm94X2Rpc3QgPSBpbXBsaWNpdCAqIGhhbGYoaW52ZXJzZXNxcnQoZ3JhZF9kb3QpKTsKCWhhbGYgYWxwaGEgPSBjbGFtcCgwLjUgKyBhcHByb3hfZGlzdCwgMC4wLCAxLjApOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gRWxsaXB0aWNhbFJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAAAQAAAAGQCBAMQACAAAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzAueCwgdWNsYW1wX1MxX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIBSQB5VRECGAEAAAMAAAAAAAAAAACAA4AAAACAAAAAAACCAYAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIBAIAAAABLCIIBAAAAABAEGABBAMAACAIAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADhAwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CglyZXR1cm4gYmxlbmRfbW9kdWxhdGUoTWF0cml4RWZmZWN0X1MxX2MwKF9zcmMpLCBfc3JjKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEJsZW5kX1MxKG91dHB1dENvbG9yX1MwLCBoYWxmNCgxKSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAAAAIAAAABLAIABAAAAABAEGABBAMAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADOAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAEAQAAAAGQCBAMQACAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","B2ABSAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAABAEAAAABJYQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IHN1YnNldENvb3JkLng7CgljbGFtcGVkQ29vcmQueSA9IGNsYW1wKHN1YnNldENvb3JkLnksIHVjbGFtcF9TMV9jMF9jMF9jMC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAudyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAEQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAAAgBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdCB2Y292ZXJhZ2VfUzA7CmZsYXQgaW4gZmxvYXQ0IHZnZW9tU3Vic2V0X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","HTQAAGAABBYAAAEIXBAAAGEAMAAAAAAAAAAAAAAAQAHAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IACgAAAGluUXVhZEVkZ2UAAAEAAAAAAAAA","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMADSAB4QAAAAAEAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CQAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAAB3AwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAAKAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","AYTRVAADQAAAOAEARAFQJAABBADAAAILBYAACCYUQD777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlCwAAAGluQ2xpcFBsYW5lAAwAAABpbklzZWN0UGxhbmUBAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAuAIAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","AYAA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CQAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgxKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMABAAOAAAABAAAAAAABBAMAAA":"CQAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGAARAGQWMHGBRIAAAAABQAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADBAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAEwMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdCBkeDAgPSB1aW5uZXJSZWN0X1MxLkwgLSBza19GcmFnQ29vcmQueDsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgoZmxvYXQyKG1heChkeDAsIGR4eTEueCksIGR4eTEueSksIDAuMCk7CgloYWxmIHRvcEFscGhhID0gaGFsZihzYXR1cmF0ZShza19GcmFnQ29vcmQueSAtIHVpbm5lclJlY3RfUzEuVCkpOwoJaGFsZiBhbHBoYSA9IHRvcEFscGhhICogaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","B2AAQAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAoAAABpbkNvdmVyYWdlAAABAAAAAAAAAA==","BYIBQAAABQAAIAABBYAAAEIXBAAP777777777777AAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQAAEAQAAAAGQCBAMQAAAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzAueSwgdWNsYW1wX1MxX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQJAAAAAAABAEAAAABJSQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEwXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IHN1YnNldENvb3JkLng7CgljbGFtcGVkQ29vcmQueSA9IGNsYW1wKHN1YnNldENvb3JkLnksIHVjbGFtcF9TMV9jMF9jMF9jMC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAudyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEwOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAIAAQAAAAAQGIA":"CQAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAMAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBDbGFtcGVkR3JhZGllbnRfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSAoaGFsZjQoMS4wKSAtIG91dHB1dF9TMSkgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAAA5AAAAAAABAAAAACAZAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgAAAABdAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAAAAEAAAABJYQAAAAAAAAIAAAAAWCBAAAABAAAAANAECAZAAAAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAAgFAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdUluY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmMiB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFsxM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgX2Nvb3Jkcyk7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChfaW5wdXQsIGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzApICogX2Nvb3Jkcy54eTEpOwp9CmhhbGY0IFNtb290aF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBjb29yZCwgaGFsZjIgb2Zmc2V0QW5kS2VybmVsKSAKewoJcmV0dXJuIE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChjb29yZCArIG9mZnNldEFuZEtlcm5lbC54ICogdUluY3JlbWVudF9TMV9jMCkpICogb2Zmc2V0QW5kS2VybmVsLnk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBjb2xvciA9IGhhbGY0KDApOwoJZmxvYXQyIGNvb3JkID0gdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cglmb3IgKGludCBpPTA7IGk8MTM7ICsraSkgCgl7CgkJY29sb3IgKz0gU21vb3RoX1MxX2MwKF9pbnB1dCwgY29vcmQsIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwW2ldKTsKCX0KCXJldHVybiBjb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","EABQAAAAAEAAAAAQAABQAAIOAAABCFYIAAKAUDAAAAAAAAABAAAAAAAAAAANAAIAAAABAAAAACAJAAIAAAAA":"CQAAAExTS1OhAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgZmxvYXQyIHZJbnRUZXh0dXJlQ29vcmRzX1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIERpc3RhbmNlRmllbGRQYXRoCglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJdkludFRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkczsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8yX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGZsb2F0MiB2SW50VGV4dHVyZUNvb3Jkc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBEaXN0YW5jZUZpZWxkUGF0aAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQyIHV2ID0gdlRleHR1cmVDb29yZHNfUzA7CgloYWxmNCB0ZXhDb2xvcjsKCXsKCQl0ZXhDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLnJycnI7Cgl9CgloYWxmIGRpc3RhbmNlID0gNy45Njg3NSoodGV4Q29sb3IuciAtIDAuNTAxOTYwNzg0MzEpOwoJaGFsZiBhZndpZHRoOwoJYWZ3aWR0aCA9IGFicygwLjY1KmhhbGYoZEZkeCh2SW50VGV4dHVyZUNvb3Jkc19TMC54KSkpOwoJaGFsZiB2YWwgPSBzbW9vdGhzdGVwKC1hZndpZHRoLCBhZndpZHRoLCBkaXN0YW5jZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KHZhbCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAZCBRE4GNEACAAAOAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAAAHBQAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY2xlX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZiBkOwoJaWYgKGludCgzKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWQgPSBoYWxmKChsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSAtIDEuMCkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJZWxzZSAKCXsKCQlkID0gaGFsZigoMS4wIC0gbGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykpICogdWNpcmNsZV9TMS56KTsKCX0KCWlmIChpbnQoMykgPT0ga0ZpbGxBQV9TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCXJldHVybiBoYWxmNChfaW5wdXQgKiBzYXR1cmF0ZShkKSk7Cgl9CgllbHNlIAoJewoJCXJldHVybiBoYWxmNChkID4gMC41ID8gX2lucHV0IDogaGFsZjQoMC4wKSk7Cgl9Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZV9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQJAAAAAAIAAEAAAABJSQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEwXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IGNsYW1wKHN1YnNldENvb3JkLngsIHVjbGFtcF9TMV9jMF9jMF9jMC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueik7CgljbGFtcGVkQ29vcmQueSA9IHN1YnNldENvb3JkLnk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEwOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","GEMAAAYAAEHAAAARC4EAAAQWBQAAAAAAAAAQAAAAIBCAAAGQAEAAAAAQAAAABAEQAEAAAAA":"CQAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAOAAAAaW5TaGFkb3dQYXJhbXMAAAEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAGIBIAAABAAAAANAEAAAAAAAAAAAAAABAAOAAAABAAAAAAABBAMAAAAA":"CQAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAAKAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA="}} \ No newline at end of file diff --git a/shaders_3.3.7.sksl.json b/shaders_3.3.7.sksl.json new file mode 100644 index 000000000..d9cbb4eed --- /dev/null +++ b/shaders_3.3.7.sksl.json @@ -0,0 +1 @@ +{"platform":"android","name":"SM G970N","engineRevision":"857bd6b74c5eb56151bfafe91e7fa6a82b6fee25","data":{"HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGAARAGQWMHGBRIAAAAABQAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAB3QA6AAAEAAAAAAAMAAPEAEAAABAAAAAAB2AAAAAAACAAAAAEBSAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAA2BQAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzI7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MyOwppbiBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglhbHBoYSA9IDEuMCAtIGFscGhhOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CmhhbGY0IENpcmN1bGFyUlJlY3RfUzIoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MyLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MyLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzIueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCWhhbGY0IG91dHB1dF9TMjsKCW91dHB1dF9TMiA9IENpcmN1bGFyUlJlY3RfUzIob3V0cHV0X1MxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMjsKCX0KfQoAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAACEA2X4PLOGEAAAAAAAAACAAAAAVQQAAQAAAAAQCDIBCAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAEQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIAHSADQAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","B2ABSAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAKPABAAAAAAB2AAAAAAACAAAAAEBSAAAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAACzBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBmbG9hdDIgdWludlJhZGlpWFlfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBFbGxpcHRpY2FsUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CglmbG9hdDIgWiA9IGR4eSAqIHVpbnZSYWRpaVhZX1MxLnh5OwoJaGFsZiBpbXBsaWNpdCA9IGhhbGYoZG90KFosIGR4eSkgLSAxLjApOwoJaGFsZiBncmFkX2RvdCA9IGhhbGYoNC4wICogZG90KFosIFopKTsKCWdyYWRfZG90ID0gbWF4KGdyYWRfZG90LCAxLjBlLTQpOwoJaGFsZiBhcHByb3hfZGlzdCA9IGltcGxpY2l0ICogaGFsZihpbnZlcnNlc3FydChncmFkX2RvdCkpOwoJaGFsZiBhbHBoYSA9IGNsYW1wKDAuNSArIGFwcHJveF9kaXN0LCAwLjAsIDEuMCk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEVsbGlwdGljYWxSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAAAgBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdCB2Y292ZXJhZ2VfUzA7CmZsYXQgaW4gZmxvYXQ0IHZnZW9tU3Vic2V0X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAZCBRE4GNEACAAAOAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAAAHBQAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY2xlX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZiBkOwoJaWYgKGludCgzKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWQgPSBoYWxmKChsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSAtIDEuMCkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJZWxzZSAKCXsKCQlkID0gaGFsZigoMS4wIC0gbGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykpICogdWNpcmNsZV9TMS56KTsKCX0KCWlmIChpbnQoMykgPT0ga0ZpbGxBQV9TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCXJldHVybiBoYWxmNChfaW5wdXQgKiBzYXR1cmF0ZShkKSk7Cgl9CgllbHNlIAoJewoJCXJldHVybiBoYWxmNChkID4gMC41ID8gX2lucHV0IDogaGFsZjQoMC4wKSk7Cgl9Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZV9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAGIBIAAABAAAAANAEAAAAAAAAAAAAAABAAOAAAABAAAAAAABBAMAAAAA":"CQAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAAKAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIBAIAAAABLCIIBAAAAABAEGABBAMAACAIAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADhAwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CglyZXR1cm4gYmxlbmRfbW9kdWxhdGUoTWF0cml4RWZmZWN0X1MxX2MwKF9zcmMpLCBfc3JjKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEJsZW5kX1MxKG91dHB1dENvbG9yX1MwLCBoYWxmNCgxKSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAIAAEAAAABJYQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IGNsYW1wKHN1YnNldENvb3JkLngsIHVjbGFtcF9TMV9jMF9jMF9jMC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueik7CgljbGFtcGVkQ29vcmQueSA9IHN1YnNldENvb3JkLnk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAIAAQAAAAAQGIA":"CQAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAMAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBDbGFtcGVkR3JhZGllbnRfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSAoaGFsZjQoMS4wKSAtIG91dHB1dF9TMSkgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMABAAOAAAABAAAAAAABBAMAAA":"CQAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAACRAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0IHZjb3ZlcmFnZV9TMDsKZmxhdCBpbiBmbG9hdDQgdmdlb21TdWJzZXRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","AYTRVAADQAAAOAEARAFQJAABBADAAAILBYAACCYUQD777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlCwAAAGluQ2xpcFBsYW5lAAwAAABpbklzZWN0UGxhbmUBAAAAAAAAAA==","HTQAAGAABBYAAAEIXBAAAGEAMAAAAAAAAAAAAAAAQAHAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IACgAAAGluUXVhZEVkZ2UAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABZQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIBSQB5VRECGAEAAAMAAAAAAAAAAACAA4AAAACAAAAAAACCAYAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAABAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAIAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CQAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","B2AAQAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAoAAABpbkNvdmVyYWdlAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAEAQAAAAGQCBAMQACAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQAAEAQAAAAGQCBAMQAAAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzAueSwgdWNsYW1wX1MxX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAAEAQCAAAAAVREEAQAAAAAQCDAAQQGAABAEAAAAAAH4AQAAAAAEAAAAAQGIAAAAAAA":"CQAAAExTS1PfAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMCkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAEAFAAAjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfZnJhbWVidWZmZXJfZmV0Y2g6IHJlcXVpcmUKdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cmlub3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMF9jMC54eSwgdWNsYW1wX1MxX2MwX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKF9pbnB1dCk7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBNYXRyaXhFZmZlY3RfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYgU2hhZGVyCgkJaGFsZjQgX2RzdENvbG9yID0gc2tfRnJhZ0NvbG9yOwoJCXNrX0ZyYWdDb2xvciA9IGJsZW5kX3NyYyhvdXRwdXRfUzEsIF9kc3RDb2xvcik7CgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q292ZXJhZ2VfUzAgKiBza19GcmFnQ29sb3IgKyAoaGFsZjQoMS4wKSAtIG91dHB1dENvdmVyYWdlX1MwKSAqIF9kc3RDb2xvcjsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMADSAB4QAAAAAEAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CQAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAAB3AwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAAKAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","BYIBQAAABQAAIAABBYAAAEIXBAAP777777777777AAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAAAAIAAAABLAIABAAAAABAEGABBAMAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADOAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DASAAAAAQAAWAABAYAAQBYH7777Z6QQBAEAAAAAAEAAAAAAAEBSAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","EABQAAAAAEAAAAAQAABQAAIOAAABCFYIAAKAUDAAAAAAAAABAAAAAAAAAAANAAIAAAABAAAAACAJAAIAAAAA":"CQAAAExTS1OhAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgZmxvYXQyIHZJbnRUZXh0dXJlQ29vcmRzX1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIERpc3RhbmNlRmllbGRQYXRoCglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJdkludFRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkczsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8yX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGZsb2F0MiB2SW50VGV4dHVyZUNvb3Jkc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBEaXN0YW5jZUZpZWxkUGF0aAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQyIHV2ID0gdlRleHR1cmVDb29yZHNfUzA7CgloYWxmNCB0ZXhDb2xvcjsKCXsKCQl0ZXhDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLnJycnI7Cgl9CgloYWxmIGRpc3RhbmNlID0gNy45Njg3NSoodGV4Q29sb3IuciAtIDAuNTAxOTYwNzg0MzEpOwoJaGFsZiBhZndpZHRoOwoJYWZ3aWR0aCA9IGFicygwLjY1KmhhbGYoZEZkeCh2SW50VGV4dHVyZUNvb3Jkc19TMC54KSkpOwoJaGFsZiB2YWwgPSBzbW9vdGhzdGVwKC1hZndpZHRoLCBhZndpZHRoLCBkaXN0YW5jZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KHZhbCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGACQAGAAAAAQAAAAAAAQQGAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","GEMAAAYAAEHAAAARC4EAAAQWBQAAAAAAAAAQAAAAIBCAAAGQAEAAAAAQAAAABAEQAEAAAAA":"CQAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAOAAAAaW5TaGFkb3dQYXJhbXMAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAAAAEAAAABJYQAAAAAAAAIAAAAAWCBAAAABAAAAANAECAZAAAAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAAgFAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdUluY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmMiB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFsxM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgX2Nvb3Jkcyk7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChfaW5wdXQsIGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzApICogX2Nvb3Jkcy54eTEpOwp9CmhhbGY0IFNtb290aF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBjb29yZCwgaGFsZjIgb2Zmc2V0QW5kS2VybmVsKSAKewoJcmV0dXJuIE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChjb29yZCArIG9mZnNldEFuZEtlcm5lbC54ICogdUluY3JlbWVudF9TMV9jMCkpICogb2Zmc2V0QW5kS2VybmVsLnk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBjb2xvciA9IGhhbGY0KDApOwoJZmxvYXQyIGNvb3JkID0gdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cglmb3IgKGludCBpPTA7IGk8MTM7ICsraSkgCgl7CgkJY29sb3IgKz0gU21vb3RoX1MxX2MwKF9pbnB1dCwgY29vcmQsIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwW2ldKTsKCX0KCXJldHVybiBjb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","AYAA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAAA5AAAAAAABAAAAACAZAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgAAAABdAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEADZABYAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAADsAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADBAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAEwMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdCBkeDAgPSB1aW5uZXJSZWN0X1MxLkwgLSBza19GcmFnQ29vcmQueDsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgoZmxvYXQyKG1heChkeDAsIGR4eTEueCksIGR4eTEueSksIDAuMCk7CgloYWxmIHRvcEFscGhhID0gaGFsZihzYXR1cmF0ZShza19GcmFnQ29vcmQueSAtIHVpbm5lclJlY3RfUzEuVCkpOwoJaGFsZiBhbHBoYSA9IHRvcEFscGhhICogaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAABAEAAAABJYQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IHN1YnNldENvb3JkLng7CgljbGFtcGVkQ29vcmQueSA9IGNsYW1wKHN1YnNldENvb3JkLnksIHVjbGFtcF9TMV9jMF9jMF9jMC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAudyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA="}} \ No newline at end of file From c89f17fe8a63d498a6dae262849a7355c8fa4b69 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Fri, 4 Nov 2022 19:34:32 +0100 Subject: [PATCH 27/53] #351 fixed unreplaceable covers set before v1.7.1 --- CHANGELOG.md | 1 + lib/model/covers.dart | 6 ++--- lib/model/db/db_metadata_sqflite.dart | 16 +++++++++++- lib/widgets/viewer/debug/debug_page.dart | 33 ------------------------ 4 files changed, 19 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18a83f755..88b0dc2bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file. - rendering of panoramas with inconsistent metadata - failing scan of items copied to SD card on older devices +- unreplaceable covers set before v1.7.1 ## <a id="v1.7.1"></a>[v1.7.1] - 2022-10-09 diff --git a/lib/model/covers.dart b/lib/model/covers.dart index 5d4338a31..dfd07b8d3 100644 --- a/lib/model/covers.dart +++ b/lib/model/covers.dart @@ -55,14 +55,14 @@ class Covers { final oldRows = _rows.where((row) => row.filter == filter).toSet(); _rows.removeAll(oldRows); + await metadataDb.removeCovers({filter}); + final oldRow = oldRows.firstOrNull; final oldEntry = oldRow?.entryId; final oldPackage = oldRow?.packageName; final oldColor = oldRow?.color; - if (entryId == null && packageName == null && color == null) { - await metadataDb.removeCovers({filter}); - } else { + if (entryId != null || packageName != null || color != null) { final row = CoverRow( filter: filter, entryId: entryId, diff --git a/lib/model/db/db_metadata_sqflite.dart b/lib/model/db/db_metadata_sqflite.dart index 3e12a018a..2bf986395 100644 --- a/lib/model/db/db_metadata_sqflite.dart +++ b/lib/model/db/db_metadata_sqflite.dart @@ -470,9 +470,23 @@ class SqfliteMetadataDb implements MetadataDb { Future<void> removeCovers(Set<CollectionFilter> filters) async { if (filters.isEmpty) return; + // for backward compatibility, remove stored JSON instead of removing de/reserialized filters + final obsoleteFilterJson = <String>{}; + + final rows = await _db.query(coverTable); + rows.forEach((row) { + final filterJson = row['filter'] as String?; + if (filterJson != null) { + final filter = CollectionFilter.fromJson(filterJson); + if (filters.any((v) => filter == v)) { + obsoleteFilterJson.add(filterJson); + } + } + }); + // using array in `whereArgs` and using it with `where filter IN ?` is a pain, so we prefer `batch` instead final batch = _db.batch(); - filters.forEach((filter) => batch.delete(coverTable, where: 'filter = ?', whereArgs: [filter.toJson()])); + obsoleteFilterJson.forEach((filterJson) => batch.delete(coverTable, where: 'filter = ?', whereArgs: [filterJson])); await batch.commit(noResult: true); } diff --git a/lib/widgets/viewer/debug/debug_page.dart b/lib/widgets/viewer/debug/debug_page.dart index 24d6c9d3f..cf89f3ed2 100644 --- a/lib/widgets/viewer/debug/debug_page.dart +++ b/lib/widgets/viewer/debug/debug_page.dart @@ -1,11 +1,7 @@ -import 'dart:ui' as ui; - import 'package:aves/app_mode.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/widgets/home_widget.dart'; import 'package:aves/widgets/viewer/debug/db.dart'; import 'package:aves/widgets/viewer/debug/metadata.dart'; import 'package:aves/widgets/viewer/info/common.dart'; @@ -31,7 +27,6 @@ class ViewerDebugPage extends StatelessWidget { if (context.select<ValueNotifier<AppMode>, bool>((vn) => vn.value != AppMode.view)) Tuple2(const Tab(text: 'DB'), DbTab(entry: entry)), Tuple2(const Tab(icon: Icon(AIcons.android)), MetadataTab(entry: entry)), Tuple2(const Tab(icon: Icon(AIcons.image)), _buildThumbnailsTabView()), - Tuple2(const Tab(icon: Icon(AIcons.addShortcut)), _buildWidgetTabView()), ]; return Directionality( textDirection: TextDirection.ltr, @@ -186,32 +181,4 @@ class ViewerDebugPage extends StatelessWidget { .toList(), ); } - - Widget _buildWidgetTabView() { - return ListView( - padding: const EdgeInsets.all(16), - children: [303, 636, 972, 1305] - .expand((heightPx) => [ - Text('Widget heightPx: $heightPx'), - FutureBuilder<Uint8List>( - future: HomeWidgetPainter( - entry: entry, - devicePixelRatio: ui.window.devicePixelRatio, - ).drawWidget( - widthPx: 978, - heightPx: heightPx, - outline: Colors.amber, - shape: WidgetShape.heart, - format: ui.ImageByteFormat.png, - ), - builder: (context, snapshot) { - final bytes = snapshot.data; - if (bytes == null) return const SizedBox(); - return Image.memory(bytes); - }, - ), - ]) - .toList(), - ); - } } From 22149ffca2289871d0ce86a03bcfe8e2aa8082ee Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Fri, 4 Nov 2022 23:50:26 +0100 Subject: [PATCH 28/53] #383 optional media management permission --- CHANGELOG.md | 1 + android/app/src/main/AndroidManifest.xml | 7 +- .../aves/channel/calls/DeviceHandler.kt | 21 ++++++ lib/l10n/app_en.arb | 1 + lib/model/device.dart | 5 +- lib/services/device_service.dart | 24 +++++++ lib/widgets/settings/privacy/privacy.dart | 64 +++++++++++++++++++ untranslated.json | 17 +++++ 8 files changed, 138 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88b0dc2bc..854159ab9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Info: edit location by copying from other item - Info: edit tags with dynamic placeholders for country / place - Widget: option to open collection on tap +- optional MANAGE_MEDIA permission to modify media without asking ### Changed diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5e4b6da99..a17675bce 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -24,9 +24,14 @@ This change eventually prevents building the app with Flutter v3.3.3. android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" tools:ignore="ScopedStorage" /> + + <!-- from Android 12 (API 31), users can optionally grant access to the media management special permission --> + <uses-permission + android:name="android.permission.MANAGE_MEDIA" + tools:ignore="ProtectedPermissions" /> + <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.SET_WALLPAPER" /> - <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- to show foreground service progress via notification --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt index eda3f1d32..f9ca4d742 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt @@ -3,7 +3,10 @@ package deckers.thibault.aves.channel.calls import android.content.Context import android.content.Intent import android.content.res.Resources +import android.net.Uri import android.os.Build +import android.provider.MediaStore +import android.provider.Settings import androidx.core.content.pm.ShortcutManagerCompat import deckers.thibault.aves.channel.calls.Coresult.Companion.safe import deckers.thibault.aves.model.FieldMap @@ -15,15 +18,21 @@ import java.util.* class DeviceHandler(private val context: Context) : MethodCallHandler { override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { + "canManageMedia" -> safe(call, result, ::canManageMedia) "getCapabilities" -> safe(call, result, ::getCapabilities) "getDefaultTimeZone" -> safe(call, result, ::getDefaultTimeZone) "getLocales" -> safe(call, result, ::getLocales) "getPerformanceClass" -> safe(call, result, ::getPerformanceClass) "isSystemFilePickerEnabled" -> safe(call, result, ::isSystemFilePickerEnabled) + "requestMediaManagePermission" -> safe(call, result, ::requestMediaManagePermission) else -> result.notImplemented() } } + private fun canManageMedia(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + result.success(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) MediaStore.canManageMedia(context) else false) + } + private fun getCapabilities(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { val sdkInt = Build.VERSION.SDK_INT result.success( @@ -32,6 +41,7 @@ class DeviceHandler(private val context: Context) : MethodCallHandler { "canPinShortcut" to ShortcutManagerCompat.isRequestPinShortcutSupported(context), "canPrint" to (sdkInt >= Build.VERSION_CODES.KITKAT), "canRenderFlagEmojis" to (sdkInt >= Build.VERSION_CODES.LOLLIPOP), + "canRequestManageMedia" to (sdkInt >= Build.VERSION_CODES.S), "canSetLockScreenWallpaper" to (sdkInt >= Build.VERSION_CODES.N), "isDynamicColorAvailable" to (sdkInt >= Build.VERSION_CODES.S), "showPinShortcutFeedback" to (sdkInt >= Build.VERSION_CODES.O), @@ -90,6 +100,17 @@ class DeviceHandler(private val context: Context) : MethodCallHandler { result.success(enabled) } + private fun requestMediaManagePermission(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + result.error("requestMediaManagePermission-unsupported", "media management permission is not available before Android 12", null) + return + } + + val intent = Intent(Settings.ACTION_REQUEST_MANAGE_MEDIA, Uri.parse("package:${context.packageName}")) + context.startActivity(intent) + result.success(true) + } + companion object { const val CHANNEL = "deckers.thibault/aves/device" } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 47e0028f8..9c0bd807b 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -760,6 +760,7 @@ "settingsSaveSearchHistory": "Save search history", "settingsEnableBin": "Use recycle bin", "settingsEnableBinSubtitle": "Keep deleted items for 30 days", + "settingsAllowMediaManagement": "Allow media management", "settingsHiddenItemsTile": "Hidden items", "settingsHiddenItemsPageTitle": "Hidden Items", diff --git a/lib/model/device.dart b/lib/model/device.dart index c94b0adf2..d599ab64f 100644 --- a/lib/model/device.dart +++ b/lib/model/device.dart @@ -5,7 +5,7 @@ final Device device = Device._private(); class Device { late final String _userAgent; - late final bool _canGrantDirectoryAccess, _canPinShortcut, _canPrint, _canRenderFlagEmojis, _canSetLockScreenWallpaper; + late final bool _canGrantDirectoryAccess, _canPinShortcut, _canPrint, _canRenderFlagEmojis, _canRequestManageMedia, _canSetLockScreenWallpaper; late final bool _isDynamicColorAvailable, _showPinShortcutFeedback, _supportEdgeToEdgeUIMode; String get userAgent => _userAgent; @@ -18,6 +18,8 @@ class Device { bool get canRenderFlagEmojis => _canRenderFlagEmojis; + bool get canRequestManageMedia => _canRequestManageMedia; + bool get canSetLockScreenWallpaper => _canSetLockScreenWallpaper; bool get isDynamicColorAvailable => _isDynamicColorAvailable; @@ -37,6 +39,7 @@ class Device { _canPinShortcut = capabilities['canPinShortcut'] ?? false; _canPrint = capabilities['canPrint'] ?? false; _canRenderFlagEmojis = capabilities['canRenderFlagEmojis'] ?? false; + _canRequestManageMedia = capabilities['canRequestManageMedia'] ?? false; _canSetLockScreenWallpaper = capabilities['canSetLockScreenWallpaper'] ?? false; _isDynamicColorAvailable = capabilities['isDynamicColorAvailable'] ?? false; _showPinShortcutFeedback = capabilities['showPinShortcutFeedback'] ?? false; diff --git a/lib/services/device_service.dart b/lib/services/device_service.dart index 5bafe40f7..b6d0612cb 100644 --- a/lib/services/device_service.dart +++ b/lib/services/device_service.dart @@ -4,6 +4,8 @@ import 'package:aves/services/common/services.dart'; import 'package:flutter/services.dart'; abstract class DeviceService { + Future<bool> canManageMedia(); + Future<Map<String, dynamic>> getCapabilities(); Future<String?> getDefaultTimeZone(); @@ -13,11 +15,24 @@ abstract class DeviceService { Future<int> getPerformanceClass(); Future<bool> isSystemFilePickerEnabled(); + + Future<void> requestMediaManagePermission(); } class PlatformDeviceService implements DeviceService { static const _platform = MethodChannel('deckers.thibault/aves/device'); + @override + Future<bool> canManageMedia() async { + try { + final result = await _platform.invokeMethod('canManageMedia'); + if (result != null) return result as bool; + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + return false; + } + @override Future<Map<String, dynamic>> getCapabilities() async { try { @@ -80,4 +95,13 @@ class PlatformDeviceService implements DeviceService { } return false; } + + @override + Future<void> requestMediaManagePermission() async { + try { + await _platform.invokeMethod('requestMediaManagePermission'); + } on PlatformException catch (e, stack) { + await reportService.recordError(e, stack); + } + } } diff --git a/lib/widgets/settings/privacy/privacy.dart b/lib/widgets/settings/privacy/privacy.dart index 4a07263a0..8d2b58b59 100644 --- a/lib/widgets/settings/privacy/privacy.dart +++ b/lib/widgets/settings/privacy/privacy.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:aves/app_flavor.dart'; import 'package:aves/model/device.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/services/common/services.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -33,6 +34,7 @@ class PrivacySection extends SettingsSection { return [ SettingsTilePrivacyAllowInstalledAppAccess(), if (canEnableErrorReporting) SettingsTilePrivacyAllowErrorReporting(), + if (device.canRequestManageMedia) SettingsTilePrivacyManageMedia(), SettingsTilePrivacySaveSearchHistory(), SettingsTilePrivacyEnableBin(), SettingsTilePrivacyHiddenItems(), @@ -124,3 +126,65 @@ class SettingsTilePrivacyStorageAccess extends SettingsTile { builder: (context) => const StorageAccessPage(), ); } + +class SettingsTilePrivacyManageMedia extends SettingsTile { + @override + String title(BuildContext context) => context.l10n.settingsAllowMediaManagement; + + @override + Widget build(BuildContext context) => _ManageMediaTile(title: title(context)); +} + +class _ManageMediaTile extends StatefulWidget { + final String title; + + const _ManageMediaTile({ + required this.title, + }); + + @override + State<_ManageMediaTile> createState() => _ManageMediaTileState(); +} + +class _ManageMediaTileState extends State<_ManageMediaTile> with WidgetsBindingObserver { + late Future<bool> _loader; + + @override + void initState() { + super.initState(); + _initLoader(); + WidgetsBinding.instance.addObserver(this); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + void _initLoader() => _loader = deviceService.canManageMedia(); + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + _initLoader(); + setState(() {}); + } + } + + @override + Widget build(BuildContext context) { + return FutureBuilder<bool>( + future: _loader, + builder: (context, snapshot) { + final loading = snapshot.connectionState != ConnectionState.done; + final current = snapshot.data ?? false; + return SwitchListTile( + value: current, + onChanged: loading ? null : (v) => deviceService.requestMediaManagePermission(), + title: Text(widget.title), + ); + }, + ); + } +} diff --git a/untranslated.json b/untranslated.json index 1e893420e..287980953 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,6 +1,7 @@ { "de": [ "editEntryLocationDialogSetCustom", + "settingsAllowMediaManagement", "tagEditorSectionPlaceholders", "tagPlaceholderCountry", "tagPlaceholderPlace" @@ -8,6 +9,7 @@ "el": [ "editEntryLocationDialogSetCustom", + "settingsAllowMediaManagement", "tagEditorSectionPlaceholders", "tagPlaceholderCountry", "tagPlaceholderPlace" @@ -18,6 +20,7 @@ "widgetOpenPageCollection", "widgetOpenPageViewer", "editEntryLocationDialogSetCustom", + "settingsAllowMediaManagement", "tagEditorSectionPlaceholders", "tagPlaceholderCountry", "tagPlaceholderPlace" @@ -507,6 +510,7 @@ "settingsSaveSearchHistory", "settingsEnableBin", "settingsEnableBinSubtitle", + "settingsAllowMediaManagement", "settingsHiddenItemsTile", "settingsHiddenItemsPageTitle", "settingsHiddenItemsTabFilters", @@ -606,6 +610,7 @@ "fr": [ "editEntryLocationDialogSetCustom", + "settingsAllowMediaManagement", "tagEditorSectionPlaceholders", "tagPlaceholderCountry", "tagPlaceholderPlace" @@ -962,6 +967,7 @@ "settingsSaveSearchHistory", "settingsEnableBin", "settingsEnableBinSubtitle", + "settingsAllowMediaManagement", "settingsHiddenItemsTile", "settingsHiddenItemsPageTitle", "settingsHiddenItemsTabFilters", @@ -1073,6 +1079,7 @@ "albumMimeTypeMixed", "settingsDisabled", "settingsSlideshowAnimatedZoomEffect", + "settingsAllowMediaManagement", "settingsWidgetOpenPage", "statsTopAlbumsSectionTitle", "wallpaperUseScrollEffect", @@ -1083,6 +1090,7 @@ "it": [ "editEntryLocationDialogSetCustom", + "settingsAllowMediaManagement", "tagEditorSectionPlaceholders", "tagPlaceholderCountry", "tagPlaceholderPlace" @@ -1118,6 +1126,7 @@ "settingsConfirmationAfterMoveToBinItems", "settingsViewerGestureSideTapNext", "settingsSlideshowAnimatedZoomEffect", + "settingsAllowMediaManagement", "settingsWidgetOpenPage", "statsTopAlbumsSectionTitle", "viewerInfoLabelDescription", @@ -1129,6 +1138,7 @@ "ko": [ "editEntryLocationDialogSetCustom", + "settingsAllowMediaManagement", "tagEditorSectionPlaceholders", "tagPlaceholderCountry", "tagPlaceholderPlace" @@ -1222,6 +1232,7 @@ "settingsSlideshowShuffle", "settingsSubtitleThemeSample", "settingsAllowInstalledAppAccess", + "settingsAllowMediaManagement", "settingsHiddenFiltersBanner", "settingsHiddenFiltersEmpty", "settingsHiddenItemsTabPaths", @@ -1253,6 +1264,7 @@ "editEntryLocationDialogSetCustom", "aboutLinkPolicy", "policyPageTitle", + "settingsAllowMediaManagement", "tagEditorSectionPlaceholders", "tagPlaceholderCountry", "tagPlaceholderPlace" @@ -1649,6 +1661,7 @@ "settingsSaveSearchHistory", "settingsEnableBin", "settingsEnableBinSubtitle", + "settingsAllowMediaManagement", "settingsHiddenItemsTile", "settingsHiddenItemsPageTitle", "settingsHiddenItemsTabFilters", @@ -1748,6 +1761,7 @@ "pt": [ "editEntryLocationDialogSetCustom", + "settingsAllowMediaManagement", "tagEditorSectionPlaceholders", "tagPlaceholderCountry", "tagPlaceholderPlace" @@ -1755,6 +1769,7 @@ "ru": [ "editEntryLocationDialogSetCustom", + "settingsAllowMediaManagement", "tagEditorSectionPlaceholders", "tagPlaceholderCountry", "tagPlaceholderPlace" @@ -1813,6 +1828,7 @@ "settingsSlideshowIntervalTile", "settingsSlideshowVideoPlaybackTile", "settingsSlideshowVideoPlaybackDialogTitle", + "settingsAllowMediaManagement", "settingsScreenSaverPageTitle", "settingsWidgetShowOutline", "settingsWidgetOpenPage", @@ -1827,6 +1843,7 @@ "zh": [ "editEntryLocationDialogSetCustom", + "settingsAllowMediaManagement", "tagEditorSectionPlaceholders", "tagPlaceholderCountry", "tagPlaceholderPlace" From 15c225fa89c34ee8b7a415f3f8cf44987c934293 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Sat, 5 Nov 2022 15:45:09 +0100 Subject: [PATCH 29/53] #381 fixed inconsistent background height for multi-script subtitles --- CHANGELOG.md | 1 + .../common/basic/text_background_painter.dart | 76 +++++++++++++++++++ .../settings/video/subtitle_sample.dart | 30 +++++--- .../viewer/visual/subtitle/ass_parser.dart | 2 +- .../viewer/visual/subtitle/subtitle.dart | 11 ++- 5 files changed, 107 insertions(+), 13 deletions(-) create mode 100644 lib/widgets/common/basic/text_background_painter.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 854159ab9..72737e27e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ All notable changes to this project will be documented in this file. - rendering of panoramas with inconsistent metadata - failing scan of items copied to SD card on older devices - unreplaceable covers set before v1.7.1 +- inconsistent background height for multi-script subtitles ## <a id="v1.7.1"></a>[v1.7.1] - 2022-10-09 diff --git a/lib/widgets/common/basic/text_background_painter.dart b/lib/widgets/common/basic/text_background_painter.dart new file mode 100644 index 000000000..e738614fc --- /dev/null +++ b/lib/widgets/common/basic/text_background_painter.dart @@ -0,0 +1,76 @@ +import 'dart:ui' as ui; + +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +// as of Flutter v3.3.7, text style background does not have consistent height +// when rendering multi-script text, so we paint the background behind via a stack instead +class TextBackgroundPainter extends StatelessWidget { + final List<TextSpan> spans; + final TextStyle style; + final TextAlign textAlign; + final Widget child; + + const TextBackgroundPainter({ + super.key, + required this.spans, + required this.style, + required this.textAlign, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final backgroundColor = style.backgroundColor; + if (backgroundColor == null || backgroundColor.alpha == 0) { + return child; + } + + return LayoutBuilder( + builder: (context, constraints) { + final paragraph = RenderParagraph( + TextSpan( + children: spans, + style: style, + ), + textAlign: textAlign, + textDirection: Directionality.of(context), + textScaleFactor: MediaQuery.textScaleFactorOf(context), + )..layout(constraints, parentUsesSize: true); + + final textLength = spans.map((v) => v.text?.length ?? 0).sum; + final allBoxes = paragraph.getBoxesForSelection( + TextSelection(baseOffset: 0, extentOffset: textLength), + boxHeightStyle: ui.BoxHeightStyle.max, + ); + + // merge boxes to avoid artifacts at box edges, from anti-aliasing and rounding hacks + final lineRects = groupBy<TextBox, double>(allBoxes, (v) => v.top).entries.map((kv) { + final top = kv.key; + final lineBoxes = kv.value; + return Rect.fromLTRB( + lineBoxes.map((v) => v.left).min, + top, + lineBoxes.map((v) => v.right).max, + lineBoxes.first.bottom, + ); + }); + + return Stack( + children: [ + ...lineRects.map((rect) { + return Positioned.fromRect( + rect: rect, + child: ColoredBox( + color: backgroundColor, + ), + ); + }), + child, + ], + ); + }, + ); + } +} diff --git a/lib/widgets/settings/video/subtitle_sample.dart b/lib/widgets/settings/video/subtitle_sample.dart index 9b6d2d888..16399c7b5 100644 --- a/lib/widgets/settings/video/subtitle_sample.dart +++ b/lib/widgets/settings/video/subtitle_sample.dart @@ -1,6 +1,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/basic/outlined_text.dart'; +import 'package:aves/widgets/common/basic/text_background_painter.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/fx/borders.dart'; import 'package:aves/widgets/viewer/visual/subtitle/subtitle.dart'; @@ -12,8 +13,13 @@ class SubtitleSample extends StatelessWidget { @override Widget build(BuildContext context) { + final textSpans = [ + TextSpan(text: context.l10n.settingsSubtitleThemeSample), + ]; + return Consumer<Settings>( builder: (context, settings, child) { + final textAlign = settings.subtitleTextAlignment; final outlineColor = Colors.black.withOpacity(settings.subtitleTextColor.opacity); final shadows = [ Shadow( @@ -34,7 +40,7 @@ class SubtitleSample extends StatelessWidget { ), height: 128, child: AnimatedAlign( - alignment: _getAlignment(settings.subtitleTextAlignment), + alignment: _getAlignment(textAlign), curve: Curves.easeInOutCubic, duration: const Duration(milliseconds: 400), child: Padding( @@ -42,20 +48,24 @@ class SubtitleSample extends StatelessWidget { child: AnimatedDefaultTextStyle( style: TextStyle( color: settings.subtitleTextColor, - backgroundColor: settings.subtitleBackgroundColor, fontSize: settings.subtitleFontSize, shadows: settings.subtitleShowOutline ? shadows : null, ), - textAlign: settings.subtitleTextAlignment, + textAlign: textAlign, duration: const Duration(milliseconds: 200), - child: OutlinedText( - textSpans: [ - TextSpan( - text: context.l10n.settingsSubtitleThemeSample, + child: Builder( + builder: (context) => TextBackgroundPainter( + spans: textSpans, + style: DefaultTextStyle.of(context).style.copyWith( + backgroundColor: settings.subtitleBackgroundColor, + ), + textAlign: textAlign, + child: OutlinedText( + textSpans: textSpans, + outlineWidth: settings.subtitleShowOutline ? 1 : 0, + outlineColor: outlineColor, ), - ], - outlineWidth: settings.subtitleShowOutline ? 1 : 0, - outlineColor: outlineColor, + ), ), ), ), diff --git a/lib/widgets/viewer/visual/subtitle/ass_parser.dart b/lib/widgets/viewer/visual/subtitle/ass_parser.dart index 9bbd71ce3..b15414474 100644 --- a/lib/widgets/viewer/visual/subtitle/ass_parser.dart +++ b/lib/widgets/viewer/visual/subtitle/ass_parser.dart @@ -389,7 +389,7 @@ class AssParser { ); } - static String _replaceChars(String text) => text.replaceAll(r'\h', noBreakSpace).replaceAll(r'\N', '\n'); + static String _replaceChars(String text) => text.replaceAll(r'\h', noBreakSpace).replaceAll(r'\N', '\n').trim(); static int? _parseAlpha(String param) { final match = alphaPattern.firstMatch(param); diff --git a/lib/widgets/viewer/visual/subtitle/subtitle.dart b/lib/widgets/viewer/visual/subtitle/subtitle.dart index e9a5cac3e..a90bf5424 100644 --- a/lib/widgets/viewer/visual/subtitle/subtitle.dart +++ b/lib/widgets/viewer/visual/subtitle/subtitle.dart @@ -1,5 +1,6 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/widgets/common/basic/outlined_text.dart'; +import 'package:aves/widgets/common/basic/text_background_painter.dart'; import 'package:aves/widgets/viewer/video/controller.dart'; import 'package:aves/widgets/viewer/visual/state.dart'; import 'package:aves/widgets/viewer/visual/subtitle/ass_parser.dart'; @@ -42,7 +43,6 @@ class VideoSubtitles extends StatelessWidget { ]; final baseStyle = TextStyle( color: settings.subtitleTextColor, - backgroundColor: settings.subtitleBackgroundColor, fontSize: settings.subtitleFontSize, shadows: settings.subtitleShowOutline ? baseShadows : null, ); @@ -243,7 +243,14 @@ class VideoSubtitles extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 8), child: Align( alignment: Alignment(alignX, alignY), - child: child, + child: TextBackgroundPainter( + spans: spans, + style: DefaultTextStyle.of(context).style.merge(spans.first.style!.copyWith( + backgroundColor: settings.subtitleBackgroundColor, + )), + textAlign: textAlign, + child: child, + ), ), ); } From 8d2ab89cb4706be9906b4313e05f6c9873ead985 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Sat, 5 Nov 2022 18:07:11 +0100 Subject: [PATCH 30/53] l10n by weblate (#375) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/es/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ru/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> --- android/app/src/main/res/values-fa/strings.xml | 1 + .../android/es-MX/full_description.txt | 2 +- .../metadata/android/fr/full_description.txt | 6 +++--- .../metadata/android/fr/short_description.txt | 2 +- .../android/nb-NO/full_description.txt | 2 +- .../metadata/android/ru/full_description.txt | 6 +++--- .../metadata/android/ru/short_description.txt | 2 +- lib/l10n/app_es.arb | 18 ++++++++++++++++-- lib/l10n/app_fr.arb | 12 +++++++++++- lib/l10n/app_it.arb | 2 -- lib/l10n/app_ko.arb | 12 +++++++++++- lib/l10n/app_ru.arb | 10 +++++++++- 12 files changed, 58 insertions(+), 17 deletions(-) diff --git a/android/app/src/main/res/values-fa/strings.xml b/android/app/src/main/res/values-fa/strings.xml index bffe34c3f..5b1e2f8ea 100644 --- a/android/app/src/main/res/values-fa/strings.xml +++ b/android/app/src/main/res/values-fa/strings.xml @@ -8,4 +8,5 @@ <string name="analysis_notification_default_title">در حال کنکاش رسانه‌ها</string> <string name="analysis_notification_action_stop">توقف کردن</string> <string name="app_widget_label">قاب عکس</string> + <string name="app_name">Aves</string> </resources> \ No newline at end of file diff --git a/fastlane/metadata/android/es-MX/full_description.txt b/fastlane/metadata/android/es-MX/full_description.txt index ab4e2e977..ff0931a0c 100644 --- a/fastlane/metadata/android/es-MX/full_description.txt +++ b/fastlane/metadata/android/es-MX/full_description.txt @@ -1,5 +1,5 @@ <i>Aves</i> puede manejar todo tipo de imágenes y videos, incluyendo los típicos JPEG y MP4, pero además cosas mas exóticas como <b>TIFF multipágina, SVG, viejos AVI y más</b>! Inspecciona su colección multimedia para identificar <b>fotos en movimiento</b>, <b>panoramas</b> (conocidas como fotos esféricas), <b>videos en 360°</b> y también archivos <b>GeoTIFF</b>. -La <b>navegación y búsqueda</b> son partes importantes de <i>Aves</i>. Su propósito es que los usuarios puedan fácimente ir de álbumes a fotos, etiquetas, mapas, etc. +La <b>navegación y búsqueda</b> son las partes más importantes de <i>Aves</i>. Su propósito es que los usuarios puedan fácilmente ir de álbumes a fotos, etiquetas, mapas, etc. <i>Aves</i> se integra con Android (desde <b>API 19 a 33</b>, es decir, desde KitKat a Android 13) con funciones como <b>widgets</b>, <b>accesos directos a aplicaciones </b>, manejo de <b>salvapantallas</b> y <b>búsqueda global</b>. También funciona como un <b>visor y selector de medios</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/fr/full_description.txt b/fastlane/metadata/android/fr/full_description.txt index 8806906a1..07433788e 100644 --- a/fastlane/metadata/android/fr/full_description.txt +++ b/fastlane/metadata/android/fr/full_description.txt @@ -1,5 +1,5 @@ -<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. +<i>Aves</i> supporte toutes sortes d’images et de vidéos comme les JPEG et les MP4 typiques, mais aussi des formats plus exotiques comme <b>les TIFF multipages, les SVG, les vieux AVI et bien plus encore</b> ! Votre collection multimédia est analysée pour identifier les <b>photos animées</b>, les <b>panoramas</b> (alias sphères photo), les <b>vidéos à 360°</b> ainsi que les fichiers <b>GeoTIFF</b>. -<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. +<b>La navigation et la recherche</b> sont une partie importante d’<i>Aves</i>. Le but est que les utilisateurs puissent passer facilement des albums aux photos, des photos aux tags, des tags aux cartes, etc. -<i>Aves</i> integrates with Android (from <b>API 19 to 33</b>, i.e. from KitKat to Android 13) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file +<i>Aves</i> s’intègre avec Android (de l’<b>API 19 à 33</b>, c’est-à-dire de KitKat à Android 13) avec des fonctionnalités telles que les <b>widgets</b>, les <b>raccourcis d’application</b>, <b>économiseur d’écran</b> et la <b>recherche globale</b>. Il est également possible de l’utiliser comme <b>visionneuse et sélecteur de médias</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr/short_description.txt index 8c9445bd5..717eb4127 100644 --- a/fastlane/metadata/android/fr/short_description.txt +++ b/fastlane/metadata/android/fr/short_description.txt @@ -1 +1 @@ -Gallery and metadata explorer \ No newline at end of file +Galerie et explorateur de métadonnées \ No newline at end of file diff --git a/fastlane/metadata/android/nb-NO/full_description.txt b/fastlane/metadata/android/nb-NO/full_description.txt index e796f03bc..b2259273d 100644 --- a/fastlane/metadata/android/nb-NO/full_description.txt +++ b/fastlane/metadata/android/nb-NO/full_description.txt @@ -2,4 +2,4 @@ <b>Navigasjon og søk</b> er en viktig del av <i>Aves</i>. Målet er at brukere enkelt skal kunne ta seg fra album, til bilder, til etiketter, til kart, osv. -<i>Aves</i> integrates with Android (from <b>API 19 to 33</b>, i.e. from KitKat to Android 13) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file +<i>Aves</i> integrerer seg med Android (fra <b>API 19 til 33</b>, altså fra KitKat til Android 13) med funksjoner som f.eks. <b>miniprogrammer</b>, <b>programsnarveier</b>, <b>skjermsparer</b> og <b>søk i hele programmet</b>. Det fungerer også som <b>mediaviser og utvelger</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt index 8806906a1..4192d2677 100644 --- a/fastlane/metadata/android/ru/full_description.txt +++ b/fastlane/metadata/android/ru/full_description.txt @@ -1,5 +1,5 @@ -<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files. +<i>Aves</i> умеет работать со всеми типами изображений и видео, начиная от обычных JPEG и MP4, заканчивая такими экзотическими штуками как <b>многостраничные TIFF, SVG, старые AVI и многими другими</b>! Он сканирует вашу медиа коллекцию, определяя <b>моушн фото</b>, <b>панорамы</b> (aka фото сферы), <b>360° видео</b>, <b>GeoTIFF</b> файлы. -<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc. +<b>Навигация и поиск</b> важные части <i>Aves</i>. Пользователи могут легко переходить от альбомов к фотографиям, тэгам, картам и т.д. -<i>Aves</i> integrates with Android (from <b>API 19 to 33</b>, i.e. from KitKat to Android 13) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>. \ No newline at end of file +<i>Aves</i> интегрируется с Android (начиная с версии <b>API 19 до 33</b>, т.е. от KitKat до Android 13) предлагая такие возможности как <b>виджеты</b>, <b>пользовательские ярлыки</b>, <b>скринсейвер</b> и поддержку <b>глобального поиска</b>. Он так же работает как диалоговое окно для <b>просмотра и выбора медиа</b>. \ No newline at end of file diff --git a/fastlane/metadata/android/ru/short_description.txt b/fastlane/metadata/android/ru/short_description.txt index 8c9445bd5..6c579b7fa 100644 --- a/fastlane/metadata/android/ru/short_description.txt +++ b/fastlane/metadata/android/ru/short_description.txt @@ -1 +1 @@ -Gallery and metadata explorer \ No newline at end of file +Медиа галерея с навигацией по метаданным \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index f8e703b4d..88923e586 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1101,7 +1101,7 @@ "@viewerTransitionNone": {}, "durationDialogSeconds": "Segundos", "@durationDialogSeconds": {}, - "viewDialogReverseSortOrder": "Orden de clasificación inverso", + "viewDialogReverseSortOrder": "Invertir la forma de ordenar", "@viewDialogReverseSortOrder": {}, "tileLayoutMosaic": "Mosaico", "@tileLayoutMosaic": {}, @@ -1140,5 +1140,19 @@ "sortOrderLargestFirst": "El más grande primero", "@sortOrderLargestFirst": {}, "sortOrderSmallestFirst": "El más pequeño primero", - "@sortOrderSmallestFirst": {} + "@sortOrderSmallestFirst": {}, + "widgetOpenPageViewer": "Abrir el visor", + "@widgetOpenPageViewer": {}, + "widgetOpenPageHome": "Abrir la pantalla de inicio", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "Abrir colección", + "@widgetOpenPageCollection": {}, + "editEntryLocationDialogSetCustom": "Establecer la ubicación personalizada", + "@editEntryLocationDialogSetCustom": {}, + "tagPlaceholderCountry": "País", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Lugar", + "@tagPlaceholderPlace": {}, + "tagEditorSectionPlaceholders": "Marcadores de la posición", + "@tagEditorSectionPlaceholders": {} } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 2f51dc8b9..38f8cef9e 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1146,5 +1146,15 @@ "filePickerNoItems": "Aucun élément", "@filePickerNoItems": {}, "filePickerUseThisFolder": "Utiliser ce dossier", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "editEntryLocationDialogSetCustom": "Définir un lieu personnalisé", + "@editEntryLocationDialogSetCustom": {}, + "tagEditorSectionPlaceholders": "Libellés de substitution", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderPlace": "Lieu", + "@tagPlaceholderPlace": {}, + "tagPlaceholderCountry": "Pays", + "@tagPlaceholderCountry": {}, + "settingsAllowMediaManagement": "Autoriser la gestion des médias", + "@settingsAllowMediaManagement": {} } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index f0a89124b..58d252796 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -1143,8 +1143,6 @@ "@filePickerNoItems": {}, "filePickerUseThisFolder": "Usa questa cartella", "@filePickerUseThisFolder": {}, - "widgetOpenPageCollection": "Collezione aperta", - "@widgetOpenPageCollection": {}, "durationDialogSeconds": "Secondi", "@durationDialogSeconds": {} } diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 5d0fb62b5..98767773e 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -1146,5 +1146,15 @@ "filePickerNoItems": "항목 없음", "@filePickerNoItems": {}, "filePickerUseThisFolder": "이 폴더 사용", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "editEntryLocationDialogSetCustom": "지정 장소로 편집", + "@editEntryLocationDialogSetCustom": {}, + "tagEditorSectionPlaceholders": "자리 표시자", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "국가", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "장소", + "@tagPlaceholderPlace": {}, + "settingsAllowMediaManagement": "미디어 관리 허용", + "@settingsAllowMediaManagement": {} } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index e9f829220..543d5155e 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -1146,5 +1146,13 @@ "durationDialogSeconds": "Секунд", "@durationDialogSeconds": {}, "widgetOpenPageCollection": "Открыть коллекцию", - "@widgetOpenPageCollection": {} + "@widgetOpenPageCollection": {}, + "tagPlaceholderCountry": "Страна", + "@tagPlaceholderCountry": {}, + "tagEditorSectionPlaceholders": "Закладки", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderPlace": "Место", + "@tagPlaceholderPlace": {}, + "editEntryLocationDialogSetCustom": "Редактировать местоположение", + "@editEntryLocationDialogSetCustom": {} } From b6050edfb83f653872033b676f2fafe76da3533f Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Sat, 5 Nov 2022 19:33:11 +0100 Subject: [PATCH 31/53] minor fixes --- l10n.yaml | 4 ++- lib/model/filters/coordinate.dart | 3 ++- lib/model/settings/settings.dart | 4 +-- lib/widgets/aves_app.dart | 5 +++- lib/widgets/settings/language/locale.dart | 4 +-- test/model/video/metadata_test.dart | 8 ++++-- test/utils/file_utils_test.dart | 3 ++- test/utils/geo_utils_test.dart | 3 ++- test/utils/time_utils_test.dart | 14 ++++++---- untranslated.json | 32 +++-------------------- 10 files changed, 35 insertions(+), 45 deletions(-) diff --git a/l10n.yaml b/l10n.yaml index 9b7cfce0e..e01189e57 100644 --- a/l10n.yaml +++ b/l10n.yaml @@ -1,4 +1,6 @@ -# cf guide: http://flutter.dev/go/i18n-user-guide +# cf guides: +# http://flutter.dev/go/i18n-user-guide +# https://docs.flutter.dev/development/accessibility-and-localization/internationalization # use defaults to: # - parse ARB files from `lib/l10n` diff --git a/lib/model/filters/coordinate.dart b/lib/model/filters/coordinate.dart index 20dff71da..a10e715be 100644 --- a/lib/model/filters/coordinate.dart +++ b/lib/model/filters/coordinate.dart @@ -4,6 +4,7 @@ import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves_map/aves_map.dart'; import 'package:flutter/material.dart'; @@ -59,7 +60,7 @@ class CoordinateFilter extends CollectionFilter { bool get exclusiveProp => false; @override - String get universalLabel => _formatBounds(lookupAppLocalizations(AppLocalizations.supportedLocales.first), CoordinateFormat.decimal); + String get universalLabel => _formatBounds(lookupAppLocalizations(AvesApp.supportedLocales.first), CoordinateFormat.decimal); @override String getLabel(BuildContext context) => _formatBounds(context.l10n, context.read<Settings>().coordinateFormat); diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index b993c6bbf..b90c4d9e6 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:convert'; import 'dart:math'; -import 'package:aves/l10n/l10n.dart'; import 'package:aves/model/actions/entry_actions.dart'; import 'package:aves/model/actions/entry_set_actions.dart'; import 'package:aves/model/filters/filters.dart'; @@ -12,6 +11,7 @@ import 'package:aves/model/settings/enums/map_style.dart'; import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/services/common/optional_event_channel.dart'; import 'package:aves/services/common/services.dart'; +import 'package:aves/widgets/aves_app.dart'; import 'package:aves_map/aves_map.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; @@ -283,7 +283,7 @@ class Settings extends ChangeNotifier { preferredLocales.addAll(_systemLocalesFallback); } } - _appliedLocale = basicLocaleListResolution(preferredLocales, AppLocalizations.supportedLocales); + _appliedLocale = basicLocaleListResolution(preferredLocales, AvesApp.supportedLocales); } return _appliedLocale!; } diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index d551d1823..915dc4160 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -48,6 +48,9 @@ import 'package:tuple/tuple.dart'; class AvesApp extends StatefulWidget { final AppFlavor flavor; + // temporary exclude locales not ready yet for prime time + static final _unsupportedLocales = {'fa', 'gl', 'nb', 'pl'}.map(Locale.new).toSet(); + static final List<Locale> supportedLocales = AppLocalizations.supportedLocales.where((v) => !_unsupportedLocales.contains(v)).toList(); static final GlobalKey<NavigatorState> navigatorKey = GlobalKey(debugLabel: 'app-navigator'); // do not monitor all `ModalRoute`s, which would include popup menus, @@ -225,7 +228,7 @@ class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver { themeMode: themeBrightness.appThemeMode, locale: settingsLocale, localizationsDelegates: AppLocalizations.localizationsDelegates, - supportedLocales: AppLocalizations.supportedLocales, + supportedLocales: AvesApp.supportedLocales, // TODO TLAD remove custom scroll behavior when this is fixed: https://github.com/flutter/flutter/issues/82906 scrollBehavior: StretchMaterialScrollBehavior(), ); diff --git a/lib/widgets/settings/language/locale.dart b/lib/widgets/settings/language/locale.dart index 5b04d3e97..1c59db036 100644 --- a/lib/widgets/settings/language/locale.dart +++ b/lib/widgets/settings/language/locale.dart @@ -1,8 +1,8 @@ import 'dart:collection'; -import 'package:aves/l10n/l10n.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/basic/query_bar.dart'; import 'package:aves/widgets/common/basic/reselectable_radio_list_tile.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; @@ -123,7 +123,7 @@ class _LocaleSelectionPageState extends State<LocaleSelectionPage> { } LinkedHashMap<Locale, String> _getLocaleOptions(BuildContext context) { - final displayLocales = AppLocalizations.supportedLocales.map((locale) => MapEntry(locale, LocaleTile.getLocaleName(locale))).toList()..sort((a, b) => compareAsciiUpperCase(a.value, b.value)); + final displayLocales = AvesApp.supportedLocales.map((locale) => MapEntry(locale, LocaleTile.getLocaleName(locale))).toList()..sort((a, b) => compareAsciiUpperCase(a.value, b.value)); return LinkedHashMap.of({ LocaleTile.systemLocaleOption: context.l10n.settingsSystemDefault, diff --git a/test/model/video/metadata_test.dart b/test/model/video/metadata_test.dart index 833621c23..4423b775b 100644 --- a/test/model/video/metadata_test.dart +++ b/test/model/video/metadata_test.dart @@ -3,9 +3,13 @@ import 'package:test/test.dart'; void main() { test('Video date parsing', () { - final localOffset = DateTime.now().timeZoneOffset; + DateTime shiftTimeZoneOffset(DateTime date) { + // local time zone offset may not be the same across time (because of DST), + // so we cannot reliably use `DateTime.now().timeZoneOffset` + return date.add(date.timeZoneOffset); + } - expect(VideoMetadataFormatter.parseVideoDate('2011-05-08T03:46+09:00'), DateTime(2011, 5, 7, 18, 46).add(localOffset).millisecondsSinceEpoch); + expect(VideoMetadataFormatter.parseVideoDate('2011-05-08T03:46+09:00'), shiftTimeZoneOffset(DateTime(2011, 5, 7, 18, 46)).millisecondsSinceEpoch); expect(VideoMetadataFormatter.parseVideoDate('UTC 2021-05-30 19:14:21'), DateTime(2021, 5, 30, 19, 14, 21).millisecondsSinceEpoch); expect(VideoMetadataFormatter.parseVideoDate('2021/10/31 21:23:17'), DateTime(2021, 10, 31, 21, 23, 17).millisecondsSinceEpoch); expect(VideoMetadataFormatter.parseVideoDate('2021-09-10T7:14:49 pmZ'), DateTime(2021, 9, 10, 19, 14, 49).millisecondsSinceEpoch); diff --git a/test/utils/file_utils_test.dart b/test/utils/file_utils_test.dart index 3c6043579..6dea8bdcc 100644 --- a/test/utils/file_utils_test.dart +++ b/test/utils/file_utils_test.dart @@ -1,10 +1,11 @@ import 'package:aves/l10n/l10n.dart'; import 'package:aves/utils/file_utils.dart'; +import 'package:aves/widgets/aves_app.dart'; import 'package:test/test.dart'; void main() { test('format file size', () { - final l10n = lookupAppLocalizations(AppLocalizations.supportedLocales.first); + final l10n = lookupAppLocalizations(AvesApp.supportedLocales.first); final locale = l10n.localeName; expect(formatFileSize(locale, 1024), '1.00 KB'); expect(formatFileSize(locale, 1536), '1.50 KB'); diff --git a/test/utils/geo_utils_test.dart b/test/utils/geo_utils_test.dart index d1ef6c306..8fe3fef49 100644 --- a/test/utils/geo_utils_test.dart +++ b/test/utils/geo_utils_test.dart @@ -1,12 +1,13 @@ import 'package:aves/l10n/l10n.dart'; import 'package:aves/model/settings/enums/coordinate_format.dart'; +import 'package:aves/widgets/aves_app.dart'; import 'package:aves_map/aves_map.dart'; import 'package:latlong2/latlong.dart'; import 'package:test/test.dart'; void main() { test('Decimal degrees to DMS (sexagesimal)', () { - final l10n = lookupAppLocalizations(AppLocalizations.supportedLocales.first); + final l10n = lookupAppLocalizations(AvesApp.supportedLocales.first); expect(ExtraCoordinateFormat.toDMS(l10n, LatLng(37.496667, 127.0275)), ['37° 29′ 48.00″ N', '127° 1′ 39.00″ E']); // Gangnam expect(ExtraCoordinateFormat.toDMS(l10n, LatLng(78.9243503, 11.9230465)), ['78° 55′ 27.66″ N', '11° 55′ 22.97″ E']); // Ny-Ålesund expect(ExtraCoordinateFormat.toDMS(l10n, LatLng(-38.6965891, 175.9830047)), ['38° 41′ 47.72″ S', '175° 58′ 58.82″ E']); // Taupo diff --git a/test/utils/time_utils_test.dart b/test/utils/time_utils_test.dart index 4bc33f228..b3b6c6b87 100644 --- a/test/utils/time_utils_test.dart +++ b/test/utils/time_utils_test.dart @@ -17,13 +17,17 @@ void main() { }); test('Parse dates', () { - final localOffset = DateTime.now().timeZoneOffset; + DateTime shiftTimeZoneOffset(DateTime date) { + // local time zone offset may not be the same across time (because of DST), + // so we cannot reliably use `DateTime.now().timeZoneOffset` + return date.add(date.timeZoneOffset); + } - expect(parseUnknownDateFormat('1600995564713'), DateTime(2020, 9, 25, 0, 59, 24, 713).add(localOffset)); - expect(parseUnknownDateFormat('pre1600995564713suf'), DateTime(2020, 9, 25, 0, 59, 24, 713).add(localOffset)); + expect(parseUnknownDateFormat('1600995564713'), shiftTimeZoneOffset(DateTime(2020, 9, 25, 0, 59, 24, 713))); + expect(parseUnknownDateFormat('pre1600995564713suf'), shiftTimeZoneOffset(DateTime(2020, 9, 25, 0, 59, 24, 713))); - expect(parseUnknownDateFormat('1600995564'), DateTime(2020, 9, 25, 0, 59, 24, 0).add(localOffset)); - expect(parseUnknownDateFormat('pre1600995564suf'), DateTime(2020, 9, 25, 0, 59, 24, 0).add(localOffset)); + expect(parseUnknownDateFormat('1600995564'), shiftTimeZoneOffset(DateTime(2020, 9, 25, 0, 59, 24, 0))); + expect(parseUnknownDateFormat('pre1600995564suf'), shiftTimeZoneOffset(DateTime(2020, 9, 25, 0, 59, 24, 0))); expect(parseUnknownDateFormat('IMG_20210901_142523_783'), DateTime(2021, 9, 1, 14, 25, 23, 783)); expect(parseUnknownDateFormat('Screenshot_20211028-115056_Aves'), DateTime(2021, 10, 28, 11, 50, 56, 0)); diff --git a/untranslated.json b/untranslated.json index 287980953..49894b809 100644 --- a/untranslated.json +++ b/untranslated.json @@ -16,14 +16,7 @@ ], "es": [ - "widgetOpenPageHome", - "widgetOpenPageCollection", - "widgetOpenPageViewer", - "editEntryLocationDialogSetCustom", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" + "settingsAllowMediaManagement" ], "fa": [ @@ -608,14 +601,6 @@ "filePickerUseThisFolder" ], - "fr": [ - "editEntryLocationDialogSetCustom", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - "gl": [ "accessibilityAnimationsRemove", "accessibilityAnimationsKeep", @@ -1089,6 +1074,7 @@ ], "it": [ + "widgetOpenPageCollection", "editEntryLocationDialogSetCustom", "settingsAllowMediaManagement", "tagEditorSectionPlaceholders", @@ -1136,14 +1122,6 @@ "tagPlaceholderPlace" ], - "ko": [ - "editEntryLocationDialogSetCustom", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - "nb": [ "videoActionCaptureFrame", "videoActionSelectStreams", @@ -1768,11 +1746,7 @@ ], "ru": [ - "editEntryLocationDialogSetCustom", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" + "settingsAllowMediaManagement" ], "tr": [ From 9efe139a396eba61c3069a58343aa837dde4a393 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Sat, 5 Nov 2022 21:11:06 +0100 Subject: [PATCH 32/53] #368 clean duplicate entries introduced before v1.7.1 --- lib/model/db/db_metadata_sqflite.dart | 2 +- lib/model/db/db_metadata_sqflite_upgrade.dart | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/lib/model/db/db_metadata_sqflite.dart b/lib/model/db/db_metadata_sqflite.dart index 2bf986395..2e0e3e11d 100644 --- a/lib/model/db/db_metadata_sqflite.dart +++ b/lib/model/db/db_metadata_sqflite.dart @@ -100,7 +100,7 @@ class SqfliteMetadataDb implements MetadataDb { ')'); }, onUpgrade: MetadataDbUpgrader.upgradeDb, - version: 9, + version: 10, ); final maxIdRows = await _db.rawQuery('SELECT max(id) AS maxId FROM $entryTable'); diff --git a/lib/model/db/db_metadata_sqflite_upgrade.dart b/lib/model/db/db_metadata_sqflite_upgrade.dart index 489c6f5c7..5d38540a8 100644 --- a/lib/model/db/db_metadata_sqflite_upgrade.dart +++ b/lib/model/db/db_metadata_sqflite_upgrade.dart @@ -1,4 +1,5 @@ import 'package:aves/model/db/db_metadata_sqflite.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:sqflite/sqflite.dart'; @@ -41,6 +42,9 @@ class MetadataDbUpgrader { case 8: await _upgradeFrom8(db); break; + case 9: + await _upgradeFrom9(db); + break; } oldVersion++; } @@ -334,4 +338,36 @@ class MetadataDbUpgrader { await db.execute('ALTER TABLE $newMetadataTable RENAME TO $metadataTable;'); }); } + + static Future<void> _upgradeFrom9(Database db) async { + debugPrint('upgrading DB from v9'); + + // clean duplicates introduced before Aves v1.7.1 + final duplicatedContentIdRows = await db.query(entryTable, columns: ['contentId'], groupBy: 'contentId', having: 'COUNT(id) > 1 AND contentId IS NOT NULL'); + final duplicatedContentIds = duplicatedContentIdRows.map((row) => row['contentId'] as int?).whereNotNull().toSet(); + final duplicateIds = <int>{}; + await Future.forEach(duplicatedContentIds, (contentId) async { + final rows = await db.query(entryTable, columns: ['id'], where: 'contentId = ?', whereArgs: [contentId]); + final ids = rows.map((row) => row['id'] as int?).whereNotNull().toList()..sort(); + if (ids.length > 1) { + ids.removeAt(0); + duplicateIds.addAll(ids); + } + }); + final batch = db.batch(); + const where = 'id = ?'; + const coverWhere = 'entryId = ?'; + duplicateIds.forEach((id) { + final whereArgs = [id]; + batch.delete(entryTable, where: where, whereArgs: whereArgs); + batch.delete(dateTakenTable, where: where, whereArgs: whereArgs); + batch.delete(metadataTable, where: where, whereArgs: whereArgs); + batch.delete(addressTable, where: where, whereArgs: whereArgs); + batch.delete(favouriteTable, where: where, whereArgs: whereArgs); + batch.delete(coverTable, where: coverWhere, whereArgs: whereArgs); + batch.delete(trashTable, where: where, whereArgs: whereArgs); + batch.delete(videoPlaybackTable, where: where, whereArgs: whereArgs); + }); + await batch.commit(noResult: true); + } } From c819c3478c9dfbddb692de1a5706540ef01d5c2c Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Sun, 6 Nov 2022 11:25:59 +0100 Subject: [PATCH 33/53] minor fix --- lib/model/video/metadata.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/model/video/metadata.dart b/lib/model/video/metadata.dart index c050e6155..c6853c6ee 100644 --- a/lib/model/video/metadata.dart +++ b/lib/model/video/metadata.dart @@ -100,7 +100,8 @@ class VideoMetadataFormatter { } } - if (dateMillis != null) { + // exclude date if it is suspiciously close to epoch + if (dateMillis != null && !DateTime.fromMillisecondsSinceEpoch(dateMillis).isAtSameDayAs(epoch)) { return (entry.catalogMetadata ?? CatalogMetadata(id: entry.id)).copyWith( dateMillis: dateMillis, ); From 87c58adb7ae0c951e004094576602331d42548f8 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Sun, 6 Nov 2022 11:49:03 +0100 Subject: [PATCH 34/53] fixed dialog shape --- lib/widgets/dialogs/aves_dialog.dart | 5 ++++- lib/widgets/dialogs/aves_selection_dialog.dart | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/widgets/dialogs/aves_dialog.dart b/lib/widgets/dialogs/aves_dialog.dart index 2b944e95c..411c700a0 100644 --- a/lib/widgets/dialogs/aves_dialog.dart +++ b/lib/widgets/dialogs/aves_dialog.dart @@ -51,6 +51,8 @@ class AvesDialog extends StatelessWidget { actions: actions, actionsPadding: actionsPadding, buttonPadding: buttonPadding, + // clipping to prevent highlighted material to bleed through rounded corners + clipBehavior: Clip.antiAlias, shape: shape(context), ); } @@ -74,7 +76,8 @@ class AvesDialog extends StatelessWidget { thumbVisibility: MaterialStateProperty.all(true), radius: const Radius.circular(16), crossAxisMargin: 4, - mainAxisMargin: 4, + // adapt margin when corner is around content itself, not outside for the title + mainAxisMargin: 4 + (title != null ? 0 : cornerRadius.y / 2), interactive: true, ), ), diff --git a/lib/widgets/dialogs/aves_selection_dialog.dart b/lib/widgets/dialogs/aves_selection_dialog.dart index 473fd7824..f0d6ae29c 100644 --- a/lib/widgets/dialogs/aves_selection_dialog.dart +++ b/lib/widgets/dialogs/aves_selection_dialog.dart @@ -63,7 +63,7 @@ class _AvesSelectionDialogState<T> extends State<AvesSelectionDialog<T>> { return AvesDialog( title: title, scrollableContent: [ - if (title == null && message == null) SizedBox(height: AvesDialog.cornerRadius.y), + if (title == null && message == null) SizedBox(height: AvesDialog.cornerRadius.y / 2), if (message != null) Padding( padding: const EdgeInsets.all(16), From a4c6a82b4f10fd690ec1e5eeb2ee2cbd8b0be742 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Sun, 6 Nov 2022 12:09:10 +0100 Subject: [PATCH 35/53] safer extended XMP parsing --- .../metadataextractor/SafeXmpReader.kt | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt index db58da6d6..4be65a348 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt @@ -49,11 +49,7 @@ class SafeXmpReader : XmpReader() { extendedXMPBuffer?.let { xmpBytes -> val totalSize = xmpBytes.size if (totalSize > segmentTypeSizeDangerThreshold) { - val error = "Extended XMP is too large, with a total size of $totalSize B" - Log.w(LOG_TAG, error) - metadata.addDirectory(XmpDirectory().apply { - addError(error) - }) + logError(metadata, totalSize) } else { extract(xmpBytes, metadata) } @@ -99,7 +95,7 @@ class SafeXmpReader : XmpReader() { return null } - // adapted from `XmpReader` because original is private + // adapted from `XmpReader` to prevent large allocation private fun processExtendedXMPChunk(metadata: Metadata, segmentBytes: ByteArray, extendedXMPGUID: String, extendedXMPBufferIn: ByteArray?): ByteArray? { var extendedXMPBuffer: ByteArray? = extendedXMPBufferIn val extensionPreambleLength = XMP_EXTENSION_JPEG_PREAMBLE.length @@ -113,7 +109,15 @@ class SafeXmpReader : XmpReader() { if (extendedXMPGUID == segmentGUID) { val fullLength = reader.uInt32.toInt() val chunkOffset = reader.uInt32.toInt() - if (extendedXMPBuffer == null) extendedXMPBuffer = ByteArray(fullLength) + if (extendedXMPBuffer == null) { + // TLAD insert start + if (fullLength > segmentTypeSizeDangerThreshold) { + logError(metadata, fullLength) + return null + } + // TLAD insert end + extendedXMPBuffer = ByteArray(fullLength) + } if (extendedXMPBuffer.size == fullLength) { System.arraycopy(segmentBytes, totalOffset, extendedXMPBuffer, chunkOffset, segmentLength - totalOffset) } else { @@ -131,6 +135,14 @@ class SafeXmpReader : XmpReader() { return extendedXMPBuffer } + private fun logError(metadata: Metadata, size: Int) { + val error = "Extended XMP is too large, with a size of $size B" + Log.w(LOG_TAG, error) + metadata.addDirectory(XmpDirectory().apply { + addError(error) + }) + } + companion object { private val LOG_TAG = LogUtils.createTag<SafeXmpReader>() From e8b46b02d8c0b1cd5f4d1163b2468457521c48ac Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Sun, 6 Nov 2022 12:31:13 +0100 Subject: [PATCH 36/53] minor fix --- .../calls/fetchers/TiffRegionFetcher.kt | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/TiffRegionFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/TiffRegionFetcher.kt index 56cb7c199..3f6f8805f 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/TiffRegionFetcher.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/TiffRegionFetcher.kt @@ -19,22 +19,24 @@ class TiffRegionFetcher internal constructor( result: MethodChannel.Result, ) { try { - @Suppress("BlockingMethodInNonBlockingContext") - val fd = context.contentResolver.openFileDescriptor(uri, "r")?.detachFd() - if (fd == null) { + val pfd = context.contentResolver.openFileDescriptor(uri, "r") + if (pfd == null) { result.error("getRegion-tiff-fd", "failed to get file descriptor for uri=$uri", null) return } - val options = TiffBitmapFactory.Options().apply { - inDirectoryNumber = page - inSampleSize = sampleSize - inDecodeArea = DecodeArea(regionRect.left, regionRect.top, regionRect.width(), regionRect.height()) - } - val bitmap = TiffBitmapFactory.decodeFileDescriptor(fd, options) - if (bitmap != null) { - result.success(bitmap.getBytes(canHaveAlpha = true, recycle = true)) - } else { - result.error("getRegion-tiff-null", "failed to decode region for uri=$uri page=$page regionRect=$regionRect", null) + pfd.use { + val fd = pfd.detachFd() + val options = TiffBitmapFactory.Options().apply { + inDirectoryNumber = page + inSampleSize = sampleSize + inDecodeArea = DecodeArea(regionRect.left, regionRect.top, regionRect.width(), regionRect.height()) + } + val bitmap = TiffBitmapFactory.decodeFileDescriptor(fd, options) + if (bitmap != null) { + result.success(bitmap.getBytes(canHaveAlpha = true, recycle = true)) + } else { + result.error("getRegion-tiff-null", "failed to decode region for uri=$uri page=$page regionRect=$regionRect", null) + } } } catch (e: Exception) { result.error("getRegion-tiff-read-exception", "failed to read from uri=$uri page=$page regionRect=$regionRect", e.message) From eb3acaa30705eb06938134744a11059451790cd1 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Mon, 7 Nov 2022 19:43:37 +0100 Subject: [PATCH 37/53] safer compressed bitmap allocation --- .../channel/streams/ActivityResultStreamHandler.kt | 2 +- .../metadataextractor/SafePngMetadataReader.kt | 2 +- .../metadata/metadataextractor/SafeXmpReader.kt | 6 +++--- .../deckers/thibault/aves/utils/BitmapUtils.kt | 14 +++++++++++++- .../deckers/thibault/aves/utils/ContextUtils.kt | 2 +- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ActivityResultStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ActivityResultStreamHandler.kt index 8d7c272cf..7736d8058 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ActivityResultStreamHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ActivityResultStreamHandler.kt @@ -188,7 +188,7 @@ class ActivityResultStreamHandler(private val activity: Activity, arguments: Any } private fun pickCollectionFilters() { - val initialFilters = (args["initialFilters"] as List<*>?)?.mapNotNull { if (it is String) it else null } ?: listOf() + val initialFilters = (args["initialFilters"] as? List<*>)?.mapNotNull { if (it is String) it else null } ?: listOf() val intent = Intent(MainActivity.INTENT_ACTION_PICK_COLLECTION_FILTERS, null, activity, MainActivity::class.java) .putExtra(MainActivity.EXTRA_KEY_FILTERS_ARRAY, initialFilters.toTypedArray()) .putExtra(MainActivity.EXTRA_KEY_FILTERS_STRING, initialFilters.joinToString(MainActivity.EXTRA_STRING_ARRAY_SEPARATOR)) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePngMetadataReader.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePngMetadataReader.kt index b0baa7973..1f2cc1dd5 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePngMetadataReader.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafePngMetadataReader.kt @@ -28,7 +28,7 @@ object SafePngMetadataReader { private val LOG_TAG = LogUtils.createTag<SafePngMetadataReader>() // arbitrary size to detect chunks that may yield an OOM - private const val chunkSizeDangerThreshold = SafeXmpReader.segmentTypeSizeDangerThreshold + private const val chunkSizeDangerThreshold = SafeXmpReader.SEGMENT_TYPE_SIZE_DANGER_THRESHOLD private val latin1Encoding = Charsets.ISO_8859_1 private val desiredChunkTypes: Set<PngChunkType> = hashSetOf( diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt index 4be65a348..28115aa14 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/SafeXmpReader.kt @@ -48,7 +48,7 @@ class SafeXmpReader : XmpReader() { extendedXMPBuffer?.let { xmpBytes -> val totalSize = xmpBytes.size - if (totalSize > segmentTypeSizeDangerThreshold) { + if (totalSize > SEGMENT_TYPE_SIZE_DANGER_THRESHOLD) { logError(metadata, totalSize) } else { extract(xmpBytes, metadata) @@ -111,7 +111,7 @@ class SafeXmpReader : XmpReader() { val chunkOffset = reader.uInt32.toInt() if (extendedXMPBuffer == null) { // TLAD insert start - if (fullLength > segmentTypeSizeDangerThreshold) { + if (fullLength > SEGMENT_TYPE_SIZE_DANGER_THRESHOLD) { logError(metadata, fullLength) return null } @@ -147,7 +147,7 @@ class SafeXmpReader : XmpReader() { private val LOG_TAG = LogUtils.createTag<SafeXmpReader>() // arbitrary size to detect extended XMP that may yield an OOM - const val segmentTypeSizeDangerThreshold = 3 * (1 shl 20) // MB + const val SEGMENT_TYPE_SIZE_DANGER_THRESHOLD = 3 * (1 shl 20) // MB // tighter node limits for faster loading val PARSE_OPTIONS: ParseOptions = ParseOptions().setXMPNodesToLimit( diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt index 8a07860de..e1893729b 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt @@ -14,6 +14,9 @@ object BitmapUtils { private val LOG_TAG = LogUtils.createTag<BitmapUtils>() private const val INITIAL_BUFFER_SIZE = 2 shl 17 // 256kB + // arbitrary size to detect buffer that may yield an OOM + private const val BUFFER_SIZE_DANGER_THRESHOLD = 10 * (1 shl 20) // MB + private val freeBaos = ArrayList<ByteArrayOutputStream>() private val mutex = Mutex() @@ -39,6 +42,15 @@ object BitmapUtils { this.compress(Bitmap.CompressFormat.JPEG, quality, stream) } if (recycle) this.recycle() + + val bufferSize = stream.size() + if (bufferSize > BUFFER_SIZE_DANGER_THRESHOLD) { + val availHeapSize = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) } + if (bufferSize > availHeapSize) { + throw Exception("compressed bitmap to $bufferSize bytes, which cannot be allocated to a new byte array, with only $availHeapSize free bytes") + } + } + val byteArray = stream.toByteArray() stream.reset() mutex.withLock { @@ -59,7 +71,7 @@ object BitmapUtils { } fun centerSquareCrop(context: Context, bitmap: Bitmap?, size: Int): Bitmap? { - bitmap ?: return bitmap + bitmap ?: return null return TransformationUtils.centerCrop(getBitmapPool(context), bitmap, size, size) } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/ContextUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/ContextUtils.kt index 0dd235137..a0683f388 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/ContextUtils.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/ContextUtils.kt @@ -24,7 +24,7 @@ object ContextUtils { } fun Context.isMyServiceRunning(serviceClass: Class<out Service>): Boolean { - val am = this.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager? + val am = this.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager am ?: return false @Suppress("deprecation") return am.getRunningServices(Integer.MAX_VALUE).any { it.service.className == serviceClass.name } From 7d05fb6aefa88bc0fa4c2687c18e602d3fe42abf Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Mon, 7 Nov 2022 22:02:27 +0100 Subject: [PATCH 38/53] safer svg parsing --- .../channel/calls/MediaFetchBytesHandler.kt | 2 + .../calls/fetchers/SvgRegionFetcher.kt | 15 ++++++++ .../thibault/aves/metadata/Metadata.kt | 10 ++--- .../thibault/aves/utils/BitmapUtils.kt | 6 +-- lib/image_providers/region_provider.dart | 7 ++-- lib/image_providers/uri_image_provider.dart | 7 +--- lib/model/entry_images.dart | 1 + lib/services/media/media_fetch_service.dart | 38 ++++++++++--------- .../metadata/svg_metadata_service.dart | 12 +++++- .../viewer/action/entry_action_delegate.dart | 9 ++++- lib/widgets/viewer/action/printer.dart | 10 +++-- 11 files changed, 77 insertions(+), 40 deletions(-) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt index 3a46e1e1e..4d99242ea 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt @@ -68,6 +68,7 @@ class MediaFetchBytesHandler(private val context: Context) : MethodCallHandler { val uri = call.argument<String>("uri")?.let { Uri.parse(it) } val mimeType = call.argument<String>("mimeType") val pageId = call.argument<Int>("pageId") + val sizeBytes = call.argument<Number>("sizeBytes")?.toLong() val sampleSize = call.argument<Int>("sampleSize") val x = call.argument<Int>("regionX") val y = call.argument<Int>("regionY") @@ -85,6 +86,7 @@ class MediaFetchBytesHandler(private val context: Context) : MethodCallHandler { when (mimeType) { MimeTypes.SVG -> SvgRegionFetcher(context).fetch( uri = uri, + sizeBytes = sizeBytes, regionRect = regionRect, imageWidth = imageWidth, imageHeight = imageHeight, diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt index c8acbd44a..d09a6aa7e 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt @@ -23,11 +23,21 @@ class SvgRegionFetcher internal constructor( suspend fun fetch( uri: Uri, + sizeBytes: Long?, regionRect: Rect, imageWidth: Int, imageHeight: Int, result: MethodChannel.Result, ) { + if (sizeBytes != null && sizeBytes > FILE_SIZE_DANGER_THRESHOLD) { + val availableHeapSize = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) } + if (sizeBytes > availableHeapSize) { + // opening an SVG that large would yield an OOM during parsing from `com.caverock.androidsvg.SVGParser` + result.error("fetch-read-large", "SVG too large at $sizeBytes bytes, with only $availableHeapSize free bytes, for uri=$uri regionRect=$regionRect", null) + return + } + } + var currentSvgRef = lastSvgRef if (currentSvgRef != null && currentSvgRef.uri != uri) { currentSvgRef = null @@ -103,4 +113,9 @@ class SvgRegionFetcher internal constructor( val uri: Uri, val svg: SVG, ) + + companion object { + // arbitrary size to detect files that may yield an OOM + private const val FILE_SIZE_DANGER_THRESHOLD = 10 * (1 shl 20) // MB + } } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt index 8a2952972..54ac83280 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt @@ -117,16 +117,16 @@ object Metadata { return date.time + parseSubSecond(subSecond) } - // opening large PSD/TIFF files yields an OOM (both with `metadata-extractor` v2.15.0 and `ExifInterface` v1.3.1), + // Opening large PSD/TIFF files yields an OOM (both with `metadata-extractor` v2.15.0 and `ExifInterface` v1.3.1), // so we define an arbitrary threshold to avoid a crash on launch. // It is not clear whether it is because of the file itself or its metadata. - private const val fileSizeBytesMax = 100 * (1 shl 20) // MB + private const val FILE_SIZE_MAX = 100 * (1 shl 20) // MB - fun isDangerouslyLarge(sizeBytes: Long?) = sizeBytes == null || sizeBytes > fileSizeBytesMax + fun isDangerouslyLarge(sizeBytes: Long?) = sizeBytes == null || sizeBytes > FILE_SIZE_MAX // we try and read metadata from large files by copying an arbitrary amount from its beginning // to a temporary file, and reusing that preview file for all metadata reading purposes - private const val previewSize: Long = 5 * (1 shl 20) // MB + private const val PREVIEW_SIZE: Long = 5 * (1 shl 20) // MB private val previewFiles = HashMap<Uri, File>() @@ -159,7 +159,7 @@ object Metadata { fun createPreviewFile(context: Context, uri: Uri): File { return File.createTempFile("aves", null, context.cacheDir).apply { deleteOnExit() - transferFrom(StorageUtils.openInputStream(context, uri), previewSize) + transferFrom(StorageUtils.openInputStream(context, uri), PREVIEW_SIZE) } } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt index e1893729b..d4a7dfd2d 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt @@ -45,9 +45,9 @@ object BitmapUtils { val bufferSize = stream.size() if (bufferSize > BUFFER_SIZE_DANGER_THRESHOLD) { - val availHeapSize = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) } - if (bufferSize > availHeapSize) { - throw Exception("compressed bitmap to $bufferSize bytes, which cannot be allocated to a new byte array, with only $availHeapSize free bytes") + val availableHeapSize = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) } + if (bufferSize > availableHeapSize) { + throw Exception("compressed bitmap to $bufferSize bytes, which cannot be allocated to a new byte array, with only $availableHeapSize free bytes") } } diff --git a/lib/image_providers/region_provider.dart b/lib/image_providers/region_provider.dart index fbb78fbda..135215324 100644 --- a/lib/image_providers/region_provider.dart +++ b/lib/image_providers/region_provider.dart @@ -42,6 +42,7 @@ class RegionProvider extends ImageProvider<RegionProviderKey> { key.region, key.imageSize, pageId: pageId, + sizeBytes: key.sizeBytes, taskKey: key, ); if (bytes.isEmpty) { @@ -70,7 +71,7 @@ class RegionProviderKey extends Equatable { // do not store the entry as it is, because the key should be constant // but the entry attributes may change over time final String uri, mimeType; - final int? pageId; + final int? pageId, sizeBytes; final int rotationDegrees, sampleSize; final bool isFlipped; final Rectangle<int> region; @@ -83,13 +84,11 @@ class RegionProviderKey extends Equatable { required this.uri, required this.mimeType, required this.pageId, + required this.sizeBytes, required this.rotationDegrees, required this.isFlipped, required this.sampleSize, required this.region, required this.imageSize, }); - - @override - String toString() => '$runtimeType#${shortHash(this)}{uri=$uri, mimeType=$mimeType, pageId=$pageId, rotationDegrees=$rotationDegrees, isFlipped=$isFlipped, sampleSize=$sampleSize, region=$region, imageSize=$imageSize}'; } diff --git a/lib/image_providers/uri_image_provider.dart b/lib/image_providers/uri_image_provider.dart index 1d1e3c578..ffcb622f7 100644 --- a/lib/image_providers/uri_image_provider.dart +++ b/lib/image_providers/uri_image_provider.dart @@ -52,8 +52,8 @@ class UriImage extends ImageProvider<UriImage> with EquatableMixin { final bytes = await mediaFetchService.getImage( uri, mimeType, - rotationDegrees, - isFlipped, + rotationDegrees: rotationDegrees, + isFlipped: isFlipped, pageId: pageId, sizeBytes: sizeBytes, onBytesReceived: (cumulative, total) { @@ -76,7 +76,4 @@ class UriImage extends ImageProvider<UriImage> with EquatableMixin { unawaited(chunkEvents.close()); } } - - @override - String toString() => '$runtimeType#${shortHash(this)}{uri=$uri, mimeType=$mimeType, rotationDegrees=$rotationDegrees, isFlipped=$isFlipped, pageId=$pageId, scale=$scale}'; } diff --git a/lib/model/entry_images.dart b/lib/model/entry_images.dart index 256770f66..95a3e24a4 100644 --- a/lib/model/entry_images.dart +++ b/lib/model/entry_images.dart @@ -34,6 +34,7 @@ extension ExtraAvesEntryImages on AvesEntry { uri: uri, mimeType: mimeType, pageId: pageId, + sizeBytes: sizeBytes, rotationDegrees: rotationDegrees, isFlipped: isFlipped, sampleSize: sampleSize, diff --git a/lib/services/media/media_fetch_service.dart b/lib/services/media/media_fetch_service.dart index c3d13a55d..a746e4de5 100644 --- a/lib/services/media/media_fetch_service.dart +++ b/lib/services/media/media_fetch_service.dart @@ -17,17 +17,17 @@ abstract class MediaFetchService { Future<Uint8List> getSvg( String uri, String mimeType, { - int? expectedContentLength, + required int? sizeBytes, BytesReceivedCallback? onBytesReceived, }); Future<Uint8List> getImage( String uri, - String mimeType, - int? rotationDegrees, - bool isFlipped, { - int? pageId, - int? sizeBytes, + String mimeType, { + required int? rotationDegrees, + required bool isFlipped, + required int? pageId, + required int? sizeBytes, BytesReceivedCallback? onBytesReceived, }); @@ -40,7 +40,8 @@ abstract class MediaFetchService { int sampleSize, Rectangle<int> regionRect, Size imageSize, { - int? pageId, + required int? pageId, + required int? sizeBytes, Object? taskKey, int? priority, }); @@ -93,26 +94,27 @@ class PlatformMediaFetchService implements MediaFetchService { Future<Uint8List> getSvg( String uri, String mimeType, { - int? expectedContentLength, + required int? sizeBytes, BytesReceivedCallback? onBytesReceived, }) => getImage( uri, mimeType, - 0, - false, - sizeBytes: expectedContentLength, + rotationDegrees: 0, + isFlipped: false, + pageId: null, + sizeBytes: sizeBytes, onBytesReceived: onBytesReceived, ); @override Future<Uint8List> getImage( String uri, - String mimeType, - int? rotationDegrees, - bool isFlipped, { - int? pageId, - int? sizeBytes, + String mimeType, { + required int? rotationDegrees, + required bool isFlipped, + required int? pageId, + required int? sizeBytes, BytesReceivedCallback? onBytesReceived, }) async { try { @@ -166,7 +168,8 @@ class PlatformMediaFetchService implements MediaFetchService { int sampleSize, Rectangle<int> regionRect, Size imageSize, { - int? pageId, + required int? pageId, + required int? sizeBytes, Object? taskKey, int? priority, }) { @@ -176,6 +179,7 @@ class PlatformMediaFetchService implements MediaFetchService { final result = await _platformBytes.invokeMethod('getRegion', <String, dynamic>{ 'uri': uri, 'mimeType': mimeType, + 'sizeBytes': sizeBytes, 'pageId': pageId, 'sampleSize': sampleSize, 'regionX': regionRect.left, diff --git a/lib/services/metadata/svg_metadata_service.dart b/lib/services/metadata/svg_metadata_service.dart index 50c6b8cb9..a792ef028 100644 --- a/lib/services/metadata/svg_metadata_service.dart +++ b/lib/services/metadata/svg_metadata_service.dart @@ -17,7 +17,11 @@ class SvgMetadataService { static Future<Size?> getSize(AvesEntry entry) async { try { - final data = await mediaFetchService.getSvg(entry.uri, entry.mimeType); + final data = await mediaFetchService.getSvg( + entry.uri, + entry.mimeType, + sizeBytes: entry.sizeBytes, + ); final document = XmlDocument.parse(utf8.decode(data)); final root = document.rootElement; @@ -63,7 +67,11 @@ class SvgMetadataService { } try { - final data = await mediaFetchService.getSvg(entry.uri, entry.mimeType); + final data = await mediaFetchService.getSvg( + entry.uri, + entry.mimeType, + sizeBytes: entry.sizeBytes, + ); final document = XmlDocument.parse(utf8.decode(data)); final root = document.rootElement; diff --git a/lib/widgets/viewer/action/entry_action_delegate.dart b/lib/widgets/viewer/action/entry_action_delegate.dart index 2dc018b92..439c06405 100644 --- a/lib/widgets/viewer/action/entry_action_delegate.dart +++ b/lib/widgets/viewer/action/entry_action_delegate.dart @@ -335,7 +335,14 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix MaterialPageRoute( settings: const RouteSettings(name: SourceViewerPage.routeName), builder: (context) => SourceViewerPage( - loader: () => mediaFetchService.getSvg(entry.uri, entry.mimeType).then(utf8.decode), + loader: () async { + final data = await mediaFetchService.getSvg( + entry.uri, + entry.mimeType, + sizeBytes: entry.sizeBytes, + ); + return utf8.decode(data); + }, ), ), ); diff --git a/lib/widgets/viewer/action/printer.dart b/lib/widgets/viewer/action/printer.dart index 7e8b9b4be..27f8a80ac 100644 --- a/lib/widgets/viewer/action/printer.dart +++ b/lib/widgets/viewer/action/printer.dart @@ -74,9 +74,13 @@ class EntryPrinter with FeedbackMixin { Future<pdf.Widget?> _buildPageImage(AvesEntry entry) async { if (entry.isSvg) { - final bytes = await mediaFetchService.getSvg(entry.uri, entry.mimeType); - if (bytes.isNotEmpty) { - return pdf.SvgImage(svg: utf8.decode(bytes)); + final data = await mediaFetchService.getSvg( + entry.uri, + entry.mimeType, + sizeBytes: entry.sizeBytes, + ); + if (data.isNotEmpty) { + return pdf.SvgImage(svg: utf8.decode(data)); } } else { return pdf.Image(await flutterImageProvider(entry.uriImage)); From 5e622271fda47b41d3c43ba03db8c4c469010677 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Mon, 7 Nov 2022 22:44:54 +0100 Subject: [PATCH 39/53] safer image streaming --- .../calls/fetchers/SvgRegionFetcher.kt | 17 ++++------- .../channel/streams/ImageByteStreamHandler.kt | 28 +++++++++++++++---- .../thibault/aves/utils/BitmapUtils.kt | 9 ++---- .../thibault/aves/utils/MemoryUtils.kt | 17 +++++++++++ 4 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt index d09a6aa7e..43a7aa081 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/SvgRegionFetcher.kt @@ -12,6 +12,7 @@ import com.caverock.androidsvg.SVG import com.caverock.androidsvg.SVGParseException import deckers.thibault.aves.metadata.SvgHelper.normalizeSize import deckers.thibault.aves.utils.BitmapUtils.getBytes +import deckers.thibault.aves.utils.MemoryUtils import deckers.thibault.aves.utils.StorageUtils import io.flutter.plugin.common.MethodChannel import kotlin.math.ceil @@ -29,13 +30,10 @@ class SvgRegionFetcher internal constructor( imageHeight: Int, result: MethodChannel.Result, ) { - if (sizeBytes != null && sizeBytes > FILE_SIZE_DANGER_THRESHOLD) { - val availableHeapSize = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) } - if (sizeBytes > availableHeapSize) { - // opening an SVG that large would yield an OOM during parsing from `com.caverock.androidsvg.SVGParser` - result.error("fetch-read-large", "SVG too large at $sizeBytes bytes, with only $availableHeapSize free bytes, for uri=$uri regionRect=$regionRect", null) - return - } + if (!MemoryUtils.canAllocate(sizeBytes)) { + // opening an SVG that large would yield an OOM during parsing from `com.caverock.androidsvg.SVGParser` + result.error("fetch-read-large", "SVG too large at $sizeBytes bytes, for uri=$uri regionRect=$regionRect", null) + return } var currentSvgRef = lastSvgRef @@ -113,9 +111,4 @@ class SvgRegionFetcher internal constructor( val uri: Uri, val svg: SVG, ) - - companion object { - // arbitrary size to detect files that may yield an OOM - private const val FILE_SIZE_DANGER_THRESHOLD = 10 * (1 shl 20) // MB - } } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageByteStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageByteStreamHandler.kt index 2066e5035..2cf3654cc 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageByteStreamHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageByteStreamHandler.kt @@ -15,6 +15,7 @@ import deckers.thibault.aves.decoder.VideoThumbnail import deckers.thibault.aves.utils.BitmapUtils.applyExifOrientation import deckers.thibault.aves.utils.BitmapUtils.getBytes import deckers.thibault.aves.utils.LogUtils +import deckers.thibault.aves.utils.MemoryUtils import deckers.thibault.aves.utils.MimeTypes import deckers.thibault.aves.utils.MimeTypes.canDecodeWithFlutter import deckers.thibault.aves.utils.MimeTypes.isHeic @@ -97,18 +98,23 @@ class ImageByteStreamHandler(private val context: Context, private val arguments } if (isVideo(mimeType)) { - streamVideoByGlide(uri, mimeType) + streamVideoByGlide(uri, mimeType, sizeBytes) } else if (!canDecodeWithFlutter(mimeType, rotationDegrees, isFlipped)) { // decode exotic format on platform side, then encode it in portable format for Flutter streamImageByGlide(uri, pageId, mimeType, sizeBytes, rotationDegrees, isFlipped) } else { // to be decoded by Flutter - streamImageAsIs(uri, mimeType) + streamImageAsIs(uri, mimeType, sizeBytes) } endOfStream() } - private fun streamImageAsIs(uri: Uri, mimeType: String) { + private fun streamImageAsIs(uri: Uri, mimeType: String, sizeBytes: Long?) { + if (!MemoryUtils.canAllocate(sizeBytes)) { + error("streamImage-image-read-large", "original image too large at $sizeBytes bytes, for mimeType=$mimeType uri=$uri", null) + return + } + try { StorageUtils.openInputStream(context, uri)?.use { input -> streamBytes(input) } } catch (e: Exception) { @@ -144,7 +150,12 @@ class ImageByteStreamHandler(private val context: Context, private val arguments bitmap = applyExifOrientation(context, bitmap, rotationDegrees, isFlipped) } if (bitmap != null) { - success(bitmap.getBytes(MimeTypes.canHaveAlpha(mimeType), recycle = false)) + val bytes = bitmap.getBytes(MimeTypes.canHaveAlpha(mimeType), recycle = false) + if (MemoryUtils.canAllocate(sizeBytes)) { + success(bytes) + } else { + error("streamImage-image-decode-large", "decoded image too large at $sizeBytes bytes, for mimeType=$mimeType uri=$uri", null) + } } else { error("streamImage-image-decode-null", "failed to get image for mimeType=$mimeType uri=$uri", null) } @@ -155,7 +166,7 @@ class ImageByteStreamHandler(private val context: Context, private val arguments } } - private suspend fun streamVideoByGlide(uri: Uri, mimeType: String) { + private suspend fun streamVideoByGlide(uri: Uri, mimeType: String, sizeBytes: Long?) { val target = Glide.with(context) .asBitmap() .apply(glideOptions) @@ -165,7 +176,12 @@ class ImageByteStreamHandler(private val context: Context, private val arguments @Suppress("BlockingMethodInNonBlockingContext") val bitmap = target.get() if (bitmap != null) { - success(bitmap.getBytes(canHaveAlpha = false, recycle = false)) + val bytes = bitmap.getBytes(canHaveAlpha = false, recycle = false) + if (MemoryUtils.canAllocate(sizeBytes)) { + success(bytes) + } else { + error("streamImage-video-large", "decoded image too large at $sizeBytes bytes, for mimeType=$mimeType uri=$uri", null) + } } else { error("streamImage-video-null", "failed to get image for mimeType=$mimeType uri=$uri", null) } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt index d4a7dfd2d..9d51d4008 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/BitmapUtils.kt @@ -15,7 +15,7 @@ object BitmapUtils { private const val INITIAL_BUFFER_SIZE = 2 shl 17 // 256kB // arbitrary size to detect buffer that may yield an OOM - private const val BUFFER_SIZE_DANGER_THRESHOLD = 10 * (1 shl 20) // MB + private const val BUFFER_SIZE_DANGER_THRESHOLD = 3 * (1 shl 20) // MB private val freeBaos = ArrayList<ByteArrayOutputStream>() private val mutex = Mutex() @@ -44,11 +44,8 @@ object BitmapUtils { if (recycle) this.recycle() val bufferSize = stream.size() - if (bufferSize > BUFFER_SIZE_DANGER_THRESHOLD) { - val availableHeapSize = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) } - if (bufferSize > availableHeapSize) { - throw Exception("compressed bitmap to $bufferSize bytes, which cannot be allocated to a new byte array, with only $availableHeapSize free bytes") - } + if (bufferSize > BUFFER_SIZE_DANGER_THRESHOLD && !MemoryUtils.canAllocate(bufferSize)) { + throw Exception("bitmap compressed to $bufferSize bytes, which cannot be allocated to a new byte array") } val byteArray = stream.toByteArray() diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt new file mode 100644 index 000000000..dc2a74859 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MemoryUtils.kt @@ -0,0 +1,17 @@ +package deckers.thibault.aves.utils + +import android.util.Log + +object MemoryUtils { + private val LOG_TAG = LogUtils.createTag<MemoryUtils>() + + fun canAllocate(byteSize: Number?): Boolean { + byteSize ?: return true + val availableHeapSize = Runtime.getRuntime().let { it.maxMemory() - (it.totalMemory() - it.freeMemory()) } + val danger = byteSize.toLong() > availableHeapSize + if (danger) { + Log.e(LOG_TAG, "trying to handle $byteSize bytes, with only $availableHeapSize free bytes") + } + return !danger + } +} \ No newline at end of file From 74a376aa8f91551d519db7c66b17170c0248c500 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Tue, 8 Nov 2022 21:26:44 +0100 Subject: [PATCH 40/53] fixed flavour scripts --- scripts/apply_flavor_huawei.sh | 2 +- scripts/apply_flavor_izzy.sh | 2 +- scripts/apply_flavor_play.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/apply_flavor_huawei.sh b/scripts/apply_flavor_huawei.sh index d8d4465ed..40092a785 100755 --- a/scripts/apply_flavor_huawei.sh +++ b/scripts/apply_flavor_huawei.sh @@ -3,7 +3,7 @@ if [ ! -d "scripts" ]; then cd .. fi -PUBSPEC_PATH="../pubspec.yaml" +PUBSPEC_PATH="pubspec.yaml" flutter clean diff --git a/scripts/apply_flavor_izzy.sh b/scripts/apply_flavor_izzy.sh index c0afcacf6..f1dc35d6f 100755 --- a/scripts/apply_flavor_izzy.sh +++ b/scripts/apply_flavor_izzy.sh @@ -3,7 +3,7 @@ if [ ! -d "scripts" ]; then cd .. fi -PUBSPEC_PATH="../pubspec.yaml" +PUBSPEC_PATH="pubspec.yaml" flutter clean diff --git a/scripts/apply_flavor_play.sh b/scripts/apply_flavor_play.sh index 7c7d54d87..4fc7620b6 100755 --- a/scripts/apply_flavor_play.sh +++ b/scripts/apply_flavor_play.sh @@ -3,7 +3,7 @@ if [ ! -d "scripts" ]; then cd .. fi -PUBSPEC_PATH="../pubspec.yaml" +PUBSPEC_PATH="pubspec.yaml" flutter clean From ea1f19fc9da6acb9de8f85f39bcb0a2887977e84 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Wed, 9 Nov 2022 10:07:29 +0100 Subject: [PATCH 41/53] geocoder existence check --- .../deckers/thibault/aves/channel/calls/DeviceHandler.kt | 2 ++ lib/model/availability.dart | 5 ++--- lib/model/device.dart | 5 ++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt index f9ca4d742..9f59bb879 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt @@ -3,6 +3,7 @@ package deckers.thibault.aves.channel.calls import android.content.Context import android.content.Intent import android.content.res.Resources +import android.location.Geocoder import android.net.Uri import android.os.Build import android.provider.MediaStore @@ -43,6 +44,7 @@ class DeviceHandler(private val context: Context) : MethodCallHandler { "canRenderFlagEmojis" to (sdkInt >= Build.VERSION_CODES.LOLLIPOP), "canRequestManageMedia" to (sdkInt >= Build.VERSION_CODES.S), "canSetLockScreenWallpaper" to (sdkInt >= Build.VERSION_CODES.N), + "hasGeocoder" to Geocoder.isPresent(), "isDynamicColorAvailable" to (sdkInt >= Build.VERSION_CODES.S), "showPinShortcutFeedback" to (sdkInt >= Build.VERSION_CODES.O), "supportEdgeToEdgeUIMode" to (sdkInt >= Build.VERSION_CODES.Q), diff --git a/lib/model/availability.dart b/lib/model/availability.dart index fb5446d6e..2661e2266 100644 --- a/lib/model/availability.dart +++ b/lib/model/availability.dart @@ -1,3 +1,4 @@ +import 'package:aves/model/device.dart'; import 'package:aves/model/settings/enums/map_style.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves_map/aves_map.dart'; @@ -40,10 +41,8 @@ class LiveAvesAvailability implements AvesAvailability { } } - // local geocoding with `geocoder` seems to require Google Play Services - // what about devices with Huawei Mobile Services? @override - Future<bool> get canLocatePlaces async => mobileServices.isServiceAvailable && await isConnected; + Future<bool> get canLocatePlaces async => device.hasGeocoder && await isConnected; @override List<EntryMapStyle> get mapStyles => [ diff --git a/lib/model/device.dart b/lib/model/device.dart index d599ab64f..6c508653a 100644 --- a/lib/model/device.dart +++ b/lib/model/device.dart @@ -6,7 +6,7 @@ final Device device = Device._private(); class Device { late final String _userAgent; late final bool _canGrantDirectoryAccess, _canPinShortcut, _canPrint, _canRenderFlagEmojis, _canRequestManageMedia, _canSetLockScreenWallpaper; - late final bool _isDynamicColorAvailable, _showPinShortcutFeedback, _supportEdgeToEdgeUIMode; + late final bool _hasGeocoder, _isDynamicColorAvailable, _showPinShortcutFeedback, _supportEdgeToEdgeUIMode; String get userAgent => _userAgent; @@ -22,6 +22,8 @@ class Device { bool get canSetLockScreenWallpaper => _canSetLockScreenWallpaper; + bool get hasGeocoder => _hasGeocoder; + bool get isDynamicColorAvailable => _isDynamicColorAvailable; bool get showPinShortcutFeedback => _showPinShortcutFeedback; @@ -41,6 +43,7 @@ class Device { _canRenderFlagEmojis = capabilities['canRenderFlagEmojis'] ?? false; _canRequestManageMedia = capabilities['canRequestManageMedia'] ?? false; _canSetLockScreenWallpaper = capabilities['canSetLockScreenWallpaper'] ?? false; + _hasGeocoder = capabilities['hasGeocoder'] ?? false; _isDynamicColorAvailable = capabilities['isDynamicColorAvailable'] ?? false; _showPinShortcutFeedback = capabilities['showPinShortcutFeedback'] ?? false; _supportEdgeToEdgeUIMode = capabilities['supportEdgeToEdgeUIMode'] ?? false; From da209ff1bc7ec9e4ce7328855eb21421f1fc037a Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Wed, 9 Nov 2022 14:57:39 +0100 Subject: [PATCH 42/53] minor fix --- android/app/build.gradle | 1 + .../aves/channel/calls/AnalysisHandler.kt | 7 +++++ lib/utils/constants.dart | 26 +++++++------------ 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 2a01cf432..3818aed2a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -168,6 +168,7 @@ dependencies { implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.exifinterface:exifinterface:1.3.5' + implementation 'androidx.lifecycle:lifecycle-process:2.5.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'com.caverock:androidsvg-aar:1.4' diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AnalysisHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AnalysisHandler.kt index 75fa2a306..1b38997c6 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AnalysisHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AnalysisHandler.kt @@ -9,6 +9,8 @@ import android.content.ServiceConnection import android.os.Build import android.os.IBinder import android.util.Log +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.ProcessLifecycleOwner import deckers.thibault.aves.AnalysisService import deckers.thibault.aves.AnalysisServiceBinder import deckers.thibault.aves.AnalysisServiceListener @@ -63,6 +65,11 @@ class AnalysisHandler(private val activity: Activity, private val onAnalysisComp .putExtra(AnalysisService.KEY_ENTRY_IDS, entryIds?.toIntArray()) .putExtra(AnalysisService.KEY_FORCE, force) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val appState = ProcessLifecycleOwner.get().lifecycle.currentState + if (!appState.isAtLeast(Lifecycle.State.STARTED)) { + result.error("startAnalysis-background", "cannot start foreground service from background", null) + return + } activity.startForegroundService(intent) } else { activity.startService(intent) diff --git a/lib/utils/constants.dart b/lib/utils/constants.dart index d1ccb2b34..de4ca5cfc 100644 --- a/lib/utils/constants.dart +++ b/lib/utils/constants.dart @@ -75,28 +75,16 @@ class Constants { static const String mit = 'MIT License'; static const List<Dependency> androidDependencies = [ - Dependency( - name: 'AndroidX Core-KTX', - license: apache2, - licenseUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/LICENSE.txt', - sourceUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/core/core-ktx', - ), - Dependency( - name: 'AndroidX Exifinterface', - license: apache2, - licenseUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/LICENSE.txt', - sourceUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/exifinterface/exifinterface', - ), Dependency( name: 'AndroidSVG', license: apache2, sourceUrl: 'https://github.com/BigBadaboom/androidsvg', ), Dependency( - name: 'Android-TiffBitmapFactory (Aves fork)', - license: mit, - licenseUrl: 'https://github.com/deckerst/Android-TiffBitmapFactory/blob/master/license.txt', - sourceUrl: 'https://github.com/deckerst/Android-TiffBitmapFactory', + name: 'AndroidX (Core Kotlin, Exifinterface, Lifecycle Process, Multidex)', + license: apache2, + licenseUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/LICENSE.txt', + sourceUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/core/core-ktx', ), Dependency( name: 'CWAC-Document', @@ -123,6 +111,12 @@ class Constants { license: eclipse1, sourceUrl: 'https://github.com/deckerst/pixymeta-android', ), + Dependency( + name: 'Tiff Bitmap Factory (Aves fork)', + license: mit, + licenseUrl: 'https://github.com/deckerst/Android-TiffBitmapFactory/blob/master/license.txt', + sourceUrl: 'https://github.com/deckerst/Android-TiffBitmapFactory', + ), ]; static const List<Dependency> _flutterPluginsCommon = [ From e76e49a54b487251e7e7db632e4cbe18de0fc9c4 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Wed, 9 Nov 2022 15:22:36 +0100 Subject: [PATCH 43/53] analysis service init fix --- lib/services/analysis_service.dart | 2 ++ plugins/aves_report_console/lib/aves_report_platform.dart | 2 +- test/fake/report_service.dart | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/services/analysis_service.dart b/lib/services/analysis_service.dart index 3118e2b44..22389e6dd 100644 --- a/lib/services/analysis_service.dart +++ b/lib/services/analysis_service.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:ui'; import 'package:aves/l10n/l10n.dart'; +import 'package:aves/model/device.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/analysis_controller.dart'; import 'package:aves/model/source/enums/enums.dart'; @@ -47,6 +48,7 @@ Future<void> _init() async { initPlatformServices(); await androidFileUtils.init(); await metadataDb.init(); + await device.init(); await mobileServices.init(); await settings.init(monitorPlatformSettings: false); FijkLog.setLevel(FijkLogLevel.Warn); diff --git a/plugins/aves_report_console/lib/aves_report_platform.dart b/plugins/aves_report_console/lib/aves_report_platform.dart index 3f1237d65..8cc4f1f81 100644 --- a/plugins/aves_report_console/lib/aves_report_platform.dart +++ b/plugins/aves_report_console/lib/aves_report_platform.dart @@ -11,7 +11,7 @@ class PlatformReportService extends ReportService { Future<void> log(String message) async => debugPrint('Report log with message=$message'); @override - Future<void> recordError(exception, StackTrace? stack) async => debugPrint('Report error with exception=$exception, stack=$stack'); + Future<void> recordError(dynamic exception, StackTrace? stack) async => debugPrint('Report error with exception=$exception, stack=$stack'); @override Future<void> recordFlutterError(FlutterErrorDetails flutterErrorDetails) async => debugPrint('Report Flutter error with details=$flutterErrorDetails'); diff --git a/test/fake/report_service.dart b/test/fake/report_service.dart index bead6f09b..898c9462c 100644 --- a/test/fake/report_service.dart +++ b/test/fake/report_service.dart @@ -21,7 +21,7 @@ class FakeReportService extends ReportService { Future<void> setCustomKeys(Map<String, Object> map) => SynchronousFuture(null); @override - Future<void> recordError(exception, StackTrace? stack) => SynchronousFuture(null); + Future<void> recordError(dynamic exception, StackTrace? stack) => SynchronousFuture(null); @override Future<void> recordFlutterError(FlutterErrorDetails flutterErrorDetails) => SynchronousFuture(null); From d224edfbcb58cd0ec20531745d4ab98224123f23 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Wed, 9 Nov 2022 19:55:02 +0100 Subject: [PATCH 44/53] #352 higher quality thumbnails --- CHANGELOG.md | 1 + .../deckers/thibault/aves/channel/calls/AppAdapterHandler.kt | 4 ++-- .../thibault/aves/channel/calls/MediaFetchBytesHandler.kt | 4 +++- .../thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt | 5 +++-- lib/services/media/media_fetch_service.dart | 1 + lib/widgets/about/bug_report.dart | 2 ++ 6 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72737e27e..290330685 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file. ### Changed +- higher quality thumbnails - upgraded Flutter to stable v3.3.7 ### Fixed diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt index 2ce5db3d5..63f941171 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/AppAdapterHandler.kt @@ -19,10 +19,10 @@ import com.bumptech.glide.Glide import com.bumptech.glide.load.DecodeFormat import com.bumptech.glide.request.RequestOptions import deckers.thibault.aves.MainActivity -import deckers.thibault.aves.MainActivity.Companion.EXTRA_STRING_ARRAY_SEPARATOR import deckers.thibault.aves.MainActivity.Companion.EXTRA_KEY_FILTERS_ARRAY import deckers.thibault.aves.MainActivity.Companion.EXTRA_KEY_FILTERS_STRING import deckers.thibault.aves.MainActivity.Companion.EXTRA_KEY_PAGE +import deckers.thibault.aves.MainActivity.Companion.EXTRA_STRING_ARRAY_SEPARATOR import deckers.thibault.aves.R import deckers.thibault.aves.channel.calls.Coresult.Companion.safe import deckers.thibault.aves.channel.calls.Coresult.Companion.safeSuspend @@ -159,7 +159,7 @@ class AppAdapterHandler(private val context: Context) : MethodCallHandler { .build() val options = RequestOptions() - .format(DecodeFormat.PREFER_RGB_565) + .format(DecodeFormat.PREFER_ARGB_8888) .override(size, size) val target = Glide.with(context) .asBitmap() diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt index 4d99242ea..2c96888b6 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFetchBytesHandler.kt @@ -42,8 +42,9 @@ class MediaFetchBytesHandler(private val context: Context) : MethodCallHandler { val heightDip = call.argument<Number>("heightDip")?.toDouble() val pageId = call.argument<Int>("pageId") val defaultSizeDip = call.argument<Number>("defaultSizeDip")?.toDouble() + val quality = call.argument<Int>("quality") - if (uri == null || mimeType == null || dateModifiedSecs == null || rotationDegrees == null || isFlipped == null || widthDip == null || heightDip == null || defaultSizeDip == null) { + if (uri == null || mimeType == null || dateModifiedSecs == null || rotationDegrees == null || isFlipped == null || widthDip == null || heightDip == null || defaultSizeDip == null || quality == null) { result.error("getThumbnail-args", "missing arguments", null) return } @@ -60,6 +61,7 @@ class MediaFetchBytesHandler(private val context: Context) : MethodCallHandler { height = (heightDip * density).roundToInt(), pageId = pageId, defaultSize = (defaultSizeDip * density).roundToInt(), + quality = quality, result = result, ).fetch() } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt index b518cd15a..3086708ad 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/fetchers/ThumbnailFetcher.kt @@ -39,6 +39,7 @@ class ThumbnailFetcher internal constructor( height: Int?, private val pageId: Int?, private val defaultSize: Int, + private val quality: Int, private val result: MethodChannel.Result, ) { private val uri: Uri = Uri.parse(uri) @@ -79,7 +80,7 @@ class ThumbnailFetcher internal constructor( } if (bitmap != null) { - result.success(bitmap.getBytes(MimeTypes.canHaveAlpha(mimeType), recycle = false)) + result.success(bitmap.getBytes(MimeTypes.canHaveAlpha(mimeType), recycle = false, quality = quality)) } else { var errorDetails: String? = exception?.message if (errorDetails?.isNotEmpty() == true) { @@ -119,7 +120,7 @@ class ThumbnailFetcher internal constructor( private fun getByGlide(): Bitmap? { // add signature to ignore cache for images which got modified but kept the same URI var options = RequestOptions() - .format(DecodeFormat.PREFER_RGB_565) + .format(if (quality == 100) DecodeFormat.PREFER_ARGB_8888 else DecodeFormat.PREFER_RGB_565) .signature(ObjectKey("$dateModifiedSecs-$rotationDegrees-$isFlipped-$width-$pageId")) .override(width, height) diff --git a/lib/services/media/media_fetch_service.dart b/lib/services/media/media_fetch_service.dart index a746e4de5..e50f161d8 100644 --- a/lib/services/media/media_fetch_service.dart +++ b/lib/services/media/media_fetch_service.dart @@ -227,6 +227,7 @@ class PlatformMediaFetchService implements MediaFetchService { 'heightDip': extent, 'pageId': pageId, 'defaultSizeDip': _thumbnailDefaultSize, + 'quality': 100, }); if (result != null) return result as Uint8List; } on PlatformException catch (e, stack) { diff --git a/lib/widgets/about/bug_report.dart b/lib/widgets/about/bug_report.dart index 027bc904a..8903e6a1e 100644 --- a/lib/widgets/about/bug_report.dart +++ b/lib/widgets/about/bug_report.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:aves/app_flavor.dart'; import 'package:aves/flutter_version.dart'; +import 'package:aves/model/device.dart'; import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/ref/mime_types.dart'; @@ -149,6 +150,7 @@ class _BugReportState extends State<BugReport> with FeedbackMixin { 'Android version: ${androidInfo.version.release} (SDK ${androidInfo.version.sdkInt})', 'Android build: ${androidInfo.display}', 'Device: ${androidInfo.manufacturer} ${androidInfo.model}', + 'Geocoder: ${device.hasGeocoder ? 'ready' : 'not available'}', 'Mobile services: ${mobileServices.isServiceAvailable ? 'ready' : 'not available'}', 'System locales: ${WidgetsBinding.instance.window.locales.join(', ')}', 'Aves locale: ${settings.locale ?? 'system'} -> ${settings.appliedLocale}', From acf4499538e72a18e2d9835914f8a3c4ee9b4c79 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Wed, 9 Nov 2022 19:56:45 +0100 Subject: [PATCH 45/53] l10n by weblate (#385) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: HiSubway <shenyusoftware@gmail.com> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Translator-3000 <weblate.m1d0h@8shield.net> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/es/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ru/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: HiSubway <shenyusoftware@gmail.com> Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Translator-3000 <weblate.m1d0h@8shield.net> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> --- .../android/zh-CN/full_description.txt | 2 +- lib/l10n/app_es.arb | 4 +- lib/l10n/app_it.arb | 14 +++- lib/l10n/app_ja.arb | 64 ++++++++++++++++++- lib/l10n/app_ru.arb | 6 +- 5 files changed, 84 insertions(+), 6 deletions(-) diff --git a/fastlane/metadata/android/zh-CN/full_description.txt b/fastlane/metadata/android/zh-CN/full_description.txt index 60e648f54..b8352fc7e 100644 --- a/fastlane/metadata/android/zh-CN/full_description.txt +++ b/fastlane/metadata/android/zh-CN/full_description.txt @@ -2,4 +2,4 @@ <b>导航与搜索</b>是 <i>Aves</i> 的核心功能之一,旨在帮助用户在相册、照片、标签、地图等之间轻松切换。 -<i> Aves</i> 与 Android(<b>API 19-33</b>,即从 KitKat 到 Android 13)集成,具有<b>快捷方式</b>和<b>全局搜索</b>等功能。它还可用作<b>媒体查看器和选择器</b>。 \ No newline at end of file +<i>Aves</i> 与 Android(<b>API 19-33</b>,即从 KitKat 到 Android 13)集成,具有<b>快捷方式</b>和<b>全局搜索</b>等功能。它还可用作<b>媒体查看器和选择器</b>。 \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 88923e586..1f9b8378e 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1154,5 +1154,7 @@ "tagPlaceholderPlace": "Lugar", "@tagPlaceholderPlace": {}, "tagEditorSectionPlaceholders": "Marcadores de la posición", - "@tagEditorSectionPlaceholders": {} + "@tagEditorSectionPlaceholders": {}, + "settingsAllowMediaManagement": "Permitir la gestión de medios", + "@settingsAllowMediaManagement": {} } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 58d252796..ec63e1b25 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -1144,5 +1144,17 @@ "filePickerUseThisFolder": "Usa questa cartella", "@filePickerUseThisFolder": {}, "durationDialogSeconds": "Secondi", - "@durationDialogSeconds": {} + "@durationDialogSeconds": {}, + "settingsAllowMediaManagement": "Consenti la gestione dei media", + "@settingsAllowMediaManagement": {}, + "tagEditorSectionPlaceholders": "Segnaposti", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "Paese", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Luogo", + "@tagPlaceholderPlace": {}, + "widgetOpenPageCollection": "Apri collezione", + "@widgetOpenPageCollection": {}, + "editEntryLocationDialogSetCustom": "Imposta posizione personalizzata", + "@editEntryLocationDialogSetCustom": {} } diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index d5edd97a1..127a348a2 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -1082,5 +1082,67 @@ "filePickerNoItems": "アイテムはありません", "@filePickerNoItems": {}, "filePickerUseThisFolder": "このフォルダを使用", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "entryInfoActionEditTitleDescription": "タイトルと説明を編集", + "@entryInfoActionEditTitleDescription": {}, + "filterNoDateLabel": "日付なし", + "@filterNoDateLabel": {}, + "filterNoTitleLabel": "タイトルなし", + "@filterNoTitleLabel": {}, + "filterRecentlyAddedLabel": "最近追加", + "@filterRecentlyAddedLabel": {}, + "viewerTransitionNone": "なし", + "@viewerTransitionNone": {}, + "widgetOpenPageViewer": "ビューワーを開く", + "@widgetOpenPageViewer": {}, + "durationDialogSeconds": "秒", + "@durationDialogSeconds": {}, + "viewDialogReverseSortOrder": "並び順を反転", + "@viewDialogReverseSortOrder": {}, + "tileLayoutMosaic": "モザイク", + "@tileLayoutMosaic": {}, + "sortOrderNewestFirst": "新しいものから表示", + "@sortOrderNewestFirst": {}, + "sortOrderOldestFirst": "古いものから表示", + "@sortOrderOldestFirst": {}, + "sortOrderAtoZ": "AからZ", + "@sortOrderAtoZ": {}, + "sortOrderHighestFirst": "高いものから表示", + "@sortOrderHighestFirst": {}, + "sortOrderLargestFirst": "大きいものから表示", + "@sortOrderLargestFirst": {}, + "searchMetadataSectionTitle": "メタデータ", + "@searchMetadataSectionTitle": {}, + "settingsSlideshowAnimatedZoomEffect": "アニメーション付きのズーム効果", + "@settingsSlideshowAnimatedZoomEffect": {}, + "settingsWidgetOpenPage": "ウィジェットをタップしたとき", + "@settingsWidgetOpenPage": {}, + "viewerInfoLabelDescription": "説明", + "@viewerInfoLabelDescription": {}, + "wallpaperUseScrollEffect": "ホーム画面でスクロール効果を使う", + "@wallpaperUseScrollEffect": {}, + "settingsAllowMediaManagement": "メディア管理を許可", + "@settingsAllowMediaManagement": {}, + "widgetOpenPageHome": "ホームを開く", + "@widgetOpenPageHome": {}, + "settingsDisabled": "無効", + "@settingsDisabled": {}, + "settingsViewerGestureSideTapNext": "画面の端をタップして進む/戻る", + "@settingsViewerGestureSideTapNext": {}, + "widgetOpenPageCollection": "コレクションを開く", + "@widgetOpenPageCollection": {}, + "sortOrderSmallestFirst": "小さいものから表示", + "@sortOrderSmallestFirst": {}, + "settingsConfirmationAfterMoveToBinItems": "ゴミ箱に移動したらメッセージを表示", + "@settingsConfirmationAfterMoveToBinItems": {}, + "tagPlaceholderPlace": "場所", + "@tagPlaceholderPlace": {}, + "tagEditorSectionPlaceholders": "プレースホルダー", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "国", + "@tagPlaceholderCountry": {}, + "sortOrderZtoA": "ZからA", + "@sortOrderZtoA": {}, + "sortOrderLowestFirst": "低いものから表示", + "@sortOrderLowestFirst": {} } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 543d5155e..31ee7d4f0 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -1151,8 +1151,10 @@ "@tagPlaceholderCountry": {}, "tagEditorSectionPlaceholders": "Закладки", "@tagEditorSectionPlaceholders": {}, - "tagPlaceholderPlace": "Место", + "tagPlaceholderPlace": "Локация", "@tagPlaceholderPlace": {}, "editEntryLocationDialogSetCustom": "Редактировать местоположение", - "@editEntryLocationDialogSetCustom": {} + "@editEntryLocationDialogSetCustom": {}, + "settingsAllowMediaManagement": "Разрешить управление медиа", + "@settingsAllowMediaManagement": {} } From 5fb04f8a29ee0bf390bcc67717f4d86b4d6b9e4a Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Wed, 9 Nov 2022 20:09:53 +0100 Subject: [PATCH 46/53] upgraded Flutter to stable v3.3.8 --- .github/workflows/check.yml | 2 +- .github/workflows/release.yml | 10 +++---- CHANGELOG.md | 2 +- pubspec.lock | 4 +-- shaders_3.3.7.sksl.json | 1 - shaders_3.3.8.sksl.json | 1 + untranslated.json | 50 +---------------------------------- 7 files changed, 11 insertions(+), 59 deletions(-) delete mode 100644 shaders_3.3.7.sksl.json create mode 100644 shaders_3.3.8.sksl.json diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 4ce7f7c64..863a59e00 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -17,7 +17,7 @@ jobs: # Available versions may lag behind https://github.com/flutter/flutter.git - uses: subosito/flutter-action@v2 with: - flutter-version: '3.3.7' + flutter-version: '3.3.8' channel: 'stable' - name: Clone the repository. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 550aaea91..116f899bf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: # Available versions may lag behind https://github.com/flutter/flutter.git - uses: subosito/flutter-action@v2 with: - flutter-version: '3.3.7' + flutter-version: '3.3.8' channel: 'stable' # Workaround for this Android Gradle Plugin issue (supposedly fixed in AGP 4.1): @@ -56,15 +56,15 @@ jobs: rm release.keystore.asc mkdir outputs (cd scripts/; ./apply_flavor_play.sh) - flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.7.sksl.json + flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.8.sksl.json cp build/app/outputs/bundle/playRelease/*.aab outputs - flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.7.sksl.json + flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.8.sksl.json cp build/app/outputs/apk/play/release/*.apk outputs (cd scripts/; ./apply_flavor_huawei.sh) - flutter build apk -t lib/main_huawei.dart --flavor huawei --bundle-sksl-path shaders_3.3.7.sksl.json + flutter build apk -t lib/main_huawei.dart --flavor huawei --bundle-sksl-path shaders_3.3.8.sksl.json cp build/app/outputs/apk/huawei/release/*.apk outputs (cd scripts/; ./apply_flavor_izzy.sh) - flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_3.3.7.sksl.json + flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_3.3.8.sksl.json cp build/app/outputs/apk/izzy/release/*.apk outputs rm $AVES_STORE_FILE env: diff --git a/CHANGELOG.md b/CHANGELOG.md index 290330685..1a5907353 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ All notable changes to this project will be documented in this file. ### Changed - higher quality thumbnails -- upgraded Flutter to stable v3.3.7 +- upgraded Flutter to stable v3.3.8 ### Fixed diff --git a/pubspec.lock b/pubspec.lock index 82e3ee82f..545314e92 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -352,7 +352,7 @@ packages: name: flutter_displaymode url: "https://pub.dartlang.org" source: hosted - version: "0.4.0" + version: "0.4.1" flutter_driver: dependency: "direct dev" description: flutter @@ -1235,7 +1235,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.1.1" wkt_parser: dependency: transitive description: diff --git a/shaders_3.3.7.sksl.json b/shaders_3.3.7.sksl.json deleted file mode 100644 index d9cbb4eed..000000000 --- a/shaders_3.3.7.sksl.json +++ /dev/null @@ -1 +0,0 @@ -{"platform":"android","name":"SM G970N","engineRevision":"857bd6b74c5eb56151bfafe91e7fa6a82b6fee25","data":{"HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGAARAGQWMHGBRIAAAAABQAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAB3QA6AAAEAAAAAAAMAAPEAEAAABAAAAAAB2AAAAAAACAAAAAEBSAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAA2BQAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzI7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MyOwppbiBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglhbHBoYSA9IDEuMCAtIGFscGhhOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CmhhbGY0IENpcmN1bGFyUlJlY3RfUzIoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MyLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MyLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzIueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCWhhbGY0IG91dHB1dF9TMjsKCW91dHB1dF9TMiA9IENpcmN1bGFyUlJlY3RfUzIob3V0cHV0X1MxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMjsKCX0KfQoAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAACEA2X4PLOGEAAAAAAAAACAAAAAVQQAAQAAAAAQCDIBCAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAEQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIAHSADQAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","B2ABSAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAKPABAAAAAAB2AAAAAAACAAAAAEBSAAAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAACzBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBmbG9hdDIgdWludlJhZGlpWFlfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBFbGxpcHRpY2FsUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CglmbG9hdDIgWiA9IGR4eSAqIHVpbnZSYWRpaVhZX1MxLnh5OwoJaGFsZiBpbXBsaWNpdCA9IGhhbGYoZG90KFosIGR4eSkgLSAxLjApOwoJaGFsZiBncmFkX2RvdCA9IGhhbGYoNC4wICogZG90KFosIFopKTsKCWdyYWRfZG90ID0gbWF4KGdyYWRfZG90LCAxLjBlLTQpOwoJaGFsZiBhcHByb3hfZGlzdCA9IGltcGxpY2l0ICogaGFsZihpbnZlcnNlc3FydChncmFkX2RvdCkpOwoJaGFsZiBhbHBoYSA9IGNsYW1wKDAuNSArIGFwcHJveF9kaXN0LCAwLjAsIDEuMCk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEVsbGlwdGljYWxSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAAAgBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdCB2Y292ZXJhZ2VfUzA7CmZsYXQgaW4gZmxvYXQ0IHZnZW9tU3Vic2V0X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAZCBRE4GNEACAAAOAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAAAHBQAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY2xlX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZiBkOwoJaWYgKGludCgzKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWQgPSBoYWxmKChsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSAtIDEuMCkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJZWxzZSAKCXsKCQlkID0gaGFsZigoMS4wIC0gbGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykpICogdWNpcmNsZV9TMS56KTsKCX0KCWlmIChpbnQoMykgPT0ga0ZpbGxBQV9TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCXJldHVybiBoYWxmNChfaW5wdXQgKiBzYXR1cmF0ZShkKSk7Cgl9CgllbHNlIAoJewoJCXJldHVybiBoYWxmNChkID4gMC41ID8gX2lucHV0IDogaGFsZjQoMC4wKSk7Cgl9Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZV9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAGIBIAAABAAAAANAEAAAAAAAAAAAAAABAAOAAAABAAAAAAABBAMAAAAA":"CQAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAAKAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIBAIAAAABLCIIBAAAAABAEGABBAMAACAIAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADhAwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CglyZXR1cm4gYmxlbmRfbW9kdWxhdGUoTWF0cml4RWZmZWN0X1MxX2MwKF9zcmMpLCBfc3JjKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEJsZW5kX1MxKG91dHB1dENvbG9yX1MwLCBoYWxmNCgxKSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAIAAEAAAABJYQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IGNsYW1wKHN1YnNldENvb3JkLngsIHVjbGFtcF9TMV9jMF9jMF9jMC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueik7CgljbGFtcGVkQ29vcmQueSA9IHN1YnNldENvb3JkLnk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAIAAQAAAAAQGIA":"CQAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAMAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBDbGFtcGVkR3JhZGllbnRfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSAoaGFsZjQoMS4wKSAtIG91dHB1dF9TMSkgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMABAAOAAAABAAAAAAABBAMAAA":"CQAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAACRAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0IHZjb3ZlcmFnZV9TMDsKZmxhdCBpbiBmbG9hdDQgdmdlb21TdWJzZXRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","AYTRVAADQAAAOAEARAFQJAABBADAAAILBYAACCYUQD777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlCwAAAGluQ2xpcFBsYW5lAAwAAABpbklzZWN0UGxhbmUBAAAAAAAAAA==","HTQAAGAABBYAAAEIXBAAAGEAMAAAAAAAAAAAAAAAQAHAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IACgAAAGluUXVhZEVkZ2UAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABZQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIBSQB5VRECGAEAAAMAAAAAAAAAAACAA4AAAACAAAAAAACCAYAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAABAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAIAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CQAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","B2AAQAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAoAAABpbkNvdmVyYWdlAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAEAQAAAAGQCBAMQACAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQAAEAQAAAAGQCBAMQAAAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzAueSwgdWNsYW1wX1MxX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAAEAQCAAAAAVREEAQAAAAAQCDAAQQGAABAEAAAAAAH4AQAAAAAEAAAAAQGIAAAAAAA":"CQAAAExTS1PfAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMCkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAEAFAAAjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfZnJhbWVidWZmZXJfZmV0Y2g6IHJlcXVpcmUKdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cmlub3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMF9jMC54eSwgdWNsYW1wX1MxX2MwX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKF9pbnB1dCk7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBNYXRyaXhFZmZlY3RfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYgU2hhZGVyCgkJaGFsZjQgX2RzdENvbG9yID0gc2tfRnJhZ0NvbG9yOwoJCXNrX0ZyYWdDb2xvciA9IGJsZW5kX3NyYyhvdXRwdXRfUzEsIF9kc3RDb2xvcik7CgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q292ZXJhZ2VfUzAgKiBza19GcmFnQ29sb3IgKyAoaGFsZjQoMS4wKSAtIG91dHB1dENvdmVyYWdlX1MwKSAqIF9kc3RDb2xvcjsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMADSAB4QAAAAAEAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CQAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAAB3AwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAAKAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","BYIBQAAABQAAIAABBYAAAEIXBAAP777777777777AAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAAAAIAAAABLAIABAAAAABAEGABBAMAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADOAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DASAAAAAQAAWAABAYAAQBYH7777Z6QQBAEAAAAAAEAAAAAAAEBSAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","EABQAAAAAEAAAAAQAABQAAIOAAABCFYIAAKAUDAAAAAAAAABAAAAAAAAAAANAAIAAAABAAAAACAJAAIAAAAA":"CQAAAExTS1OhAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgZmxvYXQyIHZJbnRUZXh0dXJlQ29vcmRzX1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIERpc3RhbmNlRmllbGRQYXRoCglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJdkludFRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkczsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8yX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGZsb2F0MiB2SW50VGV4dHVyZUNvb3Jkc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBEaXN0YW5jZUZpZWxkUGF0aAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQyIHV2ID0gdlRleHR1cmVDb29yZHNfUzA7CgloYWxmNCB0ZXhDb2xvcjsKCXsKCQl0ZXhDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLnJycnI7Cgl9CgloYWxmIGRpc3RhbmNlID0gNy45Njg3NSoodGV4Q29sb3IuciAtIDAuNTAxOTYwNzg0MzEpOwoJaGFsZiBhZndpZHRoOwoJYWZ3aWR0aCA9IGFicygwLjY1KmhhbGYoZEZkeCh2SW50VGV4dHVyZUNvb3Jkc19TMC54KSkpOwoJaGFsZiB2YWwgPSBzbW9vdGhzdGVwKC1hZndpZHRoLCBhZndpZHRoLCBkaXN0YW5jZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KHZhbCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGACQAGAAAAAQAAAAAAAQQGAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","GEMAAAYAAEHAAAARC4EAAAQWBQAAAAAAAAAQAAAAIBCAAAGQAEAAAAAQAAAABAEQAEAAAAA":"CQAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAOAAAAaW5TaGFkb3dQYXJhbXMAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAAAAEAAAABJYQAAAAAAAAIAAAAAWCBAAAABAAAAANAECAZAAAAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAAgFAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdUluY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmMiB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFsxM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgX2Nvb3Jkcyk7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChfaW5wdXQsIGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzApICogX2Nvb3Jkcy54eTEpOwp9CmhhbGY0IFNtb290aF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBjb29yZCwgaGFsZjIgb2Zmc2V0QW5kS2VybmVsKSAKewoJcmV0dXJuIE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChjb29yZCArIG9mZnNldEFuZEtlcm5lbC54ICogdUluY3JlbWVudF9TMV9jMCkpICogb2Zmc2V0QW5kS2VybmVsLnk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBjb2xvciA9IGhhbGY0KDApOwoJZmxvYXQyIGNvb3JkID0gdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cglmb3IgKGludCBpPTA7IGk8MTM7ICsraSkgCgl7CgkJY29sb3IgKz0gU21vb3RoX1MxX2MwKF9pbnB1dCwgY29vcmQsIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwW2ldKTsKCX0KCXJldHVybiBjb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","AYAA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAAA5AAAAAAABAAAAACAZAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgAAAABdAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEADZABYAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAADsAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADBAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAEwMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdCBkeDAgPSB1aW5uZXJSZWN0X1MxLkwgLSBza19GcmFnQ29vcmQueDsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgoZmxvYXQyKG1heChkeDAsIGR4eTEueCksIGR4eTEueSksIDAuMCk7CgloYWxmIHRvcEFscGhhID0gaGFsZihzYXR1cmF0ZShza19GcmFnQ29vcmQueSAtIHVpbm5lclJlY3RfUzEuVCkpOwoJaGFsZiBhbHBoYSA9IHRvcEFscGhhICogaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAABAEAAAABJYQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IHN1YnNldENvb3JkLng7CgljbGFtcGVkQ29vcmQueSA9IGNsYW1wKHN1YnNldENvb3JkLnksIHVjbGFtcF9TMV9jMF9jMF9jMC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAudyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA="}} \ No newline at end of file diff --git a/shaders_3.3.8.sksl.json b/shaders_3.3.8.sksl.json new file mode 100644 index 000000000..e3c39b48d --- /dev/null +++ b/shaders_3.3.8.sksl.json @@ -0,0 +1 @@ +{"platform":"android","name":"SM G970N","engineRevision":"857bd6b74c5eb56151bfafe91e7fa6a82b6fee25","data":{"AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","EABQAAAAAEAAAAAQAABQAAIOAAABCFYIAAKAUDAAAAAAAAABAAAAAAAAAAANAAIAAAABAAAAACAJAAIAAAAA":"CQAAAExTS1OhAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgZmxvYXQyIHZJbnRUZXh0dXJlQ29vcmRzX1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIERpc3RhbmNlRmllbGRQYXRoCglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJdkludFRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkczsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8yX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGZsb2F0MiB2SW50VGV4dHVyZUNvb3Jkc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBEaXN0YW5jZUZpZWxkUGF0aAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQyIHV2ID0gdlRleHR1cmVDb29yZHNfUzA7CgloYWxmNCB0ZXhDb2xvcjsKCXsKCQl0ZXhDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLnJycnI7Cgl9CgloYWxmIGRpc3RhbmNlID0gNy45Njg3NSoodGV4Q29sb3IuciAtIDAuNTAxOTYwNzg0MzEpOwoJaGFsZiBhZndpZHRoOwoJYWZ3aWR0aCA9IGFicygwLjY1KmhhbGYoZEZkeCh2SW50VGV4dHVyZUNvb3Jkc19TMC54KSkpOwoJaGFsZiB2YWwgPSBzbW9vdGhzdGVwKC1hZndpZHRoLCBhZndpZHRoLCBkaXN0YW5jZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KHZhbCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","B2AAQAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAoAAABpbkNvdmVyYWdlAAABAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAKPABAAAAAAB2AAAAAAACAAAAAEBSAAAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAACzBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBmbG9hdDIgdWludlJhZGlpWFlfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBFbGxpcHRpY2FsUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CglmbG9hdDIgWiA9IGR4eSAqIHVpbnZSYWRpaVhZX1MxLnh5OwoJaGFsZiBpbXBsaWNpdCA9IGhhbGYoZG90KFosIGR4eSkgLSAxLjApOwoJaGFsZiBncmFkX2RvdCA9IGhhbGYoNC4wICogZG90KFosIFopKTsKCWdyYWRfZG90ID0gbWF4KGdyYWRfZG90LCAxLjBlLTQpOwoJaGFsZiBhcHByb3hfZGlzdCA9IGltcGxpY2l0ICogaGFsZihpbnZlcnNlc3FydChncmFkX2RvdCkpOwoJaGFsZiBhbHBoYSA9IGNsYW1wKDAuNSArIGFwcHJveF9kaXN0LCAwLjAsIDEuMCk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEVsbGlwdGljYWxSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAAAAEAAAABJYQAAAAAAAAIAAAAAWCBAAAABAAAAANAECAZAAAAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAAgFAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdUluY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmMiB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFsxM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgX2Nvb3Jkcyk7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChfaW5wdXQsIGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzApICogX2Nvb3Jkcy54eTEpOwp9CmhhbGY0IFNtb290aF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBjb29yZCwgaGFsZjIgb2Zmc2V0QW5kS2VybmVsKSAKewoJcmV0dXJuIE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChjb29yZCArIG9mZnNldEFuZEtlcm5lbC54ICogdUluY3JlbWVudF9TMV9jMCkpICogb2Zmc2V0QW5kS2VybmVsLnk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBjb2xvciA9IGhhbGY0KDApOwoJZmxvYXQyIGNvb3JkID0gdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cglmb3IgKGludCBpPTA7IGk8MTM7ICsraSkgCgl7CgkJY29sb3IgKz0gU21vb3RoX1MxX2MwKF9pbnB1dCwgY29vcmQsIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwW2ldKTsKCX0KCXJldHVybiBjb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAAAgBAAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdCB2Y292ZXJhZ2VfUzA7CmZsYXQgaW4gZmxvYXQ0IHZnZW9tU3Vic2V0X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAuAIAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAABAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAIAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CQAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGAARAGQWMHGBRIAAAAABQAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HWQACAAAABAAADAAAIOAAAAADIIAAIRODAAP577774DSAIAA737777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1ONAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQgY292ZXJhZ2U7CmluIGhhbGY0IGNvbG9yOwppbiBmbG9hdDQgZ2VvbVN1YnNldDsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQgdmNvdmVyYWdlX1MwOwpmbGF0IG91dCBmbG9hdDQgdmdlb21TdWJzZXRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJdmdlb21TdWJzZXRfUzAgPSBnZW9tU3Vic2V0OwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAACRAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0IHZjb3ZlcmFnZV9TMDsKZmxhdCBpbiBmbG9hdDQgdmdlb21TdWJzZXRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWZsb2F0NCBnZW9TdWJzZXQ7CglnZW9TdWJzZXQgPSB2Z2VvbVN1YnNldF9TMDsKCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEsIDEsIC0xLCAtMSkgKiBoYWxmNChza19GcmFnQ29vcmQueHl4eSAtIGdlb1N1YnNldCksIDAsIDEpOwoJaGFsZjIgZGlzdHMyID0gZGlzdHM0Lnh5ICsgZGlzdHM0Lnp3IC0gMTsKCWhhbGYgc3Vic2V0Q292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJY292ZXJhZ2UgPSBtaW4oY292ZXJhZ2UsIHN1YnNldENvdmVyYWdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAcG9zaXRpb24IAAAAY292ZXJhZ2UFAAAAY29sb3IAAAAKAAAAZ2VvbVN1YnNldAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIAHSADQAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGACQAGAAAAAQAAAAAAAQQGAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","B2ABSAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAGIBIAAABAAAAANAEAAAAAAAAAAAAAABAAOAAAABAAAAAAABBAMAAAAA":"CQAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAAKAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAB3QA6AAAEAAAAAAAMAAPEAEAAABAAAAAAB2AAAAAAACAAAAAEBSAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAA2BQAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzI7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MyOwppbiBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglhbHBoYSA9IDEuMCAtIGFscGhhOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CmhhbGY0IENpcmN1bGFyUlJlY3RfUzIoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MyLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MyLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzIueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCWhhbGY0IG91dHB1dF9TMjsKCW91dHB1dF9TMiA9IENpcmN1bGFyUlJlY3RfUzIob3V0cHV0X1MxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMjsKCX0KfQoAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAAA5AAAAAAABAAAAACAZAAAAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgAAAABdAgAAZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAEQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEADZABYAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAADsAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjdWxhclJSZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWZsb2F0MiBkeHkwID0gdWlubmVyUmVjdF9TMS5MVCAtIHNrX0ZyYWdDb29yZC54eTsKCWZsb2F0MiBkeHkxID0gc2tfRnJhZ0Nvb3JkLnh5IC0gdWlubmVyUmVjdF9TMS5SQjsKCWZsb2F0MiBkeHkgPSBtYXgobWF4KGR4eTAsIGR4eTEpLCAwLjApOwoJaGFsZiBhbHBoYSA9IGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABAAAAHNrZXcZAAAAdHJhbnNsYXRlX2FuZF9sb2NhbHJvdGF0ZQAAAAUAAABjb2xvcgAAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQAAEAQAAAAGQCBAMQAAAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzAueSwgdWNsYW1wX1MxX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","DASAAAAAQAAWAABAYAAQBYH7777Z6QQBAEAAAAAAEAAAAAAAEBSAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAADwAAAGluVGV4dHVyZUNvb3JkcwABAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAACEA2X4PLOGEAAAAAAAAACAAAAAVQQAAQAAAAAQCDIBCAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CQAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAEAAAAAAAAA","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CQAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","AYAA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMABAAOAAAABAAAAAAABBAMAAA":"CQAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIBSQB5VRECGAEAAAMAAAAAAAAAAACAA4AAAACAAAAAAACCAYAA":"CQAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAMAAAEATAAABAIIGAAEDCBYQCA4AAAAAAEAZCBRE4GNEACAAAOAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CQAAAExTS1PUCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCByYWRpaV94OwppbiBmbG9hdDQgcmFkaWlfeTsKaW4gZmxvYXQ0IHNrZXc7CmluIGZsb2F0MiB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlOwppbiBoYWxmNCBjb2xvcjsKZmxhdCBvdXQgaGFsZjQgdmNvbG9yX1MwOwpvdXQgZmxvYXQyIHZhcmNjb29yZF9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7CglmbG9hdCBhYV9ibG9hdF9tdWx0aXBsaWVyID0gMTsKCWZsb2F0MiBjb3JuZXIgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnh5OwoJZmxvYXQyIHJhZGl1c19vdXRzZXQgPSBjb3JuZXJfYW5kX3JhZGl1c19vdXRzZXRzLnp3OwoJZmxvYXQyIGFhX2Jsb2F0X2RpcmVjdGlvbiA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS54eTsKCWZsb2F0IGlzX2xpbmVhcl9jb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS53OwoJZmxvYXQyIHBpeGVsbGVuZ3RoID0gaW52ZXJzZXNxcnQoZmxvYXQyKGRvdChza2V3Lnh6LCBza2V3Lnh6KSwgZG90KHNrZXcueXcsIHNrZXcueXcpKSk7CglmbG9hdDQgbm9ybWFsaXplZF9heGlzX2RpcnMgPSBza2V3ICogcGl4ZWxsZW5ndGgueHl4eTsKCWZsb2F0MiBheGlzd2lkdGhzID0gKGFicyhub3JtYWxpemVkX2F4aXNfZGlycy54eSkgKyBhYnMobm9ybWFsaXplZF9heGlzX2RpcnMuencpKTsKCWZsb2F0MiBhYV9ibG9hdHJhZGl1cyA9IGF4aXN3aWR0aHMgKiBwaXhlbGxlbmd0aCAqIC41OwoJZmxvYXQ0IHJhZGlpX2FuZF9uZWlnaGJvcnMgPSByYWRpaV9zZWxlY3RvciogZmxvYXQ0eDQocmFkaWlfeCwgcmFkaWlfeSwgcmFkaWlfeC55eHd6LCByYWRpaV95Lnd6eXgpOwoJZmxvYXQyIHJhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy54eTsKCWZsb2F0MiBuZWlnaGJvcl9yYWRpaSA9IHJhZGlpX2FuZF9uZWlnaGJvcnMuenc7CglmbG9hdCBjb3ZlcmFnZV9tdWx0aXBsaWVyID0gMTsKCWlmIChhbnkoZ3JlYXRlclRoYW4oYWFfYmxvYXRyYWRpdXMsIGZsb2F0MigxKSkpKSAKCXsKCQljb3JuZXIgPSBtYXgoYWJzKGNvcm5lciksIGFhX2Jsb2F0cmFkaXVzKSAqIHNpZ24oY29ybmVyKTsKCQljb3ZlcmFnZV9tdWx0aXBsaWVyID0gMSAvIChtYXgoYWFfYmxvYXRyYWRpdXMueCwgMSkgKiBtYXgoYWFfYmxvYXRyYWRpdXMueSwgMSkpOwoJCXJhZGlpID0gZmxvYXQyKDApOwoJfQoJZmxvYXQgY292ZXJhZ2UgPSBhYV9ibG9hdF9hbmRfY292ZXJhZ2UuejsKCWlmIChhbnkobGVzc1RoYW4ocmFkaWksIGFhX2Jsb2F0cmFkaXVzICogMS41KSkpIAoJewoJCXJhZGlpID0gZmxvYXQyKDApOwoJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IHNpZ24oY29ybmVyKTsKCQlpZiAoY292ZXJhZ2UgPiAuNSkgCgkJewoJCQlhYV9ibG9hdF9kaXJlY3Rpb24gPSAtYWFfYmxvYXRfZGlyZWN0aW9uOwoJCX0KCQlpc19saW5lYXJfY292ZXJhZ2UgPSAxOwoJfQoJZWxzZSAKCXsKCQlyYWRpaSA9IGNsYW1wKHJhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQluZWlnaGJvcl9yYWRpaSA9IGNsYW1wKG5laWdoYm9yX3JhZGlpLCBwaXhlbGxlbmd0aCAqIDEuNSwgMiAtIHBpeGVsbGVuZ3RoICogMS41KTsKCQlmbG9hdDIgc3BhY2luZyA9IDIgLSByYWRpaSAtIG5laWdoYm9yX3JhZGlpOwoJCWZsb2F0MiBleHRyYV9wYWQgPSBtYXgocGl4ZWxsZW5ndGggKiAuMDYyNSAtIHNwYWNpbmcsIGZsb2F0MigwKSk7CgkJcmFkaWkgLT0gZXh0cmFfcGFkICogLjU7Cgl9CglmbG9hdDIgYWFfb3V0c2V0ID0gYWFfYmxvYXRfZGlyZWN0aW9uICogYWFfYmxvYXRyYWRpdXMgKiBhYV9ibG9hdF9tdWx0aXBsaWVyOwoJZmxvYXQyIHZlcnRleHBvcyA9IGNvcm5lciArIHJhZGl1c19vdXRzZXQgKiByYWRpaSArIGFhX291dHNldDsKCWlmIChjb3ZlcmFnZSA+IC41KSAKCXsKCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnggIT0gMCAmJiB2ZXJ0ZXhwb3MueCAqIGNvcm5lci54IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy54KTsKCQkJdmVydGV4cG9zLnggPSAwOwoJCQl2ZXJ0ZXhwb3MueSArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueSkgKiBwaXhlbGxlbmd0aC55L3BpeGVsbGVuZ3RoLng7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci54KSAvIChhYnMoY29ybmVyLngpICsgYmFja3NldCkgKyAuNTsKCQl9CgkJaWYgKGFhX2Jsb2F0X2RpcmVjdGlvbi55ICE9IDAgJiYgdmVydGV4cG9zLnkgKiBjb3JuZXIueSA8IDApIAoJCXsKCQkJZmxvYXQgYmFja3NldCA9IGFicyh2ZXJ0ZXhwb3MueSk7CgkJCXZlcnRleHBvcy55ID0gMDsKCQkJdmVydGV4cG9zLnggKz0gYmFja3NldCAqIHNpZ24oY29ybmVyLngpICogcGl4ZWxsZW5ndGgueC9waXhlbGxlbmd0aC55OwoJCQljb3ZlcmFnZSA9IChjb3ZlcmFnZSAtIC41KSAqIGFicyhjb3JuZXIueSkgLyAoYWJzKGNvcm5lci55KSArIGJhY2tzZXQpICsgLjU7CgkJfQoJfQoJZmxvYXQyeDIgc2tld21hdHJpeCA9IGZsb2F0MngyKHNrZXcueHksIHNrZXcuencpOwoJZmxvYXQyIGRldmNvb3JkID0gdmVydGV4cG9zICogc2tld21hdHJpeCArIHRyYW5zbGF0ZV9hbmRfbG9jYWxyb3RhdGUueHk7CglpZiAoMCAhPSBpc19saW5lYXJfY292ZXJhZ2UpIAoJewoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MigwLCBjb3ZlcmFnZSAqIGNvdmVyYWdlX211bHRpcGxpZXIpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdDIgYXJjY29vcmQgPSAxIC0gYWJzKHJhZGl1c19vdXRzZXQpICsgYWFfb3V0c2V0L3JhZGlpICogY29ybmVyOwoJCXZhcmNjb29yZF9TMC54eSA9IGZsb2F0MihhcmNjb29yZC54KzEsIGFyY2Nvb3JkLnkpOwoJfQoJc2tfUG9zaXRpb24gPSBkZXZjb29yZC54eTAxOwp9CgEAAAAHBQAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY2xlX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZiBkOwoJaWYgKGludCgzKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWQgPSBoYWxmKChsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSAtIDEuMCkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJZWxzZSAKCXsKCQlkID0gaGFsZigoMS4wIC0gbGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykpICogdWNpcmNsZV9TMS56KTsKCX0KCWlmIChpbnQoMykgPT0ga0ZpbGxBQV9TMSB8fCBpbnQoMykgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCXJldHVybiBoYWxmNChfaW5wdXQgKiBzYXR1cmF0ZShkKSk7Cgl9CgllbHNlIAoJewoJCXJldHVybiBoYWxmNChkID4gMC41ID8gX2lucHV0IDogaGFsZjQoMC4wKSk7Cgl9Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEZpbGxSUmVjdE9wOjpQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCB4X3BsdXNfMT12YXJjY29vcmRfUzAueCwgeT12YXJjY29vcmRfUzAueTsKCWhhbGYgY292ZXJhZ2U7CglpZiAoMCA9PSB4X3BsdXNfMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKHkpOwoJfQoJZWxzZSAKCXsKCQlmbG9hdCBmbiA9IHhfcGx1c18xICogKHhfcGx1c18xIC0gMik7CgkJZm4gPSBmbWEoeSx5LCBmbik7CgkJZmxvYXQgZm53aWR0aCA9IGZ3aWR0aChmbik7CgkJY292ZXJhZ2UgPSAuNSAtIGhhbGYoZm4vZm53aWR0aCk7CgkJY292ZXJhZ2UgPSBjbGFtcChjb3ZlcmFnZSwgMCwgMSk7Cgl9CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGNvdmVyYWdlKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZV9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAEAAAAc2tldxkAAAB0cmFuc2xhdGVfYW5kX2xvY2Fscm90YXRlAAAABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAABAEAAAABJYQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IHN1YnNldENvb3JkLng7CgljbGFtcGVkQ29vcmQueSA9IGNsYW1wKHN1YnNldENvb3JkLnksIHVjbGFtcF9TMV9jMF9jMF9jMC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAudyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","BYIBQAAABQAAIAABBYAAAEIXBAAP777777777777AAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CQAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAAAAIAAAABLAIABAAAAABAEGABBAMAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADOAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABZQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HTQAAGAABBYAAAEIXBAAAGEAMAAAAAAAAAAAAAAAQAHAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IACgAAAGluUXVhZEVkZ2UAAAEAAAAAAAAA","AYTRVAADQAAAOAEARAFQJAABBADAAAILBYAACCYUQD777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CQAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlCwAAAGluQ2xpcFBsYW5lAAwAAABpbklzZWN0UGxhbmUBAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAEAQAAAAGQCBAMQACAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CQAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2UBAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAIAAEAAAABJYQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CQAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAEcGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1SW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGYyIHVPZmZzZXRzQW5kS2VybmVsX1MxX2MwWzEzXTsKdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglmbG9hdDIgaW5Db29yZCA9IF9jb29yZHM7CglmbG9hdDIgc3Vic2V0Q29vcmQ7CglzdWJzZXRDb29yZC54ID0gaW5Db29yZC54OwoJc3Vic2V0Q29vcmQueSA9IGluQ29vcmQueTsKCWZsb2F0MiBjbGFtcGVkQ29vcmQ7CgljbGFtcGVkQ29vcmQueCA9IGNsYW1wKHN1YnNldENvb3JkLngsIHVjbGFtcF9TMV9jMF9jMF9jMC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueik7CgljbGFtcGVkQ29vcmQueSA9IHN1YnNldENvb3JkLnk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBTbW9vdGhfUzFfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgY29vcmQsIGhhbGYyIG9mZnNldEFuZEtlcm5lbCkgCnsKCXJldHVybiBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCAoY29vcmQgKyBvZmZzZXRBbmRLZXJuZWwueCAqIHVJbmNyZW1lbnRfUzFfYzApKSAqIG9mZnNldEFuZEtlcm5lbC55Owp9CmhhbGY0IEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgY29sb3IgPSBoYWxmNCgwKTsKCWZsb2F0MiBjb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgaT0wOyBpPDEzOyArK2kpIAoJewoJCWNvbG9yICs9IFNtb290aF9TMV9jMChfaW5wdXQsIGNvb3JkLCB1T2Zmc2V0c0FuZEtlcm5lbF9TMV9jMFtpXSk7Cgl9CglyZXR1cm4gY29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CQAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAAEAQCAAAAAVREEAQAAAAAQCDAAQQGAABAEAAAAAAH4AQAAAAAEAAAAAQGIAAAAAAA":"CQAAAExTS1PfAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMCkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAEAFAAAjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfZnJhbWVidWZmZXJfZmV0Y2g6IHJlcXVpcmUKdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cmlub3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMF9jMC54eSwgdWNsYW1wX1MxX2MwX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKF9pbnB1dCk7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBNYXRyaXhFZmZlY3RfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYgU2hhZGVyCgkJaGFsZjQgX2RzdENvbG9yID0gc2tfRnJhZ0NvbG9yOwoJCXNrX0ZyYWdDb2xvciA9IGJsZW5kX3NyYyhvdXRwdXRfUzEsIF9kc3RDb2xvcik7CgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q292ZXJhZ2VfUzAgKiBza19GcmFnQ29sb3IgKyAoaGFsZjQoMS4wKSAtIG91dHB1dENvdmVyYWdlX1MwKSAqIF9kc3RDb2xvcjsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAIAAQAAAAAQGIA":"CQAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAMAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBDbGFtcGVkR3JhZGllbnRfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSAoaGFsZjQoMS4wKSAtIG91dHB1dF9TMSkgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIBAIAAAABLCIIBAAAAABAEGABBAMAACAIAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CQAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADhAwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CglyZXR1cm4gYmxlbmRfbW9kdWxhdGUoTWF0cml4RWZmZWN0X1MxX2MwKF9zcmMpLCBfc3JjKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEJsZW5kX1MxKG91dHB1dENvbG9yX1MwLCBoYWxmNCgxKSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","GEMAAAYAAEHAAAARC4EAAAQWBQAAAAAAAAAQAAAAIBCAAAGQAEAAAAAQAAAABAEQAEAAAAA":"CQAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAOAAAAaW5TaGFkb3dQYXJhbXMAAAEAAAAAAAAA"}} \ No newline at end of file diff --git a/untranslated.json b/untranslated.json index 49894b809..684d75c5a 100644 --- a/untranslated.json +++ b/untranslated.json @@ -15,10 +15,6 @@ "tagPlaceholderPlace" ], - "es": [ - "settingsAllowMediaManagement" - ], - "fa": [ "appName", "welcomeMessage", @@ -1073,53 +1069,13 @@ "tagPlaceholderPlace" ], - "it": [ - "widgetOpenPageCollection", - "editEntryLocationDialogSetCustom", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - "ja": [ "chipActionFilterOut", "chipActionFilterIn", - "entryInfoActionEditTitleDescription", - "filterNoDateLabel", - "filterNoTitleLabel", - "filterRecentlyAddedLabel", - "viewerTransitionNone", - "widgetOpenPageHome", - "widgetOpenPageCollection", - "widgetOpenPageViewer", - "durationDialogSeconds", "editEntryLocationDialogSetCustom", - "viewDialogReverseSortOrder", - "tileLayoutMosaic", - "sortOrderNewestFirst", - "sortOrderOldestFirst", - "sortOrderAtoZ", - "sortOrderZtoA", - "sortOrderHighestFirst", - "sortOrderLowestFirst", - "sortOrderLargestFirst", - "sortOrderSmallestFirst", "albumGroupType", "albumMimeTypeMixed", - "searchMetadataSectionTitle", - "settingsDisabled", - "settingsConfirmationAfterMoveToBinItems", - "settingsViewerGestureSideTapNext", - "settingsSlideshowAnimatedZoomEffect", - "settingsAllowMediaManagement", - "settingsWidgetOpenPage", - "statsTopAlbumsSectionTitle", - "viewerInfoLabelDescription", - "wallpaperUseScrollEffect", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" + "statsTopAlbumsSectionTitle" ], "nb": [ @@ -1745,10 +1701,6 @@ "tagPlaceholderPlace" ], - "ru": [ - "settingsAllowMediaManagement" - ], - "tr": [ "chipActionFilterOut", "chipActionFilterIn", From ea3f587838dc066819b21c232ee90ffaf8701ae6 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Thu, 10 Nov 2022 11:16:36 +0100 Subject: [PATCH 47/53] l10n by weblate (#389) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: HiSubway <shenyusoftware@gmail.com> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Jan <weblate@jwh.anonaddy.com> Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Jonatas de Almeida Barros <ajonatas56@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Translator-3000 <weblate.m1d0h@8shield.net> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: metezd <itoldyouthat@protonmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/es/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ru/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: HiSubway <shenyusoftware@gmail.com> Co-authored-by: Jan <weblate@jwh.anonaddy.com> Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Jonatas de Almeida Barros <ajonatas56@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Translator-3000 <weblate.m1d0h@8shield.net> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: metezd <itoldyouthat@protonmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> --- lib/l10n/app_de.arb | 16 ++++++-- lib/l10n/app_nl.arb | 4 +- lib/l10n/app_pt.arb | 12 +++++- lib/l10n/app_ru.arb | 2 +- lib/l10n/app_tr.arb | 92 ++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 119 insertions(+), 7 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index b3cadec16..5ad78b042 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -347,7 +347,7 @@ "@binEntriesConfirmationDialogMessage": {}, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Sicher, dass dieses Element gelöscht werden soll?} other{Sicher, dass diese {count} Elemente gelöscht werden sollen?}}", "@deleteEntriesConfirmationDialogMessage": {}, - "moveUndatedConfirmationDialogMessage": "Einige Artikel haben kein Metadaten-Datum. Ihr aktuelles Datum wird durch diesen Vorgang zurückgesetzt, es sei denn, es wurde ein Metadaten-Datum festgelegt.", + "moveUndatedConfirmationDialogMessage": "Speichern Sie Artikeldaten, bevor Sie fortfahren?", "@moveUndatedConfirmationDialogMessage": {}, "moveUndatedConfirmationDialogSetDate": "Datum einstellen", "@moveUndatedConfirmationDialogSetDate": {}, @@ -515,7 +515,7 @@ "@aboutBugReportInstruction": {}, "aboutBugReportButton": "Bericht", "@aboutBugReportButton": {}, - "aboutCreditsSectionTitle": "Credits", + "aboutCreditsSectionTitle": "Kredite", "@aboutCreditsSectionTitle": {}, "aboutCreditsWorldAtlas1": "Diese Anwendung verwendet eine TopoJSON-Datei von", "@aboutCreditsWorldAtlas1": {}, @@ -1146,5 +1146,15 @@ "widgetOpenPageCollection": "Sammlung öffnen", "@widgetOpenPageCollection": {}, "durationDialogSeconds": "Sekunden", - "@durationDialogSeconds": {} + "@durationDialogSeconds": {}, + "settingsAllowMediaManagement": "Medienverwaltung zulassen", + "@settingsAllowMediaManagement": {}, + "tagEditorSectionPlaceholders": "Platzhalter", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "Land", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Ort", + "@tagPlaceholderPlace": {}, + "editEntryLocationDialogSetCustom": "Benutzerdefinierten Standort festlegen", + "@editEntryLocationDialogSetCustom": {} } diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 048e0b368..79aa36fdd 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -1136,5 +1136,7 @@ "filePickerNoItems": "Geen items", "@filePickerNoItems": {}, "filePickerUseThisFolder": "Deze map gebruiken", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "widgetOpenPageCollection": "Open verzameling", + "@widgetOpenPageCollection": {} } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 40190d034..cb89000bb 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -1146,5 +1146,15 @@ "widgetOpenPageCollection": "Abrir coleção", "@widgetOpenPageCollection": {}, "durationDialogSeconds": "Segundos", - "@durationDialogSeconds": {} + "@durationDialogSeconds": {}, + "settingsAllowMediaManagement": "Permitir gerenciamento de mídia", + "@settingsAllowMediaManagement": {}, + "tagEditorSectionPlaceholders": "Espaços reservados", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "País", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Lugar", + "@tagPlaceholderPlace": {}, + "editEntryLocationDialogSetCustom": "Definir local personalizado", + "@editEntryLocationDialogSetCustom": {} } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 31ee7d4f0..0bd6110e2 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -1139,7 +1139,7 @@ "@filePickerDoNotShowHiddenFiles": {}, "filePickerOpenFrom": "Открыть", "@filePickerOpenFrom": {}, - "filePickerNoItems": "Ничего нет.", + "filePickerNoItems": "Ничего нет", "@filePickerNoItems": {}, "filePickerUseThisFolder": "Использовать эту папку", "@filePickerUseThisFolder": {}, diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 9bd204037..d9f104472 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -1030,5 +1030,95 @@ "filePickerNoItems": "Öğe yok", "@filePickerNoItems": {}, "filePickerUseThisFolder": "Bu klasörü kullan", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "slideshowActionResume": "Sürdür", + "@slideshowActionResume": {}, + "filterNoTitleLabel": "İsimsiz", + "@filterNoTitleLabel": {}, + "filterOnThisDayLabel": "Bugün", + "@filterOnThisDayLabel": {}, + "filterRecentlyAddedLabel": "Son eklenen", + "@filterRecentlyAddedLabel": {}, + "viewerTransitionZoomIn": "Yakınlaştır", + "@viewerTransitionZoomIn": {}, + "widgetOpenPageHome": "Ana sayfayı aç", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "Koleksiyonu aç", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "Görüntüleyiciyi aç", + "@widgetOpenPageViewer": {}, + "tileLayoutMosaic": "Mozaik", + "@tileLayoutMosaic": {}, + "sortOrderNewestFirst": "Önce en yeni", + "@sortOrderNewestFirst": {}, + "sortOrderLowestFirst": "Önce en düşük", + "@sortOrderLowestFirst": {}, + "sortOrderLargestFirst": "Önce en büyük", + "@sortOrderLargestFirst": {}, + "settingsConfirmationAfterMoveToBinItems": "Öğeleri geri dönüşüm kutusuna taşıdıktan sonra mesaj göster", + "@settingsConfirmationAfterMoveToBinItems": {}, + "settingsViewerGestureSideTapNext": "Önceki/sonraki öğeyi göstermek için ekran kenarlarına dokunun", + "@settingsViewerGestureSideTapNext": {}, + "settingsSlideshowVideoPlaybackTile": "Video oynatma", + "@settingsSlideshowVideoPlaybackTile": {}, + "settingsSlideshowVideoPlaybackDialogTitle": "Video Oynatma", + "@settingsSlideshowVideoPlaybackDialogTitle": {}, + "slideshowActionShowInCollection": "Koleksiyonda göster", + "@slideshowActionShowInCollection": {}, + "entryInfoActionEditTitleDescription": "Başlık ve açıklamayı düzenle", + "@entryInfoActionEditTitleDescription": {}, + "filterNoDateLabel": "Tarihsiz", + "@filterNoDateLabel": {}, + "videoPlaybackSkip": "Atla", + "@videoPlaybackSkip": {}, + "videoPlaybackMuted": "Sessiz oynat", + "@videoPlaybackMuted": {}, + "videoPlaybackWithSound": "Ses ile oynat", + "@videoPlaybackWithSound": {}, + "viewerTransitionNone": "Hiçbiri", + "@viewerTransitionNone": {}, + "wallpaperTargetHome": "Ana ekran", + "@wallpaperTargetHome": {}, + "durationDialogSeconds": "Saniye", + "@durationDialogSeconds": {}, + "wallpaperTargetLock": "Kilit ekranı", + "@wallpaperTargetLock": {}, + "menuActionSlideshow": "Slayt gösterisi", + "@menuActionSlideshow": {}, + "wallpaperTargetHomeLock": "Ana ve kilit ekranları", + "@wallpaperTargetHomeLock": {}, + "sortOrderOldestFirst": "Önce en eski", + "@sortOrderOldestFirst": {}, + "sortOrderZtoA": "Z'den A'ya", + "@sortOrderZtoA": {}, + "sortOrderHighestFirst": "Önce en yüksek", + "@sortOrderHighestFirst": {}, + "albumGroupType": "Türe göre", + "@albumGroupType": {}, + "sortOrderAtoZ": "A'dan Z'ye", + "@sortOrderAtoZ": {}, + "sortOrderSmallestFirst": "Önce en küçük", + "@sortOrderSmallestFirst": {}, + "settingsSlideshowAnimatedZoomEffect": "Animasyonlu yakınlaştırma efekti", + "@settingsSlideshowAnimatedZoomEffect": {}, + "albumMimeTypeMixed": "Karışık", + "@albumMimeTypeMixed": {}, + "searchMetadataSectionTitle": "Üstveri", + "@searchMetadataSectionTitle": {}, + "settingsSlideshowFillScreen": "Ekranı doldur", + "@settingsSlideshowFillScreen": {}, + "settingsDisabled": "Devre dışı", + "@settingsDisabled": {}, + "editEntryLocationDialogSetCustom": "Özel konum ayarla", + "@editEntryLocationDialogSetCustom": {}, + "settingsViewerSlideshowTile": "Slayt gösterisi", + "@settingsViewerSlideshowTile": {}, + "settingsViewerSlideshowPageTitle": "Slayt gösterisi", + "@settingsViewerSlideshowPageTitle": {}, + "settingsSlideshowRepeat": "Tekrarla", + "@settingsSlideshowRepeat": {}, + "settingsSlideshowShuffle": "Karıştır", + "@settingsSlideshowShuffle": {}, + "settingsSlideshowTransitionTile": "Geçiş", + "@settingsSlideshowTransitionTile": {} } From 11975b3c6552ee9d08f8e85bcb411491073589e1 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Thu, 10 Nov 2022 13:16:12 +0100 Subject: [PATCH 48/53] l10n by weblate (#391) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: HiSubway <shenyusoftware@gmail.com> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Jan <weblate@jwh.anonaddy.com> Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Jonatas de Almeida Barros <ajonatas56@gmail.com> Co-authored-by: Koen Koppens <koenkoppens@proton.me> Co-authored-by: MeFinity <me.dot.finity@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Translator-3000 <weblate.m1d0h@8shield.net> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: metezd <itoldyouthat@protonmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/id/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/es/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ru/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: HiSubway <shenyusoftware@gmail.com> Co-authored-by: Jan <weblate@jwh.anonaddy.com> Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Jonatas de Almeida Barros <ajonatas56@gmail.com> Co-authored-by: Koen Koppens <koenkoppens@proton.me> Co-authored-by: MeFinity <me.dot.finity@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Translator-3000 <weblate.m1d0h@8shield.net> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: metezd <itoldyouthat@protonmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> --- .../metadata/android/nl/short_description.txt | 2 +- lib/l10n/app_id.arb | 48 +++++++++++++++++-- lib/l10n/app_nl.arb | 20 +++++++- lib/l10n/app_tr.arb | 38 ++++++++++++++- 4 files changed, 101 insertions(+), 7 deletions(-) diff --git a/fastlane/metadata/android/nl/short_description.txt b/fastlane/metadata/android/nl/short_description.txt index 8c9445bd5..368d9321b 100644 --- a/fastlane/metadata/android/nl/short_description.txt +++ b/fastlane/metadata/android/nl/short_description.txt @@ -1 +1 @@ -Gallery and metadata explorer \ No newline at end of file +Galerij en metagegevensverkenner \ No newline at end of file diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index aa6795688..56ac8fee7 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -257,7 +257,7 @@ "@nameConflictStrategySkip": {}, "keepScreenOnNever": "Jangan pernah", "@keepScreenOnNever": {}, - "keepScreenOnViewerOnly": "Hanya halaman penonton", + "keepScreenOnViewerOnly": "Hanya halaman penampil", "@keepScreenOnViewerOnly": {}, "keepScreenOnAlways": "Selalu", "@keepScreenOnAlways": {}, @@ -813,7 +813,7 @@ "@settingsCollectionBrowsingQuickActionEditorBanner": {}, "settingsCollectionSelectionQuickActionEditorBanner": "Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan saat memilih benda.", "@settingsCollectionSelectionQuickActionEditorBanner": {}, - "settingsViewerSectionTitle": "Penonton", + "settingsViewerSectionTitle": "Penampil", "@settingsViewerSectionTitle": {}, "settingsViewerGestureSideTapNext": "Ketuk tepi layar untuk menampilkan benda sebelumnya/berikutnya", "@settingsViewerGestureSideTapNext": {}, @@ -1029,7 +1029,7 @@ "@viewerErrorDoesNotExist": {}, "viewerInfoPageTitle": "Info", "@viewerInfoPageTitle": {}, - "viewerInfoBackToViewerTooltip": "Kembali ke penonton", + "viewerInfoBackToViewerTooltip": "Kembali ke penampil", "@viewerInfoBackToViewerTooltip": {}, "viewerInfoUnknown": "tidak dikenal", "@viewerInfoUnknown": {}, @@ -1116,5 +1116,45 @@ "filePickerNoItems": "Tidak ada benda", "@filePickerNoItems": {}, "filePickerUseThisFolder": "Gunakan folder ini", - "@filePickerUseThisFolder": {} + "@filePickerUseThisFolder": {}, + "viewerTransitionNone": "Tidak ada", + "@viewerTransitionNone": {}, + "widgetOpenPageHome": "Buka beranda", + "@widgetOpenPageHome": {}, + "widgetOpenPageCollection": "Buka koleksi", + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "Buka penampil", + "@widgetOpenPageViewer": {}, + "durationDialogSeconds": "Detik", + "@durationDialogSeconds": {}, + "tileLayoutMosaic": "Mosaik", + "@tileLayoutMosaic": {}, + "albumMimeTypeMixed": "Tercampur", + "@albumMimeTypeMixed": {}, + "settingsDisabled": "Nonaktif", + "@settingsDisabled": {}, + "settingsAllowMediaManagement": "Izinkan pengelolaan media", + "@settingsAllowMediaManagement": {}, + "statsTopAlbumsSectionTitle": "Album Teratas", + "@statsTopAlbumsSectionTitle": {}, + "albumGroupType": "Berdasarkan tipe", + "@albumGroupType": {}, + "settingsSlideshowAnimatedZoomEffect": "Efek zoom bergerak", + "@settingsSlideshowAnimatedZoomEffect": {}, + "chipActionFilterIn": "Filter masuk", + "@chipActionFilterIn": {}, + "wallpaperUseScrollEffect": "Gunakan efek scroll di layar beranda", + "@wallpaperUseScrollEffect": {}, + "tagPlaceholderCountry": "Negara", + "@tagPlaceholderCountry": {}, + "chipActionFilterOut": "Filter keluar", + "@chipActionFilterOut": {}, + "settingsWidgetOpenPage": "Saat mengetuk di sebuah widget", + "@settingsWidgetOpenPage": {}, + "tagEditorSectionPlaceholders": "Placeholder", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderPlace": "Tempat", + "@tagPlaceholderPlace": {}, + "editEntryLocationDialogSetCustom": "Terapkan lokasi kustom", + "@editEntryLocationDialogSetCustom": {} } diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 79aa36fdd..f17985f5d 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -1138,5 +1138,23 @@ "filePickerUseThisFolder": "Deze map gebruiken", "@filePickerUseThisFolder": {}, "widgetOpenPageCollection": "Open verzameling", - "@widgetOpenPageCollection": {} + "@widgetOpenPageCollection": {}, + "widgetOpenPageViewer": "Open voorbeeld", + "@widgetOpenPageViewer": {}, + "durationDialogSeconds": "Seconden", + "@durationDialogSeconds": {}, + "aboutLinkPolicy": "Privacybeleid", + "@aboutLinkPolicy": {}, + "policyPageTitle": "Privacybeleid", + "@policyPageTitle": {}, + "tagEditorSectionPlaceholders": "Aanduidingen", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "Land", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Plaats", + "@tagPlaceholderPlace": {}, + "settingsAllowMediaManagement": "Mediabeheer toestaan", + "@settingsAllowMediaManagement": {}, + "editEntryLocationDialogSetCustom": "Aangepaste locatie instellen", + "@editEntryLocationDialogSetCustom": {} } diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index d9f104472..acaba3651 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -1120,5 +1120,41 @@ "settingsSlideshowShuffle": "Karıştır", "@settingsSlideshowShuffle": {}, "settingsSlideshowTransitionTile": "Geçiş", - "@settingsSlideshowTransitionTile": {} + "@settingsSlideshowTransitionTile": {}, + "viewerTransitionFade": "Soldur", + "@viewerTransitionFade": {}, + "viewDialogReverseSortOrder": "Ters sıralama düzeni", + "@viewDialogReverseSortOrder": {}, + "settingsScreenSaverPageTitle": "Ekran Koruyucu", + "@settingsScreenSaverPageTitle": {}, + "settingsWidgetShowOutline": "Anahat", + "@settingsWidgetShowOutline": {}, + "statsTopAlbumsSectionTitle": "Öne Çıkan Albümler", + "@statsTopAlbumsSectionTitle": {}, + "viewerSetWallpaperButtonLabel": "DUVAR KAĞIDI AYARLA", + "@viewerSetWallpaperButtonLabel": {}, + "viewerInfoLabelDescription": "Açıklama", + "@viewerInfoLabelDescription": {}, + "wallpaperUseScrollEffect": "Ana ekranda kaydırma efektini kullan", + "@wallpaperUseScrollEffect": {}, + "settingsAllowMediaManagement": "Medya yönetimine izin ver", + "@settingsAllowMediaManagement": {}, + "tagEditorSectionPlaceholders": "Yer Tutucular", + "@tagEditorSectionPlaceholders": {}, + "tagPlaceholderCountry": "Ülke", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Yer", + "@tagPlaceholderPlace": {}, + "viewerTransitionSlide": "Kaydır", + "@viewerTransitionSlide": {}, + "viewerTransitionParallax": "Paralaks", + "@viewerTransitionParallax": {}, + "settingsWidgetOpenPage": "Widget'a dokunulduğunda", + "@settingsWidgetOpenPage": {}, + "settingsSlideshowIntervalTile": "Aralık", + "@settingsSlideshowIntervalTile": {}, + "chipActionFilterOut": "Dışarıda bırak", + "@chipActionFilterOut": {}, + "chipActionFilterIn": "İçeriye al", + "@chipActionFilterIn": {} } From 3cf1e0cdac6a616c3617d8ed90ffbeb8c4238fa6 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Thu, 10 Nov 2022 18:42:33 +0100 Subject: [PATCH 49/53] updated about translators --- lib/widgets/about/about_page.dart | 3 + lib/widgets/about/credits.dart | 26 +--- lib/widgets/about/translators.dart | 149 ++++++++++++++++++++ lib/widgets/common/basic/animated_text.dart | 6 +- untranslated.json | 118 ---------------- 5 files changed, 157 insertions(+), 145 deletions(-) create mode 100644 lib/widgets/about/translators.dart diff --git a/lib/widgets/about/about_page.dart b/lib/widgets/about/about_page.dart index 3766f7f82..b0aa49436 100644 --- a/lib/widgets/about/about_page.dart +++ b/lib/widgets/about/about_page.dart @@ -2,6 +2,7 @@ import 'package:aves/widgets/about/app_ref.dart'; import 'package:aves/widgets/about/bug_report.dart'; import 'package:aves/widgets/about/credits.dart'; import 'package:aves/widgets/about/licenses.dart'; +import 'package:aves/widgets/about/translators.dart'; import 'package:aves/widgets/common/basic/insets.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; @@ -35,6 +36,8 @@ class AboutPage extends StatelessWidget { Divider(), AboutCredits(), Divider(), + AboutTranslators(), + Divider(), ], ), ), diff --git a/lib/widgets/about/credits.dart b/lib/widgets/about/credits.dart index 52fb62b5c..4a5c6e059 100644 --- a/lib/widgets/about/credits.dart +++ b/lib/widgets/about/credits.dart @@ -1,26 +1,11 @@ import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/basic/link_chip.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; -import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; class AboutCredits extends StatelessWidget { const AboutCredits({super.key}); - static const translators = { - 'Bahasa Indonesia': 'MeFinity', - 'Deutsch': 'JanWaldhorn', - 'Español (México)': 'n-berenice', - 'Italiano': 'glemco', - 'Nederlands': 'Martijn Fabrie, Koen Koppens', - 'Português (Brasil)': 'Jonatas De Almeida Barros', - 'Türkçe': 'metezd', - 'Ελληνικά': 'Emmanouil Papavergis', - 'Русский': 'D3ZOXY, kha84', - '日本語': 'Maki', - '简体中文': '小默, Aerowolf', - }; - @override Widget build(BuildContext context) { final l10n = context.l10n; @@ -36,6 +21,7 @@ class AboutCredits extends StatelessWidget { child: Text(l10n.aboutCreditsSectionTitle, style: Constants.knownTitleTextStyle), ), ), + const SizedBox(height: 8), Text.rich( TextSpan( children: [ @@ -52,15 +38,7 @@ class AboutCredits extends StatelessWidget { ], ), ), - ConstrainedBox( - constraints: const BoxConstraints(minHeight: 48), - child: Align( - alignment: AlignmentDirectional.centerStart, - child: Text(l10n.aboutTranslatorsSectionTitle, style: Constants.knownTitleTextStyle), - ), - ), - const InfoRowGroup(info: translators), - const SizedBox(height: 16), + const SizedBox(height: 8), ], ), ); diff --git a/lib/widgets/about/translators.dart b/lib/widgets/about/translators.dart new file mode 100644 index 000000000..106558d94 --- /dev/null +++ b/lib/widgets/about/translators.dart @@ -0,0 +1,149 @@ +import 'dart:math'; + +import 'package:aves/utils/constants.dart'; +import 'package:aves/widgets/common/basic/animated_text.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class AboutTranslators extends StatelessWidget { + const AboutTranslators({super.key}); + + static const translators = { + Contributor('D3ZOXY', 'its.ghost.message@gmail.com'), + Contributor('JanWaldhorn', 'weblate@jwh.anonaddy.com'), + Contributor('n-berenice', null), + Contributor('Jonatas de Almeida Barros', 'ajonatas56@gmail.com'), + Contributor('MeFinity', 'me.dot.finity@gmail.com'), + Contributor('Maki', null), + Contributor('HiSubway', 'shenyusoftware@gmail.com'), + Contributor('glemco', null), + Contributor('Aerowolf', null), + Contributor('小默', null), + Contributor('metezd', 'itoldyouthat@protonmail.com'), + Contributor('Martijn Fabrie', null), + Contributor('Koen Koppens', 'koenkoppens@proton.me'), + Contributor('Emmanouil Papavergis', null), + Contributor('kha84', 'khalukhin@gmail.com'), + Contributor('gallegonovato', 'fran-carro@hotmail.es'), + Contributor('Havokdan', 'havokdan@yahoo.com.br'), + Contributor('Jean Mareilles', 'waged1266@tutanota.com'), + Contributor('이정희', 'daemul72@gmail.com'), + Contributor('Translator-3000', 'weblate.m1d0h@8shield.net'), + // Contributor('Allan Nordhøy', 'epost@anotheragency.no'), + // Contributor('Piotr K', '1337.kelt@gmail.com'), + // Contributor('امیر جهانگرد', 'ijahangard.a@gmail.com'), + }; + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ConstrainedBox( + constraints: const BoxConstraints(minHeight: 48), + child: Align( + alignment: AlignmentDirectional.centerStart, + child: Text(l10n.aboutTranslatorsSectionTitle, style: Constants.knownTitleTextStyle), + ), + ), + const SizedBox(height: 8), + _RandomTextSpanHighlighter( + spans: translators.map((v) => v.name).toList(), + highlightColor: Theme.of(context).colorScheme.onPrimary, + ), + const SizedBox(height: 16), + ], + ), + ); + } +} + +class _RandomTextSpanHighlighter extends StatefulWidget { + final List<String> spans; + final Color highlightColor; + + const _RandomTextSpanHighlighter({ + required this.spans, + required this.highlightColor, + }); + + @override + State<_RandomTextSpanHighlighter> createState() => _RandomTextSpanHighlighterState(); +} + +class _RandomTextSpanHighlighterState extends State<_RandomTextSpanHighlighter> with SingleTickerProviderStateMixin { + late final AnimationController _controller; + late final Animation<TextStyle> _animatedStyle; + late final TextStyle _baseStyle; + int _highlightedIndex = 0; + + @override + void initState() { + super.initState(); + + _baseStyle = TextStyle( + shadows: [ + Shadow( + color: widget.highlightColor.withOpacity(0), + blurRadius: 0, + ) + ], + ); + final highlightStyle = TextStyle( + shadows: [ + Shadow( + color: widget.highlightColor, + blurRadius: 3, + ) + ], + ); + + _controller = AnimationController( + duration: const Duration(seconds: 1), + vsync: this, + ) + ..addListener(() => setState(() {})) + ..addStatusListener((status) { + if (status == AnimationStatus.forward) { + _highlightedIndex = Random().nextInt(widget.spans.length); + } + }) + ..repeat(reverse: true); + _animatedStyle = ShadowedTextStyleTween(begin: _baseStyle, end: highlightStyle).animate(CurvedAnimation( + parent: _controller, + curve: Curves.linear, + )); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Text.rich( + TextSpan( + children: [ + ...widget.spans.expandIndexed((i, v) => [ + if (i != 0) const TextSpan(text: ' • '), + TextSpan(text: v, style: i == _highlightedIndex ? _animatedStyle.value : _baseStyle), + ]) + ], + ), + strutStyle: const StrutStyle(height: 1.5, forceStrutHeight: true), + ); + } +} + +class Contributor { + final String name; + final String? weblateEmail; + + const Contributor(this.name, this.weblateEmail); +} diff --git a/lib/widgets/common/basic/animated_text.dart b/lib/widgets/common/basic/animated_text.dart index 80c7c04a9..c4b1a2eca 100644 --- a/lib/widgets/common/basic/animated_text.dart +++ b/lib/widgets/common/basic/animated_text.dart @@ -33,7 +33,7 @@ class _AnimatedTextState extends State<AnimatedText> with SingleTickerProviderSt ) ..value = 1 ..addListener(() => setState(() {})); - _style = _ShadowedTextStyleTween(begin: widget.changedStyle, end: widget.style).animate(CurvedAnimation( + _style = ShadowedTextStyleTween(begin: widget.changedStyle, end: widget.style).animate(CurvedAnimation( parent: _controller, curve: widget.curve, )); @@ -64,8 +64,8 @@ class _AnimatedTextState extends State<AnimatedText> with SingleTickerProviderSt } } -class _ShadowedTextStyleTween extends Tween<TextStyle> { - _ShadowedTextStyleTween({super.begin, super.end}); +class ShadowedTextStyleTween extends Tween<TextStyle> { + ShadowedTextStyleTween({super.begin, super.end}); @override TextStyle lerp(double t) { diff --git a/untranslated.json b/untranslated.json index 684d75c5a..1a8a4f0d4 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,12 +1,4 @@ { - "de": [ - "editEntryLocationDialogSetCustom", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - "el": [ "editEntryLocationDialogSetCustom", "settingsAllowMediaManagement", @@ -1046,29 +1038,6 @@ "filePickerUseThisFolder" ], - "id": [ - "chipActionFilterOut", - "chipActionFilterIn", - "viewerTransitionNone", - "widgetOpenPageHome", - "widgetOpenPageCollection", - "widgetOpenPageViewer", - "durationDialogSeconds", - "editEntryLocationDialogSetCustom", - "tileLayoutMosaic", - "albumGroupType", - "albumMimeTypeMixed", - "settingsDisabled", - "settingsSlideshowAnimatedZoomEffect", - "settingsAllowMediaManagement", - "settingsWidgetOpenPage", - "statsTopAlbumsSectionTitle", - "wallpaperUseScrollEffect", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - "ja": [ "chipActionFilterOut", "chipActionFilterIn", @@ -1191,19 +1160,6 @@ "tagPlaceholderPlace" ], - "nl": [ - "widgetOpenPageCollection", - "widgetOpenPageViewer", - "durationDialogSeconds", - "editEntryLocationDialogSetCustom", - "aboutLinkPolicy", - "policyPageTitle", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - "pl": [ "itemCount", "timeSeconds", @@ -1693,80 +1649,6 @@ "filePickerUseThisFolder" ], - "pt": [ - "editEntryLocationDialogSetCustom", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - - "tr": [ - "chipActionFilterOut", - "chipActionFilterIn", - "slideshowActionResume", - "slideshowActionShowInCollection", - "entryInfoActionEditTitleDescription", - "filterNoDateLabel", - "filterNoTitleLabel", - "filterOnThisDayLabel", - "filterRecentlyAddedLabel", - "videoPlaybackSkip", - "videoPlaybackMuted", - "videoPlaybackWithSound", - "viewerTransitionSlide", - "viewerTransitionParallax", - "viewerTransitionFade", - "viewerTransitionZoomIn", - "viewerTransitionNone", - "wallpaperTargetHome", - "wallpaperTargetLock", - "wallpaperTargetHomeLock", - "widgetOpenPageHome", - "widgetOpenPageCollection", - "widgetOpenPageViewer", - "durationDialogSeconds", - "editEntryLocationDialogSetCustom", - "menuActionSlideshow", - "viewDialogReverseSortOrder", - "tileLayoutMosaic", - "sortOrderNewestFirst", - "sortOrderOldestFirst", - "sortOrderAtoZ", - "sortOrderZtoA", - "sortOrderHighestFirst", - "sortOrderLowestFirst", - "sortOrderLargestFirst", - "sortOrderSmallestFirst", - "albumGroupType", - "albumMimeTypeMixed", - "searchMetadataSectionTitle", - "settingsDisabled", - "settingsConfirmationAfterMoveToBinItems", - "settingsViewerGestureSideTapNext", - "settingsViewerSlideshowTile", - "settingsViewerSlideshowPageTitle", - "settingsSlideshowRepeat", - "settingsSlideshowShuffle", - "settingsSlideshowFillScreen", - "settingsSlideshowAnimatedZoomEffect", - "settingsSlideshowTransitionTile", - "settingsSlideshowIntervalTile", - "settingsSlideshowVideoPlaybackTile", - "settingsSlideshowVideoPlaybackDialogTitle", - "settingsAllowMediaManagement", - "settingsScreenSaverPageTitle", - "settingsWidgetShowOutline", - "settingsWidgetOpenPage", - "statsTopAlbumsSectionTitle", - "viewerSetWallpaperButtonLabel", - "viewerInfoLabelDescription", - "wallpaperUseScrollEffect", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - "zh": [ "editEntryLocationDialogSetCustom", "settingsAllowMediaManagement", From 62178a4cadb7cef162d19976d7ddc658e533a599 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Fri, 11 Nov 2022 10:16:58 +0100 Subject: [PATCH 50/53] l10n by weblate (#392) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: HiSubway <shenyusoftware@gmail.com> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Jan <weblate@jwh.anonaddy.com> Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Jonatas de Almeida Barros <ajonatas56@gmail.com> Co-authored-by: Koen Koppens <koenkoppens@proton.me> Co-authored-by: MeFinity <me.dot.finity@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Translator-3000 <weblate.m1d0h@8shield.net> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: metezd <itoldyouthat@protonmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/el/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/id/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/es/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ru/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: HiSubway <shenyusoftware@gmail.com> Co-authored-by: Jan <weblate@jwh.anonaddy.com> Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Jonatas de Almeida Barros <ajonatas56@gmail.com> Co-authored-by: Koen Koppens <koenkoppens@proton.me> Co-authored-by: MeFinity <me.dot.finity@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Translator-3000 <weblate.m1d0h@8shield.net> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: metezd <itoldyouthat@protonmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> --- lib/l10n/app_el.arb | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/l10n/app_el.arb b/lib/l10n/app_el.arb index 4ce65dfb3..1741b57b9 100644 --- a/lib/l10n/app_el.arb +++ b/lib/l10n/app_el.arb @@ -369,7 +369,7 @@ "@newAlbumDialogTitle": {}, "newAlbumDialogNameLabel": "Όνομα άλμπουμ", "@newAlbumDialogNameLabel": {}, - "newAlbumDialogNameLabelAlreadyExistsHelper": "Ο κατάλογος υπάρχει ήδη", + "newAlbumDialogNameLabelAlreadyExistsHelper": "Η ονομασία υπάρχει ήδη", "@newAlbumDialogNameLabelAlreadyExistsHelper": {}, "newAlbumDialogStorageLabel": "Aποθηκευτικός χώρος:", "@newAlbumDialogStorageLabel": {}, @@ -385,7 +385,7 @@ "@renameEntrySetPageInsertTooltip": {}, "renameEntrySetPagePreviewSectionTitle": "Προεπισκοπηση", "@renameEntrySetPagePreviewSectionTitle": {}, - "renameProcessorCounter": "Counter", + "renameProcessorCounter": "Μετρητής", "@renameProcessorCounter": {}, "renameProcessorName": "Όνομα", "@renameProcessorName": {}, @@ -1146,5 +1146,13 @@ "widgetOpenPageCollection": "Ανοιχτή συλλογή", "@widgetOpenPageCollection": {}, "durationDialogSeconds": "Δευτερόλεπτα", - "@durationDialogSeconds": {} + "@durationDialogSeconds": {}, + "settingsAllowMediaManagement": "Επιτρέψτε την πλήρη διαχείριση των αρχείων σας", + "@settingsAllowMediaManagement": {}, + "editEntryLocationDialogSetCustom": "Ορισμός προσαρμοσμένης τοποθεσίας", + "@editEntryLocationDialogSetCustom": {}, + "tagPlaceholderCountry": "Χώρα", + "@tagPlaceholderCountry": {}, + "tagPlaceholderPlace": "Μέρος", + "@tagPlaceholderPlace": {} } From dede13ef22e4813fdb307f87fe93d497c908bba5 Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Fri, 11 Nov 2022 10:22:55 +0100 Subject: [PATCH 51/53] #388 downgraded AGP to avoid release crash on API 19 --- CHANGELOG.md | 2 ++ android/build.gradle | 3 ++- untranslated.json | 6 +----- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a5907353..bba7bcb50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ All notable changes to this project will be documented in this file. - failing scan of items copied to SD card on older devices - unreplaceable covers set before v1.7.1 - inconsistent background height for multi-script subtitles +- launch crash on Android KitKat +- ExifInterface: producing invalid WebP files ## <a id="v1.7.1"></a>[v1.7.1] - 2022-10-09 diff --git a/android/build.gradle b/android/build.gradle index eddb482b6..4e4351257 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -7,7 +7,8 @@ buildscript { maven { url 'https://developer.huawei.com/repo/' } } dependencies { - classpath 'com.android.tools.build:gradle:7.3.1' + // TODO TLAD upgrade Android Gradle plugin >=7.3 when this is fixed: https://github.com/flutter/flutter/issues/115100 + classpath 'com.android.tools.build:gradle:7.2.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // GMS & Firebase Crashlytics (used by some flavors only) classpath 'com.google.gms:google-services:4.3.14' diff --git a/untranslated.json b/untranslated.json index 1a8a4f0d4..56442262f 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,10 +1,6 @@ { "el": [ - "editEntryLocationDialogSetCustom", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" + "tagEditorSectionPlaceholders" ], "fa": [ From 2b961db27330917c6e2440b48b921a020cd1a5c5 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" <hosted@weblate.org> Date: Fri, 11 Nov 2022 10:31:01 +0100 Subject: [PATCH 52/53] l10n by weblate (#394) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: HiSubway <shenyusoftware@gmail.com> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Jan <weblate@jwh.anonaddy.com> Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Jonatas de Almeida Barros <ajonatas56@gmail.com> Co-authored-by: Koen Koppens <koenkoppens@proton.me> Co-authored-by: MeFinity <me.dot.finity@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Translator-3000 <weblate.m1d0h@8shield.net> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: metezd <itoldyouthat@protonmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> Translate-URL: https://hosted.weblate.org/projects/aves/app-android/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-android/fa/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/de/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/el/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/es/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/id/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/it/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ja/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ko/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/pt/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/app-main/tr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/es/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/ru/ Translate-URL: https://hosted.weblate.org/projects/aves/store-full-description/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/fr/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/nl/ Translate-URL: https://hosted.weblate.org/projects/aves/store-short-description/ru/ Translation: Aves/App - Android Translation: Aves/App - Main Translation: Aves/Store - Full description Translation: Aves/Store - Short description Co-authored-by: HiSubway <shenyusoftware@gmail.com> Co-authored-by: Jan <weblate@jwh.anonaddy.com> Co-authored-by: Jean Mareilles <waged1266@tutanota.com> Co-authored-by: Jonatas de Almeida Barros <ajonatas56@gmail.com> Co-authored-by: Koen Koppens <koenkoppens@proton.me> Co-authored-by: MeFinity <me.dot.finity@gmail.com> Co-authored-by: Thibault Deckers <thibault.deckers@gmail.com> Co-authored-by: Translator-3000 <weblate.m1d0h@8shield.net> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: kha84 <khalukhin@gmail.com> Co-authored-by: metezd <itoldyouthat@protonmail.com> Co-authored-by: 이정희 <daemul72@gmail.com> --- android/app/src/main/res/values-es/strings.xml | 2 +- lib/l10n/app_ja.arb | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/res/values-es/strings.xml b/android/app/src/main/res/values-es/strings.xml index 9d4e328f0..3c656e5b6 100644 --- a/android/app/src/main/res/values-es/strings.xml +++ b/android/app/src/main/res/values-es/strings.xml @@ -4,7 +4,7 @@ <string name="app_widget_label">Marco de foto</string> <string name="wallpaper">Fondo de pantalla</string> <string name="search_shortcut_short_label">Búsqueda</string> - <string name="videos_shortcut_short_label">Videos</string> + <string name="videos_shortcut_short_label">Vídeos</string> <string name="analysis_channel_name">Explorar medios</string> <string name="analysis_service_description">Explorar imágenes &amp; videos</string> <string name="analysis_notification_default_title">Explorando medios</string> diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 127a348a2..3340a68d6 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -1144,5 +1144,15 @@ "sortOrderZtoA": "ZからA", "@sortOrderZtoA": {}, "sortOrderLowestFirst": "低いものから表示", - "@sortOrderLowestFirst": {} + "@sortOrderLowestFirst": {}, + "chipActionFilterOut": "除外する", + "@chipActionFilterOut": {}, + "albumGroupType": "タイプ別", + "@albumGroupType": {}, + "albumMimeTypeMixed": "混合", + "@albumMimeTypeMixed": {}, + "statsTopAlbumsSectionTitle": "トップアルバム", + "@statsTopAlbumsSectionTitle": {}, + "editEntryLocationDialogSetCustom": "カスタムの場所を設定する", + "@editEntryLocationDialogSetCustom": {} } From 08db29ff9e4ecadd591d6d74aae336f8e05caf9c Mon Sep 17 00:00:00 2001 From: Thibault Deckers <thibault.deckers@gmail.com> Date: Fri, 11 Nov 2022 10:43:18 +0100 Subject: [PATCH 53/53] version bump --- CHANGELOG.md | 2 ++ fastlane/metadata/android/en-US/changelogs/1082.txt | 5 +++++ pubspec.yaml | 2 +- untranslated.json | 7 +------ whatsnew/whatsnew-en-US | 8 ++++---- 5 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/1082.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index bba7bcb50..69eef8175 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. ## <a id="unreleased"></a>[Unreleased] +## <a id="v1.7.2"></a>[v1.7.2] - 2022-11-11 + ### Added - Info: edit MP4 metadata (date / location / title / description / rating / tags / rotation) diff --git a/fastlane/metadata/android/en-US/changelogs/1082.txt b/fastlane/metadata/android/en-US/changelogs/1082.txt new file mode 100644 index 000000000..5905035c9 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1082.txt @@ -0,0 +1,5 @@ +In v1.7.2: +- tag your MP4, rate your MP4, date your MP4, locate your MP4, rotate your MP4 +- give media management access (on Android 12+) to skip some confirmation dialogs +- enjoy higher quality thumbnails +Full changelog available on GitHub \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 825f08131..b41c4468d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,7 +6,7 @@ repository: https://github.com/deckerst/aves # - github changelog: /CHANGELOG.md # - play changelog: /whatsnew/whatsnew-en-US # - izzy changelog: /fastlane/metadata/android/en-US/changelogs/1XXX.txt -version: 1.7.1+81 +version: 1.7.2+82 publish_to: none environment: diff --git a/untranslated.json b/untranslated.json index 56442262f..fc2e63b04 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1035,12 +1035,7 @@ ], "ja": [ - "chipActionFilterOut", - "chipActionFilterIn", - "editEntryLocationDialogSetCustom", - "albumGroupType", - "albumMimeTypeMixed", - "statsTopAlbumsSectionTitle" + "chipActionFilterIn" ], "nb": [ diff --git a/whatsnew/whatsnew-en-US b/whatsnew/whatsnew-en-US index e5b6ac839..5905035c9 100644 --- a/whatsnew/whatsnew-en-US +++ b/whatsnew/whatsnew-en-US @@ -1,5 +1,5 @@ -In v1.7.1: -- view your photos with the mosaic layout -- reverse filters to filter out/in -- set wallpapers with scroll effect +In v1.7.2: +- tag your MP4, rate your MP4, date your MP4, locate your MP4, rotate your MP4 +- give media management access (on Android 12+) to skip some confirmation dialogs +- enjoy higher quality thumbnails Full changelog available on GitHub \ No newline at end of file