From 3fb60129157726999771ec11c0c868726322da81 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 30 Jan 2022 10:57:23 +0900 Subject: [PATCH 01/39] packages upgrade --- .../common/action_mixins/feedback.dart | 16 +++++------ pubspec.lock | 28 +++++++++---------- pubspec.yaml | 4 +-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/lib/widgets/common/action_mixins/feedback.dart b/lib/widgets/common/action_mixins/feedback.dart index 729c83fd2..2cd3c5766 100644 --- a/lib/widgets/common/action_mixins/feedback.dart +++ b/lib/widgets/common/action_mixins/feedback.dart @@ -118,7 +118,7 @@ class _ReportOverlayState extends State> with SingleTickerPr Stream get opStream => widget.opStream; static const fontSize = 18.0; - static const radius = 160.0; + static const diameter = 160.0; static const strokeWidth = 8.0; @override @@ -169,8 +169,8 @@ class _ReportOverlayState extends State> with SingleTickerPr alignment: Alignment.center, children: [ Container( - width: radius + 2, - height: radius + 2, + width: diameter + 2, + height: diameter + 2, decoration: const BoxDecoration( color: Color(0xBB000000), shape: BoxShape.circle, @@ -178,8 +178,8 @@ class _ReportOverlayState extends State> with SingleTickerPr ), if (animate) Container( - width: radius, - height: radius, + width: diameter, + height: diameter, padding: const EdgeInsets.all(strokeWidth / 2), child: CircularProgressIndicator( color: progressColor.withOpacity(.1), @@ -189,7 +189,7 @@ class _ReportOverlayState extends State> with SingleTickerPr CircularPercentIndicator( percent: percent, lineWidth: strokeWidth, - radius: radius, + radius: diameter / 2, backgroundColor: Colors.white24, progressColor: progressColor, animation: animate, @@ -203,8 +203,8 @@ class _ReportOverlayState extends State> with SingleTickerPr Material( color: Colors.transparent, child: Container( - width: radius, - height: radius, + width: diameter, + height: diameter, margin: const EdgeInsets.only(top: fontSize), alignment: const FractionalOffset(0.5, 0.75), child: Tooltip( diff --git a/pubspec.lock b/pubspec.lock index 52bb31a05..851dd524a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -231,7 +231,7 @@ packages: name: device_info_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.3.0+1" device_info_plus_web: dependency: transitive description: @@ -305,35 +305,35 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.11.0" + version: "1.12.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.3" + version: "4.2.4" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.5.3" + version: "1.5.4" firebase_crashlytics: dependency: transitive description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.4.5" + version: "2.5.0" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.1.12" + version: "3.1.13" flex_color_picker: dependency: "direct main" description: @@ -748,7 +748,7 @@ packages: name: percent_indicator url: "https://pub.dartlang.org" source: hosted - version: "3.4.0" + version: "4.0.0" permission_handler: dependency: "direct main" description: @@ -853,28 +853,28 @@ packages: name: screen_brightness url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" screen_brightness_android: dependency: transitive description: name: screen_brightness_android url: "https://pub.dartlang.org" source: hosted - version: "0.0.3" + version: "0.0.4" screen_brightness_ios: dependency: transitive description: name: screen_brightness_ios url: "https://pub.dartlang.org" source: hosted - version: "0.0.4" + version: "0.0.5" screen_brightness_platform_interface: dependency: transitive description: name: screen_brightness_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "0.0.3" + version: "0.0.4" shared_preferences: dependency: "direct main" description: @@ -1133,14 +1133,14 @@ packages: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.3" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.3" url_launcher_platform_interface: dependency: transitive description: @@ -1210,7 +1210,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.3.3" + version: "2.3.8" wkt_parser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4130e3c27..7da83ba46 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -26,7 +26,7 @@ dependencies: collection: connectivity_plus: country_code: -# TODO TLAD as of 2021/12/01, null safe version is pre-release +# TODO TLAD as of 2022/01/30, null safe version is pre-release custom_rounded_rectangle_border: '>=0.2.0-nullsafety.0' decorated_icon: device_info_plus: @@ -54,7 +54,7 @@ dependencies: overlay_support: package_info_plus: palette_generator: -# TODO TLAD as of 2021/12/01, latest version (v0.4.1) has this issue: https://github.com/zesage/panorama/issues/25 +# TODO TLAD as of 2022/01/30, latest version (v0.4.1) has this issue: https://github.com/zesage/panorama/issues/25 panorama: 0.4.0 pdf: percent_indicator: From dc0f019e2f70a0017c04440116793881aa4caccc Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 30 Jan 2022 11:40:26 +0900 Subject: [PATCH 02/39] minor fix --- lib/widgets/stats/filter_table.dart | 4 +++- lib/widgets/stats/stats_page.dart | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/widgets/stats/filter_table.dart b/lib/widgets/stats/filter_table.dart index ea05acb8a..b15aadd26 100644 --- a/lib/widgets/stats/filter_table.dart +++ b/lib/widgets/stats/filter_table.dart @@ -76,11 +76,13 @@ class FilterTable extends StatelessWidget { progressColor: stringToColor(label), animation: true, isRTL: isRtl, - padding: EdgeInsets.symmetric(horizontal: lineHeight), + // TODO TLAD handle low percents being rendered with wrong radius clip + barRadius: Radius.circular(lineHeight / 2), center: Text( intl.NumberFormat.percentPattern().format(percent), style: const TextStyle(shadows: Constants.embossShadows), ), + padding: EdgeInsets.symmetric(horizontal: lineHeight), ), Text( '$count', diff --git a/lib/widgets/stats/stats_page.dart b/lib/widgets/stats/stats_page.dart index c94663d50..f62d1006b 100644 --- a/lib/widgets/stats/stats_page.dart +++ b/lib/widgets/stats/stats_page.dart @@ -111,11 +111,13 @@ class StatsPage extends StatelessWidget { animation: animate, isRTL: context.isRtl, leading: const Icon(AIcons.location), - padding: EdgeInsets.symmetric(horizontal: lineHeight), + // TODO TLAD handle low percents being rendered with wrong radius clip + barRadius: Radius.circular(lineHeight / 2), center: Text( intl.NumberFormat.percentPattern().format(withGpsPercent), style: const TextStyle(shadows: Constants.embossShadows), ), + padding: EdgeInsets.symmetric(horizontal: lineHeight), ), ), const SizedBox(height: 8), From cbb3dc8c08fe8b6ed3af97a519da686bee5b8159 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 30 Jan 2022 11:44:28 +0900 Subject: [PATCH 03/39] minor fix --- lib/widgets/common/action_mixins/feedback.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widgets/common/action_mixins/feedback.dart b/lib/widgets/common/action_mixins/feedback.dart index 2cd3c5766..2429565fd 100644 --- a/lib/widgets/common/action_mixins/feedback.dart +++ b/lib/widgets/common/action_mixins/feedback.dart @@ -279,7 +279,7 @@ class _FeedbackMessageState extends State<_FeedbackMessage> { CircularPercentIndicator( percent: _percent, lineWidth: 2, - radius: 32, + radius: 16, // progress color is provided by the caller, // because we cannot use the app context theme here backgroundColor: widget.progressColor, From 8bca363645047b3b9f4b4d4b78cf139bf2a7cbce Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 4 Feb 2022 10:33:25 +0900 Subject: [PATCH 04/39] upgraded flutter to v2.10.0 --- .github/workflows/check.yml | 2 +- .github/workflows/release.yml | 8 +++--- CHANGELOG.md | 4 +++ pubspec.lock | 38 ++++++++++++++-------------- pubspec.yaml | 2 +- shaders.sksl.json | 1 + shaders_2.10.0.sksl.json | 1 + shaders_2.8.1.sksl.json | 1 - test_driver/driver_shaders_test.dart | 2 +- 9 files changed, 32 insertions(+), 27 deletions(-) create mode 100644 shaders.sksl.json create mode 100644 shaders_2.10.0.sksl.json delete mode 100644 shaders_2.8.1.sksl.json diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index a24b65126..8484f7422 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -15,7 +15,7 @@ jobs: - uses: subosito/flutter-action@v1 with: channel: stable - flutter-version: '2.8.1' + flutter-version: '2.10.0' - name: Clone the repository. uses: actions/checkout@v2 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index db2cefafe..3a9e61795 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,7 +17,7 @@ jobs: - uses: subosito/flutter-action@v1 with: channel: stable - flutter-version: '2.8.1' + flutter-version: '2.10.0' # Workaround for this Android Gradle Plugin issue (supposedly fixed in AGP 4.1): # https://issuetracker.google.com/issues/144111441 @@ -52,12 +52,12 @@ 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_2.8.1.sksl.json + flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_2.10.0.sksl.json cp build/app/outputs/bundle/playRelease/*.aab outputs - flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_2.8.1.sksl.json + flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_2.10.0.sksl.json cp build/app/outputs/apk/play/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_2.8.1.sksl.json + flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_2.10.0.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 3e4465e83..820c9e7ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Changed + +- upgraded Flutter to stable v2.10.0 + ## [v1.5.11] - 2022-01-30 ### Added diff --git a/pubspec.lock b/pubspec.lock index 851dd524a..7b9239638 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -224,7 +224,7 @@ packages: name: device_info_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "2.2.2" device_info_plus_platform_interface: dependency: transitive description: @@ -567,6 +567,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.12.11" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" material_design_icons_flutter: dependency: "direct main" description: @@ -615,7 +622,7 @@ packages: name: nm url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.3" node_preamble: dependency: transitive description: @@ -734,14 +741,7 @@ packages: name: pdf url: "https://pub.dartlang.org" source: hosted - version: "3.6.5" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" + version: "3.7.1" percent_indicator: dependency: "direct main" description: @@ -776,7 +776,7 @@ packages: name: platform url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.1.0" plugin_platform_interface: dependency: transitive description: @@ -804,7 +804,7 @@ packages: name: printing url: "https://pub.dartlang.org" source: hosted - version: "5.6.6" + version: "5.7.2" process: dependency: transitive description: @@ -1063,21 +1063,21 @@ packages: name: test url: "https://pub.dartlang.org" source: hosted - version: "1.17.12" + version: "1.19.5" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.8" test_core: dependency: transitive description: name: test_core url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.9" transparent_image: dependency: "direct main" description: @@ -1175,7 +1175,7 @@ packages: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "7.3.0" + version: "7.5.0" watcher: dependency: transitive description: @@ -1210,7 +1210,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.3.8" + version: "2.3.10" wkt_parser: dependency: transitive description: @@ -1224,7 +1224,7 @@ packages: name: xdg_directories url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "0.2.0+1" xml: dependency: "direct main" description: @@ -1240,5 +1240,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.15.0 <3.0.0" + dart: ">=2.16.0 <3.0.0" flutter: ">=2.5.0" diff --git a/pubspec.yaml b/pubspec.yaml index 7da83ba46..b83d90623 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,7 +10,7 @@ version: 1.5.11+65 publish_to: none environment: - sdk: '>=2.15.0 <3.0.0' + sdk: '>=2.16.0 <3.0.0' # use `scripts/apply_flavor_{flavor}.sh` to set the right dependencies for the flavor dependencies: diff --git a/shaders.sksl.json b/shaders.sksl.json new file mode 100644 index 000000000..f37dcff2c --- /dev/null +++ b/shaders.sksl.json @@ -0,0 +1 @@ +{"platform":"android","name":"SM G970N","engineRevision":"776efd2034d50af73e2876d703213601df384e88","data":{"AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQLAAAAAAIAAEAAAABJWQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbM107CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueCwgdWNsYW1wX1MxX2MwX2MwX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEyKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","DASAAAAAQAAWAABAYAAQBYH7777Z6QQBAEAAAAAAEAAAAAAAEBSAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABZQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","AYAA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQACAAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAADkAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5ID0gbWF4KHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHksIDAuMCk7CgloYWxmIHJpZ2h0QWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVpbm5lclJlY3RfUzEuUiAtIHNrX0ZyYWdDb29yZC54KSk7CgloYWxmIGJvdHRvbUFscGhhID0gaGFsZihzYXR1cmF0ZSh1aW5uZXJSZWN0X1MxLkIgLSBza19GcmFnQ29vcmQueSkpOwoJaGFsZiBhbHBoYSA9IGJvdHRvbUFscGhhICogcmlnaHRBbHBoYSAqIGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEADZAAAAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAAPwQAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5ID0gbWF4KHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHksIDAuMCk7CgloYWxmIHJpZ2h0QWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVpbm5lclJlY3RfUzEuUiAtIHNrX0ZyYWdDb29yZC54KSk7CgloYWxmIGJvdHRvbUFscGhhID0gaGFsZihzYXR1cmF0ZSh1aW5uZXJSZWN0X1MxLkIgLSBza19GcmFnQ29vcmQueSkpOwoJaGFsZiBhbHBoYSA9IGJvdHRvbUFscGhhICogcmlnaHRBbHBoYSAqIGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","B2AAQAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAABAEAAAABJYQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAueSwgdWNsYW1wX1MxX2MwX2MwX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEzKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","GEMAAAYAAEHAAAARC4EAAAQWBQAAAAAAAAAQAAAAIBCAAAGQAEAAAAAQAAAABAEQAEAAAAA":"CAAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA4AAABpblNoYWRvd1BhcmFtcwAAAQAAAAAAAAA=","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMABAAOAAAABAAAAAAABBAMAAA":"CAAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIBAIAAAABLCIIBAAAAABAEGABBAMAACAIAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAD6AwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CgkvLyBCbGVuZCBtb2RlOiBNb2R1bGF0ZQoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAABAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAIAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","EABQAAAAAEAAAAAQAABQAAIOAAABCFYIAAKAUDAAAAAAAAABAAAAAAAAAAANAAIAAAABAAAAACAJAAIAAAAA":"CAAAAExTS1OhAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgZmxvYXQyIHZJbnRUZXh0dXJlQ29vcmRzX1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIERpc3RhbmNlRmllbGRQYXRoCglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJdkludFRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkczsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8yX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGZsb2F0MiB2SW50VGV4dHVyZUNvb3Jkc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBEaXN0YW5jZUZpZWxkUGF0aAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQyIHV2ID0gdlRleHR1cmVDb29yZHNfUzA7CgloYWxmNCB0ZXhDb2xvcjsKCXsKCQl0ZXhDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLnJycnI7Cgl9CgloYWxmIGRpc3RhbmNlID0gNy45Njg3NSoodGV4Q29sb3IuciAtIDAuNTAxOTYwNzg0MzEpOwoJaGFsZiBhZndpZHRoOwoJYWZ3aWR0aCA9IGFicygwLjY1KmhhbGYoZEZkeCh2SW50VGV4dHVyZUNvb3Jkc19TMC54KSkpOwoJaGFsZiB2YWwgPSBzbW9vdGhzdGVwKC1hZndpZHRoLCBhZndpZHRoLCBkaXN0YW5jZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KHZhbCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAEQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEADZABYAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAA7AMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGAARAGQWMHGBRIAAAAABQAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HTQAAGAABBYAAAEIXBAAAGEAMAAAAAAAAAAAAAAAQAHAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAKAAAAaW5RdWFkRWRnZQAAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEAZIA62YSBDACAAAGAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAAdwUAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAIAAQAAAAAQGIA":"CAAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAMAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBDbGFtcGVkR3JhZGllbnRfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSAoaGFsZjQoMS4wKSAtIG91dHB1dF9TMSkgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAEAAAACAAAAHBvc2l0aW9uCAAAAGNvdmVyYWdlBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAIAAEAAAABJYQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueCwgdWNsYW1wX1MxX2MwX2MwX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEzKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYTRVAADQAAAOAEARAFQJAABBADAAAILBYAACCYUQD777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAFAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2ULAAAAaW5DbGlwUGxhbmUADAAAAGluSXNlY3RQbGFuZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAEAQAAAAGQCBAMQACAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIAAIAAAABLCIABAAAAABAEGABBAMAACAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAdBAAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZC54ID0gY2xhbXAoc3Vic2V0Q29vcmQueCwgdWNsYW1wX1MxX2MwX2MwLngsIHVjbGFtcF9TMV9jMF9jMC56KTsKCWNsYW1wZWRDb29yZC55ID0gc3Vic2V0Q29vcmQueTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQmxlbmRfUzEoaGFsZjQgX3NyYywgaGFsZjQgX2RzdCkgCnsKCS8vIEJsZW5kIG1vZGU6IE1vZHVsYXRlCglyZXR1cm4gYmxlbmRfbW9kdWxhdGUoTWF0cml4RWZmZWN0X1MxX2MwKF9zcmMpLCBfc3JjKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEJsZW5kX1MxKG91dHB1dENvbG9yX1MwLCBoYWxmNCgxKSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGACQAGAAAAAQAAAAAAAQQGAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAACEA2X4PLOGEAAAAAAAAACAAAAAVQQAAQAAAAAQCDIBCAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAuAIAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAAA5AAAAAAABAAAAACAZAAAAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAAAAAAAXQIAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","B2ABSAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAKAAAAaW5Db3ZlcmFnZQAAAQAAAAAAAAA=","BYIBQAAABQAAIAABBYAAAEIXBAAP777777777777AAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEAZCBRE4GNEACAAAOAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAABwUAAGNvbnN0IGludCBrRmlsbEFBX1MxID0gMTsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdWNpcmNsZV9TMTsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmNsZV9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgZDsKCWlmIChpbnQoMykgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlkID0gaGFsZigobGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykgLSAxLjApICogdWNpcmNsZV9TMS56KTsKCX0KCWVsc2UgCgl7CgkJZCA9IGhhbGYoKDEuMCAtIGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpKSAqIHVjaXJjbGVfUzEueik7Cgl9CglpZiAoaW50KDMpID09IGtGaWxsQUFfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlyZXR1cm4gaGFsZjQoX2lucHV0ICogc2F0dXJhdGUoZCkpOwoJfQoJZWxzZSAKCXsKCQlyZXR1cm4gaGFsZjQoZCA+IDAuNSA/IF9pbnB1dCA6IGhhbGY0KDAuMCkpOwoJfQp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjbGVfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAEAAAAc2tldwkAAAB0cmFuc2xhdGUAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAFAAAAY29sb3IAAAABAAAAAAAAAA==","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgxKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAAAAIAAAABLAIABAAAAABAEGABBAMAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADnAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJLy8gQmxlbmQgbW9kZTogTW9kdWxhdGUKCXJldHVybiBibGVuZF9tb2R1bGF0ZShNYXRyaXhFZmZlY3RfUzFfYzAoX3NyYyksIF9zcmMpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQmxlbmRfUzEob3V0cHV0Q29sb3JfUzAsIGhhbGY0KDEpKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAAAQAAAAGQCBAMQACAAAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzAueCwgdWNsYW1wX1MxX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIBSQB5VRECGAEAAAMAAAAAAAAAAACAA4AAAACAAAAAAACCAYAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQLAAAAAAABAEAAAABJWQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbM107CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAueSwgdWNsYW1wX1MxX2MwX2MwX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEyKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAAAAEAAAABJYQAAAAAAAAIAAAAAWCBAAAABAAAAANAECAZAAAAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAPIEAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdV8wX0luY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1XzFfS2VybmVsX1MxX2MwWzRdOwp1bmlmb3JtIGhhbGY0IHVfMl9PZmZzZXRzX1MxX2MwWzRdOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIF9jb29yZHMpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF8zX2NvbG9yID0gaGFsZjQoMC4wKTsKCWZsb2F0MiBfNV9jb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgXzZfaSA9IDA7IChfNl9pIDwgMTMpOyBfNl9pKyspIChfM19jb2xvciArPSAoTWF0cml4RWZmZWN0X1MxX2MwX2MwKF9pbnB1dCwgKF81X2Nvb3JkICsgZmxvYXQyKCh1XzJfT2Zmc2V0c19TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSAqIHVfMF9JbmNyZW1lbnRfUzFfYzApKSkpICogdV8xX0tlcm5lbF9TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSkpOwoJcmV0dXJuIF8zX2NvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIAHSADQAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAGIBIAAABAAAAANAEAAAAAAAAAAAAAABAAOAAAABAAAAAAABBAMAAAAA":"CAAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA=="}} \ No newline at end of file diff --git a/shaders_2.10.0.sksl.json b/shaders_2.10.0.sksl.json new file mode 100644 index 000000000..f37dcff2c --- /dev/null +++ b/shaders_2.10.0.sksl.json @@ -0,0 +1 @@ +{"platform":"android","name":"SM G970N","engineRevision":"776efd2034d50af73e2876d703213601df384e88","data":{"AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQLAAAAAAIAAEAAAABJWQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbM107CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueCwgdWNsYW1wX1MxX2MwX2MwX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEyKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","DASAAAAAQAAWAABAYAAQBYH7777Z6QQBAEAAAAAAEAAAAAAAEBSAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABZQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","AYAA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQACAAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAADkAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5ID0gbWF4KHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHksIDAuMCk7CgloYWxmIHJpZ2h0QWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVpbm5lclJlY3RfUzEuUiAtIHNrX0ZyYWdDb29yZC54KSk7CgloYWxmIGJvdHRvbUFscGhhID0gaGFsZihzYXR1cmF0ZSh1aW5uZXJSZWN0X1MxLkIgLSBza19GcmFnQ29vcmQueSkpOwoJaGFsZiBhbHBoYSA9IGJvdHRvbUFscGhhICogcmlnaHRBbHBoYSAqIGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEADZAAAAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAAPwQAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5ID0gbWF4KHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHksIDAuMCk7CgloYWxmIHJpZ2h0QWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVpbm5lclJlY3RfUzEuUiAtIHNrX0ZyYWdDb29yZC54KSk7CgloYWxmIGJvdHRvbUFscGhhID0gaGFsZihzYXR1cmF0ZSh1aW5uZXJSZWN0X1MxLkIgLSBza19GcmFnQ29vcmQueSkpOwoJaGFsZiBhbHBoYSA9IGJvdHRvbUFscGhhICogcmlnaHRBbHBoYSAqIGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","B2AAQAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAABAEAAAABJYQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAueSwgdWNsYW1wX1MxX2MwX2MwX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEzKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","GEMAAAYAAEHAAAARC4EAAAQWBQAAAAAAAAAQAAAAIBCAAAGQAEAAAAAQAAAABAEQAEAAAAA":"CAAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA4AAABpblNoYWRvd1BhcmFtcwAAAQAAAAAAAAA=","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMABAAOAAAABAAAAAAABBAMAAA":"CAAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIBAIAAAABLCIIBAAAAABAEGABBAMAACAIAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAD6AwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CgkvLyBCbGVuZCBtb2RlOiBNb2R1bGF0ZQoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAABAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAIAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","EABQAAAAAEAAAAAQAABQAAIOAAABCFYIAAKAUDAAAAAAAAABAAAAAAAAAAANAAIAAAABAAAAACAJAAIAAAAA":"CAAAAExTS1OhAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgZmxvYXQyIHZJbnRUZXh0dXJlQ29vcmRzX1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIERpc3RhbmNlRmllbGRQYXRoCglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJdkludFRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkczsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8yX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGZsb2F0MiB2SW50VGV4dHVyZUNvb3Jkc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBEaXN0YW5jZUZpZWxkUGF0aAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQyIHV2ID0gdlRleHR1cmVDb29yZHNfUzA7CgloYWxmNCB0ZXhDb2xvcjsKCXsKCQl0ZXhDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLnJycnI7Cgl9CgloYWxmIGRpc3RhbmNlID0gNy45Njg3NSoodGV4Q29sb3IuciAtIDAuNTAxOTYwNzg0MzEpOwoJaGFsZiBhZndpZHRoOwoJYWZ3aWR0aCA9IGFicygwLjY1KmhhbGYoZEZkeCh2SW50VGV4dHVyZUNvb3Jkc19TMC54KSkpOwoJaGFsZiB2YWwgPSBzbW9vdGhzdGVwKC1hZndpZHRoLCBhZndpZHRoLCBkaXN0YW5jZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KHZhbCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAEQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEADZABYAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAA7AMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGAARAGQWMHGBRIAAAAABQAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HTQAAGAABBYAAAEIXBAAAGEAMAAAAAAAAAAAAAAAQAHAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAKAAAAaW5RdWFkRWRnZQAAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEAZIA62YSBDACAAAGAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAAdwUAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAIAAQAAAAAQGIA":"CAAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAMAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBDbGFtcGVkR3JhZGllbnRfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSAoaGFsZjQoMS4wKSAtIG91dHB1dF9TMSkgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAEAAAACAAAAHBvc2l0aW9uCAAAAGNvdmVyYWdlBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAIAAEAAAABJYQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueCwgdWNsYW1wX1MxX2MwX2MwX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEzKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYTRVAADQAAAOAEARAFQJAABBADAAAILBYAACCYUQD777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAFAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2ULAAAAaW5DbGlwUGxhbmUADAAAAGluSXNlY3RQbGFuZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAEAQAAAAGQCBAMQACAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIAAIAAAABLCIABAAAAABAEGABBAMAACAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAdBAAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZC54ID0gY2xhbXAoc3Vic2V0Q29vcmQueCwgdWNsYW1wX1MxX2MwX2MwLngsIHVjbGFtcF9TMV9jMF9jMC56KTsKCWNsYW1wZWRDb29yZC55ID0gc3Vic2V0Q29vcmQueTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQmxlbmRfUzEoaGFsZjQgX3NyYywgaGFsZjQgX2RzdCkgCnsKCS8vIEJsZW5kIG1vZGU6IE1vZHVsYXRlCglyZXR1cm4gYmxlbmRfbW9kdWxhdGUoTWF0cml4RWZmZWN0X1MxX2MwKF9zcmMpLCBfc3JjKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEJsZW5kX1MxKG91dHB1dENvbG9yX1MwLCBoYWxmNCgxKSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGACQAGAAAAAQAAAAAAAQQGAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAACEA2X4PLOGEAAAAAAAAACAAAAAVQQAAQAAAAAQCDIBCAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAuAIAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAAA5AAAAAAABAAAAACAZAAAAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAAAAAAAXQIAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","B2ABSAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAKAAAAaW5Db3ZlcmFnZQAAAQAAAAAAAAA=","BYIBQAAABQAAIAABBYAAAEIXBAAP777777777777AAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEAZCBRE4GNEACAAAOAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAABwUAAGNvbnN0IGludCBrRmlsbEFBX1MxID0gMTsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdWNpcmNsZV9TMTsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmNsZV9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgZDsKCWlmIChpbnQoMykgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlkID0gaGFsZigobGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykgLSAxLjApICogdWNpcmNsZV9TMS56KTsKCX0KCWVsc2UgCgl7CgkJZCA9IGhhbGYoKDEuMCAtIGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpKSAqIHVjaXJjbGVfUzEueik7Cgl9CglpZiAoaW50KDMpID09IGtGaWxsQUFfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlyZXR1cm4gaGFsZjQoX2lucHV0ICogc2F0dXJhdGUoZCkpOwoJfQoJZWxzZSAKCXsKCQlyZXR1cm4gaGFsZjQoZCA+IDAuNSA/IF9pbnB1dCA6IGhhbGY0KDAuMCkpOwoJfQp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjbGVfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAEAAAAc2tldwkAAAB0cmFuc2xhdGUAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAFAAAAY29sb3IAAAABAAAAAAAAAA==","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgxKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAAAAIAAAABLAIABAAAAABAEGABBAMAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADnAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJLy8gQmxlbmQgbW9kZTogTW9kdWxhdGUKCXJldHVybiBibGVuZF9tb2R1bGF0ZShNYXRyaXhFZmZlY3RfUzFfYzAoX3NyYyksIF9zcmMpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQmxlbmRfUzEob3V0cHV0Q29sb3JfUzAsIGhhbGY0KDEpKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAAAQAAAAGQCBAMQACAAAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzAueCwgdWNsYW1wX1MxX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIBSQB5VRECGAEAAAMAAAAAAAAAAACAA4AAAACAAAAAAACCAYAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQLAAAAAAABAEAAAABJWQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbM107CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAueSwgdWNsYW1wX1MxX2MwX2MwX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEyKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAAAAEAAAABJYQAAAAAAAAIAAAAAWCBAAAABAAAAANAECAZAAAAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAPIEAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdV8wX0luY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1XzFfS2VybmVsX1MxX2MwWzRdOwp1bmlmb3JtIGhhbGY0IHVfMl9PZmZzZXRzX1MxX2MwWzRdOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIF9jb29yZHMpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF8zX2NvbG9yID0gaGFsZjQoMC4wKTsKCWZsb2F0MiBfNV9jb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgXzZfaSA9IDA7IChfNl9pIDwgMTMpOyBfNl9pKyspIChfM19jb2xvciArPSAoTWF0cml4RWZmZWN0X1MxX2MwX2MwKF9pbnB1dCwgKF81X2Nvb3JkICsgZmxvYXQyKCh1XzJfT2Zmc2V0c19TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSAqIHVfMF9JbmNyZW1lbnRfUzFfYzApKSkpICogdV8xX0tlcm5lbF9TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSkpOwoJcmV0dXJuIF8zX2NvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIAHSADQAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAGIBIAAABAAAAANAEAAAAAAAAAAAAAABAAOAAAABAAAAAAABBAMAAAAA":"CAAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA=="}} \ No newline at end of file diff --git a/shaders_2.8.1.sksl.json b/shaders_2.8.1.sksl.json deleted file mode 100644 index d689bfb70..000000000 --- a/shaders_2.8.1.sksl.json +++ /dev/null @@ -1 +0,0 @@ -{"platform":"android","name":"SM G970N","engineRevision":"890a5fca2e34db413be624fc83aeea8e61d42ce6","data":{"HQQACAAAAAGAAAAAAIOP57ZDF37P7777777QCAAAAAAAAAAAMIAHSAAAAAAQAAAAAA4QAAAAAABAAAAACAZAAAAAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HQQAAAAAAAGAAAAAAIOP57ZDF37P7777777QCAAAAAAAAAAAMIAHSAAAAAAQAAAAAA4QAAAAAABAAAAACAZAAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAuAIAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","AWAAGAAAQAAIPCELAGEP777777777737AAAAAAAAAAAABZAAAAAAACAAAAAEBSAA":"CAAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","BUIBQAAAAQAAAAABBYIRP777777QAAAAAAAAAAAAZAAQAAAACAAAAAEASAAQAAAA":"CAAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IAAQAAAAAAAAA=","HQIAAAAAAAGAAAAAAIOP577774BRZ7X7777QCAAAAAAAAAAAFIAA2AAAAAAAAAQAAAACUAQACAAAAABQIMACCAYAAAAAAAAAAAADSAAAAAAAEAAAAAIDEAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADnAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJLy8gQmxlbmQgbW9kZTogTW9kdWxhdGUKCXJldHVybiBibGVuZF9tb2R1bGF0ZShNYXRyaXhFZmZlY3RfUzFfYzAoX3NyYyksIF9zcmMpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQmxlbmRfUzEob3V0cHV0Q29sb3JfUzAsIGhhbGY0KDEpKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HQIAAAAAAAGAAAAAAIOP577774BRZ7X7777QCAAAAAAAAAAAFIAA2AAAAAAQCAQAAAACUEQQCAAAAABQIMACCAYAAEAQAAAAAAADSAAAAAAAEAAAAAIDEAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAD6AwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CgkvLyBCbGVuZCBtb2RlOiBNb2R1bGF0ZQoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HQJAAAAAAAGAAAAAAIOP577774BRZ7X7777QCAAAAABAAAAAABBAMADCAB4QAAAAAEAAAAAAHEAAAAAAAIAAAAAQGIAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HQIAAAAAAAGAAAAAAIOP577774BRZ7X7777QCAAAAAAAAAAAVIBAYAAAAAAQAAIAAAACRRAAAAABAAAQAAAABIECAEAACAAAAAZQIEBSAAIAAAAAAAAJAAYAAAACAAAAAAACCAY":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueCwgdWNsYW1wX1MxX2MwX2MwX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzRfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF81X2kgPSAwOyAoXzVfaSA8IDEzKTsgXzVfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNF9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF81X2kgLyA0KV1bKF81X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF81X2kgLyA0KV1bKF81X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","C4QAAAAAMAAAAABAYAQ6FASCAEAAAABAAAAAAAAAAAAAAOIAAAAAAAQAAAABAMQA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HQIAAAAAAAGAAAAAAIOP577774BRZ7X7777QCAAAAAAAAAAAVIBAYAAAAAAACAIAAAACRRAAAAAAAEAQAAAABIECAAAQCAAAAAZQIEBSAAABAAAAAAAJAAYAAAACAAAAAAACCAY":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAueSwgdWNsYW1wX1MxX2MwX2MwX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzRfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF81X2kgPSAwOyAoXzVfaSA8IDEzKTsgXzVfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNF9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF81X2kgLyA0KV1bKF81X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF81X2kgLyA0KV1bKF81X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HRIACAAAAAMAAAAAAQ4AANCELQCDR7H7777QGAAAAAAAAAAAGQDCIUFDGAQAAAAAAIAAB7QAAAAP4AAAAD7AAAAA72MJ54XDUIAAAABQAAAAAYAAAAAEATA7TQ5QQAAAACYIR7H5AAAAAAABAAAAAMLCPLFI7CYCAAAMAAAAACAACAAAAAYX24HOEAAAAAGAELZPOAYAAAAAQAAAADCGATA7TQ5QQAAAAAAAAAAAFIBIXSG7B4AAAAAQAAAAAECDWCEPZ7IAAAAAAAAAAAADSAAAAAAAKAAAAAIDEAA":"CAAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAHAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgT3ZlcnJpZGVJbnB1dF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzVfaW5Db2xvciA9IF9pbnB1dDsKCXJldHVybiBoYWxmNChDbGFtcGVkR3JhZGllbnRfUzFfYzAoaGFsZjQoMS4wLDEuMCwxLjAsMS4wKSkpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdCBjb3ZlcmFnZSA9IHZjb3ZlcmFnZV9TMDsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoaGFsZihjb3ZlcmFnZSkpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gT3ZlcnJpZGVJbnB1dF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gKGhhbGY0KDEuMCkgLSBvdXRwdXRfUzEpICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAABAAAAAgAAABwb3NpdGlvbggAAABjb3ZlcmFnZQUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","BWABSAAAAQAAAAABB3777777AAKAAAAAAAAAAAAAZAAQAAAACAAAAAEASAAQAAAA":"CAAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAKAAAAaW5Db3ZlcmFnZQAAAQAAAAAAAAA=","HQJAAAAAAAGAAAAAAIOP577774BRZ7X7777QCAAAAABAAAAAABBAMAEQAMAAAABAAAAAAABBAMAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HMMAAAAABBYIROAYQAAAAAAAAAAAAACABYAAAAEAAAAAAAEEBQAA":"CAAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAKAAAAaW5RdWFkRWRnZQAAAQAAAAAAAAA=","AWQAGAAAQAAIPCELAGEP777777777737AAAAAAAAAAAABZAAAAAAACAAAAAEBSAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HQIAAAAAAAGAAAAAAIOP577774BRZ7X7777QCAAAAAAAAAAAVIBACAABAAAAAMYECAZAAEAAAAAAAAEQAMAAAABAAAAAAABBAMAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzAueCwgdWNsYW1wX1MxX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","E5QQAAAAMAAGEADCACRAAAAAMAACFQDBABRAAIXCAIAAAABAA2IAOAAACAAAAAAASABQAAAAEAAAAAAAEEBQ":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAA7AMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HRIAAAAAAAMAAAAAAQ4PZ72HLQCDR7H7777QGAAAAAAAAAAAIQCQAAACAAAAAZQIAAAAAAAAAAAAAABAA4AAAACAAAAAAACCAYAAAAA":"CAAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","BWAAQAAAAQAAAAABB3777777AAKAAAAAAAAAAAAAZAAQAAAACAAAAAEASAAQAAAA":"CAAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","E5QQAAAAMAAGEADCACRAAAAAMAACFQDBABRAAIXCAIAAAABAGGAHWWEQIYAQAABQAAAAAAAAAAAEADQAAAAIAAAAAAAIIDAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAAdwUAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","AWQAGAAAQAAIPCELAGEP777777777737AAAAAAAAAAAIAGCADYAAAQAAAAAAAQAOAAAABAAAAAAABBAMAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HQJAAAAAAAGAAAAAAIOP577774BRZ7X7777QCAAAAABAAAAAABBAMAASANBMYOMDCQAAAAADAAAAAAAAAAAOIAAAAAAAQAAAABAMQAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","AWQAGAAAQAAIPCELAGEP777777777737AAAAAAAAAAAIBRAA5ZQUCGQFAAAMAAAAAAAAAAAAAA4QAAAAAABAAAAACAZAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","C4SAAAAAMAAAAABAYDQ77H2CAEAAAABAAAAAAABAMQAAAOIAAAAAAAQAAAABAMQA":"CAAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HQJAAAAAAAGAAAAAAIOP577774BRZ7X7777QCAAAAABAAAAAAJBAMADCAB4QAAAAAEAAAAAAHEAAAAAAAIAAAAAQGIAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","E5QQAAAAMAAGEADCACRAAAAAMAACFQDBABRAAIXCAIAAAAAAHEAAAAAAAIAAAAAQGIAAAAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAAAAAAAXQIAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","AWQQGAAAQAAIPCELAGEP777777777737AAAAAAAAAAAIBRAA5ZQUCGQFAAAMAAAAAAAAAAAAAA4QAAAAAABAAAAACAZAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HQQACAAAAAGAAAAAAIOP57ZDF37P7777777QCAAAAAAAAAAASABQAAAAEAAAAAAAEEBQAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","E5QQAAAAMAAGEADCACRAAAAAMAACFQDBABRAAIXCAIAAAABAGEQMJHBTJAAQAADQAAAAAAAAAAAEADQAAAAIAAAAAAAIIDAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAABwUAAGNvbnN0IGludCBrRmlsbEFBX1MxID0gMTsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdWNpcmNsZV9TMTsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmNsZV9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgZDsKCWlmIChpbnQoMykgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlkID0gaGFsZigobGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykgLSAxLjApICogdWNpcmNsZV9TMS56KTsKCX0KCWVsc2UgCgl7CgkJZCA9IGhhbGYoKDEuMCAtIGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpKSAqIHVjaXJjbGVfUzEueik7Cgl9CglpZiAoaW50KDMpID09IGtGaWxsQUFfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlyZXR1cm4gaGFsZjQoX2lucHV0ICogc2F0dXJhdGUoZCkpOwoJfQoJZWxzZSAKCXsKCQlyZXR1cm4gaGFsZjQoZCA+IDAuNSA/IF9pbnB1dCA6IGhhbGY0KDAuMCkpOwoJfQp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjbGVfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAEAAAAc2tldwkAAAB0cmFuc2xhdGUAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAFAAAAY29sb3IAAAABAAAAAAAAAA==","HRIAAAAAAAMAAAAAAQ4PZ72HLQCDR7H7777QGAAAAAAAAAAAGQDCIUFDGAQAAAAAAIAAB7QAAAAP4AAAAD7AAAAA72MJ54XDUIAAAABQAAAAAYAAAAAEATA7TQ5QQAAAACYIR7H5AAAAAAABAAAAAMLCPLFI7CYCAAAMAAAAACAACAAAAAYX24HOEAAAAAGAELZPOAYAAAAAQAAAADCGATA7TQ5QQAAAAAAAAAAAFIBIXSG7B4AAAAAQAAAAAECDWCEPZ7IAAAAAAAAAAAADSAAAAAAAEAAAAAIDEAA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAM8GAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgxKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBPdmVycmlkZUlucHV0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCgxLjAsMS4wLDEuMCwxLjApKSk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBPdmVycmlkZUlucHV0X1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HRJAAAAAAAMAAAAAAQ4PZ72HLQCDR7H7777QGAAAAACAAAAAACCAYABAA4AAAACAAAAAAACCAYAAA":"CAAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","GABQAAAAAEHBCFYCCYAAAAAAAEAAAACAIQAABSABAAAAAEAAAAAIBEABAA":"CAAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA4AAABpblNoYWRvd1BhcmFtcwAAAQAAAAAAAAA=","HQQAAAAAAAGAAAAAAIOP57ZDF37P7777777QCAAAAAAAAAAACIBVPY6W4MIAAAAAAAAAEAAAABKBAABAAAAAAYEGQCEAAAAAAAAAAAAAOIAAAAAAAQAAAABAMQAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HQIAAAAAAAGAAAAAAIOP577774BRZ7X7777QCAAAAAAAAAAAVIBACAIBAAAAAMYECAZAAEAQAAAAAAEQAMAAAABAAAAAAABBAMAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","C4QAAAAAMAAAAABAYAQ6FASCAEAAAABAAAAAAAAAAAACAMMAPNMJARQBAAADAAAAAAAAAAAAIAHAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","AWQAGAAAQAAIPCELAGEP777777777737AAAAAAAAAAAIAGGADYAAAQAAAAAAAQAOAAAABAAAAAAABBAMAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","C4QAAAAAMAAAAABAYAQ6FASCAEAAAABAAAAAAAAAAAACABUQA4AAAEAAAAAABEADAAAAAIAAAAAAAIIDAAAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HQIAAAAAAAGAAAAAAIOP577774BRZ7X7777QCAAAAAAAAAAAVIBAYAAAAAAAAAIAAAACRRAAAAAAAAAQAAAABIECAAAACAAAAAZQIEBSAAAAAAAAAAAJAAYAAAACAAAAAAACCAY":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAPIEAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdV8wX0luY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1XzFfS2VybmVsX1MxX2MwWzRdOwp1bmlmb3JtIGhhbGY0IHVfMl9PZmZzZXRzX1MxX2MwWzRdOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIF9jb29yZHMpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF8zX2NvbG9yID0gaGFsZjQoMC4wKTsKCWZsb2F0MiBfNF9jb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgXzVfaSA9IDA7IChfNV9pIDwgMTMpOyBfNV9pKyspIChfM19jb2xvciArPSAoTWF0cml4RWZmZWN0X1MxX2MwX2MwKF9pbnB1dCwgKF80X2Nvb3JkICsgZmxvYXQyKCh1XzJfT2Zmc2V0c19TMV9jMFsoXzVfaSAvIDQpXVsoXzVfaSAmIDMpXSAqIHVfMF9JbmNyZW1lbnRfUzFfYzApKSkpICogdV8xX0tlcm5lbF9TMV9jMFsoXzVfaSAvIDQpXVsoXzVfaSAmIDMpXSkpOwoJcmV0dXJuIF8zX2NvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HQQAAAAAAAGAAAAAAIOP57ZDF37P7777777QCAAAAAAAAAAASABQAAAAEAAAAAAAEEBQAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","AWQAGAAAQAAIPCELAGEP777777777737AAAAAAAAAAAIAGCAAIAAAQAAAAAAAQAOAAAABAAAAAAABBAMAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAADkAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5ID0gbWF4KHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHksIDAuMCk7CgloYWxmIHJpZ2h0QWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVpbm5lclJlY3RfUzEuUiAtIHNrX0ZyYWdDb29yZC54KSk7CgloYWxmIGJvdHRvbUFscGhhID0gaGFsZihzYXR1cmF0ZSh1aW5uZXJSZWN0X1MxLkIgLSBza19GcmFnQ29vcmQueSkpOwoJaGFsZiBhbHBoYSA9IGJvdHRvbUFscGhhICogcmlnaHRBbHBoYSAqIGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","AWQQGAAAQAAIPCELAGEP777777777737AAAAAAAAAAAABZAAAAAAACAAAAAEBSAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HRIAAAAAAAMAAAAAAQ4PZ72HLQCDR7H7777QGAAAAAAAAAAAGQDCIUFDGAQAAAAAAIAAB7QAAAAP4AAAAD7AAAAA72MJ54XDUIAAAAAQAAAAAYAAAAAEATA7TQ5QQAAAACYIR7H5AAAAAAABAAAAAMLCPLFI7CYCAAAEAAAAACAACAAAAAYX24HOEAAAAAGAELZPOAYAAAAAQAAAADCGATA7TQ5QQAAAAAAAAAAAFIBIXSG7B4AAAAAQAAAAAECDWCEPZ7IAAAAAAAAAAAADSAAAAAAAEAAAAAIDEAA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAM8GAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBPdmVycmlkZUlucHV0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCgxLjAsMS4wLDEuMCwxLjApKSk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBPdmVycmlkZUlucHV0X1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AWTQGAAAQAAIPCELAEEACCYBRP777737AAAAAAAAAAAABZAAAAAAACAAAAAEBSAA":"CAAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAFAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2ULAAAAaW5DbGlwUGxhbmUADAAAAGluSXNlY3RQbGFuZQEAAAAAAAAA"}} \ No newline at end of file diff --git a/test_driver/driver_shaders_test.dart b/test_driver/driver_shaders_test.dart index 710221e1c..69f34364e 100644 --- a/test_driver/driver_shaders_test.dart +++ b/test_driver/driver_shaders_test.dart @@ -33,8 +33,8 @@ void main() { unawaited(driver.close()); }); - test('scan media dir', () => driver.scanMediaDir(shadersTargetDirAndroid)); agreeToTerms(); + test('scan media dir', () => driver.scanMediaDir(shadersTargetDirAndroid)); visitAbout(); visitSettings(); sortCollection(); From 030e6796b49b2335bfbd63bc1ad33e67c5cbd855 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 4 Feb 2022 10:33:36 +0900 Subject: [PATCH 05/39] cleanup --- shaders.sksl.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 shaders.sksl.json diff --git a/shaders.sksl.json b/shaders.sksl.json deleted file mode 100644 index f37dcff2c..000000000 --- a/shaders.sksl.json +++ /dev/null @@ -1 +0,0 @@ -{"platform":"android","name":"SM G970N","engineRevision":"776efd2034d50af73e2876d703213601df384e88","data":{"AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQLAAAAAAIAAEAAAABJWQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbM107CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueCwgdWNsYW1wX1MxX2MwX2MwX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEyKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","DASAAAAAQAAWAABAYAAQBYH7777Z6QQBAEAAAAAAEAAAAAAAEBSAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABZQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","AYAA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQACAAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAADkAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5ID0gbWF4KHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHksIDAuMCk7CgloYWxmIHJpZ2h0QWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVpbm5lclJlY3RfUzEuUiAtIHNrX0ZyYWdDb29yZC54KSk7CgloYWxmIGJvdHRvbUFscGhhID0gaGFsZihzYXR1cmF0ZSh1aW5uZXJSZWN0X1MxLkIgLSBza19GcmFnQ29vcmQueSkpOwoJaGFsZiBhbHBoYSA9IGJvdHRvbUFscGhhICogcmlnaHRBbHBoYSAqIGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEADZAAAAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAAPwQAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5ID0gbWF4KHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHksIDAuMCk7CgloYWxmIHJpZ2h0QWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVpbm5lclJlY3RfUzEuUiAtIHNrX0ZyYWdDb29yZC54KSk7CgloYWxmIGJvdHRvbUFscGhhID0gaGFsZihzYXR1cmF0ZSh1aW5uZXJSZWN0X1MxLkIgLSBza19GcmFnQ29vcmQueSkpOwoJaGFsZiBhbHBoYSA9IGJvdHRvbUFscGhhICogcmlnaHRBbHBoYSAqIGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","B2AAQAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAABAEAAAABJYQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAueSwgdWNsYW1wX1MxX2MwX2MwX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEzKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","GEMAAAYAAEHAAAARC4EAAAQWBQAAAAAAAAAQAAAAIBCAAAGQAEAAAAAQAAAABAEQAEAAAAA":"CAAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA4AAABpblNoYWRvd1BhcmFtcwAAAQAAAAAAAAA=","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMABAAOAAAABAAAAAAABBAMAAA":"CAAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIBAIAAAABLCIIBAAAAABAEGABBAMAACAIAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAD6AwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CgkvLyBCbGVuZCBtb2RlOiBNb2R1bGF0ZQoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAABAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAIAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","EABQAAAAAEAAAAAQAABQAAIOAAABCFYIAAKAUDAAAAAAAAABAAAAAAAAAAANAAIAAAABAAAAACAJAAIAAAAA":"CAAAAExTS1OhAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgZmxvYXQyIHZJbnRUZXh0dXJlQ29vcmRzX1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIERpc3RhbmNlRmllbGRQYXRoCglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJdkludFRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkczsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8yX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGZsb2F0MiB2SW50VGV4dHVyZUNvb3Jkc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBEaXN0YW5jZUZpZWxkUGF0aAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQyIHV2ID0gdlRleHR1cmVDb29yZHNfUzA7CgloYWxmNCB0ZXhDb2xvcjsKCXsKCQl0ZXhDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLnJycnI7Cgl9CgloYWxmIGRpc3RhbmNlID0gNy45Njg3NSoodGV4Q29sb3IuciAtIDAuNTAxOTYwNzg0MzEpOwoJaGFsZiBhZndpZHRoOwoJYWZ3aWR0aCA9IGFicygwLjY1KmhhbGYoZEZkeCh2SW50VGV4dHVyZUNvb3Jkc19TMC54KSkpOwoJaGFsZiB2YWwgPSBzbW9vdGhzdGVwKC1hZndpZHRoLCBhZndpZHRoLCBkaXN0YW5jZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KHZhbCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAEQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEADZABYAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAA7AMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGAARAGQWMHGBRIAAAAABQAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HTQAAGAABBYAAAEIXBAAAGEAMAAAAAAAAAAAAAAAQAHAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAKAAAAaW5RdWFkRWRnZQAAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEAZIA62YSBDACAAAGAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAAdwUAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAIAAQAAAAAQGIA":"CAAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAMAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBDbGFtcGVkR3JhZGllbnRfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSAoaGFsZjQoMS4wKSAtIG91dHB1dF9TMSkgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAEAAAACAAAAHBvc2l0aW9uCAAAAGNvdmVyYWdlBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAIAAEAAAABJYQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueCwgdWNsYW1wX1MxX2MwX2MwX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEzKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYTRVAADQAAAOAEARAFQJAABBADAAAILBYAACCYUQD777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAFAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2ULAAAAaW5DbGlwUGxhbmUADAAAAGluSXNlY3RQbGFuZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAEAQAAAAGQCBAMQACAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIAAIAAAABLCIABAAAAABAEGABBAMAACAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAdBAAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZC54ID0gY2xhbXAoc3Vic2V0Q29vcmQueCwgdWNsYW1wX1MxX2MwX2MwLngsIHVjbGFtcF9TMV9jMF9jMC56KTsKCWNsYW1wZWRDb29yZC55ID0gc3Vic2V0Q29vcmQueTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQmxlbmRfUzEoaGFsZjQgX3NyYywgaGFsZjQgX2RzdCkgCnsKCS8vIEJsZW5kIG1vZGU6IE1vZHVsYXRlCglyZXR1cm4gYmxlbmRfbW9kdWxhdGUoTWF0cml4RWZmZWN0X1MxX2MwKF9zcmMpLCBfc3JjKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEJsZW5kX1MxKG91dHB1dENvbG9yX1MwLCBoYWxmNCgxKSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGACQAGAAAAAQAAAAAAAQQGAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAACEA2X4PLOGEAAAAAAAAACAAAAAVQQAAQAAAAAQCDIBCAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAuAIAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAAA5AAAAAAABAAAAACAZAAAAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAAAAAAAXQIAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","B2ABSAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAKAAAAaW5Db3ZlcmFnZQAAAQAAAAAAAAA=","BYIBQAAABQAAIAABBYAAAEIXBAAP777777777777AAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEAZCBRE4GNEACAAAOAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAABwUAAGNvbnN0IGludCBrRmlsbEFBX1MxID0gMTsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdWNpcmNsZV9TMTsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmNsZV9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgZDsKCWlmIChpbnQoMykgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlkID0gaGFsZigobGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykgLSAxLjApICogdWNpcmNsZV9TMS56KTsKCX0KCWVsc2UgCgl7CgkJZCA9IGhhbGYoKDEuMCAtIGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpKSAqIHVjaXJjbGVfUzEueik7Cgl9CglpZiAoaW50KDMpID09IGtGaWxsQUFfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlyZXR1cm4gaGFsZjQoX2lucHV0ICogc2F0dXJhdGUoZCkpOwoJfQoJZWxzZSAKCXsKCQlyZXR1cm4gaGFsZjQoZCA+IDAuNSA/IF9pbnB1dCA6IGhhbGY0KDAuMCkpOwoJfQp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjbGVfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAEAAAAc2tldwkAAAB0cmFuc2xhdGUAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAFAAAAY29sb3IAAAABAAAAAAAAAA==","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgxKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAAAAIAAAABLAIABAAAAABAEGABBAMAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADnAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJLy8gQmxlbmQgbW9kZTogTW9kdWxhdGUKCXJldHVybiBibGVuZF9tb2R1bGF0ZShNYXRyaXhFZmZlY3RfUzFfYzAoX3NyYyksIF9zcmMpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQmxlbmRfUzEob3V0cHV0Q29sb3JfUzAsIGhhbGY0KDEpKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAAAQAAAAGQCBAMQACAAAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzAueCwgdWNsYW1wX1MxX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIBSQB5VRECGAEAAAMAAAAAAAAAAACAA4AAAACAAAAAAACCAYAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQLAAAAAAABAEAAAABJWQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbM107CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAueSwgdWNsYW1wX1MxX2MwX2MwX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEyKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAAAAEAAAABJYQAAAAAAAAIAAAAAWCBAAAABAAAAANAECAZAAAAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAPIEAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdV8wX0luY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1XzFfS2VybmVsX1MxX2MwWzRdOwp1bmlmb3JtIGhhbGY0IHVfMl9PZmZzZXRzX1MxX2MwWzRdOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIF9jb29yZHMpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF8zX2NvbG9yID0gaGFsZjQoMC4wKTsKCWZsb2F0MiBfNV9jb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgXzZfaSA9IDA7IChfNl9pIDwgMTMpOyBfNl9pKyspIChfM19jb2xvciArPSAoTWF0cml4RWZmZWN0X1MxX2MwX2MwKF9pbnB1dCwgKF81X2Nvb3JkICsgZmxvYXQyKCh1XzJfT2Zmc2V0c19TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSAqIHVfMF9JbmNyZW1lbnRfUzFfYzApKSkpICogdV8xX0tlcm5lbF9TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSkpOwoJcmV0dXJuIF8zX2NvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIAHSADQAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAGIBIAAABAAAAANAEAAAAAAAAAAAAAABAAOAAAABAAAAAAABBAMAAAAA":"CAAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA=="}} \ No newline at end of file From 3d5cacfd088aede14ea262a3e6528d6f2f3532d0 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 4 Feb 2022 10:39:40 +0900 Subject: [PATCH 06/39] static analysis --- lib/ref/mime_types.dart | 1 + lib/utils/time_utils.dart | 3 +++ lib/utils/xmp_utils.dart | 1 + 3 files changed, 5 insertions(+) diff --git a/lib/ref/mime_types.dart b/lib/ref/mime_types.dart index 978668f31..185165bec 100644 --- a/lib/ref/mime_types.dart +++ b/lib/ref/mime_types.dart @@ -111,5 +111,6 @@ class MimeTypes { case '.svg': return svg; } + return null; } } diff --git a/lib/utils/time_utils.dart b/lib/utils/time_utils.dart index b3699462f..f448aef68 100644 --- a/lib/utils/time_utils.dart +++ b/lib/utils/time_utils.dart @@ -36,6 +36,7 @@ DateTime? dateTimeFromMillis(int? millis, {bool isUtc = false}) { millis = int.tryParse('$millis'.substring(0, _millisMaxDigits)); return dateTimeFromMillis(millis, isUtc: isUtc); } + return null; } final _unixStampMillisPattern = RegExp(r'\d{13}'); @@ -93,4 +94,6 @@ DateTime? parseUnknownDateFormat(String? s) { } } } + + return null; } diff --git a/lib/utils/xmp_utils.dart b/lib/utils/xmp_utils.dart index d897e476a..88e153dd4 100644 --- a/lib/utils/xmp_utils.dart +++ b/lib/utils/xmp_utils.dart @@ -283,6 +283,7 @@ class XMP { case -1: return '-1'; } + return null; } } From a1c3399afa4446c60db5297e1275215665f9785d Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 4 Feb 2022 11:12:27 +0900 Subject: [PATCH 07/39] line percent indicator fix --- lib/widgets/stats/filter_table.dart | 34 +++++++++++++-------- lib/widgets/stats/stats_page.dart | 47 ++++++++++++++++++----------- 2 files changed, 50 insertions(+), 31 deletions(-) diff --git a/lib/widgets/stats/filter_table.dart b/lib/widgets/stats/filter_table.dart index b15aadd26..703a54698 100644 --- a/lib/widgets/stats/filter_table.dart +++ b/lib/widgets/stats/filter_table.dart @@ -41,6 +41,7 @@ class FilterTable extends StatelessWidget { final textScaleFactor = MediaQuery.textScaleFactorOf(context); final lineHeight = 16 * textScaleFactor; + final barRadius = Radius.circular(lineHeight / 2); final isRtl = context.isRtl; return Padding( @@ -69,20 +70,27 @@ class FilterTable extends StatelessWidget { ), ), if (showPercentIndicator) - LinearPercentIndicator( - percent: percent, - lineHeight: lineHeight, - backgroundColor: Colors.white24, - progressColor: stringToColor(label), - animation: true, - isRTL: isRtl, - // TODO TLAD handle low percents being rendered with wrong radius clip - barRadius: Radius.circular(lineHeight / 2), - center: Text( - intl.NumberFormat.percentPattern().format(percent), - style: const TextStyle(shadows: Constants.embossShadows), - ), + // as of percent_indicator v4.0.0, bar radius is not correctly applied to progress bar + // when width is lower than height, so we clip it and handle padding outside + Padding( padding: EdgeInsets.symmetric(horizontal: lineHeight), + child: ClipRRect( + borderRadius: BorderRadius.all(barRadius), + child: LinearPercentIndicator( + percent: percent, + lineHeight: lineHeight, + backgroundColor: Colors.white24, + progressColor: stringToColor(label), + animation: true, + isRTL: isRtl, + barRadius: barRadius, + center: Text( + intl.NumberFormat.percentPattern().format(percent), + style: const TextStyle(shadows: Constants.embossShadows), + ), + padding: EdgeInsets.zero, + ), + ), ), Text( '$count', diff --git a/lib/widgets/stats/stats_page.dart b/lib/widgets/stats/stats_page.dart index f62d1006b..350df4fa5 100644 --- a/lib/widgets/stats/stats_page.dart +++ b/lib/widgets/stats/stats_page.dart @@ -96,29 +96,40 @@ class StatsPage extends StatelessWidget { final withGpsPercent = withGpsCount / entries.length; final textScaleFactor = MediaQuery.textScaleFactorOf(context); final lineHeight = 16 * textScaleFactor; + final barRadius = Radius.circular(lineHeight / 2); final locationIndicator = Padding( padding: const EdgeInsets.all(16), child: Column( children: [ - Padding( - // end padding to match leading, so that inside label is aligned with outside label below - padding: const EdgeInsetsDirectional.only(end: 24), - child: LinearPercentIndicator( - percent: withGpsPercent, - lineHeight: lineHeight, - backgroundColor: Colors.white24, - progressColor: Theme.of(context).colorScheme.secondary, - animation: animate, - isRTL: context.isRtl, - leading: const Icon(AIcons.location), - // TODO TLAD handle low percents being rendered with wrong radius clip - barRadius: Radius.circular(lineHeight / 2), - center: Text( - intl.NumberFormat.percentPattern().format(withGpsPercent), - style: const TextStyle(shadows: Constants.embossShadows), + // as of percent_indicator v4.0.0, bar radius is not correctly applied to progress bar + // when width is lower than height, so we clip it and handle padding outside + Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(AIcons.location), + SizedBox(width: lineHeight), + Expanded( + child: ClipRRect( + borderRadius: BorderRadius.all(barRadius), + child: LinearPercentIndicator( + percent: withGpsPercent, + lineHeight: lineHeight, + backgroundColor: Colors.white24, + progressColor: Theme.of(context).colorScheme.secondary, + animation: animate, + isRTL: context.isRtl, + barRadius: barRadius, + center: Text( + intl.NumberFormat.percentPattern().format(withGpsPercent), + style: const TextStyle(shadows: Constants.embossShadows), + ), + padding: EdgeInsets.zero, + ), + ), ), - padding: EdgeInsets.symmetric(horizontal: lineHeight), - ), + // end padding to match leading, so that inside label is aligned with outside label below + SizedBox(width: lineHeight + 24), + ], ), const SizedBox(height: 8), Text( From 997005c4e5c09b74f889d5ad7ae9492a038871f8 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 4 Feb 2022 18:27:45 +0900 Subject: [PATCH 08/39] #155 #164 viewer: menu review, add copy/move, improved handling nomedia file content uri --- .../calls/fetchers/ThumbnailFetcher.kt | 2 +- .../channel/streams/ImageByteStreamHandler.kt | 2 +- .../aves/model/provider/ImageProvider.kt | 5 +- .../thibault/aves/utils/StorageUtils.kt | 81 +++++--- lib/l10n/app_de.arb | 9 +- lib/l10n/app_en.arb | 10 +- lib/l10n/app_es.arb | 9 +- lib/l10n/app_fr.arb | 9 +- lib/l10n/app_ko.arb | 9 +- lib/l10n/app_pt.arb | 9 +- lib/l10n/app_ru.arb | 9 +- lib/model/actions/entry_actions.dart | 59 +++--- lib/theme/icons.dart | 8 +- .../collection/entry_set_action_delegate.dart | 141 +------------- .../common/action_mixins/entry_storage.dart | 173 ++++++++++++++++++ .../common/action_mixins/feedback.dart | 4 +- lib/widgets/common/basic/menu.dart | 2 +- .../common/action_delegates/album_set.dart | 4 +- lib/widgets/settings/settings_page.dart | 4 +- .../viewer/viewer_actions_editor.dart | 11 +- .../viewer/action/entry_action_delegate.dart | 44 +++-- lib/widgets/viewer/entry_viewer_stack.dart | 7 +- lib/widgets/viewer/info/notifications.dart | 5 +- lib/widgets/viewer/overlay/top.dart | 94 +++++----- untranslated.json | 21 +++ 25 files changed, 424 insertions(+), 307 deletions(-) create mode 100644 lib/widgets/common/action_mixins/entry_storage.dart 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 68c1c5293..5e99cee7e 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 @@ -131,7 +131,7 @@ class ThumbnailFetcher internal constructor( svgFetch -> SvgImage(context, uri) tiffFetch -> TiffImage(context, uri, pageId) multiTrackFetch -> MultiTrackImage(context, uri, pageId) - else -> StorageUtils.getGlideSafeUri(uri, mimeType) + else -> StorageUtils.getGlideSafeUri(context, uri, mimeType) } Glide.with(context) .asBitmap() 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 5ff445aaa..be9b244e6 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 @@ -119,7 +119,7 @@ class ImageByteStreamHandler(private val context: Context, private val arguments } else if (mimeType == MimeTypes.TIFF) { TiffImage(context, uri, pageId) } else { - StorageUtils.getGlideSafeUri(uri, mimeType) + StorageUtils.getGlideSafeUri(context, uri, mimeType) } val target = Glide.with(context) 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 0466552bd..5659f8a5d 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 @@ -133,7 +133,6 @@ abstract class ImageProvider { } } - @Suppress("BlockingMethodInNonBlockingContext") private suspend fun exportSingle( activity: Activity, sourceEntry: AvesEntry, @@ -174,6 +173,7 @@ abstract class ImageProvider { targetMimeType = sourceMimeType write = { output -> val sourceDocFile = DocumentFileCompat.fromSingleUri(activity, sourceUri) + @Suppress("BlockingMethodInNonBlockingContext") sourceDocFile.copyTo(output) } } else { @@ -184,7 +184,7 @@ abstract class ImageProvider { } else if (sourceMimeType == MimeTypes.SVG) { SvgImage(activity, sourceUri) } else { - StorageUtils.getGlideSafeUri(sourceUri, sourceMimeType) + StorageUtils.getGlideSafeUri(activity, sourceUri, sourceMimeType) } // request a fresh image with the highest quality format @@ -198,6 +198,7 @@ abstract class ImageProvider { .apply(glideOptions) .load(model) .submit(width, height) + @Suppress("BlockingMethodInNonBlockingContext") var bitmap = target.get() if (MimeTypes.needRotationAfterGlide(sourceMimeType)) { bitmap = BitmapUtils.applyExifOrientation(activity, bitmap, sourceEntry.rotationDegrees, sourceEntry.isFlipped) 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 bc9f217f2..1164ef228 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 @@ -329,7 +329,7 @@ object StorageUtils { // try to strip user info, if any if (mediaUri.userInfo != null) { - val genericMediaUri = Uri.parse(mediaUri.toString().replaceFirst("${mediaUri.userInfo}@", "")) + val genericMediaUri = stripMediaUriUserInfo(mediaUri) Log.d(LOG_TAG, "retry getDocumentFile for mediaUri=$mediaUri without userInfo: $genericMediaUri") return getDocumentFile(context, anyPath, genericMediaUri) } @@ -442,36 +442,71 @@ object StorageUtils { // As of Glide v4.12.0, a special loader `QMediaStoreUriLoader` is automatically used // to work around a bug from Android Q where metadata redaction corrupts HEIC images. // This loader relies on `MediaStore.setRequireOriginal` but this yields a `SecurityException` - // for some content URIs (e.g. `content://media/external_primary/downloads/...`) - // so we build a typical `images` or `videos` content URI from the original content ID. - fun getGlideSafeUri(uri: Uri, mimeType: String): Uri = normalizeMediaUri(uri, mimeType) - - // requesting access or writing to some MediaStore content URIs - // e.g. `content://0@media/...`, `content://media/external_primary/downloads/...` - // yields an exception with `All requested items must be referenced by specific ID` - fun getMediaStoreScopedStorageSafeUri(uri: Uri, mimeType: String): Uri = normalizeMediaUri(uri, mimeType) - - private fun normalizeMediaUri(uri: Uri, mimeType: String): Uri { + // for some non image/video content URIs (e.g. `downloads`, `file`) + fun getGlideSafeUri(context: Context, uri: Uri, mimeType: String): Uri { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && isMediaStoreContentUri(uri)) { - // we cannot safely apply this to a file content URI, as it may point to a file not indexed - // by the Media Store (via `.nomedia`), and therefore has no matching image/video content URI - if (uri.path?.contains("/downloads/") == true) { - uri.tryParseId()?.let { id -> - return when { - isImage(mimeType) -> ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id) - isVideo(mimeType) -> ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id) - else -> uri + val uriPath = uri.path + when { + uriPath?.contains("/downloads/") == true -> { + // e.g. `content://media/external_primary/downloads/...` + getMediaUriImageVideoUri(uri, mimeType)?.let { imageVideUri -> return imageVideUri } + } + uriPath?.contains("/file/") == true -> { + // e.g. `content://media/external/file/...` + // create an ad-hoc temporary file for decoding only + File.createTempFile("aves", null).apply { + deleteOnExit() + try { + outputStream().use { output -> + openInputStream(context, uri)?.use { input -> + input.copyTo(output) + } + } + return Uri.fromFile(this) + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to create temporary file from uri=$uri", e) + } } } - } else if (uri.userInfo != null) { - // strip user info, if any - return Uri.parse(uri.toString().replaceFirst("${uri.userInfo}@", "")) + uri.userInfo != null -> return stripMediaUriUserInfo(uri) } - } return uri } + // requesting access or writing to some MediaStore content URIs + // yields an exception with `All requested items must be referenced by specific ID` + fun getMediaStoreScopedStorageSafeUri(uri: Uri, mimeType: String): Uri { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && isMediaStoreContentUri(uri)) { + val uriPath = uri.path + when { + uriPath?.contains("/downloads/") == true -> { + // e.g. `content://media/external_primary/downloads/...` + getMediaUriImageVideoUri(uri, mimeType)?.let { imageVideUri -> return imageVideUri } + } + uri.userInfo != null -> return stripMediaUriUserInfo(uri) + } + } + return uri + } + + // Build a typical `images` or `videos` content URI from the original content ID. + // We cannot safely apply this to a `file` content URI, as it may point to a file not indexed + // by the Media Store (via `.nomedia`), and therefore has no matching image/video content URI. + private fun getMediaUriImageVideoUri(uri: Uri, mimeType: String): Uri? { + return uri.tryParseId()?.let { id -> + return when { + isImage(mimeType) -> ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id) + isVideo(mimeType) -> ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id) + else -> uri + } + } + } + + // strip user info, if any + // e.g. `content://0@media/...` + private fun stripMediaUriUserInfo(uri: Uri) = Uri.parse(uri.toString().replaceFirst("${uri.userInfo}@", "")) + fun openInputStream(context: Context, uri: Uri): InputStream? { val effectiveUri = getOriginalUri(context, uri) return try { diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 438c05eca..a553538d9 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -47,7 +47,6 @@ "entryActionCopyToClipboard": "In die Zwischenablage kopieren", "entryActionDelete": "Löschen", "entryActionExport": "Exportieren", - "entryActionInfo": "Info", "entryActionRename": "Umbenennen", "entryActionRotateCCW": "Drehen gegen den Uhrzeigersinn", "entryActionRotateCW": "Drehen im Uhrzeigersinn", @@ -56,10 +55,10 @@ "entryActionShare": "Teilen", "entryActionViewSource": "Quelle anzeigen", "entryActionViewMotionPhotoVideo": "Bewegtes Foto öffnen", - "entryActionEdit": "Bearbeiten mit...", - "entryActionOpen": "Öffnen mit...", - "entryActionSetAs": "Einstellen als...", - "entryActionOpenMap": "In der Karten-App anzeigen...", + "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", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 0407e89cb..60a5d6341 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -69,8 +69,8 @@ "entryActionCopyToClipboard": "Copy to clipboard", "entryActionDelete": "Delete", + "entryActionConvert": "Convert", "entryActionExport": "Export", - "entryActionInfo": "Info", "entryActionRename": "Rename", "entryActionRotateCCW": "Rotate counterclockwise", "entryActionRotateCW": "Rotate clockwise", @@ -79,10 +79,10 @@ "entryActionShare": "Share", "entryActionViewSource": "View source", "entryActionViewMotionPhotoVideo": "Open Motion Photo", - "entryActionEdit": "Edit with…", - "entryActionOpen": "Open with…", - "entryActionSetAs": "Set as…", - "entryActionOpenMap": "Show in map app…", + "entryActionEdit": "Edit", + "entryActionOpen": "Open with", + "entryActionSetAs": "Set as", + "entryActionOpenMap": "Show in map app", "entryActionRotateScreen": "Rotate screen", "entryActionAddFavourite": "Add to favourites", "entryActionRemoveFavourite": "Remove from favourites", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 232abb8d3..61e2f6c05 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -47,7 +47,6 @@ "entryActionCopyToClipboard": "Copiar al portapapeles", "entryActionDelete": "Borrar", "entryActionExport": "Exportar", - "entryActionInfo": "Información", "entryActionRename": "Renombrar", "entryActionRotateCCW": "Rotar en sentido antihorario", "entryActionRotateCW": "Rotar en sentido horario", @@ -56,10 +55,10 @@ "entryActionShare": "Compartir", "entryActionViewSource": "Ver fuente", "entryActionViewMotionPhotoVideo": "Abrir foto en movimiento", - "entryActionEdit": "Editar con…", - "entryActionOpen": "Abrir con…", - "entryActionSetAs": "Establecer como…", - "entryActionOpenMap": "Mostrar en aplicación de mapa…", + "entryActionEdit": "Editar", + "entryActionOpen": "Abrir con", + "entryActionSetAs": "Establecer como", + "entryActionOpenMap": "Mostrar en aplicación de mapa", "entryActionRotateScreen": "Rotar pantalla", "entryActionAddFavourite": "Agregar a favoritos", "entryActionRemoveFavourite": "Quitar de favoritos", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 115812126..f9fb255e1 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -47,7 +47,6 @@ "entryActionCopyToClipboard": "Copier dans presse-papier", "entryActionDelete": "Supprimer", "entryActionExport": "Exporter", - "entryActionInfo": "Détails", "entryActionRename": "Renommer", "entryActionRotateCCW": "Pivoter à gauche", "entryActionRotateCW": "Pivoter à droite", @@ -56,10 +55,10 @@ "entryActionShare": "Partager", "entryActionViewSource": "Voir le code", "entryActionViewMotionPhotoVideo": "Ouvrir le clip vidéo", - "entryActionEdit": "Modifier avec…", - "entryActionOpen": "Ouvrir avec…", - "entryActionSetAs": "Utiliser comme…", - "entryActionOpenMap": "Localiser avec…", + "entryActionEdit": "Modifier", + "entryActionOpen": "Ouvrir avec", + "entryActionSetAs": "Utiliser comme", + "entryActionOpenMap": "Localiser avec", "entryActionRotateScreen": "Pivoter l’écran", "entryActionAddFavourite": "Ajouter aux favoris", "entryActionRemoveFavourite": "Retirer des favoris", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 2edf0589b..c82863abc 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -47,7 +47,6 @@ "entryActionCopyToClipboard": "클립보드에 복사", "entryActionDelete": "삭제", "entryActionExport": "내보내기", - "entryActionInfo": "상세정보", "entryActionRename": "이름 변경", "entryActionRotateCCW": "좌회전", "entryActionRotateCW": "우회전", @@ -56,10 +55,10 @@ "entryActionShare": "공유", "entryActionViewSource": "소스 코드 보기", "entryActionViewMotionPhotoVideo": "모션 포토 보기", - "entryActionEdit": "편집…", - "entryActionOpen": "다른 앱에서 열기…", - "entryActionSetAs": "다음 용도로 사용…", - "entryActionOpenMap": "지도 앱에서 보기…", + "entryActionEdit": "편집", + "entryActionOpen": "다른 앱에서 열기", + "entryActionSetAs": "다음 용도로 사용", + "entryActionOpenMap": "지도 앱에서 보기", "entryActionRotateScreen": "화면 회전", "entryActionAddFavourite": "즐겨찾기에 추가", "entryActionRemoveFavourite": "즐겨찾기에서 삭제", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index b4dfef910..f5d9f68f0 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -47,7 +47,6 @@ "entryActionCopyToClipboard": "Copiar para área de transferência", "entryActionDelete": "Excluir", "entryActionExport": "Exportar", - "entryActionInfo": "Informações", "entryActionRename": "Renomear", "entryActionRotateCCW": "Rotacionar para esquerda", "entryActionRotateCW": "Rotacionar para direita", @@ -56,10 +55,10 @@ "entryActionShare": "Compartilhado", "entryActionViewSource": "Ver fonte", "entryActionViewMotionPhotoVideo": "Abrir foto em movimento", - "entryActionEdit": "Editar com…", - "entryActionOpen": "Abrir com…", - "entryActionSetAs": "Definir como…", - "entryActionOpenMap": "Mostrar no aplicativo de mapa…", + "entryActionEdit": "Editar", + "entryActionOpen": "Abrir com", + "entryActionSetAs": "Definir como", + "entryActionOpenMap": "Mostrar no aplicativo de mapa", "entryActionRotateScreen": "Girar a tela", "entryActionAddFavourite": "Adicionar aos favoritos", "entryActionRemoveFavourite": "Remova dos favoritos", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 06d891c34..ff691cacd 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -47,7 +47,6 @@ "entryActionCopyToClipboard": "Скопировать в буфер обмена", "entryActionDelete": "Удалить", "entryActionExport": "Экспорт", - "entryActionInfo": "Информация", "entryActionRename": "Переименовать", "entryActionRotateCCW": "Повернуть против часовой стрелки", "entryActionRotateCW": "Повернуть по часовой стрелки", @@ -56,10 +55,10 @@ "entryActionShare": "Поделиться", "entryActionViewSource": "Посмотреть источник", "entryActionViewMotionPhotoVideo": "Открыть «Живые фото»", - "entryActionEdit": "Изменить с помощью…", - "entryActionOpen": "Открыть с помощью…", - "entryActionSetAs": "Установить как…", - "entryActionOpenMap": "Показать на карте…", + "entryActionEdit": "Изменить", + "entryActionOpen": "Открыть с помощью", + "entryActionSetAs": "Установить как", + "entryActionOpenMap": "Показать на карте", "entryActionRotateScreen": "Повернуть экран", "entryActionAddFavourite": "Добавить в избранное", "entryActionRemoveFavourite": "Удалить из избранного", diff --git a/lib/model/actions/entry_actions.dart b/lib/model/actions/entry_actions.dart index 4a8c98248..4c085b1f7 100644 --- a/lib/model/actions/entry_actions.dart +++ b/lib/model/actions/entry_actions.dart @@ -7,10 +7,11 @@ enum EntryAction { addShortcut, copyToClipboard, delete, - export, - info, + convert, print, rename, + copy, + move, share, toggleFavourite, // raster @@ -31,25 +32,32 @@ enum EntryAction { } class EntryActions { - static const inApp = [ - EntryAction.info, - EntryAction.toggleFavourite, + static const topLevel = [ EntryAction.share, - EntryAction.delete, + EntryAction.edit, EntryAction.rename, - EntryAction.export, - EntryAction.addShortcut, - EntryAction.copyToClipboard, - EntryAction.print, + EntryAction.delete, + EntryAction.copy, + EntryAction.move, + EntryAction.toggleFavourite, EntryAction.viewSource, EntryAction.rotateScreen, ]; - static const externalApp = [ - EntryAction.edit, + static const export = [ + EntryAction.convert, + EntryAction.addShortcut, + EntryAction.copyToClipboard, + EntryAction.print, EntryAction.open, - EntryAction.setAs, EntryAction.openMap, + EntryAction.setAs, + ]; + + static const exportExternal = [ + EntryAction.open, + EntryAction.openMap, + EntryAction.setAs, ]; static const pageActions = [ @@ -68,14 +76,16 @@ extension ExtraEntryAction on EntryAction { return context.l10n.entryActionCopyToClipboard; case EntryAction.delete: return context.l10n.entryActionDelete; - case EntryAction.export: - return context.l10n.entryActionExport; - case EntryAction.info: - return context.l10n.entryActionInfo; + case EntryAction.convert: + return context.l10n.entryActionConvert; case EntryAction.print: return context.l10n.entryActionPrint; case EntryAction.rename: return context.l10n.entryActionRename; + case EntryAction.copy: + return context.l10n.collectionActionCopy; + case EntryAction.move: + return context.l10n.collectionActionMove; case EntryAction.share: return context.l10n.entryActionShare; case EntryAction.toggleFavourite: @@ -133,14 +143,16 @@ extension ExtraEntryAction on EntryAction { return AIcons.clipboard; case EntryAction.delete: return AIcons.delete; - case EntryAction.export: - return AIcons.saveAs; - case EntryAction.info: - return AIcons.info; + case EntryAction.convert: + return AIcons.convert; case EntryAction.print: return AIcons.print; case EntryAction.rename: return AIcons.rename; + case EntryAction.copy: + return AIcons.copy; + case EntryAction.move: + return AIcons.move; case EntryAction.share: return AIcons.share; case EntryAction.toggleFavourite: @@ -158,10 +170,13 @@ extension ExtraEntryAction on EntryAction { return AIcons.vector; // external case EntryAction.edit: + return AIcons.edit; case EntryAction.open: + return AIcons.openOutside; case EntryAction.openMap: + return AIcons.map; case EntryAction.setAs: - return null; + return AIcons.setAs; // platform case EntryAction.rotateScreen: return AIcons.rotateScreen; diff --git a/lib/theme/icons.dart b/lib/theme/icons.dart index c91a307b7..8d5b07d82 100644 --- a/lib/theme/icons.dart +++ b/lib/theme/icons.dart @@ -50,13 +50,16 @@ class AIcons { static const IconData captureFrame = Icons.screenshot_outlined; static const IconData clear = Icons.clear_outlined; static const IconData clipboard = Icons.content_copy_outlined; + static const IconData convert = Icons.transform_outlined; static const IconData copy = Icons.file_copy_outlined; static const IconData debug = Icons.whatshot_outlined; static const IconData delete = Icons.delete_outlined; static const IconData edit = Icons.edit_outlined; static const IconData editRating = MdiIcons.starPlusOutline; static const IconData editTags = MdiIcons.tagPlusOutline; - static const IconData export = MdiIcons.fileExportOutline; + static const IconData export = Icons.open_with_outlined; + static const IconData fileExport = MdiIcons.fileExportOutline; + static const IconData fileImport = MdiIcons.fileImportOutline; static const IconData flip = Icons.flip_outlined; static const IconData favourite = Icons.favorite_border; static const IconData favouriteActive = Icons.favorite; @@ -65,7 +68,6 @@ class AIcons { static const IconData geoBounds = Icons.public_outlined; static const IconData goUp = Icons.arrow_upward_outlined; static const IconData hide = Icons.visibility_off_outlined; - static const IconData import = MdiIcons.fileImportOutline; static const IconData info = Icons.info_outlined; static const IconData layers = Icons.layers_outlined; static const IconData map = Icons.map_outlined; @@ -83,9 +85,9 @@ class AIcons { static const IconData rotateLeft = Icons.rotate_left_outlined; static const IconData rotateRight = Icons.rotate_right_outlined; static const IconData rotateScreen = Icons.screen_rotation_outlined; - static const IconData saveAs = Icons.save_alt_outlined; static const IconData search = Icons.search_outlined; static const IconData select = Icons.select_all_outlined; + static const IconData setAs = Icons.wallpaper_outlined; static const IconData setCover = MdiIcons.imageEditOutline; static const IconData share = Icons.share_outlined; static const IconData show = Icons.visibility_outlined; diff --git a/lib/widgets/collection/entry_set_action_delegate.dart b/lib/widgets/collection/entry_set_action_delegate.dart index db0e0d242..38be53935 100644 --- a/lib/widgets/collection/entry_set_action_delegate.dart +++ b/lib/widgets/collection/entry_set_action_delegate.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:io'; import 'package:aves/app_mode.dart'; import 'package:aves/model/actions/entry_set_actions.dart'; @@ -8,9 +7,7 @@ import 'package:aves/model/device.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_metadata_edition.dart'; import 'package:aves/model/favourites.dart'; -import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/highlight.dart'; import 'package:aves/model/query.dart'; import 'package:aves/model/selection.dart'; import 'package:aves/model/source/analysis_controller.dart'; @@ -18,10 +15,8 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/services/common/image_op_events.dart'; import 'package:aves/services/common/services.dart'; -import 'package:aves/services/media/enums.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/utils/mime_utils.dart'; -import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/action_mixins/entry_editor.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; @@ -29,8 +24,6 @@ import 'package:aves/widgets/common/action_mixins/size_aware.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; -import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; -import 'package:aves/widgets/filter_grids/album_pick.dart'; import 'package:aves/widgets/map/map_page.dart'; import 'package:aves/widgets/search/search_delegate.dart'; import 'package:aves/widgets/stats/stats_page.dart'; @@ -39,7 +32,9 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; -class EntrySetActionDelegate with EntryEditorMixin, FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { +import '../common/action_mixins/entry_storage.dart'; + +class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMixin, EntryEditorMixin, EntryStorageMixin { bool isVisible( EntrySetAction action, { required AppMode appMode, @@ -268,7 +263,7 @@ class EntrySetActionDelegate with EntryEditorMixin, FeedbackMixin, PermissionAwa source.pauseMonitoring(); final opId = mediaFileService.newOpId; - showOpReport( + await showOpReport( context: context, opStream: mediaFileService.delete(opId: opId, entries: selectedItems), itemCount: todoCount, @@ -294,132 +289,10 @@ class EntrySetActionDelegate with EntryEditorMixin, FeedbackMixin, PermissionAwa } Future _move(BuildContext context, {required MoveType moveType}) async { - final l10n = context.l10n; final selection = context.read>(); final selectedItems = _getExpandedSelectedItems(selection); - final selectionDirs = selectedItems.map((e) => e.directory).whereNotNull().toSet(); - - final destinationAlbum = await pickAlbum(context: context, moveType: moveType); - if (destinationAlbum == null) return; - if (!await checkStoragePermissionForAlbums(context, {destinationAlbum})) return; - - if (moveType == MoveType.move && !await checkStoragePermissionForAlbums(context, selectionDirs, entries: selectedItems)) return; - - if (!await checkFreeSpaceForMove(context, selectedItems, destinationAlbum, moveType)) return; - - // do not directly use selection when moving and post-processing items - // as source monitoring may remove obsolete items from the original selection - final todoItems = selectedItems.toSet(); - - final copy = moveType == MoveType.copy; - final todoCount = todoItems.length; - assert(todoCount > 0); - - final destinationDirectory = Directory(destinationAlbum); - final names = [ - ...todoItems.map((v) => '${v.filenameWithoutExtension}${v.extension}'), - // do not guard up front based on directory existence, - // as conflicts could be within moved entries scattered across multiple albums - if (await destinationDirectory.exists()) ...destinationDirectory.listSync().map((v) => pContext.basename(v.path)), - ]; - final uniqueNames = names.toSet(); - var nameConflictStrategy = NameConflictStrategy.rename; - if (uniqueNames.length < names.length) { - final value = await showDialog( - context: context, - builder: (context) { - return AvesSelectionDialog( - initialValue: nameConflictStrategy, - options: Map.fromEntries(NameConflictStrategy.values.map((v) => MapEntry(v, v.getName(context)))), - message: selectionDirs.length == 1 ? l10n.nameConflictDialogSingleSourceMessage : l10n.nameConflictDialogMultipleSourceMessage, - confirmationButtonLabel: l10n.continueButtonLabel, - ); - }, - ); - if (value == null) return; - nameConflictStrategy = value; - } - - final source = context.read(); - source.pauseMonitoring(); - final opId = mediaFileService.newOpId; - showOpReport( - context: context, - opStream: mediaFileService.move( - opId: opId, - entries: todoItems, - copy: copy, - destinationAlbum: destinationAlbum, - nameConflictStrategy: nameConflictStrategy, - ), - itemCount: todoCount, - onCancel: () => mediaFileService.cancelFileOp(opId), - onDone: (processed) async { - final successOps = processed.where((e) => e.success).toSet(); - final movedOps = successOps.where((e) => !e.skipped).toSet(); - await source.updateAfterMove( - todoEntries: todoItems, - copy: copy, - destinationAlbum: destinationAlbum, - movedOps: movedOps, - ); - selection.browse(); - source.resumeMonitoring(); - - // cleanup - if (moveType == MoveType.move) { - await storageService.deleteEmptyDirectories(selectionDirs); - } - - final successCount = successOps.length; - if (successCount < todoCount) { - final count = todoCount - successCount; - showFeedback(context, copy ? l10n.collectionCopyFailureFeedback(count) : l10n.collectionMoveFailureFeedback(count)); - } else { - final count = movedOps.length; - showFeedback( - context, - copy ? l10n.collectionCopySuccessFeedback(count) : l10n.collectionMoveSuccessFeedback(count), - count > 0 - ? SnackBarAction( - label: l10n.showButtonLabel, - onPressed: () async { - final highlightInfo = context.read(); - final collection = context.read(); - var targetCollection = collection; - if (collection.filters.any((f) => f is AlbumFilter)) { - final filter = AlbumFilter(destinationAlbum, source.getAlbumDisplayName(context, destinationAlbum)); - // we could simply add the filter to the current collection - // but navigating makes the change less jarring - targetCollection = CollectionLens( - source: collection.source, - filters: collection.filters, - )..addFilter(filter); - unawaited(Navigator.pushReplacement( - context, - MaterialPageRoute( - settings: const RouteSettings(name: CollectionPage.routeName), - builder: (context) => CollectionPage( - collection: targetCollection, - ), - ), - )); - final delayDuration = context.read().staggeredAnimationPageTarget; - await Future.delayed(delayDuration); - } - await Future.delayed(Durations.highlightScrollInitDelay); - final newUris = movedOps.map((v) => v.newFields['uri'] as String?).toSet(); - final targetEntry = targetCollection.sortedEntries.firstWhereOrNull((entry) => newUris.contains(entry.uri)); - if (targetEntry != null) { - highlightInfo.trackItem(targetEntry, highlightItem: targetEntry); - } - }, - ) - : null, - ); - } - }, - ); + await move(context, moveType: moveType, selectedItems: selectedItems); + selection.browse(); } Future _edit( @@ -439,7 +312,7 @@ class EntrySetActionDelegate with EntryEditorMixin, FeedbackMixin, PermissionAwa final source = context.read(); source.pauseMonitoring(); var cancelled = false; - showOpReport( + await showOpReport( context: context, opStream: Stream.fromIterable(todoItems).asyncMap((entry) async { if (cancelled) { diff --git a/lib/widgets/common/action_mixins/entry_storage.dart b/lib/widgets/common/action_mixins/entry_storage.dart new file mode 100644 index 000000000..79385c0a4 --- /dev/null +++ b/lib/widgets/common/action_mixins/entry_storage.dart @@ -0,0 +1,173 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:aves/app_mode.dart'; +import 'package:aves/model/actions/move_type.dart'; +import 'package:aves/model/entry.dart'; +import 'package:aves/model/filters/album.dart'; +import 'package:aves/model/highlight.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/image_op_events.dart'; +import 'package:aves/services/common/services.dart'; +import 'package:aves/services/media/enums.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/action_mixins/feedback.dart'; +import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; +import 'package:aves/widgets/common/action_mixins/size_aware.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; +import 'package:aves/widgets/filter_grids/album_pick.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { + Future move( + BuildContext context, { + required MoveType moveType, + required Set selectedItems, + VoidCallback? onSuccess, + }) async { + final source = context.read(); + if (!source.initialized) { + // source may be uninitialized in viewer mode + await source.init(); + unawaited(source.refresh()); + } + + final l10n = context.l10n; + final selectionDirs = selectedItems.map((e) => e.directory).whereNotNull().toSet(); + + final destinationAlbum = await pickAlbum(context: context, moveType: moveType); + if (destinationAlbum == null) return; + if (!await checkStoragePermissionForAlbums(context, {destinationAlbum})) return; + + if (moveType == MoveType.move && !await checkStoragePermissionForAlbums(context, selectionDirs, entries: selectedItems)) return; + + if (!await checkFreeSpaceForMove(context, selectedItems, destinationAlbum, moveType)) return; + + // do not directly use selection when moving and post-processing items + // as source monitoring may remove obsolete items from the original selection + final todoItems = selectedItems.toSet(); + + final copy = moveType == MoveType.copy; + final todoCount = todoItems.length; + assert(todoCount > 0); + + final destinationDirectory = Directory(destinationAlbum); + final names = [ + ...todoItems.map((v) => '${v.filenameWithoutExtension}${v.extension}'), + // do not guard up front based on directory existence, + // as conflicts could be within moved entries scattered across multiple albums + if (await destinationDirectory.exists()) ...destinationDirectory.listSync().map((v) => pContext.basename(v.path)), + ]; + final uniqueNames = names.toSet(); + var nameConflictStrategy = NameConflictStrategy.rename; + if (uniqueNames.length < names.length) { + final value = await showDialog( + context: context, + builder: (context) { + return AvesSelectionDialog( + initialValue: nameConflictStrategy, + options: Map.fromEntries(NameConflictStrategy.values.map((v) => MapEntry(v, v.getName(context)))), + message: selectionDirs.length == 1 ? l10n.nameConflictDialogSingleSourceMessage : l10n.nameConflictDialogMultipleSourceMessage, + confirmationButtonLabel: l10n.continueButtonLabel, + ); + }, + ); + if (value == null) return; + nameConflictStrategy = value; + } + + source.pauseMonitoring(); + final opId = mediaFileService.newOpId; + await showOpReport( + context: context, + opStream: mediaFileService.move( + opId: opId, + entries: todoItems, + copy: copy, + destinationAlbum: destinationAlbum, + nameConflictStrategy: nameConflictStrategy, + ), + itemCount: todoCount, + onCancel: () => mediaFileService.cancelFileOp(opId), + onDone: (processed) async { + final successOps = processed.where((e) => e.success).toSet(); + final movedOps = successOps.where((e) => !e.skipped).toSet(); + await source.updateAfterMove( + todoEntries: todoItems, + copy: copy, + destinationAlbum: destinationAlbum, + movedOps: movedOps, + ); + source.resumeMonitoring(); + + // cleanup + if (moveType == MoveType.move) { + await storageService.deleteEmptyDirectories(selectionDirs); + } + + final successCount = successOps.length; + if (successCount < todoCount) { + final count = todoCount - successCount; + showFeedback(context, copy ? l10n.collectionCopyFailureFeedback(count) : l10n.collectionMoveFailureFeedback(count)); + } else { + final count = movedOps.length; + final appMode = context.read>().value; + + SnackBarAction? action; + if (count > 0 && appMode == AppMode.main) { + action = SnackBarAction( + label: l10n.showButtonLabel, + onPressed: () async { + late CollectionLens targetCollection; + + final highlightInfo = context.read(); + final collection = context.read(); + if (collection != null) { + targetCollection = collection; + } + if (collection == null || collection.filters.any((f) => f is AlbumFilter)) { + final filter = AlbumFilter(destinationAlbum, source.getAlbumDisplayName(context, destinationAlbum)); + // we could simply add the filter to the current collection + // but navigating makes the change less jarring + targetCollection = CollectionLens( + source: source, + filters: collection?.filters, + )..addFilter(filter); + unawaited(Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute( + settings: const RouteSettings(name: CollectionPage.routeName), + builder: (context) => CollectionPage( + collection: targetCollection, + ), + ), + (route) => false, + )); + final delayDuration = context.read().staggeredAnimationPageTarget; + await Future.delayed(delayDuration); + } + await Future.delayed(Durations.highlightScrollInitDelay); + final newUris = movedOps.map((v) => v.newFields['uri'] as String?).toSet(); + final targetEntry = targetCollection.sortedEntries.firstWhereOrNull((entry) => newUris.contains(entry.uri)); + if (targetEntry != null) { + highlightInfo.trackItem(targetEntry, highlightItem: targetEntry); + } + }, + ); + } + showFeedback( + context, + copy ? l10n.collectionCopySuccessFeedback(count) : l10n.collectionMoveSuccessFeedback(count), + action, + ); + onSuccess?.call(); + } + }, + ); + } +} diff --git a/lib/widgets/common/action_mixins/feedback.dart b/lib/widgets/common/action_mixins/feedback.dart index 2429565fd..08b53b5cc 100644 --- a/lib/widgets/common/action_mixins/feedback.dart +++ b/lib/widgets/common/action_mixins/feedback.dart @@ -69,14 +69,14 @@ mixin FeedbackMixin { // report overlay for multiple operations - void showOpReport({ + Future showOpReport({ required BuildContext context, required Stream opStream, required int itemCount, VoidCallback? onCancel, void Function(Set processed)? onDone, }) { - showDialog( + return showDialog( context: context, barrierDismissible: false, builder: (context) => ReportOverlay( diff --git a/lib/widgets/common/basic/menu.dart b/lib/widgets/common/basic/menu.dart index 58a5dcc4f..8bb4db14a 100644 --- a/lib/widgets/common/basic/menu.dart +++ b/lib/widgets/common/basic/menu.dart @@ -52,7 +52,7 @@ class PopupMenuItemExpansionPanel extends StatefulWidget { final bool enabled; final IconData icon; final String title; - final List> items; + final List> items; const PopupMenuItemExpansionPanel({ Key? key, diff --git a/lib/widgets/filter_grids/common/action_delegates/album_set.dart b/lib/widgets/filter_grids/common/action_delegates/album_set.dart index 786d82e0c..8dd275552 100644 --- a/lib/widgets/filter_grids/common/action_delegates/album_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/album_set.dart @@ -217,7 +217,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate { source.pauseMonitoring(); final opId = mediaFileService.newOpId; - showOpReport( + await showOpReport( context: context, opStream: mediaFileService.delete(opId: opId, entries: todoEntries), itemCount: todoCount, @@ -281,7 +281,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate { source.pauseMonitoring(); final opId = mediaFileService.newOpId; - showOpReport( + await showOpReport( context: context, opStream: mediaFileService.move( opId: opId, diff --git a/lib/widgets/settings/settings_page.dart b/lib/widgets/settings/settings_page.dart index b55e3f81a..e5d1b610b 100644 --- a/lib/widgets/settings/settings_page.dart +++ b/lib/widgets/settings/settings_page.dart @@ -54,11 +54,11 @@ class _SettingsPageState extends State with FeedbackMixin { return [ PopupMenuItem( value: SettingsAction.export, - child: MenuRow(text: context.l10n.settingsActionExport, icon: const Icon(AIcons.export)), + child: MenuRow(text: context.l10n.settingsActionExport, icon: const Icon(AIcons.fileExport)), ), PopupMenuItem( value: SettingsAction.import, - child: MenuRow(text: context.l10n.settingsActionImport, icon: const Icon(AIcons.import)), + child: MenuRow(text: context.l10n.settingsActionImport, icon: const Icon(AIcons.fileImport)), ), ]; }, diff --git a/lib/widgets/settings/viewer/viewer_actions_editor.dart b/lib/widgets/settings/viewer/viewer_actions_editor.dart index 80e59c7f4..17018e0df 100644 --- a/lib/widgets/settings/viewer/viewer_actions_editor.dart +++ b/lib/widgets/settings/viewer/viewer_actions_editor.dart @@ -30,16 +30,7 @@ class ViewerActionEditorPage extends StatelessWidget { const ViewerActionEditorPage({Key? key}) : super(key: key); static const allAvailableActions = [ - EntryAction.info, - EntryAction.toggleFavourite, - EntryAction.share, - EntryAction.delete, - EntryAction.rename, - EntryAction.export, - EntryAction.addShortcut, - EntryAction.copyToClipboard, - EntryAction.print, - EntryAction.rotateScreen, + ...EntryActions.topLevel, EntryAction.rotateCCW, EntryAction.rotateCW, EntryAction.flip, diff --git a/lib/widgets/viewer/action/entry_action_delegate.dart b/lib/widgets/viewer/action/entry_action_delegate.dart index f0e1aab86..d90ba4284 100644 --- a/lib/widgets/viewer/action/entry_action_delegate.dart +++ b/lib/widgets/viewer/action/entry_action_delegate.dart @@ -17,6 +17,7 @@ import 'package:aves/services/media/enums.dart'; import 'package:aves/services/media/media_file_service.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/action_mixins/entry_storage.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; import 'package:aves/widgets/common/action_mixins/size_aware.dart'; @@ -36,7 +37,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; -class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMixin, SingleEntryEditorMixin { +class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMixin, SingleEntryEditorMixin, EntryStorageMixin { @override final AvesEntry entry; @@ -55,11 +56,8 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix case EntryAction.delete: _delete(context); break; - case EntryAction.export: - _export(context); - break; - case EntryAction.info: - ShowInfoNotification().dispatch(context); + case EntryAction.convert: + _convert(context); break; case EntryAction.print: EntryPrinter(entry).print(context); @@ -67,6 +65,12 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix case EntryAction.rename: _rename(context); break; + case EntryAction.copy: + _move(context, moveType: MoveType.copy); + break; + case EntryAction.move: + _move(context, moveType: MoveType.move); + break; case EntryAction.share: androidAppService.shareEntries({entry}).then((success) { if (!success) showNoMatchingAppDialog(context); @@ -188,11 +192,17 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix if (source.initialized) { await source.removeEntries({entry.uri}); } - EntryDeletedNotification(entry).dispatch(context); + EntryRemovedNotification(entry).dispatch(context); } } - Future _export(BuildContext context) async { + Future _convert(BuildContext context) async { + final options = await showDialog( + context: context, + builder: (context) => ExportEntryDialog(entry: entry), + ); + if (options == null) return; + final source = context.read(); if (!source.initialized) { await source.init(); @@ -204,12 +214,6 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix if (!await checkFreeSpaceForMove(context, {entry}, destinationAlbum, MoveType.export)) return; - final options = await showDialog( - context: context, - builder: (context) => ExportEntryDialog(entry: entry), - ); - if (options == null) return; - final selection = {}; if (entry.isMultiPage) { final multiPageInfo = await entry.getMultiPageInfo(); @@ -227,9 +231,8 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix final selectionCount = selection.length; source.pauseMonitoring(); - showOpReport( + await showOpReport( context: context, - // TODO TLAD [SVG] export separately from raster images (sending bytes, like frame captures) opStream: mediaFileService.export( selection, options: options, @@ -293,6 +296,15 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix ); } + Future _move(BuildContext context, {required MoveType moveType}) async { + await move( + context, + moveType: moveType, + selectedItems: {entry}, + onSuccess: moveType == MoveType.move ? () => EntryRemovedNotification(entry).dispatch(context) : null, + ); + } + Future _rename(BuildContext context) async { final newName = await showDialog( context: context, diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index 299ea5bf2..67cd51461 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -195,8 +195,8 @@ class _EntryViewerStackState extends State with FeedbackMixin, onNotification: (dynamic notification) { if (notification is FilterSelectedNotification) { _goToCollection(notification.filter); - } else if (notification is EntryDeletedNotification) { - _onEntryDeleted(context, notification.entry); + } else if (notification is EntryRemovedNotification) { + _onEntryRemoved(context, notification.entry); } return false; }, @@ -453,7 +453,8 @@ class _EntryViewerStackState extends State with FeedbackMixin, _updateEntry(); } - void _onEntryDeleted(BuildContext context, AvesEntry entry) { + void _onEntryRemoved(BuildContext context, AvesEntry entry) { + // deleted or moved to another album if (hasCollection) { final entries = collection!.sortedEntries; entries.remove(entry); diff --git a/lib/widgets/viewer/info/notifications.dart b/lib/widgets/viewer/info/notifications.dart index 1e97fafa8..e46ced611 100644 --- a/lib/widgets/viewer/info/notifications.dart +++ b/lib/widgets/viewer/info/notifications.dart @@ -12,8 +12,9 @@ class FilterSelectedNotification extends Notification { const FilterSelectedNotification(this.filter); } -class EntryDeletedNotification extends Notification { +// deleted or moved to another album +class EntryRemovedNotification extends Notification { final AvesEntry entry; - const EntryDeletedNotification(this.entry); + const EntryRemovedNotification(this.entry); } diff --git a/lib/widgets/viewer/overlay/top.dart b/lib/widgets/viewer/overlay/top.dart index 846f258d5..7fb39b04a 100644 --- a/lib/widgets/viewer/overlay/top.dart +++ b/lib/widgets/viewer/overlay/top.dart @@ -3,8 +3,10 @@ import 'package:aves/model/device.dart'; 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/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/favourite_toggler.dart'; import 'package:aves/widgets/viewer/action/entry_action_delegate.dart'; import 'package:aves/widgets/viewer/multipage/conductor.dart'; @@ -13,6 +15,7 @@ import 'package:aves/widgets/viewer/overlay/minimap.dart'; import 'package:aves/widgets/viewer/overlay/notifications.dart'; import 'package:aves/widgets/viewer/page_entry_builder.dart'; import 'package:aves/widgets/viewer/visual/conductor.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -70,12 +73,14 @@ class ViewerTopOverlay extends StatelessWidget { return canToggleFavourite; case EntryAction.delete: case EntryAction.rename: + case EntryAction.copy: + case EntryAction.move: return targetEntry.canEdit; case EntryAction.rotateCCW: case EntryAction.rotateCW: case EntryAction.flip: return targetEntry.canRotateAndFlip; - case EntryAction.export: + case EntryAction.convert: case EntryAction.print: return !targetEntry.isVideo && device.canPrint; case EntryAction.openMap: @@ -88,7 +93,6 @@ class ViewerTopOverlay extends StatelessWidget { return device.canPinShortcut; case EntryAction.copyToClipboard: case EntryAction.edit: - case EntryAction.info: case EntryAction.open: case EntryAction.setAs: case EntryAction.share: @@ -102,12 +106,12 @@ class ViewerTopOverlay extends StatelessWidget { selector: (context, s) => s.isRotationLocked, builder: (context, s, child) { final quickActions = settings.viewerQuickActions.where(_isVisible).take(availableCount - 1).toList(); - final inAppActions = EntryActions.inApp.where((action) => !quickActions.contains(action)).where(_isVisible).toList(); - final externalAppActions = EntryActions.externalApp.where(_isVisible).toList(); + final topLevelActions = EntryActions.topLevel.where((action) => !quickActions.contains(action)).where(_isVisible).toList(); + final exportActions = EntryActions.export.where((action) => !quickActions.contains(action)).where(_isVisible).toList(); return _TopOverlayRow( quickActions: quickActions, - inAppActions: inAppActions, - externalAppActions: externalAppActions, + topLevelActions: topLevelActions, + exportActions: exportActions, scale: scale, mainEntry: mainEntry, pageEntry: pageEntry!, @@ -138,7 +142,7 @@ class ViewerTopOverlay extends StatelessWidget { } class _TopOverlayRow extends StatelessWidget { - final List quickActions, inAppActions, externalAppActions; + final List quickActions, topLevelActions, exportActions; final Animation scale; final AvesEntry mainEntry, pageEntry; @@ -147,8 +151,8 @@ class _TopOverlayRow extends StatelessWidget { const _TopOverlayRow({ Key? key, required this.quickActions, - required this.inAppActions, - required this.externalAppActions, + required this.topLevelActions, + required this.exportActions, required this.scale, required this.mainEntry, required this.pageEntry, @@ -169,16 +173,30 @@ class _TopOverlayRow extends StatelessWidget { child: MenuIconTheme( child: AvesPopupMenuButton( key: const Key('entry-menu-button'), - itemBuilder: (context) => [ - ...inAppActions.map((action) => _buildPopupMenuItem(context, action)), - if (pageEntry.canRotateAndFlip) _buildRotateAndFlipMenuItems(context), - const PopupMenuDivider(), - ...externalAppActions.map((action) => _buildPopupMenuItem(context, action)), - if (!kReleaseMode) ...[ - const PopupMenuDivider(), - _buildPopupMenuItem(context, EntryAction.debug), - ] - ], + itemBuilder: (context) { + final exportInternalActions = exportActions.whereNot(EntryActions.exportExternal.contains).toList(); + final exportExternalActions = exportActions.where(EntryActions.exportExternal.contains).toList(); + return [ + if (pageEntry.canRotateAndFlip) _buildRotateAndFlipMenuItems(context), + ...topLevelActions.map((action) => _buildPopupMenuItem(context, action)), + PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupMenuItemExpansionPanel( + icon: AIcons.export, + title: context.l10n.entryActionExport, + items: [ + ...exportInternalActions.map((action) => _buildPopupMenuItem(context, action)).toList(), + if (exportInternalActions.isNotEmpty && exportExternalActions.isNotEmpty) const PopupMenuDivider(height: 0), + ...exportExternalActions.map((action) => _buildPopupMenuItem(context, action)).toList(), + ], + ), + ), + if (!kReleaseMode) ...[ + const PopupMenuDivider(), + _buildPopupMenuItem(context, EntryAction.debug), + ] + ]; + }, onSelected: (action) { // wait for the popup menu to hide before proceeding with the action Future.delayed(Durations.popupMenuAnimation * timeDilation, () => _onActionSelected(context, action)); @@ -206,44 +224,24 @@ class _TopOverlayRow extends StatelessWidget { onPressed: onPressed, ); break; - case EntryAction.addShortcut: - case EntryAction.copyToClipboard: - case EntryAction.delete: - case EntryAction.export: - case EntryAction.flip: - case EntryAction.info: - case EntryAction.print: - case EntryAction.rename: - case EntryAction.rotateCCW: - case EntryAction.rotateCW: - case EntryAction.share: - case EntryAction.rotateScreen: - case EntryAction.viewSource: + default: child = IconButton( icon: action.getIcon() ?? const SizedBox(), onPressed: onPressed, tooltip: action.getText(context), ); break; - case EntryAction.openMap: - case EntryAction.open: - case EntryAction.edit: - case EntryAction.setAs: - case EntryAction.debug: - break; } - return child != null - ? Padding( - padding: const EdgeInsetsDirectional.only(end: ViewerTopOverlay.innerPadding), - child: OverlayButton( - scale: scale, - child: child, - ), - ) - : const SizedBox.shrink(); + return Padding( + padding: const EdgeInsetsDirectional.only(end: ViewerTopOverlay.innerPadding), + child: OverlayButton( + scale: scale, + child: child, + ), + ); } - PopupMenuEntry _buildPopupMenuItem(BuildContext context, EntryAction action) { + PopupMenuItem _buildPopupMenuItem(BuildContext context, EntryAction action) { Widget? child; switch (action) { // in app actions diff --git a/untranslated.json b/untranslated.json index 7a627567e..f3738f5d2 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,5 +1,10 @@ { + "de": [ + "entryActionConvert" + ], + "es": [ + "entryActionConvert", "entryInfoActionEditLocation", "exportEntryDialogWidth", "exportEntryDialogHeight", @@ -8,5 +13,21 @@ "editEntryLocationDialogLatitude", "editEntryLocationDialogLongitude", "locationPickerUseThisLocationButton" + ], + + "fr": [ + "entryActionConvert" + ], + + "ko": [ + "entryActionConvert" + ], + + "pt": [ + "entryActionConvert" + ], + + "ru": [ + "entryActionConvert" ] } From dcca364ffae53e60f2def90513d95b132cdc3d16 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 4 Feb 2022 18:39:00 +0900 Subject: [PATCH 09/39] static analysis --- lib/widgets/viewer/action/printer.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/widgets/viewer/action/printer.dart b/lib/widgets/viewer/action/printer.dart index 9db7aec24..8f2526db6 100644 --- a/lib/widgets/viewer/action/printer.dart +++ b/lib/widgets/viewer/action/printer.dart @@ -52,11 +52,11 @@ class EntryPrinter with FeedbackMixin { final pageCount = multiPageInfo.pageCount; if (pageCount > 1) { final streamController = StreamController.broadcast(); - showOpReport( + unawaited(showOpReport( context: context, opStream: streamController.stream, itemCount: pageCount, - ); + )); for (var page = 0; page < pageCount; page++) { final pageEntry = multiPageInfo.getPageEntryByIndex(page); _addPdfPage(await _buildPageImage(pageEntry)); From a71a30130bd61a347b4b48ff90a6ec62ec61e2e8 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 4 Feb 2022 18:42:56 +0900 Subject: [PATCH 10/39] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7dec61cd..b0a042f9c 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ At this stage this project does *not* accept PRs, except for translations. ### 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 and Spanish are handled by generous volunteers. +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 are handled by generous volunteers. ### Donations From 3ea5ddd7533ebe86b9c2d0117a65aff99425f8d6 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Mon, 7 Feb 2022 13:05:05 +0900 Subject: [PATCH 11/39] minor fixes --- .../aves/SearchSuggestionsProvider.kt | 43 +++++++++++-------- .../channel/calls/MetadataFetchHandler.kt | 7 ++- .../thibault/aves/metadata/SphericalVideo.kt | 4 +- .../deckers/thibault/aves/utils/MimeTypes.kt | 6 ++- lib/widgets/aves_app.dart | 31 ++++++++++--- lib/widgets/dialogs/aves_dialog.dart | 2 +- lib/widgets/dialogs/export_entry_dialog.dart | 22 ++++++---- 7 files changed, 74 insertions(+), 41 deletions(-) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt index ca9ba2fa7..c785cebd5 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt @@ -77,29 +77,34 @@ class SearchSuggestionsProvider : MethodChannel.MethodCallHandler, ContentProvid val backgroundChannel = MethodChannel(messenger, BACKGROUND_CHANNEL) backgroundChannel.setMethodCallHandler(this) - return suspendCoroutine { cont -> - GlobalScope.launch { - FlutterUtils.runOnUiThread { - backgroundChannel.invokeMethod("getSuggestions", hashMapOf( - "query" to query, - "locale" to Locale.getDefault().toString(), - "use24hour" to DateFormat.is24HourFormat(context), - ), object : MethodChannel.Result { - override fun success(result: Any?) { - @Suppress("unchecked_cast") - cont.resume(result as List) - } + try { + return suspendCoroutine { cont -> + GlobalScope.launch { + FlutterUtils.runOnUiThread { + backgroundChannel.invokeMethod("getSuggestions", hashMapOf( + "query" to query, + "locale" to Locale.getDefault().toString(), + "use24hour" to DateFormat.is24HourFormat(context), + ), object : MethodChannel.Result { + override fun success(result: Any?) { + @Suppress("unchecked_cast") + cont.resume(result as List) + } - override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { - cont.resumeWithException(Exception("$errorCode: $errorMessage\n$errorDetails")) - } + override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { + cont.resumeWithException(Exception("$errorCode: $errorMessage\n$errorDetails")) + } - override fun notImplemented() { - cont.resumeWithException(NotImplementedError("getSuggestions")) - } - }) + override fun notImplemented() { + cont.resumeWithException(NotImplementedError("getSuggestions")) + } + }) + } } } + } catch (e: Exception) { + Log.e(LOG_TAG, "failed to get suggestions", e) + return ArrayList() } } 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 b461e2b9f..dcf6d31c5 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 @@ -80,7 +80,6 @@ import kotlinx.coroutines.launch import java.nio.charset.Charset import java.nio.charset.StandardCharsets import java.text.ParseException -import java.util.* import kotlin.math.roundToInt import kotlin.math.roundToLong @@ -412,19 +411,19 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { // File type for (dir in metadata.getDirectoriesOfType(FileTypeDirectory::class.java)) { - // * `metadata-extractor` sometimes detects the wrong MIME type (e.g. `pef` file as `tiff`, `mpeg` as `dvd`) + // * `metadata-extractor` sometimes detects the wrong MIME type (e.g. `pef` file as `tiff`, `mpeg` as `dvd`, `avif` as `mov`) // * the content resolver / media store sometimes reports the wrong MIME type (e.g. `png` file as `jpeg`, `tiff` as `srw`) // * `context.getContentResolver().getType()` sometimes returns an incorrect value // * `MediaMetadataRetriever.setDataSource()` sometimes fails with `status = 0x80000000` // * file extension is unreliable - // In the end, `metadata-extractor` is the most reliable, except for `tiff`/`dvd` (false positives, false negatives), + // In the end, `metadata-extractor` is the most reliable, except for `tiff`/`dvd`/`mov` (false positives, false negatives), // in which case we trust the file extension // cf https://github.com/drewnoakes/metadata-extractor/issues/296 if (path?.matches(TIFF_EXTENSION_PATTERN) == true) { metadataMap[KEY_MIME_TYPE] = MimeTypes.TIFF } else { dir.getSafeString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE) { - if (it != MimeTypes.TIFF && it != MimeTypes.DVD) { + if (it != MimeTypes.TIFF && it != MimeTypes.DVD && it != MimeTypes.MOV) { metadataMap[KEY_MIME_TYPE] = it } } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SphericalVideo.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SphericalVideo.kt index 23f5e9020..e2a1c45e4 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SphericalVideo.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/SphericalVideo.kt @@ -62,7 +62,7 @@ class GSpherical(xmlBytes: ByteArray) { } } - fun describe(): Map = hashMapOf( + fun describe(): Map = hashMapOf( "Spherical" to spherical.toString(), "Stitched" to stitched.toString(), "Stitching Software" to stitchingSoftware, @@ -79,7 +79,7 @@ class GSpherical(xmlBytes: ByteArray) { "Cropped Area Image Height Pixels" to croppedAreaImageHeightPixels?.toString(), "Cropped Area Left Pixels" to croppedAreaLeftPixels?.toString(), "Cropped Area Top Pixels" to croppedAreaTopPixels?.toString(), - ).filterValues { it != null } + ).filterValues { it != null }.mapValues { it.value as String } companion object SphericalVideo { private val LOG_TAG = LogUtils.createTag() 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 51d83b4a3..15d64b552 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 @@ -6,6 +6,7 @@ object MimeTypes { const val ANY = "*/*" // generic raster + private const val AVIF = "image/avif" const val BMP = "image/bmp" private const val DJVU = "image/vnd.djvu" const val GIF = "image/gif" @@ -49,7 +50,7 @@ object MimeTypes { private const val AVI_VND = "video/vnd.avi" const val DVD = "video/dvd" private const val MKV = "video/x-matroska" - private const val MOV = "video/quicktime" + const val MOV = "video/quicktime" private const val MP2T = "video/mp2t" private const val MP2TS = "video/mp2ts" const val MP4 = "video/mp4" @@ -72,7 +73,7 @@ object MimeTypes { // returns whether the specified MIME type represents // a raster image format that allows an alpha channel fun canHaveAlpha(mimeType: String?) = when (mimeType) { - BMP, GIF, ICO, PNG, SVG, TIFF, WEBP -> true + AVIF, BMP, GIF, ICO, PNG, SVG, TIFF, WEBP -> true else -> false } @@ -150,6 +151,7 @@ object MimeTypes { fun extensionFor(mimeType: String): String? = when (mimeType) { ARW -> ".arw" AVI, AVI_VND -> ".avi" + AVIF -> ".avif" BMP -> ".bmp" CR2 -> ".cr2" CRW -> ".crw" diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index 995ad2040..d8b8e5d4a 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -158,15 +158,35 @@ class _AvesAppState extends State { ); } + // setup before the first page is displayed. keep it short Future _setup() async { + final stopwatch = Stopwatch()..start(); + + // TODO TLAD [init] init settings/device w/o platform calls (first platform channel call takes ~800ms): + // 1) use cached values if any, + // 2a) call platform w/ delay if cached + // 2b) call platform w/o delay if not cached + // 3) cache platform call results across app restarts + + await device.init(); + final isRotationLocked = await windowService.isRotationLocked(); + final areAnimationsRemoved = await AccessibilityService.areAnimationsRemoved(); + + // TODO TLAD [init] migrate settings away from `shared_preferences` to a platform-free solution await settings.init( monitorPlatformSettings: true, - isRotationLocked: await windowService.isRotationLocked(), - areAnimationsRemoved: await AccessibilityService.areAnimationsRemoved(), + isRotationLocked: isRotationLocked, + areAnimationsRemoved: areAnimationsRemoved, ); - await device.init(); - FijkLog.setLevel(FijkLogLevel.Warn); + _monitorSettings(); + FijkLog.setLevel(FijkLogLevel.Warn); + unawaited(_setupErrorReporting()); + + debugPrint('App setup in ${stopwatch.elapsed.inMilliseconds}ms'); + } + + void _monitorSettings() { // keep screen on settings.updateStream.where((key) => key == Settings.keepScreenOnKey).listen( (_) => settings.keepScreenOn.apply(), @@ -183,8 +203,9 @@ class _AvesAppState extends State { } }, ); + } - // error reporting + Future _setupErrorReporting() async { await reportService.init(); settings.updateStream.where((key) => key == Settings.isErrorReportingAllowedKey).listen( (_) => reportService.setCollectionEnabled(settings.isErrorReportingAllowed), diff --git a/lib/widgets/dialogs/aves_dialog.dart b/lib/widgets/dialogs/aves_dialog.dart index 020a70956..cdc9d6d2a 100644 --- a/lib/widgets/dialogs/aves_dialog.dart +++ b/lib/widgets/dialogs/aves_dialog.dart @@ -44,7 +44,7 @@ class AvesDialog extends StatelessWidget { // and overflow feedback ignores the dialog shape, // so we restrict scrolling to the content instead content: _buildContent(context), - contentPadding: scrollableContent != null ? EdgeInsets.zero : EdgeInsets.fromLTRB(horizontalContentPadding, 20, horizontalContentPadding, 0), + contentPadding: scrollableContent != null ? EdgeInsets.zero : EdgeInsets.only(left: horizontalContentPadding, top: 20, right: horizontalContentPadding), actions: actions, actionsPadding: const EdgeInsets.symmetric(horizontal: 8), shape: shape(context), diff --git a/lib/widgets/dialogs/export_entry_dialog.dart b/lib/widgets/dialogs/export_entry_dialog.dart index 1fc67ee6e..d84b6c10d 100644 --- a/lib/widgets/dialogs/export_entry_dialog.dart +++ b/lib/widgets/dialogs/export_entry_dialog.dart @@ -51,12 +51,14 @@ class _ExportEntryDialogState extends State { @override Widget build(BuildContext context) { final l10n = context.l10n; + const contentHorizontalPadding = EdgeInsets.symmetric(horizontal: AvesDialog.defaultHorizontalContentPadding); + return AvesDialog( - content: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( + scrollableContent: [ + const SizedBox(height: 16), + Padding( + padding: contentHorizontalPadding, + child: Row( mainAxisSize: MainAxisSize.min, children: [ Text(l10n.exportEntryDialogFormat), @@ -77,7 +79,10 @@ class _ExportEntryDialogState extends State { ), ], ), - Row( + ), + Padding( + padding: contentHorizontalPadding, + child: Row( crossAxisAlignment: CrossAxisAlignment.baseline, textBaseline: TextBaseline.alphabetic, children: [ @@ -108,8 +113,9 @@ class _ExportEntryDialogState extends State { ), ], ), - ], - ), + ), + const SizedBox(height: 16), + ], actions: [ TextButton( onPressed: () => Navigator.pop(context), From b9ef0300014b996fa97c4fe8eff1527e2b0de46a Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Tue, 8 Feb 2022 11:41:37 +0900 Subject: [PATCH 12/39] map: removed connectivity check, harmonized layer background --- lib/widgets/common/map/geo_map.dart | 211 +++++++++--------- .../common/map/leaflet/tile_layers.dart | 5 + lib/widgets/map/map_page.dart | 6 +- 3 files changed, 109 insertions(+), 113 deletions(-) diff --git a/lib/widgets/common/map/geo_map.dart b/lib/widgets/common/map/geo_map.dart index f52cae77e..ffd8176a6 100644 --- a/lib/widgets/common/map/geo_map.dart +++ b/lib/widgets/common/map/geo_map.dart @@ -5,7 +5,6 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/enums.dart'; import 'package:aves/model/settings/map_style.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/services/common/services.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/utils/change_notifier.dart'; import 'package:aves/utils/constants.dart'; @@ -152,117 +151,111 @@ class _GeoMapState extends State { onTap(clusterAverageLocation, markerEntry, getClusterEntries); } - return FutureBuilder( - future: availability.isConnected, - builder: (context, snapshot) { - if (snapshot.data != true) return const SizedBox(); - return Selector( - selector: (context, s) => s.infoMapStyle, - builder: (context, mapStyle, child) { - final isGoogleMaps = mapStyle.isGoogleMaps; - final progressive = !isGoogleMaps; - Widget _buildMarkerWidget(MarkerKey key) => ImageMarker( - key: key, - entry: key.entry, - count: key.count, - extent: GeoMap.markerImageExtent, - arrowSize: GeoMap.markerArrowSize, - progressive: progressive, - ); + return Selector( + selector: (context, s) => s.infoMapStyle, + builder: (context, mapStyle, child) { + final isGoogleMaps = mapStyle.isGoogleMaps; + final progressive = !isGoogleMaps; + Widget _buildMarkerWidget(MarkerKey key) => ImageMarker( + key: key, + entry: key.entry, + count: key.count, + extent: GeoMap.markerImageExtent, + arrowSize: GeoMap.markerArrowSize, + progressive: progressive, + ); - Widget child = isGoogleMaps - ? EntryGoogleMap( - controller: widget.controller, - clusterListenable: _clusterChangeNotifier, - boundsNotifier: _boundsNotifier, - minZoom: 0, - maxZoom: 20, - style: mapStyle, - markerClusterBuilder: _buildMarkerClusters, - markerWidgetBuilder: _buildMarkerWidget, - dotLocationNotifier: widget.dotLocationNotifier, - onUserZoomChange: widget.onUserZoomChange, - onMapTap: widget.onMapTap, - onMarkerTap: _onMarkerTap, - openMapPage: widget.openMapPage, - ) - : EntryLeafletMap( - controller: widget.controller, - clusterListenable: _clusterChangeNotifier, - boundsNotifier: _boundsNotifier, - minZoom: 2, - maxZoom: 16, - style: mapStyle, - markerClusterBuilder: _buildMarkerClusters, - markerWidgetBuilder: _buildMarkerWidget, - dotLocationNotifier: widget.dotLocationNotifier, - markerSize: Size( - GeoMap.markerImageExtent + ImageMarker.outerBorderWidth * 2, - GeoMap.markerImageExtent + ImageMarker.outerBorderWidth * 2 + GeoMap.markerArrowSize.height, - ), - dotMarkerSize: const Size( - DotMarker.diameter + ImageMarker.outerBorderWidth * 2, - DotMarker.diameter + ImageMarker.outerBorderWidth * 2, - ), - onUserZoomChange: widget.onUserZoomChange, - onMapTap: widget.onMapTap, - onMarkerTap: _onMarkerTap, - openMapPage: widget.openMapPage, - ); - - final mapHeight = context.select((v) => v.mapHeight); - child = Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - mapHeight != null - ? SizedBox( - height: mapHeight, - child: child, - ) - : Expanded(child: child), - SafeArea( - top: false, - bottom: false, - child: Attribution(style: mapStyle), + Widget child = isGoogleMaps + ? EntryGoogleMap( + controller: widget.controller, + clusterListenable: _clusterChangeNotifier, + boundsNotifier: _boundsNotifier, + minZoom: 0, + maxZoom: 20, + style: mapStyle, + markerClusterBuilder: _buildMarkerClusters, + markerWidgetBuilder: _buildMarkerWidget, + dotLocationNotifier: widget.dotLocationNotifier, + onUserZoomChange: widget.onUserZoomChange, + onMapTap: widget.onMapTap, + onMarkerTap: _onMarkerTap, + openMapPage: widget.openMapPage, + ) + : EntryLeafletMap( + controller: widget.controller, + clusterListenable: _clusterChangeNotifier, + boundsNotifier: _boundsNotifier, + minZoom: 2, + maxZoom: 16, + style: mapStyle, + markerClusterBuilder: _buildMarkerClusters, + markerWidgetBuilder: _buildMarkerWidget, + dotLocationNotifier: widget.dotLocationNotifier, + markerSize: Size( + GeoMap.markerImageExtent + ImageMarker.outerBorderWidth * 2, + GeoMap.markerImageExtent + ImageMarker.outerBorderWidth * 2 + GeoMap.markerArrowSize.height, ), - ], - ); + dotMarkerSize: const Size( + DotMarker.diameter + ImageMarker.outerBorderWidth * 2, + DotMarker.diameter + ImageMarker.outerBorderWidth * 2, + ), + onUserZoomChange: widget.onUserZoomChange, + onMapTap: widget.onMapTap, + onMarkerTap: _onMarkerTap, + openMapPage: widget.openMapPage, + ); - return AnimatedSize( - alignment: Alignment.topCenter, - curve: Curves.easeInOutCubic, - duration: Durations.mapStyleSwitchAnimation, - child: ValueListenableBuilder( - valueListenable: widget.isAnimatingNotifier, - builder: (context, animating, child) { - if (!animating && isGoogleMaps) { - _googleMapsLoaded = true; - } - Widget replacement = Stack( - children: [ - const MapDecorator(), - MapButtonPanel( - boundsNotifier: _boundsNotifier, - openMapPage: widget.openMapPage, - ), - ], - ); - if (mapHeight != null) { - replacement = SizedBox( - height: mapHeight, - child: replacement, - ); - } - return Visibility( - visible: !isGoogleMaps || _googleMapsLoaded, - replacement: replacement, - child: child!, - ); - }, - child: child, - ), - ); - }, + final mapHeight = context.select((v) => v.mapHeight); + child = Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + mapHeight != null + ? SizedBox( + height: mapHeight, + child: child, + ) + : Expanded(child: child), + SafeArea( + top: false, + bottom: false, + child: Attribution(style: mapStyle), + ), + ], + ); + + return AnimatedSize( + alignment: Alignment.topCenter, + curve: Curves.easeInOutCubic, + duration: Durations.mapStyleSwitchAnimation, + child: ValueListenableBuilder( + valueListenable: widget.isAnimatingNotifier, + builder: (context, animating, child) { + if (!animating && isGoogleMaps) { + _googleMapsLoaded = true; + } + Widget replacement = Stack( + children: [ + const MapDecorator(), + MapButtonPanel( + boundsNotifier: _boundsNotifier, + openMapPage: widget.openMapPage, + ), + ], + ); + if (mapHeight != null) { + replacement = SizedBox( + height: mapHeight, + child: replacement, + ); + } + return Visibility( + visible: !isGoogleMaps || _googleMapsLoaded, + replacement: replacement, + child: child!, + ); + }, + child: child, + ), ); }, ); diff --git a/lib/widgets/common/map/leaflet/tile_layers.dart b/lib/widgets/common/map/leaflet/tile_layers.dart index 759502bcb..069a0967c 100644 --- a/lib/widgets/common/map/leaflet/tile_layers.dart +++ b/lib/widgets/common/map/leaflet/tile_layers.dart @@ -3,6 +3,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:provider/provider.dart'; +const _tileLayerBackgroundColor = Colors.transparent; + class OSMHotLayer extends StatelessWidget { const OSMHotLayer({Key? key}) : super(key: key); @@ -12,6 +14,7 @@ class OSMHotLayer extends StatelessWidget { options: TileLayerOptions( urlTemplate: 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', subdomains: ['a', 'b', 'c'], + backgroundColor: _tileLayerBackgroundColor, tileProvider: _NetworkTileProvider(), retinaMode: context.select((mq) => mq.devicePixelRatio) > 1, ), @@ -28,6 +31,7 @@ class StamenTonerLayer extends StatelessWidget { options: TileLayerOptions( urlTemplate: 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}{r}.png', subdomains: ['a', 'b', 'c', 'd'], + backgroundColor: _tileLayerBackgroundColor, tileProvider: _NetworkTileProvider(), retinaMode: context.select((mq) => mq.devicePixelRatio) > 1, ), @@ -44,6 +48,7 @@ class StamenWatercolorLayer extends StatelessWidget { options: TileLayerOptions( urlTemplate: 'https://stamen-tiles-{s}.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg', subdomains: ['a', 'b', 'c', 'd'], + backgroundColor: _tileLayerBackgroundColor, tileProvider: _NetworkTileProvider(), retinaMode: context.select((mq) => mq.devicePixelRatio) > 1, ), diff --git a/lib/widgets/map/map_page.dart b/lib/widgets/map/map_page.dart index 171eafe28..214dd0398 100644 --- a/lib/widgets/map/map_page.dart +++ b/lib/widgets/map/map_page.dart @@ -83,7 +83,7 @@ class _Content extends StatefulWidget { class _ContentState extends State<_Content> with SingleTickerProviderStateMixin { final List _subscriptions = []; final AvesMapController _mapController = AvesMapController(); - late final ValueNotifier _isPageAnimatingNotifier; + final ValueNotifier _isPageAnimatingNotifier = ValueNotifier(false); final ValueNotifier _selectedIndexNotifier = ValueNotifier(0); final ValueNotifier _regionCollectionNotifier = ValueNotifier(null); final ValueNotifier _dotLocationNotifier = ValueNotifier(null); @@ -102,13 +102,11 @@ class _ContentState extends State<_Content> with SingleTickerProviderStateMixin super.initState(); if (settings.infoMapStyle.isGoogleMaps) { - _isPageAnimatingNotifier = ValueNotifier(true); + _isPageAnimatingNotifier.value = true; Future.delayed(Durations.pageTransitionAnimation * timeDilation).then((_) { if (!mounted) return; _isPageAnimatingNotifier.value = false; }); - } else { - _isPageAnimatingNotifier = ValueNotifier(false); } _dotEntryNotifier.addListener(_updateInfoEntry); From 6c145d5bb58afbb64ec9c5cbbbda56cfa749df2c Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Tue, 8 Feb 2022 12:06:26 +0900 Subject: [PATCH 13/39] #178 pick mode: allow nav from filter pages --- lib/app_mode.dart | 8 ++++---- lib/widgets/collection/app_bar.dart | 4 ++-- lib/widgets/collection/grid/tile.dart | 5 +++-- lib/widgets/dialogs/item_pick_dialog.dart | 2 +- lib/widgets/filter_grids/album_pick.dart | 2 +- lib/widgets/filter_grids/common/filter_tile.dart | 5 +++-- lib/widgets/home_page.dart | 4 ++-- 7 files changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/app_mode.dart b/lib/app_mode.dart index b93ec33e6..34f38a48b 100644 --- a/lib/app_mode.dart +++ b/lib/app_mode.dart @@ -1,11 +1,11 @@ -enum AppMode { main, pickExternal, pickInternal, view } +enum AppMode { main, pickMediaExternal, pickMediaInternal, pickFilterInternal, view } extension ExtraAppMode on AppMode { - bool get canSearch => this == AppMode.main || this == AppMode.pickExternal; + bool get canSearch => this == AppMode.main || this == AppMode.pickMediaExternal; bool get canSelect => this == AppMode.main; - bool get hasDrawer => this == AppMode.main || this == AppMode.pickExternal; + bool get hasDrawer => this == AppMode.main || this == AppMode.pickMediaExternal; - bool get isPicking => this == AppMode.pickExternal || this == AppMode.pickInternal; + bool get isPickingMedia => this == AppMode.pickMediaExternal || this == AppMode.pickMediaInternal; } diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index 7ba7144ff..04c8be3a9 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -110,7 +110,7 @@ class _CollectionAppBarState extends State with SingleTickerPr return AnimatedBuilder( animation: collection.filterChangeNotifier, builder: (context, child) { - final removableFilters = appMode != AppMode.pickInternal; + final removableFilters = appMode != AppMode.pickMediaInternal; return Selector( selector: (context, query) => query.enabled, builder: (context, queryEnabled, child) { @@ -185,7 +185,7 @@ class _CollectionAppBarState extends State with SingleTickerPr ); } else { final appMode = context.watch>().value; - Widget title = Text(appMode.isPicking ? l10n.collectionPickPageTitle : l10n.collectionPageTitle); + Widget title = Text(appMode.isPickingMedia ? l10n.collectionPickPageTitle : l10n.collectionPageTitle); if (appMode == AppMode.main) { title = SourceStateAwareAppBarTitle( title: title, diff --git a/lib/widgets/collection/grid/tile.dart b/lib/widgets/collection/grid/tile.dart index 0caf3dfed..cb0f82d21 100644 --- a/lib/widgets/collection/grid/tile.dart +++ b/lib/widgets/collection/grid/tile.dart @@ -43,12 +43,13 @@ class InteractiveTile extends StatelessWidget { _goToViewer(context); } break; - case AppMode.pickExternal: + case AppMode.pickMediaExternal: ViewerService.pick(entry.uri); break; - case AppMode.pickInternal: + case AppMode.pickMediaInternal: Navigator.pop(context, entry); break; + case AppMode.pickFilterInternal: case AppMode.view: break; } diff --git a/lib/widgets/dialogs/item_pick_dialog.dart b/lib/widgets/dialogs/item_pick_dialog.dart index c72252e22..7623c05e1 100644 --- a/lib/widgets/dialogs/item_pick_dialog.dart +++ b/lib/widgets/dialogs/item_pick_dialog.dart @@ -39,7 +39,7 @@ class _ItemPickDialogState extends State { Widget build(BuildContext context) { final liveFilter = collection.filters.firstWhereOrNull((v) => v is QueryFilter && v.live) as QueryFilter?; return ListenableProvider>.value( - value: ValueNotifier(AppMode.pickInternal), + value: ValueNotifier(AppMode.pickMediaInternal), child: MediaQueryDataProvider( child: Scaffold( body: SelectionProvider( diff --git a/lib/widgets/filter_grids/album_pick.dart b/lib/widgets/filter_grids/album_pick.dart index 63755740b..06dbc1aa6 100644 --- a/lib/widgets/filter_grids/album_pick.dart +++ b/lib/widgets/filter_grids/album_pick.dart @@ -65,7 +65,7 @@ class _AlbumPickPageState extends State<_AlbumPickPage> { @override Widget build(BuildContext context) { return ListenableProvider>.value( - value: ValueNotifier(AppMode.pickInternal), + value: ValueNotifier(AppMode.pickFilterInternal), child: Selector>( selector: (context, s) => Tuple2(s.albumGroupFactor, s.albumSortFactor), builder: (context, s, child) { diff --git a/lib/widgets/filter_grids/common/filter_tile.dart b/lib/widgets/filter_grids/common/filter_tile.dart index a3e01625e..f175a3101 100644 --- a/lib/widgets/filter_grids/common/filter_tile.dart +++ b/lib/widgets/filter_grids/common/filter_tile.dart @@ -51,6 +51,7 @@ class _InteractiveFilterTileState extends State>().value; switch (appMode) { case AppMode.main: + case AppMode.pickMediaExternal: final selection = context.read>>(); if (selection.isSelecting) { selection.toggleSelection(gridItem); @@ -58,10 +59,10 @@ class _InteractiveFilterTileState extends State(context, filter); break; - case AppMode.pickExternal: + case AppMode.pickMediaInternal: case AppMode.view: break; } diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index aeb9d078f..980b4531a 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -94,7 +94,7 @@ class _HomePageState extends State { } break; case 'pick': - appMode = AppMode.pickExternal; + appMode = AppMode.pickMediaExternal; // TODO TLAD apply pick mimetype(s) // some apps define multiple types, separated by a space (maybe other signs too, like `,` `;`?) String? pickMimeTypes = intentData['mimeType']; @@ -199,7 +199,7 @@ class _HomePageState extends State { String routeName; Set? filters; - if (appMode == AppMode.pickExternal) { + if (appMode == AppMode.pickMediaExternal) { routeName = CollectionPage.routeName; } else { routeName = _shortcutRouteName ?? settings.homePage.routeName; From 8b1180684cc64193f6447105a5a87cebd6ff0e43 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Thu, 10 Feb 2022 14:26:48 +0900 Subject: [PATCH 14/39] #170 perf: collection sort/group by name, save/load top entries --- android/app/build.gradle | 6 +- .../aves/channel/calls/DebugHandler.kt | 13 +- android/build.gradle | 2 +- lib/model/db/db_metadata.dart | 95 ++++++++++++ .../db_metadata_sqflite.dart} | 107 +++---------- .../db_metadata_sqflite_upgrade.dart} | 2 +- lib/model/filters/coordinate.dart | 4 +- lib/model/settings/defaults.dart | 6 +- .../{ => enums}/accessibility_animations.dart | 0 .../{ => enums}/accessibility_timeout.dart | 0 .../{ => enums}/coordinate_format.dart | 0 .../{ => enums}/entry_background.dart | 0 lib/model/settings/{ => enums}/enums.dart | 0 lib/model/settings/{ => enums}/home_page.dart | 0 lib/model/settings/{ => enums}/map_style.dart | 0 lib/model/settings/{ => enums}/screen_on.dart | 0 .../settings/{ => enums}/unit_system.dart | 0 .../settings/{ => enums}/video_loop_mode.dart | 0 lib/model/settings/settings.dart | 142 ++++++++---------- lib/model/settings/store/store.dart | 37 +++++ .../settings/store/store_shared_pref.dart | 60 ++++++++ lib/model/source/album.dart | 133 +++++++++------- lib/model/source/collection_lens.dart | 8 +- lib/model/source/collection_source.dart | 4 + lib/model/source/media_store_source.dart | 15 ++ lib/services/common/services.dart | 7 +- lib/theme/durations.dart | 2 +- lib/widgets/aves_app.dart | 99 ++++++++---- lib/widgets/collection/collection_grid.dart | 12 +- lib/widgets/collection/grid/list_details.dart | 2 +- .../common/action_mixins/feedback.dart | 4 +- .../common/identity/aves_filter_chip.dart | 2 +- lib/widgets/common/map/attribution.dart | 2 +- lib/widgets/common/map/buttons.dart | 4 +- lib/widgets/common/map/geo_map.dart | 4 +- lib/widgets/common/map/google/map.dart | 2 +- lib/widgets/common/map/leaflet/map.dart | 2 +- .../common/map/leaflet/scale_layer.dart | 2 +- lib/widgets/common/thumbnail/image.dart | 6 +- .../common/tile_extent_controller.dart | 2 +- lib/widgets/debug/settings.dart | 1 + lib/widgets/dialogs/location_pick_dialog.dart | 4 +- .../filter_grids/common/filter_grid_page.dart | 1 + lib/widgets/home_page.dart | 2 +- lib/widgets/map/map_info_row.dart | 2 +- lib/widgets/map/map_page.dart | 4 +- .../accessibility/remove_animations.dart | 4 +- .../accessibility/time_to_take_action.dart | 4 +- lib/widgets/settings/language/language.dart | 6 +- .../settings/navigation/navigation.dart | 6 +- lib/widgets/settings/video/video.dart | 4 +- .../settings/viewer/entry_background.dart | 4 +- lib/widgets/settings/viewer/viewer.dart | 2 +- lib/widgets/stats/stats_page.dart | 2 +- .../viewer/entry_horizontal_pager.dart | 2 +- lib/widgets/viewer/entry_viewer_stack.dart | 2 +- lib/widgets/viewer/info/location_section.dart | 2 +- lib/widgets/viewer/overlay/bottom/common.dart | 2 +- lib/widgets/viewer/video/fijkplayer.dart | 2 +- .../viewer/visual/entry_page_view.dart | 2 +- lib/widgets/viewer/visual/raster.dart | 4 +- lib/widgets/viewer/visual/vector.dart | 4 +- test/fake/metadata_db.dart | 2 +- test/model/collection_source_test.dart | 2 +- test/utils/geo_utils_test.dart | 2 +- test_driver/driver_screenshots.dart | 2 +- test_driver/driver_shaders.dart | 2 +- 67 files changed, 544 insertions(+), 318 deletions(-) create mode 100644 lib/model/db/db_metadata.dart rename lib/model/{metadata_db.dart => db/db_metadata_sqflite.dart} (88%) rename lib/model/{metadata_db_upgrade.dart => db/db_metadata_sqflite_upgrade.dart} (98%) rename lib/model/settings/{ => enums}/accessibility_animations.dart (100%) rename lib/model/settings/{ => enums}/accessibility_timeout.dart (100%) rename lib/model/settings/{ => enums}/coordinate_format.dart (100%) rename lib/model/settings/{ => enums}/entry_background.dart (100%) rename lib/model/settings/{ => enums}/enums.dart (100%) rename lib/model/settings/{ => enums}/home_page.dart (100%) rename lib/model/settings/{ => enums}/map_style.dart (100%) rename lib/model/settings/{ => enums}/screen_on.dart (100%) rename lib/model/settings/{ => enums}/unit_system.dart (100%) rename lib/model/settings/{ => enums}/video_loop_mode.dart (100%) create mode 100644 lib/model/settings/store/store.dart create mode 100644 lib/model/settings/store/store_shared_pref.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 8acc2d333..fed4ca45f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -141,7 +141,7 @@ repositories { } dependencies { - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2' implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.exifinterface:exifinterface:1.3.3' implementation 'androidx.multidex:multidex:2.0.1' @@ -152,10 +152,10 @@ dependencies { 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.12.0' + implementation 'com.github.bumptech.glide:glide:4.13.0' kapt 'androidx.annotation:annotation:1.3.0' - kapt 'com.github.bumptech.glide:compiler:4.12.0' + kapt 'com.github.bumptech.glide:compiler:4.13.0' compileOnly rootProject.findProject(':streams_channel') } 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 4aebabf55..29f30d522 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 @@ -32,12 +32,12 @@ import deckers.thibault.aves.utils.UriUtils.tryParseId import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import io.flutter.util.PathUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import org.beyka.tiffbitmapfactory.TiffBitmapFactory import java.io.IOException -import java.util.* class DebugHandler(private val context: Context) : MethodCallHandler { override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { @@ -81,7 +81,16 @@ class DebugHandler(private val context: Context) : MethodCallHandler { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { put("dataDir", context.dataDir) } - }.mapValues { it.value?.path } + }.mapValues { it.value?.path }.toMutableMap() + + // used by flutter plugin `path_provider` + dirs.putAll( + hashMapOf( + "flutter / cacheDir" to PathUtils.getCacheDirectory(context), + "flutter / dataDir" to PathUtils.getDataDirectory(context), + "flutter / filesDir" to PathUtils.getFilesDir(context), + ) + ) result.success(dirs) } diff --git a/android/build.gradle b/android/build.gradle index 57fd9118c..4174edca7 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,7 +6,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.1.0' + classpath 'com.android.tools.build:gradle:7.1.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // GMS & Firebase Crashlytics are not actually used by all flavors classpath 'com.google.gms:google-services:4.3.10' diff --git a/lib/model/db/db_metadata.dart b/lib/model/db/db_metadata.dart new file mode 100644 index 000000000..e6a1a4726 --- /dev/null +++ b/lib/model/db/db_metadata.dart @@ -0,0 +1,95 @@ +import 'package:aves/model/covers.dart'; +import 'package:aves/model/entry.dart'; +import 'package:aves/model/favourites.dart'; +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/metadata/address.dart'; +import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/video_playback.dart'; + +abstract class MetadataDb { + Future init(); + + Future dbFileSize(); + + Future reset(); + + Future removeIds(Set contentIds, {Set? dataTypes}); + + // entries + + Future clearEntries(); + + Future> loadAllEntries(); + + Future saveEntries(Iterable entries); + + Future updateEntryId(int oldId, AvesEntry entry); + + Future> searchEntries(String query, {int? limit}); + + Future> loadEntries(List ids); + + // date taken + + Future clearDates(); + + Future> loadDates(); + + // catalog metadata + + Future clearMetadataEntries(); + + Future> loadAllMetadataEntries(); + + Future saveMetadata(Set metadataEntries); + + Future updateMetadataId(int oldId, CatalogMetadata? metadata); + + // address + + Future clearAddresses(); + + Future> loadAllAddresses(); + + Future saveAddresses(Set addresses); + + Future updateAddressId(int oldId, AddressDetails? address); + + // favourites + + Future clearFavourites(); + + Future> loadAllFavourites(); + + Future addFavourites(Iterable rows); + + Future updateFavouriteId(int oldId, FavouriteRow row); + + Future removeFavourites(Iterable rows); + + // covers + + Future clearCovers(); + + Future> loadAllCovers(); + + Future addCovers(Iterable rows); + + Future updateCoverEntryId(int oldId, CoverRow row); + + Future removeCovers(Set filters); + + // video playback + + Future clearVideoPlayback(); + + Future> loadAllVideoPlayback(); + + Future loadVideoPlayback(int? contentId); + + Future addVideoPlayback(Set rows); + + Future updateVideoPlaybackId(int oldId, int? newId); + + Future removeVideoPlayback(Set contentIds); +} diff --git a/lib/model/metadata_db.dart b/lib/model/db/db_metadata_sqflite.dart similarity index 88% rename from lib/model/metadata_db.dart rename to lib/model/db/db_metadata_sqflite.dart index 2dfbe54ec..8f728ca88 100644 --- a/lib/model/metadata_db.dart +++ b/lib/model/db/db_metadata_sqflite.dart @@ -1,104 +1,19 @@ import 'dart:io'; import 'package:aves/model/covers.dart'; +import 'package:aves/model/db/db_metadata.dart'; +import 'package:aves/model/db/db_metadata_sqflite_upgrade.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/favourites.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; -import 'package:aves/model/metadata_db_upgrade.dart'; import 'package:aves/model/video_playback.dart'; import 'package:aves/services/common/services.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:sqflite/sqflite.dart'; -abstract class MetadataDb { - Future init(); - - Future dbFileSize(); - - Future reset(); - - Future removeIds(Set contentIds, {Set? dataTypes}); - - // entries - - Future clearEntries(); - - Future> loadAllEntries(); - - Future saveEntries(Iterable entries); - - Future updateEntryId(int oldId, AvesEntry entry); - - Future> searchEntries(String query, {int? limit}); - - // date taken - - Future clearDates(); - - Future> loadDates(); - - // catalog metadata - - Future clearMetadataEntries(); - - Future> loadAllMetadataEntries(); - - Future saveMetadata(Set metadataEntries); - - Future updateMetadataId(int oldId, CatalogMetadata? metadata); - - // address - - Future clearAddresses(); - - Future> loadAllAddresses(); - - Future saveAddresses(Set addresses); - - Future updateAddressId(int oldId, AddressDetails? address); - - // favourites - - Future clearFavourites(); - - Future> loadAllFavourites(); - - Future addFavourites(Iterable rows); - - Future updateFavouriteId(int oldId, FavouriteRow row); - - Future removeFavourites(Iterable rows); - - // covers - - Future clearCovers(); - - Future> loadAllCovers(); - - Future addCovers(Iterable rows); - - Future updateCoverEntryId(int oldId, CoverRow row); - - Future removeCovers(Set filters); - - // video playback - - Future clearVideoPlayback(); - - Future> loadAllVideoPlayback(); - - Future loadVideoPlayback(int? contentId); - - Future addVideoPlayback(Set rows); - - Future updateVideoPlaybackId(int oldId, int? newId); - - Future removeVideoPlayback(Set contentIds); -} - class SqfliteMetadataDb implements MetadataDb { late Future _database; @@ -235,6 +150,24 @@ class SqfliteMetadataDb implements MetadataDb { return entries; } + @override + Future> loadEntries(List ids) async { + if (ids.isEmpty) return {}; + final db = await _database; + final entries = {}; + await Future.forEach(ids, (id) async { + final maps = await db.query( + entryTable, + where: 'contentId = ?', + whereArgs: [id], + ); + if (maps.isNotEmpty) { + entries.add(AvesEntry.fromMap(maps.first)); + } + }); + return entries; + } + @override Future saveEntries(Iterable entries) async { if (entries.isEmpty) return; diff --git a/lib/model/metadata_db_upgrade.dart b/lib/model/db/db_metadata_sqflite_upgrade.dart similarity index 98% rename from lib/model/metadata_db_upgrade.dart rename to lib/model/db/db_metadata_sqflite_upgrade.dart index d69e7857c..f611e0294 100644 --- a/lib/model/metadata_db_upgrade.dart +++ b/lib/model/db/db_metadata_sqflite_upgrade.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/metadata_db.dart'; +import 'package:aves/model/db/db_metadata_sqflite.dart'; import 'package:flutter/foundation.dart'; import 'package:sqflite/sqflite.dart'; diff --git a/lib/model/filters/coordinate.dart b/lib/model/filters/coordinate.dart index e211b625b..90664b8c0 100644 --- a/lib/model/filters/coordinate.dart +++ b/lib/model/filters/coordinate.dart @@ -1,7 +1,7 @@ import 'package:aves/l10n/l10n.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/settings/coordinate_format.dart'; -import 'package:aves/model/settings/enums.dart'; +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/utils/geo_utils.dart'; diff --git a/lib/model/settings/defaults.dart b/lib/model/settings/defaults.dart index 9f7a6f968..41306eafa 100644 --- a/lib/model/settings/defaults.dart +++ b/lib/model/settings/defaults.dart @@ -3,7 +3,7 @@ import 'package:aves/model/actions/entry_set_actions.dart'; import 'package:aves/model/actions/video_actions.dart'; import 'package:aves/model/filters/favourite.dart'; import 'package:aves/model/filters/mime.dart'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/widgets/filter_grids/albums_page.dart'; import 'package:aves/widgets/filter_grids/countries_page.dart'; @@ -106,4 +106,8 @@ class SettingsDefaults { // file picker static const filePickerShowHiddenFiles = false; + + // platform settings + static const isRotationLocked = false; + static const areAnimationsRemoved = false; } diff --git a/lib/model/settings/accessibility_animations.dart b/lib/model/settings/enums/accessibility_animations.dart similarity index 100% rename from lib/model/settings/accessibility_animations.dart rename to lib/model/settings/enums/accessibility_animations.dart diff --git a/lib/model/settings/accessibility_timeout.dart b/lib/model/settings/enums/accessibility_timeout.dart similarity index 100% rename from lib/model/settings/accessibility_timeout.dart rename to lib/model/settings/enums/accessibility_timeout.dart diff --git a/lib/model/settings/coordinate_format.dart b/lib/model/settings/enums/coordinate_format.dart similarity index 100% rename from lib/model/settings/coordinate_format.dart rename to lib/model/settings/enums/coordinate_format.dart diff --git a/lib/model/settings/entry_background.dart b/lib/model/settings/enums/entry_background.dart similarity index 100% rename from lib/model/settings/entry_background.dart rename to lib/model/settings/enums/entry_background.dart diff --git a/lib/model/settings/enums.dart b/lib/model/settings/enums/enums.dart similarity index 100% rename from lib/model/settings/enums.dart rename to lib/model/settings/enums/enums.dart diff --git a/lib/model/settings/home_page.dart b/lib/model/settings/enums/home_page.dart similarity index 100% rename from lib/model/settings/home_page.dart rename to lib/model/settings/enums/home_page.dart diff --git a/lib/model/settings/map_style.dart b/lib/model/settings/enums/map_style.dart similarity index 100% rename from lib/model/settings/map_style.dart rename to lib/model/settings/enums/map_style.dart diff --git a/lib/model/settings/screen_on.dart b/lib/model/settings/enums/screen_on.dart similarity index 100% rename from lib/model/settings/screen_on.dart rename to lib/model/settings/enums/screen_on.dart diff --git a/lib/model/settings/unit_system.dart b/lib/model/settings/enums/unit_system.dart similarity index 100% rename from lib/model/settings/unit_system.dart rename to lib/model/settings/enums/unit_system.dart diff --git a/lib/model/settings/video_loop_mode.dart b/lib/model/settings/enums/video_loop_mode.dart similarity index 100% rename from lib/model/settings/video_loop_mode.dart rename to lib/model/settings/enums/video_loop_mode.dart diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 2740db8fd..a1ca41cae 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -7,15 +7,14 @@ import 'package:aves/model/actions/entry_set_actions.dart'; import 'package:aves/model/actions/video_actions.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/settings/defaults.dart'; -import 'package:aves/model/settings/enums.dart'; -import 'package:aves/model/settings/map_style.dart'; +import 'package:aves/model/settings/enums/enums.dart'; +import 'package:aves/model/settings/enums/map_style.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/services/accessibility_service.dart'; import 'package:aves/services/common/services.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:shared_preferences/shared_preferences.dart'; final Settings settings = Settings._private(); @@ -25,8 +24,6 @@ class Settings extends ChangeNotifier { Stream get updateStream => _updateStreamController.stream; - static SharedPreferences? _prefs; - Settings._private(); static const Set internalKeys = { @@ -34,6 +31,9 @@ class Settings extends ChangeNotifier { catalogTimeZoneKey, videoShowRawTimedTextKey, searchHistoryKey, + platformAccelerometerRotationKey, + platformTransitionAnimationScaleKey, + topEntryIdsKey, }; // app @@ -48,6 +48,7 @@ class Settings extends ChangeNotifier { static const catalogTimeZoneKey = 'catalog_time_zone'; static const tileExtentPrefixKey = 'tile_extent_'; static const tileLayoutPrefixKey = 'tile_layout_'; + static const topEntryIdsKey = 'top_entry_ids'; // drawer static const drawerTypeBookmarksKey = 'drawer_type_bookmarks'; @@ -124,16 +125,10 @@ class Settings extends ChangeNotifier { // cf Android `Settings.Global.TRANSITION_ANIMATION_SCALE` static const platformTransitionAnimationScaleKey = 'transition_animation_scale'; - bool get initialized => _prefs != null; + bool get initialized => settingsStore.initialized; - Future init({ - required bool monitorPlatformSettings, - bool isRotationLocked = false, - bool areAnimationsRemoved = false, - }) async { - _prefs = await SharedPreferences.getInstance(); - _isRotationLocked = isRotationLocked; - _areAnimationsRemoved = areAnimationsRemoved; + Future init({required bool monitorPlatformSettings}) async { + await settingsStore.init(); if (monitorPlatformSettings) { _platformSettingsChangeChannel.receiveBroadcastStream().listen((event) => _onPlatformSettingsChange(event as Map?)); } @@ -141,9 +136,9 @@ class Settings extends ChangeNotifier { Future reset({required bool includeInternalKeys}) async { if (includeInternalKeys) { - await _prefs!.clear(); + await settingsStore.clear(); } else { - await Future.forEach(_prefs!.getKeys().whereNot(internalKeys.contains), _prefs!.remove); + await Future.forEach(settingsStore.getKeys().whereNot(Settings.internalKeys.contains), settingsStore.remove); } } @@ -189,7 +184,7 @@ class Settings extends ChangeNotifier { Locale? get locale { // exceptionally allow getting locale before settings are initialized - final tag = _prefs?.getString(localeKey); + final tag = initialized ? getString(localeKey) : null; if (tag != null) { final codes = tag.split(localeSeparator); return Locale.fromSubtags( @@ -250,11 +245,11 @@ class Settings extends ChangeNotifier { set homePage(HomePageSetting newValue) => setAndNotify(homePageKey, newValue.toString()); - String get catalogTimeZone => _prefs!.getString(catalogTimeZoneKey) ?? ''; + String get catalogTimeZone => getString(catalogTimeZoneKey) ?? ''; set catalogTimeZone(String newValue) => setAndNotify(catalogTimeZoneKey, newValue); - double getTileExtent(String routeName) => _prefs!.getDouble(tileExtentPrefixKey + routeName) ?? 0; + double getTileExtent(String routeName) => getDouble(tileExtentPrefixKey + routeName) ?? 0; void setTileExtent(String routeName, double newValue) => setAndNotify(tileExtentPrefixKey + routeName, newValue); @@ -262,10 +257,14 @@ class Settings extends ChangeNotifier { void setTileLayout(String routeName, TileLayout newValue) => setAndNotify(tileLayoutPrefixKey + routeName, newValue.toString()); + List? get topEntryIds => getStringList(topEntryIdsKey)?.map(int.tryParse).whereNotNull().toList(); + + set topEntryIds(List? newValue) => setAndNotify(topEntryIdsKey, newValue?.map((id) => id.toString()).whereNotNull().toList()); + // drawer List get drawerTypeBookmarks => - (_prefs!.getStringList(drawerTypeBookmarksKey))?.map((v) { + (getStringList(drawerTypeBookmarksKey))?.map((v) { if (v.isEmpty) return null; return CollectionFilter.fromJson(v); }).toList() ?? @@ -273,11 +272,11 @@ class Settings extends ChangeNotifier { set drawerTypeBookmarks(List newValue) => setAndNotify(drawerTypeBookmarksKey, newValue.map((filter) => filter?.toJson() ?? '').toList()); - List? get drawerAlbumBookmarks => _prefs!.getStringList(drawerAlbumBookmarksKey); + List? get drawerAlbumBookmarks => getStringList(drawerAlbumBookmarksKey); set drawerAlbumBookmarks(List? newValue) => setAndNotify(drawerAlbumBookmarksKey, newValue); - List get drawerPageBookmarks => _prefs!.getStringList(drawerPageBookmarksKey) ?? SettingsDefaults.drawerPageBookmarks; + List get drawerPageBookmarks => getStringList(drawerPageBookmarksKey) ?? SettingsDefaults.drawerPageBookmarks; set drawerPageBookmarks(List newValue) => setAndNotify(drawerPageBookmarksKey, newValue); @@ -341,11 +340,11 @@ class Settings extends ChangeNotifier { set tagSortFactor(ChipSortFactor newValue) => setAndNotify(tagSortFactorKey, newValue.toString()); - Set get pinnedFilters => (_prefs!.getStringList(pinnedFiltersKey) ?? []).map(CollectionFilter.fromJson).whereNotNull().toSet(); + Set get pinnedFilters => (getStringList(pinnedFiltersKey) ?? []).map(CollectionFilter.fromJson).whereNotNull().toSet(); set pinnedFilters(Set newValue) => setAndNotify(pinnedFiltersKey, newValue.map((filter) => filter.toJson()).toList()); - Set get hiddenFilters => (_prefs!.getStringList(hiddenFiltersKey) ?? []).map(CollectionFilter.fromJson).whereNotNull().toSet(); + Set get hiddenFilters => (getStringList(hiddenFiltersKey) ?? []).map(CollectionFilter.fromJson).whereNotNull().toSet(); set hiddenFilters(Set newValue) => setAndNotify(hiddenFiltersKey, newValue.map((filter) => filter.toJson()).toList()); @@ -415,7 +414,7 @@ class Settings extends ChangeNotifier { // subtitles - double get subtitleFontSize => _prefs!.getDouble(subtitleFontSizeKey) ?? SettingsDefaults.subtitleFontSize; + double get subtitleFontSize => getDouble(subtitleFontSizeKey) ?? SettingsDefaults.subtitleFontSize; set subtitleFontSize(double newValue) => setAndNotify(subtitleFontSizeKey, newValue); @@ -427,11 +426,11 @@ class Settings extends ChangeNotifier { set subtitleShowOutline(bool newValue) => setAndNotify(subtitleShowOutlineKey, newValue); - Color get subtitleTextColor => Color(_prefs!.getInt(subtitleTextColorKey) ?? SettingsDefaults.subtitleTextColor.value); + Color get subtitleTextColor => Color(getInt(subtitleTextColorKey) ?? SettingsDefaults.subtitleTextColor.value); set subtitleTextColor(Color newValue) => setAndNotify(subtitleTextColorKey, newValue.value); - Color get subtitleBackgroundColor => Color(_prefs!.getInt(subtitleBackgroundColorKey) ?? SettingsDefaults.subtitleBackgroundColor.value); + Color get subtitleBackgroundColor => Color(getInt(subtitleBackgroundColorKey) ?? SettingsDefaults.subtitleBackgroundColor.value); set subtitleBackgroundColor(Color newValue) => setAndNotify(subtitleBackgroundColorKey, newValue.value); @@ -441,7 +440,7 @@ class Settings extends ChangeNotifier { set infoMapStyle(EntryMapStyle newValue) => setAndNotify(infoMapStyleKey, newValue.toString()); - double get infoMapZoom => _prefs!.getDouble(infoMapZoomKey) ?? SettingsDefaults.infoMapZoom; + double get infoMapZoom => getDouble(infoMapZoomKey) ?? SettingsDefaults.infoMapZoom; set infoMapZoom(double newValue) => setAndNotify(infoMapZoomKey, newValue); @@ -459,7 +458,7 @@ class Settings extends ChangeNotifier { set saveSearchHistory(bool newValue) => setAndNotify(saveSearchHistoryKey, newValue); - List get searchHistory => (_prefs!.getStringList(searchHistoryKey) ?? []).map(CollectionFilter.fromJson).whereNotNull().toList(); + List get searchHistory => (getStringList(searchHistoryKey) ?? []).map(CollectionFilter.fromJson).whereNotNull().toList(); set searchHistory(List newValue) => setAndNotify(searchHistoryKey, newValue.map((filter) => filter.toJson()).toList()); @@ -481,11 +480,19 @@ class Settings extends ChangeNotifier { // convenience methods + int? getInt(String key) => settingsStore.getInt(key); + + double? getDouble(String key) => settingsStore.getDouble(key); + + String? getString(String key) => settingsStore.getString(key); + + List? getStringList(String key) => settingsStore.getStringList(key); + // ignore: avoid_positional_boolean_parameters - bool getBoolOrDefault(String key, bool defaultValue) => _prefs!.getBool(key) ?? defaultValue; + bool getBoolOrDefault(String key, bool defaultValue) => settingsStore.getBool(key) ?? defaultValue; T getEnumOrDefault(String key, T defaultValue, Iterable values) { - final valueString = _prefs!.getString(key); + final valueString = settingsStore.getString(key); for (final v in values) { if (v.toString() == valueString) { return v; @@ -495,28 +502,28 @@ class Settings extends ChangeNotifier { } List getEnumListOrDefault(String key, List defaultValue, Iterable values) { - return _prefs!.getStringList(key)?.map((s) => values.firstWhereOrNull((v) => v.toString() == s)).whereNotNull().toList() ?? defaultValue; + return settingsStore.getStringList(key)?.map((s) => values.firstWhereOrNull((v) => v.toString() == s)).whereNotNull().toList() ?? defaultValue; } void setAndNotify(String key, dynamic newValue) { - var oldValue = _prefs!.get(key); + var oldValue = settingsStore.get(key); if (newValue == null) { - _prefs!.remove(key); + settingsStore.remove(key); } else if (newValue is String) { - oldValue = _prefs!.getString(key); - _prefs!.setString(key, newValue); + oldValue = settingsStore.getString(key); + settingsStore.setString(key, newValue); } else if (newValue is List) { - oldValue = _prefs!.getStringList(key); - _prefs!.setStringList(key, newValue); + oldValue = settingsStore.getStringList(key); + settingsStore.setStringList(key, newValue); } else if (newValue is int) { - oldValue = _prefs!.getInt(key); - _prefs!.setInt(key, newValue); + oldValue = settingsStore.getInt(key); + settingsStore.setInt(key, newValue); } else if (newValue is double) { - oldValue = _prefs!.getDouble(key); - _prefs!.setDouble(key, newValue); + oldValue = settingsStore.getDouble(key); + settingsStore.setDouble(key, newValue); } else if (newValue is bool) { - oldValue = _prefs!.getBool(key); - _prefs!.setBool(key, newValue); + oldValue = settingsStore.getBool(key); + settingsStore.setBool(key, newValue); } if (oldValue != newValue) { _updateStreamController.add(key); @@ -527,50 +534,33 @@ class Settings extends ChangeNotifier { // platform settings void _onPlatformSettingsChange(Map? fields) { - var changed = false; fields?.forEach((key, value) { switch (key) { case platformAccelerometerRotationKey: if (value is num) { - final newValue = value == 0; - if (_isRotationLocked != newValue) { - _isRotationLocked = newValue; - if (!_isRotationLocked) { - windowService.requestOrientation(); - } - _updateStreamController.add(key); - changed = true; - } + isRotationLocked = value == 0; } break; case platformTransitionAnimationScaleKey: if (value is num) { - final newValue = value == 0; - if (_areAnimationsRemoved != newValue) { - _areAnimationsRemoved = newValue; - _updateStreamController.add(key); - changed = true; - } + areAnimationsRemoved = value == 0; } } }); - if (changed) { - notifyListeners(); - } } - bool _isRotationLocked = false; + bool get isRotationLocked => getBoolOrDefault(platformAccelerometerRotationKey, SettingsDefaults.isRotationLocked); - bool get isRotationLocked => _isRotationLocked; + set isRotationLocked(bool newValue) => setAndNotify(platformAccelerometerRotationKey, newValue); - bool _areAnimationsRemoved = false; + bool get areAnimationsRemoved => getBoolOrDefault(platformTransitionAnimationScaleKey, SettingsDefaults.areAnimationsRemoved); - bool get areAnimationsRemoved => _areAnimationsRemoved; + set areAnimationsRemoved(bool newValue) => setAndNotify(platformTransitionAnimationScaleKey, newValue); // import/export Map export() => Map.fromEntries( - _prefs!.getKeys().whereNot(internalKeys.contains).map((k) => MapEntry(k, _prefs!.get(k))), + settingsStore.getKeys().whereNot(internalKeys.contains).map((k) => MapEntry(k, settingsStore.get(k))), ); Future import(dynamic jsonMap) async { @@ -581,16 +571,16 @@ class Settings extends ChangeNotifier { // apply user modifications jsonMap.forEach((key, value) { if (value == null) { - _prefs!.remove(key); + settingsStore.remove(key); } else if (key.startsWith(tileExtentPrefixKey)) { if (value is double) { - _prefs!.setDouble(key, value); + settingsStore.setDouble(key, value); } else { debugPrint('failed to import key=$key, value=$value is not a double'); } } else if (key.startsWith(tileLayoutPrefixKey)) { if (value is String) { - _prefs!.setString(key, value); + settingsStore.setString(key, value); } else { debugPrint('failed to import key=$key, value=$value is not a string'); } @@ -599,7 +589,7 @@ class Settings extends ChangeNotifier { case subtitleTextColorKey: case subtitleBackgroundColorKey: if (value is int) { - _prefs!.setInt(key, value); + settingsStore.setInt(key, value); } else { debugPrint('failed to import key=$key, value=$value is not an int'); } @@ -607,7 +597,7 @@ class Settings extends ChangeNotifier { case subtitleFontSizeKey: case infoMapZoomKey: if (value is double) { - _prefs!.setDouble(key, value); + settingsStore.setDouble(key, value); } else { debugPrint('failed to import key=$key, value=$value is not a double'); } @@ -635,7 +625,7 @@ class Settings extends ChangeNotifier { case saveSearchHistoryKey: case filePickerShowHiddenFilesKey: if (value is bool) { - _prefs!.setBool(key, value); + settingsStore.setBool(key, value); } else { debugPrint('failed to import key=$key, value=$value is not a bool'); } @@ -658,7 +648,7 @@ class Settings extends ChangeNotifier { case accessibilityAnimationsKey: case timeToTakeActionKey: if (value is String) { - _prefs!.setString(key, value); + settingsStore.setString(key, value); } else { debugPrint('failed to import key=$key, value=$value is not a string'); } @@ -673,7 +663,7 @@ class Settings extends ChangeNotifier { case viewerQuickActionsKey: case videoQuickActionsKey: if (value is List) { - _prefs!.setStringList(key, value.cast()); + settingsStore.setStringList(key, value.cast()); } else { debugPrint('failed to import key=$key, value=$value is not a list'); } diff --git a/lib/model/settings/store/store.dart b/lib/model/settings/store/store.dart new file mode 100644 index 000000000..b12fa639f --- /dev/null +++ b/lib/model/settings/store/store.dart @@ -0,0 +1,37 @@ +abstract class SettingsStore { + bool get initialized; + + Future init(); + + Future clear(); + + Future remove(String key); + + // get + + Set getKeys(); + + Object? get(String key); + + bool? getBool(String key); + + int? getInt(String key); + + double? getDouble(String key); + + String? getString(String key); + + List? getStringList(String key); + + // set + + Future setBool(String key, bool value); + + Future setInt(String key, int value); + + Future setDouble(String key, double value); + + Future setString(String key, String value); + + Future setStringList(String key, List value); +} diff --git a/lib/model/settings/store/store_shared_pref.dart b/lib/model/settings/store/store_shared_pref.dart new file mode 100644 index 000000000..8f5019cf5 --- /dev/null +++ b/lib/model/settings/store/store_shared_pref.dart @@ -0,0 +1,60 @@ +import 'package:aves/model/settings/store/store.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class SharedPrefSettingsStore implements SettingsStore { + static SharedPreferences? _prefs; + + @override + bool get initialized => _prefs != null; + + @override + Future init() async { + _prefs = await SharedPreferences.getInstance(); + } + + @override + Future clear() => _prefs!.clear(); + + @override + Future remove(String key) => _prefs!.remove(key); + + // get + + @override + Set getKeys() => _prefs!.getKeys(); + + @override + Object? get(String key) => _prefs!.get(key); + + @override + bool? getBool(String key) => _prefs!.getBool(key); + + @override + int? getInt(String key) => _prefs!.getInt(key); + + @override + double? getDouble(String key) => _prefs!.getDouble(key); + + @override + String? getString(String key) => _prefs!.getString(key); + + @override + List? getStringList(String key) => _prefs!.getStringList(key); + + // set + + @override + Future setBool(String key, bool value) => _prefs!.setBool(key, value); + + @override + Future setInt(String key, int value) => _prefs!.setInt(key, value); + + @override + Future setDouble(String key, double value) => _prefs!.setDouble(key, value); + + @override + Future setString(String key, String value) => _prefs!.setString(key, value); + + @override + Future setStringList(String key, List value) => _prefs!.setStringList(key, value); +} diff --git a/lib/model/source/album.dart b/lib/model/source/album.dart index 25fe1eb68..6fe52cc1d 100644 --- a/lib/model/source/album.dart +++ b/lib/model/source/album.dart @@ -26,56 +26,9 @@ mixin AlbumMixin on SourceBase { return compareAsciiUpperCase(va, vb); } - void _notifyAlbumChange() => eventBus.fire(AlbumsChangedEvent()); - - String getAlbumDisplayName(BuildContext? context, String dirPath) { - final separator = pContext.separator; - assert(!dirPath.endsWith(separator)); - - if (context != null) { - final type = androidFileUtils.getAlbumType(dirPath); - if (type == AlbumType.camera) return context.l10n.albumCamera; - if (type == AlbumType.download) return context.l10n.albumDownload; - if (type == AlbumType.screenshots) return context.l10n.albumScreenshots; - if (type == AlbumType.screenRecordings) return context.l10n.albumScreenRecordings; - if (type == AlbumType.videoCaptures) return context.l10n.albumVideoCaptures; - } - - final dir = VolumeRelativeDirectory.fromPath(dirPath); - if (dir == null) return dirPath; - - final relativeDir = dir.relativeDir; - if (relativeDir.isEmpty) { - final volume = androidFileUtils.getStorageVolume(dirPath)!; - return volume.getDescription(context); - } - - String unique(String dirPath, Set others) { - final parts = pContext.split(dirPath); - for (var i = parts.length - 1; i > 0; i--) { - final name = pContext.joinAll(['', ...parts.skip(i)]); - final testName = '$separator$name'; - if (others.every((item) => !item!.endsWith(testName))) return name; - } - return dirPath; - } - - final otherAlbumsOnDevice = _directories.where((item) => item != dirPath).toSet(); - final uniqueNameInDevice = unique(dirPath, otherAlbumsOnDevice); - if (uniqueNameInDevice.length <= relativeDir.length) { - return uniqueNameInDevice; - } - - final volumePath = dir.volumePath; - String trimVolumePath(String? path) => path!.substring(dir.volumePath.length); - final otherAlbumsOnVolume = otherAlbumsOnDevice.where((path) => path!.startsWith(volumePath)).map(trimVolumePath).toSet(); - final uniqueNameInVolume = unique(trimVolumePath(dirPath), otherAlbumsOnVolume); - final volume = androidFileUtils.getStorageVolume(dirPath)!; - if (volume.isPrimary) { - return uniqueNameInVolume; - } else { - return '$uniqueNameInVolume (${volume.getDescription(context)})'; - } + void _onAlbumChanged() { + invalidateAlbumDisplayNames(); + eventBus.fire(AlbumsChangedEvent()); } Map getAlbumEntries() { @@ -109,7 +62,7 @@ mixin AlbumMixin on SourceBase { void addDirectories(Set albums) { if (!_directories.containsAll(albums)) { _directories.addAll(albums); - _notifyAlbumChange(); + _onAlbumChanged(); } } @@ -117,7 +70,7 @@ mixin AlbumMixin on SourceBase { final emptyAlbums = (albums ?? _directories).where((v) => _isEmptyAlbum(v) && !_newAlbums.contains(v)).toSet(); if (emptyAlbums.isNotEmpty) { _directories.removeAll(emptyAlbums); - _notifyAlbumChange(); + _onAlbumChanged(); invalidateAlbumFilterSummary(directories: emptyAlbums); final bookmarks = settings.drawerAlbumBookmarks; @@ -165,6 +118,8 @@ mixin AlbumMixin on SourceBase { AvesEntry? albumRecentEntry(AlbumFilter filter) { return _filterRecentEntryMap.putIfAbsent(filter.album, () => sortedEntriesByDate.firstWhereOrNull(filter.test)); } + + // new albums void createAlbum(String directory) { _newAlbums.add(directory); @@ -181,6 +136,80 @@ mixin AlbumMixin on SourceBase { void forgetNewAlbums(Set directories) { _newAlbums.removeAll(directories); } + + // display names + + final Map _albumDisplayNamesWithContext = {}, _albumDisplayNamesWithoutContext = {}; + + void invalidateAlbumDisplayNames() { + _albumDisplayNamesWithContext.clear(); + _albumDisplayNamesWithoutContext.clear(); + } + + String _computeDisplayName(BuildContext? context, String dirPath) { + final separator = pContext.separator; + assert(!dirPath.endsWith(separator)); + + if (context != null) { + final type = androidFileUtils.getAlbumType(dirPath); + switch (type) { + case AlbumType.camera: + return context.l10n.albumCamera; + case AlbumType.download: + return context.l10n.albumDownload; + case AlbumType.screenshots: + return context.l10n.albumScreenshots; + case AlbumType.screenRecordings: + return context.l10n.albumScreenRecordings; + case AlbumType.videoCaptures: + return context.l10n.albumVideoCaptures; + case AlbumType.regular: + case AlbumType.app: + break; + } + } + + final dir = VolumeRelativeDirectory.fromPath(dirPath); + if (dir == null) return dirPath; + + final relativeDir = dir.relativeDir; + if (relativeDir.isEmpty) { + final volume = androidFileUtils.getStorageVolume(dirPath)!; + return volume.getDescription(context); + } + + String unique(String dirPath, Set others) { + final parts = pContext.split(dirPath); + for (var i = parts.length - 1; i > 0; i--) { + final name = pContext.joinAll(['', ...parts.skip(i)]); + final testName = '$separator$name'; + if (others.every((item) => !item!.endsWith(testName))) return name; + } + return dirPath; + } + + final otherAlbumsOnDevice = _directories.where((item) => item != dirPath).toSet(); + final uniqueNameInDevice = unique(dirPath, otherAlbumsOnDevice); + if (uniqueNameInDevice.length <= relativeDir.length) { + return uniqueNameInDevice; + } + + final volumePath = dir.volumePath; + String trimVolumePath(String? path) => path!.substring(dir.volumePath.length); + final otherAlbumsOnVolume = otherAlbumsOnDevice.where((path) => path!.startsWith(volumePath)).map(trimVolumePath).toSet(); + final uniqueNameInVolume = unique(trimVolumePath(dirPath), otherAlbumsOnVolume); + final volume = androidFileUtils.getStorageVolume(dirPath)!; + if (volume.isPrimary) { + return uniqueNameInVolume; + } else { + return '$uniqueNameInVolume (${volume.getDescription(context)})'; + } + } + + String getAlbumDisplayName(BuildContext? context, String dirPath) { + final names = (context != null ? _albumDisplayNamesWithContext : _albumDisplayNamesWithoutContext); + return names.putIfAbsent(dirPath, () => _computeDisplayName(context, dirPath)); + } } class AlbumsChangedEvent {} diff --git a/lib/model/source/collection_lens.dart b/lib/model/source/collection_lens.dart index f94a085a8..301693be0 100644 --- a/lib/model/source/collection_lens.dart +++ b/lib/model/source/collection_lens.dart @@ -68,7 +68,12 @@ class CollectionLens with ChangeNotifier { })); favourites.addListener(_onFavouritesChanged); } - settings.addListener(_onSettingsChanged); + _subscriptions.add(settings.updateStream + .where([ + Settings.collectionSortFactorKey, + Settings.collectionGroupFactorKey, + ].contains) + .listen((_) => _onSettingsChanged())); _refresh(); } @@ -78,7 +83,6 @@ class CollectionLens with ChangeNotifier { ..forEach((sub) => sub.cancel()) ..clear(); favourites.removeListener(_onFavouritesChanged); - settings.removeListener(_onSettingsChanged); super.dispose(); } diff --git a/lib/model/source/collection_source.dart b/lib/model/source/collection_source.dart index 4c1591ba3..0b151aefc 100644 --- a/lib/model/source/collection_source.dart +++ b/lib/model/source/collection_source.dart @@ -39,6 +39,10 @@ mixin SourceBase { } abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagMixin { + CollectionSource() { + settings.updateStream.where((key) => key == Settings.localeKey).listen((_) => invalidateAlbumDisplayNames()); + } + final EventBus _eventBus = EventBus(); @override diff --git a/lib/model/source/media_store_source.dart b/lib/model/source/media_store_source.dart index 0a88b12d2..d30a663d7 100644 --- a/lib/model/source/media_store_source.dart +++ b/lib/model/source/media_store_source.dart @@ -50,6 +50,16 @@ class MediaStoreSource extends CollectionSource { stateNotifier.value = SourceState.loading; clearEntries(); + final topIds = settings.topEntryIds; + late final Set topEntries; + if (topIds != null) { + debugPrint('$runtimeType refresh ${stopwatch.elapsed} load ${topIds.length} top entries'); + topEntries = await metadataDb.loadEntries(topIds); + addEntries(topEntries); + } else { + topEntries = {}; + } + debugPrint('$runtimeType refresh ${stopwatch.elapsed} fetch known entries'); final oldEntries = await metadataDb.loadAllEntries(); debugPrint('$runtimeType refresh ${stopwatch.elapsed} check obsolete entries'); @@ -57,6 +67,11 @@ class MediaStoreSource extends CollectionSource { final obsoleteContentIds = (await mediaStoreService.checkObsoleteContentIds(knownDateById.keys.toList())).toSet(); oldEntries.removeWhere((entry) => obsoleteContentIds.contains(entry.contentId)); + if (topEntries.isNotEmpty) { + final obsoleteTopEntries = topEntries.where((entry) => obsoleteContentIds.contains(entry.contentId)); + await removeEntries(obsoleteTopEntries.map((entry) => entry.uri).toSet()); + } + // show known entries debugPrint('$runtimeType refresh ${stopwatch.elapsed} add known entries'); addEntries(oldEntries); diff --git a/lib/services/common/services.dart b/lib/services/common/services.dart index 3a877b3d8..2ebcb67dc 100644 --- a/lib/services/common/services.dart +++ b/lib/services/common/services.dart @@ -1,5 +1,8 @@ import 'package:aves/model/availability.dart'; -import 'package:aves/model/metadata_db.dart'; +import 'package:aves/model/db/db_metadata.dart'; +import 'package:aves/model/db/db_metadata_sqflite.dart'; +import 'package:aves/model/settings/store/store.dart'; +import 'package:aves/model/settings/store/store_shared_pref.dart'; import 'package:aves/services/android_app_service.dart'; import 'package:aves/services/device_service.dart'; import 'package:aves/services/media/embedded_data_service.dart'; @@ -19,6 +22,7 @@ final getIt = GetIt.instance; final p.Context pContext = getIt(); final AvesAvailability availability = getIt(); final MetadataDb metadataDb = getIt(); +final SettingsStore settingsStore = getIt(); final AndroidAppService androidAppService = getIt(); final DeviceService deviceService = getIt(); @@ -35,6 +39,7 @@ void initPlatformServices() { getIt.registerLazySingleton(p.Context.new); getIt.registerLazySingleton(LiveAvesAvailability.new); getIt.registerLazySingleton(SqfliteMetadataDb.new); + getIt.registerLazySingleton(SharedPrefSettingsStore.new); getIt.registerLazySingleton(PlatformAndroidAppService.new); getIt.registerLazySingleton(PlatformDeviceService.new); diff --git a/lib/theme/durations.dart b/lib/theme/durations.dart index bed800993..4c91a1685 100644 --- a/lib/theme/durations.dart +++ b/lib/theme/durations.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/settings/accessibility_animations.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index d8b8e5d4a..357a1ad85 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -1,12 +1,14 @@ import 'dart:async'; +import 'dart:ui'; import 'package:aves/app_flavor.dart'; import 'package:aves/app_mode.dart'; import 'package:aves/l10n/l10n.dart'; import 'package:aves/model/device.dart'; -import 'package:aves/model/settings/accessibility_animations.dart'; -import 'package:aves/model/settings/screen_on.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/enums/screen_on.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/media_store_source.dart'; import 'package:aves/services/accessibility_service.dart'; @@ -16,12 +18,15 @@ import 'package:aves/theme/icons.dart'; import 'package:aves/theme/themes.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/debouncer.dart'; +import 'package:aves/widgets/collection/collection_grid.dart'; +import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/behaviour/route_tracker.dart'; import 'package:aves/widgets/common/behaviour/routes.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/providers/highlight_info_provider.dart'; import 'package:aves/widgets/home_page.dart'; import 'package:aves/widgets/welcome_page.dart'; +import 'package:collection/collection.dart'; import 'package:equatable/equatable.dart'; import 'package:fijkplayer/fijkplayer.dart'; import 'package:flutter/foundation.dart'; @@ -43,7 +48,7 @@ class AvesApp extends StatefulWidget { _AvesAppState createState() => _AvesAppState(); } -class _AvesAppState extends State { +class _AvesAppState extends State with WidgetsBindingObserver { final ValueNotifier appModeNotifier = ValueNotifier(AppMode.main); late Future _appSetup; final _mediaStoreSource = MediaStoreSource(); @@ -70,6 +75,7 @@ class _AvesAppState extends State { _newIntentChannel.receiveBroadcastStream().listen((event) => _onNewIntent(event as Map?)); _analysisCompletionChannel.receiveBroadcastStream().listen((event) => _onAnalysisCompletion()); _errorChannel.receiveBroadcastStream().listen((event) => _onError(event as String?)); + WidgetsBinding.instance!.addObserver(this); } @override @@ -158,26 +164,45 @@ class _AvesAppState extends State { ); } + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + debugPrint('$runtimeType lifecycle ${state.name}'); + switch (state) { + case AppLifecycleState.inactive: + _saveTopEntries(); + break; + case AppLifecycleState.paused: + case AppLifecycleState.detached: + case AppLifecycleState.resumed: + break; + } + } + + // save IDs of entries visible at the top of the collection page with current layout settings + void _saveTopEntries() { + final stopwatch = Stopwatch()..start(); + final screenSize = window.physicalSize / window.devicePixelRatio; + var tileExtent = settings.getTileExtent(CollectionPage.routeName); + if (tileExtent == 0) { + tileExtent = screenSize.shortestSide / CollectionGrid.columnCountDefault; + } + final rows = (screenSize.height / tileExtent).ceil(); + final columns = (screenSize.width / tileExtent).ceil(); + final count = rows * columns; + final collection = CollectionLens(source: _mediaStoreSource, listenToSource: false); + settings.topEntryIds = collection.sortedEntries.take(count).map((entry) => entry.contentId).whereNotNull().toList(); + collection.dispose(); + debugPrint('Saved $count top entries in ${stopwatch.elapsed.inMilliseconds}ms'); + } + // setup before the first page is displayed. keep it short Future _setup() async { final stopwatch = Stopwatch()..start(); - // TODO TLAD [init] init settings/device w/o platform calls (first platform channel call takes ~800ms): - // 1) use cached values if any, - // 2a) call platform w/ delay if cached - // 2b) call platform w/o delay if not cached - // 3) cache platform call results across app restarts - await device.init(); - final isRotationLocked = await windowService.isRotationLocked(); - final areAnimationsRemoved = await AccessibilityService.areAnimationsRemoved(); - - // TODO TLAD [init] migrate settings away from `shared_preferences` to a platform-free solution - await settings.init( - monitorPlatformSettings: true, - isRotationLocked: isRotationLocked, - areAnimationsRemoved: areAnimationsRemoved, - ); + await settings.init(monitorPlatformSettings: true); + settings.isRotationLocked = await windowService.isRotationLocked(); + settings.areAnimationsRemoved = await AccessibilityService.areAnimationsRemoved(); _monitorSettings(); FijkLog.setLevel(FijkLogLevel.Warn); @@ -187,22 +212,30 @@ class _AvesAppState extends State { } void _monitorSettings() { - // keep screen on - settings.updateStream.where((key) => key == Settings.keepScreenOnKey).listen( - (_) => settings.keepScreenOn.apply(), - ); - settings.keepScreenOn.apply(); + void applyIsInstalledAppAccessAllowed() { + if (settings.isInstalledAppAccessAllowed) { + androidFileUtils.initAppNames(); + } else { + androidFileUtils.resetAppNames(); + } + } - // installed app access - settings.updateStream.where((key) => key == Settings.isInstalledAppAccessAllowedKey).listen( - (_) { - if (settings.isInstalledAppAccessAllowed) { - androidFileUtils.initAppNames(); - } else { - androidFileUtils.resetAppNames(); - } - }, - ); + void applyKeepScreenOn() { + settings.keepScreenOn.apply(); + } + + void applyIsRotationLocked() { + if (!settings.isRotationLocked) { + windowService.requestOrientation(); + } + } + + settings.updateStream.where((key) => key == Settings.isInstalledAppAccessAllowedKey).listen((_) => applyIsInstalledAppAccessAllowed()); + settings.updateStream.where((key) => key == Settings.keepScreenOnKey).listen((_) => applyKeepScreenOn()); + settings.updateStream.where((key) => key == Settings.platformAccelerometerRotationKey).listen((_) => applyIsRotationLocked()); + + applyKeepScreenOn(); + applyIsRotationLocked(); } Future _setupErrorReporting() async { diff --git a/lib/widgets/collection/collection_grid.dart b/lib/widgets/collection/collection_grid.dart index 4041019b6..0c599becc 100644 --- a/lib/widgets/collection/collection_grid.dart +++ b/lib/widgets/collection/collection_grid.dart @@ -39,6 +39,11 @@ import 'package:tuple/tuple.dart'; class CollectionGrid extends StatefulWidget { final String? settingsRouteKey; + static const int columnCountDefault = 4; + static const double extentMin = 46; + static const double extentMax = 300; + static const double spacing = 2; + const CollectionGrid({ Key? key, this.settingsRouteKey, @@ -61,9 +66,10 @@ class _CollectionGridState extends State { Widget build(BuildContext context) { _tileExtentController ??= TileExtentController( settingsRouteKey: widget.settingsRouteKey ?? context.currentRouteName!, - columnCountDefault: 4, - extentMin: 46, - spacing: 2, + columnCountDefault: CollectionGrid.columnCountDefault, + extentMin: CollectionGrid.extentMin, + extentMax: CollectionGrid.extentMax, + spacing: CollectionGrid.spacing, ); return TileExtentControllerProvider( controller: _tileExtentController!, diff --git a/lib/widgets/collection/grid/list_details.dart b/lib/widgets/collection/grid/list_details.dart index 5170b5327..98d2a6636 100644 --- a/lib/widgets/collection/grid/list_details.dart +++ b/lib/widgets/collection/grid/list_details.dart @@ -1,5 +1,5 @@ import 'package:aves/model/entry.dart'; -import 'package:aves/model/settings/coordinate_format.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/format.dart'; import 'package:aves/theme/icons.dart'; diff --git a/lib/widgets/common/action_mixins/feedback.dart b/lib/widgets/common/action_mixins/feedback.dart index 08b53b5cc..b3ab4343d 100644 --- a/lib/widgets/common/action_mixins/feedback.dart +++ b/lib/widgets/common/action_mixins/feedback.dart @@ -1,8 +1,8 @@ import 'dart:async'; import 'dart:math'; -import 'package:aves/model/settings/accessibility_animations.dart'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/accessibility_service.dart'; import 'package:aves/theme/durations.dart'; diff --git a/lib/widgets/common/identity/aves_filter_chip.dart b/lib/widgets/common/identity/aves_filter_chip.dart index b8504df7d..7061b9f99 100644 --- a/lib/widgets/common/identity/aves_filter_chip.dart +++ b/lib/widgets/common/identity/aves_filter_chip.dart @@ -4,7 +4,7 @@ import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/filters/tag.dart'; -import 'package:aves/model/settings/accessibility_animations.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; diff --git a/lib/widgets/common/map/attribution.dart b/lib/widgets/common/map/attribution.dart index 030c68caf..afeb94a2b 100644 --- a/lib/widgets/common/map/attribution.dart +++ b/lib/widgets/common/map/attribution.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/common/map/buttons.dart b/lib/widgets/common/map/buttons.dart index 0a933970d..48223c7cb 100644 --- a/lib/widgets/common/map/buttons.dart +++ b/lib/widgets/common/map/buttons.dart @@ -1,6 +1,6 @@ import 'package:aves/model/filters/coordinate.dart'; -import 'package:aves/model/settings/enums.dart'; -import 'package:aves/model/settings/map_style.dart'; +import 'package:aves/model/settings/enums/enums.dart'; +import 'package:aves/model/settings/enums/map_style.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/durations.dart'; diff --git a/lib/widgets/common/map/geo_map.dart b/lib/widgets/common/map/geo_map.dart index ffd8176a6..b9862fdee 100644 --- a/lib/widgets/common/map/geo_map.dart +++ b/lib/widgets/common/map/geo_map.dart @@ -2,8 +2,8 @@ import 'dart:async'; import 'dart:math'; import 'package:aves/model/entry.dart'; -import 'package:aves/model/settings/enums.dart'; -import 'package:aves/model/settings/map_style.dart'; +import 'package:aves/model/settings/enums/enums.dart'; +import 'package:aves/model/settings/enums/map_style.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/utils/change_notifier.dart'; diff --git a/lib/widgets/common/map/google/map.dart b/lib/widgets/common/map/google/map.dart index c00462773..1cf44550d 100644 --- a/lib/widgets/common/map/google/map.dart +++ b/lib/widgets/common/map/google/map.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'dart:typed_data'; import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/utils/change_notifier.dart'; import 'package:aves/widgets/common/map/buttons.dart'; import 'package:aves/widgets/common/map/controller.dart'; diff --git a/lib/widgets/common/map/leaflet/map.dart b/lib/widgets/common/map/leaflet/map.dart index f04a5d464..600a10f1b 100644 --- a/lib/widgets/common/map/leaflet/map.dart +++ b/lib/widgets/common/map/leaflet/map.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/utils/debouncer.dart'; diff --git a/lib/widgets/common/map/leaflet/scale_layer.dart b/lib/widgets/common/map/leaflet/scale_layer.dart index 32b0dd69b..37e76093c 100644 --- a/lib/widgets/common/map/leaflet/scale_layer.dart +++ b/lib/widgets/common/map/leaflet/scale_layer.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/widgets/common/basic/outlined_text.dart'; import 'package:aves/widgets/common/map/leaflet/scalebar_utils.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/common/thumbnail/image.dart b/lib/widgets/common/thumbnail/image.dart index 3edba69d8..0a6961070 100644 --- a/lib/widgets/common/thumbnail/image.dart +++ b/lib/widgets/common/thumbnail/image.dart @@ -4,9 +4,9 @@ import 'dart:ui'; import 'package:aves/image_providers/thumbnail_provider.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/settings/accessibility_animations.dart'; -import 'package:aves/model/settings/entry_background.dart'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/enums/entry_background.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/widgets/common/fx/checkered_decoration.dart'; diff --git a/lib/widgets/common/tile_extent_controller.dart b/lib/widgets/common/tile_extent_controller.dart index 1e39af61e..5a055a2ed 100644 --- a/lib/widgets/common/tile_extent_controller.dart +++ b/lib/widgets/common/tile_extent_controller.dart @@ -20,7 +20,7 @@ class TileExtentController { this.columnCountMin = 2, required this.columnCountDefault, required this.extentMin, - this.extentMax = 300, + required this.extentMax, required this.spacing, }) { userPreferredExtent = settings.getTileExtent(settingsRouteKey); diff --git a/lib/widgets/debug/settings.dart b/lib/widgets/debug/settings.dart index de9cf5806..81bded031 100644 --- a/lib/widgets/debug/settings.dart +++ b/lib/widgets/debug/settings.dart @@ -68,6 +68,7 @@ class DebugSettingsSection extends StatelessWidget { 'searchHistory': toMultiline(settings.searchHistory), 'locale': '${settings.locale}', 'systemLocales': '${WidgetsBinding.instance!.window.locales}', + 'topEntryIds': '${settings.topEntryIds}', }, ), ), diff --git a/lib/widgets/dialogs/location_pick_dialog.dart b/lib/widgets/dialogs/location_pick_dialog.dart index ecdd98f5d..ce0cf1e65 100644 --- a/lib/widgets/dialogs/location_pick_dialog.dart +++ b/lib/widgets/dialogs/location_pick_dialog.dart @@ -1,7 +1,7 @@ import 'dart:async'; -import 'package:aves/model/settings/coordinate_format.dart'; -import 'package:aves/model/settings/map_style.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; +import 'package:aves/model/settings/enums/map_style.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/services/common/services.dart'; diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index e9e098ddc..387513474 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -164,6 +164,7 @@ class _FilterGridState extends State> settingsRouteKey: widget.settingsRouteKey ?? context.currentRouteName!, columnCountDefault: 3, extentMin: 60, + extentMax: 300, spacing: 8, ); return TileExtentControllerProvider( diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index 980b4531a..8e0e1dcfe 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -4,7 +4,7 @@ import 'package:aves/app_mode.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; -import 'package:aves/model/settings/home_page.dart'; +import 'package:aves/model/settings/enums/home_page.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; diff --git a/lib/widgets/map/map_info_row.dart b/lib/widgets/map/map_info_row.dart index 53ad3c54f..093acf11a 100644 --- a/lib/widgets/map/map_info_row.dart +++ b/lib/widgets/map/map_info_row.dart @@ -1,5 +1,5 @@ import 'package:aves/model/entry.dart'; -import 'package:aves/model/settings/coordinate_format.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/services/geocoding_service.dart'; diff --git a/lib/widgets/map/map_page.dart b/lib/widgets/map/map_page.dart index 214dd0398..61195d8a6 100644 --- a/lib/widgets/map/map_page.dart +++ b/lib/widgets/map/map_page.dart @@ -4,8 +4,8 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/coordinate.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/highlight.dart'; -import 'package:aves/model/settings/enums.dart'; -import 'package:aves/model/settings/map_style.dart'; +import 'package:aves/model/settings/enums/enums.dart'; +import 'package:aves/model/settings/enums/map_style.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/theme/durations.dart'; diff --git a/lib/widgets/settings/accessibility/remove_animations.dart b/lib/widgets/settings/accessibility/remove_animations.dart index bf257867f..bf3095cef 100644 --- a/lib/widgets/settings/accessibility/remove_animations.dart +++ b/lib/widgets/settings/accessibility/remove_animations.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/settings/accessibility_animations.dart'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; diff --git a/lib/widgets/settings/accessibility/time_to_take_action.dart b/lib/widgets/settings/accessibility/time_to_take_action.dart index 75ceb0cb9..ced0e082d 100644 --- a/lib/widgets/settings/accessibility/time_to_take_action.dart +++ b/lib/widgets/settings/accessibility/time_to_take_action.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/settings/accessibility_timeout.dart'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/accessibility_timeout.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/accessibility_service.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; diff --git a/lib/widgets/settings/language/language.dart b/lib/widgets/settings/language/language.dart index d83ca6989..4baf94b13 100644 --- a/lib/widgets/settings/language/language.dart +++ b/lib/widgets/settings/language/language.dart @@ -1,7 +1,7 @@ -import 'package:aves/model/settings/coordinate_format.dart'; -import 'package:aves/model/settings/enums.dart'; +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/model/settings/unit_system.dart'; +import 'package:aves/model/settings/enums/unit_system.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/color_utils.dart'; import 'package:aves/utils/constants.dart'; diff --git a/lib/widgets/settings/navigation/navigation.dart b/lib/widgets/settings/navigation/navigation.dart index 50f8252fa..57c6c5c51 100644 --- a/lib/widgets/settings/navigation/navigation.dart +++ b/lib/widgets/settings/navigation/navigation.dart @@ -1,6 +1,6 @@ -import 'package:aves/model/settings/enums.dart'; -import 'package:aves/model/settings/home_page.dart'; -import 'package:aves/model/settings/screen_on.dart'; +import 'package:aves/model/settings/enums/enums.dart'; +import 'package:aves/model/settings/enums/home_page.dart'; +import 'package:aves/model/settings/enums/screen_on.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/color_utils.dart'; diff --git a/lib/widgets/settings/video/video.dart b/lib/widgets/settings/video/video.dart index 52fa4b2b3..9d2c48c1f 100644 --- a/lib/widgets/settings/video/video.dart +++ b/lib/widgets/settings/video/video.dart @@ -1,7 +1,7 @@ import 'package:aves/model/filters/mime.dart'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/model/settings/video_loop_mode.dart'; +import 'package:aves/model/settings/enums/video_loop_mode.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/color_utils.dart'; diff --git a/lib/widgets/settings/viewer/entry_background.dart b/lib/widgets/settings/viewer/entry_background.dart index 23a9017e0..2786129bd 100644 --- a/lib/widgets/settings/viewer/entry_background.dart +++ b/lib/widgets/settings/viewer/entry_background.dart @@ -1,5 +1,5 @@ -import 'package:aves/model/settings/entry_background.dart'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/entry_background.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/widgets/common/fx/borders.dart'; import 'package:aves/widgets/common/fx/checkered_decoration.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/settings/viewer/viewer.dart b/lib/widgets/settings/viewer/viewer.dart index 3e0ddb026..cb1531f60 100644 --- a/lib/widgets/settings/viewer/viewer.dart +++ b/lib/widgets/settings/viewer/viewer.dart @@ -1,4 +1,4 @@ -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/icons.dart'; diff --git a/lib/widgets/stats/stats_page.dart b/lib/widgets/stats/stats_page.dart index 350df4fa5..32db49dae 100644 --- a/lib/widgets/stats/stats_page.dart +++ b/lib/widgets/stats/stats_page.dart @@ -6,7 +6,7 @@ import 'package:aves/model/filters/location.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/filters/rating.dart'; import 'package:aves/model/filters/tag.dart'; -import 'package:aves/model/settings/accessibility_animations.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; diff --git a/lib/widgets/viewer/entry_horizontal_pager.dart b/lib/widgets/viewer/entry_horizontal_pager.dart index 86eddea63..a2dc6463d 100644 --- a/lib/widgets/viewer/entry_horizontal_pager.dart +++ b/lib/widgets/viewer/entry_horizontal_pager.dart @@ -1,5 +1,5 @@ import 'package:aves/model/entry.dart'; -import 'package:aves/model/settings/accessibility_animations.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/common/magnifier/pan/gesture_detector_scope.dart'; diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index 67cd51461..cbf054fa4 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -4,7 +4,7 @@ import 'package:aves/model/device.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/highlight.dart'; -import 'package:aves/model/settings/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'; import 'package:aves/services/common/services.dart'; diff --git a/lib/widgets/viewer/info/location_section.dart b/lib/widgets/viewer/info/location_section.dart index d216417ff..767e0dd8b 100644 --- a/lib/widgets/viewer/info/location_section.dart +++ b/lib/widgets/viewer/info/location_section.dart @@ -1,6 +1,6 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/location.dart'; -import 'package:aves/model/settings/coordinate_format.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/services/common/services.dart'; diff --git a/lib/widgets/viewer/overlay/bottom/common.dart b/lib/widgets/viewer/overlay/bottom/common.dart index f30eda557..38e1b9912 100644 --- a/lib/widgets/viewer/overlay/bottom/common.dart +++ b/lib/widgets/viewer/overlay/bottom/common.dart @@ -3,7 +3,7 @@ import 'dart:math'; import 'package:aves/model/entry.dart'; import 'package:aves/model/metadata/overlay.dart'; import 'package:aves/model/multipage.dart'; -import 'package:aves/model/settings/coordinate_format.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/durations.dart'; diff --git a/lib/widgets/viewer/video/fijkplayer.dart b/lib/widgets/viewer/video/fijkplayer.dart index f04f0f164..24c5e7bf2 100644 --- a/lib/widgets/viewer/video/fijkplayer.dart +++ b/lib/widgets/viewer/video/fijkplayer.dart @@ -4,7 +4,7 @@ import 'dart:typed_data'; import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/model/settings/video_loop_mode.dart'; +import 'package:aves/model/settings/enums/video_loop_mode.dart'; import 'package:aves/model/video/keys.dart'; import 'package:aves/model/video/metadata.dart'; import 'package:aves/utils/change_notifier.dart'; diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index 38a05b853..cb754bd1b 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/settings/accessibility_animations.dart'; +import 'package:aves/model/settings/enums/accessibility_animations.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/common/magnifier/controller/controller.dart'; diff --git a/lib/widgets/viewer/visual/raster.dart b/lib/widgets/viewer/visual/raster.dart index 5e1ac19f3..98ca8534e 100644 --- a/lib/widgets/viewer/visual/raster.dart +++ b/lib/widgets/viewer/visual/raster.dart @@ -3,8 +3,8 @@ import 'dart:math'; import 'package:aves/image_providers/region_provider.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/settings/entry_background.dart'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/entry_background.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/utils/math_utils.dart'; import 'package:aves/widgets/common/fx/checkered_decoration.dart'; diff --git a/lib/widgets/viewer/visual/vector.dart b/lib/widgets/viewer/visual/vector.dart index a2ae34d07..3901b8c35 100644 --- a/lib/widgets/viewer/visual/vector.dart +++ b/lib/widgets/viewer/visual/vector.dart @@ -4,8 +4,8 @@ import 'dart:ui'; import 'package:aves/image_providers/region_provider.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_images.dart'; -import 'package:aves/model/settings/entry_background.dart'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/entry_background.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/utils/math_utils.dart'; import 'package:aves/widgets/common/fx/checkered_decoration.dart'; diff --git a/test/fake/metadata_db.dart b/test/fake/metadata_db.dart index 40042d0f8..595d2265e 100644 --- a/test/fake/metadata_db.dart +++ b/test/fake/metadata_db.dart @@ -4,7 +4,7 @@ import 'package:aves/model/favourites.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; -import 'package:aves/model/metadata_db.dart'; +import 'package:aves/model/db/db_metadata.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_test/flutter_test.dart'; diff --git a/test/model/collection_source_test.dart b/test/model/collection_source_test.dart index b641e886a..d468d024b 100644 --- a/test/model/collection_source_test.dart +++ b/test/model/collection_source_test.dart @@ -7,7 +7,7 @@ import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; -import 'package:aves/model/metadata_db.dart'; +import 'package:aves/model/db/db_metadata.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/model/source/media_store_source.dart'; diff --git a/test/utils/geo_utils_test.dart b/test/utils/geo_utils_test.dart index 7c3f627ef..5f2cf7ecd 100644 --- a/test/utils/geo_utils_test.dart +++ b/test/utils/geo_utils_test.dart @@ -1,5 +1,5 @@ import 'package:aves/l10n/l10n.dart'; -import 'package:aves/model/settings/coordinate_format.dart'; +import 'package:aves/model/settings/enums/coordinate_format.dart'; import 'package:aves/utils/geo_utils.dart'; import 'package:latlong2/latlong.dart'; import 'package:test/test.dart'; diff --git a/test_driver/driver_screenshots.dart b/test_driver/driver_screenshots.dart index 652746749..cc1a095be 100644 --- a/test_driver/driver_screenshots.dart +++ b/test_driver/driver_screenshots.dart @@ -1,6 +1,6 @@ import 'package:aves/main_play.dart' as app; import 'package:aves/model/settings/defaults.dart'; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/widgets/filter_grids/countries_page.dart'; diff --git a/test_driver/driver_shaders.dart b/test_driver/driver_shaders.dart index e8fe57ad6..5c9a1e65e 100644 --- a/test_driver/driver_shaders.dart +++ b/test_driver/driver_shaders.dart @@ -1,7 +1,7 @@ import 'dart:ui'; import 'package:aves/main_play.dart' as app; -import 'package:aves/model/settings/enums.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:flutter_driver/driver_extension.dart'; import 'package:flutter_test/flutter_test.dart'; From 00986abd29c41342dc3d7d999646d523ae2b7e91 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Thu, 10 Feb 2022 14:34:59 +0900 Subject: [PATCH 15/39] fixed tests --- test/model/collection_source_test.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/model/collection_source_test.dart b/test/model/collection_source_test.dart index d468d024b..25b8f8a93 100644 --- a/test/model/collection_source_test.dart +++ b/test/model/collection_source_test.dart @@ -9,6 +9,8 @@ import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; import 'package:aves/model/db/db_metadata.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/model/settings/store/store.dart'; +import 'package:aves/model/settings/store/store_shared_pref.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/model/source/media_store_source.dart'; import 'package:aves/services/android_app_service.dart'; @@ -54,6 +56,7 @@ void main() { getIt.registerLazySingleton(() => p.Context(style: p.Style.posix)); getIt.registerLazySingleton(FakeAvesAvailability.new); getIt.registerLazySingleton(FakeMetadataDb.new); + getIt.registerLazySingleton(SharedPrefSettingsStore.new); getIt.registerLazySingleton(FakeAndroidAppService.new); getIt.registerLazySingleton(FakeDeviceService.new); From 458b95282c7d7d27e8d2370e40a9803e430d7c81 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Thu, 10 Feb 2022 16:38:52 +0900 Subject: [PATCH 16/39] upgraded flutter to v2.10.1 --- .github/workflows/check.yml | 2 +- .github/workflows/release.yml | 8 ++++---- CHANGELOG.md | 18 +++++++++++++++++- lib/services/common/services.dart | 5 +++-- pubspec.lock | 26 +++++++++++++------------- shaders_2.10.0.sksl.json | 1 - shaders_2.10.1.sksl.json | 1 + test/model/collection_source_test.dart | 5 +---- 8 files changed, 40 insertions(+), 26 deletions(-) delete mode 100644 shaders_2.10.0.sksl.json create mode 100644 shaders_2.10.1.sksl.json diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 8484f7422..2fc1c8500 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -15,7 +15,7 @@ jobs: - uses: subosito/flutter-action@v1 with: channel: stable - flutter-version: '2.10.0' + flutter-version: '2.10.1' - name: Clone the repository. uses: actions/checkout@v2 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3a9e61795..5ea3f4a01 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,7 +17,7 @@ jobs: - uses: subosito/flutter-action@v1 with: channel: stable - flutter-version: '2.10.0' + flutter-version: '2.10.1' # Workaround for this Android Gradle Plugin issue (supposedly fixed in AGP 4.1): # https://issuetracker.google.com/issues/144111441 @@ -52,12 +52,12 @@ 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_2.10.0.sksl.json + flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_2.10.1.sksl.json cp build/app/outputs/bundle/playRelease/*.aab outputs - flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_2.10.0.sksl.json + flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_2.10.1.sksl.json cp build/app/outputs/apk/play/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_2.10.0.sksl.json + flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_2.10.1.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 820c9e7ef..69cf21084 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,25 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added + +- Viewer: actions to copy/move to album + ### Changed -- upgraded Flutter to stable v2.10.0 +- Viewer: action menu reorganization +- Viewer: `Export` action renamed to `Convert` +- Collection: improved performance for sort/group by name +- load previous top items on startup +- upgraded Flutter to stable v2.10.1 + +### Removed + +- Map: connectivity check + +### Fixed + +- navigating from Album page when picking an item for another app ## [v1.5.11] - 2022-01-30 diff --git a/lib/services/common/services.dart b/lib/services/common/services.dart index 2ebcb67dc..12f817a61 100644 --- a/lib/services/common/services.dart +++ b/lib/services/common/services.dart @@ -19,10 +19,12 @@ import 'package:path/path.dart' as p; final getIt = GetIt.instance; +// fixed implementation is easier for test driver setup +final SettingsStore settingsStore = SharedPrefSettingsStore(); + final p.Context pContext = getIt(); final AvesAvailability availability = getIt(); final MetadataDb metadataDb = getIt(); -final SettingsStore settingsStore = getIt(); final AndroidAppService androidAppService = getIt(); final DeviceService deviceService = getIt(); @@ -39,7 +41,6 @@ void initPlatformServices() { getIt.registerLazySingleton(p.Context.new); getIt.registerLazySingleton(LiveAvesAvailability.new); getIt.registerLazySingleton(SqfliteMetadataDb.new); - getIt.registerLazySingleton(SharedPrefSettingsStore.new); getIt.registerLazySingleton(PlatformAndroidAppService.new); getIt.registerLazySingleton(PlatformDeviceService.new); diff --git a/pubspec.lock b/pubspec.lock index 7b9239638..c96adbee2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -326,7 +326,7 @@ packages: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.5.0" + version: "2.5.1" firebase_crashlytics_platform_interface: dependency: transitive description: @@ -622,7 +622,7 @@ packages: name: nm url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.4" node_preamble: dependency: transitive description: @@ -881,35 +881,35 @@ packages: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "2.0.12" + version: "2.0.13" shared_preferences_android: dependency: transitive description: name: shared_preferences_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.10" + version: "2.0.11" shared_preferences_ios: dependency: transitive description: name: shared_preferences_ios url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.10" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.1.0" shared_preferences_macos: dependency: transitive description: name: shared_preferences_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.3" shared_preferences_platform_interface: dependency: transitive description: @@ -930,7 +930,7 @@ packages: name: shared_preferences_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.1.0" shelf: dependency: transitive description: @@ -1119,14 +1119,14 @@ packages: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.14" + version: "6.0.15" url_launcher_ios: dependency: transitive description: name: url_launcher_ios url: "https://pub.dartlang.org" source: hosted - version: "6.0.14" + version: "6.0.15" url_launcher_linux: dependency: transitive description: @@ -1154,7 +1154,7 @@ packages: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.6" + version: "2.0.8" url_launcher_windows: dependency: transitive description: @@ -1210,7 +1210,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.3.10" + version: "2.3.11" wkt_parser: dependency: transitive description: @@ -1241,4 +1241,4 @@ packages: version: "3.1.0" sdks: dart: ">=2.16.0 <3.0.0" - flutter: ">=2.5.0" + flutter: ">=2.10.0" diff --git a/shaders_2.10.0.sksl.json b/shaders_2.10.0.sksl.json deleted file mode 100644 index f37dcff2c..000000000 --- a/shaders_2.10.0.sksl.json +++ /dev/null @@ -1 +0,0 @@ -{"platform":"android","name":"SM G970N","engineRevision":"776efd2034d50af73e2876d703213601df384e88","data":{"AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQLAAAAAAIAAEAAAABJWQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbM107CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueCwgdWNsYW1wX1MxX2MwX2MwX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEyKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","DASAAAAAQAAWAABAYAAQBYH7777Z6QQBAEAAAAAAEAAAAAAAEBSAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABZQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","AYAA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQACAAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAADkAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5ID0gbWF4KHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHksIDAuMCk7CgloYWxmIHJpZ2h0QWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVpbm5lclJlY3RfUzEuUiAtIHNrX0ZyYWdDb29yZC54KSk7CgloYWxmIGJvdHRvbUFscGhhID0gaGFsZihzYXR1cmF0ZSh1aW5uZXJSZWN0X1MxLkIgLSBza19GcmFnQ29vcmQueSkpOwoJaGFsZiBhbHBoYSA9IGJvdHRvbUFscGhhICogcmlnaHRBbHBoYSAqIGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEADZAAAAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAAPwQAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5ID0gbWF4KHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHksIDAuMCk7CgloYWxmIHJpZ2h0QWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVpbm5lclJlY3RfUzEuUiAtIHNrX0ZyYWdDb29yZC54KSk7CgloYWxmIGJvdHRvbUFscGhhID0gaGFsZihzYXR1cmF0ZSh1aW5uZXJSZWN0X1MxLkIgLSBza19GcmFnQ29vcmQueSkpOwoJaGFsZiBhbHBoYSA9IGJvdHRvbUFscGhhICogcmlnaHRBbHBoYSAqIGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","B2AAQAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAABAEAAAABJYQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAueSwgdWNsYW1wX1MxX2MwX2MwX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEzKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","GEMAAAYAAEHAAAARC4EAAAQWBQAAAAAAAAAQAAAAIBCAAAGQAEAAAAAQAAAABAEQAEAAAAA":"CAAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA4AAABpblNoYWRvd1BhcmFtcwAAAQAAAAAAAAA=","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMABAAOAAAABAAAAAAABBAMAAA":"CAAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIBAIAAAABLCIIBAAAAABAEGABBAMAACAIAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAD6AwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CgkvLyBCbGVuZCBtb2RlOiBNb2R1bGF0ZQoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAABAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAIAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","EABQAAAAAEAAAAAQAABQAAIOAAABCFYIAAKAUDAAAAAAAAABAAAAAAAAAAANAAIAAAABAAAAACAJAAIAAAAA":"CAAAAExTS1OhAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgZmxvYXQyIHZJbnRUZXh0dXJlQ29vcmRzX1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIERpc3RhbmNlRmllbGRQYXRoCglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJdkludFRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkczsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8yX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGZsb2F0MiB2SW50VGV4dHVyZUNvb3Jkc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBEaXN0YW5jZUZpZWxkUGF0aAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQyIHV2ID0gdlRleHR1cmVDb29yZHNfUzA7CgloYWxmNCB0ZXhDb2xvcjsKCXsKCQl0ZXhDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLnJycnI7Cgl9CgloYWxmIGRpc3RhbmNlID0gNy45Njg3NSoodGV4Q29sb3IuciAtIDAuNTAxOTYwNzg0MzEpOwoJaGFsZiBhZndpZHRoOwoJYWZ3aWR0aCA9IGFicygwLjY1KmhhbGYoZEZkeCh2SW50VGV4dHVyZUNvb3Jkc19TMC54KSkpOwoJaGFsZiB2YWwgPSBzbW9vdGhzdGVwKC1hZndpZHRoLCBhZndpZHRoLCBkaXN0YW5jZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KHZhbCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAEQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEADZABYAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAA7AMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGAARAGQWMHGBRIAAAAABQAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HTQAAGAABBYAAAEIXBAAAGEAMAAAAAAAAAAAAAAAQAHAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAKAAAAaW5RdWFkRWRnZQAAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEAZIA62YSBDACAAAGAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAAdwUAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAIAAQAAAAAQGIA":"CAAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAMAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBDbGFtcGVkR3JhZGllbnRfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSAoaGFsZjQoMS4wKSAtIG91dHB1dF9TMSkgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAEAAAACAAAAHBvc2l0aW9uCAAAAGNvdmVyYWdlBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAIAAEAAAABJYQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueCwgdWNsYW1wX1MxX2MwX2MwX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEzKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYTRVAADQAAAOAEARAFQJAABBADAAAILBYAACCYUQD777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAFAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2ULAAAAaW5DbGlwUGxhbmUADAAAAGluSXNlY3RQbGFuZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAEAQAAAAGQCBAMQACAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIAAIAAAABLCIABAAAAABAEGABBAMAACAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAdBAAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZC54ID0gY2xhbXAoc3Vic2V0Q29vcmQueCwgdWNsYW1wX1MxX2MwX2MwLngsIHVjbGFtcF9TMV9jMF9jMC56KTsKCWNsYW1wZWRDb29yZC55ID0gc3Vic2V0Q29vcmQueTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQmxlbmRfUzEoaGFsZjQgX3NyYywgaGFsZjQgX2RzdCkgCnsKCS8vIEJsZW5kIG1vZGU6IE1vZHVsYXRlCglyZXR1cm4gYmxlbmRfbW9kdWxhdGUoTWF0cml4RWZmZWN0X1MxX2MwKF9zcmMpLCBfc3JjKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEJsZW5kX1MxKG91dHB1dENvbG9yX1MwLCBoYWxmNCgxKSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGACQAGAAAAAQAAAAAAAQQGAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAACEA2X4PLOGEAAAAAAAAACAAAAAVQQAAQAAAAAQCDIBCAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAuAIAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAAA5AAAAAAABAAAAACAZAAAAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAAAAAAAXQIAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","B2ABSAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAKAAAAaW5Db3ZlcmFnZQAAAQAAAAAAAAA=","BYIBQAAABQAAIAABBYAAAEIXBAAP777777777777AAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEAZCBRE4GNEACAAAOAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAABwUAAGNvbnN0IGludCBrRmlsbEFBX1MxID0gMTsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdWNpcmNsZV9TMTsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmNsZV9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgZDsKCWlmIChpbnQoMykgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlkID0gaGFsZigobGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykgLSAxLjApICogdWNpcmNsZV9TMS56KTsKCX0KCWVsc2UgCgl7CgkJZCA9IGhhbGYoKDEuMCAtIGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpKSAqIHVjaXJjbGVfUzEueik7Cgl9CglpZiAoaW50KDMpID09IGtGaWxsQUFfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlyZXR1cm4gaGFsZjQoX2lucHV0ICogc2F0dXJhdGUoZCkpOwoJfQoJZWxzZSAKCXsKCQlyZXR1cm4gaGFsZjQoZCA+IDAuNSA/IF9pbnB1dCA6IGhhbGY0KDAuMCkpOwoJfQp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjbGVfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAEAAAAc2tldwkAAAB0cmFuc2xhdGUAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAFAAAAY29sb3IAAAABAAAAAAAAAA==","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgxKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAAAAIAAAABLAIABAAAAABAEGABBAMAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADnAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJLy8gQmxlbmQgbW9kZTogTW9kdWxhdGUKCXJldHVybiBibGVuZF9tb2R1bGF0ZShNYXRyaXhFZmZlY3RfUzFfYzAoX3NyYyksIF9zcmMpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQmxlbmRfUzEob3V0cHV0Q29sb3JfUzAsIGhhbGY0KDEpKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAAAQAAAAGQCBAMQACAAAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzAueCwgdWNsYW1wX1MxX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIBSQB5VRECGAEAAAMAAAAAAAAAAACAA4AAAACAAAAAAACCAYAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQLAAAAAAABAEAAAABJWQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbM107CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbM107CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAueSwgdWNsYW1wX1MxX2MwX2MwX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEyKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAAAAEAAAABJYQAAAAAAAAIAAAAAWCBAAAABAAAAANAECAZAAAAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAPIEAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdV8wX0luY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1XzFfS2VybmVsX1MxX2MwWzRdOwp1bmlmb3JtIGhhbGY0IHVfMl9PZmZzZXRzX1MxX2MwWzRdOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIF9jb29yZHMpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF8zX2NvbG9yID0gaGFsZjQoMC4wKTsKCWZsb2F0MiBfNV9jb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgXzZfaSA9IDA7IChfNl9pIDwgMTMpOyBfNl9pKyspIChfM19jb2xvciArPSAoTWF0cml4RWZmZWN0X1MxX2MwX2MwKF9pbnB1dCwgKF81X2Nvb3JkICsgZmxvYXQyKCh1XzJfT2Zmc2V0c19TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSAqIHVfMF9JbmNyZW1lbnRfUzFfYzApKSkpICogdV8xX0tlcm5lbF9TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSkpOwoJcmV0dXJuIF8zX2NvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIAHSADQAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAGIBIAAABAAAAANAEAAAAAAAAAAAAAABAAOAAAABAAAAAAABBAMAAAAA":"CAAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA=="}} \ No newline at end of file diff --git a/shaders_2.10.1.sksl.json b/shaders_2.10.1.sksl.json new file mode 100644 index 000000000..72c870270 --- /dev/null +++ b/shaders_2.10.1.sksl.json @@ -0,0 +1 @@ +{"platform":"android","name":"SM G970N","engineRevision":"ab46186b246f5a36bd1f3f295d14a43abb1e2f38","data":{"HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAAAAIAAAABLAIABAAAAABAEGABBAMAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAADnAgAAdW5pZm9ybSBmbG9hdDN4MyB1bWF0cml4X1MxX2MwOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMTsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18zX1MwKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzAoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0KTsKfQpoYWxmNCBCbGVuZF9TMShoYWxmNCBfc3JjLCBoYWxmNCBfZHN0KSAKewoJLy8gQmxlbmQgbW9kZTogTW9kdWxhdGUKCXJldHVybiBibGVuZF9tb2R1bGF0ZShNYXRyaXhFZmZlY3RfUzFfYzAoX3NyYyksIF9zcmMpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQmxlbmRfUzEob3V0cHV0Q29sb3JfUzAsIGhhbGY0KDEpKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIAAIAAAABLCIABAAAAABAEGABBAMAACAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAdBAAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZC54ID0gY2xhbXAoc3Vic2V0Q29vcmQueCwgdWNsYW1wX1MxX2MwX2MwLngsIHVjbGFtcF9TMV9jMF9jMC56KTsKCWNsYW1wZWRDb29yZC55ID0gc3Vic2V0Q29vcmQueTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQmxlbmRfUzEoaGFsZjQgX3NyYywgaGFsZjQgX2RzdCkgCnsKCS8vIEJsZW5kIG1vZGU6IE1vZHVsYXRlCglyZXR1cm4gYmxlbmRfbW9kdWxhdGUoTWF0cml4RWZmZWN0X1MxX2MwKF9zcmMpLCBfc3JjKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IEJsZW5kX1MxKG91dHB1dENvbG9yX1MwLCBoYWxmNCgxKSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAAAcBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAAAAEAAAABJYQAAAAAAAAIAAAAAWCBAAAABAAAAANAECAZAAAAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAPIEAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzA7CnVuaWZvcm0gaGFsZjIgdV8wX0luY3JlbWVudF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1XzFfS2VybmVsX1MxX2MwWzRdOwp1bmlmb3JtIGhhbGY0IHVfMl9PZmZzZXRzX1MxX2MwWzRdOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIF9jb29yZHMpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBHYXVzc2lhbkNvbnZvbHV0aW9uX1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF8zX2NvbG9yID0gaGFsZjQoMC4wKTsKCWZsb2F0MiBfNV9jb29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZm9yIChpbnQgXzZfaSA9IDA7IChfNl9pIDwgMTMpOyBfNl9pKyspIChfM19jb2xvciArPSAoTWF0cml4RWZmZWN0X1MxX2MwX2MwKF9pbnB1dCwgKF81X2Nvb3JkICsgZmxvYXQyKCh1XzJfT2Zmc2V0c19TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSAqIHVfMF9JbmNyZW1lbnRfUzFfYzApKSkpICogdV8xX0tlcm5lbF9TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSkpOwoJcmV0dXJuIF8zX2NvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAABAEAAAABJYQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAueSwgdWNsYW1wX1MxX2MwX2MwX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEzKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGACQAGAAAAAQAAAAAAAQQGAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2bG9jYWxDb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQFAAAAAAIAAEAAAABJKQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADAGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbMl07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbMl07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueCwgdWNsYW1wX1MxX2MwX2MwX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDYpOyBfNl9pKyspIChfM19jb2xvciArPSAoTWF0cml4RWZmZWN0X1MxX2MwX2MwKF9pbnB1dCwgKF81X2Nvb3JkICsgZmxvYXQyKCh1XzJfT2Zmc2V0c19TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSAqIHVfMF9JbmNyZW1lbnRfUzFfYzApKSkpICogdV8xX0tlcm5lbF9TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSkpOwoJcmV0dXJuIF8zX2NvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABZQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACnAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCWFscGhhID0gMS4wIC0gYWxwaGE7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIENpcmNsZUdlb21ldHJ5UHJvY2Vzc29yCglmbG9hdDQgY2lyY2xlRWRnZTsKCWNpcmNsZUVkZ2UgPSB2aW5DaXJjbGVFZGdlX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQgZCA9IGxlbmd0aChjaXJjbGVFZGdlLnh5KTsKCWhhbGYgZGlzdGFuY2VUb091dGVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKDEuMCAtIGQpKTsKCWhhbGYgZWRnZUFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb091dGVyRWRnZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABGAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAEQQGABZAA6IAAAAACAAAAAADUAAAAAAAEAAAAAIDEAAAAAAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABPAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CnVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWZsb2F0MiB0ZXhDb29yZDsKCXRleENvb3JkID0gdmxvY2FsQ29vcmRfUzA7CglvdXRwdXRDb2xvcl9TMCA9ICgoc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB0ZXhDb29yZCkgKiBoYWxmNCgxKSkpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgxKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQFAAAAAAABAEAAAABJKQAAAAAACAIAAAAAWCBAAAIBAAAAANAECAZAAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADAGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbMl07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbMl07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBzdWJzZXRDb29yZC54OwoJY2xhbXBlZENvb3JkLnkgPSBjbGFtcChzdWJzZXRDb29yZC55LCB1Y2xhbXBfUzFfYzBfYzBfYzAueSwgdWNsYW1wX1MxX2MwX2MwX2MwLncpOwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDYpOyBfNl9pKyspIChfM19jb2xvciArPSAoTWF0cml4RWZmZWN0X1MxX2MwX2MwKF9pbnB1dCwgKF81X2Nvb3JkICsgZmxvYXQyKCh1XzJfT2Zmc2V0c19TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSAqIHVfMF9JbmNyZW1lbnRfUzFfYzApKSkpICogdV8xX0tlcm5lbF9TMV9jMFsoXzZfaSAvIDQpXVsoXzZfaSAmIDMpXSkpOwoJcmV0dXJuIF8zX2NvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwID0gaGFsZjQoMSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRfUzEgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAkAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAAA5AAAAAAABAAAAACAZAAAAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAAAAAAAXQIAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmFyY2Nvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEADZABYAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAA7AMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRmlsbFJSZWN0T3A6OlByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IHhfcGx1c18xPXZhcmNjb29yZF9TMC54LCB5PXZhcmNjb29yZF9TMC55OwoJaGFsZiBjb3ZlcmFnZTsKCWlmICgwID09IHhfcGx1c18xKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoeSk7Cgl9CgllbHNlIAoJewoJCWZsb2F0IGZuID0geF9wbHVzXzEgKiAoeF9wbHVzXzEgLSAyKTsKCQlmbiA9IGZtYSh5LHksIGZuKTsKCQlmbG9hdCBmbndpZHRoID0gZndpZHRoKGZuKTsKCQljb3ZlcmFnZSA9IC41IC0gaGFsZihmbi9mbndpZHRoKTsKCQljb3ZlcmFnZSA9IGNsYW1wKGNvdmVyYWdlLCAwLCAxKTsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoY292ZXJhZ2UpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAKAAYAAAACAAAAAAACCAYAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoAAAAAKQEAAGZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","AYAA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1OCAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5DaXJjbGVFZGdlOwpvdXQgZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMl9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","B2ABSAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1N4AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBmbG9hdDIgaW5Qb3NpdGlvbjsKaW4gaGFsZiBpbkNvdmVyYWdlOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gdUNvbG9yX1MwOwoJY29sb3IgPSBjb2xvciAqIGluQ292ZXJhZ2U7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8zX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzFfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAeAQAAaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAKAAAAaW5Db3ZlcmFnZQAAAQAAAAAAAAA=","B2AAQAAABQAAIAABBYAAB7777777777774ABICAAAAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1MOAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmIGluQ292ZXJhZ2U7Cm91dCBoYWxmIHZpbkNvdmVyYWdlX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0MiBfdG1wXzFfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cgl2aW5Db3ZlcmFnZV9TMCA9IGluQ292ZXJhZ2U7Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAZQEAAHVuaWZvcm0gaGFsZjQgdUNvbG9yX1MwOwppbiBoYWxmIHZpbkNvdmVyYWdlX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgRGVmYXVsdEdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdUNvbG9yX1MwOwoJaGFsZiBhbHBoYSA9IDEuMDsKCWFscGhhID0gdmluQ292ZXJhZ2VfUzA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAACgAAAGluQ292ZXJhZ2UAAAEAAAAAAAAA","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIBSQB5VRECGAEAAAMAAAAAAAAAAACAA4AAAACAAAAAAACCAYAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAA4wQAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGNvdmVyYWdlOwoJaWYgKGludCgxKSA9PSBrRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSkgCgl7CgkJY292ZXJhZ2UgPSBoYWxmKGFsbChncmVhdGVyVGhhbihmbG9hdDQoc2tfRnJhZ0Nvb3JkLnh5LCB1cmVjdFVuaWZvcm1fUzEuencpLCBmbG9hdDQodXJlY3RVbmlmb3JtX1MxLnh5LCBza19GcmFnQ29vcmQueHkpKSkgPyAxIDogMCk7Cgl9CgllbHNlIAoJewoJCWhhbGY0IGRpc3RzNCA9IGNsYW1wKGhhbGY0KDEuMCwgMS4wLCAtMS4wLCAtMS4wKSAqIGhhbGY0KHNrX0ZyYWdDb29yZC54eXh5IC0gdXJlY3RVbmlmb3JtX1MxKSwgMC4wLCAxLjApOwoJCWhhbGYyIGRpc3RzMiA9IChkaXN0czQueHkgKyBkaXN0czQuencpIC0gMS4wOwoJCWNvdmVyYWdlID0gZGlzdHMyLnggKiBkaXN0czIueTsKCX0KCWlmIChpbnQoMSkgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQljb3ZlcmFnZSA9IDEuMCAtIGNvdmVyYWdlOwoJfQoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIGNvdmVyYWdlKTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZjQgdGV4Q29sb3I7Cgl7CgkJdGV4Q29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHZUZXh0dXJlQ29vcmRzX1MwKS5ycnJyOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSB0ZXhDb2xvcjsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACAMQAHOMFARUBIAADAAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACtBQAAY29uc3QgaW50IGtGaWxsQldfUzEgPSAwOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1cmVjdFVuaWZvcm1fUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IFJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEAZCBRE4GNEACAAAOAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAABwUAAGNvbnN0IGludCBrRmlsbEFBX1MxID0gMTsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdWNpcmNsZV9TMTsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2YXJjY29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmNsZV9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgZDsKCWlmIChpbnQoMykgPT0ga0ludmVyc2VGaWxsQldfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlkID0gaGFsZigobGVuZ3RoKCh1Y2lyY2xlX1MxLnh5IC0gc2tfRnJhZ0Nvb3JkLnh5KSAqIHVjaXJjbGVfUzEudykgLSAxLjApICogdWNpcmNsZV9TMS56KTsKCX0KCWVsc2UgCgl7CgkJZCA9IGhhbGYoKDEuMCAtIGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpKSAqIHVjaXJjbGVfUzEueik7Cgl9CglpZiAoaW50KDMpID09IGtGaWxsQUFfUzEgfHwgaW50KDMpID09IGtJbnZlcnNlRmlsbEFBX1MxKSAKCXsKCQlyZXR1cm4gaGFsZjQoX2lucHV0ICogc2F0dXJhdGUoZCkpOwoJfQoJZWxzZSAKCXsKCQlyZXR1cm4gaGFsZjQoZCA+IDAuNSA/IF9pbnB1dCA6IGhhbGY0KDAuMCkpOwoJfQp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjbGVfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAIAAAADgAAAHJhZGlpX3NlbGVjdG9yAAAZAAAAY29ybmVyX2FuZF9yYWRpdXNfb3V0c2V0cwAAABUAAABhYV9ibG9hdF9hbmRfY292ZXJhZ2UAAAAEAAAAc2tldwkAAAB0cmFuc2xhdGUAAAAHAAAAcmFkaWlfeAAHAAAAcmFkaWlfeQAFAAAAY29sb3IAAAABAAAAAAAAAA==","GEMAAAYAAEHAAAARC4EAAAQWBQAAAAAAAAAQAAAAIBCAAAGQAEAAAAAQAAAABAEQAEAAAAA":"CAAAAExTS1NUAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBoYWxmMyBpblNoYWRvd1BhcmFtczsKb3V0IGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBSUmVjdFNoYWRvdwoJdmluU2hhZG93UGFyYW1zX1MwID0gaW5TaGFkb3dQYXJhbXM7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAjAgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGhhbGYzIHZpblNoYWRvd1BhcmFtc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBSUmVjdFNoYWRvdwoJaGFsZjMgc2hhZG93UGFyYW1zOwoJc2hhZG93UGFyYW1zID0gdmluU2hhZG93UGFyYW1zX1MwOwoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJaGFsZiBkID0gbGVuZ3RoKHNoYWRvd1BhcmFtcy54eSk7CglmbG9hdDIgdXYgPSBmbG9hdDIoc2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CgloYWxmIGZhY3RvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLjAwMHIuYTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZmFjdG9yKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA4AAABpblNoYWRvd1BhcmFtcwAAAQAAAAAAAAA=","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAAuAIAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24FAAAAY29sb3IAAAABAAAAAAAAAA==","HUJAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAQAAAAAAQQGAARAGQWMHGBRIAAAAABQAAAAAAAAAAHIAAAAAAAIAAAAAQGIAA":"CAAAAExTS1PlAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmxvY2FsQ29vcmRfUzAgPSBsb2NhbENvb3JkOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwp9CgAAAAEAAABhBAAAY29uc3QgaW50IGtGaWxsQUFfUzEgPSAxOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQldfUzEgPSAyOwpjb25zdCBpbnQga0ludmVyc2VGaWxsQUFfUzEgPSAzOwp1bmlmb3JtIGZsb2F0NCB1Y2lyY2xlX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZsb2NhbENvb3JkX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBDaXJjbGVfUzEoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8wX2luQ29sb3IgPSBfaW5wdXQ7CgloYWxmIGQ7CglpZiAoaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJZCA9IGhhbGYoKGxlbmd0aCgodWNpcmNsZV9TMS54eSAtIHNrX0ZyYWdDb29yZC54eSkgKiB1Y2lyY2xlX1MxLncpIC0gMS4wKSAqIHVjaXJjbGVfUzEueik7Cgl9CgllbHNlIAoJewoJCWQgPSBoYWxmKCgxLjAgLSBsZW5ndGgoKHVjaXJjbGVfUzEueHkgLSBza19GcmFnQ29vcmQueHkpICogdWNpcmNsZV9TMS53KSkgKiB1Y2lyY2xlX1MxLnopOwoJfQoJaWYgKGludCgxKSA9PSBrRmlsbEFBX1MxIHx8IGludCgxKSA9PSBrSW52ZXJzZUZpbGxBQV9TMSkgCgl7CgkJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIHNhdHVyYXRlKGQpKTsKCX0KCWVsc2UgCgl7CgkJcmV0dXJuIGhhbGY0KGQgPiAwLjUgPyBfaW5wdXQgOiBoYWxmNCgwLjApKTsKCX0KfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJZmxvYXQyIHRleENvb3JkOwoJdGV4Q29vcmQgPSB2bG9jYWxDb29yZF9TMDsKCW91dHB1dENvbG9yX1MwID0gKChzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzAsIHRleENvb3JkKSAqIGhhbGY0KDEpKSk7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY2xlX1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uCgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAGIBIAAABAAAAANAEAAAAAAAAAAAAAABAAOAAAABAAAAAAABBAMAAAAA":"CAAAAExTS1N0AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfMl9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAIsCAAB1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzE7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwKS5ycnJyOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMChfaW5wdXQpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gTWF0cml4RWZmZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAgAAABwb3NpdGlvbgUAAABjb2xvcgAAAAoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEADZAAAAAAIAAAAAACQAGAAAAAQAAAAAAAQQG":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAAPwQAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5ID0gbWF4KHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHksIDAuMCk7CgloYWxmIHJpZ2h0QWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVpbm5lclJlY3RfUzEuUiAtIHNrX0ZyYWdDb29yZC54KSk7CgloYWxmIGJvdHRvbUFscGhhID0gaGFsZihzYXR1cmF0ZSh1aW5uZXJSZWN0X1MxLkIgLSBza19GcmFnQ29vcmQueSkpOwoJaGFsZiBhbHBoYSA9IGJvdHRvbUFscGhhICogcmlnaHRBbHBoYSAqIGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","AYTRVAADQAAAOAEARAFQJAABBADAAAILBYAACCYUQD777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1NyAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7CmluIGhhbGYzIGluQ2xpcFBsYW5lOwppbiBoYWxmMyBpbklzZWN0UGxhbmU7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKb3V0IGhhbGYzIHZpbklzZWN0UGxhbmVfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCXZpbkNpcmNsZUVkZ2VfUzAgPSBpbkNpcmNsZUVkZ2U7Cgl2aW5DbGlwUGxhbmVfUzAgPSBpbkNsaXBQbGFuZTsKCXZpbklzZWN0UGxhbmVfUzAgPSBpbklzZWN0UGxhbmU7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gdWxvY2FsTWF0cml4X1MwLnh6ICogaW5Qb3NpdGlvbiArIHVsb2NhbE1hdHJpeF9TMC55dzsKCXNrX1Bvc2l0aW9uID0gX3RtcF8wX2luUG9zaXRpb24ueHkwMTsKfQoAAAAAAAD1AwAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGYzIHZpbkNsaXBQbGFuZV9TMDsKaW4gaGFsZjMgdmluSXNlY3RQbGFuZV9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGYzIGNsaXBQbGFuZTsKCWNsaXBQbGFuZSA9IHZpbkNsaXBQbGFuZV9TMDsKCWhhbGYzIGlzZWN0UGxhbmU7Cglpc2VjdFBsYW5lID0gdmluSXNlY3RQbGFuZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZiBkaXN0YW5jZVRvSW5uZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoZCAtIGNpcmNsZUVkZ2UudykpOwoJaGFsZiBpbm5lckFscGhhID0gc2F0dXJhdGUoZGlzdGFuY2VUb0lubmVyRWRnZSk7CgllZGdlQWxwaGEgKj0gaW5uZXJBbHBoYTsKCWhhbGYgY2xpcCA9IGhhbGYoc2F0dXJhdGUoY2lyY2xlRWRnZS56ICogZG90KGNpcmNsZUVkZ2UueHksIGNsaXBQbGFuZS54eSkgKyBjbGlwUGxhbmUueikpOwoJY2xpcCAqPSBoYWxmKHNhdHVyYXRlKGNpcmNsZUVkZ2UueiAqIGRvdChjaXJjbGVFZGdlLnh5LCBpc2VjdFBsYW5lLnh5KSArIGlzZWN0UGxhbmUueikpOwoJZWRnZUFscGhhICo9IGNsaXA7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAFAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAAwAAABpbkNpcmNsZUVkZ2ULAAAAaW5DbGlwUGxhbmUADAAAAGluSXNlY3RQbGFuZQEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAAAQAAAAGQCBAMQACAAAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAIgDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzAueCwgdWNsYW1wX1MxX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQACAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAAHEADZAAAAAAIAAAAAAOQAAAAAAAQAAAABAMQAAAAAA":"CAAAAExTS1PPAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7Cm91dCBoYWxmNCB2Y29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAEAAACzAgAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","HVIACAAAABQAAGAAAQ4AAAAAGQQAARC4GAAAIOCAAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAADAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAYAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAIAAQAAAAAQGIA":"CAAAAExTS1PlAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdCBjb3ZlcmFnZTsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdCB2Y292ZXJhZ2VfUzA7Cm91dCBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQyIHBvc2l0aW9uID0gcG9zaXRpb24ueHk7Cgl2Y29sb3JfUzAgPSBjb2xvcjsKCXZjb3ZlcmFnZV9TMCA9IGNvdmVyYWdlOwoJc2tfUG9zaXRpb24gPSBwb3NpdGlvbi54eTAxOwoJewoJCXZUcmFuc2Zvcm1lZENvb3Jkc181X1MwID0gZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMSkgKiBsb2NhbENvb3JkLnh5MTsKCX0KfQoAAAAAAAAAMAcAAHVuaWZvcm0gaGFsZjQgdXN0YXJ0X1MxX2MwX2MwOwp1bmlmb3JtIGhhbGY0IHVlbmRfUzFfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKdW5pZm9ybSBoYWxmNCB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQgdmNvdmVyYWdlX1MwOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzFfY29vcmRzID0gX2Nvb3JkczsKCXJldHVybiBoYWxmNChtaXgodXN0YXJ0X1MxX2MwX2MwLCB1ZW5kX1MxX2MwX2MwLCBoYWxmKF90bXBfMV9jb29yZHMueCkpKTsKfQpoYWxmNCBMaW5lYXJMYXlvdXRfUzFfYzBfYzFfYzAoaGFsZjQgX2lucHV0KSAKewoJaGFsZjQgX3RtcF8yX2luQ29sb3IgPSBfaW5wdXQ7CglmbG9hdDIgX3RtcF8zX2Nvb3JkcyA9IHZUcmFuc2Zvcm1lZENvb3Jkc181X1MwOwoJcmV0dXJuIGhhbGY0KGhhbGY0KGhhbGYoX3RtcF8zX2Nvb3Jkcy54KSArIDkuOTk5OTk5NzQ3Mzc4NzUxNmUtMDYsIDEuMCwgMC4wLCAwLjApKTsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIExpbmVhckxheW91dF9TMV9jMF9jMV9jMChfaW5wdXQpOwp9CmhhbGY0IENsYW1wZWRHcmFkaWVudF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzRfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGY0IHQgPSBNYXRyaXhFZmZlY3RfUzFfYzBfYzEoX3RtcF80X2luQ29sb3IpOwoJaGFsZjQgb3V0Q29sb3I7CglpZiAoIWJvb2woaW50KDEpKSAmJiB0LnkgPCAwLjApIAoJewoJCW91dENvbG9yID0gaGFsZjQoMC4wKTsKCX0KCWVsc2UgaWYgKHQueCA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSB1bGVmdEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSBpZiAodC54ID4gMS4wKSAKCXsKCQlvdXRDb2xvciA9IHVyaWdodEJvcmRlckNvbG9yX1MxX2MwOwoJfQoJZWxzZSAKCXsKCQlvdXRDb2xvciA9IFNpbmdsZUludGVydmFsQ29sb3JpemVyX1MxX2MwX2MwKF90bXBfNF9pbkNvbG9yLCBmbG9hdDIoaGFsZjIodC54LCAwLjApKSk7Cgl9CglpZiAoYm9vbChpbnQoMSkpKSAKCXsKCQlvdXRDb2xvci54eXogKj0gb3V0Q29sb3IudzsKCX0KCXJldHVybiBoYWxmNChvdXRDb2xvcik7Cn0KaGFsZjQgRGlzYWJsZUNvdmVyYWdlQXNBbHBoYV9TMShoYWxmNCBfaW5wdXQpIAp7CglfaW5wdXQgPSBDbGFtcGVkR3JhZGllbnRfUzFfYzAoX2lucHV0KTsKCWhhbGY0IF90bXBfNV9pbkNvbG9yID0gX2lucHV0OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWZsb2F0IGNvdmVyYWdlID0gdmNvdmVyYWdlX1MwOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChoYWxmKGNvdmVyYWdlKSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKG91dHB1dENvbG9yX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSAoaGFsZjQoMS4wKSAtIG91dHB1dF9TMSkgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAEAAAACAAAAHBvc2l0aW9uCAAAAGNvdmVyYWdlBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","DASAAAAAQAAWAABAYAAQBYH7777Z6QQBAEAAAAAAEAAAAAAAEBSAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1PVAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBCaXRtYXBUZXh0CglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc1NpemVJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCXNrX1Bvc2l0aW9uID0gaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAD4AQAAdW5pZm9ybSBoYWxmNCB1Q29sb3JfUzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQml0bWFwVGV4dAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHVDb2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCk7Cgl9CglvdXRwdXRDb2xvcl9TMCA9IG91dHB1dENvbG9yX1MwICogdGV4Q29sb3I7Cgljb25zdCBoYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KDEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAoAAABpblBvc2l0aW9uAAAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA","HVIAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAAAAAAAAFIBTWV34ISAIAAAAEYT7ZOFIQAAAABAAAAABQAAAAAIFGB7HB2BAAAAAFQRH6PYAAAAEAAAAAAAAZGE66LR2FAEAAAIAAAAAMAAAAACAJQPRYO4IAAAAAMAI7T6YBAAAAABAAAAAGIMFGB7HB2BAAAAAAAAAAQAKYCRPE54DQAAAABAAAAAEQEFMEJ7T6AAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIA":"CAAAAExTS1OAAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBoYWxmNCBjb2xvcjsKaW4gZmxvYXQyIGxvY2FsQ29vcmQ7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKCXsKCQl2VHJhbnNmb3JtZWRDb29yZHNfNV9TMCA9IGZsb2F0M3gyKHVtYXRyaXhfUzFfYzBfYzEpICogbG9jYWxDb29yZC54eTE7Cgl9Cn0KAAAAAOMGAAB1bmlmb3JtIGhhbGY0IHVzdGFydF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmNCB1ZW5kX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzBfYzE7CnVuaWZvcm0gaGFsZjQgdWxlZnRCb3JkZXJDb2xvcl9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1cmlnaHRCb3JkZXJDb2xvcl9TMV9jMDsKZmxhdCBpbiBoYWxmNCB2Y29sb3JfUzA7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfNV9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJZmxvYXQyIF90bXBfMV9jb29yZHMgPSBfY29vcmRzOwoJcmV0dXJuIGhhbGY0KG1peCh1c3RhcnRfUzFfYzBfYzAsIHVlbmRfUzFfYzBfYzAsIGhhbGYoX3RtcF8xX2Nvb3Jkcy54KSkpOwp9CmhhbGY0IExpbmVhckxheW91dF9TMV9jMF9jMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzJfaW5Db2xvciA9IF9pbnB1dDsKCWZsb2F0MiBfdG1wXzNfY29vcmRzID0gdlRyYW5zZm9ybWVkQ29vcmRzXzVfUzA7CglyZXR1cm4gaGFsZjQoaGFsZjQoaGFsZihfdG1wXzNfY29vcmRzLngpICsgOS45OTk5OTk3NDczNzg3NTE2ZS0wNiwgMS4wLCAwLjAsIDAuMCkpOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gTGluZWFyTGF5b3V0X1MxX2MwX2MxX2MwKF9pbnB1dCk7Cn0KaGFsZjQgQ2xhbXBlZEdyYWRpZW50X1MxX2MwKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfNF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjQgdCA9IE1hdHJpeEVmZmVjdF9TMV9jMF9jMShfdG1wXzRfaW5Db2xvcik7CgloYWxmNCBvdXRDb2xvcjsKCWlmICghYm9vbChpbnQoMSkpICYmIHQueSA8IDAuMCkgCgl7CgkJb3V0Q29sb3IgPSBoYWxmNCgwLjApOwoJfQoJZWxzZSBpZiAodC54IDwgMC4wKSAKCXsKCQlvdXRDb2xvciA9IHVsZWZ0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIGlmICh0LnggPiAxLjApIAoJewoJCW91dENvbG9yID0gdXJpZ2h0Qm9yZGVyQ29sb3JfUzFfYzA7Cgl9CgllbHNlIAoJewoJCW91dENvbG9yID0gU2luZ2xlSW50ZXJ2YWxDb2xvcml6ZXJfUzFfYzBfYzAoX3RtcF80X2luQ29sb3IsIGZsb2F0MihoYWxmMih0LngsIDAuMCkpKTsKCX0KCWlmIChib29sKGludCgwKSkpIAoJewoJCW91dENvbG9yLnh5eiAqPSBvdXRDb2xvci53OwoJfQoJcmV0dXJuIGhhbGY0KG91dENvbG9yKTsKfQpoYWxmNCBEaXNhYmxlQ292ZXJhZ2VBc0FscGhhX1MxKGhhbGY0IF9pbnB1dCkgCnsKCV9pbnB1dCA9IENsYW1wZWRHcmFkaWVudF9TMV9jMChfaW5wdXQpOwoJaGFsZjQgX3RtcF81X2luQ29sb3IgPSBfaW5wdXQ7CglyZXR1cm4gaGFsZjQoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IERpc2FibGVDb3ZlcmFnZUFzQWxwaGFfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAADUAANAAAAAAIBAIAAAABLCIIBAAAAABAEGABBAMAACAIAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1M8AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAD6AwAAdW5pZm9ybSBmbG9hdDQgdWNsYW1wX1MxX2MwX2MwOwp1bmlmb3JtIGZsb2F0M3gzIHVtYXRyaXhfUzFfYzA7CnVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MxOwppbiBmbG9hdDIgdlRyYW5zZm9ybWVkQ29vcmRzXzNfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGluQ29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfM19TMDsKCWZsb2F0MiBzdWJzZXRDb29yZDsKCXN1YnNldENvb3JkLnggPSBpbkNvb3JkLng7CglzdWJzZXRDb29yZC55ID0gaW5Db29yZC55OwoJZmxvYXQyIGNsYW1wZWRDb29yZDsKCWNsYW1wZWRDb29yZCA9IGNsYW1wKHN1YnNldENvb3JkLCB1Y2xhbXBfUzFfYzBfYzAueHksIHVjbGFtcF9TMV9jMF9jMC56dyk7CgloYWxmNCB0ZXh0dXJlQ29sb3IgPSBzYW1wbGUodVRleHR1cmVTYW1wbGVyXzBfUzEsIGNsYW1wZWRDb29yZCk7CglyZXR1cm4gdGV4dHVyZUNvbG9yOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglyZXR1cm4gVGV4dHVyZUVmZmVjdF9TMV9jMF9jMChfaW5wdXQpOwp9CmhhbGY0IEJsZW5kX1MxKGhhbGY0IF9zcmMsIGhhbGY0IF9kc3QpIAp7CgkvLyBCbGVuZCBtb2RlOiBNb2R1bGF0ZQoJcmV0dXJuIGJsZW5kX21vZHVsYXRlKE1hdHJpeEVmZmVjdF9TMV9jMChfc3JjKSwgX3NyYyk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBCbGVuZF9TMShvdXRwdXRDb2xvcl9TMCwgaGFsZjQoMSkpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","HUQAAAAAAAMAADAAAIOAAAH677776IZOCAAP577777777777777777YBAAAAAAAAAAACEA2X4PLOGEAAAAAAAAACAAAAAVQQAAQAAAAAQCDIBCAAAAAAAAAAAAAHIAAAAAAAIAAAAAQGIAAAAAAA":"CAAAAExTS1PUAAAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmZsYXQgb3V0IGhhbGY0IHZjb2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCXNrX1Bvc2l0aW9uID0gcG9zaXRpb24ueHkwMTsKfQoBAAAACwQAAHVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMDsKdW5pZm9ybSBoYWxmNCB1Y2lyY2xlRGF0YV9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwpoYWxmNCBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwKGhhbGY0IF9pbnB1dCwgZmxvYXQyIF9jb29yZHMpIAp7CglyZXR1cm4gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBfY29vcmRzKS4wMDByOwp9CmhhbGY0IE1hdHJpeEVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJcmV0dXJuIFRleHR1cmVFZmZlY3RfUzFfYzBfYzAoX2lucHV0LCBmbG9hdDN4Mih1bWF0cml4X1MxX2MwKSAqIF9jb29yZHMueHkxKTsKfQpoYWxmNCBDaXJjbGVCbHVyX1MxKGhhbGY0IF9pbnB1dCkgCnsKCWhhbGY0IF90bXBfMF9pbkNvbG9yID0gX2lucHV0OwoJaGFsZjIgdmVjID0gaGFsZjIoKHNrX0ZyYWdDb29yZC54eSAtIGZsb2F0Mih1Y2lyY2xlRGF0YV9TMS54eSkpICogZmxvYXQodWNpcmNsZURhdGFfUzEudykpOwoJaGFsZiBkaXN0ID0gbGVuZ3RoKHZlYykgKyAoMC41IC0gdWNpcmNsZURhdGFfUzEueikgKiB1Y2lyY2xlRGF0YV9TMS53OwoJcmV0dXJuIGhhbGY0KF9pbnB1dCAqIE1hdHJpeEVmZmVjdF9TMV9jMChfdG1wXzBfaW5Db2xvciwgZmxvYXQyKGhhbGYyKGRpc3QsIDAuNSkpKS53KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmNsZUJsdXJfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAAAQAAAAAAAAA=","BYIBQAAABQAAIAABBYAAAEIXBAAP777777777777AAAAAAAAAAAABUABAAAAAEAAAAAIBEABAAAAA":"CAAAAExTS1M+AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwpvdXQgaGFsZjQgdmNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBEZWZhdWx0R2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IGNvbG9yID0gaW5Db2xvcjsKCXZjb2xvcl9TMCA9IGNvbG9yOwoJZmxvYXQyIF90bXBfMV9pblBvc2l0aW9uID0gaW5Qb3NpdGlvbjsKCWZsb2F0MiBfdG1wXzNfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247Cglza19Qb3NpdGlvbiA9IF90bXBfMV9pblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAHgEAAGluIGhhbGY0IHZjb2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIERlZmF1bHRHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZjb2xvcl9TMDsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IAAQAAAAAAAAA=","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQA6AAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAACRAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5MCA9IHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHk7CglmbG9hdDIgZHh5MSA9IHNrX0ZyYWdDb29yZC54eSAtIHVpbm5lclJlY3RfUzEuUkI7CglmbG9hdDIgZHh5ID0gbWF4KG1heChkeHkwLCBkeHkxKSwgMC4wKTsKCWhhbGYgYWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVyYWRpdXNQbHVzSGFsZl9TMS54IC0gbGVuZ3RoKGR4eSkpKTsKCXJldHVybiBfaW5wdXQgKiBhbHBoYTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IENpcmN1bGFyUlJlY3RfUzEob3V0cHV0Q292ZXJhZ2VfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0X1MxOwoJfQp9CgAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAKAAAAaW5Qb3NpdGlvbgAABwAAAGluQ29sb3IADAAAAGluQ2lyY2xlRWRnZQEAAAAAAAAA","FAAQMYAAMAAAEADAAABAEYAAAICIAB5AABQAAAQAEDAACATAAABAGYAAAICSBYQCA4AAAAAAEAZIA62YSBDACAAAGAAAAAAAAAAABAAOAAAABAAAAAAABBAMAA":"CAAAAExTS1OxCwAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0NCByYWRpaV9zZWxlY3RvcjsKaW4gZmxvYXQ0IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHM7CmluIGZsb2F0NCBhYV9ibG9hdF9hbmRfY292ZXJhZ2U7CmluIGZsb2F0NCBza2V3OwppbiBmbG9hdDIgdHJhbnNsYXRlOwppbiBmbG9hdDQgcmFkaWlfeDsKaW4gZmxvYXQ0IHJhZGlpX3k7CmluIGhhbGY0IGNvbG9yOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmFyY2Nvb3JkX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgl2Y29sb3JfUzAgPSBjb2xvcjsKCWZsb2F0IGFhX2Jsb2F0X211bHRpcGxpZXIgPSAxOwoJZmxvYXQyIGNvcm5lciA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMueHk7CglmbG9hdDIgcmFkaXVzX291dHNldCA9IGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMuenc7CglmbG9hdDIgYWFfYmxvYXRfZGlyZWN0aW9uID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnh5OwoJZmxvYXQgaXNfbGluZWFyX2NvdmVyYWdlID0gYWFfYmxvYXRfYW5kX2NvdmVyYWdlLnc7CglmbG9hdDIgcGl4ZWxsZW5ndGggPSBpbnZlcnNlc3FydChmbG9hdDIoZG90KHNrZXcueHosIHNrZXcueHopLCBkb3Qoc2tldy55dywgc2tldy55dykpKTsKCWZsb2F0NCBub3JtYWxpemVkX2F4aXNfZGlycyA9IHNrZXcgKiBwaXhlbGxlbmd0aC54eXh5OwoJZmxvYXQyIGF4aXN3aWR0aHMgPSAoYWJzKG5vcm1hbGl6ZWRfYXhpc19kaXJzLnh5KSArIGFicyhub3JtYWxpemVkX2F4aXNfZGlycy56dykpOwoJZmxvYXQyIGFhX2Jsb2F0cmFkaXVzID0gYXhpc3dpZHRocyAqIHBpeGVsbGVuZ3RoICogLjU7CglmbG9hdDQgcmFkaWlfYW5kX25laWdoYm9ycyA9IHJhZGlpX3NlbGVjdG9yKiBmbG9hdDR4NChyYWRpaV94LCByYWRpaV95LCByYWRpaV94Lnl4d3osIHJhZGlpX3kud3p5eCk7CglmbG9hdDIgcmFkaWkgPSByYWRpaV9hbmRfbmVpZ2hib3JzLnh5OwoJZmxvYXQyIG5laWdoYm9yX3JhZGlpID0gcmFkaWlfYW5kX25laWdoYm9ycy56dzsKCWZsb2F0IGNvdmVyYWdlX211bHRpcGxpZXIgPSAxOwoJaWYgKGFueShncmVhdGVyVGhhbihhYV9ibG9hdHJhZGl1cywgZmxvYXQyKDEpKSkpIAoJewoJCWNvcm5lciA9IG1heChhYnMoY29ybmVyKSwgYWFfYmxvYXRyYWRpdXMpICogc2lnbihjb3JuZXIpOwoJCWNvdmVyYWdlX211bHRpcGxpZXIgPSAxIC8gKG1heChhYV9ibG9hdHJhZGl1cy54LCAxKSAqIG1heChhYV9ibG9hdHJhZGl1cy55LCAxKSk7CgkJcmFkaWkgPSBmbG9hdDIoMCk7Cgl9CglmbG9hdCBjb3ZlcmFnZSA9IGFhX2Jsb2F0X2FuZF9jb3ZlcmFnZS56OwoJaWYgKGFueShsZXNzVGhhbihyYWRpaSwgYWFfYmxvYXRyYWRpdXMgKiAxLjUpKSkgCgl7CgkJcmFkaWkgPSBmbG9hdDIoMCk7CgkJYWFfYmxvYXRfZGlyZWN0aW9uID0gc2lnbihjb3JuZXIpOwoJCWlmIChjb3ZlcmFnZSA+IC41KSAKCQl7CgkJCWFhX2Jsb2F0X2RpcmVjdGlvbiA9IC1hYV9ibG9hdF9kaXJlY3Rpb247CgkJfQoJCWlzX2xpbmVhcl9jb3ZlcmFnZSA9IDE7Cgl9CgllbHNlIAoJewoJCXJhZGlpID0gY2xhbXAocmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCW5laWdoYm9yX3JhZGlpID0gY2xhbXAobmVpZ2hib3JfcmFkaWksIHBpeGVsbGVuZ3RoICogMS41LCAyIC0gcGl4ZWxsZW5ndGggKiAxLjUpOwoJCWZsb2F0MiBzcGFjaW5nID0gMiAtIHJhZGlpIC0gbmVpZ2hib3JfcmFkaWk7CgkJZmxvYXQyIGV4dHJhX3BhZCA9IG1heChwaXhlbGxlbmd0aCAqIC4wNjI1IC0gc3BhY2luZywgZmxvYXQyKDApKTsKCQlyYWRpaSAtPSBleHRyYV9wYWQgKiAuNTsKCX0KCWZsb2F0MiBhYV9vdXRzZXQgPSBhYV9ibG9hdF9kaXJlY3Rpb24gKiBhYV9ibG9hdHJhZGl1cyAqIGFhX2Jsb2F0X211bHRpcGxpZXI7CglmbG9hdDIgdmVydGV4cG9zID0gY29ybmVyICsgcmFkaXVzX291dHNldCAqIHJhZGlpICsgYWFfb3V0c2V0OwoJaWYgKGNvdmVyYWdlID4gLjUpIAoJewoJCWlmIChhYV9ibG9hdF9kaXJlY3Rpb24ueCAhPSAwICYmIHZlcnRleHBvcy54ICogY29ybmVyLnggPCAwKSAKCQl7CgkJCWZsb2F0IGJhY2tzZXQgPSBhYnModmVydGV4cG9zLngpOwoJCQl2ZXJ0ZXhwb3MueCA9IDA7CgkJCXZlcnRleHBvcy55ICs9IGJhY2tzZXQgKiBzaWduKGNvcm5lci55KSAqIHBpeGVsbGVuZ3RoLnkvcGl4ZWxsZW5ndGgueDsKCQkJY292ZXJhZ2UgPSAoY292ZXJhZ2UgLSAuNSkgKiBhYnMoY29ybmVyLngpIC8gKGFicyhjb3JuZXIueCkgKyBiYWNrc2V0KSArIC41OwoJCX0KCQlpZiAoYWFfYmxvYXRfZGlyZWN0aW9uLnkgIT0gMCAmJiB2ZXJ0ZXhwb3MueSAqIGNvcm5lci55IDwgMCkgCgkJewoJCQlmbG9hdCBiYWNrc2V0ID0gYWJzKHZlcnRleHBvcy55KTsKCQkJdmVydGV4cG9zLnkgPSAwOwoJCQl2ZXJ0ZXhwb3MueCArPSBiYWNrc2V0ICogc2lnbihjb3JuZXIueCkgKiBwaXhlbGxlbmd0aC54L3BpeGVsbGVuZ3RoLnk7CgkJCWNvdmVyYWdlID0gKGNvdmVyYWdlIC0gLjUpICogYWJzKGNvcm5lci55KSAvIChhYnMoY29ybmVyLnkpICsgYmFja3NldCkgKyAuNTsKCQl9Cgl9CglmbG9hdDJ4MiBza2V3bWF0cml4ID0gZmxvYXQyeDIoc2tldy54eSwgc2tldy56dyk7CglmbG9hdDIgZGV2Y29vcmQgPSB2ZXJ0ZXhwb3MgKiBza2V3bWF0cml4ICsgdHJhbnNsYXRlOwoJaWYgKDAgIT0gaXNfbGluZWFyX2NvdmVyYWdlKSAKCXsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoMCwgY292ZXJhZ2UgKiBjb3ZlcmFnZV9tdWx0aXBsaWVyKTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQyIGFyY2Nvb3JkID0gMSAtIGFicyhyYWRpdXNfb3V0c2V0KSArIGFhX291dHNldC9yYWRpaSAqIGNvcm5lcjsKCQl2YXJjY29vcmRfUzAueHkgPSBmbG9hdDIoYXJjY29vcmQueCsxLCBhcmNjb29yZC55KTsKCX0KCXNrX1Bvc2l0aW9uID0gZGV2Y29vcmQueHkwMTsKfQoAAAABAAAAdwUAAGNvbnN0IGludCBrRmlsbEJXX1MxID0gMDsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEJXX1MxID0gMjsKY29uc3QgaW50IGtJbnZlcnNlRmlsbEFBX1MxID0gMzsKdW5pZm9ybSBmbG9hdDQgdXJlY3RVbmlmb3JtX1MxOwpmbGF0IGluIGhhbGY0IHZjb2xvcl9TMDsKaW4gZmxvYXQyIHZhcmNjb29yZF9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfdG1wXzBfaW5Db2xvciA9IF9pbnB1dDsKCWhhbGYgY292ZXJhZ2U7CglpZiAoaW50KDEpID09IGtGaWxsQldfUzEgfHwgaW50KDEpID09IGtJbnZlcnNlRmlsbEJXX1MxKSAKCXsKCQljb3ZlcmFnZSA9IGhhbGYoYWxsKGdyZWF0ZXJUaGFuKGZsb2F0NChza19GcmFnQ29vcmQueHksIHVyZWN0VW5pZm9ybV9TMS56dyksIGZsb2F0NCh1cmVjdFVuaWZvcm1fUzEueHksIHNrX0ZyYWdDb29yZC54eSkpKSA/IDEgOiAwKTsKCX0KCWVsc2UgCgl7CgkJaGFsZjQgZGlzdHM0ID0gY2xhbXAoaGFsZjQoMS4wLCAxLjAsIC0xLjAsIC0xLjApICogaGFsZjQoc2tfRnJhZ0Nvb3JkLnh5eHkgLSB1cmVjdFVuaWZvcm1fUzEpLCAwLjAsIDEuMCk7CgkJaGFsZjIgZGlzdHMyID0gKGRpc3RzNC54eSArIGRpc3RzNC56dykgLSAxLjA7CgkJY292ZXJhZ2UgPSBkaXN0czIueCAqIGRpc3RzMi55OwoJfQoJaWYgKGludCgxKSA9PSBrSW52ZXJzZUZpbGxCV19TMSB8fCBpbnQoMSkgPT0ga0ludmVyc2VGaWxsQUFfUzEpIAoJewoJCWNvdmVyYWdlID0gMS4wIC0gY292ZXJhZ2U7Cgl9CglyZXR1cm4gaGFsZjQoX2lucHV0ICogY292ZXJhZ2UpOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBGaWxsUlJlY3RPcDo6UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmNvbG9yX1MwOwoJZmxvYXQgeF9wbHVzXzE9dmFyY2Nvb3JkX1MwLngsIHk9dmFyY2Nvb3JkX1MwLnk7CgloYWxmIGNvdmVyYWdlOwoJaWYgKDAgPT0geF9wbHVzXzEpIAoJewoJCWNvdmVyYWdlID0gaGFsZih5KTsKCX0KCWVsc2UgCgl7CgkJZmxvYXQgZm4gPSB4X3BsdXNfMSAqICh4X3BsdXNfMSAtIDIpOwoJCWZuID0gZm1hKHkseSwgZm4pOwoJCWZsb2F0IGZud2lkdGggPSBmd2lkdGgoZm4pOwoJCWNvdmVyYWdlID0gLjUgLSBoYWxmKGZuL2Zud2lkdGgpOwoJCWNvdmVyYWdlID0gY2xhbXAoY292ZXJhZ2UsIDAsIDEpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChjb3ZlcmFnZSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAACAAAAA4AAAByYWRpaV9zZWxlY3RvcgAAGQAAAGNvcm5lcl9hbmRfcmFkaXVzX291dHNldHMAAAAVAAAAYWFfYmxvYXRfYW5kX2NvdmVyYWdlAAAABAAAAHNrZXcJAAAAdHJhbnNsYXRlAAAABwAAAHJhZGlpX3gABwAAAHJhZGlpX3kABQAAAGNvbG9yAAAAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQBAEAQAAAAGQCBAMQACAIAAAAAACQAGAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAAGUDAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgaW5Db29yZCA9IHZUcmFuc2Zvcm1lZENvb3Jkc18yX1MwOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkID0gY2xhbXAoc3Vic2V0Q29vcmQsIHVjbGFtcF9TMV9jMC54eSwgdWNsYW1wX1MxX2MwLnp3KTsKCWhhbGY0IHRleHR1cmVDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMSwgY2xhbXBlZENvb3JkKTsKCXJldHVybiB0ZXh0dXJlQ29sb3I7Cn0KaGFsZjQgTWF0cml4RWZmZWN0X1MxKGhhbGY0IF9pbnB1dCkgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwKF9pbnB1dCk7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJaGFsZjQgb3V0cHV0Q29sb3JfUzAgPSBoYWxmNCgxKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBNYXRyaXhFZmZlY3RfUzEob3V0cHV0Q29sb3JfUzApOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dF9TMSAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAcG9zaXRpb24KAAAAbG9jYWxDb29yZAAAAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAIAHSADQAAAQAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAABAAAAWAMAAHVuaWZvcm0gZmxvYXQ0IHVpbm5lclJlY3RfUzE7CnVuaWZvcm0gaGFsZjIgdXJhZGl1c1BsdXNIYWxmX1MxOwp1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZVNhbXBsZXJfMF9TMDsKaW4gZmxvYXQyIHZUZXh0dXJlQ29vcmRzX1MwOwpmbGF0IGluIGZsb2F0IHZUZXhJbmRleF9TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CmhhbGY0IENpcmN1bGFyUlJlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJZmxvYXQyIGR4eTAgPSB1aW5uZXJSZWN0X1MxLkxUIC0gc2tfRnJhZ0Nvb3JkLnh5OwoJZmxvYXQyIGR4eTEgPSBza19GcmFnQ29vcmQueHkgLSB1aW5uZXJSZWN0X1MxLlJCOwoJZmxvYXQyIGR4eSA9IG1heChtYXgoZHh5MCwgZHh5MSksIDAuMCk7CgloYWxmIGFscGhhID0gaGFsZihzYXR1cmF0ZSh1cmFkaXVzUGx1c0hhbGZfUzEueCAtIGxlbmd0aChkeHkpKSk7CglyZXR1cm4gX2lucHV0ICogYWxwaGE7Cn0Kdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7CgloYWxmNCBvdXRwdXRfUzE7CglvdXRwdXRfUzEgPSBDaXJjdWxhclJSZWN0X1MxKG91dHB1dENvdmVyYWdlX1MwKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dF9TMTsKCX0KfQoBAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HUIAAAAAAAQAADAAAIOAAAH677777777777QGHAQAD7P7777777777YBAAAAAAAAAAALUAQMAAAAAAIAAEAAAABJYQAAAAAQAAIAAAAAWCBACAABAAAAANAECAZAAEAAAAAAAAFAAMAAAABAAAAAAABBAM":"CAAAAExTS1M2AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKaW4gZmxvYXQyIHBvc2l0aW9uOwppbiBmbG9hdDIgbG9jYWxDb29yZDsKb3V0IGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cgl7CgkJdlRyYW5zZm9ybWVkQ29vcmRzXzJfUzAgPSBmbG9hdDN4Mih1bWF0cml4X1MxKSAqIGxvY2FsQ29vcmQueHkxOwoJfQp9CgAAAAAAADEGAAB1bmlmb3JtIGZsb2F0NCB1Y2xhbXBfUzFfYzBfYzBfYzA7CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMV9jMF9jMDsKdW5pZm9ybSBoYWxmMiB1XzBfSW5jcmVtZW50X1MxX2MwOwp1bmlmb3JtIGhhbGY0IHVfMV9LZXJuZWxfUzFfYzBbNF07CnVuaWZvcm0gaGFsZjQgdV8yX09mZnNldHNfUzFfYzBbNF07CnVuaWZvcm0gZmxvYXQzeDMgdW1hdHJpeF9TMTsKdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzE7CmluIGZsb2F0MiB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgVGV4dHVyZUVmZmVjdF9TMV9jMF9jMF9jMChoYWxmNCBfaW5wdXQsIGZsb2F0MiBfY29vcmRzKSAKewoJZmxvYXQyIGluQ29vcmQgPSBfY29vcmRzOwoJZmxvYXQyIHN1YnNldENvb3JkOwoJc3Vic2V0Q29vcmQueCA9IGluQ29vcmQueDsKCXN1YnNldENvb3JkLnkgPSBpbkNvb3JkLnk7CglmbG9hdDIgY2xhbXBlZENvb3JkOwoJY2xhbXBlZENvb3JkLnggPSBjbGFtcChzdWJzZXRDb29yZC54LCB1Y2xhbXBfUzFfYzBfYzBfYzAueCwgdWNsYW1wX1MxX2MwX2MwX2MwLnopOwoJY2xhbXBlZENvb3JkLnkgPSBzdWJzZXRDb29yZC55OwoJaGFsZjQgdGV4dHVyZUNvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MxLCBjbGFtcGVkQ29vcmQpOwoJcmV0dXJuIHRleHR1cmVDb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzFfYzBfYzAoaGFsZjQgX2lucHV0LCBmbG9hdDIgX2Nvb3JkcykgCnsKCXJldHVybiBUZXh0dXJlRWZmZWN0X1MxX2MwX2MwX2MwKF9pbnB1dCwgZmxvYXQzeDIodW1hdHJpeF9TMV9jMF9jMCkgKiBfY29vcmRzLnh5MSk7Cn0KaGFsZjQgR2F1c3NpYW5Db252b2x1dGlvbl9TMV9jMChoYWxmNCBfaW5wdXQpIAp7CgloYWxmNCBfM19jb2xvciA9IGhhbGY0KDAuMCk7CglmbG9hdDIgXzVfY29vcmQgPSB2VHJhbnNmb3JtZWRDb29yZHNfMl9TMDsKCWZvciAoaW50IF82X2kgPSAwOyAoXzZfaSA8IDEzKTsgXzZfaSsrKSAoXzNfY29sb3IgKz0gKE1hdHJpeEVmZmVjdF9TMV9jMF9jMChfaW5wdXQsIChfNV9jb29yZCArIGZsb2F0MigodV8yX09mZnNldHNfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0gKiB1XzBfSW5jcmVtZW50X1MxX2MwKSkpKSAqIHVfMV9LZXJuZWxfUzFfYzBbKF82X2kgLyA0KV1bKF82X2kgJiAzKV0pKTsKCXJldHVybiBfM19jb2xvcjsKfQpoYWxmNCBNYXRyaXhFZmZlY3RfUzEoaGFsZjQgX2lucHV0KSAKewoJcmV0dXJuIEdhdXNzaWFuQ29udm9sdXRpb25fUzFfYzAoX2lucHV0KTsKfQp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZFBlckVkZ2VBQUdlb21ldHJ5UHJvY2Vzc29yCgloYWxmNCBvdXRwdXRDb2xvcl9TMCA9IGhhbGY0KDEpOwoJY29uc3QgaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNCgxKTsKCWhhbGY0IG91dHB1dF9TMTsKCW91dHB1dF9TMSA9IE1hdHJpeEVmZmVjdF9TMShvdXRwdXRDb2xvcl9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0X1MxICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAgAAABwb3NpdGlvbgoAAABsb2NhbENvb3JkAAABAAAAAAAAAA==","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAACABYQACAAAEAAAAAAAIADQAAAAIAAAAAAAIIDA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgEAAADkAwAAdW5pZm9ybSBmbG9hdDQgdWlubmVyUmVjdF9TMTsKdW5pZm9ybSBoYWxmMiB1cmFkaXVzUGx1c0hhbGZfUzE7CmluIGZsb2F0NCB2aW5DaXJjbGVFZGdlX1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKaGFsZjQgQ2lyY3VsYXJSUmVjdF9TMShoYWxmNCBfaW5wdXQpIAp7CglmbG9hdDIgZHh5ID0gbWF4KHVpbm5lclJlY3RfUzEuTFQgLSBza19GcmFnQ29vcmQueHksIDAuMCk7CgloYWxmIHJpZ2h0QWxwaGEgPSBoYWxmKHNhdHVyYXRlKHVpbm5lclJlY3RfUzEuUiAtIHNrX0ZyYWdDb29yZC54KSk7CgloYWxmIGJvdHRvbUFscGhhID0gaGFsZihzYXR1cmF0ZSh1aW5uZXJSZWN0X1MxLkIgLSBza19GcmFnQ29vcmQueSkpOwoJaGFsZiBhbHBoYSA9IGJvdHRvbUFscGhhICogcmlnaHRBbHBoYSAqIGhhbGYoc2F0dXJhdGUodXJhZGl1c1BsdXNIYWxmX1MxLnggLSBsZW5ndGgoZHh5KSkpOwoJcmV0dXJuIF9pbnB1dCAqIGFscGhhOwp9CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJZmxvYXQ0IGNpcmNsZUVkZ2U7CgljaXJjbGVFZGdlID0gdmluQ2lyY2xlRWRnZV9TMDsKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWZsb2F0IGQgPSBsZW5ndGgoY2lyY2xlRWRnZS54eSk7CgloYWxmIGRpc3RhbmNlVG9PdXRlckVkZ2UgPSBoYWxmKGNpcmNsZUVkZ2UueiAqICgxLjAgLSBkKSk7CgloYWxmIGVkZ2VBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9PdXRlckVkZ2UpOwoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJaGFsZjQgb3V0cHV0X1MxOwoJb3V0cHV0X1MxID0gQ2lyY3VsYXJSUmVjdF9TMShvdXRwdXRDb3ZlcmFnZV9TMCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRfUzE7Cgl9Cn0KAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","DAQAAAAAAABGAABAYAAQAIHCAIAYAQUBAEAAAAAAEAAAAAAAAAAAAAB2AAAAAAACAAAAAEBSAAAAA":"CAAAAExTS1MWAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc1NpemVJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIEJpdG1hcFRleHQKCWludCB0ZXhJZHggPSAwOwoJZmxvYXQyIHVub3JtVGV4Q29vcmRzID0gZmxvYXQyKGluVGV4dHVyZUNvb3Jkcy54LCBpblRleHR1cmVDb29yZHMueSk7Cgl2VGV4dHVyZUNvb3Jkc19TMCA9IHVub3JtVGV4Q29vcmRzICogdUF0bGFzU2l6ZUludl9TMDsKCXZUZXhJbmRleF9TMCA9IGZsb2F0KHRleElkeCk7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBpblBvc2l0aW9uLnh5MDE7Cn0KAAAAAAAAyQEAAHVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlU2FtcGxlcl8wX1MwOwppbiBmbG9hdDIgdlRleHR1cmVDb29yZHNfUzA7CmZsYXQgaW4gZmxvYXQgdlRleEluZGV4X1MwOwppbiBoYWxmNCB2aW5Db2xvcl9TMDsKb3V0IGhhbGY0IHNrX0ZyYWdDb2xvcjsKdm9pZCBtYWluKCkgCnsKCS8vIFN0YWdlIDAsIEJpdG1hcFRleHQKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGY0IHRleENvbG9yOwoJewoJCXRleENvbG9yID0gc2FtcGxlKHVUZXh0dXJlU2FtcGxlcl8wX1MwLCB2VGV4dHVyZUNvb3Jkc19TMCkucnJycjsKCX0KCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gdGV4Q29sb3I7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACgAAAGluUG9zaXRpb24AAAcAAABpbkNvbG9yAA8AAABpblRleHR1cmVDb29yZHMAAQAAAAAAAAA=","HTQAAGAABBYAAAEIXBAAAGEAMAAAAAAAAAAAAAAAQAHAAAAAQAAAAAAAQQGAAAAA":"CAAAAExTS1M/AQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiBmbG9hdDQgaW5RdWFkRWRnZTsKb3V0IGZsb2F0NCB2UXVhZEVkZ2VfUzA7Cm91dCBoYWxmNCB2aW5Db2xvcl9TMDsKdm9pZCBtYWluKCkgCnsKCS8vIFByaW1pdGl2ZSBQcm9jZXNzb3IgUXVhZEVkZ2UKCXZRdWFkRWRnZV9TMCA9IGluUXVhZEVkZ2U7Cgl2aW5Db2xvcl9TMCA9IGluQ29sb3I7CglmbG9hdDIgX3RtcF8wX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgABAAAAHQMAAGluIGZsb2F0NCB2UXVhZEVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgUXVhZEVkZ2UKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2aW5Db2xvcl9TMDsKCWhhbGYgZWRnZUFscGhhOwoJaGFsZjIgZHV2ZHggPSBoYWxmMihkRmR4KHZRdWFkRWRnZV9TMC54eSkpOwoJaGFsZjIgZHV2ZHkgPSBoYWxmMihkRmR5KHZRdWFkRWRnZV9TMC54eSkpOwoJaWYgKHZRdWFkRWRnZV9TMC56ID4gMC4wICYmIHZRdWFkRWRnZV9TMC53ID4gMC4wKSAKCXsKCQllZGdlQWxwaGEgPSBoYWxmKG1pbihtaW4odlF1YWRFZGdlX1MwLnosIHZRdWFkRWRnZV9TMC53KSArIDAuNSwgMS4wKSk7Cgl9CgllbHNlIAoJewoJCWhhbGYyIGdGID0gaGFsZjIoaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHgueCAtIGR1dmR4LnkpLCAgICAgICAgICAgICAgICAgaGFsZigyLjAqdlF1YWRFZGdlX1MwLngqZHV2ZHkueCAtIGR1dmR5LnkpKTsKCQllZGdlQWxwaGEgPSBoYWxmKHZRdWFkRWRnZV9TMC54KnZRdWFkRWRnZV9TMC54IC0gdlF1YWRFZGdlX1MwLnkpOwoJCWVkZ2VBbHBoYSA9IHNhdHVyYXRlKDAuNSAtIGVkZ2VBbHBoYSAvIGxlbmd0aChnRikpOwoJfQoJaGFsZjQgb3V0cHV0Q292ZXJhZ2VfUzAgPSBoYWxmNChlZGdlQWxwaGEpOwoJewoJCS8vIFhmZXIgUHJvY2Vzc29yOiBQb3J0ZXIgRHVmZgoJCXNrX0ZyYWdDb2xvciA9IG91dHB1dENvbG9yX1MwICogb3V0cHV0Q292ZXJhZ2VfUzA7Cgl9Cn0KAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAKAAAAaW5RdWFkRWRnZQAAAQAAAAAAAAA=","HVJAAAAAABIAAGAAAQ4AAAH477776R24EAAAIOBQAD6P7777777777YDAAAAABAAAAAABBAMABAAOAAAABAAAAAAABBAMAAA":"CAAAAExTS1MjAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CmluIGZsb2F0MiBwb3NpdGlvbjsKaW4gaGFsZjQgY29sb3I7CmluIGZsb2F0MiBsb2NhbENvb3JkOwpmbGF0IG91dCBoYWxmNCB2Y29sb3JfUzA7Cm91dCBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIFF1YWRQZXJFZGdlQUFHZW9tZXRyeVByb2Nlc3NvcgoJdmNvbG9yX1MwID0gY29sb3I7Cgl2bG9jYWxDb29yZF9TMCA9IGxvY2FsQ29vcmQ7Cglza19Qb3NpdGlvbiA9IHBvc2l0aW9uLnh5MDE7Cn0KAAAAAADoAQAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmZsYXQgaW4gaGFsZjQgdmNvbG9yX1MwOwppbiBmbG9hdDIgdmxvY2FsQ29vcmRfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBRdWFkUGVyRWRnZUFBR2VvbWV0cnlQcm9jZXNzb3IKCWhhbGY0IG91dHB1dENvbG9yX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSB2Y29sb3JfUzA7CglmbG9hdDIgdGV4Q29vcmQ7Cgl0ZXhDb29yZCA9IHZsb2NhbENvb3JkX1MwOwoJb3V0cHV0Q29sb3JfUzAgPSAoKHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdGV4Q29vcmQpICogb3V0cHV0Q29sb3JfUzApKTsKCWNvbnN0IGhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoMSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAACAAAAHBvc2l0aW9uBQAAAGNvbG9yAAAACgAAAGxvY2FsQ29vcmQAAAEAAAAAAAAA","AYQA5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAACAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGY0IG91dHB1dENvdmVyYWdlX1MwID0gaGFsZjQoZWRnZUFscGhhKTsKCXsKCQkvLyBYZmVyIFByb2Nlc3NvcjogUG9ydGVyIER1ZmYKCQlza19GcmFnQ29sb3IgPSBvdXRwdXRDb2xvcl9TMCAqIG91dHB1dENvdmVyYWdlX1MwOwoJfQp9CgAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","AYQQ5AADQAAAOAEARAFQJAABBADIB7777777777777777777777767YAAAAAAAAAAAAOQAAAAAAAQAAAABAMQAAAAA":"CAAAAExTS1PMAQAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQ0IHVsb2NhbE1hdHJpeF9TMDsKaW4gZmxvYXQyIGluUG9zaXRpb247CmluIGhhbGY0IGluQ29sb3I7CmluIGZsb2F0NCBpbkNpcmNsZUVkZ2U7Cm91dCBmbG9hdDQgdmluQ2lyY2xlRWRnZV9TMDsKb3V0IGhhbGY0IHZpbkNvbG9yX1MwOwp2b2lkIG1haW4oKSAKewoJLy8gUHJpbWl0aXZlIFByb2Nlc3NvciBDaXJjbGVHZW9tZXRyeVByb2Nlc3NvcgoJdmluQ2lyY2xlRWRnZV9TMCA9IGluQ2lyY2xlRWRnZTsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8xX2luUG9zaXRpb24gPSB1bG9jYWxNYXRyaXhfUzAueHogKiBpblBvc2l0aW9uICsgdWxvY2FsTWF0cml4X1MwLnl3OwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAACTAgAAaW4gZmxvYXQ0IHZpbkNpcmNsZUVkZ2VfUzA7CmluIGhhbGY0IHZpbkNvbG9yX1MwOwpvdXQgaGFsZjQgc2tfRnJhZ0NvbG9yOwp2b2lkIG1haW4oKSAKewoJLy8gU3RhZ2UgMCwgQ2lyY2xlR2VvbWV0cnlQcm9jZXNzb3IKCWZsb2F0NCBjaXJjbGVFZGdlOwoJY2lyY2xlRWRnZSA9IHZpbkNpcmNsZUVkZ2VfUzA7CgloYWxmNCBvdXRwdXRDb2xvcl9TMDsKCW91dHB1dENvbG9yX1MwID0gdmluQ29sb3JfUzA7CglmbG9hdCBkID0gbGVuZ3RoKGNpcmNsZUVkZ2UueHkpOwoJaGFsZiBkaXN0YW5jZVRvT3V0ZXJFZGdlID0gaGFsZihjaXJjbGVFZGdlLnogKiAoMS4wIC0gZCkpOwoJaGFsZiBlZGdlQWxwaGEgPSBzYXR1cmF0ZShkaXN0YW5jZVRvT3V0ZXJFZGdlKTsKCWhhbGYgZGlzdGFuY2VUb0lubmVyRWRnZSA9IGhhbGYoY2lyY2xlRWRnZS56ICogKGQgLSBjaXJjbGVFZGdlLncpKTsKCWhhbGYgaW5uZXJBbHBoYSA9IHNhdHVyYXRlKGRpc3RhbmNlVG9Jbm5lckVkZ2UpOwoJZWRnZUFscGhhICo9IGlubmVyQWxwaGE7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KGVkZ2VBbHBoYSk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAMAAAAaW5DaXJjbGVFZGdlAQAAAAAAAAA=","EABQAAAAAEAAAAAQAABQAAIOAAABCFYIAAKAUDAAAAAAAAABAAAAAAAAAAANAAIAAAABAAAAACAJAAIAAAAA":"CAAAAExTS1OhAgAAdW5pZm9ybSBmbG9hdDQgc2tfUlRBZGp1c3Q7CnVuaWZvcm0gZmxvYXQyIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7CmluIGZsb2F0MiBpblBvc2l0aW9uOwppbiBoYWxmNCBpbkNvbG9yOwppbiB1c2hvcnQyIGluVGV4dHVyZUNvb3JkczsKb3V0IGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBvdXQgZmxvYXQgdlRleEluZGV4X1MwOwpvdXQgZmxvYXQyIHZJbnRUZXh0dXJlQ29vcmRzX1MwOwpvdXQgaGFsZjQgdmluQ29sb3JfUzA7CnZvaWQgbWFpbigpIAp7CgkvLyBQcmltaXRpdmUgUHJvY2Vzc29yIERpc3RhbmNlRmllbGRQYXRoCglpbnQgdGV4SWR4ID0gMDsKCWZsb2F0MiB1bm9ybVRleENvb3JkcyA9IGZsb2F0MihpblRleHR1cmVDb29yZHMueCwgaW5UZXh0dXJlQ29vcmRzLnkpOwoJdlRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkcyAqIHVBdGxhc0RpbWVuc2lvbnNJbnZfUzA7Cgl2VGV4SW5kZXhfUzAgPSBmbG9hdCh0ZXhJZHgpOwoJdkludFRleHR1cmVDb29yZHNfUzAgPSB1bm9ybVRleENvb3JkczsKCXZpbkNvbG9yX1MwID0gaW5Db2xvcjsKCWZsb2F0MiBfdG1wXzBfaW5Qb3NpdGlvbiA9IGluUG9zaXRpb247CglmbG9hdDIgX3RtcF8yX2luUG9zaXRpb24gPSBpblBvc2l0aW9uOwoJc2tfUG9zaXRpb24gPSBfdG1wXzBfaW5Qb3NpdGlvbi54eTAxOwp9CgAAAAAAAAC3AgAAdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmVTYW1wbGVyXzBfUzA7CmluIGZsb2F0MiB2VGV4dHVyZUNvb3Jkc19TMDsKZmxhdCBpbiBmbG9hdCB2VGV4SW5kZXhfUzA7CmluIGZsb2F0MiB2SW50VGV4dHVyZUNvb3Jkc19TMDsKaW4gaGFsZjQgdmluQ29sb3JfUzA7Cm91dCBoYWxmNCBza19GcmFnQ29sb3I7CnZvaWQgbWFpbigpIAp7CgkvLyBTdGFnZSAwLCBEaXN0YW5jZUZpZWxkUGF0aAoJaGFsZjQgb3V0cHV0Q29sb3JfUzA7CglvdXRwdXRDb2xvcl9TMCA9IHZpbkNvbG9yX1MwOwoJZmxvYXQyIHV2ID0gdlRleHR1cmVDb29yZHNfUzA7CgloYWxmNCB0ZXhDb2xvcjsKCXsKCQl0ZXhDb2xvciA9IHNhbXBsZSh1VGV4dHVyZVNhbXBsZXJfMF9TMCwgdXYpLnJycnI7Cgl9CgloYWxmIGRpc3RhbmNlID0gNy45Njg3NSoodGV4Q29sb3IuciAtIDAuNTAxOTYwNzg0MzEpOwoJaGFsZiBhZndpZHRoOwoJYWZ3aWR0aCA9IGFicygwLjY1KmhhbGYoZEZkeCh2SW50VGV4dHVyZUNvb3Jkc19TMC54KSkpOwoJaGFsZiB2YWwgPSBzbW9vdGhzdGVwKC1hZndpZHRoLCBhZndpZHRoLCBkaXN0YW5jZSk7CgloYWxmNCBvdXRwdXRDb3ZlcmFnZV9TMCA9IGhhbGY0KHZhbCk7Cgl7CgkJLy8gWGZlciBQcm9jZXNzb3I6IFBvcnRlciBEdWZmCgkJc2tfRnJhZ0NvbG9yID0gb3V0cHV0Q29sb3JfUzAgKiBvdXRwdXRDb3ZlcmFnZV9TMDsKCX0KfQoAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAoAAABpblBvc2l0aW9uAAAHAAAAaW5Db2xvcgAPAAAAaW5UZXh0dXJlQ29vcmRzAAEAAAAAAAAA"}} \ No newline at end of file diff --git a/test/model/collection_source_test.dart b/test/model/collection_source_test.dart index 25b8f8a93..584ca3b81 100644 --- a/test/model/collection_source_test.dart +++ b/test/model/collection_source_test.dart @@ -2,15 +2,13 @@ import 'dart:async'; import 'package:aves/model/availability.dart'; import 'package:aves/model/covers.dart'; +import 'package:aves/model/db/db_metadata.dart'; import 'package:aves/model/favourites.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; -import 'package:aves/model/db/db_metadata.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/model/settings/store/store.dart'; -import 'package:aves/model/settings/store/store_shared_pref.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/model/source/media_store_source.dart'; import 'package:aves/services/android_app_service.dart'; @@ -56,7 +54,6 @@ void main() { getIt.registerLazySingleton(() => p.Context(style: p.Style.posix)); getIt.registerLazySingleton(FakeAvesAvailability.new); getIt.registerLazySingleton(FakeMetadataDb.new); - getIt.registerLazySingleton(SharedPrefSettingsStore.new); getIt.registerLazySingleton(FakeAndroidAppService.new); getIt.registerLazySingleton(FakeDeviceService.new); From 6d1c0e6b2cab2073c934d684088f2992f1d75e7b Mon Sep 17 00:00:00 2001 From: n-berenice <82068197+n-berenice@users.noreply.github.com> Date: Sat, 12 Feb 2022 20:27:49 -0300 Subject: [PATCH 17/39] Added missing strings. (#182) * missing string #380 * added missing string #379 * Update app_es.arb * Update app_es.arb --- lib/l10n/app_es.arb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 61e2f6c05..3490ddf47 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -46,6 +46,7 @@ "entryActionCopyToClipboard": "Copiar al portapapeles", "entryActionDelete": "Borrar", + "entryActionConvert": "Convertir", "entryActionExport": "Exportar", "entryActionRename": "Renombrar", "entryActionRotateCCW": "Rotar en sentido antihorario", @@ -73,6 +74,7 @@ "videoActionSettings": "Ajustes", "entryInfoActionEditDate": "Editar fecha y hora", + "entryInfoActionEditLocation": "Editar ubicación", "entryInfoActionEditRating": "Editar clasificación", "entryInfoActionEditTags": "Editar etiquetas", "entryInfoActionRemoveMetadata": "Eliminar metadatos", @@ -180,6 +182,8 @@ "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?}}", "exportEntryDialogFormat": "Formato:", + "exportEntryDialogWidth": "Anchura", + "exportEntryDialogHeight": "Altura", "renameEntryDialogLabel": "Renombrar", @@ -193,6 +197,13 @@ "editEntryDateDialogHours": "Horas", "editEntryDateDialogMinutes": "Minutos", + "editEntryLocationDialogTitle": "Ubicación", + "editEntryLocationDialogChooseOnMapTooltip": "Elegir en el mapa", + "editEntryLocationDialogLatitude": "Latitud", + "editEntryLocationDialogLongitude": "Longitud", + + "locationPickerUseThisLocationButton": "Usar esta ubicación", + "editEntryRatingDialogTitle": "Clasificación", "removeEntryMetadataDialogTitle": "Eliminación de metadatos", From 0d9e0ca787af884a6f4805b03a891807b1937556 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 18 Feb 2022 09:51:26 +0900 Subject: [PATCH 18/39] #12 bin; entry id v content id --- .../deckers/thibault/aves/AnalysisService.kt | 6 +- .../aves/channel/calls/AnalysisHandler.kt | 4 +- .../aves/channel/calls/DebugHandler.kt | 3 + .../aves/channel/calls/MediaStoreHandler.kt | 15 +- .../aves/channel/calls/StorageHandler.kt | 18 +- .../channel/streams/ImageByteStreamHandler.kt | 7 +- .../channel/streams/ImageOpStreamHandler.kt | 53 ++-- .../streams/MediaStoreStreamHandler.kt | 10 +- .../streams/StorageAccessStreamHandler.kt | 13 +- .../deckers/thibault/aves/model/AvesEntry.kt | 2 + .../aves/model/provider/FileImageProvider.kt | 17 ++ .../aves/model/provider/ImageProvider.kt | 5 +- .../model/provider/MediaStoreImageProvider.kt | 160 +++++++---- .../thibault/aves/utils/PermissionManager.kt | 8 +- .../thibault/aves/utils/StorageUtils.kt | 33 ++- lib/l10n/app_en.arb | 18 ++ lib/model/actions/entry_actions.dart | 20 +- lib/model/actions/entry_info_actions.dart | 20 +- lib/model/actions/entry_set_actions.dart | 20 ++ lib/model/actions/move_type.dart | 2 +- lib/model/covers.dart | 54 ++-- lib/model/db/db_metadata.dart | 31 +- lib/model/db/db_metadata_sqflite.dart | 266 +++++++++--------- lib/model/db/db_metadata_sqflite_upgrade.dart | 140 +++++++++ lib/model/entry.dart | 72 +++-- lib/model/favourites.dart | 42 +-- lib/model/filters/filters.dart | 4 + lib/model/filters/query.dart | 2 +- lib/model/filters/trash.dart | 38 +++ lib/model/metadata/address.dart | 14 +- lib/model/metadata/catalog.dart | 15 +- lib/model/metadata/trash.dart | 42 +++ lib/model/multipage.dart | 8 +- lib/model/settings/defaults.dart | 3 + lib/model/settings/settings.dart | 9 + .../settings/store/store_shared_pref.dart | 7 +- lib/model/source/analysis_controller.dart | 4 +- lib/model/source/collection_lens.dart | 18 +- lib/model/source/collection_source.dart | 178 ++++++++---- lib/model/source/location.dart | 6 +- lib/model/source/media_store_source.dart | 65 +++-- lib/model/source/tag.dart | 2 +- lib/model/source/trash.dart | 34 +++ lib/model/video/metadata.dart | 2 +- lib/model/video_playback.dart | 10 +- lib/services/analysis_service.dart | 12 +- lib/services/media/media_file_service.dart | 11 +- lib/services/media/media_store_service.dart | 12 +- .../metadata/metadata_fetch_service.dart | 2 +- lib/theme/icons.dart | 7 +- lib/utils/android_file_utils.dart | 2 + lib/widgets/aves_app.dart | 3 +- lib/widgets/collection/app_bar.dart | 27 +- lib/widgets/collection/collection_grid.dart | 8 +- lib/widgets/collection/collection_page.dart | 22 +- .../collection/entry_set_action_delegate.dart | 150 +++++----- lib/widgets/collection/grid/tile.dart | 4 +- .../common/action_mixins/entry_storage.dart | 155 ++++++---- .../common/action_mixins/size_aware.dart | 4 + lib/widgets/common/grid/theme.dart | 7 +- lib/widgets/common/identity/aves_icons.dart | 26 ++ lib/widgets/common/identity/empty.dart | 10 +- lib/widgets/common/thumbnail/decorated.dart | 5 +- lib/widgets/common/thumbnail/error.dart | 13 +- lib/widgets/common/thumbnail/overlay.dart | 1 + lib/widgets/common/thumbnail/scroller.dart | 1 + lib/widgets/debug/database.dart | 28 +- lib/widgets/dialogs/add_shortcut_dialog.dart | 2 +- lib/widgets/drawer/app_drawer.dart | 41 ++- lib/widgets/drawer/collection_nav_tile.dart | 7 + lib/widgets/drawer/page_nav_tile.dart | 24 +- lib/widgets/filter_grids/album_pick.dart | 8 +- .../common/action_delegates/album_set.dart | 29 +- .../common/action_delegates/chip_set.dart | 6 +- lib/widgets/map/map_page.dart | 2 +- lib/widgets/settings/privacy/privacy.dart | 14 + .../viewer/action/entry_action_delegate.dart | 28 +- .../action/entry_info_action_delegate.dart | 22 ++ lib/widgets/viewer/debug/db.dart | 38 ++- lib/widgets/viewer/debug/debug_page.dart | 4 +- lib/widgets/viewer/entry_viewer_stack.dart | 2 +- lib/widgets/viewer/info/basic_section.dart | 4 +- lib/widgets/viewer/info/info_app_bar.dart | 9 +- lib/widgets/viewer/overlay/bottom/common.dart | 2 +- lib/widgets/viewer/overlay/bottom/video.dart | 11 +- lib/widgets/viewer/overlay/top.dart | 166 ++++++----- lib/widgets/viewer/video/controller.dart | 16 +- .../viewer/visual/entry_page_view.dart | 2 +- lib/widgets/viewer/visual/error.dart | 1 + lib/widgets/viewer/visual/raster.dart | 1 + lib/widgets/viewer/visual/vector.dart | 1 + pubspec.lock | 4 +- pubspec.yaml | 2 + test/fake/media_file_service.dart | 2 +- test/fake/media_store_service.dart | 20 +- test/fake/metadata_db.dart | 38 ++- test/model/collection_source_test.dart | 46 +-- untranslated.json | 61 +++- 98 files changed, 1765 insertions(+), 858 deletions(-) create mode 100644 lib/model/filters/trash.dart create mode 100644 lib/model/metadata/trash.dart create mode 100644 lib/model/source/trash.dart diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisService.kt b/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisService.kt index 409f361bd..01752c888 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisService.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/AnalysisService.kt @@ -159,10 +159,10 @@ class AnalysisService : MethodChannel.MethodCallHandler, Service() { COMMAND_START -> { runBlocking { FlutterUtils.runOnUiThread { - val contentIds = data.get(KEY_CONTENT_IDS)?.takeIf { it is IntArray }?.let { (it as IntArray).toList() } + val entryIds = data.get(KEY_ENTRY_IDS)?.takeIf { it is IntArray }?.let { (it as IntArray).toList() } backgroundChannel?.invokeMethod( "start", hashMapOf( - "contentIds" to contentIds, + "entryIds" to entryIds, "force" to data.getBoolean(KEY_FORCE), ) ) @@ -197,7 +197,7 @@ class AnalysisService : MethodChannel.MethodCallHandler, Service() { const val KEY_COMMAND = "command" const val COMMAND_START = "start" const val COMMAND_STOP = "stop" - const val KEY_CONTENT_IDS = "content_ids" + const val KEY_ENTRY_IDS = "entry_ids" const val KEY_FORCE = "force" } } 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 b0d144906..b32eda29b 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 @@ -52,12 +52,12 @@ class AnalysisHandler(private val activity: Activity, private val onAnalysisComp } // can be null or empty - val contentIds = call.argument>("contentIds") + val entryIds = call.argument>("entryIds") if (!activity.isMyServiceRunning(AnalysisService::class.java)) { val intent = Intent(activity, AnalysisService::class.java) intent.putExtra(AnalysisService.KEY_COMMAND, AnalysisService.COMMAND_START) - intent.putExtra(AnalysisService.KEY_CONTENT_IDS, contentIds?.toIntArray()) + intent.putExtra(AnalysisService.KEY_ENTRY_IDS, entryIds?.toIntArray()) intent.putExtra(AnalysisService.KEY_FORCE, force) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { activity.startForegroundService(intent) 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 29f30d522..03a492a12 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 @@ -69,6 +69,7 @@ class DebugHandler(private val context: Context) : MethodCallHandler { "filesDir" to context.filesDir, "obbDir" to context.obbDir, "externalCacheDir" to context.externalCacheDir, + "externalFilesDir" to context.getExternalFilesDir(null), ).apply { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { putAll( @@ -82,6 +83,8 @@ class DebugHandler(private val context: Context) : MethodCallHandler { put("dataDir", context.dataDir) } }.mapValues { it.value?.path }.toMutableMap() + dirs["externalCacheDirs"] = context.externalCacheDirs.joinToString { it.path } + dirs["externalFilesDirs"] = context.getExternalFilesDirs(null).joinToString { it.path } // used by flutter plugin `path_provider` dirs.putAll( diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt index b20b6b802..a8761be8f 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaStoreHandler.kt @@ -8,22 +8,25 @@ import deckers.thibault.aves.model.provider.MediaStoreImageProvider import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch class MediaStoreHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { - "checkObsoleteContentIds" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::checkObsoleteContentIds) } - "checkObsoletePaths" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::checkObsoletePaths) } - "scanFile" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::scanFile) } + "checkObsoleteContentIds" -> ioScope.launch { safe(call, result, ::checkObsoleteContentIds) } + "checkObsoletePaths" -> ioScope.launch { safe(call, result, ::checkObsoletePaths) } + "scanFile" -> ioScope.launch { safe(call, result, ::scanFile) } else -> result.notImplemented() } } private fun checkObsoleteContentIds(call: MethodCall, result: MethodChannel.Result) { - val knownContentIds = call.argument>("knownContentIds") + val knownContentIds = call.argument>("knownContentIds") if (knownContentIds == null) { result.error("checkObsoleteContentIds-args", "failed because of missing arguments", null) return @@ -32,7 +35,7 @@ class MediaStoreHandler(private val context: Context) : MethodCallHandler { } private fun checkObsoletePaths(call: MethodCall, result: MethodChannel.Result) { - val knownPathById = call.argument>("knownPathById") + val knownPathById = call.argument>("knownPathById") if (knownPathById == null) { result.error("checkObsoletePaths-args", "failed because of missing arguments", null) return diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt index c8bb7a1db..9fc6adbc6 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/StorageHandler.kt @@ -13,22 +13,24 @@ import deckers.thibault.aves.utils.StorageUtils.getVolumePaths import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch import java.io.File -import java.util.* class StorageHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { - "getStorageVolumes" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getStorageVolumes) } - "getFreeSpace" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getFreeSpace) } - "getGrantedDirectories" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getGrantedDirectories) } - "getInaccessibleDirectories" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getInaccessibleDirectories) } - "getRestrictedDirectories" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getRestrictedDirectories) } + "getStorageVolumes" -> ioScope.launch { safe(call, result, ::getStorageVolumes) } + "getFreeSpace" -> ioScope.launch { safe(call, result, ::getFreeSpace) } + "getGrantedDirectories" -> ioScope.launch { safe(call, result, ::getGrantedDirectories) } + "getInaccessibleDirectories" -> ioScope.launch { safe(call, result, ::getInaccessibleDirectories) } + "getRestrictedDirectories" -> ioScope.launch { safe(call, result, ::getRestrictedDirectories) } "revokeDirectoryAccess" -> safe(call, result, ::revokeDirectoryAccess) - "deleteEmptyDirectories" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::deleteEmptyDirectories) } + "deleteEmptyDirectories" -> ioScope.launch { safe(call, result, ::deleteEmptyDirectories) } "canRequestMediaFileBulkAccess" -> safe(call, result, ::canRequestMediaFileBulkAccess) "canInsertMedia" -> safe(call, result, ::canInsertMedia) else -> result.notImplemented() 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 be9b244e6..7e58f4ed0 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 @@ -23,12 +23,11 @@ import deckers.thibault.aves.utils.MimeTypes.needRotationAfterGlide import deckers.thibault.aves.utils.StorageUtils import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.EventChannel.EventSink -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import java.io.InputStream class ImageByteStreamHandler(private val context: Context, private val arguments: Any?) : EventChannel.StreamHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private lateinit var eventSink: EventSink private lateinit var handler: Handler @@ -36,7 +35,7 @@ class ImageByteStreamHandler(private val context: Context, private val arguments this.eventSink = eventSink handler = Handler(Looper.getMainLooper()) - GlobalScope.launch(Dispatchers.IO) { streamImage() } + ioScope.launch { streamImage() } } override fun onCancel(o: Any) {} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageOpStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageOpStreamHandler.kt index a574fb74b..6d8b1a176 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageOpStreamHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageOpStreamHandler.kt @@ -11,16 +11,19 @@ import deckers.thibault.aves.model.FieldMap import deckers.thibault.aves.model.NameConflictStrategy import deckers.thibault.aves.model.provider.ImageProvider.ImageOpCallback import deckers.thibault.aves.model.provider.ImageProviderFactory.getProvider +import deckers.thibault.aves.model.provider.MediaStoreImageProvider import deckers.thibault.aves.utils.LogUtils import deckers.thibault.aves.utils.StorageUtils import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.EventChannel.EventSink +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch -import java.util.* +import java.io.File class ImageOpStreamHandler(private val activity: Activity, private val arguments: Any?) : EventChannel.StreamHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private lateinit var eventSink: EventSink private lateinit var handler: Handler @@ -45,10 +48,10 @@ class ImageOpStreamHandler(private val activity: Activity, private val arguments handler = Handler(Looper.getMainLooper()) when (op) { - "delete" -> GlobalScope.launch(Dispatchers.IO) { delete() } - "export" -> GlobalScope.launch(Dispatchers.IO) { export() } - "move" -> GlobalScope.launch(Dispatchers.IO) { move() } - "rename" -> GlobalScope.launch(Dispatchers.IO) { rename() } + "delete" -> ioScope.launch { delete() } + "export" -> ioScope.launch { export() } + "move" -> ioScope.launch { move() } + "rename" -> ioScope.launch { rename() } else -> endOfStream() } } @@ -103,12 +106,16 @@ class ImageOpStreamHandler(private val activity: Activity, private val arguments val entries = entryMapList.map(::AvesEntry) for (entry in entries) { - val uri = entry.uri - val path = entry.path val mimeType = entry.mimeType + val trashed = entry.trashed + + val uri = if (trashed) Uri.fromFile(File(entry.trashPath!!)) else entry.uri + val path = if (trashed) entry.trashPath else entry.path val result: FieldMap = hashMapOf( - "uri" to uri.toString(), + // `uri` should reference original content URI, + // so it is different with `sourceUri` when deleting trashed entries + "uri" to entry.uri.toString(), ) if (isCancelledOp()) { result["skipped"] = true @@ -160,30 +167,34 @@ class ImageOpStreamHandler(private val activity: Activity, private val arguments } private suspend fun move() { - if (arguments !is Map<*, *> || entryMapList.isEmpty()) { + if (arguments !is Map<*, *>) { endOfStream() return } val copy = arguments["copy"] as Boolean? - var destinationDir = arguments["destinationPath"] as String? val nameConflictStrategy = NameConflictStrategy.get(arguments["nameConflictStrategy"] as String?) - if (copy == null || destinationDir == null || nameConflictStrategy == null) { + val rawEntryMap = arguments["entriesByDestination"] as Map<*, *>? + if (copy == null || nameConflictStrategy == null || rawEntryMap == null || rawEntryMap.isEmpty()) { error("move-args", "failed because of missing arguments", null) return } - // assume same provider for all entries - val firstEntry = entryMapList.first() - val provider = (firstEntry["uri"] as String?)?.let { Uri.parse(it) }?.let { getProvider(it) } - if (provider == null) { - error("move-provider", "failed to find provider for entry=$firstEntry", null) - return + val entriesByTargetDir = HashMap>() + rawEntryMap.forEach { + var destinationDir = it.key as String + if (destinationDir != StorageUtils.TRASH_PATH_PLACEHOLDER) { + destinationDir = StorageUtils.ensureTrailingSeparator(destinationDir) + } + @Suppress("unchecked_cast") + val rawEntries = it.value as List + entriesByTargetDir[destinationDir] = rawEntries.map(::AvesEntry) } - destinationDir = StorageUtils.ensureTrailingSeparator(destinationDir) - val entries = entryMapList.map(::AvesEntry) - provider.moveMultiple(activity, copy, destinationDir, nameConflictStrategy, entries, ::isCancelledOp, object : ImageOpCallback { + // always use Media Store (as we move from or to it) + val provider = MediaStoreImageProvider() + + provider.moveMultiple(activity, copy, nameConflictStrategy, entriesByTargetDir, ::isCancelledOp, object : ImageOpCallback { override fun onSuccess(fields: FieldMap) = success(fields) override fun onFailure(throwable: Throwable) = error("move-failure", "failed to move entries", throwable) }) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/MediaStoreStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/MediaStoreStreamHandler.kt index f90e5971b..8edd93670 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/MediaStoreStreamHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/MediaStoreStreamHandler.kt @@ -9,20 +9,22 @@ import deckers.thibault.aves.model.provider.MediaStoreImageProvider import deckers.thibault.aves.utils.LogUtils import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.EventChannel.EventSink +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch class MediaStoreStreamHandler(private val context: Context, arguments: Any?) : EventChannel.StreamHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private lateinit var eventSink: EventSink private lateinit var handler: Handler - private var knownEntries: Map? = null + private var knownEntries: Map? = null init { if (arguments is Map<*, *>) { @Suppress("unchecked_cast") - knownEntries = arguments["knownEntries"] as Map? + knownEntries = arguments["knownEntries"] as Map? } } @@ -30,7 +32,7 @@ class MediaStoreStreamHandler(private val context: Context, arguments: Any?) : E this.eventSink = eventSink handler = Handler(Looper.getMainLooper()) - GlobalScope.launch(Dispatchers.IO) { fetchAll() } + ioScope.launch { fetchAll() } } override fun onCancel(arguments: Any?) {} diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt index 6d134fae4..083f7b926 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt @@ -15,14 +15,13 @@ import deckers.thibault.aves.utils.MimeTypes import deckers.thibault.aves.utils.PermissionManager import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.EventChannel.EventSink -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import java.io.FileOutputStream // starting activity to give access with the native dialog // breaks the regular `MethodChannel` so we use a stream channel instead class StorageAccessStreamHandler(private val activity: Activity, arguments: Any?) : EventChannel.StreamHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private lateinit var eventSink: EventSink private lateinit var handler: Handler @@ -41,10 +40,10 @@ class StorageAccessStreamHandler(private val activity: Activity, arguments: Any? handler = Handler(Looper.getMainLooper()) when (op) { - "requestDirectoryAccess" -> GlobalScope.launch(Dispatchers.IO) { requestDirectoryAccess() } - "requestMediaFileAccess" -> GlobalScope.launch(Dispatchers.IO) { requestMediaFileAccess() } - "createFile" -> GlobalScope.launch(Dispatchers.IO) { createFile() } - "openFile" -> GlobalScope.launch(Dispatchers.IO) { openFile() } + "requestDirectoryAccess" -> ioScope.launch { requestDirectoryAccess() } + "requestMediaFileAccess" -> ioScope.launch { requestMediaFileAccess() } + "createFile" -> ioScope.launch { createFile() } + "openFile" -> ioScope.launch { openFile() } else -> endOfStream() } } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt index ab6f58ce9..54aded97e 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/AvesEntry.kt @@ -11,4 +11,6 @@ class AvesEntry(map: FieldMap) { val height = map["height"] as Int val rotationDegrees = map["rotationDegrees"] as Int val isFlipped = map["isFlipped"] as Boolean + val trashed = map["trashed"] as Boolean + val trashPath = map["trashPath"] as String? } \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt index eb0eb3138..7a6cfae94 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/FileImageProvider.kt @@ -1,8 +1,11 @@ package deckers.thibault.aves.model.provider +import android.app.Activity import android.content.Context import android.net.Uri +import android.util.Log import deckers.thibault.aves.model.SourceEntry +import deckers.thibault.aves.utils.LogUtils import java.io.File internal class FileImageProvider : ImageProvider() { @@ -33,4 +36,18 @@ internal class FileImageProvider : ImageProvider() { callback.onFailure(Exception("entry has no size")) } } + + override suspend fun delete(activity: Activity, uri: Uri, path: String?, mimeType: String) { + val file = File(File(uri.path!!).path) + if (!file.exists()) return + + Log.d(LOG_TAG, "delete file at uri=$uri") + if (file.delete()) return + + throw Exception("failed to delete entry with uri=$uri path=$path") + } + + companion object { + private val LOG_TAG = LogUtils.createTag() + } } \ 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 5659f8a5d..43e648b34 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 @@ -39,7 +39,6 @@ import java.io.File import java.io.IOException import java.io.OutputStream import java.util.* -import kotlin.collections.HashMap abstract class ImageProvider { open fun fetchSingle(context: Context, uri: Uri, sourceMimeType: String?, callback: ImageOpCallback) { @@ -53,9 +52,8 @@ abstract class ImageProvider { open suspend fun moveMultiple( activity: Activity, copy: Boolean, - targetDir: String, nameConflictStrategy: NameConflictStrategy, - entries: List, + entriesByTargetDir: Map>, isCancelledOp: CancelCheck, callback: ImageOpCallback, ) { @@ -245,7 +243,6 @@ abstract class ImageProvider { // clearing Glide target should happen after effectively writing the bitmap Glide.with(activity).clear(target) } - } @Suppress("BlockingMethodInNonBlockingContext") 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 4ada34d6f..322672824 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 @@ -3,6 +3,7 @@ package deckers.thibault.aves.model.provider import android.annotation.SuppressLint import android.app.Activity import android.app.RecoverableSecurityException +import android.content.ContentResolver import android.content.ContentUris import android.content.ContentValues import android.content.Context @@ -31,13 +32,12 @@ import java.io.File import java.io.OutputStream import java.util.* import java.util.concurrent.CompletableFuture -import kotlin.collections.ArrayList import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine class MediaStoreImageProvider : ImageProvider() { - fun fetchAll(context: Context, knownEntries: Map, handleNewEntry: NewEntryHandler) { + fun fetchAll(context: Context, knownEntries: Map, handleNewEntry: NewEntryHandler) { val isModified = fun(contentId: Int, dateModifiedSecs: Int): Boolean { val knownDate = knownEntries[contentId] return knownDate == null || knownDate < dateModifiedSecs @@ -83,7 +83,7 @@ class MediaStoreImageProvider : ImageProvider() { } } - fun checkObsoleteContentIds(context: Context, knownContentIds: List): List { + fun checkObsoleteContentIds(context: Context, knownContentIds: List): List { val foundContentIds = HashSet() fun check(context: Context, contentUri: Uri) { val projection = arrayOf(MediaStore.MediaColumns._ID) @@ -102,10 +102,10 @@ class MediaStoreImageProvider : ImageProvider() { } check(context, IMAGE_CONTENT_URI) check(context, VIDEO_CONTENT_URI) - return knownContentIds.subtract(foundContentIds).toList() + return knownContentIds.subtract(foundContentIds).filterNotNull().toList() } - fun checkObsoletePaths(context: Context, knownPathById: Map): List { + fun checkObsoletePaths(context: Context, knownPathById: Map): List { val obsoleteIds = ArrayList() fun check(context: Context, contentUri: Uri) { val projection = arrayOf(MediaStore.MediaColumns._ID, MediaColumns.PATH) @@ -291,6 +291,10 @@ class MediaStoreImageProvider : ImageProvider() { } throw Exception("failed to delete document with df=$df") } + } else if (uri.scheme?.lowercase(Locale.ROOT) == ContentResolver.SCHEME_FILE) { + val uriFilePath = File(uri.path!!).path + // URI and path both point to the same non existent path + if (uriFilePath == path) return } try { @@ -329,84 +333,119 @@ class MediaStoreImageProvider : ImageProvider() { override suspend fun moveMultiple( activity: Activity, copy: Boolean, - targetDir: String, nameConflictStrategy: NameConflictStrategy, - entries: List, + entriesByTargetDir: Map>, isCancelledOp: CancelCheck, callback: ImageOpCallback, ) { - val targetDirDocFile = StorageUtils.createDirectoryDocIfAbsent(activity, targetDir) - if (!File(targetDir).exists()) { - callback.onFailure(Exception("failed to create directory at path=$targetDir")) - return - } + entriesByTargetDir.forEach { kv -> + val targetDir = kv.key + val entries = kv.value - for (entry in entries) { - val sourceUri = entry.uri - val sourcePath = entry.path - val mimeType = entry.mimeType + val toBin = targetDir == StorageUtils.TRASH_PATH_PLACEHOLDER - val result: FieldMap = hashMapOf( - "uri" to sourceUri.toString(), - "success" to false, - ) - - if (sourcePath != null) { - // on API 30 we cannot get access granted directly to a volume root from its document tree, - // but it is still less constraining to use tree document files than to rely on the Media Store - // - // Relying on `DocumentFile`, we can create an item via `DocumentFile.createFile()`, but: - // - we need to scan the file to get the Media Store content URI - // - the underlying document provider controls the new file name - // - // Relying on the Media Store, we can create an item via `ContentResolver.insert()` - // with a path, and retrieve its content URI, but: - // - the Media Store isolates content by storage volume (e.g. `MediaStore.Images.Media.getContentUri(volumeName)`) - // - the volume name should be lower case, not exactly as the `StorageVolume` UUID - // cf new method in API 30 `StorageVolume.getMediaStoreVolumeName()` - // - inserting on a removable volume works on API 29, but not on API 25 nor 26 (on which API/devices does it work?) - // - there is no documentation regarding support for usage with removable storage - // - the Media Store only allows inserting in specific primary directories ("DCIM", "Pictures") when using scoped storage - try { - val newFields = if (isCancelledOp()) skippedFieldMap else moveSingle( - activity = activity, - sourcePath = sourcePath, - sourceUri = sourceUri, - targetDir = targetDir, - targetDirDocFile = targetDirDocFile, - nameConflictStrategy = nameConflictStrategy, - mimeType = mimeType, - copy = copy, - ) - result["newFields"] = newFields - result["success"] = true - } catch (e: Exception) { - Log.w(LOG_TAG, "failed to move to targetDir=$targetDir entry with sourcePath=$sourcePath", e) + var effectiveTargetDir: String? = null + var targetDirDocFile: DocumentFileCompat? = null + if (!toBin) { + effectiveTargetDir = targetDir + targetDirDocFile = StorageUtils.createDirectoryDocIfAbsent(activity, targetDir) + if (!File(targetDir).exists()) { + callback.onFailure(Exception("failed to create directory at path=$targetDir")) + return } } - callback.onSuccess(result) + + for (entry in entries) { + val mimeType = entry.mimeType + val trashed = entry.trashed + + val sourceUri = if (trashed) Uri.fromFile(File(entry.trashPath!!)) else entry.uri + val sourcePath = if (trashed) entry.trashPath else entry.path + + var desiredName: String? = null + if (trashed) { + entry.path?.let { desiredName = File(it).name } + } + + val result: FieldMap = hashMapOf( + // `uri` should reference original content URI, + // so it is different with `sourceUri` when recycling trashed entries + "uri" to entry.uri.toString(), + "success" to false, + ) + + if (sourcePath != null) { + // on API 30 we cannot get access granted directly to a volume root from its document tree, + // but it is still less constraining to use tree document files than to rely on the Media Store + // + // Relying on `DocumentFile`, we can create an item via `DocumentFile.createFile()`, but: + // - we need to scan the file to get the Media Store content URI + // - the underlying document provider controls the new file name + // + // Relying on the Media Store, we can create an item via `ContentResolver.insert()` + // with a path, and retrieve its content URI, but: + // - the Media Store isolates content by storage volume (e.g. `MediaStore.Images.Media.getContentUri(volumeName)`) + // - the volume name should be lower case, not exactly as the `StorageVolume` UUID + // cf new method in API 30 `StorageVolume.getMediaStoreVolumeName()` + // - inserting on a removable volume works on API 29, but not on API 25 nor 26 (on which API/devices does it work?) + // - there is no documentation regarding support for usage with removable storage + // - the Media Store only allows inserting in specific primary directories ("DCIM", "Pictures") when using scoped storage + try { + if (toBin) { + val trashDir = StorageUtils.trashDirFor(activity, sourcePath) + if (trashDir != null) { + effectiveTargetDir = StorageUtils.ensureTrailingSeparator(trashDir.path) + targetDirDocFile = DocumentFileCompat.fromFile(trashDir) + } + } + if (effectiveTargetDir != null) { + val newFields = if (isCancelledOp()) skippedFieldMap else { + val sourceFile = File(sourcePath) + moveSingle( + activity = activity, + sourceFile = sourceFile, + sourceUri = sourceUri, + targetDir = effectiveTargetDir, + targetDirDocFile = targetDirDocFile, + desiredName = desiredName ?: sourceFile.name, + nameConflictStrategy = nameConflictStrategy, + mimeType = mimeType, + copy = copy, + toBin = toBin, + ) + } + result["newFields"] = newFields + result["success"] = true + } + } catch (e: Exception) { + Log.w(LOG_TAG, "failed to move to targetDir=$targetDir entry with sourcePath=$sourcePath", e) + } + } + callback.onSuccess(result) + } } } private suspend fun moveSingle( activity: Activity, - sourcePath: String, + sourceFile: File, sourceUri: Uri, targetDir: String, targetDirDocFile: DocumentFileCompat?, + desiredName: String, nameConflictStrategy: NameConflictStrategy, mimeType: String, copy: Boolean, + toBin: Boolean, ): FieldMap { - val sourceFile = File(sourcePath) + val sourcePath = sourceFile.path val sourceDir = sourceFile.parent?.let { StorageUtils.ensureTrailingSeparator(it) } if (sourceDir == targetDir && !(copy && nameConflictStrategy == NameConflictStrategy.RENAME)) { // nothing to do unless it's a renamed copy return skippedFieldMap } - val sourceFileName = sourceFile.name - val desiredNameWithoutExtension = sourceFileName.replaceFirst(FILE_EXTENSION_PATTERN, "") + val desiredNameWithoutExtension = desiredName.replaceFirst(FILE_EXTENSION_PATTERN, "") val targetNameWithoutExtension = resolveTargetFileNameWithoutExtension( activity = activity, dir = targetDir, @@ -432,7 +471,12 @@ class MediaStoreImageProvider : ImageProvider() { Log.w(LOG_TAG, "failed to delete entry with path=$sourcePath", e) } } - + if (toBin) { + return hashMapOf( + "trashed" to true, + "trashPath" to targetPath, + ) + } return scanNewPath(activity, targetPath, mimeType) } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/PermissionManager.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/PermissionManager.kt index 02eeaf485..1e1a70203 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/PermissionManager.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/PermissionManager.kt @@ -18,9 +18,7 @@ import deckers.thibault.aves.PendingStorageAccessResultHandler import deckers.thibault.aves.model.FieldMap import deckers.thibault.aves.utils.StorageUtils.PathSegments import java.io.File -import java.util.* import java.util.concurrent.CompletableFuture -import kotlin.collections.ArrayList object PermissionManager { private val LOG_TAG = LogUtils.createTag() @@ -94,11 +92,12 @@ object PermissionManager { } fun getInaccessibleDirectories(context: Context, dirPaths: List): List> { + val concreteDirPaths = dirPaths.filter { it != StorageUtils.TRASH_PATH_PLACEHOLDER } val accessibleDirs = getAccessibleDirs(context) // find set of inaccessible directories for each volume val dirsPerVolume = HashMap>() - for (dirPath in dirPaths.map { if (it.endsWith(File.separator)) it else it + File.separator }) { + for (dirPath in concreteDirPaths.map { if (it.endsWith(File.separator)) it else it + File.separator }) { if (accessibleDirs.none { dirPath.startsWith(it) }) { // inaccessible dirs val segments = PathSegments(context, dirPath) @@ -211,7 +210,8 @@ object PermissionManager { ) }) } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT - || Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT_WATCH) { + || Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT_WATCH + ) { // removable storage requires access permission, at the file level // without directory access, we consider the whole volume restricted val primaryVolume = StorageUtils.getPrimaryVolumePath(context) 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 1164ef228..4ddb4ef08 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 @@ -33,6 +33,32 @@ object StorageUtils { private const val TREE_URI_ROOT = "content://com.android.externalstorage.documents/tree/" private val TREE_URI_PATH_PATTERN = Pattern.compile("(.*?):(.*)") + const val TRASH_PATH_PLACEHOLDER = "#trash" + + private fun isAppFile(context: Context, path: String): Boolean { + return context.getExternalFilesDirs(null).any { filesDir -> path.startsWith(filesDir.path) } + } + + private fun appExternalFilesDirFor(context: Context, path: String): File? { + val filesDirs = context.getExternalFilesDirs(null) + val volumePath = getVolumePath(context, path) + return volumePath?.let { filesDirs.firstOrNull { it.startsWith(volumePath) } } ?: filesDirs.first() + } + + fun trashDirFor(context: Context, path: String): File? { + val filesDir = appExternalFilesDirFor(context, path) + if (filesDir == null) { + Log.e(LOG_TAG, "failed to find external files dir for path=$path") + return null + } + val trashDir = File(filesDir, "trash") + if (!trashDir.exists() && !trashDir.mkdirs()) { + Log.e(LOG_TAG, "failed to create directories at path=$trashDir") + return null + } + return trashDir + } + /** * Volume paths */ @@ -408,10 +434,11 @@ object StorageUtils { fun canEditByFile(context: Context, path: String) = !requireAccessPermission(context, path) fun requireAccessPermission(context: Context, anyPath: String): Boolean { + if (isAppFile(context, anyPath)) return false + // on Android R, we should always require access permission, even on primary volume - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) { - return true - } + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) return true + val onPrimaryVolume = anyPath.startsWith(getPrimaryVolumePath(context)) return !onPrimaryVolume } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 60a5d6341..8399fc495 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -22,6 +22,12 @@ "minutes": {} } }, + "timeDays": "{days, plural, =1{1 day} other{{days} days}}", + "@timeDays": { + "placeholders": { + "days": {} + } + }, "focalLength": "{length} mm", "@focalLength": { "placeholders": { @@ -72,6 +78,7 @@ "entryActionConvert": "Convert", "entryActionExport": "Export", "entryActionRename": "Rename", + "entryActionRestore": "Restore", "entryActionRotateCCW": "Rotate counterclockwise", "entryActionRotateCW": "Rotate clockwise", "entryActionFlip": "Flip horizontally", @@ -254,6 +261,12 @@ "noMatchingAppDialogTitle": "No Matching App", "noMatchingAppDialogMessage": "There are no apps that can handle this.", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Are you sure you want to move this item to the recycle bin?} other{Are you sure you want to move these {count} items to the recycle bin?}}", + "@binEntriesConfirmationDialogMessage": { + "placeholders": { + "count": {} + } + }, "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Are you sure you want to delete this item?} other{Are you sure you want to delete these {count} items?}}", "@deleteEntriesConfirmationDialogMessage": { "placeholders": { @@ -409,6 +422,7 @@ "collectionActionShowTitleSearch": "Show title filter", "collectionActionHideTitleSearch": "Hide title filter", "collectionActionAddShortcut": "Add shortcut", + "collectionActionEmptyBin": "Empty bin", "collectionActionCopy": "Copy to album", "collectionActionMove": "Move to album", "collectionActionRescan": "Rescan", @@ -527,6 +541,8 @@ "tagPageTitle": "Tags", "tagEmpty": "No tags", + "binPageTitle": "Recycle Bin", + "searchCollectionFieldHint": "Search collection", "searchSectionRecent": "Recent", "searchSectionAlbums": "Albums", @@ -627,6 +643,8 @@ "settingsAllowInstalledAppAccessSubtitle": "Used to improve album display", "settingsAllowErrorReporting": "Allow anonymous error reporting", "settingsSaveSearchHistory": "Save search history", + "settingsEnableBin": "Use recycle bin", + "settingsEnableBinSubtitle": "Keep deleted items for 30 days", "settingsHiddenItemsTile": "Hidden items", "settingsHiddenItemsTitle": "Hidden Items", diff --git a/lib/model/actions/entry_actions.dart b/lib/model/actions/entry_actions.dart index 4c085b1f7..e55748510 100644 --- a/lib/model/actions/entry_actions.dart +++ b/lib/model/actions/entry_actions.dart @@ -7,6 +7,7 @@ enum EntryAction { addShortcut, copyToClipboard, delete, + restore, convert, print, rename, @@ -65,6 +66,12 @@ class EntryActions { EntryAction.rotateCW, EntryAction.flip, ]; + + static const trashed = [ + EntryAction.delete, + EntryAction.restore, + EntryAction.debug, + ]; } extension ExtraEntryAction on EntryAction { @@ -76,6 +83,8 @@ extension ExtraEntryAction on EntryAction { return context.l10n.entryActionCopyToClipboard; case EntryAction.delete: return context.l10n.entryActionDelete; + case EntryAction.restore: + return context.l10n.entryActionRestore; case EntryAction.convert: return context.l10n.entryActionConvert; case EntryAction.print: @@ -119,11 +128,8 @@ extension ExtraEntryAction on EntryAction { } } - Widget? getIcon() { - final icon = getIconData(); - if (icon == null) return null; - - final child = Icon(icon); + Widget getIcon() { + final child = Icon(getIconData()); switch (this) { case EntryAction.debug: return ShaderMask( @@ -135,7 +141,7 @@ extension ExtraEntryAction on EntryAction { } } - IconData? getIconData() { + IconData getIconData() { switch (this) { case EntryAction.addShortcut: return AIcons.addShortcut; @@ -143,6 +149,8 @@ extension ExtraEntryAction on EntryAction { return AIcons.clipboard; case EntryAction.delete: return AIcons.delete; + case EntryAction.restore: + return AIcons.restore; case EntryAction.convert: return AIcons.convert; case EntryAction.print: diff --git a/lib/model/actions/entry_info_actions.dart b/lib/model/actions/entry_info_actions.dart index d23c65e02..0105d2ce4 100644 --- a/lib/model/actions/entry_info_actions.dart +++ b/lib/model/actions/entry_info_actions.dart @@ -1,4 +1,5 @@ import 'package:aves/theme/icons.dart'; +import 'package:aves/theme/themes.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:flutter/widgets.dart'; @@ -11,6 +12,8 @@ enum EntryInfoAction { removeMetadata, // motion photo viewMotionPhotoVideo, + // debug + debug, } class EntryInfoActions { @@ -41,11 +44,23 @@ extension ExtraEntryInfoAction on EntryInfoAction { // motion photo case EntryInfoAction.viewMotionPhotoVideo: return context.l10n.entryActionViewMotionPhotoVideo; + // debug + case EntryInfoAction.debug: + return 'Debug'; } } Widget getIcon() { - return Icon(_getIconData()); + final child = Icon(_getIconData()); + switch (this) { + case EntryInfoAction.debug: + return ShaderMask( + shaderCallback: Themes.debugGradient.createShader, + child: child, + ); + default: + return child; + } } IconData _getIconData() { @@ -64,6 +79,9 @@ extension ExtraEntryInfoAction on EntryInfoAction { // motion photo case EntryInfoAction.viewMotionPhotoVideo: return AIcons.motionPhoto; + // debug + case EntryInfoAction.debug: + return AIcons.debug; } } } diff --git a/lib/model/actions/entry_set_actions.dart b/lib/model/actions/entry_set_actions.dart index 5ef1ac427..8ef89c1cf 100644 --- a/lib/model/actions/entry_set_actions.dart +++ b/lib/model/actions/entry_set_actions.dart @@ -12,6 +12,7 @@ enum EntrySetAction { searchCollection, toggleTitleSearch, addShortcut, + emptyBin, // browsing or selecting map, stats, @@ -19,6 +20,7 @@ enum EntrySetAction { // selecting share, delete, + restore, copy, move, toggleFavourite, @@ -47,11 +49,13 @@ class EntrySetActions { EntrySetAction.map, EntrySetAction.stats, EntrySetAction.rescan, + EntrySetAction.emptyBin, ]; static const selection = [ EntrySetAction.share, EntrySetAction.delete, + EntrySetAction.restore, EntrySetAction.copy, EntrySetAction.move, EntrySetAction.toggleFavourite, @@ -60,6 +64,14 @@ class EntrySetActions { EntrySetAction.rescan, // editing actions are in their subsection ]; + + static const edit = [ + EntrySetAction.editDate, + EntrySetAction.editLocation, + EntrySetAction.editRating, + EntrySetAction.editTags, + EntrySetAction.removeMetadata, + ]; } extension ExtraEntrySetAction on EntrySetAction { @@ -82,6 +94,8 @@ extension ExtraEntrySetAction on EntrySetAction { return context.l10n.collectionActionShowTitleSearch; case EntrySetAction.addShortcut: return context.l10n.collectionActionAddShortcut; + case EntrySetAction.emptyBin: + return context.l10n.collectionActionEmptyBin; // browsing or selecting case EntrySetAction.map: return context.l10n.menuActionMap; @@ -94,6 +108,8 @@ extension ExtraEntrySetAction on EntrySetAction { return context.l10n.entryActionShare; case EntrySetAction.delete: return context.l10n.entryActionDelete; + case EntrySetAction.restore: + return context.l10n.entryActionRestore; case EntrySetAction.copy: return context.l10n.collectionActionCopy; case EntrySetAction.move: @@ -143,6 +159,8 @@ extension ExtraEntrySetAction on EntrySetAction { return AIcons.filter; case EntrySetAction.addShortcut: return AIcons.addShortcut; + case EntrySetAction.emptyBin: + return AIcons.emptyBin; // browsing or selecting case EntrySetAction.map: return AIcons.map; @@ -155,6 +173,8 @@ extension ExtraEntrySetAction on EntrySetAction { return AIcons.share; case EntrySetAction.delete: return AIcons.delete; + case EntrySetAction.restore: + return AIcons.restore; case EntrySetAction.copy: return AIcons.copy; case EntrySetAction.move: diff --git a/lib/model/actions/move_type.dart b/lib/model/actions/move_type.dart index 71b326b70..cc7ff0c6b 100644 --- a/lib/model/actions/move_type.dart +++ b/lib/model/actions/move_type.dart @@ -1 +1 @@ -enum MoveType { copy, move, export } +enum MoveType { copy, move, export, toBin, fromBin } diff --git a/lib/model/covers.dart b/lib/model/covers.dart index 2b339889c..3a1acb3b2 100644 --- a/lib/model/covers.dart +++ b/lib/model/covers.dart @@ -23,19 +23,19 @@ class Covers with ChangeNotifier { Set get all => Set.unmodifiable(_rows); - int? coverContentId(CollectionFilter filter) => _rows.firstWhereOrNull((row) => row.filter == filter)?.contentId; + int? coverEntryId(CollectionFilter filter) => _rows.firstWhereOrNull((row) => row.filter == filter)?.entryId; - Future set(CollectionFilter filter, int? contentId) async { + Future set(CollectionFilter filter, int? entryId) async { // erase contextual properties from filters before saving them if (filter is AlbumFilter) { filter = AlbumFilter(filter.album, null); } _rows.removeWhere((row) => row.filter == filter); - if (contentId == null) { + if (entryId == null) { await metadataDb.removeCovers({filter}); } else { - final row = CoverRow(filter: filter, contentId: contentId); + final row = CoverRow(filter: filter, entryId: entryId); _rows.add(row); await metadataDb.addCovers({row}); } @@ -43,28 +43,26 @@ class Covers with ChangeNotifier { notifyListeners(); } - Future moveEntry(int oldContentId, AvesEntry entry) async { - final oldRows = _rows.where((row) => row.contentId == oldContentId).toSet(); - if (oldRows.isEmpty) return; - - for (final oldRow in oldRows) { - final filter = oldRow.filter; - _rows.remove(oldRow); - if (filter.test(entry)) { - final newRow = CoverRow(filter: filter, contentId: entry.contentId!); - await metadataDb.updateCoverEntryId(oldRow.contentId, newRow); - _rows.add(newRow); - } else { - await metadataDb.removeCovers({filter}); + Future moveEntry(AvesEntry entry, {required bool persist}) async { + final entryId = entry.id; + final rows = _rows.where((row) => row.entryId == entryId).toSet(); + for (final row in rows) { + final filter = row.filter; + if (!filter.test(entry)) { + _rows.remove(row); + if (persist) { + await metadataDb.removeCovers({filter}); + } } } notifyListeners(); } - Future removeEntries(Set entries) async { - final contentIds = entries.map((entry) => entry.contentId).toSet(); - final removedRows = _rows.where((row) => contentIds.contains(row.contentId)).toSet(); + Future removeEntries(Set entries) => removeIds(entries.map((entry) => entry.id).toSet()); + + Future removeIds(Set entryIds) async { + final removedRows = _rows.where((row) => entryIds.contains(row.entryId)).toSet(); await metadataDb.removeCovers(removedRows.map((row) => row.filter).toSet()); _rows.removeAll(removedRows); @@ -85,8 +83,8 @@ class Covers with ChangeNotifier { final visibleEntries = source.visibleEntries; final jsonList = covers.all .map((row) { - final id = row.contentId; - final path = visibleEntries.firstWhereOrNull((entry) => id == entry.contentId)?.path; + final entryId = row.entryId; + final path = visibleEntries.firstWhereOrNull((entry) => entryId == entry.id)?.path; if (path == null) return null; final volume = androidFileUtils.getStorageVolume(path)?.path; @@ -124,7 +122,7 @@ class Covers with ChangeNotifier { final path = pContext.join(volume, relativePath); final entry = visibleEntries.firstWhereOrNull((entry) => entry.path == path && filter.test(entry)); if (entry != null) { - covers.set(filter, entry.contentId); + covers.set(filter, entry.id); } else { debugPrint('failed to import cover for path=$path, filter=$filter'); } @@ -138,14 +136,14 @@ class Covers with ChangeNotifier { @immutable class CoverRow extends Equatable { final CollectionFilter filter; - final int contentId; + final int entryId; @override - List get props => [filter, contentId]; + List get props => [filter, entryId]; const CoverRow({ required this.filter, - required this.contentId, + required this.entryId, }); static CoverRow? fromMap(Map map) { @@ -153,12 +151,12 @@ class CoverRow extends Equatable { if (filter == null) return null; return CoverRow( filter: filter, - contentId: map['contentId'], + entryId: map['entryId'], ); } Map toMap() => { 'filter': filter.toJson(), - 'contentId': contentId, + 'entryId': entryId, }; } diff --git a/lib/model/db/db_metadata.dart b/lib/model/db/db_metadata.dart index e6a1a4726..db200ef32 100644 --- a/lib/model/db/db_metadata.dart +++ b/lib/model/db/db_metadata.dart @@ -4,16 +4,19 @@ import 'package:aves/model/favourites.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/trash.dart'; import 'package:aves/model/video_playback.dart'; abstract class MetadataDb { + int get nextId; + Future init(); Future dbFileSize(); Future reset(); - Future removeIds(Set contentIds, {Set? dataTypes}); + Future removeIds(Set ids, {Set? dataTypes}); // entries @@ -23,7 +26,7 @@ abstract class MetadataDb { Future saveEntries(Iterable entries); - Future updateEntryId(int oldId, AvesEntry entry); + Future updateEntry(int id, AvesEntry entry); Future> searchEntries(String query, {int? limit}); @@ -43,17 +46,25 @@ abstract class MetadataDb { Future saveMetadata(Set metadataEntries); - Future updateMetadataId(int oldId, CatalogMetadata? metadata); + Future updateMetadata(int id, CatalogMetadata? metadata); // address Future clearAddresses(); - Future> loadAllAddresses(); + Future> loadAllAddresses(); Future saveAddresses(Set addresses); - Future updateAddressId(int oldId, AddressDetails? address); + Future updateAddress(int id, AddressDetails? address); + + // trash + + Future clearTrashDetails(); + + Future> loadAllTrashDetails(); + + Future updateTrash(int id, TrashDetails? details); // favourites @@ -63,7 +74,7 @@ abstract class MetadataDb { Future addFavourites(Iterable rows); - Future updateFavouriteId(int oldId, FavouriteRow row); + Future updateFavouriteId(int id, FavouriteRow row); Future removeFavourites(Iterable rows); @@ -75,7 +86,7 @@ abstract class MetadataDb { Future addCovers(Iterable rows); - Future updateCoverEntryId(int oldId, CoverRow row); + Future updateCoverEntryId(int id, CoverRow row); Future removeCovers(Set filters); @@ -85,11 +96,9 @@ abstract class MetadataDb { Future> loadAllVideoPlayback(); - Future loadVideoPlayback(int? contentId); + Future loadVideoPlayback(int? id); Future addVideoPlayback(Set rows); - Future updateVideoPlaybackId(int oldId, int? newId); - - Future removeVideoPlayback(Set contentIds); + Future removeVideoPlayback(Set ids); } diff --git a/lib/model/db/db_metadata_sqflite.dart b/lib/model/db/db_metadata_sqflite.dart index 8f728ca88..1e2fdec33 100644 --- a/lib/model/db/db_metadata_sqflite.dart +++ b/lib/model/db/db_metadata_sqflite.dart @@ -8,6 +8,7 @@ import 'package:aves/model/favourites.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/trash.dart'; import 'package:aves/model/video_playback.dart'; import 'package:aves/services/common/services.dart'; import 'package:collection/collection.dart'; @@ -15,7 +16,7 @@ import 'package:flutter/foundation.dart'; import 'package:sqflite/sqflite.dart'; class SqfliteMetadataDb implements MetadataDb { - late Future _database; + late Database _db; Future get path async => pContext.join(await getDatabasesPath(), 'metadata.db'); @@ -25,15 +26,22 @@ class SqfliteMetadataDb implements MetadataDb { static const addressTable = 'address'; static const favouriteTable = 'favourites'; static const coverTable = 'covers'; + static const trashTable = 'trash'; static const videoPlaybackTable = 'videoPlayback'; + static int _lastId = 0; + + @override + int get nextId => ++_lastId; + @override Future init() async { - _database = openDatabase( + _db = await openDatabase( await path, onCreate: (db, version) async { await db.execute('CREATE TABLE $entryTable(' - 'contentId INTEGER PRIMARY KEY' + 'id INTEGER PRIMARY KEY' + ', contentId INTEGER' ', uri TEXT' ', path TEXT' ', sourceMimeType TEXT' @@ -45,13 +53,14 @@ class SqfliteMetadataDb implements MetadataDb { ', dateModifiedSecs INTEGER' ', sourceDateTakenMillis INTEGER' ', durationMillis INTEGER' + ', trashed INTEGER DEFAULT 0' ')'); await db.execute('CREATE TABLE $dateTakenTable(' - 'contentId INTEGER PRIMARY KEY' + 'id INTEGER PRIMARY KEY' ', dateMillis INTEGER' ')'); await db.execute('CREATE TABLE $metadataTable(' - 'contentId INTEGER PRIMARY KEY' + 'id INTEGER PRIMARY KEY' ', mimeType TEXT' ', dateMillis INTEGER' ', flags INTEGER' @@ -63,7 +72,7 @@ class SqfliteMetadataDb implements MetadataDb { ', rating INTEGER' ')'); await db.execute('CREATE TABLE $addressTable(' - 'contentId INTEGER PRIMARY KEY' + 'id INTEGER PRIMARY KEY' ', addressLine TEXT' ', countryCode TEXT' ', countryName TEXT' @@ -71,21 +80,28 @@ class SqfliteMetadataDb implements MetadataDb { ', locality TEXT' ')'); await db.execute('CREATE TABLE $favouriteTable(' - 'contentId INTEGER PRIMARY KEY' - ', path TEXT' + 'id INTEGER PRIMARY KEY' ')'); await db.execute('CREATE TABLE $coverTable(' 'filter TEXT PRIMARY KEY' - ', contentId INTEGER' + ', entryId INTEGER' + ')'); + await db.execute('CREATE TABLE $trashTable(' + 'id INTEGER PRIMARY KEY' + ', path TEXT' + ', dateMillis INTEGER' ')'); await db.execute('CREATE TABLE $videoPlaybackTable(' - 'contentId INTEGER PRIMARY KEY' + 'id INTEGER PRIMARY KEY' ', resumeTimeMillis INTEGER' ')'); }, onUpgrade: MetadataDbUpgrader.upgradeDb, - version: 6, + version: 7, ); + + final maxIdRows = await _db.rawQuery('SELECT max(id) AS maxId FROM $entryTable'); + _lastId = (maxIdRows.firstOrNull?['maxId'] as int?) ?? 0; } @override @@ -97,22 +113,22 @@ class SqfliteMetadataDb implements MetadataDb { @override Future reset() async { debugPrint('$runtimeType reset'); - await (await _database).close(); + await _db.close(); await deleteDatabase(await path); await init(); } @override - Future removeIds(Set contentIds, {Set? dataTypes}) async { - if (contentIds.isEmpty) return; + Future removeIds(Set ids, {Set? dataTypes}) async { + if (ids.isEmpty) return; final _dataTypes = dataTypes ?? EntryDataType.values.toSet(); - final db = await _database; - // using array in `whereArgs` and using it with `where contentId IN ?` is a pain, so we prefer `batch` instead - final batch = db.batch(); - const where = 'contentId = ?'; - contentIds.forEach((id) { + // using array in `whereArgs` and using it with `where id IN ?` is a pain, so we prefer `batch` instead + final batch = _db.batch(); + const where = 'id = ?'; + const coverWhere = 'entryId = ?'; + ids.forEach((id) { final whereArgs = [id]; if (_dataTypes.contains(EntryDataType.basic)) { batch.delete(entryTable, where: where, whereArgs: whereArgs); @@ -126,7 +142,8 @@ class SqfliteMetadataDb implements MetadataDb { } if (_dataTypes.contains(EntryDataType.references)) { batch.delete(favouriteTable, where: where, whereArgs: whereArgs); - batch.delete(coverTable, 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); } }); @@ -137,32 +154,28 @@ class SqfliteMetadataDb implements MetadataDb { @override Future clearEntries() async { - final db = await _database; - final count = await db.delete(entryTable, where: '1'); + final count = await _db.delete(entryTable, where: '1'); debugPrint('$runtimeType clearEntries deleted $count rows'); } @override Future> loadAllEntries() async { - final db = await _database; - final maps = await db.query(entryTable); - final entries = maps.map(AvesEntry.fromMap).toSet(); - return entries; + final rows = await _db.query(entryTable); + return rows.map(AvesEntry.fromMap).toSet(); } @override Future> loadEntries(List ids) async { if (ids.isEmpty) return {}; - final db = await _database; final entries = {}; await Future.forEach(ids, (id) async { - final maps = await db.query( + final rows = await _db.query( entryTable, - where: 'contentId = ?', + where: 'id = ?', whereArgs: [id], ); - if (maps.isNotEmpty) { - entries.add(AvesEntry.fromMap(maps.first)); + if (rows.isNotEmpty) { + entries.add(AvesEntry.fromMap(rows.first)); } }); return entries; @@ -172,18 +185,16 @@ class SqfliteMetadataDb implements MetadataDb { Future saveEntries(Iterable entries) async { if (entries.isEmpty) return; final stopwatch = Stopwatch()..start(); - final db = await _database; - final batch = db.batch(); + final batch = _db.batch(); entries.forEach((entry) => _batchInsertEntry(batch, entry)); await batch.commit(noResult: true); debugPrint('$runtimeType saveEntries complete in ${stopwatch.elapsed.inMilliseconds}ms for ${entries.length} entries'); } @override - Future updateEntryId(int oldId, AvesEntry entry) async { - final db = await _database; - final batch = db.batch(); - batch.delete(entryTable, where: 'contentId = ?', whereArgs: [oldId]); + Future updateEntry(int id, AvesEntry entry) async { + final batch = _db.batch(); + batch.delete(entryTable, where: 'id = ?', whereArgs: [id]); _batchInsertEntry(batch, entry); await batch.commit(noResult: true); } @@ -198,49 +209,42 @@ class SqfliteMetadataDb implements MetadataDb { @override Future> searchEntries(String query, {int? limit}) async { - final db = await _database; - final maps = await db.query( + final rows = await _db.query( entryTable, where: 'title LIKE ?', whereArgs: ['%$query%'], orderBy: 'sourceDateTakenMillis DESC', limit: limit, ); - return maps.map(AvesEntry.fromMap).toSet(); + return rows.map(AvesEntry.fromMap).toSet(); } // date taken @override Future clearDates() async { - final db = await _database; - final count = await db.delete(dateTakenTable, where: '1'); + final count = await _db.delete(dateTakenTable, where: '1'); debugPrint('$runtimeType clearDates deleted $count rows'); } @override Future> loadDates() async { - final db = await _database; - final maps = await db.query(dateTakenTable); - final metadataEntries = Map.fromEntries(maps.map((map) => MapEntry(map['contentId'] as int, (map['dateMillis'] ?? 0) as int))); - return metadataEntries; + final rows = await _db.query(dateTakenTable); + return Map.fromEntries(rows.map((map) => MapEntry(map['id'] as int, (map['dateMillis'] ?? 0) as int))); } // catalog metadata @override Future clearMetadataEntries() async { - final db = await _database; - final count = await db.delete(metadataTable, where: '1'); + final count = await _db.delete(metadataTable, where: '1'); debugPrint('$runtimeType clearMetadataEntries deleted $count rows'); } @override Future> loadAllMetadataEntries() async { - final db = await _database; - final maps = await db.query(metadataTable); - final metadataEntries = maps.map(CatalogMetadata.fromMap).toList(); - return metadataEntries; + final rows = await _db.query(metadataTable); + return rows.map(CatalogMetadata.fromMap).toList(); } @override @@ -248,8 +252,7 @@ class SqfliteMetadataDb implements MetadataDb { if (metadataEntries.isEmpty) return; final stopwatch = Stopwatch()..start(); try { - final db = await _database; - final batch = db.batch(); + final batch = _db.batch(); metadataEntries.forEach((metadata) => _batchInsertMetadata(batch, metadata)); await batch.commit(noResult: true); debugPrint('$runtimeType saveMetadata complete in ${stopwatch.elapsed.inMilliseconds}ms for ${metadataEntries.length} entries'); @@ -259,11 +262,10 @@ class SqfliteMetadataDb implements MetadataDb { } @override - Future updateMetadataId(int oldId, CatalogMetadata? metadata) async { - final db = await _database; - final batch = db.batch(); - batch.delete(dateTakenTable, where: 'contentId = ?', whereArgs: [oldId]); - batch.delete(metadataTable, where: 'contentId = ?', whereArgs: [oldId]); + Future updateMetadata(int id, CatalogMetadata? metadata) async { + final batch = _db.batch(); + batch.delete(dateTakenTable, where: 'id = ?', whereArgs: [id]); + batch.delete(metadataTable, where: 'id = ?', whereArgs: [id]); _batchInsertMetadata(batch, metadata); await batch.commit(noResult: true); } @@ -274,7 +276,7 @@ class SqfliteMetadataDb implements MetadataDb { batch.insert( dateTakenTable, { - 'contentId': metadata.contentId, + 'id': metadata.id, 'dateMillis': metadata.dateMillis, }, conflictAlgorithm: ConflictAlgorithm.replace, @@ -291,35 +293,30 @@ class SqfliteMetadataDb implements MetadataDb { @override Future clearAddresses() async { - final db = await _database; - final count = await db.delete(addressTable, where: '1'); + final count = await _db.delete(addressTable, where: '1'); debugPrint('$runtimeType clearAddresses deleted $count rows'); } @override - Future> loadAllAddresses() async { - final db = await _database; - final maps = await db.query(addressTable); - final addresses = maps.map(AddressDetails.fromMap).toList(); - return addresses; + Future> loadAllAddresses() async { + final rows = await _db.query(addressTable); + return rows.map(AddressDetails.fromMap).toSet(); } @override Future saveAddresses(Set addresses) async { if (addresses.isEmpty) return; final stopwatch = Stopwatch()..start(); - final db = await _database; - final batch = db.batch(); + final batch = _db.batch(); addresses.forEach((address) => _batchInsertAddress(batch, address)); await batch.commit(noResult: true); debugPrint('$runtimeType saveAddresses complete in ${stopwatch.elapsed.inMilliseconds}ms for ${addresses.length} entries'); } @override - Future updateAddressId(int oldId, AddressDetails? address) async { - final db = await _database; - final batch = db.batch(); - batch.delete(addressTable, where: 'contentId = ?', whereArgs: [oldId]); + Future updateAddress(int id, AddressDetails? address) async { + final batch = _db.batch(); + batch.delete(addressTable, where: 'id = ?', whereArgs: [id]); _batchInsertAddress(batch, address); await batch.commit(noResult: true); } @@ -333,37 +330,63 @@ class SqfliteMetadataDb implements MetadataDb { ); } + // trash + + @override + Future clearTrashDetails() async { + final count = await _db.delete(trashTable, where: '1'); + debugPrint('$runtimeType clearTrashDetails deleted $count rows'); + } + + @override + Future> loadAllTrashDetails() async { + final rows = await _db.query(trashTable); + return rows.map(TrashDetails.fromMap).toSet(); + } + + @override + Future updateTrash(int id, TrashDetails? details) async { + final batch = _db.batch(); + batch.delete(trashTable, where: 'id = ?', whereArgs: [id]); + _batchInsertTrashDetails(batch, details); + await batch.commit(noResult: true); + } + + void _batchInsertTrashDetails(Batch batch, TrashDetails? details) { + if (details == null) return; + batch.insert( + trashTable, + details.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + // favourites @override Future clearFavourites() async { - final db = await _database; - final count = await db.delete(favouriteTable, where: '1'); + final count = await _db.delete(favouriteTable, where: '1'); debugPrint('$runtimeType clearFavourites deleted $count rows'); } @override Future> loadAllFavourites() async { - final db = await _database; - final maps = await db.query(favouriteTable); - final rows = maps.map(FavouriteRow.fromMap).toSet(); - return rows; + final rows = await _db.query(favouriteTable); + return rows.map(FavouriteRow.fromMap).toSet(); } @override Future addFavourites(Iterable rows) async { if (rows.isEmpty) return; - final db = await _database; - final batch = db.batch(); + final batch = _db.batch(); rows.forEach((row) => _batchInsertFavourite(batch, row)); await batch.commit(noResult: true); } @override - Future updateFavouriteId(int oldId, FavouriteRow row) async { - final db = await _database; - final batch = db.batch(); - batch.delete(favouriteTable, where: 'contentId = ?', whereArgs: [oldId]); + Future updateFavouriteId(int id, FavouriteRow row) async { + final batch = _db.batch(); + batch.delete(favouriteTable, where: 'id = ?', whereArgs: [id]); _batchInsertFavourite(batch, row); await batch.commit(noResult: true); } @@ -379,13 +402,12 @@ class SqfliteMetadataDb implements MetadataDb { @override Future removeFavourites(Iterable rows) async { if (rows.isEmpty) return; - final ids = rows.map((row) => row.contentId); + final ids = rows.map((row) => row.entryId); if (ids.isEmpty) return; - final db = await _database; - // using array in `whereArgs` and using it with `where contentId IN ?` is a pain, so we prefer `batch` instead - final batch = db.batch(); - ids.forEach((id) => batch.delete(favouriteTable, where: 'contentId = ?', whereArgs: [id])); + // using array in `whereArgs` and using it with `where id IN ?` is a pain, so we prefer `batch` instead + final batch = _db.batch(); + ids.forEach((id) => batch.delete(favouriteTable, where: 'id = ?', whereArgs: [id])); await batch.commit(noResult: true); } @@ -393,34 +415,29 @@ class SqfliteMetadataDb implements MetadataDb { @override Future clearCovers() async { - final db = await _database; - final count = await db.delete(coverTable, where: '1'); + final count = await _db.delete(coverTable, where: '1'); debugPrint('$runtimeType clearCovers deleted $count rows'); } @override Future> loadAllCovers() async { - final db = await _database; - final maps = await db.query(coverTable); - final rows = maps.map(CoverRow.fromMap).whereNotNull().toSet(); - return rows; + final rows = await _db.query(coverTable); + return rows.map(CoverRow.fromMap).whereNotNull().toSet(); } @override Future addCovers(Iterable rows) async { if (rows.isEmpty) return; - final db = await _database; - final batch = db.batch(); + final batch = _db.batch(); rows.forEach((row) => _batchInsertCover(batch, row)); await batch.commit(noResult: true); } @override - Future updateCoverEntryId(int oldId, CoverRow row) async { - final db = await _database; - final batch = db.batch(); - batch.delete(coverTable, where: 'contentId = ?', whereArgs: [oldId]); + Future updateCoverEntryId(int id, CoverRow row) async { + final batch = _db.batch(); + batch.delete(coverTable, where: 'entryId = ?', whereArgs: [id]); _batchInsertCover(batch, row); await batch.commit(noResult: true); } @@ -437,9 +454,8 @@ class SqfliteMetadataDb implements MetadataDb { Future removeCovers(Set filters) async { if (filters.isEmpty) return; - final db = await _database; // using array in `whereArgs` and using it with `where filter IN ?` is a pain, so we prefer `batch` instead - final batch = db.batch(); + final batch = _db.batch(); filters.forEach((filter) => batch.delete(coverTable, where: 'filter = ?', whereArgs: [filter.toJson()])); await batch.commit(noResult: true); } @@ -448,36 +464,31 @@ class SqfliteMetadataDb implements MetadataDb { @override Future clearVideoPlayback() async { - final db = await _database; - final count = await db.delete(videoPlaybackTable, where: '1'); + final count = await _db.delete(videoPlaybackTable, where: '1'); debugPrint('$runtimeType clearVideoPlayback deleted $count rows'); } @override Future> loadAllVideoPlayback() async { - final db = await _database; - final maps = await db.query(videoPlaybackTable); - final rows = maps.map(VideoPlaybackRow.fromMap).whereNotNull().toSet(); - return rows; + final rows = await _db.query(videoPlaybackTable); + return rows.map(VideoPlaybackRow.fromMap).whereNotNull().toSet(); } @override - Future loadVideoPlayback(int? contentId) async { - if (contentId == null) return null; + Future loadVideoPlayback(int? id) async { + if (id == null) return null; - final db = await _database; - final maps = await db.query(videoPlaybackTable, where: 'contentId = ?', whereArgs: [contentId]); - if (maps.isEmpty) return null; + final rows = await _db.query(videoPlaybackTable, where: 'id = ?', whereArgs: [id]); + if (rows.isEmpty) return null; - return VideoPlaybackRow.fromMap(maps.first); + return VideoPlaybackRow.fromMap(rows.first); } @override Future addVideoPlayback(Set rows) async { if (rows.isEmpty) return; - final db = await _database; - final batch = db.batch(); + final batch = _db.batch(); rows.forEach((row) => _batchInsertVideoPlayback(batch, row)); await batch.commit(noResult: true); } @@ -491,23 +502,12 @@ class SqfliteMetadataDb implements MetadataDb { } @override - Future updateVideoPlaybackId(int oldId, int? newId) async { - if (newId != null) { - final db = await _database; - await db.update(videoPlaybackTable, {'contentId': newId}, where: 'contentId = ?', whereArgs: [oldId]); - } else { - await removeVideoPlayback({oldId}); - } - } + Future removeVideoPlayback(Set ids) async { + if (ids.isEmpty) return; - @override - Future removeVideoPlayback(Set contentIds) async { - if (contentIds.isEmpty) return; - - final db = await _database; // using array in `whereArgs` and using it with `where filter IN ?` is a pain, so we prefer `batch` instead - final batch = db.batch(); - contentIds.forEach((id) => batch.delete(videoPlaybackTable, where: 'contentId = ?', whereArgs: [id])); + final batch = _db.batch(); + ids.forEach((id) => batch.delete(videoPlaybackTable, where: 'id = ?', whereArgs: [id])); await batch.commit(noResult: true); } } diff --git a/lib/model/db/db_metadata_sqflite_upgrade.dart b/lib/model/db/db_metadata_sqflite_upgrade.dart index f611e0294..c818e6c18 100644 --- a/lib/model/db/db_metadata_sqflite_upgrade.dart +++ b/lib/model/db/db_metadata_sqflite_upgrade.dart @@ -4,8 +4,12 @@ import 'package:sqflite/sqflite.dart'; class MetadataDbUpgrader { static const entryTable = SqfliteMetadataDb.entryTable; + static const dateTakenTable = SqfliteMetadataDb.dateTakenTable; static const metadataTable = SqfliteMetadataDb.metadataTable; + static const addressTable = SqfliteMetadataDb.addressTable; + static const favouriteTable = SqfliteMetadataDb.favouriteTable; static const coverTable = SqfliteMetadataDb.coverTable; + static const trashTable = SqfliteMetadataDb.trashTable; static const videoPlaybackTable = SqfliteMetadataDb.videoPlaybackTable; // warning: "ALTER TABLE ... RENAME COLUMN ..." is not supported @@ -28,6 +32,9 @@ class MetadataDbUpgrader { case 5: await _upgradeFrom5(db); break; + case 6: + await _upgradeFrom6(db); + break; } oldVersion++; } @@ -129,4 +136,137 @@ class MetadataDbUpgrader { debugPrint('upgrading DB from v5'); await db.execute('ALTER TABLE $metadataTable ADD COLUMN rating INTEGER;'); } + + static Future _upgradeFrom6(Database db) async { + debugPrint('upgrading DB from v6'); + // new primary key column `id` instead of `contentId` + // new column `trashed` + await db.transaction((txn) async { + const newEntryTable = '${entryTable}TEMP'; + await db.execute('CREATE TABLE $newEntryTable(' + 'id INTEGER PRIMARY KEY' + ', contentId INTEGER' + ', uri TEXT' + ', path TEXT' + ', sourceMimeType TEXT' + ', width INTEGER' + ', height INTEGER' + ', sourceRotationDegrees INTEGER' + ', sizeBytes INTEGER' + ', title TEXT' + ', dateModifiedSecs INTEGER' + ', sourceDateTakenMillis INTEGER' + ', durationMillis INTEGER' + ', trashed INTEGER DEFAULT 0' + ')'); + await db.rawInsert('INSERT INTO $newEntryTable(id,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateModifiedSecs,sourceDateTakenMillis,durationMillis)' + ' SELECT contentId,contentId,uri,path,sourceMimeType,width,height,sourceRotationDegrees,sizeBytes,title,dateModifiedSecs,sourceDateTakenMillis,durationMillis' + ' FROM $entryTable;'); + await db.execute('DROP TABLE $entryTable;'); + await db.execute('ALTER TABLE $newEntryTable RENAME TO $entryTable;'); + }); + + // rename column `contentId` to `id` + await db.transaction((txn) async { + const newDateTakenTable = '${dateTakenTable}TEMP'; + await db.execute('CREATE TABLE $newDateTakenTable(' + 'id INTEGER PRIMARY KEY' + ', dateMillis INTEGER' + ')'); + await db.rawInsert('INSERT INTO $newDateTakenTable(id,dateMillis)' + ' SELECT contentId,dateMillis' + ' FROM $dateTakenTable;'); + await db.execute('DROP TABLE $dateTakenTable;'); + await db.execute('ALTER TABLE $newDateTakenTable RENAME TO $dateTakenTable;'); + }); + + // rename column `contentId` to `id` + await db.transaction((txn) async { + const newMetadataTable = '${metadataTable}TEMP'; + await db.execute('CREATE TABLE $newMetadataTable(' + 'id INTEGER PRIMARY KEY' + ', mimeType TEXT' + ', dateMillis INTEGER' + ', flags INTEGER' + ', rotationDegrees INTEGER' + ', xmpSubjects TEXT' + ', xmpTitleDescription TEXT' + ', latitude REAL' + ', longitude REAL' + ', rating INTEGER' + ')'); + await db.rawInsert('INSERT INTO $newMetadataTable(id,mimeType,dateMillis,flags,rotationDegrees,xmpSubjects,xmpTitleDescription,latitude,longitude,rating)' + ' SELECT contentId,mimeType,dateMillis,flags,rotationDegrees,xmpSubjects,xmpTitleDescription,latitude,longitude,rating' + ' FROM $metadataTable;'); + await db.execute('DROP TABLE $metadataTable;'); + await db.execute('ALTER TABLE $newMetadataTable RENAME TO $metadataTable;'); + }); + + // rename column `contentId` to `id` + await db.transaction((txn) async { + const newAddressTable = '${addressTable}TEMP'; + await db.execute('CREATE TABLE $newAddressTable(' + 'id INTEGER PRIMARY KEY' + ', addressLine TEXT' + ', countryCode TEXT' + ', countryName TEXT' + ', adminArea TEXT' + ', locality TEXT' + ')'); + await db.rawInsert('INSERT INTO $newAddressTable(id,addressLine,countryCode,countryName,adminArea,locality)' + ' SELECT contentId,addressLine,countryCode,countryName,adminArea,locality' + ' FROM $addressTable;'); + await db.execute('DROP TABLE $addressTable;'); + await db.execute('ALTER TABLE $newAddressTable RENAME TO $addressTable;'); + }); + + // rename column `contentId` to `id` + await db.transaction((txn) async { + const newVideoPlaybackTable = '${videoPlaybackTable}TEMP'; + await db.execute('CREATE TABLE $newVideoPlaybackTable(' + 'id INTEGER PRIMARY KEY' + ', resumeTimeMillis INTEGER' + ')'); + await db.rawInsert('INSERT INTO $newVideoPlaybackTable(id,resumeTimeMillis)' + ' SELECT contentId,resumeTimeMillis' + ' FROM $videoPlaybackTable;'); + await db.execute('DROP TABLE $videoPlaybackTable;'); + await db.execute('ALTER TABLE $newVideoPlaybackTable RENAME TO $videoPlaybackTable;'); + }); + + // rename column `contentId` to `id` + // remove column `path` + await db.transaction((txn) async { + const newFavouriteTable = '${favouriteTable}TEMP'; + await db.execute('CREATE TABLE $newFavouriteTable(' + 'id INTEGER PRIMARY KEY' + ')'); + await db.rawInsert('INSERT INTO $newFavouriteTable(id)' + ' SELECT contentId' + ' FROM $favouriteTable;'); + await db.execute('DROP TABLE $favouriteTable;'); + await db.execute('ALTER TABLE $newFavouriteTable RENAME TO $favouriteTable;'); + }); + + // rename column `contentId` to `entryId` + await db.transaction((txn) async { + const newCoverTable = '${coverTable}TEMP'; + await db.execute('CREATE TABLE $newCoverTable(' + 'filter TEXT PRIMARY KEY' + ', entryId INTEGER' + ')'); + await db.rawInsert('INSERT INTO $newCoverTable(filter,entryId)' + ' SELECT filter,contentId' + ' FROM $coverTable;'); + await db.execute('DROP TABLE $coverTable;'); + await db.execute('ALTER TABLE $newCoverTable RENAME TO $coverTable;'); + }); + + // new table + await db.execute('CREATE TABLE $trashTable(' + 'id INTEGER PRIMARY KEY' + ', path TEXT' + ', dateMillis INTEGER' + ')'); + } } diff --git a/lib/model/entry.dart b/lib/model/entry.dart index 20ee4573b..f0d2b9070 100644 --- a/lib/model/entry.dart +++ b/lib/model/entry.dart @@ -7,7 +7,9 @@ import 'package:aves/model/entry_cache.dart'; import 'package:aves/model/favourites.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/trash.dart'; import 'package:aves/model/multipage.dart'; +import 'package:aves/model/source/trash.dart'; import 'package:aves/model/video/metadata.dart'; import 'package:aves/ref/mime_types.dart'; import 'package:aves/services/common/service_policy.dart'; @@ -25,29 +27,27 @@ import 'package:latlong2/latlong.dart'; enum EntryDataType { basic, catalog, address, references } class AvesEntry { + // `sizeBytes`, `dateModifiedSecs` can be missing in viewer mode + int id; String uri; - String? _path, _directory, _filename, _extension; + String? _path, _directory, _filename, _extension, _sourceTitle; int? pageId, contentId; final String sourceMimeType; - int width; - int height; - int sourceRotationDegrees; - int? sizeBytes; - String? _sourceTitle; + int width, height, sourceRotationDegrees; + int? sizeBytes, _dateModifiedSecs, sourceDateTakenMillis, _durationMillis; + bool trashed; - // `dateModifiedSecs` can be missing in viewer mode - int? _dateModifiedSecs; - int? sourceDateTakenMillis; - int? _durationMillis; int? _catalogDateMillis; CatalogMetadata? _catalogMetadata; AddressDetails? _addressDetails; + TrashDetails? trashDetails; List? burstEntries; final AChangeNotifier imageChangeNotifier = AChangeNotifier(), metadataChangeNotifier = AChangeNotifier(), addressChangeNotifier = AChangeNotifier(); AvesEntry({ + required int? id, required this.uri, required String? path, required this.contentId, @@ -61,8 +61,9 @@ class AvesEntry { required int? dateModifiedSecs, required this.sourceDateTakenMillis, required int? durationMillis, + required this.trashed, this.burstEntries, - }) { + }) : id = id ?? 0 { this.path = path; this.sourceTitle = sourceTitle; this.dateModifiedSecs = dateModifiedSecs; @@ -74,6 +75,7 @@ class AvesEntry { bool get canHaveAlpha => MimeTypes.alphaImages.contains(mimeType); AvesEntry copyWith({ + int? id, String? uri, String? path, int? contentId, @@ -81,11 +83,12 @@ class AvesEntry { int? dateModifiedSecs, List? burstEntries, }) { - final copyContentId = contentId ?? this.contentId; + final copyEntryId = id ?? this.id; final copied = AvesEntry( + id: copyEntryId, uri: uri ?? this.uri, path: path ?? this.path, - contentId: copyContentId, + contentId: contentId ?? this.contentId, pageId: null, sourceMimeType: sourceMimeType, width: width, @@ -96,10 +99,12 @@ class AvesEntry { dateModifiedSecs: dateModifiedSecs ?? this.dateModifiedSecs, sourceDateTakenMillis: sourceDateTakenMillis, durationMillis: durationMillis, + trashed: trashed, burstEntries: burstEntries ?? this.burstEntries, ) - ..catalogMetadata = _catalogMetadata?.copyWith(contentId: copyContentId) - ..addressDetails = _addressDetails?.copyWith(contentId: copyContentId); + ..catalogMetadata = _catalogMetadata?.copyWith(id: copyEntryId) + ..addressDetails = _addressDetails?.copyWith(id: copyEntryId) + ..trashDetails = trashDetails?.copyWith(id: copyEntryId); return copied; } @@ -107,6 +112,7 @@ class AvesEntry { // from DB or platform source entry factory AvesEntry.fromMap(Map map) { return AvesEntry( + id: map['id'] as int?, uri: map['uri'] as String, path: map['path'] as String?, pageId: null, @@ -120,12 +126,14 @@ class AvesEntry { dateModifiedSecs: map['dateModifiedSecs'] as int?, sourceDateTakenMillis: map['sourceDateTakenMillis'] as int?, durationMillis: map['durationMillis'] as int?, + trashed: (map['trashed'] as int? ?? 0) != 0, ); } // for DB only Map toMap() { return { + 'id': id, 'uri': uri, 'path': path, 'contentId': contentId, @@ -138,6 +146,7 @@ class AvesEntry { 'dateModifiedSecs': dateModifiedSecs, 'sourceDateTakenMillis': sourceDateTakenMillis, 'durationMillis': durationMillis, + 'trashed': trashed ? 1 : 0, }; } @@ -151,7 +160,7 @@ class AvesEntry { // so that we can reliably use instances in a `Set`, which requires consistent hash codes over time @override - String toString() => '$runtimeType#${shortHash(this)}{uri=$uri, path=$path, pageId=$pageId}'; + String toString() => '$runtimeType#${shortHash(this)}{id=$id, uri=$uri, path=$path, pageId=$pageId}'; set path(String? path) { _path = path; @@ -179,7 +188,10 @@ class AvesEntry { return _extension; } - bool get isMissingAtPath => path != null && !File(path!).existsSync(); + bool get isMissingAtPath { + final effectivePath = trashed ? trashDetails?.path : path; + return effectivePath != null && !File(effectivePath).existsSync(); + } // the MIME type reported by the Media Store is unreliable // so we use the one found during cataloguing if possible @@ -233,7 +245,7 @@ class AvesEntry { bool get is360 => _catalogMetadata?.is360 ?? false; - bool get canEdit => path != null; + bool get canEdit => path != null && !trashed; bool get canEditDate => canEdit && (canEditExif || canEditXmp); @@ -408,6 +420,18 @@ class AvesEntry { return _durationText!; } + bool get isExpiredTrash { + final dateMillis = trashDetails?.dateMillis; + if (dateMillis == null) return false; + return DateTime.fromMillisecondsSinceEpoch(dateMillis).add(TrashMixin.binKeepDuration).isBefore(DateTime.now()); + } + + int? get trashDaysLeft { + final dateMillis = trashDetails?.dateMillis; + if (dateMillis == null) return null; + return DateTime.fromMillisecondsSinceEpoch(dateMillis).add(TrashMixin.binKeepDuration).difference(DateTime.now()).inDays; + } + // returns whether this entry has GPS coordinates // (0, 0) coordinates are considered invalid, as it is likely a default value bool get hasGps => (_catalogMetadata?.latitude ?? 0) != 0 || (_catalogMetadata?.longitude ?? 0) != 0; @@ -476,7 +500,7 @@ class AvesEntry { }; await applyNewFields(fields, persist: persist); } - catalogMetadata = CatalogMetadata(contentId: contentId); + catalogMetadata = CatalogMetadata(id: id); } else { if (isVideo && (!isSized || durationMillis == 0)) { // exotic video that is not sized during loading @@ -519,7 +543,7 @@ class AvesEntry { void setCountry(CountryCode? countryCode) { if (hasFineAddress || countryCode == null) return; addressDetails = AddressDetails( - contentId: contentId, + id: id, countryCode: countryCode.alpha2, countryName: countryCode.alpha3, ); @@ -542,7 +566,7 @@ class AvesEntry { final cn = address.countryName; final aa = address.adminArea; addressDetails = AddressDetails( - contentId: contentId, + id: id, countryCode: cc, countryName: cn, adminArea: aa, @@ -638,7 +662,7 @@ class AvesEntry { _tags = null; if (persist) { - await metadataDb.removeIds({contentId!}, dataTypes: dataTypes); + await metadataDb.removeIds({id}, dataTypes: dataTypes); } final updatedEntry = await mediaFileService.getEntry(uri, mimeType); @@ -689,7 +713,7 @@ class AvesEntry { Future removeFromFavourites() async { if (isFavourite) { - await favourites.remove({this}); + await favourites.removeEntries({this}); } } @@ -720,7 +744,7 @@ class AvesEntry { pages: burstEntries! .mapIndexed((index, entry) => SinglePageInfo( index: index, - pageId: entry.contentId!, + pageId: entry.id, isDefault: index == 0, uri: entry.uri, mimeType: entry.mimeType, diff --git a/lib/model/favourites.dart b/lib/model/favourites.dart index cc8768f1e..edfb2406e 100644 --- a/lib/model/favourites.dart +++ b/lib/model/favourites.dart @@ -19,11 +19,11 @@ class Favourites with ChangeNotifier { int get count => _rows.length; - Set get all => Set.unmodifiable(_rows.map((v) => v.contentId)); + Set get all => Set.unmodifiable(_rows.map((v) => v.entryId)); - bool isFavourite(AvesEntry entry) => _rows.any((row) => row.contentId == entry.contentId); + bool isFavourite(AvesEntry entry) => _rows.any((row) => row.entryId == entry.id); - FavouriteRow _entryToRow(AvesEntry entry) => FavouriteRow(contentId: entry.contentId!, path: entry.path!); + FavouriteRow _entryToRow(AvesEntry entry) => FavouriteRow(entryId: entry.id); Future add(Set entries) async { final newRows = entries.map(_entryToRow); @@ -34,9 +34,10 @@ class Favourites with ChangeNotifier { notifyListeners(); } - Future remove(Set entries) async { - final contentIds = entries.map((entry) => entry.contentId).toSet(); - final removedRows = _rows.where((row) => contentIds.contains(row.contentId)).toSet(); + Future removeEntries(Set entries) => removeIds(entries.map((entry) => entry.id).toSet()); + + Future removeIds(Set entryIds) async { + final removedRows = _rows.where((row) => entryIds.contains(row.entryId)).toSet(); await metadataDb.removeFavourites(removedRows); removedRows.forEach(_rows.remove); @@ -44,19 +45,6 @@ class Favourites with ChangeNotifier { notifyListeners(); } - Future moveEntry(int oldContentId, AvesEntry entry) async { - final oldRow = _rows.firstWhereOrNull((row) => row.contentId == oldContentId); - if (oldRow == null) return; - - final newRow = _entryToRow(entry); - - await metadataDb.updateFavouriteId(oldContentId, newRow); - _rows.remove(oldRow); - _rows.add(newRow); - - notifyListeners(); - } - Future clear() async { await metadataDb.clearFavourites(); _rows.clear(); @@ -69,7 +57,7 @@ class Favourites with ChangeNotifier { Map>? export(CollectionSource source) { final visibleEntries = source.visibleEntries; final ids = favourites.all; - final paths = visibleEntries.where((entry) => ids.contains(entry.contentId)).map((entry) => entry.path).whereNotNull().toSet(); + final paths = visibleEntries.where((entry) => ids.contains(entry.id)).map((entry) => entry.path).whereNotNull().toSet(); final byVolume = groupBy(paths, androidFileUtils.getStorageVolume); final jsonMap = Map.fromEntries(byVolume.entries.map((kv) { final volume = kv.key?.path; @@ -117,26 +105,22 @@ class Favourites with ChangeNotifier { @immutable class FavouriteRow extends Equatable { - final int contentId; - final String path; + final int entryId; @override - List get props => [contentId, path]; + List get props => [entryId]; const FavouriteRow({ - required this.contentId, - required this.path, + required this.entryId, }); factory FavouriteRow.fromMap(Map map) { return FavouriteRow( - contentId: map['contentId'] ?? 0, - path: map['path'] ?? '', + entryId: map['id'] as int, ); } Map toMap() => { - 'contentId': contentId, - 'path': path, + 'id': entryId, }; } diff --git a/lib/model/filters/filters.dart b/lib/model/filters/filters.dart index 058715629..2c9da7615 100644 --- a/lib/model/filters/filters.dart +++ b/lib/model/filters/filters.dart @@ -10,6 +10,7 @@ import 'package:aves/model/filters/path.dart'; import 'package:aves/model/filters/query.dart'; import 'package:aves/model/filters/rating.dart'; import 'package:aves/model/filters/tag.dart'; +import 'package:aves/model/filters/trash.dart'; import 'package:aves/model/filters/type.dart'; import 'package:aves/utils/color_utils.dart'; import 'package:collection/collection.dart'; @@ -20,6 +21,7 @@ import 'package:flutter/widgets.dart'; @immutable abstract class CollectionFilter extends Equatable implements Comparable { static const List categoryOrder = [ + TrashFilter.type, QueryFilter.type, MimeFilter.type, AlbumFilter.type, @@ -64,6 +66,8 @@ abstract class CollectionFilter extends Equatable implements Comparable entry.contentId == id; + _test = (entry) => entry.id == id; return; } diff --git a/lib/model/filters/trash.dart b/lib/model/filters/trash.dart new file mode 100644 index 000000000..b2e9da0c8 --- /dev/null +++ b/lib/model/filters/trash.dart @@ -0,0 +1,38 @@ +import 'package:aves/model/filters/filters.dart'; +import 'package:aves/theme/icons.dart'; +import 'package:flutter/material.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; + +class TrashFilter extends CollectionFilter { + static const type = 'trash'; + + static const instance = TrashFilter._private(); + + @override + List get props => []; + + const TrashFilter._private(); + + @override + Map toMap() => { + 'type': type, + }; + + @override + EntryFilter get test => (entry) => entry.trashed; + + @override + String get universalLabel => type; + + @override + String getLabel(BuildContext context) => context.l10n.binPageTitle; + + @override + Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(AIcons.bin, size: size); + + @override + String get category => type; + + @override + String get key => type; +} diff --git a/lib/model/metadata/address.dart b/lib/model/metadata/address.dart index d7e5f232e..b05ecd988 100644 --- a/lib/model/metadata/address.dart +++ b/lib/model/metadata/address.dart @@ -4,16 +4,16 @@ import 'package:flutter/widgets.dart'; @immutable class AddressDetails extends Equatable { - final int? contentId; + final int id; final String? countryCode, countryName, adminArea, locality; String? get place => locality != null && locality!.isNotEmpty ? locality : adminArea; @override - List get props => [contentId, countryCode, countryName, adminArea, locality]; + List get props => [id, countryCode, countryName, adminArea, locality]; const AddressDetails({ - this.contentId, + required this.id, this.countryCode, this.countryName, this.adminArea, @@ -21,10 +21,10 @@ class AddressDetails extends Equatable { }); AddressDetails copyWith({ - int? contentId, + int? id, }) { return AddressDetails( - contentId: contentId ?? this.contentId, + id: id ?? this.id, countryCode: countryCode, countryName: countryName, adminArea: adminArea, @@ -34,7 +34,7 @@ class AddressDetails extends Equatable { factory AddressDetails.fromMap(Map map) { return AddressDetails( - contentId: map['contentId'] as int?, + id: map['id'] as int, countryCode: map['countryCode'] as String?, countryName: map['countryName'] as String?, adminArea: map['adminArea'] as String?, @@ -43,7 +43,7 @@ class AddressDetails extends Equatable { } Map toMap() => { - 'contentId': contentId, + 'id': id, 'countryCode': countryCode, 'countryName': countryName, 'adminArea': adminArea, diff --git a/lib/model/metadata/catalog.dart b/lib/model/metadata/catalog.dart index 008065451..2c380018f 100644 --- a/lib/model/metadata/catalog.dart +++ b/lib/model/metadata/catalog.dart @@ -2,7 +2,8 @@ import 'package:aves/services/geocoding_service.dart'; import 'package:flutter/foundation.dart'; class CatalogMetadata { - final int? contentId, dateMillis; + final int id; + final int? dateMillis; final bool isAnimated, isGeotiff, is360, isMultiPage; bool isFlipped; int? rotationDegrees; @@ -19,7 +20,7 @@ class CatalogMetadata { static const _isMultiPageMask = 1 << 4; CatalogMetadata({ - this.contentId, + required this.id, this.mimeType, this.dateMillis, this.isAnimated = false, @@ -49,14 +50,14 @@ class CatalogMetadata { } CatalogMetadata copyWith({ - int? contentId, + int? id, String? mimeType, int? dateMillis, bool? isMultiPage, int? rotationDegrees, }) { return CatalogMetadata( - contentId: contentId ?? this.contentId, + id: id ?? this.id, mimeType: mimeType ?? this.mimeType, dateMillis: dateMillis ?? this.dateMillis, isAnimated: isAnimated, @@ -76,7 +77,7 @@ class CatalogMetadata { factory CatalogMetadata.fromMap(Map map) { final flags = map['flags'] ?? 0; return CatalogMetadata( - contentId: map['contentId'], + id: map['id'], mimeType: map['mimeType'], dateMillis: map['dateMillis'] ?? 0, isAnimated: flags & _isAnimatedMask != 0, @@ -95,7 +96,7 @@ class CatalogMetadata { } Map toMap() => { - 'contentId': contentId, + 'id': id, 'mimeType': mimeType, 'dateMillis': dateMillis, 'flags': (isAnimated ? _isAnimatedMask : 0) | (isFlipped ? _isFlippedMask : 0) | (isGeotiff ? _isGeotiffMask : 0) | (is360 ? _is360Mask : 0) | (isMultiPage ? _isMultiPageMask : 0), @@ -108,5 +109,5 @@ class CatalogMetadata { }; @override - String toString() => '$runtimeType#${shortHash(this)}{contentId=$contentId, mimeType=$mimeType, dateMillis=$dateMillis, isAnimated=$isAnimated, isFlipped=$isFlipped, isGeotiff=$isGeotiff, is360=$is360, isMultiPage=$isMultiPage, rotationDegrees=$rotationDegrees, xmpSubjects=$xmpSubjects, xmpTitleDescription=$xmpTitleDescription, latitude=$latitude, longitude=$longitude, rating=$rating}'; + String toString() => '$runtimeType#${shortHash(this)}{id=$id, mimeType=$mimeType, dateMillis=$dateMillis, isAnimated=$isAnimated, isFlipped=$isFlipped, isGeotiff=$isGeotiff, is360=$is360, isMultiPage=$isMultiPage, rotationDegrees=$rotationDegrees, xmpSubjects=$xmpSubjects, xmpTitleDescription=$xmpTitleDescription, latitude=$latitude, longitude=$longitude, rating=$rating}'; } diff --git a/lib/model/metadata/trash.dart b/lib/model/metadata/trash.dart new file mode 100644 index 000000000..260661d29 --- /dev/null +++ b/lib/model/metadata/trash.dart @@ -0,0 +1,42 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; + +@immutable +class TrashDetails extends Equatable { + final int id; + final String path; + final int dateMillis; + + @override + List get props => [id, path, dateMillis]; + + const TrashDetails({ + required this.id, + required this.path, + required this.dateMillis, + }); + + TrashDetails copyWith({ + int? id, + }) { + return TrashDetails( + id: id ?? this.id, + path: path, + dateMillis: dateMillis, + ); + } + + factory TrashDetails.fromMap(Map map) { + return TrashDetails( + id: map['id'] as int, + path: map['path'] as String, + dateMillis: map['dateMillis'] as int, + ); + } + + Map toMap() => { + 'id': id, + 'path': path, + 'dateMillis': dateMillis, + }; +} diff --git a/lib/model/multipage.dart b/lib/model/multipage.dart index 7593a4c0b..6e3ad53d8 100644 --- a/lib/model/multipage.dart +++ b/lib/model/multipage.dart @@ -87,7 +87,11 @@ class MultiPageInfo { // and retrieve cached images for it final pageId = eraseDefaultPageId && pageInfo.isDefault ? null : pageInfo.pageId; + // dynamically extracted video is not in the trash like the original motion photo + final trashed = (mainEntry.isMotionPhoto && pageInfo.isVideo) ? false : mainEntry.trashed; + return AvesEntry( + id: mainEntry.id, uri: pageInfo.uri ?? mainEntry.uri, path: mainEntry.path, contentId: mainEntry.contentId, @@ -101,13 +105,15 @@ class MultiPageInfo { dateModifiedSecs: mainEntry.dateModifiedSecs, sourceDateTakenMillis: mainEntry.sourceDateTakenMillis, durationMillis: pageInfo.durationMillis ?? mainEntry.durationMillis, + trashed: trashed, ) ..catalogMetadata = mainEntry.catalogMetadata?.copyWith( mimeType: pageInfo.mimeType, isMultiPage: false, rotationDegrees: pageInfo.rotationDegrees, ) - ..addressDetails = mainEntry.addressDetails?.copyWith(); + ..addressDetails = mainEntry.addressDetails?.copyWith() + ..trashDetails = trashed ? mainEntry.trashDetails : null; } @override diff --git a/lib/model/settings/defaults.dart b/lib/model/settings/defaults.dart index 41306eafa..bde23b6fa 100644 --- a/lib/model/settings/defaults.dart +++ b/lib/model/settings/defaults.dart @@ -100,6 +100,9 @@ class SettingsDefaults { // search static const saveSearchHistory = true; + // bin + static const enableBin = true; + // accessibility static const accessibilityAnimations = AccessibilityAnimations.system; static const timeToTakeAction = AccessibilityTimeout.appDefault; // `timeToTakeAction` has a contextual default value diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index a1ca41cae..7643136ac 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -111,6 +111,9 @@ class Settings extends ChangeNotifier { static const saveSearchHistoryKey = 'save_search_history'; static const searchHistoryKey = 'search_history'; + // bin + static const enableBinKey = 'enable_bin'; + // accessibility static const accessibilityAnimationsKey = 'accessibility_animations'; static const timeToTakeActionKey = 'time_to_take_action'; @@ -462,6 +465,12 @@ class Settings extends ChangeNotifier { set searchHistory(List newValue) => setAndNotify(searchHistoryKey, newValue.map((filter) => filter.toJson()).toList()); + // bin + + bool get enableBin => getBoolOrDefault(enableBinKey, SettingsDefaults.enableBin); + + set enableBin(bool newValue) => setAndNotify(enableBinKey, newValue); + // accessibility AccessibilityAnimations get accessibilityAnimations => getEnumOrDefault(accessibilityAnimationsKey, SettingsDefaults.accessibilityAnimations, AccessibilityAnimations.values); diff --git a/lib/model/settings/store/store_shared_pref.dart b/lib/model/settings/store/store_shared_pref.dart index 8f5019cf5..d7d6fd6fd 100644 --- a/lib/model/settings/store/store_shared_pref.dart +++ b/lib/model/settings/store/store_shared_pref.dart @@ -1,4 +1,5 @@ import 'package:aves/model/settings/store/store.dart'; +import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; class SharedPrefSettingsStore implements SettingsStore { @@ -9,7 +10,11 @@ class SharedPrefSettingsStore implements SettingsStore { @override Future init() async { - _prefs = await SharedPreferences.getInstance(); + try { + _prefs = await SharedPreferences.getInstance(); + } catch (error, stack) { + debugPrint('$runtimeType init error=$error\n$stack'); + } } @override diff --git a/lib/model/source/analysis_controller.dart b/lib/model/source/analysis_controller.dart index aeac9dd31..c4e1e9e41 100644 --- a/lib/model/source/analysis_controller.dart +++ b/lib/model/source/analysis_controller.dart @@ -2,12 +2,12 @@ import 'package:flutter/foundation.dart'; class AnalysisController { final bool canStartService, force; - final List? contentIds; + final List? entryIds; final ValueNotifier stopSignal; AnalysisController({ this.canStartService = true, - this.contentIds, + this.entryIds, this.force = false, ValueNotifier? stopSignal, }) : stopSignal = stopSignal ?? ValueNotifier(false); diff --git a/lib/model/source/collection_lens.dart b/lib/model/source/collection_lens.dart index 301693be0..3f1d2fddb 100644 --- a/lib/model/source/collection_lens.dart +++ b/lib/model/source/collection_lens.dart @@ -10,6 +10,7 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/filters/query.dart'; import 'package:aves/model/filters/rating.dart'; +import 'package:aves/model/filters/trash.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/events.dart'; @@ -53,9 +54,18 @@ class CollectionLens with ChangeNotifier { _subscriptions.add(sourceEvents.on().listen((e) => _onEntryAdded(e.entries))); _subscriptions.add(sourceEvents.on().listen((e) => _onEntryRemoved(e.entries))); _subscriptions.add(sourceEvents.on().listen((e) { - if (e.type == MoveType.move) { - // refreshing copied items is already handled via `EntryAddedEvent`s - _refresh(); + switch (e.type) { + case MoveType.copy: + case MoveType.export: + // refreshing new items is already handled via `EntryAddedEvent`s + break; + case MoveType.move: + case MoveType.fromBin: + _refresh(); + break; + case MoveType.toBin: + _onEntryRemoved(e.entries); + break; } })); _subscriptions.add(sourceEvents.on().listen((e) => _refresh())); @@ -167,7 +177,7 @@ class CollectionLens with ChangeNotifier { final bool groupBursts = true; void _applyFilters() { - final entries = fixedSelection ?? source.visibleEntries; + final entries = fixedSelection ?? (filters.contains(TrashFilter.instance) ? source.trashedEntries : source.visibleEntries); _filteredSortedEntries = List.of(filters.isEmpty ? entries : entries.where((entry) => filters.every((filter) => filter.test(entry)))); if (groupBursts) { diff --git a/lib/model/source/collection_source.dart b/lib/model/source/collection_source.dart index 0b151aefc..0d753ebbc 100644 --- a/lib/model/source/collection_source.dart +++ b/lib/model/source/collection_source.dart @@ -8,6 +8,8 @@ import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/location.dart'; import 'package:aves/model/filters/tag.dart'; +import 'package:aves/model/filters/trash.dart'; +import 'package:aves/model/metadata/trash.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/album.dart'; import 'package:aves/model/source/analysis_controller.dart'; @@ -15,6 +17,7 @@ import 'package:aves/model/source/enums.dart'; import 'package:aves/model/source/events.dart'; import 'package:aves/model/source/location.dart'; import 'package:aves/model/source/tag.dart'; +import 'package:aves/model/source/trash.dart'; import 'package:aves/services/analysis_service.dart'; import 'package:aves/services/common/image_op_events.dart'; import 'package:aves/services/common/services.dart'; @@ -25,10 +28,12 @@ import 'package:flutter/foundation.dart'; mixin SourceBase { EventBus get eventBus; - Map get entryById; + Map get entryById; Set get visibleEntries; + Set get trashedEntries; + List get sortedEntriesByDate; ValueNotifier stateNotifier = ValueNotifier(SourceState.ready); @@ -38,7 +43,7 @@ mixin SourceBase { void setProgress({required int done, required int total}) => progressNotifier.value = ProgressEvent(done: done, total: total); } -abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagMixin { +abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagMixin, TrashMixin { CollectionSource() { settings.updateStream.where((key) => key == Settings.localeKey).listen((_) => invalidateAlbumDisplayNames()); } @@ -48,16 +53,16 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM @override EventBus get eventBus => _eventBus; - final Map _entryById = {}; + final Map _entryById = {}; @override - Map get entryById => Map.unmodifiable(_entryById); + Map get entryById => Map.unmodifiable(_entryById); final Set _rawEntries = {}; Set get allEntries => Set.unmodifiable(_rawEntries); - Set? _visibleEntries; + Set? _visibleEntries, _trashedEntries; @override Set get visibleEntries { @@ -65,6 +70,12 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM return _visibleEntries!; } + @override + Set get trashedEntries { + _trashedEntries ??= Set.unmodifiable(_applyTrashFilter(_rawEntries)); + return _trashedEntries!; + } + List? _sortedEntriesByDate; @override @@ -73,6 +84,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM return _sortedEntriesByDate!; } + // known date by entry ID late Map _savedDates; Future loadDates() async { @@ -80,12 +92,20 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM } Iterable _applyHiddenFilters(Iterable entries) { - final hiddenFilters = settings.hiddenFilters; - return hiddenFilters.isEmpty ? entries : entries.where((entry) => !hiddenFilters.any((filter) => filter.test(entry))); + final hiddenFilters = { + TrashFilter.instance, + ...settings.hiddenFilters, + }; + return entries.where((entry) => !hiddenFilters.any((filter) => filter.test(entry))); + } + + Iterable _applyTrashFilter(Iterable entries) { + return entries.where(TrashFilter.instance.test); } void _invalidate([Set? entries]) { _visibleEntries = null; + _trashedEntries = null; _sortedEntriesByDate = null; invalidateAlbumFilterSummary(entries: entries); invalidateCountryFilterSummary(entries: entries); @@ -104,14 +124,14 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM void addEntries(Set entries) { if (entries.isEmpty) return; - final newIdMapEntries = Map.fromEntries(entries.map((v) => MapEntry(v.contentId, v))); + final newIdMapEntries = Map.fromEntries(entries.map((entry) => MapEntry(entry.id, entry))); if (_rawEntries.isNotEmpty) { - final newContentIds = newIdMapEntries.keys.toSet(); - _rawEntries.removeWhere((entry) => newContentIds.contains(entry.contentId)); + final newIds = newIdMapEntries.keys.toSet(); + _rawEntries.removeWhere((entry) => newIds.contains(entry.id)); } entries.where((entry) => entry.catalogDateMillis == null).forEach((entry) { - entry.catalogDateMillis = _savedDates[entry.contentId]; + entry.catalogDateMillis = _savedDates[entry.id]; }); _entryById.addAll(newIdMapEntries); @@ -122,14 +142,21 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM eventBus.fire(EntryAddedEvent(entries)); } - Future removeEntries(Set uris) async { + Future removeEntries(Set uris, {required bool includeTrash}) async { if (uris.isEmpty) return; - final entries = _rawEntries.where((entry) => uris.contains(entry.uri)).toSet(); - await favourites.remove(entries); - await covers.removeEntries(entries); - await metadataDb.removeVideoPlayback(entries.map((entry) => entry.contentId).whereNotNull().toSet()); - entries.forEach((v) => _entryById.remove(v.contentId)); + final entries = _rawEntries.where((entry) => uris.contains(entry.uri)).toSet(); + if (!includeTrash) { + entries.removeWhere(TrashFilter.instance.test); + } + if (entries.isEmpty) return; + + final ids = entries.map((entry) => entry.id).toSet(); + await favourites.removeIds(ids); + await covers.removeIds(ids); + await metadataDb.removeIds(ids); + + ids.forEach((id) => _entryById.remove); _rawEntries.removeAll(entries); updateDerivedFilters(entries); eventBus.fire(EntryRemovedEvent(entries)); @@ -146,27 +173,51 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM } Future _moveEntry(AvesEntry entry, Map newFields, {required bool persist}) async { - final oldContentId = entry.contentId!; - final newContentId = newFields['contentId'] as int?; + newFields.keys.forEach((key) { + switch (key) { + case 'contentId': + entry.contentId = newFields['contentId'] as int?; + break; + case 'dateModifiedSecs': + // `dateModifiedSecs` changes when moving entries to another directory, + // but it does not change when renaming the containing directory + entry.dateModifiedSecs = newFields['dateModifiedSecs'] as int?; + break; + case 'path': + entry.path = newFields['path'] as String?; + break; + case 'title': + entry.sourceTitle = newFields['title'] as String?; + break; + case 'trashed': + final trashed = newFields['trashed'] as bool; + entry.trashed = trashed; + entry.trashDetails = trashed + ? TrashDetails( + id: entry.id, + path: newFields['trashPath'] as String, + dateMillis: DateTime.now().millisecondsSinceEpoch, + ) + : null; + break; + case 'uri': + entry.uri = newFields['uri'] as String; + break; + } + }); + if (entry.trashed) { + entry.contentId = null; + entry.uri = 'file://${entry.trashDetails?.path}'; + } - entry.contentId = newContentId; - // `dateModifiedSecs` changes when moving entries to another directory, - // but it does not change when renaming the containing directory - if (newFields.containsKey('dateModifiedSecs')) entry.dateModifiedSecs = newFields['dateModifiedSecs'] as int?; - if (newFields.containsKey('path')) entry.path = newFields['path'] as String?; - if (newFields.containsKey('uri')) entry.uri = newFields['uri'] as String; - if (newFields.containsKey('title')) entry.sourceTitle = newFields['title'] as String?; - - entry.catalogMetadata = entry.catalogMetadata?.copyWith(contentId: newContentId); - entry.addressDetails = entry.addressDetails?.copyWith(contentId: newContentId); + await covers.moveEntry(entry, persist: persist); if (persist) { - await metadataDb.updateEntryId(oldContentId, entry); - await metadataDb.updateMetadataId(oldContentId, entry.catalogMetadata); - await metadataDb.updateAddressId(oldContentId, entry.addressDetails); - await favourites.moveEntry(oldContentId, entry); - await covers.moveEntry(oldContentId, entry); - await metadataDb.updateVideoPlaybackId(oldContentId, entry.contentId); + final id = entry.id; + await metadataDb.updateEntry(id, entry); + await metadataDb.updateMetadata(id, entry.catalogMetadata); + await metadataDb.updateAddress(id, entry.addressDetails); + await metadataDb.updateTrash(id, entry.trashDetails); } } @@ -202,42 +253,40 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM return success; } - Future renameAlbum(String sourceAlbum, String destinationAlbum, Set todoEntries, Set movedOps) async { + Future renameAlbum(String sourceAlbum, String destinationAlbum, Set entries, Set movedOps) async { final oldFilter = AlbumFilter(sourceAlbum, null); - final bookmarked = settings.drawerAlbumBookmarks?.contains(sourceAlbum) == true; + final newFilter = AlbumFilter(destinationAlbum, null); + + final bookmark = settings.drawerAlbumBookmarks?.indexOf(sourceAlbum); final pinned = settings.pinnedFilters.contains(oldFilter); - final oldCoverContentId = covers.coverContentId(oldFilter); - final coverEntry = oldCoverContentId != null ? todoEntries.firstWhereOrNull((entry) => entry.contentId == oldCoverContentId) : null; + await covers.set(newFilter, covers.coverEntryId(oldFilter)); renameNewAlbum(sourceAlbum, destinationAlbum); await updateAfterMove( - todoEntries: todoEntries, - copy: false, - destinationAlbum: destinationAlbum, + todoEntries: entries, + moveType: MoveType.move, + destinationAlbums: {destinationAlbum}, movedOps: movedOps, ); - // restore bookmark, pin and cover, as the obsolete album got removed and its associated state cleaned - final newFilter = AlbumFilter(destinationAlbum, null); - if (bookmarked) { - settings.drawerAlbumBookmarks = settings.drawerAlbumBookmarks?..add(destinationAlbum); + // restore bookmark and pin, as the obsolete album got removed and its associated state cleaned + if (bookmark != null && bookmark != -1) { + settings.drawerAlbumBookmarks = settings.drawerAlbumBookmarks?..insert(bookmark, destinationAlbum); } if (pinned) { settings.pinnedFilters = settings.pinnedFilters..add(newFilter); } - if (coverEntry != null) { - await covers.set(newFilter, coverEntry.contentId); - } } Future updateAfterMove({ required Set todoEntries, - required bool copy, - required String destinationAlbum, + required MoveType moveType, + required Set destinationAlbums, required Set movedOps, }) async { if (movedOps.isEmpty) return; final fromAlbums = {}; final movedEntries = {}; + final copy = moveType == MoveType.copy; if (copy) { movedOps.forEach((movedOp) { final sourceUri = movedOp.uri; @@ -246,6 +295,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM if (sourceEntry != null) { fromAlbums.add(sourceEntry.directory); movedEntries.add(sourceEntry.copyWith( + id: metadataDb.nextId, uri: newFields['uri'] as String?, path: newFields['path'] as String?, contentId: newFields['contentId'] as int?, @@ -267,7 +317,11 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM final sourceUri = movedOp.uri; final entry = todoEntries.firstWhereOrNull((entry) => entry.uri == sourceUri); if (entry != null) { - fromAlbums.add(entry.directory); + if (moveType == MoveType.fromBin) { + newFields['trashed'] = false; + } else { + fromAlbums.add(entry.directory); + } movedEntries.add(entry); await _moveEntry(entry, newFields, persist: true); } @@ -279,11 +333,13 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM addEntries(movedEntries); } else { cleanEmptyAlbums(fromAlbums); - addDirectories({destinationAlbum}); + if (moveType != MoveType.toBin) { + addDirectories(destinationAlbums); + } } invalidateAlbumFilterSummary(directories: fromAlbums); _invalidate(movedEntries); - eventBus.fire(EntryMovedEvent(copy ? MoveType.copy : MoveType.move, movedEntries)); + eventBus.fire(EntryMovedEvent(moveType, movedEntries)); } bool get initialized => false; @@ -298,13 +354,13 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM await entry.refresh(background: false, persist: true, dataTypes: dataTypes, geocoderLocale: settings.appliedLocale); // update/delete in DB - final contentId = entry.contentId!; + final id = entry.id; if (dataTypes.contains(EntryDataType.catalog)) { - await metadataDb.updateMetadataId(contentId, entry.catalogMetadata); + await metadataDb.updateMetadata(id, entry.catalogMetadata); onCatalogMetadataChanged(); } if (dataTypes.contains(EntryDataType.address)) { - await metadataDb.updateAddressId(contentId, entry.addressDetails); + await metadataDb.updateAddress(id, entry.addressDetails); onAddressMetadataChanged(); } @@ -338,7 +394,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM if (startAnalysisService) { await AnalysisService.startService( force: force, - contentIds: entries?.map((entry) => entry.contentId).whereNotNull().toList(), + entryIds: entries?.map((entry) => entry.id).toList(), ); } else { await catalogEntries(_analysisController, todoEntries); @@ -377,9 +433,9 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM } AvesEntry? coverEntry(CollectionFilter filter) { - final contentId = covers.coverContentId(filter); - if (contentId != null) { - final entry = visibleEntries.firstWhereOrNull((entry) => entry.contentId == contentId); + final id = covers.coverEntryId(filter); + if (id != null) { + final entry = visibleEntries.firstWhereOrNull((entry) => entry.id == id); if (entry != null) return entry; } return recentEntry(filter); diff --git a/lib/model/source/location.dart b/lib/model/source/location.dart index dbabb7954..ffffd7af0 100644 --- a/lib/model/source/location.dart +++ b/lib/model/source/location.dart @@ -23,7 +23,7 @@ mixin LocationMixin on SourceBase { Future loadAddresses() async { final saved = await metadataDb.loadAllAddresses(); final idMap = entryById; - saved.forEach((metadata) => idMap[metadata.contentId]?.addressDetails = metadata); + saved.forEach((metadata) => idMap[metadata.id]?.addressDetails = metadata); onAddressMetadataChanged(); } @@ -31,7 +31,7 @@ mixin LocationMixin on SourceBase { await _locateCountries(controller, candidateEntries); await _locatePlaces(controller, candidateEntries); - final unlocatedIds = candidateEntries.where((entry) => !entry.hasGps).map((entry) => entry.contentId).whereNotNull().toSet(); + final unlocatedIds = candidateEntries.where((entry) => !entry.hasGps).map((entry) => entry.id).toSet(); if (unlocatedIds.isNotEmpty) { await metadataDb.removeIds(unlocatedIds, dataTypes: {EntryDataType.address}); onAddressMetadataChanged(); @@ -115,7 +115,7 @@ mixin LocationMixin on SourceBase { for (final entry in todo) { final latLng = approximateLatLng(entry); if (knownLocations.containsKey(latLng)) { - entry.addressDetails = knownLocations[latLng]?.copyWith(contentId: entry.contentId); + entry.addressDetails = knownLocations[latLng]?.copyWith(id: entry.id); } else { await entry.locatePlace(background: true, force: force, geocoderLocale: settings.appliedLocale); // it is intended to insert `null` if the geocoder failed, diff --git a/lib/model/source/media_store_source.dart b/lib/model/source/media_store_source.dart index d30a663d7..3f7262589 100644 --- a/lib/model/source/media_store_source.dart +++ b/lib/model/source/media_store_source.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:aves/model/covers.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/favourites.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/analysis_controller.dart'; import 'package:aves/model/source/collection_source.dart'; @@ -50,31 +51,33 @@ class MediaStoreSource extends CollectionSource { stateNotifier.value = SourceState.loading; clearEntries(); - final topIds = settings.topEntryIds; - late final Set topEntries; - if (topIds != null) { - debugPrint('$runtimeType refresh ${stopwatch.elapsed} load ${topIds.length} top entries'); - topEntries = await metadataDb.loadEntries(topIds); - addEntries(topEntries); - } else { - topEntries = {}; + final Set topEntries = {}; + if (settings.homePage == HomePageSetting.collection) { + final topIds = settings.topEntryIds; + if (topIds != null) { + debugPrint('$runtimeType refresh ${stopwatch.elapsed} load ${topIds.length} top entries'); + topEntries.addAll(await metadataDb.loadEntries(topIds)); + addEntries(topEntries); + } } debugPrint('$runtimeType refresh ${stopwatch.elapsed} fetch known entries'); - final oldEntries = await metadataDb.loadAllEntries(); - debugPrint('$runtimeType refresh ${stopwatch.elapsed} check obsolete entries'); - final knownDateById = Map.fromEntries(oldEntries.map((entry) => MapEntry(entry.contentId!, entry.dateModifiedSecs!))); - final obsoleteContentIds = (await mediaStoreService.checkObsoleteContentIds(knownDateById.keys.toList())).toSet(); - oldEntries.removeWhere((entry) => obsoleteContentIds.contains(entry.contentId)); + final knownEntries = await metadataDb.loadAllEntries(); + final knownLiveEntries = knownEntries.where((entry) => !entry.trashed).toSet(); + debugPrint('$runtimeType refresh ${stopwatch.elapsed} check obsolete entries'); + final knownDateByContentId = Map.fromEntries(knownLiveEntries.map((entry) => MapEntry(entry.contentId, entry.dateModifiedSecs))); + final obsoleteContentIds = (await mediaStoreService.checkObsoleteContentIds(knownDateByContentId.keys.toList())).toSet(); if (topEntries.isNotEmpty) { final obsoleteTopEntries = topEntries.where((entry) => obsoleteContentIds.contains(entry.contentId)); - await removeEntries(obsoleteTopEntries.map((entry) => entry.uri).toSet()); + await removeEntries(obsoleteTopEntries.map((entry) => entry.uri).toSet(), includeTrash: false); } + knownEntries.removeWhere((entry) => obsoleteContentIds.contains(entry.contentId)); // show known entries debugPrint('$runtimeType refresh ${stopwatch.elapsed} add known entries'); - addEntries(oldEntries); + addEntries(knownEntries); + debugPrint('$runtimeType refresh ${stopwatch.elapsed} load metadata'); await loadCatalogMetadata(); await loadAddresses(); @@ -84,16 +87,28 @@ class MediaStoreSource extends CollectionSource { debugPrint('$runtimeType refresh ${stopwatch.elapsed} remove obsolete entries'); await metadataDb.removeIds(obsoleteContentIds); + // trash + await loadTrashDetails(); + unawaited(deleteExpiredTrash().then( + (deletedUris) { + if (deletedUris.isNotEmpty) { + debugPrint('evicted ${deletedUris.length} expired items from the trash'); + removeEntries(deletedUris, includeTrash: true); + } + }, + onError: (error) => debugPrint('failed to evict expired trash error=$error'), + )); + // verify paths because some apps move files without updating their `last modified date` debugPrint('$runtimeType refresh ${stopwatch.elapsed} check obsolete paths'); - final knownPathById = Map.fromEntries(allEntries.map((entry) => MapEntry(entry.contentId!, entry.path))); - final movedContentIds = (await mediaStoreService.checkObsoletePaths(knownPathById)).toSet(); + final knownPathByContentId = Map.fromEntries(knownLiveEntries.map((entry) => MapEntry(entry.contentId, entry.path))); + final movedContentIds = (await mediaStoreService.checkObsoletePaths(knownPathByContentId)).toSet(); movedContentIds.forEach((contentId) { // make obsolete by resetting its modified date - knownDateById[contentId] = 0; + knownDateByContentId[contentId] = 0; }); - // fetch new entries + // fetch new & modified entries debugPrint('$runtimeType refresh ${stopwatch.elapsed} fetch new entries'); // refresh after the first 10 entries, then after 100 more, then every 1000 entries var refreshCount = 10; @@ -105,8 +120,9 @@ class MediaStoreSource extends CollectionSource { pendingNewEntries.clear(); } - mediaStoreService.getEntries(knownDateById).listen( + mediaStoreService.getEntries(knownDateByContentId).listen( (entry) { + entry.id = metadataDb.nextId; pendingNewEntries.add(entry); if (pendingNewEntries.length >= refreshCount) { refreshCount = min(refreshCount * 10, refreshCountMax); @@ -127,13 +143,13 @@ class MediaStoreSource extends CollectionSource { } Set? analysisEntries; - final analysisIds = analysisController?.contentIds; + final analysisIds = analysisController?.entryIds; if (analysisIds != null) { - analysisEntries = visibleEntries.where((entry) => analysisIds.contains(entry.contentId)).toSet(); + analysisEntries = visibleEntries.where((entry) => analysisIds.contains(entry.id)).toSet(); } await analyze(analysisController, entries: analysisEntries); - debugPrint('$runtimeType refresh ${stopwatch.elapsed} done for ${oldEntries.length} known, ${allNewEntries.length} new, ${obsoleteContentIds.length} obsolete'); + debugPrint('$runtimeType refresh ${stopwatch.elapsed} done for ${knownEntries.length} known, ${allNewEntries.length} new, ${obsoleteContentIds.length} obsolete'); }, onError: (error) => debugPrint('$runtimeType stream error=$error'), ); @@ -162,7 +178,7 @@ class MediaStoreSource extends CollectionSource { // clean up obsolete entries final obsoleteContentIds = (await mediaStoreService.checkObsoleteContentIds(uriByContentId.keys.toList())).toSet(); final obsoleteUris = obsoleteContentIds.map((contentId) => uriByContentId[contentId]).whereNotNull().toSet(); - await removeEntries(obsoleteUris); + await removeEntries(obsoleteUris, includeTrash: false); obsoleteContentIds.forEach(uriByContentId.remove); // fetch new entries @@ -180,6 +196,7 @@ class MediaStoreSource extends CollectionSource { final newPath = sourceEntry.path; final volume = newPath != null ? androidFileUtils.getStorageVolume(newPath) : null; if (volume != null) { + sourceEntry.id = existingEntry?.id ?? metadataDb.nextId; newEntries.add(sourceEntry); final existingDirectory = existingEntry?.directory; if (existingDirectory != null) { diff --git a/lib/model/source/tag.dart b/lib/model/source/tag.dart index 16583cc2a..c1f7b5602 100644 --- a/lib/model/source/tag.dart +++ b/lib/model/source/tag.dart @@ -17,7 +17,7 @@ mixin TagMixin on SourceBase { Future loadCatalogMetadata() async { final saved = await metadataDb.loadAllMetadataEntries(); final idMap = entryById; - saved.forEach((metadata) => idMap[metadata.contentId]?.catalogMetadata = metadata); + saved.forEach((metadata) => idMap[metadata.id]?.catalogMetadata = metadata); onCatalogMetadataChanged(); } diff --git a/lib/model/source/trash.dart b/lib/model/source/trash.dart new file mode 100644 index 000000000..cbd2fd3ad --- /dev/null +++ b/lib/model/source/trash.dart @@ -0,0 +1,34 @@ +import 'dart:async'; + +import 'package:aves/model/source/collection_source.dart'; +import 'package:aves/services/common/image_op_events.dart'; +import 'package:aves/services/common/services.dart'; + +mixin TrashMixin on SourceBase { + static const Duration binKeepDuration = Duration(days: 30); + + Future loadTrashDetails() async { + final saved = await metadataDb.loadAllTrashDetails(); + final idMap = entryById; + saved.forEach((details) => idMap[details.id]?.trashDetails = details); + } + + Future> deleteExpiredTrash() async { + final expiredEntries = trashedEntries.where((entry) => entry.isExpiredTrash).toSet(); + if (expiredEntries.isEmpty) return {}; + + final processed = {}; + final completer = Completer>(); + mediaFileService.delete(entries: expiredEntries).listen( + processed.add, + onError: completer.completeError, + onDone: () async { + final successOps = processed.where((e) => e.success).toSet(); + final deletedOps = successOps.where((e) => !e.skipped).toSet(); + final deletedUris = deletedOps.map((event) => event.uri).toSet(); + completer.complete(deletedUris); + }, + ); + return await completer.future; + } +} diff --git a/lib/model/video/metadata.dart b/lib/model/video/metadata.dart index c83759bc4..1b7564ba3 100644 --- a/lib/model/video/metadata.dart +++ b/lib/model/video/metadata.dart @@ -99,7 +99,7 @@ class VideoMetadataFormatter { } if (dateMillis != null) { - return (entry.catalogMetadata ?? CatalogMetadata(contentId: entry.contentId)).copyWith( + return (entry.catalogMetadata ?? CatalogMetadata(id: entry.id)).copyWith( dateMillis: dateMillis, ); } diff --git a/lib/model/video_playback.dart b/lib/model/video_playback.dart index 660e4a77f..43bfce360 100644 --- a/lib/model/video_playback.dart +++ b/lib/model/video_playback.dart @@ -3,25 +3,25 @@ import 'package:flutter/foundation.dart'; @immutable class VideoPlaybackRow extends Equatable { - final int contentId, resumeTimeMillis; + final int entryId, resumeTimeMillis; @override - List get props => [contentId, resumeTimeMillis]; + List get props => [entryId, resumeTimeMillis]; const VideoPlaybackRow({ - required this.contentId, + required this.entryId, required this.resumeTimeMillis, }); static VideoPlaybackRow? fromMap(Map map) { return VideoPlaybackRow( - contentId: map['contentId'], + entryId: map['id'], resumeTimeMillis: map['resumeTimeMillis'], ); } Map toMap() => { - 'contentId': contentId, + 'id': entryId, 'resumeTimeMillis': resumeTimeMillis, }; } diff --git a/lib/services/analysis_service.dart b/lib/services/analysis_service.dart index 89d52983f..c048d08a5 100644 --- a/lib/services/analysis_service.dart +++ b/lib/services/analysis_service.dart @@ -25,10 +25,10 @@ class AnalysisService { } } - static Future startService({required bool force, List? contentIds}) async { + static Future startService({required bool force, List? entryIds}) async { try { await platform.invokeMethod('startService', { - 'contentIds': contentIds, + 'entryIds': entryIds, 'force': force, }); } on PlatformException catch (e, stack) { @@ -98,16 +98,16 @@ class Analyzer { } Future start(dynamic args) async { - debugPrint('$runtimeType start'); - List? contentIds; + List? entryIds; var force = false; if (args is Map) { - contentIds = (args['contentIds'] as List?)?.cast(); + entryIds = (args['entryIds'] as List?)?.cast(); force = args['force'] ?? false; } + debugPrint('$runtimeType start for ${entryIds?.length ?? 'all'} entries'); _controller = AnalysisController( canStartService: false, - contentIds: contentIds, + entryIds: entryIds, force: force, stopSignal: ValueNotifier(false), ); diff --git a/lib/services/media/media_file_service.dart b/lib/services/media/media_file_service.dart index a73e74319..46c3210ca 100644 --- a/lib/services/media/media_file_service.dart +++ b/lib/services/media/media_file_service.dart @@ -80,9 +80,8 @@ abstract class MediaFileService { Stream move({ String? opId, - required Iterable entries, + required Map> entriesByDestination, required bool copy, - required String destinationAlbum, required NameConflictStrategy nameConflictStrategy, }); @@ -126,6 +125,8 @@ class PlatformMediaFileService implements MediaFileService { 'isFlipped': entry.isFlipped, 'dateModifiedSecs': entry.dateModifiedSecs, 'sizeBytes': entry.sizeBytes, + 'trashed': entry.trashed, + 'trashPath': entry.trashDetails?.path, }; } @@ -343,9 +344,8 @@ class PlatformMediaFileService implements MediaFileService { @override Stream move({ String? opId, - required Iterable entries, + required Map> entriesByDestination, required bool copy, - required String destinationAlbum, required NameConflictStrategy nameConflictStrategy, }) { try { @@ -353,9 +353,8 @@ class PlatformMediaFileService implements MediaFileService { .receiveBroadcastStream({ 'op': 'move', 'id': opId, - 'entries': entries.map(_toPlatformEntryMap).toList(), + 'entriesByDestination': entriesByDestination.map((destination, entries) => MapEntry(destination, entries.map(_toPlatformEntryMap).toList())), 'copy': copy, - 'destinationPath': destinationAlbum, 'nameConflictStrategy': nameConflictStrategy.toPlatform(), }) .where((event) => event is Map) diff --git a/lib/services/media/media_store_service.dart b/lib/services/media/media_store_service.dart index 9bb493e92..e22b7d2bc 100644 --- a/lib/services/media/media_store_service.dart +++ b/lib/services/media/media_store_service.dart @@ -6,12 +6,12 @@ import 'package:flutter/services.dart'; import 'package:streams_channel/streams_channel.dart'; abstract class MediaStoreService { - Future> checkObsoleteContentIds(List knownContentIds); + Future> checkObsoleteContentIds(List knownContentIds); - Future> checkObsoletePaths(Map knownPathById); + Future> checkObsoletePaths(Map knownPathById); // knownEntries: map of contentId -> dateModifiedSecs - Stream getEntries(Map knownEntries); + Stream getEntries(Map knownEntries); // returns media URI Future scanFile(String path, String mimeType); @@ -22,7 +22,7 @@ class PlatformMediaStoreService implements MediaStoreService { static final StreamsChannel _streamChannel = StreamsChannel('deckers.thibault/aves/media_store_stream'); @override - Future> checkObsoleteContentIds(List knownContentIds) async { + Future> checkObsoleteContentIds(List knownContentIds) async { try { final result = await platform.invokeMethod('checkObsoleteContentIds', { 'knownContentIds': knownContentIds, @@ -35,7 +35,7 @@ class PlatformMediaStoreService implements MediaStoreService { } @override - Future> checkObsoletePaths(Map knownPathById) async { + Future> checkObsoletePaths(Map knownPathById) async { try { final result = await platform.invokeMethod('checkObsoletePaths', { 'knownPathById': knownPathById, @@ -48,7 +48,7 @@ class PlatformMediaStoreService implements MediaStoreService { } @override - Stream getEntries(Map knownEntries) { + Stream getEntries(Map knownEntries) { try { return _streamChannel .receiveBroadcastStream({ diff --git a/lib/services/metadata/metadata_fetch_service.dart b/lib/services/metadata/metadata_fetch_service.dart index 40e6143bf..c3b397cc4 100644 --- a/lib/services/metadata/metadata_fetch_service.dart +++ b/lib/services/metadata/metadata_fetch_service.dart @@ -79,7 +79,7 @@ class PlatformMetadataFetchService implements MetadataFetchService { 'path': entry.path, 'sizeBytes': entry.sizeBytes, }) as Map; - result['contentId'] = entry.contentId; + result['id'] = entry.id; return CatalogMetadata.fromMap(result); } on PlatformException catch (e, stack) { if (!entry.isMissingAtPath) { diff --git a/lib/theme/icons.dart b/lib/theme/icons.dart index 8d5b07d82..46a45c308 100644 --- a/lib/theme/icons.dart +++ b/lib/theme/icons.dart @@ -9,6 +9,7 @@ class AIcons { static const IconData accessibility = Icons.accessibility_new_outlined; static const IconData android = Icons.android; + static const IconData bin = Icons.delete_outlined; static const IconData broken = Icons.broken_image_outlined; static const IconData checked = Icons.done_outlined; static const IconData date = Icons.calendar_today_outlined; @@ -45,8 +46,6 @@ class AIcons { static const IconData add = Icons.add_circle_outline; static const IconData addShortcut = Icons.add_to_home_screen_outlined; static const IconData cancel = Icons.cancel_outlined; - static const IconData replay10 = Icons.replay_10_outlined; - static const IconData skip10 = Icons.forward_10_outlined; static const IconData captureFrame = Icons.screenshot_outlined; static const IconData clear = Icons.clear_outlined; static const IconData clipboard = Icons.content_copy_outlined; @@ -57,6 +56,7 @@ class AIcons { static const IconData edit = Icons.edit_outlined; static const IconData editRating = MdiIcons.starPlusOutline; static const IconData editTags = MdiIcons.tagPlusOutline; + static const IconData emptyBin = Icons.delete_sweep_outlined; static const IconData export = Icons.open_with_outlined; static const IconData fileExport = MdiIcons.fileExportOutline; static const IconData fileImport = MdiIcons.fileImportOutline; @@ -81,7 +81,10 @@ class AIcons { static const IconData print = Icons.print_outlined; static const IconData refresh = Icons.refresh_outlined; static const IconData rename = Icons.title_outlined; + static const IconData replay10 = Icons.replay_10_outlined; + static const IconData skip10 = Icons.forward_10_outlined; static const IconData reset = Icons.restart_alt_outlined; + static const IconData restore = Icons.restore_outlined; static const IconData rotateLeft = Icons.rotate_left_outlined; static const IconData rotateRight = Icons.rotate_right_outlined; static const IconData rotateScreen = Icons.screen_rotation_outlined; diff --git a/lib/utils/android_file_utils.dart b/lib/utils/android_file_utils.dart index c0de12a18..429692b40 100644 --- a/lib/utils/android_file_utils.dart +++ b/lib/utils/android_file_utils.dart @@ -8,6 +8,8 @@ import 'package:flutter/widgets.dart'; final AndroidFileUtils androidFileUtils = AndroidFileUtils._private(); class AndroidFileUtils { + static const String trashDirPath = '#trash'; + late final String separator, primaryStorage, dcimPath, downloadPath, moviesPath, picturesPath, avesVideoCapturesPath; late final Set videoCapturesPaths; Set storageVolumes = {}; diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index 357a1ad85..1d7647990 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -26,7 +26,6 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/providers/highlight_info_provider.dart'; import 'package:aves/widgets/home_page.dart'; import 'package:aves/widgets/welcome_page.dart'; -import 'package:collection/collection.dart'; import 'package:equatable/equatable.dart'; import 'package:fijkplayer/fijkplayer.dart'; import 'package:flutter/foundation.dart'; @@ -190,7 +189,7 @@ class _AvesAppState extends State with WidgetsBindingObserver { final columns = (screenSize.width / tileExtent).ceil(); final count = rows * columns; final collection = CollectionLens(source: _mediaStoreSource, listenToSource: false); - settings.topEntryIds = collection.sortedEntries.take(count).map((entry) => entry.contentId).whereNotNull().toList(); + settings.topEntryIds = collection.sortedEntries.take(count).map((entry) => entry.id).toList(); collection.dispose(); debugPrint('Saved $count top entries in ${stopwatch.elapsed.inMilliseconds}ms'); } diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index 04c8be3a9..1dd10f071 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -3,7 +3,9 @@ import 'dart:async'; import 'package:aves/app_mode.dart'; import 'package:aves/model/actions/entry_set_actions.dart'; import 'package:aves/model/entry.dart'; +import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/query.dart'; +import 'package:aves/model/filters/trash.dart'; import 'package:aves/model/query.dart'; import 'package:aves/model/selection.dart'; import 'package:aves/model/settings/settings.dart'; @@ -54,9 +56,13 @@ class _CollectionAppBarState extends State with SingleTickerPr CollectionLens get collection => widget.collection; + bool get isTrash => collection.filters.contains(TrashFilter.instance); + CollectionSource get source => collection.source; - bool get showFilterBar => collection.filters.any((v) => !(v is QueryFilter && v.live)); + Set get visibleFilters => collection.filters.where((v) => !(v is QueryFilter && v.live) && v is! TrashFilter).toSet(); + + bool get showFilterBar => visibleFilters.isNotEmpty; @override void initState() { @@ -126,7 +132,7 @@ class _CollectionAppBarState extends State with SingleTickerPr children: [ if (showFilterBar) FilterBar( - filters: collection.filters.where((v) => !(v is QueryFilter && v.live)).toSet(), + filters: visibleFilters, removable: removableFilters, onTap: removableFilters ? collection.removeFilter : null, ), @@ -185,7 +191,7 @@ class _CollectionAppBarState extends State with SingleTickerPr ); } else { final appMode = context.watch>().value; - Widget title = Text(appMode.isPickingMedia ? l10n.collectionPickPageTitle : l10n.collectionPageTitle); + Widget title = Text(appMode.isPickingMedia ? l10n.collectionPickPageTitle : (isTrash ? l10n.binPageTitle : l10n.collectionPageTitle)); if (appMode == AppMode.main) { title = SourceStateAwareAppBarTitle( title: title, @@ -210,6 +216,7 @@ class _CollectionAppBarState extends State with SingleTickerPr isSelecting: isSelecting, itemCount: collection.entryCount, selectedItemCount: selectedItemCount, + isTrash: isTrash, ); bool canApply(EntrySetAction action) => _actionDelegate.canApply( action, @@ -220,7 +227,7 @@ class _CollectionAppBarState extends State with SingleTickerPr final canApplyEditActions = selectedItemCount > 0; final browsingQuickActions = settings.collectionBrowsingQuickActions; - final selectionQuickActions = settings.collectionSelectionQuickActions; + final selectionQuickActions = isTrash ? [EntrySetAction.delete, EntrySetAction.restore] : settings.collectionSelectionQuickActions; final quickActionButtons = (isSelecting ? selectionQuickActions : browsingQuickActions).where(isVisible).map( (action) => _toActionButton(action, enabled: canApply(action), selection: selection), ); @@ -242,7 +249,7 @@ class _CollectionAppBarState extends State with SingleTickerPr ...(isSelecting ? selectionMenuActions : browsingMenuActions).where(isVisible).map( (action) => _toMenuItem(action, enabled: canApply(action), selection: selection), ), - if (isSelecting) + if (isSelecting && !isTrash) PopupMenuItem( enabled: canApplyEditActions, padding: EdgeInsets.zero, @@ -252,13 +259,7 @@ class _CollectionAppBarState extends State with SingleTickerPr title: context.l10n.collectionActionEdit, items: [ _buildRotateAndFlipMenuItems(context, canApply: canApply), - ...[ - EntrySetAction.editDate, - EntrySetAction.editLocation, - EntrySetAction.editRating, - EntrySetAction.editTags, - EntrySetAction.removeMetadata, - ].map((action) => _toMenuItem(action, enabled: canApply(action), selection: selection)), + ...EntrySetActions.edit.where(isVisible).map((action) => _toMenuItem(action, enabled: canApply(action), selection: selection)), ], ), ), @@ -430,9 +431,11 @@ class _CollectionAppBarState extends State with SingleTickerPr case EntrySetAction.map: case EntrySetAction.stats: case EntrySetAction.rescan: + case EntrySetAction.emptyBin: // selecting case EntrySetAction.share: case EntrySetAction.delete: + case EntrySetAction.restore: case EntrySetAction.copy: case EntrySetAction.move: case EntrySetAction.toggleFavourite: diff --git a/lib/widgets/collection/collection_grid.dart b/lib/widgets/collection/collection_grid.dart index 0c599becc..2b2be1150 100644 --- a/lib/widgets/collection/collection_grid.dart +++ b/lib/widgets/collection/collection_grid.dart @@ -37,7 +37,7 @@ import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; class CollectionGrid extends StatefulWidget { - final String? settingsRouteKey; + final String settingsRouteKey; static const int columnCountDefault = 4; static const double extentMin = 46; @@ -46,7 +46,7 @@ class CollectionGrid extends StatefulWidget { const CollectionGrid({ Key? key, - this.settingsRouteKey, + required this.settingsRouteKey, }) : super(key: key); @override @@ -65,7 +65,7 @@ class _CollectionGridState extends State { @override Widget build(BuildContext context) { _tileExtentController ??= TileExtentController( - settingsRouteKey: widget.settingsRouteKey ?? context.currentRouteName!, + settingsRouteKey: widget.settingsRouteKey, columnCountDefault: CollectionGrid.columnCountDefault, extentMin: CollectionGrid.extentMin, extentMax: CollectionGrid.extentMax, @@ -114,7 +114,7 @@ class _CollectionGridContent extends StatelessWidget { animation: favourites, builder: (context, child) { return InteractiveTile( - key: ValueKey(entry.contentId), + key: ValueKey(entry.id), collection: collection, entry: entry, thumbnailExtent: thumbnailExtent, diff --git a/lib/widgets/collection/collection_page.dart b/lib/widgets/collection/collection_page.dart index 94dcd625a..4267bc1b1 100644 --- a/lib/widgets/collection/collection_page.dart +++ b/lib/widgets/collection/collection_page.dart @@ -1,6 +1,10 @@ +import 'dart:async'; + import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/query.dart'; +import 'package:aves/model/filters/trash.dart'; import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/collection/collection_grid.dart'; import 'package:aves/widgets/common/basic/insets.dart'; @@ -29,10 +33,25 @@ class CollectionPage extends StatefulWidget { } class _CollectionPageState extends State { + final List _subscriptions = []; + CollectionLens get collection => widget.collection; + @override + void initState() { + super.initState(); + _subscriptions.add(settings.updateStream.where((key) => key == Settings.enableBinKey).listen((_) { + if (!settings.enableBin) { + collection.removeFilter(TrashFilter.instance); + } + })); + } + @override void dispose() { + _subscriptions + ..forEach((sub) => sub.cancel()) + ..clear(); collection.dispose(); super.dispose(); } @@ -64,6 +83,7 @@ class _CollectionPageState extends State { child: const CollectionGrid( // key is expected by test driver key: Key('collection-grid'), + settingsRouteKey: CollectionPage.routeName, ), ), ), @@ -73,7 +93,7 @@ class _CollectionPageState extends State { ), ), ), - drawer: const AppDrawer(), + drawer: AppDrawer(currentCollection: collection), resizeToAvoidBottomInset: false, ), ); diff --git a/lib/widgets/collection/entry_set_action_delegate.dart b/lib/widgets/collection/entry_set_action_delegate.dart index 38be53935..6e38e1f22 100644 --- a/lib/widgets/collection/entry_set_action_delegate.dart +++ b/lib/widgets/collection/entry_set_action_delegate.dart @@ -10,6 +10,7 @@ import 'package:aves/model/favourites.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/query.dart'; import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/analysis_controller.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; @@ -41,6 +42,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware required bool isSelecting, required int itemCount, required int selectedItemCount, + required bool isTrash, }) { switch (action) { // general @@ -58,15 +60,19 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware case EntrySetAction.toggleTitleSearch: return !isSelecting; case EntrySetAction.addShortcut: - return appMode == AppMode.main && !isSelecting && device.canPinShortcut; + return appMode == AppMode.main && !isSelecting && device.canPinShortcut && !isTrash; + case EntrySetAction.emptyBin: + return isTrash; // browsing or selecting case EntrySetAction.map: case EntrySetAction.stats: - case EntrySetAction.rescan: return appMode == AppMode.main; + case EntrySetAction.rescan: + return appMode == AppMode.main && !isTrash; // selecting - case EntrySetAction.share: case EntrySetAction.delete: + return appMode == AppMode.main && isSelecting; + case EntrySetAction.share: case EntrySetAction.copy: case EntrySetAction.move: case EntrySetAction.toggleFavourite: @@ -78,7 +84,9 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware case EntrySetAction.editRating: case EntrySetAction.editTags: case EntrySetAction.removeMetadata: - return appMode == AppMode.main && isSelecting; + return appMode == AppMode.main && isSelecting && !isTrash; + case EntrySetAction.restore: + return appMode == AppMode.main && isSelecting && isTrash; } } @@ -104,6 +112,8 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware case EntrySetAction.toggleTitleSearch: case EntrySetAction.addShortcut: return true; + case EntrySetAction.emptyBin: + return !isSelecting && hasItems; case EntrySetAction.map: case EntrySetAction.stats: case EntrySetAction.rescan: @@ -111,6 +121,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware // selecting case EntrySetAction.share: case EntrySetAction.delete: + case EntrySetAction.restore: case EntrySetAction.copy: case EntrySetAction.move: case EntrySetAction.toggleFavourite: @@ -159,8 +170,12 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware _share(context); break; case EntrySetAction.delete: + case EntrySetAction.emptyBin: _delete(context); break; + case EntrySetAction.restore: + _move(context, moveType: MoveType.fromBin); + break; case EntrySetAction.copy: _move(context, moveType: MoveType.copy); break; @@ -197,53 +212,61 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware } } - Set _getExpandedSelectedItems(Selection selection) { - return selection.selectedItems.expand((entry) => entry.burstEntries ?? {entry}).toSet(); + Set _getTargetItems(BuildContext context) { + final selection = context.read>(); + final groupedEntries = (selection.isSelecting ? selection.selectedItems : context.read().sortedEntries); + return groupedEntries.expand((entry) => entry.burstEntries ?? {entry}).toSet(); } void _share(BuildContext context) { - final selection = context.read>(); - final selectedItems = _getExpandedSelectedItems(selection); - androidAppService.shareEntries(selectedItems).then((success) { + final entries = _getTargetItems(context); + androidAppService.shareEntries(entries).then((success) { if (!success) showNoMatchingAppDialog(context); }); } void _rescan(BuildContext context) { - final selection = context.read>(); - final collection = context.read(); - final entries = (selection.isSelecting ? _getExpandedSelectedItems(selection) : collection.sortedEntries.toSet()); + final entries = _getTargetItems(context); final controller = AnalysisController(canStartService: true, force: true); + final collection = context.read(); collection.source.analyze(controller, entries: entries); + final selection = context.read>(); selection.browse(); } Future _toggleFavourite(BuildContext context) async { - final selection = context.read>(); - final selectedItems = _getExpandedSelectedItems(selection); - if (selectedItems.every((entry) => entry.isFavourite)) { - await favourites.remove(selectedItems); + final entries = _getTargetItems(context); + if (entries.every((entry) => entry.isFavourite)) { + await favourites.removeEntries(entries); } else { - await favourites.add(selectedItems); + await favourites.add(entries); } + final selection = context.read>(); selection.browse(); } Future _delete(BuildContext context) async { + final entries = _getTargetItems(context); + + final pureTrash = entries.every((entry) => entry.trashed); + if (settings.enableBin && !pureTrash) { + await _move(context, moveType: MoveType.toBin); + return; + } + + final l10n = context.l10n; final source = context.read(); - final selection = context.read>(); - final selectedItems = _getExpandedSelectedItems(selection); - final selectionDirs = selectedItems.map((e) => e.directory).whereNotNull().toSet(); - final todoCount = selectedItems.length; + final selectionDirs = entries.map((e) => e.directory).whereNotNull().toSet(); + final todoCount = entries.length; final confirmed = await showDialog( context: context, builder: (context) { return AvesDialog( - content: Text(context.l10n.deleteEntriesConfirmationDialogMessage(todoCount)), + content: Text(l10n.deleteEntriesConfirmationDialogMessage(todoCount)), actions: [ TextButton( onPressed: () => Navigator.pop(context), @@ -251,7 +274,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware ), TextButton( onPressed: () => Navigator.pop(context, true), - child: Text(context.l10n.deleteButtonLabel), + child: Text(l10n.deleteButtonLabel), ), ], ); @@ -259,21 +282,20 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware ); if (confirmed == null || !confirmed) return; - if (!await checkStoragePermissionForAlbums(context, selectionDirs, entries: selectedItems)) return; + if (!pureTrash && !await checkStoragePermissionForAlbums(context, selectionDirs, entries: entries)) return; source.pauseMonitoring(); final opId = mediaFileService.newOpId; await showOpReport( context: context, - opStream: mediaFileService.delete(opId: opId, entries: selectedItems), + opStream: mediaFileService.delete(opId: opId, entries: entries), itemCount: todoCount, onCancel: () => mediaFileService.cancelFileOp(opId), onDone: (processed) async { final successOps = processed.where((e) => e.success).toSet(); final deletedOps = successOps.where((e) => !e.skipped).toSet(); final deletedUris = deletedOps.map((event) => event.uri).toSet(); - await source.removeEntries(deletedUris); - selection.browse(); + await source.removeEntries(deletedUris, includeTrash: true); source.resumeMonitoring(); final successCount = successOps.length; @@ -286,18 +308,21 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware await storageService.deleteEmptyDirectories(selectionDirs); }, ); + + final selection = context.read>(); + selection.browse(); } Future _move(BuildContext context, {required MoveType moveType}) async { + final entries = _getTargetItems(context); + await move(context, moveType: moveType, entries: entries); + final selection = context.read>(); - final selectedItems = _getExpandedSelectedItems(selection); - await move(context, moveType: moveType, selectedItems: selectedItems); selection.browse(); } Future _edit( BuildContext context, - Selection selection, Set todoItems, Future> Function(AvesEntry entry) op, ) async { @@ -327,7 +352,6 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware onDone: (processed) async { final successOps = processed.where((e) => e.success).toSet(); final editedOps = successOps.where((e) => !e.skipped).toSet(); - selection.browse(); source.resumeMonitoring(); unawaited(source.refreshUris(editedOps.map((v) => v.uri).toSet()).then((_) { @@ -353,14 +377,15 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware } }, ); + final selection = context.read>(); + selection.browse(); } - Future?> _getEditableItems( + Future?> _getEditableTargetItems( BuildContext context, { - required Set selectedItems, required bool Function(AvesEntry entry) canEdit, }) async { - final bySupported = groupBy(selectedItems, canEdit); + final bySupported = groupBy(_getTargetItems(context), canEdit); final supported = (bySupported[true] ?? []).toSet(); final unsupported = (bySupported[false] ?? []).toSet(); @@ -396,70 +421,52 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware } Future _rotate(BuildContext context, {required bool clockwise}) async { - final selection = context.read>(); - final selectedItems = _getExpandedSelectedItems(selection); - - final todoItems = await _getEditableItems(context, selectedItems: selectedItems, canEdit: (entry) => entry.canRotateAndFlip); + final todoItems = await _getEditableTargetItems(context, canEdit: (entry) => entry.canRotateAndFlip); if (todoItems == null || todoItems.isEmpty) return; - await _edit(context, selection, todoItems, (entry) => entry.rotate(clockwise: clockwise)); + await _edit(context, todoItems, (entry) => entry.rotate(clockwise: clockwise)); } Future _flip(BuildContext context) async { - final selection = context.read>(); - final selectedItems = _getExpandedSelectedItems(selection); - - final todoItems = await _getEditableItems(context, selectedItems: selectedItems, canEdit: (entry) => entry.canRotateAndFlip); + final todoItems = await _getEditableTargetItems(context, canEdit: (entry) => entry.canRotateAndFlip); if (todoItems == null || todoItems.isEmpty) return; - await _edit(context, selection, todoItems, (entry) => entry.flip()); + await _edit(context, todoItems, (entry) => entry.flip()); } Future _editDate(BuildContext context) async { - final selection = context.read>(); - final selectedItems = _getExpandedSelectedItems(selection); - - final todoItems = await _getEditableItems(context, selectedItems: selectedItems, canEdit: (entry) => entry.canEditDate); + final todoItems = await _getEditableTargetItems(context, canEdit: (entry) => entry.canEditDate); if (todoItems == null || todoItems.isEmpty) return; final modifier = await selectDateModifier(context, todoItems); if (modifier == null) return; - await _edit(context, selection, todoItems, (entry) => entry.editDate(modifier)); + await _edit(context, todoItems, (entry) => entry.editDate(modifier)); } Future _editLocation(BuildContext context) async { - final collection = context.read(); - final selection = context.read>(); - final selectedItems = _getExpandedSelectedItems(selection); - - final todoItems = await _getEditableItems(context, selectedItems: selectedItems, canEdit: (entry) => entry.canEditLocation); + final todoItems = await _getEditableTargetItems(context, canEdit: (entry) => entry.canEditLocation); if (todoItems == null || todoItems.isEmpty) return; + final collection = context.read(); final location = await selectLocation(context, todoItems, collection); if (location == null) return; - await _edit(context, selection, todoItems, (entry) => entry.editLocation(location)); + await _edit(context, todoItems, (entry) => entry.editLocation(location)); } Future _editRating(BuildContext context) async { - final selection = context.read>(); - final selectedItems = _getExpandedSelectedItems(selection); - - final todoItems = await _getEditableItems(context, selectedItems: selectedItems, canEdit: (entry) => entry.canEditRating); + final todoItems = await _getEditableTargetItems(context, canEdit: (entry) => entry.canEditRating); if (todoItems == null || todoItems.isEmpty) return; final rating = await selectRating(context, todoItems); if (rating == null) return; - await _edit(context, selection, todoItems, (entry) => entry.editRating(rating)); + await _edit(context, todoItems, (entry) => entry.editRating(rating)); } Future _editTags(BuildContext context) async { - final selection = context.read>(); - final selectedItems = _getExpandedSelectedItems(selection); - - final todoItems = await _getEditableItems(context, selectedItems: selectedItems, canEdit: (entry) => entry.canEditTags); + final todoItems = await _getEditableTargetItems(context, canEdit: (entry) => entry.canEditTags); if (todoItems == null || todoItems.isEmpty) return; final newTagsByEntry = await selectTags(context, todoItems); @@ -474,26 +481,22 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware if (todoItems.isEmpty) return; - await _edit(context, selection, todoItems, (entry) => entry.editTags(newTagsByEntry[entry]!)); + await _edit(context, todoItems, (entry) => entry.editTags(newTagsByEntry[entry]!)); } Future _removeMetadata(BuildContext context) async { - final selection = context.read>(); - final selectedItems = _getExpandedSelectedItems(selection); - - final todoItems = await _getEditableItems(context, selectedItems: selectedItems, canEdit: (entry) => entry.canRemoveMetadata); + final todoItems = await _getEditableTargetItems(context, canEdit: (entry) => entry.canRemoveMetadata); if (todoItems == null || todoItems.isEmpty) return; final types = await selectMetadataToRemove(context, todoItems); if (types == null || types.isEmpty) return; - await _edit(context, selection, todoItems, (entry) => entry.removeMetadata(types)); + await _edit(context, todoItems, (entry) => entry.removeMetadata(types)); } void _goToMap(BuildContext context) { - final selection = context.read>(); final collection = context.read(); - final entries = (selection.isSelecting ? _getExpandedSelectedItems(selection) : collection.sortedEntries); + final entries = _getTargetItems(context); Navigator.push( context, @@ -512,9 +515,8 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware } void _goToStats(BuildContext context) { - final selection = context.read>(); final collection = context.read(); - final entries = selection.isSelecting ? _getExpandedSelectedItems(selection) : collection.sortedEntries.toSet(); + final entries = _getTargetItems(context); Navigator.push( context, diff --git a/lib/widgets/collection/grid/tile.dart b/lib/widgets/collection/grid/tile.dart index cb0f82d21..9b02c1813 100644 --- a/lib/widgets/collection/grid/tile.dart +++ b/lib/widgets/collection/grid/tile.dart @@ -66,7 +66,7 @@ class InteractiveTile extends StatelessWidget { // hero tag should include a collection identifier, so that it animates // between different views of the entry in the same collection (e.g. thumbnails <-> viewer) // but not between different collection instances, even with the same attributes (e.g. reloading collection page via drawer) - heroTagger: () => Object.hashAll([collection.id, entry.uri]), + heroTagger: () => Object.hashAll([collection.id, entry.id]), ), ), ); @@ -81,7 +81,7 @@ class InteractiveTile extends StatelessWidget { final viewerCollection = collection.copyWith( listenToSource: false, ); - assert(viewerCollection.sortedEntries.map((e) => e.contentId).contains(entry.contentId)); + assert(viewerCollection.sortedEntries.map((entry) => entry.id).contains(entry.id)); return EntryViewerPage( collection: viewerCollection, initialEntry: entry, diff --git a/lib/widgets/common/action_mixins/entry_storage.dart b/lib/widgets/common/action_mixins/entry_storage.dart index 79385c0a4..c175c0e2a 100644 --- a/lib/widgets/common/action_mixins/entry_storage.dart +++ b/lib/widgets/common/action_mixins/entry_storage.dart @@ -5,6 +5,7 @@ import 'package:aves/app_mode.dart'; import 'package:aves/model/actions/move_type.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/album.dart'; +import 'package:aves/model/filters/trash.dart'; import 'package:aves/model/highlight.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; @@ -12,11 +13,13 @@ import 'package:aves/services/common/image_op_events.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/services/media/enums.dart'; import 'package:aves/theme/durations.dart'; +import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; import 'package:aves/widgets/common/action_mixins/size_aware.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; import 'package:aves/widgets/filter_grids/album_pick.dart'; import 'package:collection/collection.dart'; @@ -27,9 +30,38 @@ mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { Future move( BuildContext context, { required MoveType moveType, - required Set selectedItems, + required Set entries, VoidCallback? onSuccess, }) async { + final todoCount = entries.length; + assert(todoCount > 0); + + final toBin = moveType == MoveType.toBin; + final copy = moveType == MoveType.copy; + + final l10n = context.l10n; + if (toBin) { + final confirmed = await showDialog( + context: context, + builder: (context) { + return AvesDialog( + content: Text(l10n.binEntriesConfirmationDialogMessage(todoCount)), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(MaterialLocalizations.of(context).cancelButtonLabel), + ), + TextButton( + onPressed: () => Navigator.pop(context, true), + child: Text(l10n.deleteButtonLabel), + ), + ], + ); + }, + ); + if (confirmed == null || !confirmed) return; + } + final source = context.read(); if (!source.initialized) { // source may be uninitialized in viewer mode @@ -37,48 +69,64 @@ mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { unawaited(source.refresh()); } - final l10n = context.l10n; - final selectionDirs = selectedItems.map((e) => e.directory).whereNotNull().toSet(); + final entriesByDestination = >{}; + switch (moveType) { + case MoveType.copy: + case MoveType.move: + case MoveType.export: + final destinationAlbum = await pickAlbum(context: context, moveType: moveType); + if (destinationAlbum == null) return; + entriesByDestination[destinationAlbum] = entries; + break; + case MoveType.toBin: + entriesByDestination[AndroidFileUtils.trashDirPath] = entries; + break; + case MoveType.fromBin: + groupBy(entries, (e) => e.directory).forEach((originAlbum, dirEntries) { + if (originAlbum != null) { + entriesByDestination[originAlbum] = dirEntries.toSet(); + } + }); + break; + } - final destinationAlbum = await pickAlbum(context: context, moveType: moveType); - if (destinationAlbum == null) return; - if (!await checkStoragePermissionForAlbums(context, {destinationAlbum})) return; + // permission for modification at destinations + final destinationAlbums = entriesByDestination.keys.toSet(); + if (!await checkStoragePermissionForAlbums(context, destinationAlbums)) return; - if (moveType == MoveType.move && !await checkStoragePermissionForAlbums(context, selectionDirs, entries: selectedItems)) return; + // permission for modification at origins + final originAlbums = entries.map((e) => e.directory).whereNotNull().toSet(); + if ({MoveType.move, MoveType.toBin}.contains(moveType) && !await checkStoragePermissionForAlbums(context, originAlbums, entries: entries)) return; - if (!await checkFreeSpaceForMove(context, selectedItems, destinationAlbum, moveType)) return; + await Future.forEach(destinationAlbums, (destinationAlbum) async { + if (!await checkFreeSpaceForMove(context, entries, destinationAlbum, moveType)) return; + }); - // do not directly use selection when moving and post-processing items - // as source monitoring may remove obsolete items from the original selection - final todoItems = selectedItems.toSet(); - - final copy = moveType == MoveType.copy; - final todoCount = todoItems.length; - assert(todoCount > 0); - - final destinationDirectory = Directory(destinationAlbum); - final names = [ - ...todoItems.map((v) => '${v.filenameWithoutExtension}${v.extension}'), - // do not guard up front based on directory existence, - // as conflicts could be within moved entries scattered across multiple albums - if (await destinationDirectory.exists()) ...destinationDirectory.listSync().map((v) => pContext.basename(v.path)), - ]; - final uniqueNames = names.toSet(); var nameConflictStrategy = NameConflictStrategy.rename; - if (uniqueNames.length < names.length) { - final value = await showDialog( - context: context, - builder: (context) { - return AvesSelectionDialog( - initialValue: nameConflictStrategy, - options: Map.fromEntries(NameConflictStrategy.values.map((v) => MapEntry(v, v.getName(context)))), - message: selectionDirs.length == 1 ? l10n.nameConflictDialogSingleSourceMessage : l10n.nameConflictDialogMultipleSourceMessage, - confirmationButtonLabel: l10n.continueButtonLabel, - ); - }, - ); - if (value == null) return; - nameConflictStrategy = value; + if (!toBin && destinationAlbums.length == 1) { + final destinationDirectory = Directory(destinationAlbums.single); + final names = [ + ...entries.map((v) => '${v.filenameWithoutExtension}${v.extension}'), + // do not guard up front based on directory existence, + // as conflicts could be within moved entries scattered across multiple albums + if (await destinationDirectory.exists()) ...destinationDirectory.listSync().map((v) => pContext.basename(v.path)), + ]; + final uniqueNames = names.toSet(); + if (uniqueNames.length < names.length) { + final value = await showDialog( + context: context, + builder: (context) { + return AvesSelectionDialog( + initialValue: nameConflictStrategy, + options: Map.fromEntries(NameConflictStrategy.values.map((v) => MapEntry(v, v.getName(context)))), + message: originAlbums.length == 1 ? l10n.nameConflictDialogSingleSourceMessage : l10n.nameConflictDialogMultipleSourceMessage, + confirmationButtonLabel: l10n.continueButtonLabel, + ); + }, + ); + if (value == null) return; + nameConflictStrategy = value; + } } source.pauseMonitoring(); @@ -87,9 +135,8 @@ mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { context: context, opStream: mediaFileService.move( opId: opId, - entries: todoItems, + entriesByDestination: entriesByDestination, copy: copy, - destinationAlbum: destinationAlbum, nameConflictStrategy: nameConflictStrategy, ), itemCount: todoCount, @@ -98,16 +145,16 @@ mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { final successOps = processed.where((e) => e.success).toSet(); final movedOps = successOps.where((e) => !e.skipped).toSet(); await source.updateAfterMove( - todoEntries: todoItems, - copy: copy, - destinationAlbum: destinationAlbum, + todoEntries: entries, + moveType: moveType, + destinationAlbums: destinationAlbums, movedOps: movedOps, ); source.resumeMonitoring(); // cleanup - if (moveType == MoveType.move) { - await storageService.deleteEmptyDirectories(selectionDirs); + if ({MoveType.move, MoveType.toBin}.contains(moveType)) { + await storageService.deleteEmptyDirectories(originAlbums); } final successCount = successOps.length; @@ -119,7 +166,7 @@ mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { final appMode = context.read>().value; SnackBarAction? action; - if (count > 0 && appMode == AppMode.main) { + if (count > 0 && appMode == AppMode.main && !toBin) { action = SnackBarAction( label: l10n.showButtonLabel, onPressed: () async { @@ -130,14 +177,18 @@ mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { if (collection != null) { targetCollection = collection; } - if (collection == null || collection.filters.any((f) => f is AlbumFilter)) { - final filter = AlbumFilter(destinationAlbum, source.getAlbumDisplayName(context, destinationAlbum)); - // we could simply add the filter to the current collection - // but navigating makes the change less jarring + if (collection == null || collection.filters.any((f) => f is AlbumFilter || f is TrashFilter)) { targetCollection = CollectionLens( source: source, - filters: collection?.filters, - )..addFilter(filter); + filters: collection?.filters.where((f) => f != TrashFilter.instance).toSet(), + ); + // we could simply add the filter to the current collection + // but navigating makes the change less jarring + if (destinationAlbums.length == 1) { + final destinationAlbum = destinationAlbums.single; + final filter = AlbumFilter(destinationAlbum, source.getAlbumDisplayName(context, destinationAlbum)); + targetCollection.addFilter(filter); + } unawaited(Navigator.pushAndRemoveUntil( context, MaterialPageRoute( diff --git a/lib/widgets/common/action_mixins/size_aware.dart b/lib/widgets/common/action_mixins/size_aware.dart index a7f37b123..35c880bd5 100644 --- a/lib/widgets/common/action_mixins/size_aware.dart +++ b/lib/widgets/common/action_mixins/size_aware.dart @@ -19,6 +19,8 @@ mixin SizeAwareMixin { String destinationAlbum, MoveType moveType, ) async { + if (moveType == MoveType.toBin) return true; + // assume we have enough space if we cannot find the volume or its remaining free space final destinationVolume = androidFileUtils.getStorageVolume(destinationAlbum); if (destinationVolume == null) return true; @@ -34,6 +36,8 @@ mixin SizeAwareMixin { needed = selection.fold(0, sumSize); break; case MoveType.move: + case MoveType.toBin: + case MoveType.fromBin: // when moving, we only need space for the entries that are not already on the destination volume final byVolume = groupBy(selection, (entry) => androidFileUtils.getStorageVolume(entry.path)).whereNotNullKey(); final otherVolumes = byVolume.keys.where((volume) => volume != destinationVolume); diff --git a/lib/widgets/common/grid/theme.dart b/lib/widgets/common/grid/theme.dart index 2422ab2bd..670c9995e 100644 --- a/lib/widgets/common/grid/theme.dart +++ b/lib/widgets/common/grid/theme.dart @@ -6,13 +6,14 @@ import 'package:provider/provider.dart'; class GridTheme extends StatelessWidget { final double extent; - final bool? showLocation; + final bool? showLocation, showTrash; final Widget child; const GridTheme({ Key? key, required this.extent, this.showLocation, + this.showTrash, required this.child, }) : super(key: key); @@ -33,6 +34,7 @@ class GridTheme extends StatelessWidget { showMotionPhoto: settings.showThumbnailMotionPhoto, showRating: settings.showThumbnailRating, showRaw: settings.showThumbnailRaw, + showTrash: showTrash ?? true, showVideoDuration: settings.showThumbnailVideoDuration, ); }, @@ -43,7 +45,7 @@ class GridTheme extends StatelessWidget { class GridThemeData { final double iconSize, fontSize, highlightBorderWidth; - final bool showFavourite, showLocation, showMotionPhoto, showRating, showRaw, showVideoDuration; + final bool showFavourite, showLocation, showMotionPhoto, showRating, showRaw, showTrash, showVideoDuration; const GridThemeData({ required this.iconSize, @@ -54,6 +56,7 @@ class GridThemeData { required this.showMotionPhoto, required this.showRating, required this.showRaw, + required this.showTrash, required this.showVideoDuration, }); } diff --git a/lib/widgets/common/identity/aves_icons.dart b/lib/widgets/common/identity/aves_icons.dart index efd6550f7..f259495e2 100644 --- a/lib/widgets/common/identity/aves_icons.dart +++ b/lib/widgets/common/identity/aves_icons.dart @@ -2,6 +2,7 @@ import 'package:aves/image_providers/app_icon_image_provider.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/grid/theme.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -177,6 +178,31 @@ class RatingIcon extends StatelessWidget { } } +class TrashIcon extends StatelessWidget { + final int? trashDaysLeft; + + const TrashIcon({ + Key? key, + required this.trashDaysLeft, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final child = OverlayIcon( + icon: AIcons.bin, + text: trashDaysLeft != null ? context.l10n.timeDays(trashDaysLeft!) : null, + ); + + return DefaultTextStyle( + style: TextStyle( + color: Colors.grey.shade200, + fontSize: context.select((t) => t.fontSize), + ), + child: child, + ); + } +} + class OverlayIcon extends StatelessWidget { final IconData icon; final String? text; diff --git a/lib/widgets/common/identity/empty.dart b/lib/widgets/common/identity/empty.dart index 459726dbc..af4ff6096 100644 --- a/lib/widgets/common/identity/empty.dart +++ b/lib/widgets/common/identity/empty.dart @@ -7,6 +7,7 @@ class EmptyContent extends StatelessWidget { final String text; final AlignmentGeometry alignment; final double fontSize; + final bool safeBottom; const EmptyContent({ Key? key, @@ -14,15 +15,18 @@ class EmptyContent extends StatelessWidget { required this.text, this.alignment = const FractionalOffset(.5, .35), this.fontSize = 22, + this.safeBottom = true, }) : super(key: key); @override Widget build(BuildContext context) { const color = Colors.blueGrey; return Padding( - padding: EdgeInsets.only( - bottom: context.select((mq) => mq.effectiveBottomPadding), - ), + padding: safeBottom + ? EdgeInsets.only( + bottom: context.select((mq) => mq.effectiveBottomPadding), + ) + : EdgeInsets.zero, child: Align( alignment: alignment, child: Column( diff --git a/lib/widgets/common/thumbnail/decorated.dart b/lib/widgets/common/thumbnail/decorated.dart index bcf87ee42..f3a955b91 100644 --- a/lib/widgets/common/thumbnail/decorated.dart +++ b/lib/widgets/common/thumbnail/decorated.dart @@ -27,7 +27,6 @@ class DecoratedThumbnail extends StatelessWidget { @override Widget build(BuildContext context) { - final isSvg = entry.isSvg; Widget child = ThumbnailImage( entry: entry, extent: tileExtent, @@ -36,10 +35,10 @@ class DecoratedThumbnail extends StatelessWidget { ); child = Stack( - alignment: isSvg ? Alignment.center : AlignmentDirectional.bottomStart, + alignment: AlignmentDirectional.bottomStart, children: [ child, - if (!isSvg) ThumbnailEntryOverlay(entry: entry), + ThumbnailEntryOverlay(entry: entry), if (selectable) GridItemSelectionOverlay( item: entry, diff --git a/lib/widgets/common/thumbnail/error.dart b/lib/widgets/common/thumbnail/error.dart index b1015de3e..6ca741e0d 100644 --- a/lib/widgets/common/thumbnail/error.dart +++ b/lib/widgets/common/thumbnail/error.dart @@ -4,7 +4,6 @@ import 'dart:math'; import 'package:aves/model/entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/mime_utils.dart'; -import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -58,14 +57,10 @@ class _ErrorThumbnailState extends State { textAlign: TextAlign.center, ); }) - : Tooltip( - message: context.l10n.viewerErrorDoesNotExist, - preferBelow: false, - child: Icon( - AIcons.broken, - size: extent / 2, - color: color, - ), + : Icon( + AIcons.broken, + size: extent / 2, + color: color, ); } return Container( diff --git a/lib/widgets/common/thumbnail/overlay.dart b/lib/widgets/common/thumbnail/overlay.dart index 28b8251b5..ad3a74d44 100644 --- a/lib/widgets/common/thumbnail/overlay.dart +++ b/lib/widgets/common/thumbnail/overlay.dart @@ -35,6 +35,7 @@ class ThumbnailEntryOverlay extends StatelessWidget { if (entry.isMotionPhoto && context.select((t) => t.showMotionPhoto)) const MotionPhotoIcon(), if (!entry.isMotionPhoto) MultiPageIcon(entry: entry), ], + if (entry.trashed && context.select((t) => t.showTrash)) TrashIcon(trashDaysLeft: entry.trashDaysLeft), ]; if (children.isEmpty) return const SizedBox(); if (children.length == 1) return children.first; diff --git a/lib/widgets/common/thumbnail/scroller.dart b/lib/widgets/common/thumbnail/scroller.dart index b04af682d..6b8e14a74 100644 --- a/lib/widgets/common/thumbnail/scroller.dart +++ b/lib/widgets/common/thumbnail/scroller.dart @@ -86,6 +86,7 @@ class _ThumbnailScrollerState extends State { return GridTheme( extent: extent, showLocation: false, + showTrash: false, child: SizedBox( height: extent, child: ListView.separated( diff --git a/lib/widgets/debug/database.dart b/lib/widgets/debug/database.dart index d734ac5d5..5fd835ed7 100644 --- a/lib/widgets/debug/database.dart +++ b/lib/widgets/debug/database.dart @@ -3,6 +3,7 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/favourites.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/trash.dart'; import 'package:aves/model/video_playback.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/utils/file_utils.dart'; @@ -21,7 +22,8 @@ class _DebugAppDatabaseSectionState extends State with late Future> _dbEntryLoader; late Future> _dbDateLoader; late Future> _dbMetadataLoader; - late Future> _dbAddressLoader; + late Future> _dbAddressLoader; + late Future> _dbTrashLoader; late Future> _dbFavouritesLoader; late Future> _dbCoversLoader; late Future> _dbVideoPlaybackLoader; @@ -127,7 +129,7 @@ class _DebugAppDatabaseSectionState extends State with ); }, ), - FutureBuilder( + FutureBuilder( future: _dbAddressLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); @@ -148,6 +150,27 @@ class _DebugAppDatabaseSectionState extends State with ); }, ), + FutureBuilder( + future: _dbTrashLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); + + return Row( + children: [ + Expanded( + child: Text('trash rows: ${snapshot.data!.length}'), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => metadataDb.clearTrashDetails().then((_) => _startDbReport()), + child: const Text('Clear'), + ), + ], + ); + }, + ), FutureBuilder( future: _dbFavouritesLoader, builder: (context, snapshot) { @@ -224,6 +247,7 @@ class _DebugAppDatabaseSectionState extends State with _dbDateLoader = metadataDb.loadDates(); _dbMetadataLoader = metadataDb.loadAllMetadataEntries(); _dbAddressLoader = metadataDb.loadAllAddresses(); + _dbTrashLoader = metadataDb.loadAllTrashDetails(); _dbFavouritesLoader = metadataDb.loadAllFavourites(); _dbCoversLoader = metadataDb.loadAllCovers(); _dbVideoPlaybackLoader = metadataDb.loadAllVideoPlayback(); diff --git a/lib/widgets/dialogs/add_shortcut_dialog.dart b/lib/widgets/dialogs/add_shortcut_dialog.dart index 94cbbbbd3..42ce29bb7 100644 --- a/lib/widgets/dialogs/add_shortcut_dialog.dart +++ b/lib/widgets/dialogs/add_shortcut_dialog.dart @@ -38,7 +38,7 @@ class _AddShortcutDialogState extends State { if (_collection != null) { final entries = _collection.sortedEntries; if (entries.isNotEmpty) { - final coverEntries = _collection.filters.map(covers.coverContentId).whereNotNull().map((id) => entries.firstWhereOrNull((entry) => entry.contentId == id)).whereNotNull(); + final coverEntries = _collection.filters.map(covers.coverEntryId).whereNotNull().map((id) => entries.firstWhereOrNull((entry) => entry.id == id)).whereNotNull(); _coverEntry = coverEntries.firstOrNull ?? entries.first; } } diff --git a/lib/widgets/drawer/app_drawer.dart b/lib/widgets/drawer/app_drawer.dart index 3604fa3e0..45665b918 100644 --- a/lib/widgets/drawer/app_drawer.dart +++ b/lib/widgets/drawer/app_drawer.dart @@ -1,7 +1,10 @@ import 'dart:ui'; +import 'package:aves/model/filters/album.dart'; +import 'package:aves/model/filters/trash.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/album.dart'; +import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/location.dart'; import 'package:aves/model/source/tag.dart'; @@ -20,12 +23,19 @@ import 'package:aves/widgets/filter_grids/albums_page.dart'; import 'package:aves/widgets/filter_grids/countries_page.dart'; import 'package:aves/widgets/filter_grids/tags_page.dart'; import 'package:aves/widgets/settings/settings_page.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class AppDrawer extends StatelessWidget { - const AppDrawer({Key? key}) : super(key: key); + // collection loaded in the `CollectionPage`, if any + final CollectionLens? currentCollection; + + const AppDrawer({ + Key? key, + this.currentCollection, + }) : super(key: key); static List getDefaultAlbums(BuildContext context) { final source = context.read(); @@ -44,6 +54,10 @@ class AppDrawer extends StatelessWidget { ..._buildTypeLinks(), _buildAlbumLinks(context), ..._buildPageLinks(context), + if (settings.enableBin) ...[ + const Divider(), + binTile, + ], if (!kReleaseMode) ...[ const Divider(), debugTile, @@ -153,6 +167,7 @@ class AppDrawer extends StatelessWidget { List _buildTypeLinks() { final hiddenFilters = settings.hiddenFilters; final typeBookmarks = settings.drawerTypeBookmarks; + final currentFilters = currentCollection?.filters; return typeBookmarks .where((filter) => !hiddenFilters.contains(filter)) .map((filter) => CollectionNavTile( @@ -161,12 +176,17 @@ class AppDrawer extends StatelessWidget { leading: DrawerFilterIcon(filter: filter), title: DrawerFilterTitle(filter: filter), filter: filter, + isSelected: () { + if (currentFilters == null || currentFilters.length > 1) return false; + return currentFilters.firstOrNull == filter; + }, )) .toList(); } Widget _buildAlbumLinks(BuildContext context) { final source = context.read(); + final currentFilters = currentCollection?.filters; return StreamBuilder( stream: source.eventBus.on(), builder: (context, snapshot) { @@ -175,7 +195,14 @@ class AppDrawer extends StatelessWidget { return Column( children: [ const Divider(), - ...albums.map((album) => AlbumNavTile(album: album)), + ...albums.map((album) => AlbumNavTile( + album: album, + isSelected: () { + if (currentFilters == null || currentFilters.length > 1) return false; + final currentFilter = currentFilters.firstOrNull; + return currentFilter is AlbumFilter && currentFilter.album == album; + }, + )), ], ); }); @@ -226,6 +253,16 @@ class AppDrawer extends StatelessWidget { ]; } + Widget get binTile { + const filter = TrashFilter.instance; + return CollectionNavTile( + leading: const DrawerFilterIcon(filter: filter), + title: const DrawerFilterTitle(filter: filter), + filter: filter, + isSelected: () => currentCollection?.filters.contains(filter) ?? false, + ); + } + Widget get debugTile => PageNavTile( // key is expected by test driver key: const Key('drawer-debug'), diff --git a/lib/widgets/drawer/collection_nav_tile.dart b/lib/widgets/drawer/collection_nav_tile.dart index f8fa85239..17dc8a213 100644 --- a/lib/widgets/drawer/collection_nav_tile.dart +++ b/lib/widgets/drawer/collection_nav_tile.dart @@ -5,6 +5,7 @@ import 'package:aves/model/source/collection_source.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/drawer/tile.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -15,6 +16,7 @@ class CollectionNavTile extends StatelessWidget { final Widget? trailing; final bool dense; final CollectionFilter? filter; + final bool Function() isSelected; const CollectionNavTile({ Key? key, @@ -23,6 +25,7 @@ class CollectionNavTile extends StatelessWidget { this.trailing, bool? dense, required this.filter, + required this.isSelected, }) : dense = dense ?? false, super(key: key); @@ -37,6 +40,7 @@ class CollectionNavTile extends StatelessWidget { trailing: trailing, dense: dense, onTap: () => _goToCollection(context), + selected: context.currentRouteName == CollectionPage.routeName && isSelected(), ), ); } @@ -61,10 +65,12 @@ class CollectionNavTile extends StatelessWidget { class AlbumNavTile extends StatelessWidget { final String album; + final bool Function() isSelected; const AlbumNavTile({ Key? key, required this.album, + required this.isSelected, }) : super(key: key); @override @@ -82,6 +88,7 @@ class AlbumNavTile extends StatelessWidget { ) : null, filter: filter, + isSelected: isSelected, ); } } diff --git a/lib/widgets/drawer/page_nav_tile.dart b/lib/widgets/drawer/page_nav_tile.dart index 465d1ac33..938b43367 100644 --- a/lib/widgets/drawer/page_nav_tile.dart +++ b/lib/widgets/drawer/page_nav_tile.dart @@ -40,20 +40,18 @@ class PageNavTile extends StatelessWidget { onTap: _pageBuilder != null ? () { Navigator.pop(context); - if (routeName != context.currentRouteName) { - final route = MaterialPageRoute( - settings: RouteSettings(name: routeName), - builder: _pageBuilder, + final route = MaterialPageRoute( + settings: RouteSettings(name: routeName), + builder: _pageBuilder, + ); + if (topLevel) { + Navigator.pushAndRemoveUntil( + context, + route, + (route) => false, ); - if (topLevel) { - Navigator.pushAndRemoveUntil( - context, - route, - (route) => false, - ); - } else { - Navigator.push(context, route); - } + } else { + Navigator.push(context, route); } } : null, diff --git a/lib/widgets/filter_grids/album_pick.dart b/lib/widgets/filter_grids/album_pick.dart index 06dbc1aa6..00c404f5c 100644 --- a/lib/widgets/filter_grids/album_pick.dart +++ b/lib/widgets/filter_grids/album_pick.dart @@ -131,11 +131,13 @@ class _AlbumPickAppBar extends StatelessWidget { switch (moveType) { case MoveType.copy: return context.l10n.albumPickPageTitleCopy; - case MoveType.export: - return context.l10n.albumPickPageTitleExport; case MoveType.move: return context.l10n.albumPickPageTitleMove; - default: + case MoveType.export: + return context.l10n.albumPickPageTitleExport; + case MoveType.toBin: + case MoveType.fromBin: + case null: return context.l10n.albumPickPageTitlePick; } } diff --git a/lib/widgets/filter_grids/common/action_delegates/album_set.dart b/lib/widgets/filter_grids/common/action_delegates/album_set.dart index 8dd275552..bc49eebac 100644 --- a/lib/widgets/filter_grids/common/action_delegates/album_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/album_set.dart @@ -15,6 +15,7 @@ import 'package:aves/services/common/services.dart'; import 'package:aves/services/media/enums.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/widgets/common/action_mixins/entry_storage.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/filter_editors/create_album_dialog.dart'; @@ -28,7 +29,7 @@ import 'package:flutter/scheduler.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; -class AlbumChipSetActionDelegate extends ChipSetActionDelegate { +class AlbumChipSetActionDelegate extends ChipSetActionDelegate with EntryStorageMixin { final Iterable> _items; AlbumChipSetActionDelegate(Iterable> items) : _items = items; @@ -181,15 +182,30 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate { } Future _delete(BuildContext context, Set filters) async { - final l10n = context.l10n; - final messenger = ScaffoldMessenger.of(context); final source = context.read(); final todoEntries = source.visibleEntries.where((entry) => filters.any((f) => f.test(entry))).toSet(); - final todoCount = todoEntries.length; final todoAlbums = filters.map((v) => v.album).toSet(); final filledAlbums = todoEntries.map((e) => e.directory).whereNotNull().toSet(); final emptyAlbums = todoAlbums.whereNot(filledAlbums.contains).toSet(); + if (settings.enableBin && filledAlbums.isNotEmpty) { + await move( + context, + moveType: MoveType.toBin, + entries: todoEntries, + onSuccess: () { + source.forgetNewAlbums(todoAlbums); + source.cleanEmptyAlbums(emptyAlbums); + _browse(context); + }, + ); + return; + } + + final l10n = context.l10n; + final messenger = ScaffoldMessenger.of(context); + final todoCount = todoEntries.length; + final confirmed = await showDialog( context: context, builder: (context) { @@ -226,7 +242,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate { final successOps = processed.where((event) => event.success); final deletedOps = successOps.where((e) => !e.skipped).toSet(); final deletedUris = deletedOps.map((event) => event.uri).toSet(); - await source.removeEntries(deletedUris); + await source.removeEntries(deletedUris, includeTrash: true); _browse(context); source.resumeMonitoring(); @@ -285,9 +301,8 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate { context: context, opStream: mediaFileService.move( opId: opId, - entries: todoEntries, + entriesByDestination: {destinationAlbum: todoEntries}, copy: false, - destinationAlbum: destinationAlbum, // there should be no file conflict, as the target directory itself does not exist nameConflictStrategy: NameConflictStrategy.rename, ), diff --git a/lib/widgets/filter_grids/common/action_delegates/chip_set.dart b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart index c55aa8d8d..ebfd59b05 100644 --- a/lib/widgets/filter_grids/common/action_delegates/chip_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart @@ -278,8 +278,8 @@ abstract class ChipSetActionDelegate with FeedbackMi } void _setCover(BuildContext context, T filter) async { - final contentId = covers.coverContentId(filter); - final customEntry = context.read().visibleEntries.firstWhereOrNull((entry) => entry.contentId == contentId); + final entryId = covers.coverEntryId(filter); + final customEntry = context.read().visibleEntries.firstWhereOrNull((entry) => entry.id == entryId); final coverSelection = await showDialog>( context: context, builder: (context) => CoverSelectionDialog( @@ -290,7 +290,7 @@ abstract class ChipSetActionDelegate with FeedbackMi if (coverSelection == null) return; final isCustom = coverSelection.item1; - await covers.set(filter, isCustom ? coverSelection.item2?.contentId : null); + await covers.set(filter, isCustom ? coverSelection.item2?.id : null); _browse(context); } diff --git a/lib/widgets/map/map_page.dart b/lib/widgets/map/map_page.dart index 61195d8a6..41de8297a 100644 --- a/lib/widgets/map/map_page.dart +++ b/lib/widgets/map/map_page.dart @@ -267,7 +267,7 @@ class _ContentState extends State<_Content> with SingleTickerProviderStateMixin entryBuilder: (index) => index < regionEntries.length ? regionEntries[index] : null, indexNotifier: _selectedIndexNotifier, onTap: _onThumbnailTap, - heroTagger: (entry) => Object.hashAll([regionCollection?.id, entry.uri]), + heroTagger: (entry) => Object.hashAll([regionCollection?.id, entry.id]), highlightable: true, ); }, diff --git a/lib/widgets/settings/privacy/privacy.dart b/lib/widgets/settings/privacy/privacy.dart index d00919fc2..1a571dcd8 100644 --- a/lib/widgets/settings/privacy/privacy.dart +++ b/lib/widgets/settings/privacy/privacy.dart @@ -63,6 +63,20 @@ class PrivacySection extends StatelessWidget { title: Text(context.l10n.settingsSaveSearchHistory), ), ), + Selector( + selector: (context, s) => s.enableBin, + builder: (context, current, child) => SwitchListTile( + value: current, + onChanged: (v) { + settings.enableBin = v; + if (!v) { + settings.searchHistory = []; + } + }, + title: Text(context.l10n.settingsEnableBin), + subtitle: Text(context.l10n.settingsEnableBinSubtitle), + ), + ), const HiddenItemsTile(), if (device.canGrantDirectoryAccess) const StorageAccessTile(), ], diff --git a/lib/widgets/viewer/action/entry_action_delegate.dart b/lib/widgets/viewer/action/entry_action_delegate.dart index d90ba4284..8e98a8d4f 100644 --- a/lib/widgets/viewer/action/entry_action_delegate.dart +++ b/lib/widgets/viewer/action/entry_action_delegate.dart @@ -9,6 +9,7 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_metadata_edition.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/highlight.dart'; +import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/services/common/image_op_events.dart'; @@ -56,6 +57,9 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix case EntryAction.delete: _delete(context); break; + case EntryAction.restore: + _move(context, moveType: MoveType.fromBin); + break; case EntryAction.convert: _convert(context); break; @@ -163,11 +167,17 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix } Future _delete(BuildContext context) async { + if (settings.enableBin && !entry.trashed) { + await _move(context, moveType: MoveType.toBin); + return; + } + + final l10n = context.l10n; final confirmed = await showDialog( context: context, builder: (context) { return AvesDialog( - content: Text(context.l10n.deleteEntriesConfirmationDialogMessage(1)), + content: Text(l10n.deleteEntriesConfirmationDialogMessage(1)), actions: [ TextButton( onPressed: () => Navigator.pop(context), @@ -175,7 +185,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix ), TextButton( onPressed: () => Navigator.pop(context, true), - child: Text(context.l10n.deleteButtonLabel), + child: Text(l10n.deleteButtonLabel), ), ], ); @@ -186,11 +196,11 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix if (!await checkStoragePermission(context, {entry})) return; if (!await entry.delete()) { - showFeedback(context, context.l10n.genericFailureFeedback); + showFeedback(context, l10n.genericFailureFeedback); } else { final source = context.read(); if (source.initialized) { - await source.removeEntries({entry.uri}); + await source.removeEntries({entry.uri}, includeTrash: true); } EntryRemovedNotification(entry).dispatch(context); } @@ -300,8 +310,14 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix await move( context, moveType: moveType, - selectedItems: {entry}, - onSuccess: moveType == MoveType.move ? () => EntryRemovedNotification(entry).dispatch(context) : null, + entries: {entry}, + onSuccess: { + MoveType.move, + MoveType.toBin, + MoveType.fromBin, + }.contains(moveType) + ? () => EntryRemovedNotification(entry).dispatch(context) + : null, ); } diff --git a/lib/widgets/viewer/action/entry_info_action_delegate.dart b/lib/widgets/viewer/action/entry_info_action_delegate.dart index 77007ede6..727065f34 100644 --- a/lib/widgets/viewer/action/entry_info_action_delegate.dart +++ b/lib/widgets/viewer/action/entry_info_action_delegate.dart @@ -9,7 +9,9 @@ import 'package:aves/widgets/common/action_mixins/entry_editor.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; import 'package:aves/widgets/viewer/action/single_entry_editor.dart'; +import 'package:aves/widgets/viewer/debug/debug_page.dart'; import 'package:aves/widgets/viewer/embedded/notifications.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class EntryInfoActionDelegate with FeedbackMixin, PermissionAwareMixin, EntryEditorMixin, SingleEntryEditorMixin { @@ -35,6 +37,9 @@ class EntryInfoActionDelegate with FeedbackMixin, PermissionAwareMixin, EntryEdi // motion photo case EntryInfoAction.viewMotionPhotoVideo: return entry.isMotionPhoto; + // debug + case EntryInfoAction.debug: + return kDebugMode; } } @@ -54,6 +59,9 @@ class EntryInfoActionDelegate with FeedbackMixin, PermissionAwareMixin, EntryEdi // motion photo case EntryInfoAction.viewMotionPhotoVideo: return true; + // debug + case EntryInfoAction.debug: + return true; } } @@ -80,6 +88,10 @@ class EntryInfoActionDelegate with FeedbackMixin, PermissionAwareMixin, EntryEdi case EntryInfoAction.viewMotionPhotoVideo: OpenEmbeddedDataNotification.motionPhotoVideo().dispatch(context); break; + // debug + case EntryInfoAction.debug: + _goToDebug(context); + break; } _eventStreamController.add(ActionEndedEvent(action)); } @@ -122,4 +134,14 @@ class EntryInfoActionDelegate with FeedbackMixin, PermissionAwareMixin, EntryEdi await edit(context, () => entry.removeMetadata(types)); } + + void _goToDebug(BuildContext context) { + Navigator.push( + context, + MaterialPageRoute( + settings: const RouteSettings(name: ViewerDebugPage.routeName), + builder: (context) => ViewerDebugPage(entry: entry), + ), + ); + } } diff --git a/lib/widgets/viewer/debug/db.dart b/lib/widgets/viewer/debug/db.dart index ecc490ee5..5b38fab6c 100644 --- a/lib/widgets/viewer/debug/db.dart +++ b/lib/widgets/viewer/debug/db.dart @@ -1,6 +1,7 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; +import 'package:aves/model/metadata/trash.dart'; import 'package:aves/model/video_playback.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/widgets/viewer/info/common.dart'; @@ -24,6 +25,7 @@ class _DbTabState extends State { late Future _dbEntryLoader; late Future _dbMetadataLoader; late Future _dbAddressLoader; + late Future _dbTrashDetailsLoader; late Future _dbVideoPlaybackLoader; AvesEntry get entry => widget.entry; @@ -35,12 +37,13 @@ class _DbTabState extends State { } void _loadDatabase() { - final contentId = entry.contentId; - _dbDateLoader = metadataDb.loadDates().then((values) => values[contentId]); - _dbEntryLoader = metadataDb.loadAllEntries().then((values) => values.firstWhereOrNull((row) => row.contentId == contentId)); - _dbMetadataLoader = metadataDb.loadAllMetadataEntries().then((values) => values.firstWhereOrNull((row) => row.contentId == contentId)); - _dbAddressLoader = metadataDb.loadAllAddresses().then((values) => values.firstWhereOrNull((row) => row.contentId == contentId)); - _dbVideoPlaybackLoader = metadataDb.loadVideoPlayback(contentId); + final id = entry.id; + _dbDateLoader = metadataDb.loadDates().then((values) => values[id]); + _dbEntryLoader = metadataDb.loadAllEntries().then((values) => values.firstWhereOrNull((row) => row.id == id)); + _dbMetadataLoader = metadataDb.loadAllMetadataEntries().then((values) => values.firstWhereOrNull((row) => row.id == id)); + _dbAddressLoader = metadataDb.loadAllAddresses().then((values) => values.firstWhereOrNull((row) => row.id == id)); + _dbTrashDetailsLoader = metadataDb.loadAllTrashDetails().then((values) => values.firstWhereOrNull((row) => row.id == id)); + _dbVideoPlaybackLoader = metadataDb.loadVideoPlayback(id); setState(() {}); } @@ -94,6 +97,7 @@ class _DbTabState extends State { 'dateModifiedSecs': '${data.dateModifiedSecs}', 'sourceDateTakenMillis': '${data.sourceDateTakenMillis}', 'durationMillis': '${data.durationMillis}', + 'trashed': '${data.trashed}', }, ), ], @@ -155,6 +159,28 @@ class _DbTabState extends State { }, ), const SizedBox(height: 16), + FutureBuilder( + future: _dbTrashDetailsLoader, + builder: (context, snapshot) { + if (snapshot.hasError) return Text(snapshot.error.toString()); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); + final data = snapshot.data; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('DB trash details:${data == null ? ' no row' : ''}'), + if (data != null) + InfoRowGroup( + info: { + 'dateMillis': '${data.dateMillis}', + 'path': data.path, + }, + ), + ], + ); + }, + ), + const SizedBox(height: 16), FutureBuilder( future: _dbVideoPlaybackLoader, builder: (context, snapshot) { diff --git a/lib/widgets/viewer/debug/debug_page.dart b/lib/widgets/viewer/debug/debug_page.dart index f916b96d5..7fe35f4a7 100644 --- a/lib/widgets/viewer/debug/debug_page.dart +++ b/lib/widgets/viewer/debug/debug_page.dart @@ -68,8 +68,9 @@ class ViewerDebugPage extends StatelessWidget { InfoRowGroup( info: { 'hash': '#${shortHash(entry)}', - 'uri': entry.uri, + 'id': '${entry.id}', 'contentId': '${entry.contentId}', + 'uri': entry.uri, 'path': entry.path ?? '', 'directory': entry.directory ?? '', 'filenameWithoutExtension': entry.filenameWithoutExtension ?? '', @@ -77,6 +78,7 @@ class ViewerDebugPage extends StatelessWidget { 'sourceTitle': entry.sourceTitle ?? '', 'sourceMimeType': entry.sourceMimeType, 'mimeType': entry.mimeType, + 'trashed': '${entry.trashed}', 'isMissingAtPath': '${entry.isMissingAtPath}', }, ), diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index cbf054fa4..7ce90aa63 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -97,7 +97,7 @@ class _EntryViewerStackState extends State with FeedbackMixin, // so it is, strictly speaking, not contained in the lens used by the viewer, // but it can be found by content ID final initialEntry = widget.initialEntry; - final entry = entries.firstWhereOrNull((v) => v.contentId == initialEntry.contentId) ?? entries.firstOrNull; + final entry = entries.firstWhereOrNull((entry) => entry.id == initialEntry.id) ?? entries.firstOrNull; // opening hero, with viewer as target _heroInfoNotifier.value = HeroInfo(collection?.id, entry); _entryNotifier.value = entry; diff --git a/lib/widgets/viewer/info/basic_section.dart b/lib/widgets/viewer/info/basic_section.dart index a750d91b7..91b3a97a3 100644 --- a/lib/widgets/viewer/info/basic_section.dart +++ b/lib/widgets/viewer/info/basic_section.dart @@ -70,11 +70,11 @@ class BasicSection extends StatelessWidget { if (entry.isVideo) ..._buildVideoRows(context), if (showResolution) l10n.viewerInfoLabelResolution: rasterResolutionText, l10n.viewerInfoLabelSize: sizeText, - l10n.viewerInfoLabelUri: entry.uri, + if (!entry.trashed) l10n.viewerInfoLabelUri: entry.uri, if (path != null) l10n.viewerInfoLabelPath: path, }, ), - OwnerProp(entry: entry), + if (!entry.trashed) OwnerProp(entry: entry), _buildChips(context), _buildEditButtons(context), ], diff --git a/lib/widgets/viewer/info/info_app_bar.dart b/lib/widgets/viewer/info/info_app_bar.dart index 0b4185886..beb758122 100644 --- a/lib/widgets/viewer/info/info_app_bar.dart +++ b/lib/widgets/viewer/info/info_app_bar.dart @@ -9,6 +9,7 @@ import 'package:aves/widgets/common/sliver_app_bar_title.dart'; import 'package:aves/widgets/viewer/action/entry_info_action_delegate.dart'; import 'package:aves/widgets/viewer/info/info_search.dart'; import 'package:aves/widgets/viewer/info/metadata/metadata_section.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -53,7 +54,13 @@ class InfoAppBar extends StatelessWidget { if (entry.canEdit) MenuIconTheme( child: PopupMenuButton( - itemBuilder: (context) => menuActions.map((action) => _toMenuItem(context, action, enabled: actionDelegate.canApply(action))).toList(), + itemBuilder: (context) => [ + ...menuActions.map((action) => _toMenuItem(context, action, enabled: actionDelegate.canApply(action))), + if (!kReleaseMode) ...[ + const PopupMenuDivider(), + _toMenuItem(context, EntryInfoAction.debug, enabled: true), + ] + ], onSelected: (action) async { // wait for the popup menu to hide before proceeding with the action await Future.delayed(Durations.popupMenuAnimation * timeDilation); diff --git a/lib/widgets/viewer/overlay/bottom/common.dart b/lib/widgets/viewer/overlay/bottom/common.dart index 38e1b9912..775c418dd 100644 --- a/lib/widgets/viewer/overlay/bottom/common.dart +++ b/lib/widgets/viewer/overlay/bottom/common.dart @@ -384,7 +384,7 @@ class _PositionTitleRow extends StatelessWidget { // but fail to get information about these pages final pageCount = multiPageInfo.pageCount; if (pageCount > 0) { - final page = multiPageInfo.getById(entry.pageId ?? entry.contentId) ?? multiPageInfo.defaultPage; + final page = multiPageInfo.getById(entry.pageId ?? entry.id) ?? multiPageInfo.defaultPage; pagePosition = '${(page?.index ?? 0) + 1}/$pageCount'; } } diff --git a/lib/widgets/viewer/overlay/bottom/video.dart b/lib/widgets/viewer/overlay/bottom/video.dart index 7e453e924..564325bd5 100644 --- a/lib/widgets/viewer/overlay/bottom/video.dart +++ b/lib/widgets/viewer/overlay/bottom/video.dart @@ -67,14 +67,15 @@ class _VideoControlOverlayState extends State with SingleTi final status = controller?.status ?? VideoStatus.idle; Widget child; if (status == VideoStatus.error) { + const action = VideoAction.playOutside; child = Align( alignment: AlignmentDirectional.centerEnd, child: OverlayButton( scale: scale, child: IconButton( - icon: VideoAction.playOutside.getIcon(), - onPressed: () => widget.onActionSelected(VideoAction.playOutside), - tooltip: VideoAction.playOutside.getText(context), + icon: action.getIcon(), + onPressed: entry.trashed ? null : () => widget.onActionSelected(action), + tooltip: action.getText(context), ), ), ); @@ -327,13 +328,15 @@ class _ButtonRow extends StatelessWidget { case VideoAction.setSpeed: enabled = controller?.canSetSpeedNotifier.value ?? false; break; - case VideoAction.playOutside: case VideoAction.replay10: case VideoAction.skip10: case VideoAction.settings: case VideoAction.togglePlay: enabled = true; break; + case VideoAction.playOutside: + enabled = !(controller?.entry.trashed ?? true); + break; } Widget? child; diff --git a/lib/widgets/viewer/overlay/top.dart b/lib/widgets/viewer/overlay/top.dart index 7fb39b04a..dcd2d774a 100644 --- a/lib/widgets/viewer/overlay/top.dart +++ b/lib/widgets/viewer/overlay/top.dart @@ -65,47 +65,62 @@ class ViewerTopOverlay extends StatelessWidget { Widget _buildOverlay(BuildContext context, int availableCount, AvesEntry mainEntry, {AvesEntry? pageEntry}) { pageEntry ??= mainEntry; + final trashed = mainEntry.trashed; bool _isVisible(EntryAction action) { - final targetEntry = EntryActions.pageActions.contains(action) ? pageEntry! : mainEntry; - switch (action) { - case EntryAction.toggleFavourite: - return canToggleFavourite; - case EntryAction.delete: - case EntryAction.rename: - case EntryAction.copy: - case EntryAction.move: - return targetEntry.canEdit; - case EntryAction.rotateCCW: - case EntryAction.rotateCW: - case EntryAction.flip: - return targetEntry.canRotateAndFlip; - case EntryAction.convert: - case EntryAction.print: - return !targetEntry.isVideo && device.canPrint; - case EntryAction.openMap: - return targetEntry.hasGps; - case EntryAction.viewSource: - return targetEntry.isSvg; - case EntryAction.rotateScreen: - return settings.isRotationLocked; - case EntryAction.addShortcut: - return device.canPinShortcut; - case EntryAction.copyToClipboard: - case EntryAction.edit: - case EntryAction.open: - case EntryAction.setAs: - case EntryAction.share: - return true; - case EntryAction.debug: - return kDebugMode; + if (trashed) { + switch (action) { + case EntryAction.delete: + case EntryAction.restore: + return true; + case EntryAction.debug: + return kDebugMode; + default: + return false; + } + } else { + final targetEntry = EntryActions.pageActions.contains(action) ? pageEntry! : mainEntry; + switch (action) { + case EntryAction.toggleFavourite: + return canToggleFavourite; + case EntryAction.delete: + case EntryAction.rename: + case EntryAction.copy: + case EntryAction.move: + return targetEntry.canEdit; + case EntryAction.rotateCCW: + case EntryAction.rotateCW: + case EntryAction.flip: + return targetEntry.canRotateAndFlip; + case EntryAction.convert: + case EntryAction.print: + return !targetEntry.isVideo && device.canPrint; + case EntryAction.openMap: + return targetEntry.hasGps; + case EntryAction.viewSource: + return targetEntry.isSvg; + case EntryAction.rotateScreen: + return settings.isRotationLocked; + case EntryAction.addShortcut: + return device.canPinShortcut; + case EntryAction.copyToClipboard: + case EntryAction.edit: + case EntryAction.open: + case EntryAction.setAs: + case EntryAction.share: + return true; + case EntryAction.restore: + return false; + case EntryAction.debug: + return kDebugMode; + } } } final buttonRow = Selector( selector: (context, s) => s.isRotationLocked, builder: (context, s, child) { - final quickActions = settings.viewerQuickActions.where(_isVisible).take(availableCount - 1).toList(); + final quickActions = (trashed ? EntryActions.trashed : settings.viewerQuickActions).where(_isVisible).take(availableCount - 1).toList(); final topLevelActions = EntryActions.topLevel.where((action) => !quickActions.contains(action)).where(_isVisible).toList(); final exportActions = EntryActions.export.where((action) => !quickActions.contains(action)).where(_isVisible).toList(); return _TopOverlayRow( @@ -160,6 +175,7 @@ class _TopOverlayRow extends StatelessWidget { @override Widget build(BuildContext context) { + final hasOverflowMenu = pageEntry.canRotateAndFlip || topLevelActions.isNotEmpty || exportActions.isNotEmpty; return Row( children: [ OverlayButton( @@ -168,48 +184,50 @@ class _TopOverlayRow extends StatelessWidget { ), const Spacer(), ...quickActions.map((action) => _buildOverlayButton(context, action)), - OverlayButton( - scale: scale, - child: MenuIconTheme( - child: AvesPopupMenuButton( - key: const Key('entry-menu-button'), - itemBuilder: (context) { - final exportInternalActions = exportActions.whereNot(EntryActions.exportExternal.contains).toList(); - final exportExternalActions = exportActions.where(EntryActions.exportExternal.contains).toList(); - return [ - if (pageEntry.canRotateAndFlip) _buildRotateAndFlipMenuItems(context), - ...topLevelActions.map((action) => _buildPopupMenuItem(context, action)), - PopupMenuItem( - padding: EdgeInsets.zero, - child: PopupMenuItemExpansionPanel( - icon: AIcons.export, - title: context.l10n.entryActionExport, - items: [ - ...exportInternalActions.map((action) => _buildPopupMenuItem(context, action)).toList(), - if (exportInternalActions.isNotEmpty && exportExternalActions.isNotEmpty) const PopupMenuDivider(height: 0), - ...exportExternalActions.map((action) => _buildPopupMenuItem(context, action)).toList(), - ], - ), - ), - if (!kReleaseMode) ...[ - const PopupMenuDivider(), - _buildPopupMenuItem(context, EntryAction.debug), - ] - ]; - }, - onSelected: (action) { - // wait for the popup menu to hide before proceeding with the action - Future.delayed(Durations.popupMenuAnimation * timeDilation, () => _onActionSelected(context, action)); - }, - onMenuOpened: () { - // if the menu is opened while overlay is hiding, - // the popup menu button is disposed and menu items are ineffective, - // so we make sure overlay stays visible - const ToggleOverlayNotification(visible: true).dispatch(context); - }, + if (hasOverflowMenu) + OverlayButton( + scale: scale, + child: MenuIconTheme( + child: AvesPopupMenuButton( + key: const Key('entry-menu-button'), + itemBuilder: (context) { + final exportInternalActions = exportActions.whereNot(EntryActions.exportExternal.contains).toList(); + final exportExternalActions = exportActions.where(EntryActions.exportExternal.contains).toList(); + return [ + if (pageEntry.canRotateAndFlip) _buildRotateAndFlipMenuItems(context), + ...topLevelActions.map((action) => _buildPopupMenuItem(context, action)), + if (exportActions.isNotEmpty) + PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupMenuItemExpansionPanel( + icon: AIcons.export, + title: context.l10n.entryActionExport, + items: [ + ...exportInternalActions.map((action) => _buildPopupMenuItem(context, action)).toList(), + if (exportInternalActions.isNotEmpty && exportExternalActions.isNotEmpty) const PopupMenuDivider(height: 0), + ...exportExternalActions.map((action) => _buildPopupMenuItem(context, action)).toList(), + ], + ), + ), + if (!kReleaseMode) ...[ + const PopupMenuDivider(), + _buildPopupMenuItem(context, EntryAction.debug), + ] + ]; + }, + onSelected: (action) { + // wait for the popup menu to hide before proceeding with the action + Future.delayed(Durations.popupMenuAnimation * timeDilation, () => _onActionSelected(context, action)); + }, + onMenuOpened: () { + // if the menu is opened while overlay is hiding, + // the popup menu button is disposed and menu items are ineffective, + // so we make sure overlay stays visible + const ToggleOverlayNotification(visible: true).dispatch(context); + }, + ), ), ), - ), ], ); } @@ -226,7 +244,7 @@ class _TopOverlayRow extends StatelessWidget { break; default: child = IconButton( - icon: action.getIcon() ?? const SizedBox(), + icon: action.getIcon(), onPressed: onPressed, tooltip: action.getText(context), ); diff --git a/lib/widgets/viewer/video/controller.dart b/lib/widgets/viewer/video/controller.dart index fdeff47bf..58048fefa 100644 --- a/lib/widgets/viewer/video/controller.dart +++ b/lib/widgets/viewer/video/controller.dart @@ -27,36 +27,34 @@ abstract class AvesVideoController { } Future _savePlaybackState() async { - final contentId = entry.contentId; - if (contentId == null || !isReady || duration < resumeTimeSaveMinDuration.inMilliseconds) return; + final id = entry.id; + if (!isReady || duration < resumeTimeSaveMinDuration.inMilliseconds) return; if (persistPlayback) { final _progress = progress; if (resumeTimeSaveMinProgress < _progress && _progress < resumeTimeSaveMaxProgress) { await metadataDb.addVideoPlayback({ VideoPlaybackRow( - contentId: contentId, + entryId: id, resumeTimeMillis: currentPosition, ) }); } else { - await metadataDb.removeVideoPlayback({contentId}); + await metadataDb.removeVideoPlayback({id}); } } } Future getResumeTime(BuildContext context) async { - final contentId = entry.contentId; - if (contentId == null) return null; - if (!persistPlayback) return null; - final playback = await metadataDb.loadVideoPlayback(contentId); + final id = entry.id; + final playback = await metadataDb.loadVideoPlayback(id); final resumeTime = playback?.resumeTimeMillis ?? 0; if (resumeTime == 0) return null; // clear on retrieval - await metadataDb.removeVideoPlayback({contentId}); + await metadataDb.removeVideoPlayback({id}); final resume = await showDialog( context: context, diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index cb754bd1b..20ad5e563 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -143,7 +143,7 @@ class _EntryPageViewState extends State { if (animate) { child = Consumer( builder: (context, info, child) => Hero( - tag: info != null && info.entry == mainEntry ? Object.hashAll([info.collectionId, mainEntry.uri]) : hashCode, + tag: info != null && info.entry == mainEntry ? Object.hashAll([info.collectionId, mainEntry.id]) : hashCode, transitionOnUserGestures: true, child: child!, ), diff --git a/lib/widgets/viewer/visual/error.dart b/lib/widgets/viewer/visual/error.dart index e233637e7..e53ecc716 100644 --- a/lib/widgets/viewer/visual/error.dart +++ b/lib/widgets/viewer/visual/error.dart @@ -49,6 +49,7 @@ class _ErrorViewState extends State { icon: exists ? AIcons.error : AIcons.broken, text: exists ? context.l10n.viewerErrorUnknown : context.l10n.viewerErrorDoesNotExist, alignment: Alignment.center, + safeBottom: false, ); }), ), diff --git a/lib/widgets/viewer/visual/raster.dart b/lib/widgets/viewer/visual/raster.dart index 98ca8534e..f15a7df16 100644 --- a/lib/widgets/viewer/visual/raster.dart +++ b/lib/widgets/viewer/visual/raster.dart @@ -350,6 +350,7 @@ class _RegionTile extends StatefulWidget { @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); + properties.add(IntProperty('id', entry.id)); properties.add(IntProperty('contentId', entry.contentId)); properties.add(DiagnosticsProperty('tileRect', tileRect)); properties.add(DiagnosticsProperty>('regionRect', regionRect)); diff --git a/lib/widgets/viewer/visual/vector.dart b/lib/widgets/viewer/visual/vector.dart index 3901b8c35..dc41b5708 100644 --- a/lib/widgets/viewer/visual/vector.dart +++ b/lib/widgets/viewer/visual/vector.dart @@ -305,6 +305,7 @@ class _RegionTile extends StatefulWidget { @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); + properties.add(IntProperty('id', entry.id)); properties.add(IntProperty('contentId', entry.contentId)); properties.add(DiagnosticsProperty('tileRect', tileRect)); properties.add(DiagnosticsProperty>('regionRect', regionRect)); diff --git a/pubspec.lock b/pubspec.lock index c96adbee2..bc228cb42 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -883,12 +883,12 @@ packages: source: hosted version: "2.0.13" shared_preferences_android: - dependency: transitive + dependency: "direct main" description: name: shared_preferences_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "2.0.10" shared_preferences_ios: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b83d90623..6398ea090 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -63,6 +63,8 @@ dependencies: provider: screen_brightness: shared_preferences: +# TODO TLAD as of 2022/02/12, latest version (v2.0.11) fails to load from analysis service (target wrong channel?) + shared_preferences_android: 2.0.10 sqflite: streams_channel: git: diff --git a/test/fake/media_file_service.dart b/test/fake/media_file_service.dart index 70b5e07f4..22cbb16b5 100644 --- a/test/fake/media_file_service.dart +++ b/test/fake/media_file_service.dart @@ -11,7 +11,7 @@ class FakeMediaFileService extends Fake implements MediaFileService { Iterable entries, { required String newName, }) { - final contentId = FakeMediaStoreService.nextContentId; + final contentId = FakeMediaStoreService.nextId; final entry = entries.first; return Stream.value(MoveOpEvent( success: true, diff --git a/test/fake/media_store_service.dart b/test/fake/media_store_service.dart index b32a368d9..50e37144f 100644 --- a/test/fake/media_store_service.dart +++ b/test/fake/media_store_service.dart @@ -9,27 +9,28 @@ class FakeMediaStoreService extends Fake implements MediaStoreService { Set entries = {}; @override - Future> checkObsoleteContentIds(List knownContentIds) => SynchronousFuture([]); + Future> checkObsoleteContentIds(List knownContentIds) => SynchronousFuture([]); @override - Future> checkObsoletePaths(Map knownPathById) => SynchronousFuture([]); + Future> checkObsoletePaths(Map knownPathById) => SynchronousFuture([]); @override - Stream getEntries(Map knownEntries) => Stream.fromIterable(entries); + Stream getEntries(Map knownEntries) => Stream.fromIterable(entries); - static var _lastContentId = 1; + static var _lastId = 1; - static int get nextContentId => _lastContentId++; + static int get nextId => _lastId++; static int get dateSecs => DateTime.now().millisecondsSinceEpoch ~/ 1000; static AvesEntry newImage(String album, String filenameWithoutExtension) { - final contentId = nextContentId; + final id = nextId; final date = dateSecs; return AvesEntry( - uri: 'content://media/external/images/media/$contentId', - contentId: contentId, + id: id, + uri: 'content://media/external/images/media/$id', path: '$album/$filenameWithoutExtension.jpg', + contentId: id, pageId: null, sourceMimeType: MimeTypes.jpeg, width: 360, @@ -40,11 +41,12 @@ class FakeMediaStoreService extends Fake implements MediaStoreService { dateModifiedSecs: date, sourceDateTakenMillis: date, durationMillis: null, + trashed: false, ); } static MoveOpEvent moveOpEventFor(AvesEntry entry, String sourceAlbum, String destinationAlbum) { - final newContentId = nextContentId; + final newContentId = nextId; return MoveOpEvent( success: true, skipped: false, diff --git a/test/fake/metadata_db.dart b/test/fake/metadata_db.dart index 595d2265e..a3c62df19 100644 --- a/test/fake/metadata_db.dart +++ b/test/fake/metadata_db.dart @@ -1,19 +1,25 @@ import 'package:aves/model/covers.dart'; +import 'package:aves/model/db/db_metadata.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/favourites.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; -import 'package:aves/model/db/db_metadata.dart'; +import 'package:aves/model/metadata/trash.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_test/flutter_test.dart'; class FakeMetadataDb extends Fake implements MetadataDb { + static int _lastId = 0; + + @override + int get nextId => ++_lastId; + @override Future init() => SynchronousFuture(null); @override - Future removeIds(Set contentIds, {Set? dataTypes}) => SynchronousFuture(null); + Future removeIds(Set ids, {Set? dataTypes}) => SynchronousFuture(null); // entries @@ -24,7 +30,7 @@ class FakeMetadataDb extends Fake implements MetadataDb { Future saveEntries(Iterable entries) => SynchronousFuture(null); @override - Future updateEntryId(int oldId, AvesEntry entry) => SynchronousFuture(null); + Future updateEntry(int id, AvesEntry entry) => SynchronousFuture(null); // date taken @@ -40,18 +46,29 @@ class FakeMetadataDb extends Fake implements MetadataDb { Future saveMetadata(Set metadataEntries) => SynchronousFuture(null); @override - Future updateMetadataId(int oldId, CatalogMetadata? metadata) => SynchronousFuture(null); + Future updateMetadata(int id, CatalogMetadata? metadata) => SynchronousFuture(null); // address @override - Future> loadAllAddresses() => SynchronousFuture([]); + Future> loadAllAddresses() => SynchronousFuture({}); @override Future saveAddresses(Set addresses) => SynchronousFuture(null); @override - Future updateAddressId(int oldId, AddressDetails? address) => SynchronousFuture(null); + Future updateAddress(int id, AddressDetails? address) => SynchronousFuture(null); + + // trash + + @override + Future clearTrashDetails() => SynchronousFuture(null); + + @override + Future> loadAllTrashDetails() => SynchronousFuture({}); + + @override + Future updateTrash(int id, TrashDetails? details) => SynchronousFuture(null); // favourites @@ -62,7 +79,7 @@ class FakeMetadataDb extends Fake implements MetadataDb { Future addFavourites(Iterable rows) => SynchronousFuture(null); @override - Future updateFavouriteId(int oldId, FavouriteRow row) => SynchronousFuture(null); + Future updateFavouriteId(int id, FavouriteRow row) => SynchronousFuture(null); @override Future removeFavourites(Iterable rows) => SynchronousFuture(null); @@ -76,7 +93,7 @@ class FakeMetadataDb extends Fake implements MetadataDb { Future addCovers(Iterable rows) => SynchronousFuture(null); @override - Future updateCoverEntryId(int oldId, CoverRow row) => SynchronousFuture(null); + Future updateCoverEntryId(int id, CoverRow row) => SynchronousFuture(null); @override Future removeCovers(Set filters) => SynchronousFuture(null); @@ -84,8 +101,5 @@ class FakeMetadataDb extends Fake implements MetadataDb { // video playback @override - Future updateVideoPlaybackId(int oldId, int? newId) => SynchronousFuture(null); - - @override - Future removeVideoPlayback(Set contentIds) => SynchronousFuture(null); + Future removeVideoPlayback(Set ids) => SynchronousFuture(null); } diff --git a/test/model/collection_source_test.dart b/test/model/collection_source_test.dart index 584ca3b81..8da7aab0c 100644 --- a/test/model/collection_source_test.dart +++ b/test/model/collection_source_test.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:aves/model/actions/move_type.dart'; import 'package:aves/model/availability.dart'; import 'package:aves/model/covers.dart'; import 'package:aves/model/db/db_metadata.dart'; @@ -45,6 +46,7 @@ void main() { const aTag = 'sometag'; final australiaLatLng = LatLng(-26, 141); const australiaAddress = AddressDetails( + id: 0, countryCode: 'AU', countryName: 'AUS', ); @@ -96,7 +98,7 @@ void main() { (metadataFetchService as FakeMetadataFetchService).setUp( image1, CatalogMetadata( - contentId: image1.contentId, + id: image1.id, xmpSubjects: aTag, latitude: australiaLatLng.latitude, longitude: australiaLatLng.longitude, @@ -119,7 +121,7 @@ void main() { (metadataFetchService as FakeMetadataFetchService).setUp( image1, CatalogMetadata( - contentId: image1.contentId, + id: image1.id, xmpSubjects: aTag, latitude: australiaLatLng.latitude, longitude: australiaLatLng.longitude, @@ -129,7 +131,7 @@ void main() { final source = await _initSource(); expect(image1.tags, {aTag}); - expect(image1.addressDetails, australiaAddress.copyWith(contentId: image1.contentId)); + expect(image1.addressDetails, australiaAddress.copyWith(id: image1.id)); expect(source.visibleEntries.length, 0); expect(source.rawAlbums.length, 0); @@ -168,15 +170,15 @@ void main() { const albumFilter = AlbumFilter(testAlbum, 'whatever'); expect(albumFilter.test(image1), true); expect(covers.count, 0); - expect(covers.coverContentId(albumFilter), null); + expect(covers.coverEntryId(albumFilter), null); - await covers.set(albumFilter, image1.contentId); + await covers.set(albumFilter, image1.id); expect(covers.count, 1); - expect(covers.coverContentId(albumFilter), image1.contentId); + expect(covers.coverEntryId(albumFilter), image1.id); await covers.set(albumFilter, null); expect(covers.count, 0); - expect(covers.coverContentId(albumFilter), null); + expect(covers.coverEntryId(albumFilter), null); }); test('favourites and covers are kept when renaming entries', () async { @@ -188,13 +190,13 @@ void main() { final source = await _initSource(); await image1.toggleFavourite(); const albumFilter = AlbumFilter(testAlbum, 'whatever'); - await covers.set(albumFilter, image1.contentId); + await covers.set(albumFilter, image1.id); await source.renameEntry(image1, 'image1b.jpg', persist: true); expect(favourites.count, 1); expect(image1.isFavourite, true); expect(covers.count, 1); - expect(covers.coverContentId(albumFilter), image1.contentId); + expect(covers.coverEntryId(albumFilter), image1.id); }); test('favourites and covers are cleared when removing entries', () async { @@ -206,13 +208,13 @@ void main() { final source = await _initSource(); await image1.toggleFavourite(); final albumFilter = AlbumFilter(image1.directory!, 'whatever'); - await covers.set(albumFilter, image1.contentId); - await source.removeEntries({image1.uri}); + await covers.set(albumFilter, image1.id); + await source.removeEntries({image1.uri}, includeTrash: true); expect(source.rawAlbums.length, 0); expect(favourites.count, 0); expect(covers.count, 0); - expect(covers.coverContentId(albumFilter), null); + expect(covers.coverEntryId(albumFilter), null); }); test('albums are updated when moving entries', () async { @@ -232,8 +234,8 @@ void main() { await source.updateAfterMove( todoEntries: {image1}, - copy: false, - destinationAlbum: destinationAlbum, + moveType: MoveType.move, + destinationAlbums: {destinationAlbum}, movedOps: { FakeMediaStoreService.moveOpEventFor(image1, sourceAlbum, destinationAlbum), }, @@ -256,8 +258,8 @@ void main() { await source.updateAfterMove( todoEntries: {image1}, - copy: false, - destinationAlbum: destinationAlbum, + moveType: MoveType.move, + destinationAlbums: {destinationAlbum}, movedOps: { FakeMediaStoreService.moveOpEventFor(image1, sourceAlbum, destinationAlbum), }, @@ -277,12 +279,12 @@ void main() { final source = await _initSource(); expect(source.rawAlbums.length, 1); const sourceAlbumFilter = AlbumFilter(sourceAlbum, 'whatever'); - await covers.set(sourceAlbumFilter, image1.contentId); + await covers.set(sourceAlbumFilter, image1.id); await source.updateAfterMove( todoEntries: {image1}, - copy: false, - destinationAlbum: destinationAlbum, + moveType: MoveType.move, + destinationAlbums: {destinationAlbum}, movedOps: { FakeMediaStoreService.moveOpEventFor(image1, sourceAlbum, destinationAlbum), }, @@ -290,7 +292,7 @@ void main() { expect(source.rawAlbums.length, 2); expect(covers.count, 0); - expect(covers.coverContentId(sourceAlbumFilter), null); + expect(covers.coverEntryId(sourceAlbumFilter), null); }); test('favourites and covers are kept when renaming albums', () async { @@ -302,7 +304,7 @@ void main() { final source = await _initSource(); await image1.toggleFavourite(); var albumFilter = const AlbumFilter(sourceAlbum, 'whatever'); - await covers.set(albumFilter, image1.contentId); + await covers.set(albumFilter, image1.id); await source.renameAlbum(sourceAlbum, destinationAlbum, { image1 }, { @@ -313,7 +315,7 @@ void main() { expect(favourites.count, 1); expect(image1.isFavourite, true); expect(covers.count, 1); - expect(covers.coverContentId(albumFilter), image1.contentId); + expect(covers.coverEntryId(albumFilter), image1.id); }); testWidgets('unique album names', (tester) async { diff --git a/untranslated.json b/untranslated.json index f3738f5d2..9b8810c6f 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,33 +1,66 @@ { "de": [ - "entryActionConvert" + "timeDays", + "entryActionConvert", + "entryActionRestore", + "binEntriesConfirmationDialogMessage", + "collectionActionEmptyBin", + "binPageTitle", + "settingsEnableBin", + "settingsEnableBinSubtitle" ], "es": [ - "entryActionConvert", - "entryInfoActionEditLocation", - "exportEntryDialogWidth", - "exportEntryDialogHeight", - "editEntryLocationDialogTitle", - "editEntryLocationDialogChooseOnMapTooltip", - "editEntryLocationDialogLatitude", - "editEntryLocationDialogLongitude", - "locationPickerUseThisLocationButton" + "timeDays", + "entryActionRestore", + "binEntriesConfirmationDialogMessage", + "collectionActionEmptyBin", + "binPageTitle", + "settingsEnableBin", + "settingsEnableBinSubtitle" ], "fr": [ - "entryActionConvert" + "timeDays", + "entryActionConvert", + "entryActionRestore", + "binEntriesConfirmationDialogMessage", + "collectionActionEmptyBin", + "binPageTitle", + "settingsEnableBin", + "settingsEnableBinSubtitle" ], "ko": [ - "entryActionConvert" + "timeDays", + "entryActionConvert", + "entryActionRestore", + "binEntriesConfirmationDialogMessage", + "collectionActionEmptyBin", + "binPageTitle", + "settingsEnableBin", + "settingsEnableBinSubtitle" ], "pt": [ - "entryActionConvert" + "timeDays", + "entryActionConvert", + "entryActionRestore", + "binEntriesConfirmationDialogMessage", + "collectionActionEmptyBin", + "binPageTitle", + "settingsEnableBin", + "settingsEnableBinSubtitle" ], "ru": [ - "entryActionConvert" + "timeDays", + "entryActionConvert", + "entryActionRestore", + "binEntriesConfirmationDialogMessage", + "collectionActionEmptyBin", + "binPageTitle", + "settingsEnableBin", + "settingsEnableBinSubtitle" ] } From 33fb1cdea04ab5e6731675e839040ffdeafafe61 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 18 Feb 2022 15:42:27 +0900 Subject: [PATCH 19/39] l10n --- lib/l10n/app_en.arb | 8 ++++---- lib/l10n/app_fr.arb | 19 ++++++++++++++----- lib/l10n/app_ko.arb | 9 +++++++++ untranslated.json | 22 ---------------------- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 8399fc495..1a1990cc3 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -261,13 +261,13 @@ "noMatchingAppDialogTitle": "No Matching App", "noMatchingAppDialogMessage": "There are no apps that can handle this.", - "binEntriesConfirmationDialogMessage": "{count, plural, =1{Are you sure you want to move this item to the recycle bin?} other{Are you sure you want to move these {count} items to the recycle bin?}}", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Move this item to the recycle bin?} other{Move these {count} items to the recycle bin?}}", "@binEntriesConfirmationDialogMessage": { "placeholders": { "count": {} } }, - "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Are you sure you want to delete this item?} other{Are you sure you want to delete these {count} items?}}", + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Delete this item?} other{Delete these {count} items?}}", "@deleteEntriesConfirmationDialogMessage": { "placeholders": { "count": {} @@ -300,13 +300,13 @@ "renameAlbumDialogLabel": "New name", "renameAlbumDialogLabelAlreadyExistsHelper": "Directory already exists", - "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Are you sure you want to delete this album and its item?} other{Are you sure you want to delete this album and its {count} items?}}", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Delete this album and its item?} other{Delete this album and its {count} items?}}", "@deleteSingleAlbumConfirmationDialogMessage": { "placeholders": { "count": {} } }, - "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Are you sure you want to delete these albums and their item?} other{Are you sure you want to delete these albums and their {count} items?}}", + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Delete these albums and their item?} other{Delete these albums and their {count} items?}}", "@deleteMultiAlbumConfirmationDialogMessage": { "placeholders": { "count": {} diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index f9fb255e1..f56873916 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -5,8 +5,9 @@ "welcomeTermsToggle": "J’accepte les conditions d’utilisation", "itemCount": "{count, plural, =1{1 élément} other{{count} éléments}}", - "timeSeconds": "{seconds, plural, =1{1 seconde} other{{seconds} secondes}}", - "timeMinutes": "{minutes, plural, =1{1 minute} other{{minutes} minutes}}", + "timeSeconds": "{seconds, plural, =0{0 seconde} =1{1 seconde} other{{seconds} secondes}}", + "timeMinutes": "{minutes, plural, =0{0 minute} =1{1 minute} other{{minutes} minutes}}", + "timeDays": "{days, plural, =0{0 jour} =1{1 jour} other{{days} jours}}", "focalLength": "{length} mm", "applyButtonLabel": "ENREGISTRER", @@ -46,8 +47,10 @@ "entryActionCopyToClipboard": "Copier dans presse-papier", "entryActionDelete": "Supprimer", + "entryActionConvert": "Convertir", "entryActionExport": "Exporter", "entryActionRename": "Renommer", + "entryActionRestore": "Restaurer", "entryActionRotateCCW": "Pivoter à gauche", "entryActionRotateCW": "Pivoter à droite", "entryActionFlip": "Retourner horizontalement", @@ -156,7 +159,8 @@ "noMatchingAppDialogTitle": "App indisponible", "noMatchingAppDialogMessage": "Aucune app ne peut effectuer cette opération.", - "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Voulez-vous vraiment supprimer cet élément ?} other{Voulez-vous vraiment supprimer ces {count} éléments ?}}", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Mettre cet élément à la corbeille ?} other{Mettre ces {count} éléments à la corbeille ?}}", + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Supprimer cet élément ?} other{Supprimer ces {count} éléments ?}}", "videoResumeDialogMessage": "Voulez-vous reprendre la lecture à {time} ?", "videoStartOverButtonLabel": "RECOMMENCER", @@ -176,8 +180,8 @@ "renameAlbumDialogLabel": "Nouveau nom", "renameAlbumDialogLabelAlreadyExistsHelper": "Le dossier existe déjà", - "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Voulez-vous vraiment supprimer cet album et son élément ?} other{Voulez-vous vraiment supprimer cet album et ses {count} éléments ?}}", - "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Voulez-vous vraiment supprimer ces albums et leur élément ?} other{Voulez-vous vraiment supprimer ces albums et leurs {count} éléments ?}}", + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Supprimer cet album et son élément ?} other{Supprimer cet album et ses {count} éléments ?}}", + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Supprimer ces albums et leur élément ?} other{Supprimer ces albums et leurs {count} éléments ?}}", "exportEntryDialogFormat": "Format :", "exportEntryDialogWidth": "Largeur", @@ -271,6 +275,7 @@ "collectionActionShowTitleSearch": "Filtrer les titres", "collectionActionHideTitleSearch": "Masquer le filtre", "collectionActionAddShortcut": "Créer un raccourci", + "collectionActionEmptyBin": "Vider la corbeille", "collectionActionCopy": "Copier vers l’album", "collectionActionMove": "Déplacer vers l’album", "collectionActionRescan": "Réanalyser", @@ -349,6 +354,8 @@ "tagPageTitle": "Libellés", "tagEmpty": "Aucun libellé", + "binPageTitle": "Corbeille", + "searchCollectionFieldHint": "Recherche", "searchSectionRecent": "Historique", "searchSectionAlbums": "Albums", @@ -449,6 +456,8 @@ "settingsAllowInstalledAppAccessSubtitle": "Pour un affichage amélioré des albums", "settingsAllowErrorReporting": "Autoriser l’envoi de rapports d’erreur", "settingsSaveSearchHistory": "Maintenir un historique des recherches", + "settingsEnableBin": "Utiliser la corbeille", + "settingsEnableBinSubtitle": "Conserver les éléments supprimés pendant 30 jours", "settingsHiddenItemsTile": "Éléments masqués", "settingsHiddenItemsTitle": "Éléments masqués", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index c82863abc..17664e153 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -7,6 +7,7 @@ "timeSeconds": "{seconds, plural, other{{seconds}초}}", "timeMinutes": "{minutes, plural, other{{minutes}분}}", + "timeDays": "{days, plural, other{{days}일}}", "focalLength": "{length} mm", "applyButtonLabel": "확인", @@ -46,8 +47,10 @@ "entryActionCopyToClipboard": "클립보드에 복사", "entryActionDelete": "삭제", + "entryActionConvert": "변환", "entryActionExport": "내보내기", "entryActionRename": "이름 변경", + "entryActionRestore": "복원", "entryActionRotateCCW": "좌회전", "entryActionRotateCW": "우회전", "entryActionFlip": "좌우 뒤집기", @@ -156,6 +159,7 @@ "noMatchingAppDialogTitle": "처리할 앱 없음", "noMatchingAppDialogMessage": "이 작업을 처리할 수 있는 앱이 없습니다.", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{이 항목을 휴지통으로 이동하시겠습니까?} other{항목 {count}개를 휴지통으로 이동하시겠습니까?}}", "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{이 항목을 삭제하시겠습니까?} other{항목 {count}개를 삭제하시겠습니까?}}", "videoResumeDialogMessage": "{time}부터 재개하시겠습니까?", @@ -271,6 +275,7 @@ "collectionActionShowTitleSearch": "제목 필터 보기", "collectionActionHideTitleSearch": "제목 필터 숨기기", "collectionActionAddShortcut": "홈 화면에 추가", + "collectionActionEmptyBin": "휴지통 비우기", "collectionActionCopy": "앨범으로 복사", "collectionActionMove": "앨범으로 이동", "collectionActionRescan": "새로 분석", @@ -349,6 +354,8 @@ "tagPageTitle": "태그", "tagEmpty": "태그가 없습니다", + "binPageTitle": "휴지통", + "searchCollectionFieldHint": "미디어 검색", "searchSectionRecent": "최근 검색기록", "searchSectionAlbums": "앨범", @@ -449,6 +456,8 @@ "settingsAllowInstalledAppAccessSubtitle": "앨범 표시 개선을 위해", "settingsAllowErrorReporting": "오류 보고서 보내기", "settingsSaveSearchHistory": "검색기록", + "settingsEnableBin": "휴지통 사용", + "settingsEnableBinSubtitle": "삭제한 항목을 30일 동안 보관하기", "settingsHiddenItemsTile": "숨겨진 항목", "settingsHiddenItemsTitle": "숨겨진 항목", diff --git a/untranslated.json b/untranslated.json index 9b8810c6f..2f843b39a 100644 --- a/untranslated.json +++ b/untranslated.json @@ -20,28 +20,6 @@ "settingsEnableBinSubtitle" ], - "fr": [ - "timeDays", - "entryActionConvert", - "entryActionRestore", - "binEntriesConfirmationDialogMessage", - "collectionActionEmptyBin", - "binPageTitle", - "settingsEnableBin", - "settingsEnableBinSubtitle" - ], - - "ko": [ - "timeDays", - "entryActionConvert", - "entryActionRestore", - "binEntriesConfirmationDialogMessage", - "collectionActionEmptyBin", - "binPageTitle", - "settingsEnableBin", - "settingsEnableBinSubtitle" - ], - "pt": [ "timeDays", "entryActionConvert", From 14e00d78b4fed760770d852286dde4295e852ae3 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 18 Feb 2022 16:10:19 +0900 Subject: [PATCH 20/39] bin: size in drawer --- lib/l10n/app_en.arb | 1 + lib/l10n/app_fr.arb | 1 + lib/l10n/app_ko.arb | 1 + lib/model/filters/trash.dart | 2 +- lib/widgets/common/action_mixins/size_aware.dart | 2 +- lib/widgets/drawer/app_drawer.dart | 9 +++++++-- lib/widgets/drawer/collection_nav_tile.dart | 16 ++++++++++++++-- untranslated.json | 4 ++++ 8 files changed, 30 insertions(+), 6 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 1a1990cc3..d71b62195 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -109,6 +109,7 @@ "entryInfoActionEditTags": "Edit tags", "entryInfoActionRemoveMetadata": "Remove metadata", + "filterBinLabel": "Recycle bin", "filterFavouriteLabel": "Favourite", "filterLocationEmptyLabel": "Unlocated", "filterTagEmptyLabel": "Untagged", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index f56873916..b8f9bbc9e 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -81,6 +81,7 @@ "entryInfoActionEditTags": "Modifier les libellés", "entryInfoActionRemoveMetadata": "Retirer les métadonnées", + "filterBinLabel": "Corbeille", "filterFavouriteLabel": "Favori", "filterLocationEmptyLabel": "Sans lieu", "filterTagEmptyLabel": "Sans libellé", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 17664e153..b8bcf8e73 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -81,6 +81,7 @@ "entryInfoActionEditTags": "태그 수정", "entryInfoActionRemoveMetadata": "메타데이터 삭제", + "filterBinLabel": "휴지통", "filterFavouriteLabel": "즐겨찾기", "filterLocationEmptyLabel": "장소 없음", "filterTagEmptyLabel": "태그 없음", diff --git a/lib/model/filters/trash.dart b/lib/model/filters/trash.dart index b2e9da0c8..a8f902c85 100644 --- a/lib/model/filters/trash.dart +++ b/lib/model/filters/trash.dart @@ -25,7 +25,7 @@ class TrashFilter extends CollectionFilter { String get universalLabel => type; @override - String getLabel(BuildContext context) => context.l10n.binPageTitle; + String getLabel(BuildContext context) => context.l10n.filterBinLabel; @override Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(AIcons.bin, size: size); diff --git a/lib/widgets/common/action_mixins/size_aware.dart b/lib/widgets/common/action_mixins/size_aware.dart index 35c880bd5..bb6a983c4 100644 --- a/lib/widgets/common/action_mixins/size_aware.dart +++ b/lib/widgets/common/action_mixins/size_aware.dart @@ -29,7 +29,7 @@ mixin SizeAwareMixin { if (free == null) return true; late int needed; - int sumSize(sum, entry) => sum + entry.sizeBytes ?? 0; + int sumSize(sum, entry) => sum + (entry.sizeBytes ?? 0); switch (moveType) { case MoveType.copy: case MoveType.export: diff --git a/lib/widgets/drawer/app_drawer.dart b/lib/widgets/drawer/app_drawer.dart index 45665b918..2d08bb60a 100644 --- a/lib/widgets/drawer/app_drawer.dart +++ b/lib/widgets/drawer/app_drawer.dart @@ -11,6 +11,7 @@ import 'package:aves/model/source/tag.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/file_utils.dart'; import 'package:aves/widgets/about/about_page.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/media_query.dart'; @@ -56,7 +57,7 @@ class AppDrawer extends StatelessWidget { ..._buildPageLinks(context), if (settings.enableBin) ...[ const Divider(), - binTile, + binTile(context), ], if (!kReleaseMode) ...[ const Divider(), @@ -253,11 +254,15 @@ class AppDrawer extends StatelessWidget { ]; } - Widget get binTile { + Widget binTile(BuildContext context) { + final source = context.read(); + final trashSize = source.trashedEntries.fold(0, (sum, entry) => sum + (entry.sizeBytes ?? 0)); + const filter = TrashFilter.instance; return CollectionNavTile( leading: const DrawerFilterIcon(filter: filter), title: const DrawerFilterTitle(filter: filter), + trailing: Text(formatFileSize(context.l10n.localeName, trashSize, round: 0)), filter: filter, isSelected: () => currentCollection?.filters.contains(filter) ?? false, ); diff --git a/lib/widgets/drawer/collection_nav_tile.dart b/lib/widgets/drawer/collection_nav_tile.dart index 17dc8a213..8d264f276 100644 --- a/lib/widgets/drawer/collection_nav_tile.dart +++ b/lib/widgets/drawer/collection_nav_tile.dart @@ -37,7 +37,20 @@ class CollectionNavTile extends StatelessWidget { child: ListTile( leading: leading, title: title, - trailing: trailing, + trailing: trailing != null + ? Builder( + builder: (context) { + final trailingColor = IconTheme.of(context).color!.withOpacity(.6); + return IconTheme.merge( + data: IconThemeData(color: trailingColor), + child: DefaultTextStyle.merge( + style: TextStyle(color: trailingColor), + child: trailing!, + ), + ); + }, + ) + : null, dense: dense, onTap: () => _goToCollection(context), selected: context.currentRouteName == CollectionPage.routeName && isSelected(), @@ -84,7 +97,6 @@ class AlbumNavTile extends StatelessWidget { ? const Icon( AIcons.removableStorage, size: 16, - color: Colors.grey, ) : null, filter: filter, diff --git a/untranslated.json b/untranslated.json index 2f843b39a..cfa5917f9 100644 --- a/untranslated.json +++ b/untranslated.json @@ -3,6 +3,7 @@ "timeDays", "entryActionConvert", "entryActionRestore", + "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle", @@ -13,6 +14,7 @@ "es": [ "timeDays", "entryActionRestore", + "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle", @@ -24,6 +26,7 @@ "timeDays", "entryActionConvert", "entryActionRestore", + "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle", @@ -35,6 +38,7 @@ "timeDays", "entryActionConvert", "entryActionRestore", + "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle", From 208bf981fb6980f372e260c2285c96bd0feed77a Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 18 Feb 2022 17:55:51 +0900 Subject: [PATCH 21/39] optional confirmation dialogs: move to bin, delete --- lib/l10n/app_en.arb | 6 ++ lib/model/settings/defaults.dart | 7 +- .../settings/enums/confirmation_dialogs.dart | 15 ++++ lib/model/settings/enums/enums.dart | 10 ++- lib/model/settings/settings.dart | 40 ++++++---- .../collection/entry_set_action_delegate.dart | 25 ++---- .../common/action_mixins/entry_storage.dart | 26 ++---- .../dialogs/aves_confirmation_dialog.dart | 79 +++++++++++++++++++ .../common/quick_actions/editor_page.dart | 2 +- .../navigation/confirmation_dialogs.dart | 66 ++++++++++++++++ .../settings/navigation/navigation.dart | 2 + .../thumbnails/collection_actions_editor.dart | 4 +- .../settings/video/video_actions_editor.dart | 2 +- .../viewer/viewer_actions_editor.dart | 2 +- .../viewer/action/entry_action_delegate.dart | 25 ++---- untranslated.json | 36 +++++++++ 16 files changed, 263 insertions(+), 84 deletions(-) create mode 100644 lib/model/settings/enums/confirmation_dialogs.dart create mode 100644 lib/widgets/dialogs/aves_confirmation_dialog.dart create mode 100644 lib/widgets/settings/navigation/confirmation_dialogs.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index d71b62195..a515a5fd5 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -56,6 +56,7 @@ "resetButtonTooltip": "Reset", "doubleBackExitMessage": "Tap “back” again to exit.", + "doNotAskAgain": "Do not ask again", "sourceStateLoading": "Loading", "sourceStateCataloguing": "Cataloguing", @@ -569,6 +570,11 @@ "settingsKeepScreenOnTitle": "Keep Screen On", "settingsDoubleBackExit": "Tap “back” twice to exit", + "settingsConfirmationDialogTile": "Confirmation dialogs", + "settingsConfirmationDialogTitle": "Confirmation Dialogs", + "settingsConfirmationDialogDeleteItems": "Ask before deleting items forever", + "settingsConfirmationDialogMoveToBinItems": "Ask before moving items to the recycle bin", + "settingsNavigationDrawerTile": "Navigation menu", "settingsNavigationDrawerEditorTitle": "Navigation Menu", "settingsNavigationDrawerBanner": "Touch and hold to move and reorder menu items.", diff --git a/lib/model/settings/defaults.dart b/lib/model/settings/defaults.dart index bde23b6fa..e3c2de204 100644 --- a/lib/model/settings/defaults.dart +++ b/lib/model/settings/defaults.dart @@ -16,12 +16,13 @@ class SettingsDefaults { static const canUseAnalysisService = true; static const isInstalledAppAccessAllowed = false; static const isErrorReportingAllowed = false; + static const tileLayout = TileLayout.grid; + + // navigation static const mustBackTwiceToExit = true; static const keepScreenOn = KeepScreenOn.viewerOnly; static const homePage = HomePageSetting.collection; - static const tileLayout = TileLayout.grid; - - // drawer + static const confirmationDialogs = ConfirmationDialog.values; static final drawerTypeBookmarks = [ null, MimeFilter.video, diff --git a/lib/model/settings/enums/confirmation_dialogs.dart b/lib/model/settings/enums/confirmation_dialogs.dart new file mode 100644 index 000000000..4f1a58742 --- /dev/null +++ b/lib/model/settings/enums/confirmation_dialogs.dart @@ -0,0 +1,15 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +import 'enums.dart'; + +extension ExtraConfirmationDialog on ConfirmationDialog { + String getName(BuildContext context) { + switch (this) { + case ConfirmationDialog.delete: + return context.l10n.settingsConfirmationDialogDeleteItems; + case ConfirmationDialog.moveToBin: + return context.l10n.settingsConfirmationDialogMoveToBinItems; + } + } +} diff --git a/lib/model/settings/enums/enums.dart b/lib/model/settings/enums/enums.dart index f4678d208..8957d0141 100644 --- a/lib/model/settings/enums/enums.dart +++ b/lib/model/settings/enums/enums.dart @@ -1,16 +1,18 @@ -enum CoordinateFormat { dms, decimal } - enum AccessibilityAnimations { system, disabled, enabled } enum AccessibilityTimeout { system, appDefault, s10, s30, s60, s120 } -enum EntryBackground { black, white, checkered } +enum ConfirmationDialog { delete, moveToBin } -enum HomePageSetting { collection, albums } +enum CoordinateFormat { dms, decimal } + +enum EntryBackground { black, white, checkered } // browse providers at https://leaflet-extras.github.io/leaflet-providers/preview/ enum EntryMapStyle { googleNormal, googleHybrid, googleTerrain, osmHot, stamenToner, stamenWatercolor } +enum HomePageSetting { collection, albums } + enum KeepScreenOn { never, viewerOnly, always } enum UnitSystem { metric, imperial } diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 7643136ac..a3bdc638d 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -42,15 +42,16 @@ class Settings extends ChangeNotifier { static const isInstalledAppAccessAllowedKey = 'is_installed_app_access_allowed'; static const isErrorReportingAllowedKey = 'is_crashlytics_enabled'; static const localeKey = 'locale'; - static const mustBackTwiceToExitKey = 'must_back_twice_to_exit'; - static const keepScreenOnKey = 'keep_screen_on'; - static const homePageKey = 'home_page'; static const catalogTimeZoneKey = 'catalog_time_zone'; static const tileExtentPrefixKey = 'tile_extent_'; static const tileLayoutPrefixKey = 'tile_layout_'; static const topEntryIdsKey = 'top_entry_ids'; - // drawer + // navigation + static const mustBackTwiceToExitKey = 'must_back_twice_to_exit'; + static const keepScreenOnKey = 'keep_screen_on'; + static const homePageKey = 'home_page'; + static const confirmationDialogsKey = 'confirmation_dialogs'; static const drawerTypeBookmarksKey = 'drawer_type_bookmarks'; static const drawerAlbumBookmarksKey = 'drawer_album_bookmarks'; static const drawerPageBookmarksKey = 'drawer_page_bookmarks'; @@ -236,18 +237,6 @@ class Settings extends ChangeNotifier { return _appliedLocale!; } - bool get mustBackTwiceToExit => getBoolOrDefault(mustBackTwiceToExitKey, SettingsDefaults.mustBackTwiceToExit); - - set mustBackTwiceToExit(bool newValue) => setAndNotify(mustBackTwiceToExitKey, newValue); - - KeepScreenOn get keepScreenOn => getEnumOrDefault(keepScreenOnKey, SettingsDefaults.keepScreenOn, KeepScreenOn.values); - - set keepScreenOn(KeepScreenOn newValue) => setAndNotify(keepScreenOnKey, newValue.toString()); - - HomePageSetting get homePage => getEnumOrDefault(homePageKey, SettingsDefaults.homePage, HomePageSetting.values); - - set homePage(HomePageSetting newValue) => setAndNotify(homePageKey, newValue.toString()); - String get catalogTimeZone => getString(catalogTimeZoneKey) ?? ''; set catalogTimeZone(String newValue) => setAndNotify(catalogTimeZoneKey, newValue); @@ -264,7 +253,23 @@ class Settings extends ChangeNotifier { set topEntryIds(List? newValue) => setAndNotify(topEntryIdsKey, newValue?.map((id) => id.toString()).whereNotNull().toList()); - // drawer + // navigation + + bool get mustBackTwiceToExit => getBoolOrDefault(mustBackTwiceToExitKey, SettingsDefaults.mustBackTwiceToExit); + + set mustBackTwiceToExit(bool newValue) => setAndNotify(mustBackTwiceToExitKey, newValue); + + KeepScreenOn get keepScreenOn => getEnumOrDefault(keepScreenOnKey, SettingsDefaults.keepScreenOn, KeepScreenOn.values); + + set keepScreenOn(KeepScreenOn newValue) => setAndNotify(keepScreenOnKey, newValue.toString()); + + HomePageSetting get homePage => getEnumOrDefault(homePageKey, SettingsDefaults.homePage, HomePageSetting.values); + + set homePage(HomePageSetting newValue) => setAndNotify(homePageKey, newValue.toString()); + + List get confirmationDialogs => getEnumListOrDefault(confirmationDialogsKey, SettingsDefaults.confirmationDialogs, ConfirmationDialog.values); + + set confirmationDialogs(List newValue) => setAndNotify(confirmationDialogsKey, newValue.map((v) => v.toString()).toList()); List get drawerTypeBookmarks => (getStringList(drawerTypeBookmarksKey))?.map((v) { @@ -662,6 +667,7 @@ class Settings extends ChangeNotifier { debugPrint('failed to import key=$key, value=$value is not a string'); } break; + case confirmationDialogsKey: case drawerTypeBookmarksKey: case drawerAlbumBookmarksKey: case drawerPageBookmarksKey: diff --git a/lib/widgets/collection/entry_set_action_delegate.dart b/lib/widgets/collection/entry_set_action_delegate.dart index 6e38e1f22..6c6f8766b 100644 --- a/lib/widgets/collection/entry_set_action_delegate.dart +++ b/lib/widgets/collection/entry_set_action_delegate.dart @@ -10,6 +10,7 @@ import 'package:aves/model/favourites.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/query.dart'; import 'package:aves/model/selection.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/analysis_controller.dart'; import 'package:aves/model/source/collection_lens.dart'; @@ -24,6 +25,7 @@ import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; import 'package:aves/widgets/common/action_mixins/size_aware.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/map/map_page.dart'; import 'package:aves/widgets/search/search_delegate.dart'; @@ -262,25 +264,12 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware final selectionDirs = entries.map((e) => e.directory).whereNotNull().toSet(); final todoCount = entries.length; - final confirmed = await showDialog( + if (!(await showConfirmationDialog( context: context, - builder: (context) { - return AvesDialog( - content: Text(l10n.deleteEntriesConfirmationDialogMessage(todoCount)), - actions: [ - TextButton( - onPressed: () => Navigator.pop(context), - child: Text(MaterialLocalizations.of(context).cancelButtonLabel), - ), - TextButton( - onPressed: () => Navigator.pop(context, true), - child: Text(l10n.deleteButtonLabel), - ), - ], - ); - }, - ); - if (confirmed == null || !confirmed) return; + type: ConfirmationDialog.delete, + message: l10n.deleteEntriesConfirmationDialogMessage(todoCount), + confirmationButtonLabel: l10n.deleteButtonLabel, + ))) return; if (!pureTrash && !await checkStoragePermissionForAlbums(context, selectionDirs, entries: entries)) return; diff --git a/lib/widgets/common/action_mixins/entry_storage.dart b/lib/widgets/common/action_mixins/entry_storage.dart index c175c0e2a..c53ab8247 100644 --- a/lib/widgets/common/action_mixins/entry_storage.dart +++ b/lib/widgets/common/action_mixins/entry_storage.dart @@ -7,6 +7,7 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/trash.dart'; import 'package:aves/model/highlight.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/services/common/image_op_events.dart'; @@ -19,7 +20,7 @@ import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; import 'package:aves/widgets/common/action_mixins/size_aware.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; -import 'package:aves/widgets/dialogs/aves_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; import 'package:aves/widgets/filter_grids/album_pick.dart'; import 'package:collection/collection.dart'; @@ -41,25 +42,12 @@ mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { final l10n = context.l10n; if (toBin) { - final confirmed = await showDialog( + if (!(await showConfirmationDialog( context: context, - builder: (context) { - return AvesDialog( - content: Text(l10n.binEntriesConfirmationDialogMessage(todoCount)), - actions: [ - TextButton( - onPressed: () => Navigator.pop(context), - child: Text(MaterialLocalizations.of(context).cancelButtonLabel), - ), - TextButton( - onPressed: () => Navigator.pop(context, true), - child: Text(l10n.deleteButtonLabel), - ), - ], - ); - }, - ); - if (confirmed == null || !confirmed) return; + type: ConfirmationDialog.moveToBin, + message: l10n.binEntriesConfirmationDialogMessage(todoCount), + confirmationButtonLabel: l10n.deleteButtonLabel, + ))) return; } final source = context.read(); diff --git a/lib/widgets/dialogs/aves_confirmation_dialog.dart b/lib/widgets/dialogs/aves_confirmation_dialog.dart new file mode 100644 index 000000000..6d51c812e --- /dev/null +++ b/lib/widgets/dialogs/aves_confirmation_dialog.dart @@ -0,0 +1,79 @@ +import 'package:aves/model/settings/enums/enums.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/material.dart'; + +import 'aves_dialog.dart'; + +Future showConfirmationDialog({ + required BuildContext context, + required ConfirmationDialog type, + required String message, + required String confirmationButtonLabel, +}) async { + if (!settings.confirmationDialogs.contains(type)) return true; + + final confirmed = await showDialog( + context: context, + builder: (context) => AvesConfirmationDialog( + type: type, + message: message, + confirmationButtonLabel: confirmationButtonLabel, + ), + ); + return confirmed == true; +} + +class AvesConfirmationDialog extends StatefulWidget { + final ConfirmationDialog type; + final String message, confirmationButtonLabel; + + const AvesConfirmationDialog({ + Key? key, + required this.type, + required this.message, + required this.confirmationButtonLabel, + }) : super(key: key); + + @override + _AvesConfirmationDialogState createState() => _AvesConfirmationDialogState(); +} + +class _AvesConfirmationDialogState extends State { + final ValueNotifier _skipConfirmation = ValueNotifier(false); + + @override + Widget build(BuildContext context) { + return AvesDialog( + scrollableContent: [ + Padding( + padding: const EdgeInsets.all(16) + const EdgeInsets.only(top: 8), + child: Text(widget.message), + ), + ValueListenableBuilder( + valueListenable: _skipConfirmation, + builder: (context, ask, child) => SwitchListTile( + value: ask, + onChanged: (v) => _skipConfirmation.value = v, + title: Text(context.l10n.doNotAskAgain), + ), + ), + ], + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(MaterialLocalizations.of(context).cancelButtonLabel), + ), + TextButton( + onPressed: () { + if (_skipConfirmation.value) { + settings.confirmationDialogs = settings.confirmationDialogs.toList()..remove(widget.type); + } + Navigator.pop(context, true); + }, + child: Text(widget.confirmationButtonLabel), + ), + ], + ); + } +} diff --git a/lib/widgets/settings/common/quick_actions/editor_page.dart b/lib/widgets/settings/common/quick_actions/editor_page.dart index e3d87797a..874441321 100644 --- a/lib/widgets/settings/common/quick_actions/editor_page.dart +++ b/lib/widgets/settings/common/quick_actions/editor_page.dart @@ -97,7 +97,7 @@ class _QuickActionEditorBodyState extends State const ConfirmationDialogPage(), + ), + ); + }, + ); + } +} + +class ConfirmationDialogPage extends StatelessWidget { + static const routeName = '/settings/navigation_confirmation'; + + const ConfirmationDialogPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(context.l10n.settingsConfirmationDialogTitle), + ), + body: SafeArea( + child: Selector>( + selector: (context, s) => s.confirmationDialogs, + builder: (context, current, child) => ListView( + children: [ + ConfirmationDialog.moveToBin, + ConfirmationDialog.delete, + ] + .map((dialog) => SwitchListTile( + value: current.contains(dialog), + onChanged: (v) { + final dialogs = current.toList(); + if (v) { + dialogs.add(dialog); + } else { + dialogs.remove(dialog); + } + settings.confirmationDialogs = dialogs; + }, + title: Text(dialog.getName(context)), + )) + .toList(), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/settings/navigation/navigation.dart b/lib/widgets/settings/navigation/navigation.dart index 57c6c5c51..15ed104e6 100644 --- a/lib/widgets/settings/navigation/navigation.dart +++ b/lib/widgets/settings/navigation/navigation.dart @@ -8,6 +8,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; import 'package:aves/widgets/settings/common/tile_leading.dart'; +import 'package:aves/widgets/settings/navigation/confirmation_dialogs.dart'; import 'package:aves/widgets/settings/navigation/drawer.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -53,6 +54,7 @@ class NavigationSection extends StatelessWidget { }, ), const NavigationDrawerTile(), + const ConfirmationDialogTile(), ListTile( title: Text(context.l10n.settingsKeepScreenOnTile), subtitle: Text(currentKeepScreenOn.getName(context)), diff --git a/lib/widgets/settings/thumbnails/collection_actions_editor.dart b/lib/widgets/settings/thumbnails/collection_actions_editor.dart index 79c4594dc..05da541a0 100644 --- a/lib/widgets/settings/thumbnails/collection_actions_editor.dart +++ b/lib/widgets/settings/thumbnails/collection_actions_editor.dart @@ -42,7 +42,7 @@ class CollectionActionEditorPage extends StatelessWidget { allAvailableActions: EntrySetActions.browsing, actionIcon: (action) => action.getIcon(), actionText: (context, action) => action.getText(context), - load: () => settings.collectionBrowsingQuickActions.toList(), + load: () => settings.collectionBrowsingQuickActions, save: (actions) => settings.collectionBrowsingQuickActions = actions, ), ), @@ -53,7 +53,7 @@ class CollectionActionEditorPage extends StatelessWidget { allAvailableActions: EntrySetActions.selection, actionIcon: (action) => action.getIcon(), actionText: (context, action) => action.getText(context), - load: () => settings.collectionSelectionQuickActions.toList(), + load: () => settings.collectionSelectionQuickActions, save: (actions) => settings.collectionSelectionQuickActions = actions, ), ), diff --git a/lib/widgets/settings/video/video_actions_editor.dart b/lib/widgets/settings/video/video_actions_editor.dart index d0429ffa2..f52cd5ab4 100644 --- a/lib/widgets/settings/video/video_actions_editor.dart +++ b/lib/widgets/settings/video/video_actions_editor.dart @@ -37,7 +37,7 @@ class VideoActionEditorPage extends StatelessWidget { allAvailableActions: VideoActions.all, actionIcon: (action) => action.getIcon(), actionText: (context, action) => action.getText(context), - load: () => settings.videoQuickActions.toList(), + load: () => settings.videoQuickActions, save: (actions) => settings.videoQuickActions = actions, ); } diff --git a/lib/widgets/settings/viewer/viewer_actions_editor.dart b/lib/widgets/settings/viewer/viewer_actions_editor.dart index 17018e0df..88b1859d6 100644 --- a/lib/widgets/settings/viewer/viewer_actions_editor.dart +++ b/lib/widgets/settings/viewer/viewer_actions_editor.dart @@ -44,7 +44,7 @@ class ViewerActionEditorPage extends StatelessWidget { allAvailableActions: allAvailableActions, actionIcon: (action) => action.getIcon(), actionText: (context, action) => action.getText(context), - load: () => settings.viewerQuickActions.toList(), + load: () => settings.viewerQuickActions, save: (actions) => settings.viewerQuickActions = actions, ); } diff --git a/lib/widgets/viewer/action/entry_action_delegate.dart b/lib/widgets/viewer/action/entry_action_delegate.dart index 8e98a8d4f..48ef7bd9f 100644 --- a/lib/widgets/viewer/action/entry_action_delegate.dart +++ b/lib/widgets/viewer/action/entry_action_delegate.dart @@ -9,6 +9,7 @@ import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_metadata_edition.dart'; import 'package:aves/model/filters/album.dart'; import 'package:aves/model/highlight.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; @@ -24,6 +25,7 @@ import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; import 'package:aves/widgets/common/action_mixins/size_aware.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart'; +import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/entry_editors/rename_dialog.dart'; import 'package:aves/widgets/dialogs/export_entry_dialog.dart'; @@ -173,25 +175,12 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix } final l10n = context.l10n; - final confirmed = await showDialog( + if (!(await showConfirmationDialog( context: context, - builder: (context) { - return AvesDialog( - content: Text(l10n.deleteEntriesConfirmationDialogMessage(1)), - actions: [ - TextButton( - onPressed: () => Navigator.pop(context), - child: Text(MaterialLocalizations.of(context).cancelButtonLabel), - ), - TextButton( - onPressed: () => Navigator.pop(context, true), - child: Text(l10n.deleteButtonLabel), - ), - ], - ); - }, - ); - if (confirmed == null || !confirmed) return; + type: ConfirmationDialog.delete, + message: l10n.deleteEntriesConfirmationDialogMessage(1), + confirmationButtonLabel: l10n.deleteButtonLabel, + ))) return; if (!await checkStoragePermission(context, {entry})) return; diff --git a/untranslated.json b/untranslated.json index cfa5917f9..224f209ba 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,47 +1,83 @@ { "de": [ "timeDays", + "doNotAskAgain", "entryActionConvert", "entryActionRestore", "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle", + "settingsConfirmationDialogTile", + "settingsConfirmationDialogTitle", + "settingsConfirmationDialogDeleteItems", + "settingsConfirmationDialogMoveToBinItems", "settingsEnableBin", "settingsEnableBinSubtitle" ], "es": [ "timeDays", + "doNotAskAgain", "entryActionRestore", "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle", + "settingsConfirmationDialogTile", + "settingsConfirmationDialogTitle", + "settingsConfirmationDialogDeleteItems", + "settingsConfirmationDialogMoveToBinItems", "settingsEnableBin", "settingsEnableBinSubtitle" ], + "fr": [ + "doNotAskAgain", + "settingsConfirmationDialogTile", + "settingsConfirmationDialogTitle", + "settingsConfirmationDialogDeleteItems", + "settingsConfirmationDialogMoveToBinItems" + ], + + "ko": [ + "doNotAskAgain", + "settingsConfirmationDialogTile", + "settingsConfirmationDialogTitle", + "settingsConfirmationDialogDeleteItems", + "settingsConfirmationDialogMoveToBinItems" + ], + "pt": [ "timeDays", + "doNotAskAgain", "entryActionConvert", "entryActionRestore", "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle", + "settingsConfirmationDialogTile", + "settingsConfirmationDialogTitle", + "settingsConfirmationDialogDeleteItems", + "settingsConfirmationDialogMoveToBinItems", "settingsEnableBin", "settingsEnableBinSubtitle" ], "ru": [ "timeDays", + "doNotAskAgain", "entryActionConvert", "entryActionRestore", "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle", + "settingsConfirmationDialogTile", + "settingsConfirmationDialogTitle", + "settingsConfirmationDialogDeleteItems", + "settingsConfirmationDialogMoveToBinItems", "settingsEnableBin", "settingsEnableBinSubtitle" ] From 268b064cdf3104274399a454a0b8ff671b928749 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 19 Feb 2022 09:41:33 +0900 Subject: [PATCH 22/39] minor fix --- lib/widgets/common/grid/item_tracker.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/widgets/common/grid/item_tracker.dart b/lib/widgets/common/grid/item_tracker.dart index f7b16f219..3bb375a9e 100644 --- a/lib/widgets/common/grid/item_tracker.dart +++ b/lib/widgets/common/grid/item_tracker.dart @@ -148,6 +148,8 @@ class _GridItemTrackerState extends State> with WidgetsBin } void _onLayoutChange() { + if (scrollController.positions.length != 1) return; + // do not track when view shows top edge if (scrollController.offset == 0) return; From d31865143122ac07e2729374db168cda43cdba0a Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 19 Feb 2022 14:48:52 +0900 Subject: [PATCH 23/39] l10n: id --- CHANGELOG.md | 1 + README.md | 2 +- .../app/src/main/res/values-id/strings.xml | 10 + .../metadata/android/id/full_description.txt | 5 + .../metadata/android/id/short_description.txt | 1 + lib/l10n/app_id.arb | 560 ++++++++++++++++++ lib/widgets/about/credits.dart | 1 + lib/widgets/settings/language/locales.dart | 1 + 8 files changed, 580 insertions(+), 1 deletion(-) create mode 100644 android/app/src/main/res/values-id/strings.xml create mode 100644 fastlane/metadata/android/id/full_description.txt create mode 100644 fastlane/metadata/android/id/short_description.txt create mode 100644 lib/l10n/app_id.arb diff --git a/CHANGELOG.md b/CHANGELOG.md index 69cf21084..4c125f729 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Viewer: actions to copy/move to album +- Indonesian translation (thanks MeFinity) ### Changed diff --git a/README.md b/README.md index b0a042f9c..4f17a28bb 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ At this stage this project does *not* accept PRs, except for translations. ### 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 are handled by generous volunteers. +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 are handled by generous volunteers. ### Donations diff --git a/android/app/src/main/res/values-id/strings.xml b/android/app/src/main/res/values-id/strings.xml new file mode 100644 index 000000000..f750d1a0f --- /dev/null +++ b/android/app/src/main/res/values-id/strings.xml @@ -0,0 +1,10 @@ + + + Aves + Cari + Video + Pindai media + Pindai gambar & video + Memindai media + Berhenti + \ No newline at end of file diff --git a/fastlane/metadata/android/id/full_description.txt b/fastlane/metadata/android/id/full_description.txt new file mode 100644 index 000000000..60d4c271f --- /dev/null +++ b/fastlane/metadata/android/id/full_description.txt @@ -0,0 +1,5 @@ +Aves dapat menangani semua jenis gambar dan video, termasuk JPEG dan MP4, tetapi juga hal-hal yang lebih eksotis seperti TIFF halaman-multi, SVG, AVI lama, dan lainnya! Ini memindai koleksi media Anda untuk mengidentifikasi foto bergerak, panorama (foto 360), video 360°, dan file GeoTIFF. + +Navigasi dan pencarian merupakan bagian penting dari Aves. Tujuannya adalah agar pengguna dengan mudah mengalir dari album ke foto ke tag ke peta, dll. + +Aves terintegrasi dengan Android (dari API 19 ke 32, yaitu dari KitKat ke Android 12L) dengan fitur-fitur seperti pintasan aplikasi dan pencarian global penanganan. Ini juga berfungsi sebagai penampil dan pemilih media. \ No newline at end of file diff --git a/fastlane/metadata/android/id/short_description.txt b/fastlane/metadata/android/id/short_description.txt new file mode 100644 index 000000000..0dc05cdc9 --- /dev/null +++ b/fastlane/metadata/android/id/short_description.txt @@ -0,0 +1 @@ +Galeri dan penjelajah metadata \ No newline at end of file diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb new file mode 100644 index 000000000..bbf3c7ed8 --- /dev/null +++ b/lib/l10n/app_id.arb @@ -0,0 +1,560 @@ +{ + "appName": "Aves", + "welcomeMessage": "Selamat datang ke Aves", + "welcomeOptional": "Opsional", + "welcomeTermsToggle": "Saya menyetujui syarat dan ketentuan", + "itemCount": "{count, plural, other{{count} benda}}", + + "timeSeconds": "{seconds, plural, other{{seconds} detik}}", + "timeMinutes": "{minutes, plural, other{{minutes} menit}}", + "timeDays": "{days, plural, other{{days} hari}}", + "focalLength": "{length} mm", + + "applyButtonLabel": "TERAPKAN", + "deleteButtonLabel": "BUANG", + "nextButtonLabel": "SELANJUTNYA", + "showButtonLabel": "TAMPILKAN", + "hideButtonLabel": "SEMBUNYIKAN", + "continueButtonLabel": "SELANJUTNYA", + + "cancelTooltip": "Batalkan", + "changeTooltip": "Ganti", + "clearTooltip": "Hapus", + "previousTooltip": "Sebelumnya", + "nextTooltip": "Selanjutnya", + "showTooltip": "Tampilkan", + "hideTooltip": "Sembunyikan", + "actionRemove": "Hapus", + "resetButtonTooltip": "Ulang", + + "doubleBackExitMessage": "Pencet “kembali” lagi untuk keluar.", + "doNotAskAgain": "Jangan tanya lagi", + + "sourceStateLoading": "Memuat", + "sourceStateCataloguing": "Mengkatalog", + "sourceStateLocatingCountries": "Mencari negara", + "sourceStateLocatingPlaces": "Mencari tempat", + + "chipActionDelete": "Hapus", + "chipActionGoToAlbumPage": "Tampilkan di Album", + "chipActionGoToCountryPage": "Tampilkan di Negara", + "chipActionGoToTagPage": "Tampilkan di Tag", + "chipActionHide": "Sembunyikan", + "chipActionPin": "Sematkan ke atas", + "chipActionUnpin": "Lepas sematan dari atas", + "chipActionRename": "Ganti nama", + "chipActionSetCover": "Setel sampul", + "chipActionCreateAlbum": "Membuat album", + + "entryActionCopyToClipboard": "Salinan ke papan", + "entryActionDelete": "Hapus", + "entryActionConvert": "Ubah", + "entryActionExport": "Ekspor", + "entryActionRename": "Ganti nama", + "entryActionRestore": "Pulihkan", + "entryActionRotateCCW": "Putar berlawanan arah jarum jam", + "entryActionRotateCW": "Putar searah jarum jam", + "entryActionFlip": "Balik secara horisontal", + "entryActionPrint": "Cetak", + "entryActionShare": "Bagikan", + "entryActionViewSource": "Lihat sumber", + "entryActionViewMotionPhotoVideo": "Buka Foto bergerak", + "entryActionEdit": "Ubah", + "entryActionOpen": "Buka dengan", + "entryActionSetAs": "Tetapkan sebagai", + "entryActionOpenMap": "Tampilkan di peta", + "entryActionRotateScreen": "Putar layar", + "entryActionAddFavourite": "Tambahkan ke favorit", + "entryActionRemoveFavourite": "Hapus dari favorit", + + "videoActionCaptureFrame": "Tangkap bingkai", + "videoActionPause": "Henti", + "videoActionPlay": "Mainkan", + "videoActionReplay10": "Mundur 10 detik", + "videoActionSkip10": "Majukan 10 detik", + "videoActionSelectStreams": "Pilih trek", + "videoActionSetSpeed": "Kecepatan pemutaran", + "videoActionSettings": "Pengaturan", + + "entryInfoActionEditDate": "Ubah tanggal & waktu", + "entryInfoActionEditLocation": "Ubah lokasi", + "entryInfoActionEditRating": "Ubah peringkat", + "entryInfoActionEditTags": "Ubah tag", + "entryInfoActionRemoveMetadata": "Hapus metadata", + + "filterBinLabel": "Tong sampah", + "filterFavouriteLabel": "Favorit", + "filterLocationEmptyLabel": "Lokasi Tidak ditemukan", + "filterTagEmptyLabel": "Tidak ditag", + "filterRatingUnratedLabel": "Belum diberi peringkat", + "filterRatingRejectedLabel": "Ditolak", + "filterTypeAnimatedLabel": "Teranimasi", + "filterTypeMotionPhotoLabel": "Foto bergerak", + "filterTypePanoramaLabel": "Panorama", + "filterTypeRawLabel": "Raw", + "filterTypeSphericalVideoLabel": "Video 360°", + "filterTypeGeotiffLabel": "GeoTIFF", + "filterMimeImageLabel": "Gambar", + "filterMimeVideoLabel": "Video", + + "coordinateFormatDms": "DMS", + "coordinateFormatDecimal": "Derajat desimal", + "coordinateDms": "{coordinate} {direction}", + "coordinateDmsNorth": "N", + "coordinateDmsSouth": "S", + "coordinateDmsEast": "E", + "coordinateDmsWest": "W", + + "unitSystemMetric": "Metrik", + "unitSystemImperial": "Imperial", + + "videoLoopModeNever": "Tidak pernah", + "videoLoopModeShortOnly": "Hanya video pendek", + "videoLoopModeAlways": "Selalu", + + "mapStyleGoogleNormal": "Google Maps", + "mapStyleGoogleHybrid": "Google Maps (Hybrid)", + "mapStyleGoogleTerrain": "Google Maps (Terrain)", + "mapStyleOsmHot": "Humanitarian OSM", + "mapStyleStamenToner": "Stamen Toner", + "mapStyleStamenWatercolor": "Stamen Watercolor", + + "nameConflictStrategyRename": "Ganti nama", + "nameConflictStrategyReplace": "Ganti", + "nameConflictStrategySkip": "Lewati", + + "keepScreenOnNever": "Tidak pernah", + "keepScreenOnViewerOnly": "Hanya halaman pemirsa", + "keepScreenOnAlways": "Selalu", + + "accessibilityAnimationsRemove": "Mencegah efek layar", + "accessibilityAnimationsKeep": "Simpan efek layar", + + "albumTierNew": "Baru", + "albumTierPinned": "Disemat", + "albumTierSpecial": "Umum", + "albumTierApps": "Aplikasi", + "albumTierRegular": "Lainnya", + + "storageVolumeDescriptionFallbackPrimary": "Penyimpanan internal", + "storageVolumeDescriptionFallbackNonPrimary": "kartu SD", + "rootDirectoryDescription": "direktori root", + "otherDirectoryDescription": "“{name}” direktori", + "storageAccessDialogTitle": "Akses Penyimpanan", + "storageAccessDialogMessage": "Silahkan pilih {directory} dari “{volume}” di layar berikutnya untuk memberikan akses aplikasi ini ke sana.", + "restrictedAccessDialogTitle": "Akses Terbatas", + "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.", + "notEnoughSpaceDialogTitle": "Tidak Cukup Ruang", + "notEnoughSpaceDialogMessage": "Operasi ini memerlukan {neededSize} ruang kosong di “{volume}” untuk menyelesaikan, tetapi hanya ada {freeSize} tersisa.", + "missingSystemFilePickerDialogTitle": "Pemilih File Sistem Tidak Ada", + "missingSystemFilePickerDialogMessage": "Pemilih file sistem tidak ada atau dinonaktifkan. Harap aktifkan dan coba lagi.", + + "unsupportedTypeDialogTitle": "Jenis Yang Tidak Didukung", + "unsupportedTypeDialogMessage": "{count, plural, other{Operasi ini tidak didukung untuk benda dari jenis berikut: {types}.}}", + + "nameConflictDialogSingleSourceMessage": "Beberapa file di folder tujuan memiliki nama yang sama.", + "nameConflictDialogMultipleSourceMessage": "Beberapa file memiliki nama yang sama.", + + "addShortcutDialogLabel": "Label pintasan", + "addShortcutButtonLabel": "TAMBAH", + + "noMatchingAppDialogTitle": "Tidak Ada Aplikasi Yang Cocok", + "noMatchingAppDialogMessage": "Tidak ada aplikasi yang cocok untuk menangani ini.", + + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Pindah benda ini ke tong sampah?} other{Pindah {count} benda ke tempat sampah?}}", + "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Anda yakin ingin menghapus benda ini?} other{Apakah Anda yakin ingin menghapus {count} benda?}}", + + "videoResumeDialogMessage": "Apakah Anda ingin melanjutkan di {time}?", + "videoStartOverButtonLabel": "ULANG DARI AWAL", + "videoResumeButtonLabel": "LANJUT", + + "setCoverDialogTitle": "Setel Sampul", + "setCoverDialogLatest": "Benda terbaru", + "setCoverDialogCustom": "Kustom", + + "hideFilterConfirmationDialogMessage": "Foto dan video yang cocok akan disembunyikan dari koleksi Anda. Anda dapat menampilkannya lagi dari pengaturan “Privasi”.\n\nApakah Anda yakin ingin menyembunyikannya?", + + "newAlbumDialogTitle": "Album Baru", + "newAlbumDialogNameLabel": "Nama album", + "newAlbumDialogNameLabelAlreadyExistsHelper": "Direktori sudah ada", + "newAlbumDialogStorageLabel": "Penyimpanan:", + + "renameAlbumDialogLabel": "Nama baru", + "renameAlbumDialogLabelAlreadyExistsHelper": "Direktori sudah ada", + + "deleteSingleAlbumConfirmationDialogMessage": "{count, plural, =1{Anda yakin ingin menghapus album ini dan bendanya?} other{Apakah Anda yakin ingin menghapus album ini dan {count} bendanya?}}", + "deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{Yakin ingin menghapus album ini dan bendanya?} other{Anda yakin ingin menghapus album ini dan {count} bendanya?}}", + + "exportEntryDialogFormat": "Format:", + "exportEntryDialogWidth": "Lebar", + "exportEntryDialogHeight": "Tinggi", + + "renameEntryDialogLabel": "Nama baru", + + "editEntryDateDialogTitle": "Tanggal & Waktu", + "editEntryDateDialogSetCustom": "Atur tanggal khusus", + "editEntryDateDialogCopyField": "Salin dari tanggal lain", + "editEntryDateDialogExtractFromTitle": "Ekstrak dari judul", + "editEntryDateDialogShift": "Geser", + "editEntryDateDialogSourceFileModifiedDate": "Tanggal modifikasi file", + "editEntryDateDialogTargetFieldsHeader": "Bidang untuk dimodifikasikan", + "editEntryDateDialogHours": "Jam", + "editEntryDateDialogMinutes": "Menit", + + "editEntryLocationDialogTitle": "Lokasi", + "editEntryLocationDialogChooseOnMapTooltip": "Pilih di peta", + "editEntryLocationDialogLatitude": "Garis lintang", + "editEntryLocationDialogLongitude": "Garis bujur", + + "locationPickerUseThisLocationButton": "Gunakan lokasi ini", + + "editEntryRatingDialogTitle": "Peringkat", + + "removeEntryMetadataDialogTitle": "Penghapusan Metadata", + "removeEntryMetadataDialogMore": "Lebih Banyak", + + "removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP diperlukan untuk memutar video di dalam Foto bergerak.\n\nAnda yakin ingin menghapusnya?", + + "videoSpeedDialogLabel": "Kecepatan pemutaran", + + "videoStreamSelectionDialogVideo": "Video", + "videoStreamSelectionDialogAudio": "Audio", + "videoStreamSelectionDialogText": "Subtitle", + "videoStreamSelectionDialogOff": "Mati", + "videoStreamSelectionDialogTrack": "Trek", + "videoStreamSelectionDialogNoSelection": "Tidak ada Trek yang lain.", + + "genericSuccessFeedback": "Sukses!", + "genericFailureFeedback": "Gagal", + + "menuActionConfigureView": "Lihat", + "menuActionSelect": "Pilih", + "menuActionSelectAll": "Pilih semua", + "menuActionSelectNone": "Pilih tidak ada", + "menuActionMap": "Peta", + "menuActionStats": "Statistik", + + "viewDialogTabSort": "Sortir", + "viewDialogTabGroup": "Grup", + "viewDialogTabLayout": "Tata letak", + + "tileLayoutGrid": "Grid", + "tileLayoutList": "Daftar", + + "aboutPageTitle": "Tentang", + "aboutLinkSources": "Sumber", + "aboutLinkLicense": "Lisensi", + "aboutLinkPolicy": "Aturan Privasi", + + "aboutBug": "Lapor Bug", + "aboutBugSaveLogInstruction": "Simpan log aplikasi ke file", + "aboutBugSaveLogButton": "Simpan", + "aboutBugCopyInfoInstruction": "Salin informasi sistem", + "aboutBugCopyInfoButton": "Salin", + "aboutBugReportInstruction": "Laporkan ke GitHub dengan log dan informasi sistem", + "aboutBugReportButton": "Rapor", + + "aboutCredits": "Kredit", + "aboutCreditsWorldAtlas1": "Aplikasi ini menggunakan file TopoJSON dari", + "aboutCreditsWorldAtlas2": "dibawah Lisensi ISC.", + "aboutCreditsTranslators": "Penerjemah:", + "aboutCreditsTranslatorLine": "{language}: {names}", + + "aboutLicenses": "Lisensi Sumber Terbuka", + "aboutLicensesBanner": "Aplikasi ini menggunakan paket dan pustaka sumber terbuka berikut.", + "aboutLicensesAndroidLibraries": "Perpustakaan Android", + "aboutLicensesFlutterPlugins": "Plugin Flutter", + "aboutLicensesFlutterPackages": "Paket Flutter", + "aboutLicensesDartPackages": "Paket Dart", + "aboutLicensesShowAllButtonLabel": "Tampilkan Semua Lisensi", + + "policyPageTitle": "Aturan Privasi", + + "collectionPageTitle": "Koleksi", + "collectionPickPageTitle": "Pilih", + "collectionSelectionPageTitle": "{count, plural, =0{Pilih benda} other{{count} benda}}", + + "collectionActionShowTitleSearch": "Tampilkan filter judul", + "collectionActionHideTitleSearch": "Sembunyikan filter judul", + "collectionActionAddShortcut": "Tambahkan pintasan", + "collectionActionEmptyBin": "Kosongkan sampah", + "collectionActionCopy": "Salin ke album", + "collectionActionMove": "Pindah ke album", + "collectionActionRescan": "Pindai ulang", + "collectionActionEdit": "Ubah", + + "collectionSearchTitlesHintText": "Cari judul", + + "collectionSortDate": "Lewat tanggal", + "collectionSortSize": "Lewat ukuran", + "collectionSortName": "Lewat nama album & file", + "collectionSortRating": "Lewat peringkat", + + "collectionGroupAlbum": "Lewat album", + "collectionGroupMonth": "Lewat bulan", + "collectionGroupDay": "Lewat hari", + "collectionGroupNone": "Jangan kelompokkan", + + "sectionUnknown": "Tidak dikenal", + "dateToday": "Hari ini", + "dateYesterday": "Kemaren", + "dateThisMonth": "Bulan ini", + "collectionDeleteFailureFeedback": "{count, plural, other{Gagal untuk menghapus {count} benda}}", + "collectionCopyFailureFeedback": "{count, plural, other{Gagal untuk menyalin {count} benda}}", + "collectionMoveFailureFeedback": "{count, plural, other{Gagal untuk menggerakkan {count} benda}}", + "collectionEditFailureFeedback": "{count, plural, other{Gagal untuk mengubah {count} benda}}", + "collectionExportFailureFeedback": "{count, plural, other{Gagal untuk mengekspor {count} halaman}}", + "collectionCopySuccessFeedback": "{count, plural, other{Menyalin {count} benda}}", + "collectionMoveSuccessFeedback": "{count, plural, other{Menggerakkan {count} benda}}", + "collectionEditSuccessFeedback": "{count, plural, other{Mengubah {count} benda}}", + + "collectionEmptyFavourites": "Tidak ada favorit", + "collectionEmptyVideos": "Tidak ada video", + "collectionEmptyImages": "Tidak ada gambar", + + "collectionSelectSectionTooltip": "Pilih bagian", + "collectionDeselectSectionTooltip": "Batalkan pilihan bagian", + + "drawerCollectionAll": "Semua koleksi", + "drawerCollectionFavourites": "Favorit", + "drawerCollectionImages": "Gambar", + "drawerCollectionVideos": "Video", + "drawerCollectionAnimated": "Teranimasi", + "drawerCollectionMotionPhotos": "Foto bergerak", + "drawerCollectionPanoramas": "Panorama", + "drawerCollectionRaws": "Foto Raw", + "drawerCollectionSphericalVideos": "Video 360°", + + "chipSortDate": "Lewat tanggal", + "chipSortName": "Lewat nama", + "chipSortCount": "Lewat jumlah benda", + + "albumGroupTier": "Lewat tingkat", + "albumGroupVolume": "Lewat volume penyimpanan", + "albumGroupNone": "Jangan kelompokkan", + + "albumPickPageTitleCopy": "Salin ke Album", + "albumPickPageTitleExport": "Ekspor ke Album", + "albumPickPageTitleMove": "Pindah ke Album", + "albumPickPageTitlePick": "Pilih Album", + + "albumCamera": "Kamera", + "albumDownload": "Download", + "albumScreenshots": "Tangkapan layar", + "albumScreenRecordings": "Rekaman layar", + "albumVideoCaptures": "Tangkapan Video", + + "albumPageTitle": "Album", + "albumEmpty": "Tidak ada album", + "createAlbumTooltip": "Buat album", + "createAlbumButtonLabel": "BUAT", + "newFilterBanner": "baru", + + "countryPageTitle": "Negara", + "countryEmpty": "Tidak ada negara", + + "tagPageTitle": "Tag", + "tagEmpty": "Tidak ada tag", + + "binPageTitle": "Tong Sampah", + + "searchCollectionFieldHint": "Cari koleksi", + "searchSectionRecent": "Terkini", + "searchSectionAlbums": "Album", + "searchSectionCountries": "Negara", + "searchSectionPlaces": "Tempat", + "searchSectionTags": "Tag", + "searchSectionRating": "Peringkat", + + "settingsPageTitle": "Pengaturan", + "settingsSystemDefault": "Sistem", + "settingsDefault": "Default", + + "settingsActionExport": "Ekspor", + "settingsActionImport": "Impor", + + "appExportCovers": "Sampul", + "appExportFavourites": "Favorit", + "appExportSettings": "Pengaturan", + + "settingsSectionNavigation": "Navigasi", + "settingsHome": "Home", + "settingsKeepScreenOnTile": "Biarkan layarnya menyala", + "settingsKeepScreenOnTitle": "Biarkan Layarnya Menyala", + "settingsDoubleBackExit": "Ketuk “kembali” dua kali untuk keluar", + + "settingsConfirmationDialogTile": "Dialog konfirmasi", + "settingsConfirmationDialogTitle": "Dialog Konfirmasi", + "settingsConfirmationDialogDeleteItems": "Tanya sebelum menghapus benda selamanya", + "settingsConfirmationDialogMoveToBinItems": "Tanya sebelum memindahkan benda ke tempat sampah", + "settingsNavigationDrawerTile": "Menu navigasi", + "settingsNavigationDrawerEditorTitle": "Menu Navigasi", + "settingsNavigationDrawerBanner": "Sentuh dan tahan untuk memindahkan dan menyusun ulang benda menu.", + "settingsNavigationDrawerTabTypes": "Tipe", + "settingsNavigationDrawerTabAlbums": "Album", + "settingsNavigationDrawerTabPages": "Halaman", + "settingsNavigationDrawerAddAlbum": "Tambahkan album", + + "settingsSectionThumbnails": "Thumbnail", + "settingsThumbnailShowFavouriteIcon": "Tampilkan ikon favorit", + "settingsThumbnailShowLocationIcon": "Tampilkan ikon lokasi", + "settingsThumbnailShowMotionPhotoIcon": "Tampilkan ikon Foto bergerak", + "settingsThumbnailShowRating": "Tampilkan peringkat", + "settingsThumbnailShowRawIcon": "Tampilkan ikon raw", + "settingsThumbnailShowVideoDuration": "Tampilkan durasi video", + + "settingsCollectionQuickActionsTile": "Aksi cepat", + "settingsCollectionQuickActionEditorTitle": "Aksi Cepat", + "settingsCollectionQuickActionTabBrowsing": "Menjelajah", + "settingsCollectionQuickActionTabSelecting": "Memilih", + "settingsCollectionBrowsingQuickActionEditorBanner": "Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan saat menelusuri benda.", + "settingsCollectionSelectionQuickActionEditorBanner": "Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan saat memilih benda.", + + "settingsSectionViewer": "Penonton", + "settingsViewerUseCutout": "Gunakan area potongan", + "settingsViewerMaximumBrightness": "Kecerahan maksimum", + "settingsMotionPhotoAutoPlay": "Putar foto bergerak otomatis", + "settingsImageBackground": "Latar belakang gambar", + + "settingsViewerQuickActionsTile": "Aksi cepat", + "settingsViewerQuickActionEditorTitle": "Aksi Cepat", + "settingsViewerQuickActionEditorBanner": "Sentuh dan tahan untuk memindahkan tombol dan memilih tindakan yang ditampilkan di penampil.", + "settingsViewerQuickActionEditorDisplayedButtons": "Tombol yang Ditampilkan", + "settingsViewerQuickActionEditorAvailableButtons": "Tombol yang tersedia", + "settingsViewerQuickActionEmpty": "Tidak ada tombol", + + "settingsViewerOverlayTile": "Hamparan", + "settingsViewerOverlayTitle": "Hamparan", + "settingsViewerShowOverlayOnOpening": "Tampilkan saat pembukaan", + "settingsViewerShowMinimap": "Tampilkan minimap", + "settingsViewerShowInformation": "Tampilkan informasi", + "settingsViewerShowInformationSubtitle": "Tampilkan judul, tanggal, lokasi, dll.", + "settingsViewerShowShootingDetails": "Tampilkan detail pemotretan", + "settingsViewerEnableOverlayBlurEffect": "Efek Kabur", + + "settingsVideoPageTitle": "Pengaturan Video", + "settingsSectionVideo": "Video", + "settingsVideoShowVideos": "Tampilkan video", + "settingsVideoEnableHardwareAcceleration": "Akselerasi perangkat keras", + "settingsVideoEnableAutoPlay": "Putar otomatis", + "settingsVideoLoopModeTile": "Putar ulang", + "settingsVideoLoopModeTitle": "Putar Ulang", + "settingsVideoQuickActionsTile": "Aksi cepat untuk video", + "settingsVideoQuickActionEditorTitle": "Aksi Cepat", + + "settingsSubtitleThemeTile": "Subtitle", + "settingsSubtitleThemeTitle": "Subtitle", + "settingsSubtitleThemeSample": "Ini adalah sampel.", + "settingsSubtitleThemeTextAlignmentTile": "Perataan teks", + "settingsSubtitleThemeTextAlignmentTitle": "Perataan Teks", + "settingsSubtitleThemeTextSize": "Ukuran teks", + "settingsSubtitleThemeShowOutline": "Tampilkan garis besar dan bayangan", + "settingsSubtitleThemeTextColor": "Warna teks", + "settingsSubtitleThemeTextOpacity": "Opasitas teks", + "settingsSubtitleThemeBackgroundColor": "Warna latar belakang", + "settingsSubtitleThemeBackgroundOpacity": "Opasitas latar belakang", + "settingsSubtitleThemeTextAlignmentLeft": "Kiri", + "settingsSubtitleThemeTextAlignmentCenter": "Tengah", + "settingsSubtitleThemeTextAlignmentRight": "Kanan", + + "settingsSectionPrivacy": "Privasi", + "settingsAllowInstalledAppAccess": "Izinkan akses ke inventori aplikasi", + "settingsAllowInstalledAppAccessSubtitle": "Digunakan untuk meningkatkan tampilan album", + "settingsAllowErrorReporting": "Izinkan pelaporan kesalahan anonim", + "settingsSaveSearchHistory": "Simpan riwayat pencarian", + "settingsEnableBin": "Gunakan tong sampah", + "settingsEnableBinSubtitle": "Simpan benda yang dihapus selama 30 hari", + + "settingsHiddenItemsTile": "Benda tersembunyi", + "settingsHiddenItemsTitle": "Benda Tersembunyi", + + "settingsHiddenFiltersTitle": "Filter Tersembunyi", + "settingsHiddenFiltersBanner": "Foto dan video filter tersembunyi yang cocok tidak akan muncul di koleksi Anda.", + "settingsHiddenFiltersEmpty": "Tidak ada filter tersembunyi", + + "settingsHiddenPathsTitle": "Jalan Tersembunyi", + "settingsHiddenPathsBanner": "Foto dan video di folder ini, atau subfoldernya, tidak akan muncul di koleksi Anda.", + "addPathTooltip": "Tambahkan jalan", + + "settingsStorageAccessTile": "Akses penyimpanan", + "settingsStorageAccessTitle": "Akses Penyimpanan", + "settingsStorageAccessBanner": "Beberapa direktori memerlukan pemberian akses eksplisit untuk memodifikasi file di dalamnya. Anda dapat meninjau di sini direktori yang sebelumnya Anda beri akses.", + "settingsStorageAccessEmpty": "Tidak ada akses", + "settingsStorageAccessRevokeTooltip": "Tarik kembali", + + "settingsSectionAccessibility": "Aksesibilitas", + "settingsRemoveAnimationsTile": "Hapus animasi", + "settingsRemoveAnimationsTitle": "Hapus Animasi", + "settingsTimeToTakeActionTile": "Saatnya untuk mengambil tindakan", + "settingsTimeToTakeActionTitle": "Saatnya Bertindak", + + "settingsSectionLanguage": "Bahasa & Format", + "settingsLanguage": "Bahasa", + "settingsCoordinateFormatTile": "Format koordinat", + "settingsCoordinateFormatTitle": "Format Koordinat", + "settingsUnitSystemTile": "Unit", + "settingsUnitSystemTitle": "Unit", + + "statsPageTitle": "Statistik", + "statsWithGps": "{count, plural, other{{count} benda dengan lokasi}}", + "statsTopCountries": "Negara Teratas", + "statsTopPlaces": "Tempat Teratas", + "statsTopTags": "Tag Teratas", + + "viewerOpenPanoramaButtonLabel": "BUKA PANORAMA", + "viewerErrorUnknown": "Ups!", + "viewerErrorDoesNotExist": "File tidak ada lagi.", + + "viewerInfoPageTitle": "Info", + "viewerInfoBackToViewerTooltip": "Kembali ke pemirsa", + + "viewerInfoUnknown": "tidak dikenal", + "viewerInfoLabelTitle": "Judul", + "viewerInfoLabelDate": "Tanggal", + "viewerInfoLabelResolution": "Resolusi", + "viewerInfoLabelSize": "Ukuran", + "viewerInfoLabelUri": "URI", + "viewerInfoLabelPath": "Jalan", + "viewerInfoLabelDuration": "Durasi", + "viewerInfoLabelOwner": "Dimiliki oleh", + "viewerInfoLabelCoordinates": "Koordinat", + "viewerInfoLabelAddress": "Alamat", + + "mapStyleTitle": "Gaya Peta", + "mapStyleTooltip": "Pilih gaya peta", + "mapZoomInTooltip": "Perbesar", + "mapZoomOutTooltip": "Perkecil", + "mapPointNorthUpTooltip": "Arahkan ke utara ke atas", + "mapAttributionOsmHot": "Data peta © [OpenStreetMap](https://www.openstreetmap.org/copyright) kontributor • Tile oleh [HOT](https://www.hotosm.org/) • Diselenggarakan oleh [OSM France](https://openstreetmap.fr/)", + "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)", + "openMapPageTooltip": "Lihat di halaman Peta", + "mapEmptyRegion": "Tidak ada gambar di wilayah ini", + + "viewerInfoOpenEmbeddedFailureFeedback": "Gagal mengekstrak data yang disematkan", + "viewerInfoOpenLinkText": "Buka", + "viewerInfoViewXmlLinkText": "Tampilkan XML", + + "viewerInfoSearchFieldLabel": "Cari metadata", + "viewerInfoSearchEmpty": "Tidak ada kata kunci yang cocok", + "viewerInfoSearchSuggestionDate": "Tanggal & waktu", + "viewerInfoSearchSuggestionDescription": "Deskripsi", + "viewerInfoSearchSuggestionDimensions": "Dimensi", + "viewerInfoSearchSuggestionResolution": "Resolusi", + "viewerInfoSearchSuggestionRights": "Hak", + + "tagEditorPageTitle": "Ubah Tag", + "tagEditorPageNewTagFieldLabel": "Tag baru", + "tagEditorPageAddTagTooltip": "Tambah tag", + "tagEditorSectionRecent": "Terkini", + + "panoramaEnableSensorControl": "Aktifkan kontrol sensor", + "panoramaDisableSensorControl": "Nonaktifkan kontrol sensor", + + "sourceViewerPageTitle": "Sumber", + + "filePickerShowHiddenFiles": "Tampilkan file tersembunyi", + "filePickerDoNotShowHiddenFiles": "Jangan tampilkan file tersembunyi", + "filePickerOpenFrom": "Buka dari", + "filePickerNoItems": "Tidak ada benda", + "filePickerUseThisFolder": "Gunakan folder ini" +} diff --git a/lib/widgets/about/credits.dart b/lib/widgets/about/credits.dart index 67ef9be7c..83b89e9a2 100644 --- a/lib/widgets/about/credits.dart +++ b/lib/widgets/about/credits.dart @@ -7,6 +7,7 @@ class AboutCredits extends StatelessWidget { const AboutCredits({Key? key}) : super(key: key); static const translators = { + 'Bahasa Indonesia': 'MeFinity', 'Deutsch': 'JanWaldhorn', 'Español (México)': 'n-berenice', 'Português (Brasil)': 'Jonatas De Almeida Barros', diff --git a/lib/widgets/settings/language/locales.dart b/lib/widgets/settings/language/locales.dart index 87fc6ad33..29d60600a 100644 --- a/lib/widgets/settings/language/locales.dart +++ b/lib/widgets/settings/language/locales.dart @@ -6,6 +6,7 @@ class SupportedLocales { 'en': 'English', 'es': 'Español (México)', 'fr': 'Français', + 'id': 'Bahasa Indonesia', 'ko': '한국어', 'pt': 'Português (Brasil)', 'ru': 'Русский', From 99b982bfaf5a9d4adf56eccfe06d3f3de4a96554 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 19 Feb 2022 16:28:59 +0900 Subject: [PATCH 24/39] minor changes --- .../aves/SearchSuggestionsProvider.kt | 8 +++--- .../aves/channel/calls/AnalysisHandler.kt | 8 +++--- .../aves/channel/calls/AppAdapterHandler.kt | 14 +++++----- .../aves/channel/calls/DebugHandler.kt | 26 +++++++++---------- .../aves/channel/calls/EmbeddedDataHandler.kt | 16 ++++++------ .../aves/channel/calls/GeocodingHandler.kt | 7 +++-- .../aves/channel/calls/GlobalSearchHandler.kt | 8 +++--- .../aves/channel/calls/MediaFileHandler.kt | 15 +++++------ .../aves/channel/calls/MetadataEditHandler.kt | 16 ++++++------ .../channel/calls/MetadataFetchHandler.kt | 26 +++++++++---------- .../streams/StorageAccessStreamHandler.kt | 9 ++++--- .../aves/decoder/VideoThumbnailGlideModule.kt | 7 +++-- 12 files changed, 82 insertions(+), 78 deletions(-) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt index c785cebd5..8d4472dbe 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/SearchSuggestionsProvider.kt @@ -17,15 +17,15 @@ import deckers.thibault.aves.utils.LogUtils import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.* import java.util.* import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine class SearchSuggestionsProvider : MethodChannel.MethodCallHandler, ContentProvider() { + private val defaultScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + override fun query(uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?, sortOrder: String?): Cursor? { return selectionArgs?.firstOrNull()?.let { query -> // Samsung Finder does not support: @@ -79,7 +79,7 @@ class SearchSuggestionsProvider : MethodChannel.MethodCallHandler, ContentProvid try { return suspendCoroutine { cont -> - GlobalScope.launch { + defaultScope.launch { FlutterUtils.runOnUiThread { backgroundChannel.invokeMethod("getSuggestions", hashMapOf( "query" to query, 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 b32eda29b..7f083ae55 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 @@ -16,14 +16,14 @@ import deckers.thibault.aves.utils.ContextUtils.isMyServiceRunning import deckers.thibault.aves.utils.LogUtils import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* class AnalysisHandler(private val activity: Activity, private val onAnalysisCompleted: () -> Unit) : MethodChannel.MethodCallHandler, AnalysisServiceListener { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { - "registerCallback" -> GlobalScope.launch(Dispatchers.IO) { Coresult.safe(call, result, ::registerCallback) } + "registerCallback" -> ioScope.launch { Coresult.safe(call, result, ::registerCallback) } "startService" -> Coresult.safe(call, result, ::startAnalysis) else -> result.notImplemented() } 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 f56a7f838..ee0527d6c 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 @@ -33,26 +33,26 @@ import deckers.thibault.aves.utils.LogUtils import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import java.io.File import java.util.* import kotlin.collections.ArrayList import kotlin.math.roundToInt class AppAdapterHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { - "getPackages" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getPackages) } - "getAppIcon" -> GlobalScope.launch(Dispatchers.IO) { safeSuspend(call, result, ::getAppIcon) } - "copyToClipboard" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::copyToClipboard) } + "getPackages" -> ioScope.launch { safe(call, result, ::getPackages) } + "getAppIcon" -> ioScope.launch { safeSuspend(call, result, ::getAppIcon) } + "copyToClipboard" -> ioScope.launch { safe(call, result, ::copyToClipboard) } "edit" -> safe(call, result, ::edit) "open" -> safe(call, result, ::open) "openMap" -> safe(call, result, ::openMap) "setAs" -> safe(call, result, ::setAs) "share" -> safe(call, result, ::share) - "pinShortcut" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::pinShortcut) } + "pinShortcut" -> ioScope.launch { safe(call, result, ::pinShortcut) } else -> result.notImplemented() } } 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 03a492a12..82c84520e 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 @@ -33,32 +33,32 @@ import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler import io.flutter.util.PathUtils -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import org.beyka.tiffbitmapfactory.TiffBitmapFactory import java.io.IOException class DebugHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { "crash" -> Handler(Looper.getMainLooper()).postDelayed({ throw TestException() }, 50) "exception" -> throw TestException() "safeException" -> safe(call, result) { _, _ -> throw TestException() } - "exceptionInCoroutine" -> GlobalScope.launch(Dispatchers.IO) { throw TestException() } - "safeExceptionInCoroutine" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result) { _, _ -> throw TestException() } } + "exceptionInCoroutine" -> ioScope.launch { throw TestException() } + "safeExceptionInCoroutine" -> ioScope.launch { safe(call, result) { _, _ -> throw TestException() } } - "getContextDirs" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getContextDirs) } + "getContextDirs" -> ioScope.launch { safe(call, result, ::getContextDirs) } "getCodecs" -> safe(call, result, ::getCodecs) "getEnv" -> safe(call, result, ::getEnv) - "getBitmapFactoryInfo" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getBitmapFactoryInfo) } - "getContentResolverMetadata" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getContentResolverMetadata) } - "getExifInterfaceMetadata" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getExifInterfaceMetadata) } - "getMediaMetadataRetrieverMetadata" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getMediaMetadataRetrieverMetadata) } - "getMetadataExtractorSummary" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getMetadataExtractorSummary) } - "getPixyMetadata" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getPixyMetadata) } - "getTiffStructure" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getTiffStructure) } + "getBitmapFactoryInfo" -> ioScope.launch { safe(call, result, ::getBitmapFactoryInfo) } + "getContentResolverMetadata" -> ioScope.launch { safe(call, result, ::getContentResolverMetadata) } + "getExifInterfaceMetadata" -> ioScope.launch { safe(call, result, ::getExifInterfaceMetadata) } + "getMediaMetadataRetrieverMetadata" -> ioScope.launch { safe(call, result, ::getMediaMetadataRetrieverMetadata) } + "getMetadataExtractorSummary" -> ioScope.launch { safe(call, result, ::getMetadataExtractorSummary) } + "getPixyMetadata" -> ioScope.launch { safe(call, result, ::getPixyMetadata) } + "getTiffStructure" -> ioScope.launch { safe(call, result, ::getTiffStructure) } else -> result.notImplemented() } } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt index 61fa7d5c0..d34ef9eec 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt @@ -34,20 +34,20 @@ import deckers.thibault.aves.utils.StorageUtils import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import java.io.File import java.io.InputStream import java.util.* class EmbeddedDataHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { - "getExifThumbnails" -> GlobalScope.launch(Dispatchers.IO) { safeSuspend(call, result, ::getExifThumbnails) } - "extractMotionPhotoVideo" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::extractMotionPhotoVideo) } - "extractVideoEmbeddedPicture" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::extractVideoEmbeddedPicture) } - "extractXmpDataProp" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::extractXmpDataProp) } + "getExifThumbnails" -> ioScope.launch { safeSuspend(call, result, ::getExifThumbnails) } + "extractMotionPhotoVideo" -> ioScope.launch { safe(call, result, ::extractMotionPhotoVideo) } + "extractVideoEmbeddedPicture" -> ioScope.launch { safe(call, result, ::extractVideoEmbeddedPicture) } + "extractXmpDataProp" -> ioScope.launch { safe(call, result, ::extractXmpDataProp) } else -> result.notImplemented() } } @@ -210,7 +210,7 @@ class EmbeddedDataHandler(private val context: Context) : MethodCallHandler { "mimeType" to mimeType, ) if (isImage(mimeType) || isVideo(mimeType)) { - GlobalScope.launch(Dispatchers.IO) { + ioScope.launch { ContentImageProvider().fetchSingle(context, uri, mimeType, object : ImageProvider.ImageOpCallback { override fun onSuccess(fields: FieldMap) { resultFields.putAll(fields) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GeocodingHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GeocodingHandler.kt index ddb100edd..0821058f3 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GeocodingHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GeocodingHandler.kt @@ -6,9 +6,7 @@ import deckers.thibault.aves.channel.calls.Coresult.Companion.safe import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import java.io.IOException import java.util.* @@ -16,11 +14,12 @@ import java.util.* // - `geocoder` is unmaintained // - `geocoding` method does not return `addressLine` (v2.0.0) class GeocodingHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private var geocoder: Geocoder? = null override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { - "getAddress" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getAddress) } + "getAddress" -> ioScope.launch { safe(call, result, ::getAddress) } else -> result.notImplemented() } } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GlobalSearchHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GlobalSearchHandler.kt index 48560f9a5..c4b701327 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GlobalSearchHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/GlobalSearchHandler.kt @@ -7,14 +7,14 @@ import deckers.thibault.aves.channel.calls.Coresult.Companion.safe import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* class GlobalSearchHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { - "registerCallback" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::registerCallback) } + "registerCallback" -> ioScope.launch { safe(call, result, ::registerCallback) } else -> result.notImplemented() } } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFileHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFileHandler.kt index 9dddda6b1..44c0cc405 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFileHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MediaFileHandler.kt @@ -21,24 +21,23 @@ import deckers.thibault.aves.utils.StorageUtils.ensureTrailingSeparator import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import kotlin.math.roundToInt class MediaFileHandler(private val activity: Activity) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private val density = activity.resources.displayMetrics.density private val regionFetcher = RegionFetcher(activity) override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { - "getEntry" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getEntry) } - "getThumbnail" -> GlobalScope.launch(Dispatchers.IO) { safeSuspend(call, result, ::getThumbnail) } - "getRegion" -> GlobalScope.launch(Dispatchers.IO) { safeSuspend(call, result, ::getRegion) } + "getEntry" -> ioScope.launch { safe(call, result, ::getEntry) } + "getThumbnail" -> ioScope.launch { safeSuspend(call, result, ::getThumbnail) } + "getRegion" -> ioScope.launch { safeSuspend(call, result, ::getRegion) } "cancelFileOp" -> safe(call, result, ::cancelFileOp) - "captureFrame" -> GlobalScope.launch(Dispatchers.IO) { safeSuspend(call, result, ::captureFrame) } - "clearSizedThumbnailDiskCache" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::clearSizedThumbnailDiskCache) } + "captureFrame" -> ioScope.launch { safeSuspend(call, result, ::captureFrame) } + "clearSizedThumbnailDiskCache" -> ioScope.launch { safe(call, result, ::clearSizedThumbnailDiskCache) } else -> result.notImplemented() } } 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 adc3449f5..1e572f0c5 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 @@ -10,18 +10,18 @@ import deckers.thibault.aves.model.provider.ImageProviderFactory.getProvider import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* class MetadataEditHandler(private val activity: Activity) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { - "rotate" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::rotate) } - "flip" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::flip) } - "editDate" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::editDate) } - "editMetadata" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::editMetadata) } - "removeTypes" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::removeTypes) } + "rotate" -> ioScope.launch { safe(call, result, ::rotate) } + "flip" -> ioScope.launch { safe(call, result, ::flip) } + "editDate" -> ioScope.launch { safe(call, result, ::editDate) } + "editMetadata" -> ioScope.launch { safe(call, result, ::editMetadata) } + "removeTypes" -> ioScope.launch { safe(call, result, ::removeTypes) } else -> result.notImplemented() } } 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 dcf6d31c5..e70895276 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 @@ -74,9 +74,7 @@ import deckers.thibault.aves.utils.UriUtils.tryParseId import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import java.nio.charset.Charset import java.nio.charset.StandardCharsets import java.text.ParseException @@ -84,18 +82,20 @@ import kotlin.math.roundToInt import kotlin.math.roundToLong class MetadataFetchHandler(private val context: Context) : MethodCallHandler { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { - "getAllMetadata" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getAllMetadata) } - "getCatalogMetadata" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getCatalogMetadata) } - "getOverlayMetadata" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getOverlayMetadata) } - "getMultiPageInfo" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getMultiPageInfo) } - "getPanoramaInfo" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getPanoramaInfo) } - "getIptc" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getIptc) } - "getXmp" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getXmp) } - "hasContentResolverProp" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::hasContentResolverProp) } - "getContentResolverProp" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getContentResolverProp) } - "getDate" -> GlobalScope.launch(Dispatchers.IO) { safe(call, result, ::getDate) } + "getAllMetadata" -> ioScope.launch { safe(call, result, ::getAllMetadata) } + "getCatalogMetadata" -> ioScope.launch { safe(call, result, ::getCatalogMetadata) } + "getOverlayMetadata" -> ioScope.launch { safe(call, result, ::getOverlayMetadata) } + "getMultiPageInfo" -> ioScope.launch { safe(call, result, ::getMultiPageInfo) } + "getPanoramaInfo" -> ioScope.launch { safe(call, result, ::getPanoramaInfo) } + "getIptc" -> ioScope.launch { safe(call, result, ::getIptc) } + "getXmp" -> ioScope.launch { safe(call, result, ::getXmp) } + "hasContentResolverProp" -> ioScope.launch { safe(call, result, ::hasContentResolverProp) } + "getContentResolverProp" -> ioScope.launch { safe(call, result, ::getContentResolverProp) } + "getDate" -> ioScope.launch { safe(call, result, ::getDate) } else -> result.notImplemented() } } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt index 083f7b926..0bc307f92 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt @@ -15,7 +15,10 @@ import deckers.thibault.aves.utils.MimeTypes import deckers.thibault.aves.utils.PermissionManager import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.EventChannel.EventSink -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch import java.io.FileOutputStream // starting activity to give access with the native dialog @@ -112,7 +115,7 @@ class StorageAccessStreamHandler(private val activity: Activity, arguments: Any? putExtra(Intent.EXTRA_TITLE, name) } MainActivity.pendingStorageAccessResultHandlers[MainActivity.CREATE_FILE_REQUEST] = PendingStorageAccessResultHandler(null, { uri -> - GlobalScope.launch(Dispatchers.IO) { + ioScope.launch { try { activity.contentResolver.openOutputStream(uri)?.use { output -> output as FileOutputStream @@ -144,7 +147,7 @@ class StorageAccessStreamHandler(private val activity: Activity, arguments: Any? val mimeType = args["mimeType"] as String? // optional fun onGranted(uri: Uri) { - GlobalScope.launch(Dispatchers.IO) { + ioScope.launch { activity.contentResolver.openInputStream(uri)?.use { input -> val buffer = ByteArray(BUFFER_SIZE) var len: Int diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/decoder/VideoThumbnailGlideModule.kt b/android/app/src/main/kotlin/deckers/thibault/aves/decoder/VideoThumbnailGlideModule.kt index 6c548ef44..f13a85f8e 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/decoder/VideoThumbnailGlideModule.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/decoder/VideoThumbnailGlideModule.kt @@ -18,8 +18,9 @@ import com.bumptech.glide.module.LibraryGlideModule import com.bumptech.glide.signature.ObjectKey import deckers.thibault.aves.utils.BitmapUtils.getBytes import deckers.thibault.aves.utils.StorageUtils.openMetadataRetriever +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch import java.io.ByteArrayInputStream import java.io.InputStream @@ -48,8 +49,10 @@ internal class VideoThumbnailLoader : ModelLoader { } internal class VideoThumbnailFetcher(private val model: VideoThumbnail) : DataFetcher { + private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + override fun loadData(priority: Priority, callback: DataCallback) { - GlobalScope.launch(Dispatchers.IO) { + ioScope.launch { val retriever = openMetadataRetriever(model.context, model.uri) if (retriever == null) { callback.onLoadFailed(Exception("failed to initialize MediaMetadataRetriever for uri=${model.uri}")) From d8210ef075ec2b0aa7600f4bb28f2b3decf10e4a Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 19 Feb 2022 17:13:52 +0900 Subject: [PATCH 25/39] l10n --- lib/l10n/app_fr.arb | 8 +++++++- lib/l10n/app_id.arb | 4 ++-- untranslated.json | 8 -------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index b8f9bbc9e..fcec8ce9a 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -28,6 +28,7 @@ "resetButtonTooltip": "Réinitialiser", "doubleBackExitMessage": "Pressez «\u00A0retour\u00A0» à nouveau pour quitter.", + "doNotAskAgain": "Ne pas demander de nouveau", "sourceStateLoading": "Chargement", "sourceStateCataloguing": "Classification", @@ -192,7 +193,7 @@ "editEntryDateDialogTitle": "Date & Heure", "editEntryDateDialogSetCustom": "Régler une date personnalisée", - "editEntryDateDialogCopyField": "Copier d'une autre date", + "editEntryDateDialogCopyField": "Copier d’une autre date", "editEntryDateDialogExtractFromTitle": "Extraire du titre", "editEntryDateDialogShift": "Décaler", "editEntryDateDialogSourceFileModifiedDate": "Date de modification du fichier", @@ -382,6 +383,11 @@ "settingsKeepScreenOnTitle": "Allumage de l’écran", "settingsDoubleBackExit": "Presser «\u00A0retour\u00A0» 2 fois pour quitter", + "settingsConfirmationDialogTile": "Demandes de confirmation", + "settingsConfirmationDialogTitle": "Demandes de confirmation", + "settingsConfirmationDialogDeleteItems": "Suppression définitive d’éléments", + "settingsConfirmationDialogMoveToBinItems": "Mise d’éléments à la corbeille", + "settingsNavigationDrawerTile": "Menu de navigation", "settingsNavigationDrawerEditorTitle": "Menu de navigation", "settingsNavigationDrawerBanner": "Maintenez votre doigt appuyé pour déplacer et réorganiser les éléments de menu.", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index bbf3c7ed8..655a29114 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -27,7 +27,7 @@ "actionRemove": "Hapus", "resetButtonTooltip": "Ulang", - "doubleBackExitMessage": "Pencet “kembali” lagi untuk keluar.", + "doubleBackExitMessage": "Ketuk “kembali” lagi untuk keluar.", "doNotAskAgain": "Jangan tanya lagi", "sourceStateLoading": "Memuat", @@ -277,7 +277,7 @@ "collectionActionShowTitleSearch": "Tampilkan filter judul", "collectionActionHideTitleSearch": "Sembunyikan filter judul", "collectionActionAddShortcut": "Tambahkan pintasan", - "collectionActionEmptyBin": "Kosongkan sampah", + "collectionActionEmptyBin": "Kosongkan tong sampah", "collectionActionCopy": "Salin ke album", "collectionActionMove": "Pindah ke album", "collectionActionRescan": "Pindai ulang", diff --git a/untranslated.json b/untranslated.json index 224f209ba..d5da8f2de 100644 --- a/untranslated.json +++ b/untranslated.json @@ -32,14 +32,6 @@ "settingsEnableBinSubtitle" ], - "fr": [ - "doNotAskAgain", - "settingsConfirmationDialogTile", - "settingsConfirmationDialogTitle", - "settingsConfirmationDialogDeleteItems", - "settingsConfirmationDialogMoveToBinItems" - ], - "ko": [ "doNotAskAgain", "settingsConfirmationDialogTile", From 835a2ed18ec0c13d7a8a2adbc7884170b262e67f Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 19 Feb 2022 19:15:49 +0900 Subject: [PATCH 26/39] #181 viewer: fixed "actual size" zoom, allow zooming out small items to actual size, fixed minimap for unsized items --- CHANGELOG.md | 3 +++ lib/l10n/app_id.arb | 2 +- .../common/magnifier/controller/controller.dart | 3 ++- lib/widgets/common/magnifier/core/core.dart | 4 +++- .../common/magnifier/scale/scale_boundaries.dart | 9 ++++++--- lib/widgets/common/thumbnail/decorated.dart | 2 +- lib/widgets/common/thumbnail/overlay.dart | 12 +++++++----- lib/widgets/viewer/overlay/minimap.dart | 2 ++ lib/widgets/viewer/visual/state.dart | 11 ++++++----- 9 files changed, 31 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c125f729..89c02e39d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. ### Added +- optional recycle bin to keep deleted items for 30 days - Viewer: actions to copy/move to album - Indonesian translation (thanks MeFinity) @@ -13,6 +14,8 @@ All notable changes to this project will be documented in this file. - Viewer: action menu reorganization - Viewer: `Export` action renamed to `Convert` +- Viewer: actual size zoom level respects device pixel ratio +- Viewer: allow zooming out small items to actual size - Collection: improved performance for sort/group by name - load previous top items on startup - upgraded Flutter to stable v2.10.1 diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 655a29114..f25c952eb 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -378,7 +378,7 @@ "appExportSettings": "Pengaturan", "settingsSectionNavigation": "Navigasi", - "settingsHome": "Home", + "settingsHome": "Beranda", "settingsKeepScreenOnTile": "Biarkan layarnya menyala", "settingsKeepScreenOnTitle": "Biarkan Layarnya Menyala", "settingsDoubleBackExit": "Ketuk “kembali” dua kali untuk keluar", diff --git a/lib/widgets/common/magnifier/controller/controller.dart b/lib/widgets/common/magnifier/controller/controller.dart index 0e9d41e15..cdec420f7 100644 --- a/lib/widgets/common/magnifier/controller/controller.dart +++ b/lib/widgets/common/magnifier/controller/controller.dart @@ -71,6 +71,7 @@ class MagnifierController { position = position ?? this.position; scale = scale ?? this.scale; if (this.position == position && this.scale == scale) return; + assert((scale ?? 0) >= 0); previousState = currentState; _setState(MagnifierState( @@ -127,7 +128,7 @@ class MagnifierController { case ScaleState.covering: return _clamp(ScaleLevel.scaleForCovering(scaleBoundaries.viewportSize, scaleBoundaries.childSize)); case ScaleState.originalSize: - return _clamp(1.0); + return _clamp(scaleBoundaries.originalScale); default: return null; } diff --git a/lib/widgets/common/magnifier/core/core.dart b/lib/widgets/common/magnifier/core/core.dart index 214cb5089..da4ad3c5e 100644 --- a/lib/widgets/common/magnifier/core/core.dart +++ b/lib/widgets/common/magnifier/core/core.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:aves/widgets/common/magnifier/controller/controller.dart'; import 'package:aves/widgets/common/magnifier/controller/controller_delegate.dart'; import 'package:aves/widgets/common/magnifier/controller/state.dart'; @@ -132,7 +134,7 @@ class _MagnifierCoreState extends State with TickerProviderStateM updateScaleStateFromNewScale(newScale, ChangeSource.gesture); updateMultiple( - scale: newScale, + scale: max(0, newScale), position: newPosition, source: ChangeSource.gesture, ); diff --git a/lib/widgets/common/magnifier/scale/scale_boundaries.dart b/lib/widgets/common/magnifier/scale/scale_boundaries.dart index 85e54b0a8..986fc82ec 100644 --- a/lib/widgets/common/magnifier/scale/scale_boundaries.dart +++ b/lib/widgets/common/magnifier/scale/scale_boundaries.dart @@ -1,3 +1,4 @@ +import 'dart:math'; import 'dart:ui'; import 'package:aves/widgets/common/magnifier/controller/controller.dart'; @@ -41,11 +42,13 @@ class ScaleBoundaries extends Equatable { } } - double get minScale => _scaleForLevel(_minScale); + double get originalScale => 1.0 / window.devicePixelRatio; - double get maxScale => _scaleForLevel(_maxScale).clamp(minScale, double.infinity); + double get minScale => {_scaleForLevel(_minScale), originalScale, initialScale}.fold(double.infinity, min); - double get initialScale => _scaleForLevel(_initialScale).clamp(minScale, maxScale); + double get maxScale => {_scaleForLevel(_maxScale), originalScale, initialScale}.fold(0, max); + + double get initialScale => _scaleForLevel(_initialScale); Offset get _viewportCenter => viewportSize.center(Offset.zero); diff --git a/lib/widgets/common/thumbnail/decorated.dart b/lib/widgets/common/thumbnail/decorated.dart index f3a955b91..5c0b65f39 100644 --- a/lib/widgets/common/thumbnail/decorated.dart +++ b/lib/widgets/common/thumbnail/decorated.dart @@ -35,7 +35,7 @@ class DecoratedThumbnail extends StatelessWidget { ); child = Stack( - alignment: AlignmentDirectional.bottomStart, + fit: StackFit.passthrough, children: [ child, ThumbnailEntryOverlay(entry: entry), diff --git a/lib/widgets/common/thumbnail/overlay.dart b/lib/widgets/common/thumbnail/overlay.dart index ad3a74d44..39a4f60b9 100644 --- a/lib/widgets/common/thumbnail/overlay.dart +++ b/lib/widgets/common/thumbnail/overlay.dart @@ -38,11 +38,13 @@ class ThumbnailEntryOverlay extends StatelessWidget { if (entry.trashed && context.select((t) => t.showTrash)) TrashIcon(trashDaysLeft: entry.trashDaysLeft), ]; if (children.isEmpty) return const SizedBox(); - if (children.length == 1) return children.first; - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: children, + return Align( + alignment: AlignmentDirectional.bottomStart, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: children, + ), ); } } diff --git a/lib/widgets/viewer/overlay/minimap.dart b/lib/widgets/viewer/overlay/minimap.dart index 3a30626ff..42a5617ab 100644 --- a/lib/widgets/viewer/overlay/minimap.dart +++ b/lib/widgets/viewer/overlay/minimap.dart @@ -78,6 +78,8 @@ class MinimapPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { + if (entrySize.width <= 0 || entrySize.height <= 0) return; + final viewSize = entrySize * viewScale; if (viewSize.isEmpty) return; diff --git a/lib/widgets/viewer/visual/state.dart b/lib/widgets/viewer/visual/state.dart index efae82e5e..416400db2 100644 --- a/lib/widgets/viewer/visual/state.dart +++ b/lib/widgets/viewer/visual/state.dart @@ -1,15 +1,16 @@ -import 'package:flutter/foundation.dart'; +import 'package:equatable/equatable.dart'; import 'package:flutter/widgets.dart'; -class ViewState { +@immutable +class ViewState extends Equatable { final Offset position; final double? scale; final Size? viewportSize; static const ViewState zero = ViewState(Offset.zero, 0, null); - const ViewState(this.position, this.scale, this.viewportSize); - @override - String toString() => '$runtimeType#${shortHash(this)}{position=$position, scale=$scale, viewportSize=$viewportSize}'; + List get props => [position, scale, viewportSize]; + + const ViewState(this.position, this.scale, this.viewportSize); } From 20531d55ee8fdb5d5ae101ac424b33d09ea70338 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 20 Feb 2022 00:05:08 +0900 Subject: [PATCH 27/39] l10n --- lib/l10n/app_de.arb | 17 ++++++++++- lib/l10n/app_en.arb | 7 +---- lib/l10n/app_es.arb | 2 +- lib/l10n/app_fr.arb | 2 +- lib/l10n/app_id.arb | 2 +- lib/l10n/app_ko.arb | 2 +- lib/l10n/app_pt.arb | 17 ++++++++++- lib/l10n/app_ru.arb | 2 +- lib/widgets/collection/app_bar.dart | 2 +- lib/widgets/filter_grids/common/app_bar.dart | 3 +- untranslated.json | 30 ++------------------ 11 files changed, 43 insertions(+), 43 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index a553538d9..a74c025cd 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -7,6 +7,7 @@ "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", @@ -27,6 +28,7 @@ "resetButtonTooltip": "Zurücksetzen", "doubleBackExitMessage": "Zum Verlassen erneut auf „Zurück“ tippen.", + "doNotAskAgain": "Nicht noch einmal fragen", "sourceStateLoading": "Laden", "sourceStateCataloguing": "Katalogisierung", @@ -48,6 +50,7 @@ "entryActionDelete": "Löschen", "entryActionExport": "Exportieren", "entryActionRename": "Umbenennen", + "entryActionRestore": "Wiederherstellen", "entryActionRotateCCW": "Drehen gegen den Uhrzeigersinn", "entryActionRotateCW": "Drehen im Uhrzeigersinn", "entryActionFlip": "Horizontal spiegeln", @@ -78,6 +81,7 @@ "entryInfoActionEditTags": "Tags bearbeiten", "entryInfoActionRemoveMetadata": "Metadaten entfernen", + "filterBinLabel": "Papierkorb", "filterFavouriteLabel": "Favorit", "filterLocationEmptyLabel": "Ungeortet", "filterTagEmptyLabel": "Unmarkiert", @@ -156,6 +160,7 @@ "noMatchingAppDialogTitle": "Keine passende App", "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?}}", "videoResumeDialogMessage": "Soll bei {time} weiter abspielt werden?", @@ -266,11 +271,12 @@ "collectionPageTitle": "Sammlung", "collectionPickPageTitle": "Wähle", - "collectionSelectionPageTitle": "{count, plural, =0{Elemente auswählen} =1{1 Element} other{{count} Elemente}}", + "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", @@ -349,6 +355,8 @@ "tagPageTitle": "Tags", "tagEmpty": "Keine Tags", + "binPageTitle": "Papierkorb", + "searchCollectionFieldHint": "Sammlung durchsuchen", "searchSectionRecent": "Neueste", "searchSectionAlbums": "Alben", @@ -374,6 +382,11 @@ "settingsKeepScreenOnTitle": "Bildschirm eingeschaltet lassen", "settingsDoubleBackExit": "Zum Verlassen zweimal „zurück“ tippen", + "settingsConfirmationDialogTile": "Bestätigungsdialoge", + "settingsConfirmationDialogTitle": "Bestätigungsdialoge", + "settingsConfirmationDialogDeleteItems": "Vor dem endgültigen Löschen von Elementen fragen", + "settingsConfirmationDialogMoveToBinItems": "Vor dem Verschieben von Elementen in den Papierkorb fragen", + "settingsNavigationDrawerTile": "Menü Navigation", "settingsNavigationDrawerEditorTitle": "Menü Navigation", "settingsNavigationDrawerBanner": "Die Taste berühren und halten, um Menüpunkte zu verschieben und neu anzuordnen.", @@ -449,6 +462,8 @@ "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", "settingsHiddenItemsTitle": "Versteckte Elemente", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index a515a5fd5..37598546e 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -414,12 +414,7 @@ "collectionPageTitle": "Collection", "collectionPickPageTitle": "Pick", - "collectionSelectionPageTitle": "{count, plural, =0{Select items} =1{1 item} other{{count} items}}", - "@collectionSelectionPageTitle": { - "placeholders": { - "count": {} - } - }, + "collectionSelectPageTitle": "Select items", "collectionActionShowTitleSearch": "Show title filter", "collectionActionHideTitleSearch": "Hide title filter", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 3490ddf47..82077c0e3 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -268,7 +268,7 @@ "collectionPageTitle": "Colección", "collectionPickPageTitle": "Elegir", - "collectionSelectionPageTitle": "{count, plural, =0{Seleccionar} =1{1 elemento} other{{count} elementos}}", + "collectionSelectPageTitle": "Seleccionar", "collectionActionShowTitleSearch": "Mostrar filtros de títulos", "collectionActionHideTitleSearch": "Ocultar filtros de títulos", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index fcec8ce9a..65759fb4e 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -272,7 +272,7 @@ "collectionPageTitle": "Collection", "collectionPickPageTitle": "Sélection", - "collectionSelectionPageTitle": "{count, plural, =0{Sélection} =1{1 élément} other{{count} éléments}}", + "collectionSelectPageTitle": "Sélection", "collectionActionShowTitleSearch": "Filtrer les titres", "collectionActionHideTitleSearch": "Masquer le filtre", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index f25c952eb..468e6b2ba 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -272,7 +272,7 @@ "collectionPageTitle": "Koleksi", "collectionPickPageTitle": "Pilih", - "collectionSelectionPageTitle": "{count, plural, =0{Pilih benda} other{{count} benda}}", + "collectionSelectPageTitle": "Pilih benda", "collectionActionShowTitleSearch": "Tampilkan filter judul", "collectionActionHideTitleSearch": "Sembunyikan filter judul", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index b8bcf8e73..1e04e7578 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -271,7 +271,7 @@ "collectionPageTitle": "미디어", "collectionPickPageTitle": "항목 선택", - "collectionSelectionPageTitle": "{count, plural, =0{항목 선택} other{{count}개}}", + "collectionSelectPageTitle": "항목 선택", "collectionActionShowTitleSearch": "제목 필터 보기", "collectionActionHideTitleSearch": "제목 필터 숨기기", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index f5d9f68f0..fbf608140 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -7,6 +7,7 @@ "timeSeconds": "{seconds, plural, =1{1 segundo} other{{seconds} segundos}}", "timeMinutes": "{minutes, plural, =1{1 minuto} other{{minutes} minutos}}", + "timeDays": "{days, plural, =1{1 dia} other{{days} dias}}", "focalLength": "{length} mm", "applyButtonLabel": "APLIQUE", @@ -27,6 +28,7 @@ "resetButtonTooltip": "Resetar", "doubleBackExitMessage": "Toque em “voltar” novamente para sair.", + "doNotAskAgain": "Não pergunte novamente", "sourceStateLoading": "Carregando", "sourceStateCataloguing": "Catalogação", @@ -48,6 +50,7 @@ "entryActionDelete": "Excluir", "entryActionExport": "Exportar", "entryActionRename": "Renomear", + "entryActionRestore": "Restaurar", "entryActionRotateCCW": "Rotacionar para esquerda", "entryActionRotateCW": "Rotacionar para direita", "entryActionFlip": "Virar horizontalmente", @@ -78,6 +81,7 @@ "entryInfoActionEditTags": "Editar etiquetas", "entryInfoActionRemoveMetadata": "Remover metadados", + "filterBinLabel": "Lixeira", "filterFavouriteLabel": "Favorito", "filterLocationEmptyLabel": "Não localizado", "filterTagEmptyLabel": "Sem etiqueta", @@ -156,6 +160,7 @@ "noMatchingAppDialogTitle": "Nenhum aplicativo correspondente", "noMatchingAppDialogMessage": "Não há aplicativos que possam lidar com isso.", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Mover esse item para a lixeira?} other{Mova estes {count} itens para a lixeira?}}", "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Tem certeza de que deseja excluir este item?} other{Tem certeza de que deseja excluir estes {count} itens?}}", "videoResumeDialogMessage": "Deseja continuar jogando em {time}?", @@ -266,11 +271,12 @@ "collectionPageTitle": "Coleção", "collectionPickPageTitle": "Escolher", - "collectionSelectionPageTitle": "{count, plural, =0{Selecionar itens} =1{1 item} other{{count} itens}}", + "collectionSelectPageTitle": "Selecionar itens", "collectionActionShowTitleSearch": "Mostrar filtro de título", "collectionActionHideTitleSearch": "Ocultar filtro de título", "collectionActionAddShortcut": "Adicionar atalho", + "collectionActionEmptyBin": "Caixa vazia", "collectionActionCopy": "Copiar para o álbum", "collectionActionMove": "Mover para o álbum", "collectionActionRescan": "Reexaminar", @@ -349,6 +355,8 @@ "tagPageTitle": "Etiquetas", "tagEmpty": "Sem etiquetas", + "binPageTitle": "Lixeira", + "searchCollectionFieldHint": "Pesquisar coleção", "searchSectionRecent": "Recente", "searchSectionAlbums": "Álbuns", @@ -374,6 +382,11 @@ "settingsKeepScreenOnTitle": "Manter a tela ligada", "settingsDoubleBackExit": "Toque em “voltar” duas vezes para sair", + "settingsConfirmationDialogTile": "Caixas de diálogo de confirmação", + "settingsConfirmationDialogTitle": "Caixas de diálogo de confirmação", + "settingsConfirmationDialogDeleteItems": "Pergunte antes de excluir itens para sempre", + "settingsConfirmationDialogMoveToBinItems": "Pergunte antes de mover itens para a lixeira", + "settingsNavigationDrawerTile": "Menu de navegação", "settingsNavigationDrawerEditorTitle": "Menu de navegação", "settingsNavigationDrawerBanner": "Toque e segure para mover e reordenar os itens do menu.", @@ -449,6 +462,8 @@ "settingsAllowInstalledAppAccessSubtitle": "Usado para melhorar a exibição do álbum", "settingsAllowErrorReporting": "Permitir relatórios de erros anônimos", "settingsSaveSearchHistory": "Salvar histórico de pesquisa", + "settingsEnableBin": "Usar lixeira", + "settingsEnableBinSubtitle": "Manter itens excluídos por 30 dias", "settingsHiddenItemsTile": "Itens ocultos", "settingsHiddenItemsTitle": "Itens ocultos", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index ff691cacd..a5c3fa4af 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -266,7 +266,7 @@ "collectionPageTitle": "Коллекция", "collectionPickPageTitle": "Выбрать", - "collectionSelectionPageTitle": "{count, plural, =0{Выберите объекты} =1{1 объект} few{{count} объекта} other{{count} объектов}}", + "collectionSelectPageTitle": "Выберите объекты", "collectionActionShowTitleSearch": "Показать фильтр заголовка", "collectionActionHideTitleSearch": "Скрыть фильтр заголовка", diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index 1dd10f071..04add94fb 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -187,7 +187,7 @@ class _CollectionAppBarState extends State with SingleTickerPr if (isSelecting) { return Selector, int>( selector: (context, selection) => selection.selectedItems.length, - builder: (context, count, child) => Text(l10n.collectionSelectionPageTitle(count)), + builder: (context, count, child) => Text(count == 0 ? l10n.collectionSelectPageTitle : l10n.itemCount(count)), ); } else { final appMode = context.watch>().value; diff --git a/lib/widgets/filter_grids/common/app_bar.dart b/lib/widgets/filter_grids/common/app_bar.dart index 463fb19e5..5023a70ac 100644 --- a/lib/widgets/filter_grids/common/app_bar.dart +++ b/lib/widgets/filter_grids/common/app_bar.dart @@ -110,9 +110,10 @@ class _FilterGridAppBarState extends State>, int>( selector: (context, selection) => selection.selectedItems.length, - builder: (context, count, child) => Text(context.l10n.collectionSelectionPageTitle(count)), + builder: (context, count, child) => Text(count == 0 ? l10n.collectionSelectPageTitle : l10n.itemCount(count)), ); } else { final appMode = context.watch>().value; diff --git a/untranslated.json b/untranslated.json index d5da8f2de..328216c41 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,19 +1,6 @@ { "de": [ - "timeDays", - "doNotAskAgain", - "entryActionConvert", - "entryActionRestore", - "filterBinLabel", - "binEntriesConfirmationDialogMessage", - "collectionActionEmptyBin", - "binPageTitle", - "settingsConfirmationDialogTile", - "settingsConfirmationDialogTitle", - "settingsConfirmationDialogDeleteItems", - "settingsConfirmationDialogMoveToBinItems", - "settingsEnableBin", - "settingsEnableBinSubtitle" + "entryActionConvert" ], "es": [ @@ -41,20 +28,7 @@ ], "pt": [ - "timeDays", - "doNotAskAgain", - "entryActionConvert", - "entryActionRestore", - "filterBinLabel", - "binEntriesConfirmationDialogMessage", - "collectionActionEmptyBin", - "binPageTitle", - "settingsConfirmationDialogTile", - "settingsConfirmationDialogTitle", - "settingsConfirmationDialogDeleteItems", - "settingsConfirmationDialogMoveToBinItems", - "settingsEnableBin", - "settingsEnableBinSubtitle" + "entryActionConvert" ], "ru": [ From a1a32924e9e0c7d2068d4cf52f939f0daff462a6 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Mon, 21 Feb 2022 10:13:59 +0900 Subject: [PATCH 28/39] l10n --- lib/l10n/app_ko.arb | 6 ++++++ lib/l10n/app_ru.arb | 15 +++++++++++++++ untranslated.json | 23 +---------------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 1e04e7578..abe37bbcc 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -28,6 +28,7 @@ "resetButtonTooltip": "복원", "doubleBackExitMessage": "종료하려면 한번 더 누르세요.", + "doNotAskAgain": "다시 묻지 않기", "sourceStateLoading": "로딩 중", "sourceStateCataloguing": "분석 중", @@ -382,6 +383,11 @@ "settingsKeepScreenOnTitle": "화면 자동 꺼짐 방지", "settingsDoubleBackExit": "뒤로가기 두번 눌러 앱 종료하기", + "settingsConfirmationDialogTile": "확정 대화상자", + "settingsConfirmationDialogTitle": "확정 대화상자", + "settingsConfirmationDialogDeleteItems": "항목을 완전히 삭제 시", + "settingsConfirmationDialogMoveToBinItems": "항목을 휴지통으로 이동 시", + "settingsNavigationDrawerTile": "탐색 메뉴", "settingsNavigationDrawerEditorTitle": "탐색 메뉴", "settingsNavigationDrawerBanner": "항목을 길게 누른 후 이동하여 탐색 메뉴에 표시될 항목의 순서를 수정하세요.", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index a5c3fa4af..86b70ebe5 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -7,6 +7,7 @@ "timeSeconds": "{seconds, plural, =1{1 секунда} few{{seconds} секунды} other{{seconds} секунд}}", "timeMinutes": "{minutes, plural, =1{1 минута} few{{minutes} минуты} other{{minutes} минут}}", + "timeDays": "{days, plural, =1{1 день} few{{days} дня} other{{days} дней}}", "focalLength": "{length} mm", "applyButtonLabel": "ПРИМЕНИТЬ", @@ -27,6 +28,7 @@ "resetButtonTooltip": "Сбросить", "doubleBackExitMessage": "Нажмите «назад» еще раз, чтобы выйти.", + "doNotAskAgain": "Больше не спрашивать", "sourceStateLoading": "Загрузка", "sourceStateCataloguing": "Каталогизация", @@ -48,6 +50,7 @@ "entryActionDelete": "Удалить", "entryActionExport": "Экспорт", "entryActionRename": "Переименовать", + "entryActionRestore": "Восстановить", "entryActionRotateCCW": "Повернуть против часовой стрелки", "entryActionRotateCW": "Повернуть по часовой стрелки", "entryActionFlip": "Отразить по горизонтали", @@ -78,6 +81,7 @@ "entryInfoActionEditTags": "Изменить теги", "entryInfoActionRemoveMetadata": "Удалить метаданные", + "filterBinLabel": "Корзина", "filterFavouriteLabel": "Избранное", "filterLocationEmptyLabel": "Без местоположения", "filterTagEmptyLabel": "Без тегов", @@ -156,6 +160,7 @@ "noMatchingAppDialogTitle": "Нет подходящего приложения", "noMatchingAppDialogMessage": "Нет приложений, которые могли бы с этим справиться.", + "binEntriesConfirmationDialogMessage": "{count, plural, =1{Переместить этот элемент в корзину?} few{Переместить эти {count} элемента в корзину?} other{Переместить эти {count} элементов в корзину?}}", "deleteEntriesConfirmationDialogMessage": "{count, plural, =1{Вы уверены, что хотите удалить этот объект?} few{Вы уверены, что хотите удалить эти {count} объекта?} other{Вы уверены, что хотите удалить эти {count} объектов?}}", "videoResumeDialogMessage": "Хотите ли вы возобновить воспроизведение на {time}?", @@ -271,6 +276,7 @@ "collectionActionShowTitleSearch": "Показать фильтр заголовка", "collectionActionHideTitleSearch": "Скрыть фильтр заголовка", "collectionActionAddShortcut": "Добавить ярлык", + "collectionActionEmptyBin": "Очистить корзину", "collectionActionCopy": "Скопировать в альбом", "collectionActionMove": "Переместить в альбом", "collectionActionRescan": "Пересканировать", @@ -349,6 +355,8 @@ "tagPageTitle": "Теги", "tagEmpty": "Нет тегов", + "binPageTitle": "Корзина", + "searchCollectionFieldHint": "Поиск по коллекции", "searchSectionRecent": "Недавние", "searchSectionAlbums": "Альбомы", @@ -374,6 +382,11 @@ "settingsKeepScreenOnTitle": "Держать экран включенным", "settingsDoubleBackExit": "Дважды нажмите «Назад», чтобы выйти", + "settingsConfirmationDialogTile": "Диалоги подтверждения", + "settingsConfirmationDialogTitle": "Диалоги подтверждения", + "settingsConfirmationDialogDeleteItems": "Спросить, прежде чем удалять элементы навсегда", + "settingsConfirmationDialogMoveToBinItems": "Спросить, прежде чем перемещать элементы в корзину", + "settingsNavigationDrawerTile": "Навигационное меню", "settingsNavigationDrawerEditorTitle": "Навигационное меню", "settingsNavigationDrawerBanner": "Нажмите и удерживайте, чтобы переместить и изменить порядок пунктов меню.", @@ -449,6 +462,8 @@ "settingsAllowInstalledAppAccessSubtitle": "Используется для улучшения отображения альбомов", "settingsAllowErrorReporting": "Разрешить анонимную отправку логов", "settingsSaveSearchHistory": "Сохранять историю поиска", + "settingsEnableBin": "Использовать корзину", + "settingsEnableBinSubtitle": "Хранить удалённые элементы в течение 30 дней", "settingsHiddenItemsTile": "Скрытые объекты", "settingsHiddenItemsTitle": "Скрытые объекты", diff --git a/untranslated.json b/untranslated.json index 328216c41..73ab30320 100644 --- a/untranslated.json +++ b/untranslated.json @@ -19,32 +19,11 @@ "settingsEnableBinSubtitle" ], - "ko": [ - "doNotAskAgain", - "settingsConfirmationDialogTile", - "settingsConfirmationDialogTitle", - "settingsConfirmationDialogDeleteItems", - "settingsConfirmationDialogMoveToBinItems" - ], - "pt": [ "entryActionConvert" ], "ru": [ - "timeDays", - "doNotAskAgain", - "entryActionConvert", - "entryActionRestore", - "filterBinLabel", - "binEntriesConfirmationDialogMessage", - "collectionActionEmptyBin", - "binPageTitle", - "settingsConfirmationDialogTile", - "settingsConfirmationDialogTitle", - "settingsConfirmationDialogDeleteItems", - "settingsConfirmationDialogMoveToBinItems", - "settingsEnableBin", - "settingsEnableBinSubtitle" + "entryActionConvert" ] } From 6ce1d6536757826d501d5b35e3c875b02328bb4d Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Mon, 21 Feb 2022 10:44:04 +0900 Subject: [PATCH 29/39] l10n: id images --- .../android/id/images/featureGraphic.png | Bin 0 -> 16571 bytes .../android/id/images/phoneScreenshots/1.png | Bin 0 -> 281116 bytes .../android/id/images/phoneScreenshots/2.png | Bin 0 -> 511578 bytes .../android/id/images/phoneScreenshots/3.png | Bin 0 -> 211656 bytes .../android/id/images/phoneScreenshots/4.png | Bin 0 -> 88801 bytes .../android/id/images/phoneScreenshots/5.png | Bin 0 -> 80303 bytes .../android/id/images/phoneScreenshots/6.png | Bin 0 -> 379202 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 fastlane/metadata/android/id/images/featureGraphic.png create mode 100644 fastlane/metadata/android/id/images/phoneScreenshots/1.png create mode 100644 fastlane/metadata/android/id/images/phoneScreenshots/2.png create mode 100644 fastlane/metadata/android/id/images/phoneScreenshots/3.png create mode 100644 fastlane/metadata/android/id/images/phoneScreenshots/4.png create mode 100644 fastlane/metadata/android/id/images/phoneScreenshots/5.png create mode 100644 fastlane/metadata/android/id/images/phoneScreenshots/6.png diff --git a/fastlane/metadata/android/id/images/featureGraphic.png b/fastlane/metadata/android/id/images/featureGraphic.png new file mode 100644 index 0000000000000000000000000000000000000000..11d0ca7af0b86f9356a7995eb3a315b8069c42fc GIT binary patch literal 16571 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

fhe+_kw?HNL|sYi9`gKFUB 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ⅇ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

{@bPaX6s~$u2xQJ|Px<<6*}hf$XnD%T;#m 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

7Zl#n`*=^IUh2r)MdydAuWS<&$4 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�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%0D^SsRORP#6rLBMcL8ujLBERgFwKdWEU zq<>3=fzK?pj-r$p-H$x-=M1SCDk%FoN!AcB@uApc3FLE8d+`20TgR>8Aw&p*3 zxw}cDa{mmF_jU$6_^B-ae_;x2L>=2D`H*HtP52Y%G=A3sEk}B6Ij7u%Vt$Y=iJxtvbx=fNm4Ys~8LK7LNwrANV1OC+) zTLt6>Z%Jj<$h5jB$-1JM;a%Wvp^!_0ftao7M}(gUq+I4Z2cvphr^$#F`_k#&U+(cq z)w=f{F?f`CT4dfYa1;i2Nq&&2?=&Q~{5qhHF)&I~h&WzXjws+WmagQkK^B$o3ds`E zuXMS*uQ4~ZHZ}hdKGr2IA)o*sq@*QR`xVH8g}{~+dbTq#A6t&rIFx+r_!iD%Xd5DQ zu(@>_lwFOSyM#uN%u6PRn@zhnb{CS_3JxlvII2QpAvQffq_QEJaIEh&qes*!x$k?Kn{wPZfluHq zd94j|W9moP4INCa*(=b$6Y(3LBbd?mq{c0+z6Fi6h5&`X-8csJ4VLqKo)e6E%3V#& zgiGorf-4ProuEwUF?hBBI?a$zv0U6X8cEwU-k~}c3Q=aVbUAIaC(Z~-Ui$K~#2~UK zQxT-gTa|m*KuszO9ntP`ir@{kDz?f@B2o4n0jdt+>#;k7HO6=MXCt!?bxr1F$c z$Zs%*c>sLq^=MFEl0)-(zBZv6<;!(nOeHlc>I|ZUS_gD$a z9|%sgYzN}>UwDI`IXR2=>0`x3{()_pz7;(6$08Rp)W$=mLK6J%Gt(&CBlN^ z*UB8yyOw5}5QhQpm-8Xfh3O<*Irlm?N#C)mV5>j@2}h+>v!Tlj4S1O~0J^I-EQhQ9 z`Yq_mXr~dm-m=<#7F_*TAf;Eb!k5c5*6h7Z8B%Hz7Qd zRsz&W$i{^YQ4Vaf7qgVEAwQ(6T9*X!3wSY&)d&N%Ht3&-Ow5{fp>l+X%0xEF9hJ8} zI_-zfs_HVqmxS?_h&jQ{pfWz?kmu0SnZe+Z_Vj1VfRb5@lu(ow6BmxE8 z+$B`kw<=E%TEx5K*}L?HGWa+s4|F!0T9x!_2i&XQYsZ`OStz-7YvO{jp=EnL3{Uif zgWt{O_a?s+6pjCV91wnd_-NgjZl-mj^K_8$im~d&rX4{v4UwW?T9T|D2g9m8y!`FBegdwIH|Ib{+R|(si2!iK9JUDbE1<&`bcIcmhd1<9_ zi(jtsze5RvHezM?BjsP{vpK#Id`)A}AA*$>8sRXi+~#H%7GCAODQ?53&j)!*$5vqRgcDVRgu>yF>KpAG*ren@cV=t0xc>b!MQQ2PU4(~Ro% zW;(wXTe}hzdz(qeT98Qe2PGDuE~BaEL_t)*WR3V0rzUT3RZ1miCpE8ay&0a6f25B) zFYCD0TA}+5ENJOcS0Hrhi6v54=V~XnmcTDB4tQMU#*_AD!r$jB@gLNIAO6#ClJAx% zZ@1QLX#sLZVIXYLpLQhGvxuz?Fqef$N@U{4R|il;P#nU1_i(}C zl%1?s{bZEN`Yynatb+PaAyh+yYZi?$YO#!?@`WpY#9ZHzPecwTsk#g^Q^UIi6R12L ztHK?T_dC~8qK#FRIB^XXDnSDp^>11n%6^}cx!JnYxyaM2hya96p&(YI%x->$<_A$H zvf#g2GNk-!>WFrQLHA~2Za)e4@Gqx=o)I{mqgR@4^ah8cXhV{J6z4SwMUpqbarvo3 zJ8ASo+-v#ysl));sO9NVmW_?Q;NVvmeb#k^O|%#$ief!2=Lp#B(EBoq-mRU&d{muT zyPP^s528fW%ml<-UlH0Z0eW}z=5{T=nW^}f~B0PX{8(czAAbV z-!@Du@dYgDB(NrRyIkdVVyzR(j@qyir+*n%Jg3x!qLCiFiu{${nT5Ifm9CW!r)`uw+Vx<9bZh(jc{cWG#F_3Pb33j-J(vp!Td6F5=OP%h!1RQ>!9bULkKb z*!`mmop-8LSdS;K)6sBGJx)@b^gA0CX!OBjKMFQT*S z`fec`aHvCO*&fq?74(v!5T{taY5`~lw6Y@KzX-a_?5@1>5}Crdx&jhs`9Gg~82E)AesNNtKP*JP2Y@uz7KM8+dgTif%Rjc5H_tkH z$A|uunIT(#I_~T$BoBR-P(bqqrAXVcFq#ubFh7vxVhPiHe# zE2SG=v!m}Djpee{c$7wNorI#JXeUx{b2xBAM>}JA1@&%zj*-pAN^!ZVRM~wXyo;z z)aJcs)@{;ic6KdC*`4e4Zj#j&oyd??fD%_zNjiONK@?WuXRxkTLNn#_^nlmocgCFb zTEH~k^cyt7qme4|Ca|dJnY0>7`ybi*`LIrckhR$}Qgc0KwS(c)+l%6_czi&<{lsRu z$xjIdURVUkY)l!xm*i8IJW4`(%Vm6TfIaH`Vd&WzX)ZkC)Vm?8ppUzZZTNRX1LjTC z^S`qdqtx*cTKsa&)m40ms2Otp-#v4+1n35Ye-KS{Biz|Vm^Q#T5f`Z@1A60%Heik7 zL2dpWRS|2Hi0eU*be4|$&eI!uc$j?nK>guEC`0aRPxK!Q(Xwn-WV_#b1$P>Z95V(T3A6nI1X#`dvDLEUJib#!;%4;5DuI}RK*adJD#EUM(nG*C0t?lrlDF!N~h zzki?e&tErx-#)$B&d?a%b~W_=0BVdp8BG9PD@yjo?l3G9ayYyZf%8jJNNJNl{*G)o;XSVtpQx1MV$eQ4oY#`fTy$Cpe*-?{6_4I z{j|^hv5~=;DStRG1Q~!dGXW=7`#kB-aO~xED^8D!R=s zNGZmRv#44dNe+7nN-RH-)1gu-GSPpWy{zhT$v-)1BSzyq7X{h3xaVwW(_(j`^hB(F z)r)x#4Gq1&yAv*R?-J<=(bP|XHd9aq5!QCfoqpDjd)vdD?(i~@)K@n9A-YhMohP=YQ5viHx)1 zkd&#M(q8H}dl%`8w*h^SDwsIa?m)sfYm#pmm%itK^2Ei?6p4b3Tz3QPyZie<(Wjdc z&9I27B&QkCaHxLDis|PQW!^G3w@j!4Nu+?%2LRH|29~I=D5b&Lw{~!l#J5hgWW3qt z80C$I%1A7IP)qExkpTXaP#xPJmf3RIb>5^9PC~PBJVLCpsC3?A#?>yeYikKB8%A9# zXqlNBdG!(lbn1@dWd`c2tlPAw=YJ~oRc76odsS*2oPK4`jFNV0RlZpn4IE;8A)}d4 z3egfg!|x>$G%uIIJ$)@6)$P@l@b@F^J@JlA0eFk3Q^zkoS%UwC`MOLeBj?IV`?i*~ z7w$UL6GP*DwCXDzFY)xe)2m-TExl&4AbOvx_5ZU5(nW=~0g#!bn=!Gvx0*=TSeLle zMt3V6a!eTjLYxe9W(;}VUAi=sW!ZdKlcqCmk=ScAJq4fz5KzIU-nM#2O zSbv`-hCKP&VtTpX3H|4#ro6IG38;Yr;LZu>LVqq3S=gG<;)! z2_~1d@4VhGHCBb(bKv7h&Ljn!7K3L^D-v5YQ1<1}O7(G6N_g3xWB@_N(todC#)Y{S zi@5rjt^TEJc5O20$-`U2FK2KYv)-e%Tqt{Eef26e0P?NtV=1;D*-QzaW(v-d{@zdk zWIVx%Sp+9*v{x{$q7R0vzT37Fjsx`Bp=bC$l2}otgyCFy#9&V$UL+r(6@q_mnbenAxt$X7@2w zIl4N9UTc&T*!i6jjxc`z(8eN0JkfUi0?6eFmS_Ww~2$&*5lvC3!t8}{>I7f%~ zk2JlV>ZB)2_XQlqSNq!?)B zxm;1Bc*4_lcsy=l2%_;4^TzUBP zDY*?f)B#_h!M|PzgEC$lQk)2RN*#i{UV(RKB%3~bWc#J`qM3#D^FNBtGAhch4Wq`3fTVw0um&PC9bnq`Ck`ygJ!dqnAzmihWKHu z6Ti~m0nKe-J_Dx4D6TUS5!M@1GPRIm92o zJ3tfox&FxN%plFX$2z%XAfc`3*XRs-0gFZK5$$lJ?GLr|y^DU0ZtaimgQIwO;D7>4 z&G6iqAl;bZ8*egvX`!2@IVsl^cHYW)Aie9=qTiyah|?ecq%&{Wqc_hcW!2i4#)|nT zk><9wwA*v;P<*Y^chH)D_xiBuN=G~$bfq)l`w;!=$NAU&<%wW-cUN0i7noK7K9Ql@ z0!vzg2=@`IrH1K_N7TEh!H@0vL**Qvsg)Gr;_Aca_Dq{ClF;cJ64~q=+eS}Pvbpxh zbBZ^3c)MeGm$bO*m6u4T3~Q1-SCbgv$UY2{%@?jCjGTS!;fATyN-K>jGGXh<^sjjD zvq0M-VvVO$ijdhnC_;Qvy>106p>RHGouk+~>eJb^+tI0;@i*McB3x_(?2FQs<|?0_ z5Mn$7QjIn9qCz5j{Ct;a>p+rrk*2&o&*&IG5bFY@kjez!>ObT~N~rwI%3Eg^18@k^Qv6KFnwiy`?ivIyaf+9p2; zGST;kkMfA)h;M6*AKS|dI6D#!zT0C;8h!J{84&oTHg4K;{%7jONDbL_VWRQ=+~5T092hR-9|!iw~Nl<1*%_S&et&?|^YA)V zr>TGI|EHG)6u|e3r*6B8Ea`54A6~3Wq*3yEaF$J^f*KnD5e4X?SNCKD;mOUjXVfEw znka3GcXR+rBO1>_%{sovDV-gEOeEU)p5WuJWs27Yiq#y31e z_&8~y;7kme1#zRBp7We^g)hJvib{{+{`;Fvu=N8NidZv0{CQ)J|w zJmVtBlT=1#$EmX#%_(6Xsa^!&H_`57_>59PHnyQE7@T?A6||o|xl{V%29@JBd|{2n z5%k1TN^jNf-l2X1(^n2uMS}ZSa^3~@8y1QxXPZZ6PfZ-Gl|-;TT=8M|TR|F8kp~XU zUZvzsdGe5YqgN|#<u3p4^Lxmi9X$d31R7+wOhh)TwMk-loB8_U8e1+to-Nfb*vdY#C z8`F-m{-&jEx8pe>JrPySDg-JIK+sukK7vIa*0}94{%urp8q$bs035L!M@Q+v4m-2b z<_<>o+I4OZVv@?0xIEaQ1C&`Wo1{Fb?`l*A-_$H@q*K+)MVqi^DU%R&Jnp~0J{PFr zZ2Lh?;6jJB>vp>4;OZ)tXbPNth^nKa67|eie}Bw7=S%i@drzFZZ|oeZJ^gd*{5tBm z)F@8JlC9`hfE@xhAlv9zH64sT5l<|m+_C=Lx>b`>4a@5gywCI`Z@_#>RD3xC}QC|qMo54{t0d=g9k!Jqnu ztynp=pVs>>5XO(dAt&8{o#&?1x(~as!Aas(DUFQgdS2N-f4U-kn(>jpzWy1U)rG#5 zHAv<8;AB3Z@DY?&olgAMc^WiGCyLk3uJHB|t;O!6h8Vi*h5|`RYa*}gFxELmag_MY z4kUNTg1e@sKFLg5x7=N$1G4}Wp7scQcMIq*Xa{AddzQnV-%Ntp$OOE*G^M%dfS`Ww zX4l1$^#eIa8rooME>O{77 zIZuab)BC*!9?qeyl|vW)8mVEp6;9=+^VS?%<4hBGX0K0fI6?TgAj!T-;bo2BO6sUD zveVcN6BH1?lf^G?xCNUm+=KWUdr@ZaURA9dc zEB2>o{0;JZ{k5fPheRJPSys42{fW+UFu5?-Y*Yw^_r`?3HKgefQ6YSJnFxLGy=1z= zIBQL%4BG2ih+RvkKsHOZXb*uXlrYc)L^&|ejgvI?7AB~z5rEf5u2Y7|0_94do1RO0)B5FD`x=*vx_55_saD`w`_G+ z+*d2UrOR!JD`mlHD)%SLNTOqs_eO?<(gT#UdY{$qG-9`h*Q00Ua_lVw8E39mW`61m zXYmX?-4)G%asLyLzxe=z+AKxNjy7dIr&im(<}b*r9rU$My$e*bw`_i?uiyt3rfTt+tD& z7<~>nxeGi{5HNaNoNql^bhC2>d7O2x0eMMMGP1qpM8}SeRe1q8-_yZ-Cmi?}@GK(_ zfY_AcxpwiA;&&kb=Rt83i*8h_8>CYFe?IhGaq7@Khxbe8g5b+`9R(G1i4h2j#L6Ue zxtyDBov*v)suTCH`SonsK114nN2}y;a>HIg*g1av*JVKfU-HdO;+iWEUW2SZ-!uUk zq_2TNBY%9#Me?1?wSryAH7FgKt_|^L>ND)C5;on7)iW4&e&OGuY+e!yVD~uhV#X@W zH1W-0sP_r-h4EP`82(!GNEHq^Bv#+k7Eer;w240e%5C3kkwn57h6v4J?v+(T*$1tIr2LU;NeNA zdh_ZFr69IfX{K>!nB8xnwpA%S?UX99q@4(0sJWom(a;wE*rI;rE7e#MI>+X&YFLpm0Oreb6Eifh?FknI50haf3tD#!ZhfaDfWB z*X7@)Y}C#>I352Z9L0|c_8&HZQr@}2feaL<0M&bbOM4UmWYtY<+GF`E79LTO^4L{;6qhkxwOBQQEFjfW!#&oFrw@eHY)BZ%{)#qTK_`|5m!w5 zxo=z^6;3m<5$A*^2)*A&{tH0dY`A$lPx4L=jNV_0K~XX-mFTn;WJNNfu|mGiwCXO= zOTzQ90{51>#a6 z{)wsjZpd;Tl6s*7ih{<2AG<4DaDosb)rUmCzM2g%kHp4dKM3Eu!;jTDYc(mu|&6 zvYWA|!500@V}f?^Rn0Tfj-DRm>hIPy5RwX!^LCHaQQImpW_bHI21~?- zKj>y`SLYG5BKHp>DnEBscuWUna?gbQ!TpTyU>tbOdbLOWwE8KBulv88fGdiRkDzZu z0>>R$XEd2TZ-1*%w_ND44{yOT(Xj+Rw<_yBCv{$7OBm31`L-w!y`FS#ewAOnQ1=oS zz@;r*3SF;j$a}5JgoF;L16P(>X8ii!Js=i`)ZYU4XfzcB=|*nF05TcPWp{C&L1kIF zFc=TdjD8noGZJv3bsYosVv>QGZ=~ z%Q&*88iARa8SYRAv=IIJy~fMbm?#r+PYbUiI5TTBs`fP{8|J7CTeRU7CR@Z*;pgKu ztEY?BH(pP7vCkdwrp{NoaYjaoI{HuwAav=9UhIf@uU~~fWB5(|yCwE8luA0RKIU!}#EQ>UT~kNg7N|^ECT1XWRYwFD zd3tA)uXQs%H3JV@Y#rD-n_2&^7u-Vy6tu0mlES*$E-+9NZ}_eV{BZmvgJ+_ zk@0nO=u(FJp?kWi!a3?ighGh67L3MOxpL-BjcyIMq1W=pX1<7saC&*Ldm${qv4LG| z0RY>yzs#D-v$%B{!~ORJ9+}WxS}H8+%HxwR7J50*xv+gF%>wdLmj)?Hoc2?0CarYN z$6@dngboWL+7W=08NbOTm7P@=1;q1UV2~nlARgf|M)C$P6;2`Jwp}DrYpU%HNS3 zoYEdmk9o~Aam2C2^Diltx;fTnY&5&}CMXD*Ww%;00~q(^GLwLjMb*qK{?fy|mV2qO z$l}-0Ms+|Jts35Ld7`vxS;Az8Awkysq4@9tjGIQH;;Ec7cBkFV>v>mT>koXs^M%c3 z{v5!b@_Rk~unt^bZeZ|UkK5&%&>IRBxZ(qF=Cy1(b|6c0{62^!5?a=6=8hwf-TW%Y z8qcbJ=zjT+0rWNUiL^Js3j7z^DW>x~&| z!bHdNu0cKo>$~(5lT!Xjz+Q1OR^~P0p8ihP_^oA(Giilbc)oVl7T?S*UuUMpKc>`y`VnK5J^%Y83kQvCH zJLBBN#T0>*zR`N8jL0J-Okt)J(qq*-Z5d8@@ostOvC5y?k4Ldrh?+xAjk-!l02wR) z#6mm9D(ZSUL|E@0wje-)CO}ueb-G%jrM4x=th)E<+&dh%jMjnR8V^m9W@*clQ;;sl zo@e(=@ywC!6V(O4L1}sq?cuwK?-v==BpJI1QeMMI?Ee~ff;uVbFIcBOMhjFwQ>Sk$ zAnUrYn@sszp2m>W%N+(4#v4h8g%&jn@>KVZ(a9j^p# zz(1hLSB%(FA1nU-ya|XNV4Ka_73K$GSjlnfoL!m=2CM}O_Gkwd0?dS?;%gsGzxgFl z>_~}uvqXM2tqc_Yg=#si%(ELGUjks>KJh55$I_9!s^>CK_2!_Dle&+zN>>-{Srb#(N8js+;W0CKR| z=QeC`S-jOKz(&h!eUyr1e`G5A>wbCzw&Tqn%L)d`U1;|WY9nxEFHLmw|@hKE@fRsOMu=k44kJ_u~ukpO12)2l0mV^KrXj zOs5ue7#Rl^Ii}Q!{sS%g@i^$-Y_2W3^7Gp>t1pyRaI@dPwe^aGGfVcOAc*f+=~j13 zi1 zd*heyICxL=_L7*Spu}^c_QjfpqS~!@P)_ts*H>D_L!W9Y4>>zI#Vr{4dmSK7z-M64 zpmP^~B(&Y*Afho2D4)D;S8vr1C14OdrjM#-846!AfQRJ7W7A$UyY=7xTMlG|8yh%ECYyFBH*#} z4c7N6u&!Q0wbv8Sw~=4I5m~aTpYQ9ov6k|ANJzX;!KbN>i$`reJquEpcl?=Wj^>(NgT%^Z}eO+ec*63$_V6NmtX zY$&*EeD&y7D!7w?0HF;axPHE9mKA{4FYUq$B(2*`57WEe$O@~l{q$f6p0$uVukF(m zPb^qj$=CL6H+sHv_veF%kx-=LT5Ha;NkVh#zev_GKWxVp3tC~1aSLs?)m^RrFoX=z z4B{AA1;k1S;kbZhQ9`FK>sPob#d6;h$Mn_E%>D8UvQAbQ5M80gzX0hoYcjh$i$s@E zWgbr;AcYrYIjB2Eg5T}R5A6B+b@T76%juLWb<5al_wgzQOkqI}pVW74K07sVFFCHWCc~RGkZ~=~wLRL^z$;+DTyhaXt8u zhsAY$nb4qD-4+cK&h`8)*}{#QXwzo!eD=Gg-LOM_lAWY((LaevSDB+BG%TDL(2%ab zMA3x1-=2tfyuh+JkLVK1oN9RoxtKBsB!$kOxMX3|jqnhyz^Vz;@0kL=1C}jtcivFP zs^bMWao|l^Fdo#WNWZcpvvyc$F%*Eh_{$GnmbukovsGK5lGe-#=yfAfNHug=3>)Tb zn`lryh68Rj%8s=Mzg5==qP}6&z6q)*qp_W|(auO28DdK1kp1^eFdC8pffgjTZwvTT z+Zt5rCmsPG!n9ud79^m194ekJ@T~ZJC_M%cc84%WfjeU$L06K1t>w#EFYr2~wH=<=DnB0#xe2Q4>nnCva? z*m7Lg;t_QMEO}p*gUx0+!^<5Jxq>*d6M;Hvs5YKHF8Ro3&tjRXFAD=Z?Jb8`YY4qS zUSB_L;>jrDzaXXBBVxN1TJlTDB=-wJcP!8_4XXkS{P|%UyWyC&(et1}*zYDzYV+p; zazy(lT~5B}{Zb+plL9KOG2{k?q5+d9H%E1Z%fgsBK2ktV=)-N2+-M^opB)Ft7rX-( zm|*@S!CA6I1NbA0)+2H=QbN=!zXfrS;yGNm=VU`nmTzWc1BT+Y0Em?OcoG)0^slkc zc00wW)929y>!YnuddceXn)Tz9iP8N`Nof4Np`TNf*+f=cK1&wAPoMeU%Os|uX-K7A z$zkec#OUN3{PG5XW1HIgS-3bxWB&H*63r;Imj3=Jf{9Z=z^G}xX8APGB0FIy(Qjg{ z!=!HQ;xEU#w6dAVehP?|yLn#JfqtQNYV03^iH3hjDb|u!CLYcgOyvUwFeO#n52xdY zC{A``i*NLK)SlIqhoSL!jH#L0?R}%JeQJWgP066{gAuk!Q}mX+v`3ijp6_2L37oCF z7O6)Au_agDjzpel!gutqB-u-QB#eP%SFr6i6ZB1b-`@y);TTP#jww%RZt0XP+#__Y z6Ea(b!!XowlyQ{IMMpXIQBF^vfifmtMG`k_;Oz~th=pLd5zmPO`1=a26>=8A0Ftg> zea)IeRI)fQj69F#4JjtQc4HQxlFRly33yL}b1l2|Qu>?n{S=;GrAXp(1M zmQm_GU3@PsEa+U{^iNAD9`Y|}n$|~M6H**I3vD(5xl-5sezsADxnT7qnWWIaeLu&2 zC7j)Yu=gWEFruNGCGxk*FOOqexWH)S7ehj#g-`76sDU5|^=h$y%#CGep2U-y@YL+9 zZ{y43d@a2!tT)r7k?-Zfe!oszP0eK>LqunsA){x18Gw zd`FD)3GA$2d$m2ExR$F5$T}KsBdtq+mybZoLz^8=)~vk$d1uX!TCcb(Dw#j@PP|@i z?E6UZUXuN+m_$tEZS9*;u(`Nf7a+i9ep<*=!uuf2qDy}N+zjuH*vMLd`5L}`c{S2G z-LYDdriX=u4!!uh$2Sb$HXUn1l2CA%`eU4YLbn|=#IG%o4CJTvd@NE~G8h08L^S-x zKs1pG6lPCw&?u(zg}O^qk$N~jZZ!w~s5TF&L#j9_4uAjHn;9)|A37T0bfGwI}R=^0Xk{t>MMyl^Q>C*cUKWiw9yD@*HYV-qikEl@jC~ZRWBE~Hp^#i zzAqE_@>Ik(p5-j`|4>u~abxrM--Ht`bie>4Ld{|&fWg^%eslwNfBw7^%^tqONv6b& zJftUpJ~Ob@az7O-O-qo@N&w`D*@{atK0s3|Gsd~#|3wZO^OTE7u?Qq5!YQQmCTDQ# zYTB`%2bpen12yRkIufLOaJk`NJ7cR#kS&q?jL+Q z(R*SjQY&(p$649ZtGi z>!*$&?J8nF!b;DDMP)jxjfyXN?5L%6O~6Sv0yu~SgRAJAsf3|ohDa>r_@Fh{LNlx%dDNi-A%7+yWJ%5k^>pzV9V{zs9F(-;f|hq4dhXt1 z4lcALjC$lV(b)K7#*&2%Bw7-G|1GpV&lsv`59sxoF!1ft9Cha{r2qKxv@3A_FiQut z&&piV-A{=T0nL64|ByyfU!nbqty=p_4Be|Zln{M4e(Pgv8gcmC{F zCB&;PV{9n-#kJOobpSQ55-i)dM)aFU_(&sW09l~NuspVI!hET*+l9md=X;9W5DY>u zDH->l6)BU=@$s zVIn8)Z*yc`OxqkfBU6fO!qF|!8H0(pev=Ng?}H7SDeC^$9&519Y!KcLL%;2QWKC5o zn$dT8xMaRp$Xip%02ccK5H8qzKYoa71kuVcez|2a)zD`nzCm-D{Zxi;Vk~#k`q>2R zqFlFBX`wC6TC2?`VAQZur)^s>i%cRBFES?gZ)`%&{Q=H(@BVdEX_s=Vw35r(t=@)$ z1cDdy3$OHwGs+_EgOTwH(E18F)vGeyyRKLwuXf7|%T?z+o5S>!*JAG_Zbu<^`Eq$E zNKNWPH2Tle7UX6M zb!x)>@r~5A`p&J(rF4+S-1baC_!N?Ce045D_RCo1Q0vHkHk5Fl)A+*uT#C=us6oCUH9!H3)cMc6`f z(6B~d?*zCe;5y(aC*sOy@%1i*_8SJfMJ+#St+hXYs%Yr)hWrDZcKgob_bvKNk!+B< zPl&$R>7~@HJq{D6G~y{n+qfPXaDDkn%91OxJL{`9#skr9Diwc z>E<&Ly5Z6brD^HMx3?_*yrxcyYa zFE3F#p5SK0=$7PO@*a~@_^F3vqLKS4C<_Uj>{yrxO z5E3Q`gM~+K4sX9RK`RR(kv$BJOQxR4I*V9;!8Mbw6mbmcVIx_hOD#3LtQIMG(e_|EmlTk>$&Dx|-Oac+!nQKdCWP6|@|r$cfU` z>DoHFq8>a{*km315h8pYfUvTqmPb0VV{d`#ASos3-1aM8T?)@!u`Ag}JrP{FLio#3YCpn(T6|rho!RLLignTesU;YYiO8g(5z66Mk6@ zc1dnotLY!zPvXJ-)?h>;W;V>vh^$sT|husa;MP(FA^HW9=}|M;l|_O9}5w=U9RJ> zsa$4t6P8WPDJg{jzKz!7)-3Db$AH}zR6O-YBdiM;T*Sp#$kO8@Mx!wB8xqT;eqdkupq{}sZE^R7Lo$l*65Esof zEKZ=atT2ne*A~Im_;W`X=9QkJ}>{M>An};x(d5%o=`0 zK4GYGi@BDCfC~QiYs5^Ue_4FC&dlH^k-D>Hby#%&jyy(RN9r>+_BiS0ip7(B>~GRx zZ{+>KwYxRIjb^FPge8la)C5j`Ih|pWrxqE^zt#uK3F3$c%<-VVt)fzb zJcaU(4qtwfr5N3uqWNzqcso(NKj~*TU+eXuUFYUw()#7OIMdw@lMiFbplpCm>*w~* zyD@I&^9GoMYU|tIH<>n7@37mk-T6zV?D#S3HP={##GTiX+l`x%eaQ} zS8wBHLS%nQ>Yx-(4SdRYU%=B9n)4OH&YSTc+lP=0r_8MziKfK+L?$@JNE zC8_2NYc?*KI^J;WKHu>H&qmRiywq}rBZkuNi5mg5QS20$B1VRevuS3vLNk7$jAHM zfQ4(yBgBx3pQQ%*=iOPpcgy?i>{13@f?qkk1 zYF1zNKS@a5El3&wIPpwi-74$yma`UskrN-j+FQzW|tSDga`RR4B{6k zrj#C%Ohi*nH$Ollt@L#6$PpFC5lVilYtwk>M<&|XN2uF+Q!mfO)e($zv4{|}*~se5 z#*2z-HPIAx(~jgCvl7M)u!yR}fC%CuKFQK9KenEibI=K%7tl&3o*gYJ120X@9o`cd zRUOoF#y;Rf4YW?+by-vfXq%^g#q*`(8KF*2%;mPPiF&urEXh)EooE!7T zlkT58*whd;GSKHXmITg|{5jI`~#JFgJQ&hDuzkKE^?_Pafbfi2`gqi)lN zfA+i^np~43wcGZ*jy?{4N~zbDqQsQxnduI$zsB$Hxzhfoa@eiaE|a#j0}2{-<`Jj* z8e$9tNi0G2J@1$MT_Ds8ADaH@Zz&5;zW0*T_-WWC_qCqYK)X=rB7&^7kY7g#i;dU@ zrl^Ld0RMx5msw0pdLsRDKH=M=Da%h7+lTBxc)4Gc6=MP|HmD~z#Tb0=E z@8x^L&P#Ya_I2QvI!>P?ma}6wFLNmUwSDz1Ydw&Qij(?@o=lTX_9&udK9U%+OzEP$ zxwqH)CdPvDJ3|e!&Z<5Ax5i}>yew}qC}hD7Bb~AG?&>mrrw!Mx!$-D8;9V3a_VAcl zmTzz*c)jB(^{+wy{^C2E>`LNCo52I`NGD{LPk%d%<^>z9s)rL-d!w7#O~85^2|ZS# zJDNYSHX(+c{0i~7X~$8DR1E44^yXR){X^@B8P?u_ag@deLJMbHwN(+Kc> zFya1g>m0vo!yZ#q3`gVS)UKtit(!|?IuPi;v!pqbNTyz#*~=S)?`eW7v5R&)@8n3KQn+&bpIwSe{S`U{@K-1p@F4HXd;x@X;ud4d#?>E#%GCuUtTH;o_|&;&%m z{WVyR4eT<7*rwFqosM6|CV63kVu#e=M0yC zhYp!r<6B*0_HCY_5_n>Yp>+^(mt|Sn>~tlFU~-t#KK51%IRC*YDtd@1q5F^{P7613 zIedJ7*(=<@A$0W*u>vt5kT9|AnRKftq#XTR<4>ja9a~6?3&v6G`)m#{FO_5Rq#Oqn zJQYpjzh7)a7{+9`oc#~;`IiPxe8C1TrRrKvkEgaO?%;*Q>QMKQrsCuRdC&n%rp}&e z_yr9ueRsKWWHD`&=&)l;?l)=Z0y9zcj{foX?+i#0Wbhr_@1a9 z0HMYXhYwwBW`bpbsbGP|5S$tKO_w>63BXew-p-HhI(a2m$qiuRWEwe$Sny>NWhChc z!5aG{Ww5B*eSIV6g10t@E_~RWH_U53dGZ45El@b3VJ?f zxtf*sd>AEDy=t$)Az6eTZhh~c#AdwfHq7(Z&_xcTRcWqa)1or*$NCU; zElD+WbiT-c#t!4gzoeks?iGOg%f~@5v5;Qwv)4=i?$bq5C;VtTP~dgv*6aCTB3)N5 zg&ri;SBf8G+O(LL@Fi0DEVZ_ne5_!(u%LtvU5lsetyuxGD^TIenLd_;OG-aMl~Ip zArfgtO{$PV-)1ENML2e#e@o+MYn|u54ROH~MGZL#NeX{re^87j8ZiG8E8+3n?N=^r zIbb9colifSLxeDD@d_k(a`a;O4x*p!&0ELOz8~uT`NBHxN<)J*PJO>Fb(Wp^ycFAu;=zW^wW@mFVNir zpm{)e?Kd?>-3(YZEG~XIji=*b6j)6mHfl*ykjf8;Y@+VBsv54AK_4Fx*V=tXXJ->) z7KQxI9%ij-=}j7w9XN^iS{We{U>leN@8_qxe*hmf^_+$b>-#_+OHCwA1Qd@+7juy1 zbgcug1DREd-e1l;ekb5jhECR)^3aAiF?$3w8eBOLv^#Dt3~QkOjFQRU(!=AhL<$hQ z4sn|}npW0Uf#(tkdh!y(EsE-J{w0ThethD^xgH5&G)wGHPgs*;>i*cuBnZp z0p7HB7(YJdJKPb=H>7b5c`vGnUK(8)dq6qtXibbw%>ryv@8N;N#!`s|?*xWfM~p<3 zo1o*6L6Hw}BJNwmy96*8%RWu4oX{wKVX4$eDOQrEuL3-IoGM*6J=PRiMMW{;LT$O8 zY)_Z04M&Jo1Pbc&hm2X1{UZC;oKT zxw%e21QjM7)L(Opj^e-Nj5wjR&{4RMXgX`gKk^v4n1Hul2{x)FAZQ9M&%NbQS0s*( z--(60=a)*wqN}PjPl_b17yWkb_WO3aotM~g{NEnXAyiRO!WmSk1_yBGA8VoyLU(>q zNVZipw@!om7edE94_dp`OFkD}E;7^E5=mNURLxm8X#ug``BOX4_eu-**B3r1y3Y{^ zDk|SIkjEWADMiI$qWG?m0pxugQ9%t=h&Tm2`(kJsb(aJ<`2L#qnl_lUtY9uCb4Ha| zYAlJqrNr!asD8TrWtkjQ-st1QMEsecpU~=EZy%t#8UBBse0ZPMBC%GRVbP}Pom|M9 zan@~*m^hMK&%!tYMXJ4epU-n#7LT9rk&B9ow6%3=bSoBYfV)A^1#7f$04r(Um)cKM z!6CCGusDLE31I6Br|q}_oAe&|^j}Axil(3bXoyyoXZq&p@uNY!D7c2eNmFlwZ+nYH zk;-AVRHa$-+kZjg7SZ$X_)qnuaGTMj{KC+NX(;3v6fHyJI0KPd1*?b;lO5HRNNR#KVQ4G>-;eUPyIYbFAeUK zsh(rb0AvGjgtDD1^VF!;5@FGQG!X!_{hpJ0E^&zND>b>xdL!5bSykIG?i>P8W>^4z z;>+84*9D2ZyikW+NqNJ6X3Eyad+B3UI$I)C|JW+*%)QX&jIgFQ6Llihn03Z9w5_>_ zF^F9~OLI~Ak1#USP!ToozQJ=GiE;k>7(cKfnU}msL*0mFkRQ`u3VL@%pf}{IKH9%B zq2p=Wv!Qyl+kE2SHQpp)W#cg?TbPBv~%hM}=a*7e-{rUxO1)I`L< zIs0mBNO*u!PIo(dB{pvcEyYihHvQnN1Mwz=Mf1>tNO)$zSrIfo*(%uZcKATpI)OcU z(REXytL4XvW$@5>s**p$`)xhCdlUx5V)0PVfuY?sE^)1TaJMF-5y-$b-b7Ln7puvZ z{^MU$&uy~Kdp|&QGa=6ex;>@&kPiIcdp*R{PlOtc0xZmX`(7I9d!YU`^!FOg_p-@% z)Et~^r70&bZ%!CiDZdrixSu>>n!Eu?m!tk^B1+t^jxA^(qpPhA*u#dWA*~gN?dDaS z3L`+g3~2R)5{9kaY;S|c@(WOI4Z1BTc+M)-${MN%D=1~1STvH6*6X{c==AT7T?a4m zUJ^-3}`59k8@<mV~AAP9!rF=DYM7^S|A)7pkF_q?B#` zMmKD6D1@p+VOvy6d%k3V9iSZ5T0wj0e|Z#NSLW1sh=!rzzedt)$V%VyD_Y%77wJSS z_&t5GcD&bI4a?X?x*{|uLE*G@9Oj(Mc4DPOQS=)U>K}Q1&NNFAw;xxAlo!Mgs^yS- z0-ajl{qnFrT$OKFf7ZSeW@tutWPYOf?lvS$v~6hlJ1GE^jGrfDtu(=i{)9{s_F;{p z%Y|tGGpM(TgeH=@k2FXmOb*3PaDKLW(pi>+6FE&&=8ews^o)u6Z=w{t52LOEr#Et$ zZm>n4Bpk-L4Rz50JH~L)(Srj6-|6V12PE3Cn%MrI#Df4_Y#B(2c)pz6`WmpOovQ&m zdCqCb07X2qk%*PO+yIG-%K56A@8&9qKO6(4;**%h#5irn)JZHwi zl;NDY<=;kf0s0(ZpO@E2*uFsMGls@?{*h?V8@@MO#vPXGbADQ9Vok zR{XhP&z*6&tRV}bGie%?h{u36>zCTZ1DfNwL(7i)tt|J;3r|fZ{nI|vdYyoV)c$?{ z{o%kUeH}DohKjxlLr5XFDnM2up7UJFrBI}eRmH~>EHFQeB73>wW6Ja$@O|oh4x}eQ z#%Q8H&*cpTe==$mx<^4{=_*4`YN>lA4bGfeInMk4;8&h^!71RyYnce)x~JIj-*h@^jVdh{eQ$*-)&yNI016MtXi-=f7nhv;RFX2qEvQq zh7&}J1l4FWS}eW1Q+XGJk(X6kx^Rq9&d%fDqRO`T?ccWXfO-7orJh&VY-T60gUpkn z)z_gTh*eQB^rp)++W9@Vl}G;V=fxKeok*qd3;Xz-j#H;bZlJdRakZZ4uwblwE*-b=HBI|cUuEYcZJlA%K~NXN$?<0$%f?TD}) zk6u+38b{-Ka$YJf9a5a#{#(M)m3Y#Px!;T;)FCBRQ**QiR1y*4 zY&?O@UFYCA7#%S&W*RQacWB@H`fu%t2u8hiU`6Jn!{XJ{np;MsM2p3d{v~tI{hDfd zOK5sAOuQx;PYH!q`2YfANKwXa^zhhT46_=~GO<$tDi#o&aIeh+Nc4P~P4tIK<3S{G zlj5G|Y#+X1&!4Tj-2B6~->L6={B8aTE1V~y5`Ir$sNoMaMu{Sutb|5`CxWJS&1zNZ zNU;K*x>PO3LAMs^)Ti0i+Th31!H|EUJk*H{@z5Ncf;kS7=#*$_e0Z(FNt>iTefc1W zq(K}tp?%LY?cM_dkN!2BcybrXT>r(d9Atb;@*tmMRo`V>i_rUS1gI$@p&s*i^sM_Y z*GKwV_8$x+8NReS5>D@%R7H&Tjb~nlFM`m#f5og&mFYmaN!RL4ME566KAd(dxZX&JoCjc>Vpt? zA60CVV2auc7>JDmn?e?IHxjV&!}OQ|-2oj_0K0z#4|aP_3iKek8Jb|5>yD`x>QwRM z!K_!}w2LbWuhC{jRe=s(IqY!b-_5x8T)NmMby0k2El_w9MzJ3)4)2(x%_=nD`ptfD zr!iSSygn6+nADr{q?#!0f>6^(2|0y~pX6;_b98>L%T1DP1ac`{PgSrq%?4)8mHEdP zf{p@D{JY&70k8T3nTOq+JSnvC?}~v-K)|p=Yf`8lQCdTxJ)u-SJ6$ndiiCQr-tTdW zbB-7+7#E$Q8U{t^Kw44h&o|g~8ChAE|9Uy6oFe8)XeT${Ps0Gl(EPCnWtq)kTIB)w z6dkbWpryYvT-j``t~p(s7&8glg~k3^{KoTicSr*)d~pKqZUg#x170{A&jQRl{m8X) z>bF#?Cc^W}V`nr`jm+E>B;?ASKe7)IkvfohHW>p^ESq<7oZ&R4<^WvCiYiz0=dXWx zaqrhD+NRuQ>dA?tCwrWFHmdhdPh(0MEPVJ$f7;a}mQ{F8NB690XwsP1e6~=RijPsd z*q4U-CYn--YeKO@AuWktn;Tmq{PljH=QDNVZ#cNxN7@o4x=6^e6YUseWyK-<@WFc{ z^sH9F`~Gvb7UjKz{qjeIa*brw6mfU8(NgsGkFgB+!oNZewtOEVYO}9zpxgewpQNbb z<0ll$dTAZ%ky2eL#Fh1zp87-a7}sk86n#23h#Sj-dL4Dr;`9|>xG3=l7W zOq#`!i;%9zax|h}_Z+@6^qJ^t?GGw^y>=DJM^pMEjiIj`g@QzqsnO}DJ5=N#~H`yw<#ky^dt;N|K0 zC2_|!bL-_4jz|*r6v;d!L+!_!i6t3QJ?Qh;Qvde%#i}YV2QMCVC7F4KO&V}d_u28A z@)MxUtXS_()5{W1&fw$=T5yb|L`l_Ec1vw+TxNbZ&G3NGTjo=6jKbR}v6dZ(aa7Ds zewSbh3c-dSvZ+JUU($Lra4lLYzk_W90T%ASh%?_fPdqGi^c(@BpH!9LA?1uIHn$-x z|M4f{gfVeU-Z@C&DdXembYl9l?a<+8Lv4t`k{hsc(S+(yk$u4|-v8ucUQf_r>3#d@ z@(qu@xGruEKTLr%s?}q@?O}sPsUA>6`xcS*u3Rd|Dt~kNUUi`=ym|BejjV*I#`9?! zM97J943|IXhTT)1n8tI1d`5yuc^)LmLtvnSm8k#>uH`r!QpEK`_xvafpCe(~gX zMiE7hGiz)jz93!6lCuuuyZ7vj-TW8IVOL?Aa7*4^WIpHeZN-O_lDT5%~P%+rz(Tx>cYI1*hcrxB2{>;t)c8M{RL zLYm$#t~IJ2O1U1vK1C;Tcw^0vH}fGpL?oB@Z^f`^(7+nm2G<)=+PKxvMfTSJMAkz= zzX{n9uV3vn0@#+jUXC)!&^C&AlYDa^`>(o0yauGPD8K!cn2bAjC#k2XNFNK`m62U3 zI;)d^p>n$NTe87OcZ+GrS;?dv_ifMtyOG64w zCh75h9O!@4-5h)?veHJVAWv=^)P!p2}>52eE3$%q;;^C+V>@y1WTl1D>|T>(xEkBQXYH5 zKw5W>tD=9Fq)&%-8Y3AGI8YK<7J1$(S=6wn)9mM%vNCz2_NOd>HV~zjF;c8!W|y)O z-cwi-G^Uk${zXP|{Xuv{(7kmo#I6xCO_DUBQC$QP)C7xUIEIrL{nRyEjE_~@1XF&c%BzIB>k?Vs z2eTUc_A#Y9ceWNW$fK>mnOQ3Ip)3telI9B6;afS9BuXkSgEO@6D!brM9f+lSRR8z~ zAiC1RL0JLB4Dz29cyWj&xT1!Tl9`oGYf1=49n|M^`w+71aa-=7jTu#f>ZaqKRBNvw733r(LPBSNy!5h zl?0e#u)CQOYR9@okl&} zs6FSw>HUDa@ohe8^y~-QVDxf9*Hx20#~vzN*4!YZbJFM${q+A-syG~@xYBsqa8t`^ z`OV*hGE-55u7t2by+o~TT|zy#)K*?aab0XK#qJBwFZFuBe5IQfPfah<_7K1Gm1sgSLF0}nyPwG>6+Z$`Sh=9j6$B_*Zsys#AqpdqZ&OWqtCPerCP9(C<9|`q zihQ`zgQx~9K>~^lx6~L>zg%Kq43ZV*A8nwfbsNXW#K6W;#L>e=dU+1uW3my(ilLca zfl#BE7)HMK@-wf$ZqFJ%Zbm50*hE>D|?2IQ>DPMr967Tep>ZY3VvW%NWG zRR^$a4P0*Cqp+h(Lbv?;!Q(ZM5P~HVGM%z4>0i;4qKdJj6(nshFkT47YWIk#?= z32ztTKItD3S#jI!x?5SB-G~8)|&d0LO4ZQ50^O99mt$|lA1U@Hhr#wNitrAHU|Btp5MpTTXCZ( zU}+0IcYP*U!_Uv}$~=hBjsl-8v3RC4nL15}FTDqA0l8e6l9+U*&Kd{7O;kEVw|q9k zfZ4hX3hWjyEvX_?TY5cAl&piZEYd<)G=!xXFS)wDGGB@?{`R%_sA#CJUD%XU*BiP> zDr!{@gs`YggQMp7O`LViY{XHRQ5%kFy*ZVai#u;dVzTQNKOzi>%r5I;9gonyozFGs zoT0MY;Qm0w@$~*5>0-(S*n)$^#o1j9N;k5r4wTpq7Yvcbx>zQ#%R=P-xTIl9PJTWk zij^`w7ESy_xL$K;joC-Axc@-J&KuQgQft2sx71>d{& zc?w$Aq-?f^@P1pHp0QX*9$u{08A%9&_b#<<6Iec!eEM(a<&>Ts+(qh9fW07zD*TtB3+S6!I+>INnDRn zk!S1|GT*lr9sECK_2#6ckrAa(p~%~q?u!9HyDyF;m>vwKjseu)@))0+R%WlXi|qrN zRgbo(8~ylzugsOX!V;7Jrjqc9oDLGr&Z%J+nAKKg*X==mj9i0L$%3}k^jQn<3I5? zGt0o)-<$rFdB>(Tt%#|q-M`JHuuu;lQnT-}LOGDhlhCh8k znUxAJyXNd*;Hl?(@<9k2-DT4l5PI3U_U zj>cckt6-%L3|;MuakM2PlD5j2l7R&Zn03+CfmcU5Gi@zi-6npY-SXDir2dFgQGNHC z_jbS4Z{W2Zt5OQ5N#lg>BdOaAr+^o{Wpw^i5mXSzTK*u>ufzAxV zMF7oPLhLavLd>(dS(OhAs*#w?zvhqN;)x)Lt^J|x49=+4t6H?bId&J=y&@2KT-pM-UHc?9?{F3c(mLyw#2=$BVw($n=nPr5SSdUycDCZ%!ZR0UeV z&KzOZh0bcMszqay7S5?W=sfDSQvEs6JUV8@fev{2bZcv>aPb5CWnZ1?x|jwxV1-}< zbrd9Bu=4=^GTbxb1lh54-fy0dyV5|5-_vo_-0V6@1r~ko>^@ufGux0}2bS;~nulf; zJV$5Y0ifxx+k-T}oT<|{)ZJajPJ)59!6`*FsjdSDh1Gc>ms>TiI7w0*yOCOUte?zJ zikN1DChlJMs0T-Lp8M>lB(~DT~Bv$%!@x%P zI|&OX?><)^s{pWRLNMAwWhMPBw;|O@L7l*$BYEnoq^8fR|1(vw6-uRW2Q`rur~&{< z{*ak7b(P4#|Hrj+P^=6>$GJU&y4G8DvYs2JgnGo96kF+@hXCVNmZcn^~bRY@yGOVq4JKog${&im6D5=y_FKRys}?LGO9TW_QiR#QcPDIb;-Upn34znPXNE#8^3?LQueyq6`BW@sv=B_ zc9LFG2v#?_xv`<&CMp>ZbTW@BmV^fO-f7Up4)dK8qxVyMQ(i`#y=qND9UlK&VoO*G zD=4vrmf;LvN0dck3Eyv1m2M{TRvD`jqg1je@d*f7)aqd^hp9q=25`ld>O}|Z7OmsH z9&C$2FdI3*PzDn>b#&|knlaG)qF!^SWg)2w1^l><7u%3n;fFB6aUEenl_Z?4ixgoA zje>a+Oza~GHNx+r&*cmEEE<18_y?X#OL2XiRUH@bG~9-Pm*qCJCD)d}vI_8ux6{O+ zN_tVlF#Z0$+(1|ShimDy6^hlvn>hO9m|P$CiG2({BmUC;Lh~FlhfZYIR$M_;0!{4w z!lvW>qx~sG(k9F`RNFsAl^$CaJ7JtQs>rORy1lM>XLIxGm+z;I2t2K*M{elDvIDj6 z3wso&Zdgd@{`u|6&m9RE`QPHLws{Y_*XEWi!Hq>H51l5&3h(~=7YsOQmnuyfQsR`Q zJ*k}Ni)Q!nTh!D^(C!*&VYkk(~F2xk_l0)x@KJ!WL;G=IDmfES~xglf9g*Z5T&#JNh+`k45 z*_ef%t>5E~vn|2&NgO}B{jzDrE%PZ+JrhtC! zT%bnfF=73b{KjfhW;W|RiuJU{TXr>Hl>?67uGDV_e#$FKp{fpG&zM|ow-M#cla?q* z=L7Sv1XK=zQzZ4Otn+~{+yACU;uv2st8in)fn5qoeqk`m_05i_3?#0*SQF7MsbI0i z4f|2ZO;cS%Gezj|%bJ6DVR4w*21ye+W9?kdRTT9oeyp^hpLf@VO0_|yCty(pt~TiC z&1cQw)``}A@1!8qB*%HT2|m(H??crNybpN%2AHOm=M<6b*1EoQcr3`}8e@K1x`xnl zsE2|jXUF3y&2X!L|8rTki<{FQbN+lLxkL`Yn>@AP?B*s(EWMr2-f?7JzH64ph4KBt zGDz+HNyUQ8`1m;Aap91VfC!bMIsi=f8esKxhplgK2Lta%CqKVYU;gA3&1Fceb2;~n zo9rHGGfSVfyH6;0{5Bk51lC1cX<<6N0ruElF_Bc7)2fN^`Km1AB3ZCcS&c5tvY4Ei z3StkQ)E}_-WFU#%4nZf97w*Q zqQhBJr_cEHBX6CXI3ZCKM237#EV0KR!{{6c6#`(-C=tJFtAzmnp&!9No3`w1%^hEkshpVF!hdJpi;JoAsy)+7W?AON zAUR9L=G%UqL=jlW=GlpoWr(i4!H zkRk^#F1$TfqAUf^FXKzp%8s}h5=o4E>)<0|N!^d4jblho<6epd7MWfP-%1!{XKoDp z)8}a#dFP)Vv^%#CfDIi05|ZpCdpV~Qe!SyL-m}8)4;l4VT%NIO5J<$ZuRz}oS+t{N zT7hkvc#ZoC?^%hw@&O$*5>7xCVn5@^HWh`g20YvG{Gi`bxpTRRX>0ceQFB2?1EDMl z+u4bD%U;3|no|7@3<}#y1S>jb0ycH`R+9d1_F$o*5d(y9#-cT$usIzJS&I`ID7|9& zIye@-waC;fAok=>MnC8SL=9WAK$bE|n&zepeK9}iuQdIVQqH0i2!q%Pr-wTX8Mi!N|GJ`4fXV26@) zICLLUXef-u_cj+W?Bf?sPb>woBiYj}sn3TO>BNr4QIo&;r(W3Dvek%6hWKUxalbyG z#jNz}rC@QHJ{rR0#ZB1n$}0mQFQr8DzpV2d-LvsBt=~a%Vfi7n6TMW+s_6izzx43% zFaz*ezK|r3k9p|`Rr`9bkIq-6WHN&T+$D*7_7!IbAQl`Zf|%l=QVJgow-)TtF8#Q@ z!yIpi)U|O8p%e7I4xL+`;9zF2Gc@(?aup&);%l~|ke1S5Zdrr>ZIL#U*42vx zy7BwFMVth|jjdQCHiEsU^KSI-zJ0(I!bIle?L}c$2sTaJE7;&ufJjhVt=6vC4{~%Z zoTB?Ql%XD7LxDtid&kyjE3kW5b-vzK<2OMEChk#p`Dvc0esxM)o4{d3O`5sBFEm1n zj6bUwZ~B9NhZ}eX)E`sP=4TYSP@t7i#W3k+nTqJ}Sjj4wSFrsUhA_zv)_$A{-f<4E zD3g0jPbHsGAn`-VGAh@0S@ffl^{l2fiC-Md)npLrLFH9#7}pToJ%S%?`~0R>l>!&B za6pQ0`oJ`7oL#Ce*FqJD=mmdo&KNXjAWsKvnhT2`@TH%m%|65||MyFG!113O#yS$H zMY=h%ADsUIRnZRz0-4Y(VZT4t{9@d=L`0Uge7wU%5e?>P3StH>(mOyQOluu1t$oMhKr;dlp;Yh#%~D>Df*>_1Upg$x@AtDeI2xVTV$c zjY0sBuz#a;{s5=bvtl1smY|o?3i$L4>SYzFK{QMQ&W^tS zH;rd*^T)&^hyJTtI?x*JSqsoey!-n_9y36SHl_RqZ#G*+gp5D$@s*=XcyPq*A1aN! zm&$)zoa3NhSD&ajn)~T<>pTTXLFfqicSqZb=t;Z1$SH+EKy~72C_?zo z`#uG;{cER|b1AQRa7}~`d|>`KszH#|c;(&6ng8fPZy=X)`1B{b=~_B|-G}fWVmhc6 znz^4)exbLSpkrH%K0A-PcNW|5N90Kma8j3o(c_~BFBLS1<)&(*FJh11Ut52hTay1> zf~)jq2nmlT2EU#vK4+Fgzdz`k0A?n8nnF`s(|WD4ut}>(_3{azxBp#PbMbinJ$gbC z+75W^ney4xdG)pk*}1P*tgGG}JbW5O|9nxphGt8~zf`?0x zYzHg=EWmrK&U>23-V9Y-)mhZX6(uR2_^#%d+3t5}xdP3eoS9z{`6oPd*Zx4&xqFY(w~R zjvi3(Rc@(aXS+DDGt@aPR`hZ;2J;_-e`m>EtYb9>D?LcvDdL+Dwm^X-Z6e=Sek%gd zsBD)i@uZc&ox?%CY`=R9IxEgi9sZv!2P7^Z&A4ps*rXBnSG=fpGs!i(2@gvx>z7nC zaE2rnK(xKp2Fy0gQ0fTTsVHzb^_2f-b+Ktz9RNI_g^CPs7A)qzKzg2#0gje=%T($T zvz42}FkHW=*rGU{(A9*ik5TGcpss-HHmnQ%t#-JiR?|ps+NG>g{0mJap zAt0wj@}{U8Zl0^Y4Mj9_vOD;J;2`HK5@6o7?Dpl^s~r~sG87ljw`&*G22PCz&OV*n zm#%&8t#D@xXS_OQ6S7QJAs*I(p)1gak|w`^ZuibDAZ7T4C*icQT#kQUl|>soA5V+a zhv?2OuO6`}gV}3d@&*5qrIzF1+L4+=GnJg_^#PF1hE&o!bp{ z{Zt+B<`EGhiqUlIK)mNPWKxfc-fCAbgr*@4A)t-K#&QD@dqKiMttAEghu-L#v$^Vm$vn0U!p}jpcp@AwzBz1tFA-L_Dbz!ZLwFA72 zS5}08ykD4Ly0f$U5Fj&WXrCEx`t@%(BD&J!Y!7p&Yw20`s$vG=>S4)k`GUWwx{|75 zMKKx9PVp!yz&Qm^eVDH=@ajA0r3Z*1GnHGX&jKwCCW2XPhD-yO8ArTlC6Ukz>z?9l z-#@i<%HU&^j)42L?i%1#8`z(d2v0VJQHQStp^iuE(fI&shY_Oz?t*jZaIuwvP(Vln zVc;;^7-nBBk}7tszWwK6U$$_GE&Wqu|EC9>)}0tGrSphE=ShCe>a>VuJMF5mnd12@bUb)lCApzD-Rlds-NC2#mdbCi^#L|B@d z3kcC35mA%1t)52DUef5sSqk%9GBpk>G!(~VrSt2a1hfZ*bL(k8HE-Lp0C_xndaEnFmVK|5?>>?wU}yxdYmFv0xBePNaZuHK7*GHsD{ztCWusDZ1RCtov( z5NlKV6gz6sR8g&cp#oW919I|^pmE{nsDPK&wQwJzz=NGkfz7LxO zTa$?P*k!Yjoo*o~Y(Uy2LF=!y*I`Cq7s4yH65U(Pt*0d0v6~~hX(d^eB`;>bd>SX)J#0dpWNJr>ppa{0I+n%O?2GFAx#fAw@YUui3|d@r|t;6ouAjR=oXZi zX;f6y#MMbx*R-F2B3K9LeC2fu3a5nqey(4AB+vXb9zgu1h%E2&Ggj{u@-Mcvf0_9x z%!cEKTyw#0-Bit`F3g(hlg(Ova4j?hy%JvXx>XBy4uiEnM}`O|A1q}fZc$fffjAHk zy6x%Os;V8DtDCfX9S}LXi_5!)zo*8bt!5XW39m~{+tkTv-(5`DV^UJ)BSwy@87XqX z4#{I87~M@Y?7vI|oPCCT>+~Lcy!D7Ga%sVxOye(+qBf#`^7{h+?@RJrIF~%88H(`hV)D~T z=bcsEk~)sG`*P+4?5!v{iv84s$siB`tpRUT(|g^|${+s8k7Jk1>iab}sfklzd(igx zveY)bj<$i8$^5U%!F3`VnclUfPMfU!d@~w~UFpeLG|L*;k7 zfV}+>aTeg&+wI)D;aOmBh@XC+!x1l{KFzh!jMcVdS-bJTPstGitV=cxL%E><*ne=5 zUa!lfvlvXOo52KBg5_8g}?>B#Qf9F5huTOLx_YXwE zubU`E(?~oKze*#R9kQ8};(rSB3rnSKK29ZEJ z_M6z5Cjn2ll()_vNhQuCyIwA#Zm@+3Pr)bArYYRB92;A``E`S!{4NPnEUz>vy@``k z(tNYe!y8)K#OMNO{iv-gX@@Fbl5pg6!vXRD=FBg_O7T3`I@&Q)lQ&$>py4dZO@a68 z20(%L^gWWCKEzc5)5_e7wmiHv?!6Y>Lq8Wu=x^oll75fegIClnFfTlb`&`IC=f`QIEFV-&NWRRV|HB`Aiw*s3_HkB>*f z#bb<}C>mhHAlW2NXaT-NMx)pBkmW~&s3hnbA04?T>ucFNf;F!nj<#4I(WLwhyhIss zExOKLH*O959y0Jm9uuuI;zz7Dzfa|H;1?1A_r}w6_iOUed{wiLU;m+h|H&hb6p{ip z2Zk)=Kr4)GDxx(8W>@2>fH_=?-KUX>)f?zCHI^&!b?(YYRn4nGky%S;9)9-w5z613 zyn{mcQtg;Y@u{RkILOCCq6{js!l%pm&h3AjQ4DOhnP-6tYQn6xcI4S!HCgkhHc%6L ziIoO%gORW8J2x*sim<{bUdTTsb1BMV%7PtNbE81pM@0lIP!Mcig;-)v1<*OHN)l-~ zV1M0}pu9`?mtdCo^g{X zcPr1CQSK}(cmKBVd@r9MfGN=t5YHW2EvAu6orR5qHP+Ie-Ideij-h9QKsz6R4?S2U zFd97FJbegBUJK}7IblxLPWI(_$e44(P7m}=1fpwwzU*d=D^5)Ebqy3OGB?DUv!52V zkUPHQ{ThxaEtOTj_ZOIdz57vGT2l7Gma?epg*n-RnM5u2-cEn0C2q&+NG#Arez~q( zo9M8}#K}8ic1Wh66~bp4aCJWxPHjg%^%HDQO)(4Ko{d7(*-{w_|6>wq0sSqDPrEre z54Ri97wm}ARrOf`Un{^EM|>kt3R~AXUOZ_?1kmKOs>H+Rfei(+3fTJ95iMUA%RMsa z_JGN{)<77*N2yOUQ5a^hWhyj-JHPOV(8x*eOIYfY{){QO9+$@A-z!Or07E?YT9mAP zX?|xn;BM5ysKeXrs1kDPOakKG35*v9vd(<4fTz=*!Ll10C?G?BGZm zF4wIE#?e^=){S4wUIktsU#DN=WBqSRa?pc%KrnXv;gywliYshG{RW-Q7G9mX4Dts0 z@r4A!7?Bp(C~_(r@KM-HUuS26%!WbMtx_#ybcB<6U>W%}fv^n0-2$VbpO7h?Jz^U7+{b)cv(fw>mICGX@7Cj7=E(+}2?&)i zbKm#_(3m#Qi>R{>AK7_+t#s~2z!1YLVASyxf8tIi#r<|!+UsxS*6L~k4aRuD4S})m z1AAqKZiSYP8JIYB0gS8D%8sAESgvhXzj=8WAvpePC_>!Hyj>63&8~Li<`nn>{n;~) z0y6uUgBdvOK4-2>k&qMr@lku7a!DjjwhIu=(+Asn>aW^`j%sO8CcJ6*Tu#PFy#jNi z_`Q%)hURug5gp->I&>PAB^XoCzp?ne=J!b-b}wgVak71H-j;Fys_dlmQLG|!4oyrZ zt$b$7nD}Sp$(OWTx#cMsf;Tte=I$A9F3yCID~hWztqX7)Y>1@Qq2;YWXvm^=Nyeb* z8-2vP#J$@=<1s&%Uygml9&rv8PL#eYElTZA+q$DYW}l21Rw$={onPf_)c zYsVKDxQnsZy%h(g;+9%;PbXPZ#{NVM$HsaI^V~U~helC-k_XkD+9W~G=F*kgyb!>f zsPXw~Fs{v*iPo%rz;~706NqU=?bE}JR3B<70LkTnpbUcYd?G>sDdB2Vd+q9Bhj9+L zrv-h+dV6Wy0B!-~fvMcs#?K0gk-O+KFclQ`$+QI8*me_ zBXY0&itc-VWE_YA*ln;ERC}skZ#;Z2?~}_NPVc7IUVo5v_zxZ>e_N=E%~1>gG|%yE zqz@9RfkWbU^0RiLmZwf-=Y2dVDaH0{d`quvQ{qllgMGIe6Nt!{ti5uwl*uxxysh>p6U8_w)gUI0UuTdsf9EO3GNl&H)lGtPS zR&wSkiTJKZXv@J)B;hQmx$eBD2IrnMjcL?k^6N1&m;(wt#Jv+p|ko{vEu| zyF$mT<(LzP{*x7wfS3Mncc+iqfO3%*y2F5NKV@&%C~(t?q2(i`D`t)gNF=C;di^^) zH2u&2t-Uis6X4x6!y#4~oP@EU2sO0r(U6uBSr~SD4-lSaVPOTyvvV1){r%Jr1xORb zy-dmSJgv+Y%s94tghQ|%ABpq|Za4LsmDBFFW!2gL%6_GYu=xkTg`E7t#6cT$wByne zHArhmIttWoqu$JX&K#9tpcv^*YFBZaKaU>3LzZi7I9g{ORd(}_rSitRnze8v8a51S z*iwm#TkxWxVdNG)3?}nw+2(s}sNABCe3m7sc<~#Zp_MOQ32 zf*NH7f*eAM%uk*OCRsj_*7fbUUr08Fzai20I zHm{_B!9y1sN6U`h2pB|1N3Xdx4b>B8zw>eF0J6A=5+s$p!aq6_h|a9@9nII;9nN6*N3z%C1N*OJ10X- z=Mo9MnV&!}nwfPhl}4o@W86U;8l`A#OkZ<dB0&;H{zATTt^^_%F{!vNgr z&X-MaWVtms`T#G2p)GhN=j}dc$CAH*m7jgjH5bc-%t^Ca(hE3I|r% z=gVs^P*{0WNBa(Xz?1aL>DsGMl~FtNiOZHRQ}KR(krRrJ{&eTvZ=LAk<;5pa|5#ZF z#%&9@jRA62iwCJPbj9kh$*{A|SHLVi5Q)c{GJ@;-c;eC4>J`fqa^fzXR``y1|GG@u zuF=;2`KZ&9Ki+BOt4qPxSbQ5sFfqD>y*Mu2lxT>`@|G&OgrPp_nHqEu?A$5f2qymQ zWjTHSC2ike*t;D7hPi-A7tY+_a;WqUF3d-EcHsL6f&FNqtAUmB_-o-pV4+1)!ZLCb z|A-HDn#8`8eO%VRJ_?dIASZ12W>subqg-1gq!Jw7$k3L91$&f+vcRp%To!>eJ!>n7 zEsk?zMt&(n9>|h|l#?_%Rmp18RUQ)nyK|&E0y@b3J&wrhC0?874dv%)=6tSV{zQqP zI68uz+?ez@*9av1`y$hOnA{P;uyPSjdu$o*h8;9P@m50xU*l z*;hNP9R-zgm1`aSJ|Q62v$i_p3Y7P?MuyBuwy*UONSb=nEw*BkOj~gCTPP$Vsb}7j zze2=CbGVh*sTFR?=_cg`V5&m^N~UL;ZttCvnv8C45OR|JwD6L2FG-VCyCoC zaS*j^sf;{vB$E@Dw>i?kE5jPS;no~C<@Va{4Z8|do`v7zh-@hh@wXC2Pwq0NJU^B( z;H}cBod+nU`x|eI;)I!-8e7q5lj5xAj}~`Sc*w}9g#h@^h2uw-dX95D5A1%kxUWA| z-cD=xPuc9}(Bj8R{pZ1&4|vvox(aw{eA?VIzC1n*oL-dJ_l>8J#TsKB57ykip=Trr$4%(*~|g=l^*cndVlCLWoYGBgAkI5!d>w#8Ln+pAllhqd$;A zGa_dhNpH9((-K^V75lij2rOBZWi~$+ew!h^&7RUfDA z;Rd%D$0}JlbyO)u$x5)@SI*9?6lVVHI38OSuzq?Y6#5LUbTPLXGwt|YPf{F-wbUSP zhQDVvC6lmCz$5z`f2t_Yo`{mjgvuu12A$|I&$M%yQ-qI#BsP#$q?c{u z%wX-fg9r`-VmF#(A~kX3e^Qd5-vc(0B#>mA@_j#qd{l2MHhiE`DozAvAfSn*ym4In zUV((zkUjgweQ38~`$n@D7}M{nUWZW?r!TLJUul~L2rrrX_ng`Osj+b#-w;(+t*w`+ zro4g1t0qQMru{0k7x+rY>0gFQ;%6bZZx`qa3cGrIH;Fo)OXS%KgX7>pMtKb&(?EWZZR@eeCxHM=f)6VTjj^W5F^-7lU``Fi@wTmtED$nann#YqgGpFBnfS90U z5LTIAV#_k79J->mqG5`4OS1eNlgt|M24U+ycvi0oU<~T4W`90*f$Q2`a)d*O*mQ5* z`40~02u35^20$=M#h74y?v1PDx8#b`zojb0pc#3;7!F~SN|=CAu~&5)=vd9#ftl9o zMq0MohFa`db8S970YPSjfiW{Vqy=F~4a}dCavS?$n>v>T`ya$QYWSJ#X4Vlgmw_VF zG0;e$#4vpkt|}NrlWxaPVCa-ihC5{zc&s)tjTh)XIfpI ze>Q~rKGd@6j_eYnOLsi(3N)lM)6oINmx2`X&WEK0pT74=eYf%e!b=W8uSUB$NlCu z;Fkbj!Hvn!@Pdm|ohwFpD*J2`$QqJrsaw^8AOb2C7WPFM!~yO_u;rQ}Tx{JK(J+S}4`> z33L)fR_dEuMc~VX;5N-wXDAOTf?&u0U(nf%%zloVbsl^k^|^T@c{~ZZaHTYhQX&_& zKYEvM@?TK4X6}4ed+q$@M8N+(()j#7IU7MCGKq`eE`>X&N$tVp3nY@K-Nw!x?al|9*F)py zJz$p_?k2Kur>OHWrr!*SFhv1BT8e|ejHXuy+H7>Z-AC9m7WSn*nI!f5xH$SLTA@W{ zp(5E-|HOyu)$5{@?nmM!uf!UPspW|SEz9_^jf_5@R3{|QbkXV;MBO-^QjlDq?ih%O zGkqjQNzjmS3wS`t)<*T(0gOboPi`c`qfqU&w$18ASjxCW|Dn*5jwKzP!Wgcr+$5z) z2yUkBeE9oa9pb{b;ilMeJ5(=+^8v%If;;I|uRSX#LX|g6uoCJV9`3WMs^&$eMY7lh z(8lp*U|F%U%vNG4Xn}R!?vzxe0wv>n@V$8-@PYX1v7H|9gpz(8qAc>7ap5X8T~~gZ zJfk>l*`Di?1&)^~n)DnxJ`MzgaH#}>))P{DrqLQ?FN?G>`3DyWA#N>vv9j3!z;+kK zlmx9zd4)HxYS^}@xx5^}KX#|^uC?#HUadU=6d$V_ZOm~<4^reHaiL(qU1&gmz)Qfr z$kpEKJ-TZ>)p*~&%wJ2ll{|$|MXu;+9gE(3v*?KdF~oe^pWhf@1n=awm4&9oJ!3ee z-P+;kK41IbWjQ+heN(EsJ87S4K_A&0HE0)wB=>_lhF$7?#qBLRh*dtmg#l>KbEATq zn5umT zKrZcs13tPTmh@Yb_&*Esh+`0BjY}AH-~3dW7B(BxiDZvBu~f{qr-RobVsQCEBdI!a za6oUhhxc@>-AOAe&E?kp=<&_#^^_#^`3D%o-Yd`*7GzS{Y{HL`p*OrQkO7vUiYIM);LpvYe0m3C<0HWHZ+r*cx&EUfDCH+y@Vq||8 z`nqw}?C&=U8h@KBiz|@nqM)oKLx+_C9V$6kqCg{BQ$YZuFjy03T4`$%-wN=Qq4wtH zmB9OM>6>)n_CtWE+v2w_diOHs$Lp;5wKns_-2xt|W~G0{M!T(%ix~hS`rOe4_#Zi2 ztkeRkZLssZe^g%O$yPER7FqJAU;VpBVaXPxAyWqCq6{WnJ1z95^A+B|Yk$?S;qB*t z{!|W)#@Sj7?v+&HxUTy=InyMSs~LJFy;RxDh!EesjWgbnQr*Vr^|;jtT==7%09b5j za5GU2=Xf^ltmB^ZwfFTz#0>BN?RCCD04*b4V#0o&}~$Z`{1OHl8nqnR=G`9jJ8j z@(1z~DW*0vu(~5geq~+-AtA0`4swpMvanO^-)tUcbiSmo4fssD^{5KUOtDmD0sn%= zS10oU8z#-B?W-Ijd?rqm&?|rjN270}dhxHpk{CF*n>vUHyiAXIY-BOh!9^|wsRg|2 zB$~{k@X6ZRK-`h+dOdkPKLd~oK_@Hd@?)T1njh_ts^ggq z{ZvA7C3b&_NvrUpYPB6<$THAw#TSA`ky9p5B| zQVl->2R(^6WJ4-LS;@=!I?zhlI47xqwqI4u+*E22e?F{%4~Ef4e`qFa2raOQnx)iD zkLeTqyXxfQ!ASD+ulzBO?Z1~da#+1c>jbfMg0FX+Spk>y_Y%i#UTG$I!M%$=gAIAO zk4E(jd??=bQ4?Za`-h~=ibUPndi+hgjM(v@n;@W%;p$R%(5O zcD7_9d-SL>ly&eOLgVl)5dX~%zu;Y$4NlK1GJTd}0h<Z z&Bd%p7ndzawvka_1TcRTsC~_CN}{Pp_?>KY88ObE+io1eAH;(}gb$PNJ&|*4{zuVS zutn9bVN^jyq$H$6X+A)@hmh{>Qo6gl85lZ5x`yr?8l+2Fa_H_Mr0eYS54bM&?ESva zbKh(A_07P@5)_)-+r1w--u38I6PAp~VnTTnqFc*0BLW-yv%flRw>_n_etp}fL*C;l z0!&I>Vvqz`2+GSoX^MaU`RTP+su>mV^s;3u_MofgH6#Sib$9$n(6_lA{c;xIHa-z> z$JqIB&G`HXUc1~Kvza@hxwE7$8J2DhJWwwanYz}iV-gE1Zh7oYP zMX_jqqi?8xzImr6^z!J^TJ>f0;-hOkK#|FqO&|Vc^ktXd)^zv+{VlLT0!AQuI{9v~ zo7#~1TqdU&%ONV8NGU!yW^et3_p-7h=JmKOMK{#kk~6hy!<4M-DWjuk7g3oClu*j| zwtJJ`WERXKR8%M3?S4lOMAI_hR@N#oUV=yIet}-Li5BU5wdH0S@ie;q19Exs8{8Ds zc#^}4OMowByJn@C;!XFBMa>Tgu8d5w&!huC26xPG5zv%jSoCBHzB`nLb6sqREC`Jp zFYw^h?deXq`c&0UI?|Tjazkfv^}e=#fC2hHfVP z_*=ZZH(RKj@Op30^_msHTLykIOz~NaIPe^>1(G;9F3Si8xgZuLT9adswP|&uhnBT^ zxV?=0ANsMWq0wi6Vb7K&e|tC)u(7cbH0P%77KWN(jXN!r-rBPe!IU-qN{dBk1pfg02mhC7*fHGN{Qh^uAu`;zv; zc@vby|8q1n1nu#!KHic6T$GmtU(l}S!lXJ%3f4_U%1!gQQ4CFtnj{o8A*S}fd>cJj zn_!h#LsBP|B4trMLqZG?D;jif>YsXB7+mZonDdP_NOtkZ7RK^s?(5Te+9heuhgUAD z>y48=_hX&hl!Bnv*xsoR7Qa21b`#N3;+#{k57F0L%7LAMn1O4^E|oNKlS&aAUZ6zEp~xr<4RH?=oGq%X*V@NSCU*ST~H&lhQZdd zxw2vEZ!8fx_V5xsaeVIV*fe=5^{^70_oG8~|Isx3_GmCrNG~weQJli7i_pmK{dRuR z6kz03xBhQ4anZKhmK%*@kKAW5>_cln2Uquna)7xB%fp_(H z!NaCKz|qGk6B5&UWEzlE^jeeVqOr`LP@%~8t{xRIBkrxeOmyu5ukue?dlm&i8eM!0 z+OYd{g<+>05lD05)ji*$~_Makv@wBN; zx`?iacqbu?Q*$BZWdcbs+Vj% z{$QcVTMsAJy#H)$P4@>M7gX256iWlWOYOb>?avt5te`XM`7P>m2SKw<{KC0zrrwA( zzE*LjV4Eo?S<<_=fvWk7m1T)f=Dq$MW?hTZ>KKisC>;fva;kT(F&0|n3rsx7Yg`|m zz4x+|DGffBk=(8GU@<-$U3n}}?`o4Xj3m-W4%KD0R@KgZq{Ai#-kq*Sm~-lGpOq_l z@jjK0h2MGh_;Q=D6JygbaLbBVMMuiyCqso~2_}I-DUhPyYn}sqxFnusF_sy<%B#9Y zpGjGS#@pZAitT#=*uV1@FzFV}d^1lo_vnLUvcTiKr!3#G=zUi#7!lG1B0wW8UR2E!h)tmE8r{W7{f!@=?;&1gd{g$CGx zseg4;vpyKlmu9V$b>X$Wqj&)ags`z`5h!_HZ&GCo1q|5wi>Am~haB;@etc&5Y55k$(1_ts2=bA9_?X#EVwuDha! z=IdCsb%1edYwY{+?fVfG<0k4Vc@)|@N(jvxnAK7seY}Jr-e6GERM?|10V{GYR2k1I zjbXO{2hH98wXcg8^Tx`%Ld z41VL<3AksXK_usgvo<>aC5J8hJB3a`I2EK5qd^mV_=84@kuK3iRQb~Oi&b_snq=S$ zvJ+VT5pg2#HygqU+U4rg2s?41?6ZIUgP@0P+-oofxQ<$`$d$Z8fqq1AHOg6P`GveOT6yASe6&U+Qc5+zSW} z?H>=^$S`MV99b*_L_5F{uM<2b+M}{ZAduB&9qDCZ@Re6V35tpvKE~gV06Qe_Z|ZTu zIp_jegQ9DF5cF;HaeNzVAUeZ8#62x zL_`I7MYA1X-T9=;D9b$I0bf49J|W2;N~A@#ptHD0(Z=vFb6xXR{?mlm2pS^(2> z(*{&0JEIhy09P8Hj_%JM+PLBbkkQ%{i85OzlyINK9Sj2huPGFoR02&(1_tk}FbdE~Zj_IgLT-xzWar`gL%7 zh7V%6<{g93_(@4hGFTY+{hhr2Sy@SCFW*$ z_?bpxc8Bqk*4Rbe5U=qWGdh8u@@tgFEaAi?762{EIC^)b&7&cxG)73Kws;z@Q zcAWC3w{8GsQ(usgyFcG=d(!NpGWsa|d2Z4;0T7v&XXIpdMq87m9f02K+Bm)-TD8Gr zvjQ1q@)*abx{*c+>PDe6z}SlG(S-c2foI-Vem40}kwx?%>i2*vi_Yi6i7)ozKYSR9oj zY}6)H)AGwR?{FcvLS43w@uMDN_g`p_u@+ctk&x=8%I=+=BOI2NN4_3+&4~Cf;>j@)Rt3Jg=|pHB55- z)F1sZY%nBLR5d?o7=$S*3=b?vyio!RXSl5V=9r`3jNfzPB}XnO+`8Y5rH%zU!bZs! z&S@xo={MPR^pUZeDdu9-iS)jk+L=zf-DlTNalV&hIm30CQ~zH%(!j6M_b57kuxFj` zUNHiJ+_BCDs5hug^Y!Qg8@U`wfRoesh9f|nsMQxbdwvoC?z^cIyW4lEpoz5TL9zD4 zDAFZsfUbHw2<%WEFA{-Q*Qt5Gxt6mxd#|;0eJbbZqAiR`%cd$@U!{rpXe^vsrnw^^ z{`11`xyIMzKNr;H8FiD)_!uC)Msxu==FQ`PdQAcT0hy014+ygT{g(Kys@gk5_uE@& zGzPyR!Ll&9gi1syWvt1rOJ2GTnR%GdZGAtK9>oa`OI3u8xf!T<;F}Sqpc2w}Hx8%T zCUc|%2Y4bZ1m4cWhqbrgI^K~DqgPcix)Sn_UNQo)HX1;%v*oW;E4-;IWsQ?Oqdpi8 zvn>TKO-?Hl$ZbZq)f!zG1R@?OW`79Oie}hkY{l?XUx|&lapj_xm-T3nlQF2~Ou3WE z5Jz#?b|K%JF1(K}I_=Xx&641HuS+c@028#1Iq^JDm=GK#^fkG;W>j z8MF$O9Ny2fyQd|#!_zQOcF_G=j^xWI2Qs10dR5t7yIRFMz+opv?eu4CMUVS|W@{># zTBf_aJCcWJY*N>Wsfl-uby(6gt-u1*bstf@H<6~G$U0EBQtc!Qyb0TSgNlw85c5FC z&fUV%Acj3VYLtUEiD5|_Vi4xQX;4sd!(4Vi^y)uQG;ti7NJ5HjGHZ6s8#%(>M^}go zghzOpRXEN0+Er3WiD+Vw)Z-HzOtvIjlKvsD+)V>TTcIn^uA!#wdJkgNS$fh;xr6rD&z)F zLPjG}WDUi3s}=;gH(E#vjqx&(*|b#F&^AHI3z(T}XzgvNqd#&=o*PjF(yFkwEY}K| zi=<|ngOcF%&ygr3b$I$nP1dd4pEWzqQbWv}>;Tv=zNJm+h;yLutQqt02ksPVa3ff5 z%=Rl9jA?X;BkhtLOUmE(2?F1iROi1-y|Nzj%mfO+G8}9Y01g0K2gqk&bUmFol;{lt zVoF;qeS<$L1DoxXimE{6OA@CTFj$q98Mo-;E_$XOT!RbPn7y*kAN$u>v&LoWN!yD- zB%gX+883LH{oV3Bt*Y`o+b5!hyk%avQJ>ZPZsRy$pWS>sj9DfT z+D`*V(Uo*ViJrQU*Wl(YuNY(`1uk&G%3+Gog9UpQ<^>b-7 znmS^*H5zs3Y*rXISxM(-ZY>f)LFR7t-SBq^DoToxNyp=pK~}~7}r8`f~7VS!4bG(!VTR`r9FwE>!cqK zhEdvU}ZX$ z9t%dl-+GBMDDZ@eD4T}<{7B3dZaBl8pF^`&zJ1ur&7=uF;~LG$s?o+H4AapmWDIqwmRZ?D_=PQgtcaO!78x$|N z&)3y2?4Qj9vB-srj>vel5DWJI-FIT0Y{&kpUS&l`mSEewy-lsZbOAms43J>p0;f2^ zGE}cm&iW)W&uN@YAH+DJGhx4*f8$4L6e*xa&nD7xEbbGO{jDr_3_MNjq$242!#C&i%$M>!+vTu*xZ? zzNyF5b5Ge6Q~GMhER)~C_9`mteFF)me>*TV#CyW%A(;oJqA4_ewVWVz4GB`KbDb24 zh})I=(z)YwGEJ{KY2%T($Xz`TjH8(CyLzUiNHH7kpIgt@5IPE9kwj`%-ZJYD!R!s} zuYqWbcl{^9vn!CnIEwR&420*yA;uD_yP60U@_;y=*|;ZXekr5X)ce*1H_Cmixs9sT zvnxQ|ab6$C=0z*7QMnJtFC^9VnS;NL(oh0gOjbd$xl5G?K1#+Hxnh{;Fgj*aFApCV zg%mlc%e+VXtOLN4D4BU57H6yfRE%%bOSopB&c6kq0uglRH3$G?|#f} zJww-9;61}cP%OTi{iHn*A6d9BRuI+E@HOS&q zLa|KM4tUpCK6XwH8vN^#P(O9v4=5$KzMnpn&%P!obqhrZxGRuh_J$4({q)M&el%PP zeCkRYnshT*r!S~OK4`m{x4{}1LOOZA&dxXjOwSmN5=1+euFVFFcx!%_mB;Qy97Quk zH#c&LeetG%&I|w89RqIAOYps8JLhRMpgSO?c-hb(&o>I_s9Al}&{$qxp5(kRp_?gX zC1p>*1Z=2bb-}UrHNYSrTS~HrR+fUCsm*Sz%|lDS!%t3SXm#hj7o15-cHTQ7wB=sA ze!rW}Q@yIJ(MU}hbt}Sl^pFi5PF{OBi1T{f{xYXaF6=#oqC}ox&NhcRE&G+ZxcAFT zM^ngw2#@N}ZDt_@Ef4)xjkQQIHa|XN+8k1RY=fyNDBS8I^5b zo0gVVk_u6snLUhTnv^`}Zl*Rtgi!ik(h|I-`GK``X!HeBdG!3FZIPm;qw^N&dEtJWOd zpGDr=8BO7mgup^--Y*5gdFJJ#usfUD@9*EjPNr%t7wby#$(?36FSy8oc*Y*n9HYGh zq6AJGaWUB-u-bVK5Fba+`)OwGND=QcPll%nwGbt(y6k5O<|Xf1VJ7U(oUKv<07YPl zu$vGQ(}CH}VCL_qx$6ZlDZX@^141)#6hsI<8t~A9kV9-r+~x9zu!+KCOvpiA(Na_D z7)f{0FuO&jwRPgD09Rf@!O3f8gEbrph`;4zf(eN1tuK^PPBxl>FdV2E#acI+H7+}I z3hn~o(JSX(*jkO$xfOF=5GQIBep^>8T_j$}>gw_&%uhNJV}sZdE3)KXbJLaj< zVa;G8^B7}Wmg4P8B@Um$Fv1FZXySL^g=nmrCYilxNl3Zi{zPw3&`}n3LBYV`)AngQ zX(+!c`wD-+d(IYw!Y#kF`-o2XWWkSM!Aisq$94m{+8jUSiDPFkin=91qT7Q*nC9l@ z0+_xXcT^8&nP|2OQ-)~+X)y0nIUgx(yK z#h$JBP3FnFv0Uft{6hCT`6BAi9vRFUG^vB_L&KLyWD@!vK7&nbzERVVsgm{MD06q)Y&_2YAK%Mn*F6g#pMX*Q>e=av0N}mi z6%g%U!ZZ5`T-eZ@)Z z%Pk@?x}6v|gL<7RC(TJn{ctpN24IF`7`D}*yZmT-J&*V@@htLhUJ}}&9ijfF9*QbP zC-M*Ac65}#it=D!?e7Z*+RHQCo4gTJf4=4&*krydmH>Wo&(Dwihm}jmxdEaH)!ZgpB};JTD2m4C~y01`KgQHu!$NyV9g@(A9VM zEt6uLgIK}yY#Vh%0_6WMnd$58byT(2Q`@{N{P`6LqAjQj*WNB!T$`GWGbbauQEAh6_0usC1FcR4gSbeVIDx=5Il71&?mAJ{y~|*)!ON^wjC&K zW=HpD_6w^7(#%oE3+W<-Z`aHic>P`T@9Nn#G~Yng?Cv(!G4YMScfz;p6aEwHSKXJ4 z$BC>~ZHSfBOdkg|w9nbnC%<_9WAa#i;rEf5v?BN?>9yvGGWSL<{gX!sW=KNjqu9Eh z9JCg5JxA=Ack)lTUyNWVXJM#fa@RFlPDF_ljX(ib%&s3gZv=V*a~}IS1TU2DZ-mOUA!65S^3|%AzDxGd{}5e!qGhhvv4HjqBYMg0+qx`_weVbPN>!k8BgdkMxrZ z)trNz4>VfF9@q zl*T3=kAHR);;yA?O`59Y8Vp%V>I{vr1MdYc6A9iBdqNczvlkJ3?>(CP=z$oZcn&`=HNQzyS3>nF6?)O zf?o@;qVjVoh|}E%kD6G3Rf@ilzeu9Acd@;@v+_ewnQmPrzAX&xur>c^>G$Defz0sK zBYI`b!v9_bL%3=!L3JU7C2NEClQNDfi&ZS_2XZ1zH@eMoMi)_gJ z5Rno4{O2qaaf!ng*Fpy=aUrNX~RSn;zB}A=fXiD5LO=bu+9-RKr%s$*7-pN|s4$ z^Ek&Y7uvV0qKhcnaq;2TiD9bv7GwqlgakgXlJ8fM&AJBaakvwmB@OyMI{kt~Au?L!pPHJQ^o5#DxqoRpH!cPT|DPi_ z1I6upzSqMq|AaYV%Wl-7eReU+c)`9kwS@vCd(QW#LS7kM9K%Sy@cmaw^K&bKTDe4S zDzvyA!|44dqqd+7EsurnDUaB#OFo_KsTnjVca#~8H)p!2Dv**}yeD+GOY=xNY2WJ9zgWZ^W+kmcILL5;=DC0X44s>jOSrx^+ zYffH9b2nTG(lI5^=a9J6iM>Q^o42adt^#E%=_lsj;P(A&`IHwG1*9>2K)k!V-(=b| z^fIN$zNCzqT#8@L^EL!cvkC3+1XEK`Y`a!*BeRHvbj|lEyx)7&SBNggg*zkV1ZGiV zgw&Y$jwI7U?}V@d$~2e^g}|^2e!w{c8&ExY)=3u(by@E7gsEd&tLSb=km@~zHNxRn zoh{$Glx$DL(Cg%9JWnuD>PUTc$w|N6Xz=UrK|5AS$dA_qerT-!l!h3F>4gb#VvqhN zD&w2=zkMD46jUu5qiK12hDk=)=QEN+3Q^T<{YA4qnZi0k{&gE!So8y%pESzIc7;aC z(FHleCo?3=nz|x?d+&Yw_X25>;kr@;;Ab5UO7D-X(cXMxM|lA<Xd0Jeb$~FB73qqJ+r(wv?%ozP^ON zq6b4F)Qx*}(w`kAKUr6&FiI2{pApY@A6k#v>s;<0@njlgI{SLdC(_*py4Cwh2}fwi z`4(fGR2l8_%j}sl>{$@#>yOMrn?lrE^}t6cwVAd}w?+uNpP()gG2=S+Leibo^~lDN zcjV>#4VZwZYvxAq=t@#mS5`>hm}nY>^m}4qi8k(5tb<*{}25mco+3H~%`tprg(#Eav39sT5ktw0z<_xGnhGB{6w3GBxEuN7uiZ@BdiFy??sw1p!C zWml&W)hl3>`omw5Jnm~!J|&$h<1cHNFITba@`rAKtcN`jj#!RU%BxZvgY$LPwwvj zs^X|)j~5#=6q`ghrKmtgHoGu-KvkPnn16SBJ9yD{+!SQYIl`9rhJ!slpFVXW>@#e> z;%yFn=3x~D61rhUnp0vBMB1eHsLA2r-Y~vqi*2uX@ZVVYj(4xS9yUXN&dXxXc~ig@ z4|=bNAs)!rQ8K-M+icjCpGFY}1}E$N0gUyfl*pk!i^{0SAk*@@F4LSFx3}*L*YEFv z3*?$A!hKr@f637FkN~U0Sj|q`Zmz*#uz%;RPI|q51rkDxkk(A+qZIalK(Jw1FhOE3 z$%gWmts4iq(ru$j^bixT`puJhE!F>YKJ+tPyc6clO!7X-Lr8F_eyIFBj8n(Hcl$3i zPS{H}9U!TV`1~xgw|dZZ-q(E{J0yZf;`BP2ZnJR9??ldDo%P6qX|=K@=C|+l{8s_= z<3s+xDF7Ldy!y9Ybm*&w+oVEFy{hv6ruScsyLU81k+WaOx^Sjl{(rEMu+i@U1Tk86 zhLehuCBDsES8&^${vWESmm64xo1ZMwg^~#BKYeG*a{t57RGuQ|{J1_YHIv*VF`0J^ zm{@v_P3m1Ve3oO+4!B2FoQS*ic-ajosshe?YU5v(rX*`uY!~eq@2h?>e^a?BW2x?|dNGi7#TrYk^yGv+B~@hc=xp8f z0G8>jz1%$4@`_=-?y9i?9d2Ed=j;reOtJB{0p%oe5PPe6JDM-9oT^o}-azM2*Tj|9 zELN6+Q|^e#Ki<1&X6ye=DUQ{R6A@CY!`1--se-=UnMN`(xHN@+NgU2~g>d}DnUDG0 zLw2p7qv&IYGc+jcxenVnK*EQ$@tnZJ%k!W@|jb`gqaB5h3pTUT>r|o61{6FBNn|k_SzN-bE9ze7^)HRo#3O&_N1TvK`AGploG_xkum$ zM?5;bz;p6Qqa|s~RB{`N?D&_80D2rF_Ynp^JFr7f>|^L~QKcoO+n2sP+x#*(I31rC zW29xLQ_a)vb@hLrMBYzxelizVfP}gu?$qbWy?gu!0@W~UIjmi@0mP%45c#_qR3Ite z|3p^(J-GIp$MlABr0*H@opk62Fo{uHS+Xcp*$~^Sv|igzvm$txPF@y!_l7oEn!)#t zkZQx2$V`PqG1X=_6ik{!iYm+U_k#|6>P^h~?Qw+X8cU&3$09p=?71zIh?|3q>mMiQ z=;`$SjJKVaD2|cy!LBZvlsPN*xn#N#AU+z&;XL!`?gGHC4&`cykw1EHO+hVS6V~43 z++FOo(9afH?{8YW`1SIzcD8vX06BXH;^#AGCjqk45G}{6Yls%hcU6NmWyF8#;vy=# z^7xnQP&&}vBasx=#1NecDvPJ1doH{xEg82ipIU((Q2o@OM=zSn&m%l%W~FJM(L*c8o=I90P;6#z~VU+5L8Mcm+A}~y$U)Qgu^ZA zo5{|f;dp967|UiKj=(V3vmzNiX%m>ckqaMBD5lC53}+gp9|?w4(Y*N>rD%b2&No;a z#3|ur#3OeMe@mQNaawr=){N@l=m8(*b&m)`J8-{sRmTXc<9oTK;{SwTzP#ks(#Wqr zAZx!P@{4CMg)G|?zmHp3>Mb~Wx+${o<*ng+e0X+@qx6ecYgknpK$_<3D_42#z+e=O z94*LQU?rNcm$#!k6bkrkoSl27rm&NS0aGj!*e;#y_lc@4Nk}-gB9gIc@P{jVDK#!t zM}F;A*w1b#j!?uZ{Gz8XT%6RA z$;SXDqidbz<)YdW9;@;NGpw!62N-I*r7l6Gr>&(1>0IrU>TQ7c_)HSV5^QIGKlSp` z1!(1X8L|tfUmnh)l^HNw&Y@r}5P%1q|DU99!vE0if3Rn; zXQvz=63?S%N)Q4o7D9OW~<67TeQ0(pTfdYD2+3u-(H@w_NQ7H~MkeEwx#47Io zQL&ds|x;Y}z2-rBYeA6E69dwe8Swm6wWq^%c}7R*siH* zFzyx?1I1^DyG4TU%62@!$=s3>Tb{ySvBS>tD7%wvyW0}bsTA7qpE{f#+{b1-=vBD< zwG*3f5^YOQ>7zC3(4YD1EWytwuy<<;7*2T+Ru3thBfNrqh4jv?Rp!8&&v13xmdCOd zIpPuKYVI87z%eL7BRs6@wU6nKF}`sgKH(JEjZn^E5Nb5x34uv zM1xRt`KH3$$B)<1e}STFjqdtH<=2DQtdE=aWZ1ib-cJDmft@cuZ&A>?#IyocUw+gH zG5xz%z}2O|ls4(htH)B1_7NK}Wyg%c2QbJC&&%p%CD*^RsS|RBK1yp2pHVi`lW7Lf@ocQapO$kQa*57 zMjq}4@;nRt#qzyYx3WLV$MugXdq1C40>R_IV&TFid!5y_`VWD3oTHv+w_kL!-|kPv z@^brLwXxit!X30L2>=NB^E%dZeAFmf1sM{`l2NkedPC~DLg-RR=?za^ylD@(b>Htx z;dFlY9Rl@s4L9;%=iOg$Ww~Y|j%aI*0O2dlZ}l+DppumE~rvU7F#{!iy|>uP>fxzAp`&1QK9h zoOOfhIj`_-eB3k091PoO6$*?zo65wFST+atscnBW{PT(#L6u3bw;{H#vTttb*!p)7 zy*NyYWhwzEmf5`0*wX$?CK!2jnL4$t-=ARQHhZQf{A75ZBt;V2_l^P-N~S%4^~Fc8 zwsrM=zy|%^zOj5Vni$nMWi3QxZl&@exR{i!qgiYx+ z;^^u1_R2$mw*%HIGP08_%x6|Na!j3eX}z_i%kB7RzQ2wqZVMggo56FWsUIFFB`8e0 zc}WW%UaIhVU~|~C%Cpm)Gzwv#7>$Z~_p7I?VS~mWsy_?(`nlIMbYh3g62d5%+mc{5 z``|#Y=q=>pTpOQL2M5bTGAB}ij2Y{a@&Few?D8KruEl$9bm_+UlD$6VN&OV9X`egV z59xnG5*Rw6W|0IvueVsX?GXUWoAcc<5}@Ow`~NVEd~w`jmDVu~J_%SRN=)5d0m~}# zDZ(E3M@B(70U`_E)|9mJn>>QbBYwq+ap`GJ_2DL*tZT!4w;K;z9ui3Y`c#tCw#3NF z2^pelb(#~nnR<=X?@ipE3QVj#k#*hAPI#SPkgOU4Xs7FR;Ij}NOKJ7_^M2+yVji8B zWu^uvN-S65ixMu)KTp3`nJ7=A<;d}iRJx^1N2a3!Y4WM##lC0%7@*F5&MiNHl-X*P zRXSPu6=c?V%p5HVxLDn$Qb!G|ifQgfTd3X~{|u}e^$fwhl%&jCqHd|zE{q7yD6s|dzl2@xvjqX~#_KJ&cUtiv8p_R{)qWqD< ziu6P}GC_ZS_YIlY8XJ1n-{C=2FV!~&$~dZaxR86$dV_7BiI}l!bgWYdbg^+^d?R^l z_k_$#<>EML?{8MafwftxysZD(K{3-QzOPN^&Ma_kXw$1Pbhz6<_$lh7R5aPlk(3?{ z2;{rI5L++p4<`bsH;R$;(x7fQKIU`>8L*60;ww?$-OshMeqS<)U>RFg8og&d zIBn?ymvX;xrR=!5z89O&!pZ;Vgp<(6egF{2JUMA)-e{VMl09Vyb<8I|bPl>b*Zf#+ z6G_JZt-OZy&j4lP^=6huz2W(NKN^0N#QR$L{%OF16^iQ7H5L_}ccgb;Wl>+b$}(9` z3hwbzfO9Q$tEQN=wr+a28G(q^wu##Q`{t#TO`tF23mDQKccOmfer7QvIA7mD@x2XE zB8;J~P)nwfNVt4lbb-{FHmywG2zsdiEKVoV87$;c00k^Ve-Z6ZI8>i`caFVdDGrCV z`(F}gnlc4@y68X^=x?~`=#a_V;OSntn3?6<|vy7yPDo}ZqQNggwZ77{3Xc_Qmj zq-*!I*>>#{RycxUd@oH*EZs^>CFQjKen$Hc1pXN64~{j-7oS4ss$T0@2l$8}|BKXN z*FWX+)kAP}#Jl#Uih0Hn6(S_8bZ8Rajww@KI5p}{T-`ZEup-$(Y6TPhAWfOeW{AdG zd58=SBws`dw~oK~)P0@QV5Ux|iio3I{K6P5S<<9~HU>SC?e$}2OEbuVo%yc6+JD@^ z|3+_8w&bB66*?RNrV!k{c{!lqNLRvq(n&lgXdZU$G^E-b#vzUB$j!Fk` z=PXn%q>MJ;1RXIB)5#w zw~;0igBMMElUhQ8mhcoqxBs^Lef^y5rksGpUx7#a+|}cKEwYm*veDt+JH23fv)i4u zC&=to_}yc~$Y0l>xP&5x`r%{%Fl(`E<1BU>e17n?2Z3+-9Z;~CI zSexX(;2zhq*=~mO=gF&Y>1SYxWk8m)@r9y6C*}j0!-Lh*@Zr_HkRGGIJ z2Ho_@{5RHb2X;&0obbH|5$+h0DN%@NsKf(qfroj>X>j1*>iCDt-@%_#+^IQ!pvCirrl>fkvm$J}bCnPs>yMdkTKYGVv-#X7Upg^1c zz6{|teuwF>=$#H(E`R1uA0lkHLQxq7zlmLR;Phh+vze%Z_q;mt9xl^m%lSjCxZqyk z^k=c3Pbcj>W9>10*fbV+XjR6K_e1GpMMm>d`-~Wm3XOZi%C{yX&FIQ!Q>-{5k|lUKyzA{O)vlAD+_`Fz5*? z92!(L2)GM8m`Zq+nUu=Qt`6sNGf3)V^GatW8x!eA55XFRN>f()2hhY|efrwFuDnDJ zf}(Wcq_4ns4rj?`w$6jrYIHR4w)7n#eiH|a3{E)p+RQpkzaB3Ly0&L1o&%jTXJA}@ zEY-0Eo+IhKm{u6JV>Z544W zfE1C!in2MMP6~U@1ON}>R1h^#!w^Z2DEJE&60~79WN3(F8wm|dYM}WjBfRjD^rOPc zdI-x+$L?Vl&sFQI$n&+NCErQQu*i%8r?ce`u5iA*dp?_x@1DYUA7pH+>7w@LDQI`Z z692J&DMt=gMqnMhy65@!PFa`Uh&HiWpyoAZV(4IfB@C?CLX98!qfJLuLr*62FhYfm zHl|*zy#-6W`NW-3TVV(29q^_E+3brND5fM1pjr-EcNAH98_9q(oK4YnGI0k1r%7(I zD+SCzDt$LF-%huztcZf?|Jqe%hqZQ-wiR~tl&Z3tMG?GF=d&rORNp|&iss`p#S@zp z9bJW%Tzc!5QRlfME?pbIF@($4b@s1UL__9_*;>?|4|m4fjI7=6{r)PzJ^Dj ztW5){p$t>HM#%}UJaWPpMb*vjX^uBpf5<-1j<>zSspoxzp`&Puyaps^yt|!UC{CptW3*wJ|mUBG4N$UuTY4-w&#nzOUZCaWSOj9fr$YHAiAd@R`qZ{|iBL{`0%7 zX&%6H%k5J|M#}dcdax{hRpP|Hu;hHyOt2qPOaC6)7^YQ7Eiab{-!Q0RueWA7i}@ zjKsXr5a(Y`ZeLhrhQye-!=X^rnS)fOq|@%F*DG#<85rzgdK2s6Vn>MV1WHtnyT$@u zwIbEe4N{}=z;Nuz3DTSIlOv>|YZ8s`^#z}{`}t`vtAEqVTF#&?poaChH5+CJoUIcg zW#oHex=^R3*Iy(y+iu2j`>`Y0@+@bP%ow(uWD5EZ8dfybH9q~93z`etcm7;#2dxC* z$%{9ZTczU{a$0GAq|2yTkgE+j7P7BG4AsXhkAQ>nnRxky^6BO3u0(+Iep8f1-SjeM)4a+EVJK7fdKVzs6pdShC`=0e-WGuNaQ5L96xzKwCanZjfA2Cb{nhUE5PsA~vbi8FIz4)361`058gHgRnzsJ^ zb#gypjLQZwUg?<;!QU(_eYtCLT^36Jbh-iw+MZihR@bL5KBsnZTA0wcL6!z_Ccp0# zmyw@DY*o)ky)Db%?SZVaRmTT1g`4qKT=ye2oY(b&`@L9oQf-oi{y(%dwsjPBl5dADx6hHYLH@rp zJha+7T15LH#W_L+pb&`{=5tO7EYz{8d@J#cCEF(LOpzgr!Jv-AH1Y|vZ!q|#Ex1z9 zU}cn2P0HDh0*N5+$jUAR!ntE9Z?1Z3j}PP(#~CM8nl-78wW!J4Us#IF>JV6HsvX*BF=vccZBk&)LdNZtw_q!8Q+*#oS7#ri@%zbBsW z9d7TNzE9cO0H8w;o`$PHZ{g)So}okOI5^`%VJ{qZDyx!jS{BD3-233Z@jv^XJTg4K87$@*2iXYl9b$)td zyq2d7)bu^s@fnNBdU~bFokf>iI2FVI_&?*4OS-vg(IK?P!jkY_(UU}m66f1W4IGT! z&i~`hayAmm!k62W1jK}ps%jImQzAQg$QqZc-Qe8;!-TLWP;$;IgW=62NF(Wd5P{D< zUi=asB_o^Zp*P zXgko~FX5@smrXBk(Sp6QvU1Vy5HRMk<~M4|na?EWMQ)%djx|#Nh-DP?Eace%# ztd~o$Mwj2E*~60aKU<_qyrrn^G`OI684K8ifA2CM2^IQe$R^-y!=@SztTX;SwkuY^HX|J#NLUVw8J>(@^dz45Nd3+?=$WV260E>>pk(3 z20Ve9&KV;fjjv!PL8VQ03bw{V-p|-xv>EraPaT|A)C@A|2?eE0F@G^F)@BBM&pcZ? zv;?P}#oljMck4{1JM(W|+=<1qC`C|(IG{Z5y_^Q*dl{fLPKc}K694eGvgQ>^clKq{ zRyCnagEi19-~y~Hk1fLmtUPP;wLn{xH2*gH+%lWiDy(rd2ED6x3z6pa6lKGYF%L^j zWcF#~agq72zJht#q9xzTFp;_XvDi)et<}Q0rX?(pGRuBJZoByt3Qfz&-a_GegG(_n5pAOe)Pf4D0p3P9>Np z$DS3M6l(GcuoA_2-RyE%rCfHSPyk_afU(4>0B{L`D_^px_Q&$KT@Sk+kBEXPw3?so+HZqB+!@jaBum%H^_vHm7-W4~&#Ggfeg)o0B3R>4>Mfso-M`HV#Kl1wL z9?=YxO0u44$8@BGemId7#B_>i#+-|^x11c<`uA!iKN+o&CiJMLolr#@fNV>s!~)&zixg*iE=z@OiGw64mD3kP^9GM(xX>ZDU7gvLkRth@4ttfv%8$f(7Uw0R}(oo zQzt@LxW5V)k3H|t)$CXG)g0Uxx{Xn!aO9!}9!&=_G8mt?)?R3o0?v{xx^694{qPHSsAihNUF_i!%d7QpmY|=NpgvQrZ7IOVwGUAG<$lE2i&YZ z#D4t*kJbIATwoFC=L5=19ycE1PNKrifoDVS8=&uJgR!@8eLMNf1niu8TcXxjMyJ z$HWb^(rh5fUaCyvyI4lMe+sC4_gCiS@8h)0KGHEY@}TY9d-diLD#vMB8pZeL0<21D z+Osb4aCVOjO*OfdPNPX@qXeb%2$inq$x$AzzM7c4LEn#8CMPgb;iubl#5R*CzlG0j z;9+~2Lb{8(pK#$RqM5WQYpEH~G>DwA&+@;-osA1f_i!lfFs=$YP}Ga>&ki;-{)5bj z2Eztc%eZ;zs!Y~p_No5rDSeV={0U4#iuP`k$ux=D`Q~s>$`p`g#mJj8oFz4!hM6jY zl>ct8=BFE<-|lG(RC>qqVVW?#uExY(PGZAd+zf}Cr-FoKnFG@n+}oBSk*oAhFWTvgObC?jaR=qkld`iw>`W@*Oj03 zeHnXC6YUV^TGybJQp<3(-f%%0fZaTsikY}So>AB5{Li_WY?>b6vjLao58vpOe|MQ( z09daquPkyZ-kgMPkpPnsoPcCNAkG{wg|(T-G(CCjySQORxho`_F%5Ew1p`4i|w*Zz-xavo)#_ML!cZ<$uLEyamln0^!tCts}ZudtL zuTH>Kmj}6rr?6chNXmwiS5e=W&AVzcxy0wz`Lg0_56Pc9-7PSwQ|>h0&@B1~?v;T-lsU zfw8Map*>~Kz$IULG#a!04TU*-&{nFJVN0vxdwXws6cwssXO|t}B|ln`3cXu>*o>|i z%x2KGp@6sq!$e&hzUZvmH^4=r4s;v??P)xBwi6r#27Do*0$f+$jX4T_b~ACa&f@c- ztjGocdo2^4sLcO{q{f9aif!AL{u~C_o1a;5(xg7*)#^)HTY9_I>JF)gizXK0F!1l# zsNu7<`pRqT?Z|@TtoG_j$_Z8~UH$K`1&9j*&d#J9$2AK*R5bVK^D^YoScC+r8*r2A z&_;RAX9uS9Y+WYjvJa~G#b&XFuh`;L_Cj#|?mjp`cXffkGLAk&Hp7sbWJSbp zMMr&e)bS?g3#TTYlu3=`QuJFU{K%t=p>d@>4S^_bDAn+v&B2^FW8&d|AA6E}CmMat z&n(O6*w?c!F`m~TCE<^XUcsRK+pq`i(5v2w;fn;flRtqSz||0-gC8L3dJJEGxoHN< z4<80m|HlC$1E{=PPu;W!~7=O4aKt<_#+QI@(@7A!B1F9CKB+Mml*28phg;YH?e!mWKJXQAc8GZJ(wP zDC7_H@3`cSIpL~XJ%7_sHMTW0uf&Kuo_dlNN2?;?Vg@Vcb6aL0r zog=@^c8u41S`E2b&>P0}kyg=nd-<&XFh_ZQBi>}Vl8%vn>RLmuQwu7CHc>`b$>Jb- zXJb9CJmE|gz7zp{rQVe472J~_UNvBz$ij+wzY9Y^Q$Jgj(-i9H!&-Dacq8EXf%G!%D+>F7=h zcLe9=vCZBUABwgU2x#~npNeI12mE(i*Y@Fd2}T6I-m(R?vi6hssZ+j~Z-Ss=jasoH zMYzCpfnBU6=JL!nCa~`9-z6zHPX{RvU1GRUbY14mq*{SRiPjXp;nYp4Rr=76Rwz(q zVadt&eGO%Z`AHtvBRLzDyY;z z)yeJ`tYzN?pH1_6t(~QY<101SH=6ip2*DdN3LzcX=_|# zbYoye=rl=!kUmd-?<;9GkK=ES-@E9=_LAj(h;pW@*$Q%MKFDKJd3Xd!X2qHX@la~3 zMiQJ~3#^~{h208hN$iN)XkKjXq5~xuBBKAUOh*0IgJl<*3W0eEVD)z0e^+@{>_Jw~ zJ-do10V;fsjXjtMZH~&C_@L~&zEnZm--c%=@otB$(7fiAwe@(s!js77$=fRvb5b(d zjQziAd!hj^#HoX`7J`c|O~=2$76-%fBo5G@bP+Un#;8)wH=E1c7*}eW`EN!g-=Rl* zM{!@r1g(O1pMlikvxtg9X;w}aVyql6u+Ty<0lW%%_TQG@LCB$Rc1tre@`z3pgp!); zuBL|YY8{-?G$pmZ`KS3!Uh}mTTM&!ZDsquJbFP2sxBLnL@SPD<7pY-SSxi*9I1J!! zgN&vE2jqwGtrMulH$yst{wrywnnTGc5#qqOaq;InR8vfR8;BaHeukxfhD4K8QMqoa zP;Il7?DVwB+c!pcy1?c!y4;VmCGZ|SrDZ4gbtX*F61RdXHqAo7`}iSIV@^Y`oO=h@ zV7+Q5P+i7%y@&uv=TzAusv$Y6;t~e65|xiyDYNEv?_=nOwTn|(0-&ijBnBDW-T+dv zV_Prmm4UM>AfAd^wXnV%9+cozb`V>HvB+p`?Ctxs6t9 zQUGBTMxa>c5JPCwr`A*{;N3(M$3xSOiCKS6j8~+x57e@ioTsJ9mks4j8i9I5Xf4_( z)#h)0RXWjC1+2BT8|LcYCM&#)Uj^f^c}CX$!aJ-!Lzv@J9JLDw`aHs~IW*}LwwWQQ z#--m-ypDfic0KJ*2zIs5EApn@u9yKKCQBYt^f)#(tTUhUzsnmTKIS_QzrNR~v|lpA zHCSoYcr58E8HDY}JS-=FQIlD>Rh_lue{h3SD~wby*No@4&qnx}$m5zXZ)>u&$9=Fk z4f+8+DlYovhw=Q!whg$IMMEwk3x{&OCwh-;RpW&f?lc^boKYyC7M1`0N6)KdtW*bf zgp8&F)j)J-DwvJz25A8JuyBukFP4TcrB=w4cu5ljUanX|Bs6p|C7w2uh?7bHYtrZe)WTWS9gTAV3q#{p%6TI2XY zgO=4bLBd-BkV~SEnCuVUY&9X_94~K>4L?OHeGjDa7sr}Zo6}*1eTZU8GHE;+xeM$Y z>HXxbbXd!~+wS%iUxZ{=#eA86>E+Rn{bCNJ+aO>zHv<^WfbhFw=V_S5A^Cj}M24*L zvO#Qeq~QmH5asCeGv<28J)g;(rOMy)etw&>4r*&OJ%9j}r+8J&5!FPFi z%9vg`1jRJ111&9}*XUXiTad0$B*?}=?y_J-k+5$C&P)kh04FNOG1MLzskoi_Be`js zfw54e6y}}v5@^qRfWBYnIfv|nnunkdj;zsQ1;MU_Y4e- zmh*bP;44#f@938|=Mj>5kId|`&#t}{F2m&{kXJe=pY4tN%`Ms(alzC`jKtPNn8Q3{hE@Y-b17h)-EVo*-3i z1K`HUWC2gUjx2qm=u8VIuVepoFQfd($u#t_vK?yR`{^TC&!E7E2{{noqszdn+0;^c zE{Tj>Hrc})w7qi|duTl}i49~{JD>h3M@uT1!ZxZ`XN^XVYTL#C*y?$78Q18uAGYSK zR_%rKHYkY5GkJ->9@+)p9eUMi%E5eQeK;z>HBV{pY3My7xzS?S1;~VM!#wIvpmx^To&rp=H-#gh^VwNf*(8(rWGCXuW(l1?J?lX%4zNaR59CB7FTzA z&4f82iz~M48Wt7xo*@#%8U#VAzScUYmC-M9a zj&#v;c8HyeSI!{}ouwGz{h>-s5M}Qb*IfoVIwCUeXxSfI&~t{faWBc^s7pM3xkTQt zYpH?gnRRVdzg$!=R_HaDBo^&HIgH!A-o5)C>$_W71Q*VDODPsKa(Ite{*dELZqe}b z@mDCGaFZ<#O|PsyWL-P!Tgg6g zkf!NmHyLC z60^Kb&BuOv#lODw#SX%8tRg$^lKBcOta!CEHg-0pf!EWx%9?2>v^r>LvndPMnn?dU7fX z57FH7n>i=oL&f6gVT0ATm?|?1a~lj$?_V!o$mSh;$e>Ll;~E* zF#a`U{bN49qI0Z@jDW)MabUegt+A4pURlI52ikYNp9*#9_3_$Z9=jSs0fniPxuc^G zS7nEfSXQ9=ZSExT7WxUT%~bNH1Xp#}K=l%2i+{L0>yI+aFNo)?-|lg~h8e*lDZir$ zk6ZNDmm}qA0N?H^VC2TXkIk!ZP)$0?KF~wJ$SyF{Gw$l#lk|*BYH#S~#{$tLf?@^q zNGkq2I;bksl(Tv#O`C|`;JeZe{JtNeMU`uxKdm?Coi|XAV+>*!i~94^sQKB~(+`Uj zGm((?K3f8z^iB&sH-P&&9NhD~O2OF`B54iUR+LOD^gmjvM82Slu>51Bp0N}B^w>3# zBym5ndsJv4U`)}TZn93XRpPQx-@ZQ02NmTg14Ledz4ryYl;Uk0PnHlb3P8o+MCgY; z)jxpfKvP%?QjSZ-hZk}9in5Y?XE2yg?PI~tH8~4=>3Ugs!Um}7Q48yx(n2wqYx+c@ znOi9Y>W&iab}T_m0;Fz;9*W5f^aVJIdFPr**Boo8$NdJ0b>!3+ zWh@6B{YG)Tj|w=l)57MK9QGYg(2s(86@C|f2lnwZ8_BAeKH31rd#FC4yp54V*+WD4?m~R2K#?&%${s`pqYfVVp=ncW!g@FhOcLioqKvwyo}ozHuIAfK4# z$EX5o+aw4i;OYQpLLzWnJ~y}zCg2v}cMY{TSgL4F7@z~FN2Rc67>sPWDH*!UY%81# zBy_E4$ILnATnB*z% zh~_Kf>uMBJ>Fb)dYjwYmg#jTZ7&QEzqzwP#8<(v`@_&uZnH)_qRlw6mp2_2k2y0fS z_sGpuGmT`4y@*1%;y-LvDqK-UwewE`Lyf#@nA@7&hxb|Wqja`2IBVGKr>6#MYco38 z#@LG7*3AEXNo2Xy9&wg3gb0e0%skc5sSgtKoVqoym{i;U0+f%;mZA5T3mCrUAd1VY z-oY%>@uek1J-4ns1)H>)cZe#sULPrQYP^7*2_c5>U~=w=Ejz)L3-~EEJs9IsykTLgP*-uqjP0u8`G-N`OfR?*~*+k;?b<7gl(gK}bhS^I{$oz%H~8L}Q>y;Od9D z{ygw@F7o7yADYx<0f8-C(A(>f1|a!^mLGHUF&QOe+@`D6dM78+^m zo@|Hw1B9^fmh;QAz1az#64y38;|+wK_wSx|evSO$GPDy;|B(`^5+q*hr7Iq`NxF7T z5w~u%yQ8suJDNuTAWjD4mYaR(KjPX*{iqBMTG+O& z-1<;ZzqQk@W2t7XLRz5*b)s+in=btsk7XUZ4NtZPK46lGovF8S7C5^&A_~5|Mn82c zgoI8+Ew&k@X)UgKJ^zE`kqL%*N8>2RifbI9dWY->N(C%^tt@}HJVi^zYSSH~Qutv!T<6`s2ih+FGE37fL31@c{gI`k$$uC7Cl-Y) zG5Run+HU0NeL`v~DwU|j{!Z}Ub45iVrMN`V>&K@3e{+0hFI!~4zVF&U#MWiK$(d@P z_5{1)<>9G{S235k2ZWAb&rp3yw2t%c+AIftwt@B3YPghQp+iZb7pTC1JfWyOX7+qM zao1+{j3^A|R+K3uh@WFyGYuP_T)?-H(gfhTPdEmiao3RU>$I{Wc1Cil>|twO{|u(2 zNwf@?v9QPWCxD5uMNsu$dG-{}=n*F8wNXy!#oGc}0;-Ccx49+fYPI$6LgKP|{52dm zhG$BGFP8W?y8;#0eI%`BH;~-b{=liT-oa&XQK<9<{Ehefm{x;uv-1NNR~lwVzm7K> zcNm`^6ljb4zkCVKnuMVZruY(nA`5nltxKR!Jgds9Bn$XXSZvsbe{(_;{3P%CE>cidV9vcm5?m6 zO$%=Ohbrm$T&b!zuJN!kCXCjm)nH8v>~}CtAat|xe4teNxOkr;*ljTA*|;^9+5C=L zU@LIwGGWPE33n%vo*=+t9bQbwp~{gg8N|@x>5J0+4pSUR#u+oE1Xh}al#27zcKdVA zl=|HLd7UfOprX3Nlgp_3exWZx9!;|O>saz6g*mm~0H2iiz1n9jV27^1hl$*p8A)H5 zTf5BvR*h3&wiqhsYH-?#{nxqay8>o1DAK+tHkDqq!jL~R(f(J6IysYf$L{Ji$Gnl; z^PlGRP#`kS4CZ;SWthwqVf>AeV_aBwl)x;E?vbA4EU?=znl`evY?m>lR2z59)afvu zEKv@~sWYbHq#mYwrYQ?DAR<(C6Uv{!w5V`3bYtJ%sAE8^vSja_m?i!@AhB&yEe8wAxQ!Ug^XZi4YAU%L;ej- z^mM(K_Xy*;lpX-W*-n{|c*W_1a(3M(e!j*K8=a#t466HVKD+(&mg#;_#!(863|MEh z1{<$BlV3h!7ff%}whaF{>_@Hc3XPDoaAEU|Z)^|pk%cvhzFx6l=ZL5D((}lS#4@Om zHSiE;PkpX|4NEqgx|KEQOlC-1luT=xZT~Dc3Z~bkvEv{%c*m{ZYBFkD8{M6nu1}d} zA3bj2(pPnDd=D)U-EHuXRugUr8QyR`U;CNWZIn2V8sK;qVY%RfO~}q>pbw;DxPOe* z2pY6MbYL3@PK}EMx<$>}VgPZGbAK>}u|1Lk3m6BzBMqSk>+Vl!qLs8Yh|)oB(w+pR zqC`PiJots%AZ-gtc^#|JW56HOeFFt566@C(5eTh+gt_`^d*mTJ!Gh(E$V$KLj8QNP z72mDZ8&@OB;0eCapqRpw4e6z4-=L%*sgQR4o~Oh%;q~SLAd`>=#DN zt4=fLsaG*3v|oaGn{X1`R{gj7Wt|gNm{-*7`G*A?=CZ*e11IUzJfJ*orFqX1*xHG= z?n&SLF3v+B#x|it-Y@sS)c zlR<@p7RVYqLN=Nx)Ftdgb@WgA#EAoMf8JNDF&PdLener+T(yo|(E65$-DV zQvT&igC2ACrdw%;hs0q#CrzKQ{po_Cb987M#~`JCHFmGDeBrK{En3pq411hP%bM;F zZ%)b6i^P3a_p_K?5+oLVEMCvd=_3O2*s`dilT&f~;Mf@|?h|^U9!TySI&VVeg#Oy$@Q-*blL{t&bySYJu zuh@i?AoR~+%qBaL^n**OTSvJF>;#O;y zK5uPvMLRYZIAkIe*E^6dH;Ek_Xw~oAq@%3Yi>VvXE`4>YD4gUS^}3*?Ll;Q}t@iGT zg)DGOWTX~z*YYP^W`*6TzebupZ3zIeK0LhkEyK;;>P(xhO&z5bK1Q^XhY#&F5%n^} zD)c{Gju0{OKXXY25dkwDJ)v0Ht?smz()LZDmOrnX0D&fZ@_N;GZZl^(;V;>A4S))` zbrL$++|fXZjRg}<5zVI(zBrGhdbvvSznKF1wvkN#O(>{9E;D4t-j02WDJH!5j)_k1 zHYIFtPx_IPf}2&o{ce>)j}yp9tCKrKH|+sU2%qM@LbPh@U&12dC4ZIEzHY~J*Vl*N zFQt#q`|om>?Ons*Lkld7{K&($Z52!GqyWBe9F*yxdg7Eu)S*36D~W?swxjU}pDjWY zwGf>9WId83{z})Xi}8{n3)xH;(lbaxzhlsRiS4XRfyFNzknT;s6A&uaD@tLkap*ZnBM}r zY3Oanc7Zlzza*{RYCbTrd0Mx!y@9UK0SiyoEeJ{ClSHgz_#&#NdBOm${@XRGs`gr( z#FYT%`f$*gRP|yIu2C`+-+;ztNeT6{X#fZeN*un#KapJq>m=~9j09wu&>_Pe68*@hde?8 z^?>-vfv`o&tSZIEQ5^;aKp61-+V$rx__PBXFULwecQbqY^iBR*n4GL8eo=s!&s-&tnM8fYG#TTLUv(KXN?LKlC& zLVg-se<9zeSED4EYNw;KH*`3SJDa!4Uwkj3=?? zjQ?Q-$+yo)RtmKTa98cSLV!G3NuasCHy2!ebU$k2j`>>)3a<)kFV= z-6Xv#k4&XCo#DAHKcxSlxIwNC&xxPUr>p8E&w--4c3$Q&h%`3_Emo%4RAGQK$5l$I;NDL%^*B~OJA0M!bxAb0T7@Sv!_ z=K!#V+5Gp9Vm!drO<-0;x#LJ-Ivvn^rK^OE*?UV;0{iWhzQR6DTHyde?`*FP&<_?x zZ#m0AF0B8s6PO17PN=z?Hc0FvWjKzy0k;(|t6lfa-Y%n;NfON@f4Bdv?V zXx2pN1>LEet3fr?;>W+K5xh(V(O=A2P5H0?Vyg}rhH9LoV$DpQPUeEx3`?6dKds-i z2cCnsx2@y~QardVhh$EVZ7MGlB5>70+LuRY&1Fa{3-)TR3_7XQ~ z|KTAC)1VzW#n_LDJz}dx=OTmOaHE9e==dg=aP4lys%o@A_ZCxJq!fE>-Tx4r)}?5W ztM4RyTE?jeL0>)Rn>a$&XBrYCdD9m2fjEYZ0Wd%VkaOIqY(TAIQoLCcltA-g5inA|rc!anf^r)V6usKa|-?)A%!y=HCyqU_w z6!!m$a3naa1@^=bKF6^!McLzdb2(av@tk7G68-Sv?jM&d|cgeO0?D`^zj9 zseG^8G89)sdXxOAKZp#>%RgHVuja{rdy+vBal-8Z;qRUy{0qanH3B9vF#LMZuZb5KgY1a9ae6CkuaGX{K4<7gHjoKejilgJw zXLQ%o^}5RcFq)({W7C*MwMTf0U7T8r(fR&D>i!A^3CeSC`E{*bY{~ZaE+Jgx|0H+F z2U-38J=k&byQSq*KRCX`%iEP?jQ0T;lTC1$GU_k20V`L>vKArTnV2+Z^53~*esZ zXZ`iWEU$5I30quV{xGlDp?*mTf12LfK-nNI_#u_*VvNXa`joVeUhK++#m0UaYU_T$ zObfyNSCv=hxI!&JvK#&^t|cjf;bz@4rqCVOxV6yrz*le{J0X6b<{>0USH?~B0GFwX z9lF#yc5?kh!Vr@hkQ+(*oxzX|aL$~+m0xbcZ1a!NzVInFP|9GqGwqCdM1q~zj$Y3Z z)GtK}hM)WQ+4ET9U(MDHF${=cyj>~$F=3mPn?o5JvON{M*k^18C>wph{wz`8B|&-U z+<$oy_vbH4EP_W~73F_G#L8I#JhV9_Z>4(kj$Ek9R=p^876>378HF-(g;-YJZ?=YL z7Wqy#f2z);`N7wwe8e0wC>fjg&_*gB^sYWsSXD>CX zGm(AP^tD&c!?wJ4*d0A0QJxu^LVL$MSyT4(J0)jdxN5tF08-mxg%jZsfr*`_xUIbr zP1t6fx72n}hV7@kp-YdJJ%iKJc@|6lFHpFA8!x8&0QXa6#7S?~+Nkz5rPD4OQ zk_i4}1RRc5>I?*~e19@4LE|}Wet7u$Qg()+D#>5zVqBszO^O1*SSa%y6Rg-)&#jbS zWco6E%9+yJZE7}AiA4opgC0v>y^x%&%OX_NuHFDRVVH4ej0=ec#a_b6(C0Jx3>{Jg zi(Tak14fqmS>`MmVqo?OaTwBWn&UW`#FbXjY8i-Wsl@EAW+GL6sMxUhpp*+sNRbvNI}{$yjm)TU-t|y`MT# zTYirQWt{+y2tKp0bED{{ZU4acwRukXFx4nccTbQN4~a)Gh-t#hVC4$IA*If^O3H$f zoPr|RjzqP?s_itqJ+HR+3paN&kV1DM+JKQ*$*C~L>caS^L!Amf?clE02A|PD2n?X3 z?;MGxFx%MoKW#`5QZcGyi;KOd%m0IW)4lg!A!==0e-f-|vD-7O>sz&hC=Fy=y8Ol- zB<0lKJD4OSEVMbw*|jlOz7QVq8Rw4XAm2071s3hn@O}3edal`iH{7WAc9zHIn}BsL zZAz-wKaKb+alEq}#ClHUMWe1PJQBqt<}26_=`*Xah#N{tNMPOvG;H$d?il<^@+M)7 zpmk1Eosoiy9=?AyUEl_H1r_VaQbKaxUh`U$3FZlGALRjJ73Xko#4jjWCNr6=U>>AOu#>UgF{eIK1t}2l}Fyj`36d zgK^KFV$^G^1_tRMoah%k!UwQNm(oj0JLJ~ly}g@g0F+c?SRpB!wu@3p2OZ^u{n|a> zwi6A$ddpPu-~aRx7jy~ZQ>=_&T-?-eGSLG!70u1<{`U-eoN(gjDb$jB`OQT9svFNT zY%NI2SSkF#WGw93>=pf?)2eZK8ib(9vmva$ATq*ZMJ#7*W>Rb1R5%*>d9W^kPq@J_ zmXim9X+nodq(qj{S^#HoWVe~&DMLz^sv!XH>6(x;Q`jOLg zJ$wD}O<q;} z-~0I99r&_RoH*JyHYqQE__@ADG9p9qkS@8n>DV>uKW0MEyP^?Avtr z_U;3W>jQxu`OBwL6H6ImwquTsKdZ=qpo9TC;Rc5TW240AZpyADgPB_)7F_1t%F}Zk zyN+>qU~q1@&p4uW5jt+1uu9!y*r|_eQD1d+PeUu!iS-&*SBn(w?phc&$73g+j3Mt1 z-ZtuYycNwSxQks;; z!Jw?V4^i*B%_ZZd#*L0pP6#w>^b2dPr;9AS|3tb+E&FLkX^t2U^9!i584C;O zxOil!W|Ta_!UoNr?!$JbV)l*2h4v$kx#s~~lU==IOF+G4^U05KrLDWSZl+zpJSyUi zJ?D!DWt$cw%#3V0#R|;0;PMu$@|#xL>i^Km|_tFEX=YAp$1+@PVJ*(OT+Sjkcq9o|t1Z z8s7Ox!D$vcI_a~s&0>IS)j+H0wRM;-2+i*?F~J#(j*mxgnq#~Ja+2{Az93TW#heqM zcm6AVyx5<-Z8bWyhM9nyRMq_}t8K#O#RW~~HBu!e;1+Xi+uXb1zf%+WWx`MuO;6C# z#x9NO96lZG$oA8>wt4ucg^G*;)Y?H#b0;rDjAj)4?OAVgo&^`5Q=n=uno_TcC&fJs_RhhmL=zwjt-z2KZ!|UvhES&HCj$o4G3*5I#wsI zvjwp#WMlqibz^-f)>2 z#$zb;@~gg&{VWdCFr{D3E1MMI#F{}?e7_|zOM)W9hwyJ7;w_a7@bSClDF>14II7J$ zHm@%@A_z`|N3{dt!xvf1JcSOV$M$kPnl2GY(*Vh1`RrkrO~rDnmx_Cu)Q;~?Lj+ei z$3zfiTTt#+3mN{k)upseH;03@##b7;CPL+3K26bBG7aY-Q+wpx>1vf0;tF*8s+}b+ zx?4XHHZ**WAZMc}04gn{l>ko~Br^3pK;|5Wudn^s3E}pwX!7Q4{)x?`3l663E!!`S zV}N>L_#Cx&BYgrQBqUyPgw&J?rWLal%>ZXB^&gz=JG&?gfEM%YYA{W-FWbyIHs;`K zXSpv=5*IVMPjorPp|Q&)+?si+i?4ji8DD1lAX;|V_8Zz;MD!mNYacop{ zRfyF+q4D6|RV+Mt{UAAQ9ro%|1#Q%D(D&KC5|062o#7x!*@hG9DaFA}$?O5{(bsY6@vb@rRaIP0zlgknjdJ?B$6Z`vI3K14+Wf-un!`PCr{ zQ@0#G+9B0_)7sGA<^sLnxgb{4?7g}o8O2aDrZ29HsY3G|jNtsAMEivf1FO#*&CLrI z7IUNUvJd5!3{TeZKYfb&EpdG~C8#Da%acz=@IN9CRmD|^DFqE!39;EFKBJ=O+CHQ1A%SY=%Rt>%;s{t9O}M27=uKx_5UGU5sWLFsVcX z{!+b8QB7U<^qaWN&(b_iH;I*B|L;H8-N&bwKP^$1E&duIUN8;;uO-hRBLbslfe8U! zLP77J`So&hWPHYk^m95oUKJWv*|T>7d7rqxW$$d;KK3Z6J-3d-gh?x=-ZM2_twig5 zmqNM}(eYnK5Q@05bdHT^ON%v6jzYORC;Q2;wWq!_X#uu-RtTRqG;XeTqTkQOddb3L zz5wNS2xoYhHSOnWsiXJw22z%It$B3%Peu27WgSE$yX1^oS}v6lQM95h4Z3}C_JYy^ z3d$boYgwuEiPMzT^s*(EQ7oe8L;05g{h-FMOD0(pI(VFs&<%F0`8Dsn-~<3@42)Mj z9#5kkO@<@!(F4|n@A-0r?`V>8M5PCD{H37@f9w-3WRi`uE0Y8>axvBBcu)Vb{Cs8im@SuO(rBkMCmF{JLrD z3mg_^SHZ~j6p zX0#bpvKlmTJQL{y9;Cwlz36DD{ zX%~F({;6HRa>>;XqXV1oqNnCsZP?Sh>&zW0$oF>w?PKoWSW9`B-i4hI+xUtVc*F~V4>?CeG@-gVQ9HRrP?=Q8$hUKaOk-@1cW8${t{ACy7??CXK zaNUviO(t-`eRx|hrqgHvB2|XT);P*C?(N*kh!*-kn1VLzn5CU$S<`z28Nimya^%R2 zz|Mt1_J<~v0j>UkV^{e?~VoyVrbb~Z4B(7)>HXbebyqj32{EARO56GTb zn0%y`A{g)q>E`|*zj;%z1MF+nN$C-Etk_aKQ!y$@x4V8N?&*`l34xHjygWd={MVX? zwhA_618Y5XuIg$9iW3s)qzqj-;To{(wV@UCnO$Rp{*(URkR(O8LQ$3Kk+Rjuq-Gh5 zmPMpyw=k?T8N{YDliY2Tbixp6L0gN+@^fvju13Sc6HNV)qkoZ0SR`+)@iUC#a$CqQ zX)gg#oXuoe;@9i9_ZajB229xg{*#^nkSLa+yQ^a5Z44p2D6f)7KY7ttdLAi@`2NGD zN+GgB68JEf4-?#<3W=;mg(S)dSV=>_|FyMaCLsLKM3j${68S?-O;952p4p0gAT z!@tDdaU$NW)3VvsU`6+eBlvNQ>;+JAXpeJ3&e!V7^_>41L16-*)r`>CyAFvLmL?o@ ztyR6J=jzuK?A+%s`OKP1%ki0kV**_-d|?mkuSx7~x|0s4rd4<9uj^gAS5qvz9=5D%t$GlC?JRZ``UQYfq?h5I3tt~L+GX_E{zKunHgQDj*k+50wU4oi2DNLM}n*THU zeVIoWf5UoaZ-e|Tk#;;+B|T^7Cq=f4Lo0OrI&CH$IY~X>c`HK?ZaVq$TO}(u>_Xc2 zTDMfEJEA}Vk%T~i-tMHrHzNYVcOPj_2y&qDC63A$>S3nG_3Jfwd2mwg!&xWlCJM~2!k>%n7 z^2DLbtg+Uu(AvHjf9KWNchO3guCAvoot?W+TUj&pc);rX=^=4Q-i2;8YI`b@S(Tx1 zwh<#FtdtU*dRLQtyQZnbro2m4%u9T72BN z<&!hSd$^{@EPtoB`1>}Go2Z8>qV8(-6RZLGbLl*s!ekz^FF9{%_|aCB5-18Bjb#9v zsPl7f6Q=GIkSas#@iUE1x-BXyx5-RiLyrt_ar)eiwAD_K^=uEA>iisH3akkC$IWfiM2tvhupBb^|b`SrYZvv)o7yf^pdOAI#E)U24q zBkX_gf|13t_>#w%h7YDX<~w(O(XZFCN!Fm|p}Sd$uO%0Y1&!1<>nPvp*LWwx6#ONT z+dN8yz0sJviXUVACwig)D(k6cr-aHbGa1PBT=P_N0vJuRazo{0P{s2N-Imy!3(vEv zfy>;cu|wX8a=nG8wy;OLr?XpN>0vDc=l^_y*>(d7wI_B~%b1{n3YIoQ^{P9&TOskI z$oTgtBHqRwPmr+N>Q_wQdR|p~xNp5tOyX6&YjZOO`@T2qB}nE6BZOc+a7&@eDj?@< zb5Q;60^YT8)b$Luuqx9PdHO;>^bZNIpXSq)RVB7E#t-I-TaXE-Ua91aJX$L01<1k^ z$|I!guBk4j|I1govApyb^p^v-L*KD|xR3IhNyqN`>tNW#>OVDolH|YazQkvysWPN^ z?5fO33#Gey%{|`j`P=rlal9FS;Z4fqE7XSM z@Uv*CogLH8+n{Ao;(L2`>ltnbs8xPs>l($c_Jp{yqv%}#3Dk(}TyzU*C*C9g;Kj~; zWSR7+gM)*46}}Um$-NpVc3b`9qX~lCe<6(dK>`#$tCQY57N#bvwJm0~m5vqPV=p{^ zTQ;W-HBu8(=;+kK=Da(;VTgSpd|WnNPsA;&oi?4p)U7Bq-CI$R{~19rCPG_X+dcna zs?PXriGD|Cp>fF20>x+CGG9R>X}->|dRWThcu>Os&+uW{5U1;(A}D=wD`%W`xistN zC|C@)+>8^;c&Y$c0p-FU=cR1!-6D_-#qGP(ptVPMZy-ErzOKMt6YoxNcJV6U(_6K= zsj4mxPR|7pc?Yq;v5q$<}N_X%^@}l*#o8Nt;_jYgL1%ZgI+-<*wy~YVAL(_oNcYsU%o!I zCay1n;<|3H`gL{PBUotnX$jRM1I=}^uTb+Hsja+K=)<7I)@au~g`Qir;udi#)8=w< zubctu7u&9{dyitqkyRhrFl%cWhcO0;thf;TMx7eKi*tN!CcVC}x=Q3_*FW?)sY}E~ zzUBNT)FPS6eV68Rmw`;QY<$^!P?l+EUMq#p_La^9R_3GLa zt(xYbnQdgPo!fT@3V?OsE)}NB>{DXLBr~vKte&Cxh8D7Ip3;ob!GL*KCI})|FDYX$ z*N9mYcB0TMjGa0DgqZ3s7rEKt$}x9%VFiS^&nfpVSu_iOj58klW}0_QOP&7W*RpkZ z-?Nn^QCKCDgR_3^FKWv}f;Tu7T940_hMCN5Y$|FloUH^W;<^Ho|74pRtUfg=42rbM z9ipiGoPKw~z!7(Tw5UZbjg~)uX)g+&V#i>>Rc~gtQO2hY3-Gdd0Lw%rTNN2nCToL{ z56gUe^{6g%l0YZ9e76eMy>0$mA#N>D%E`Qr_Jh0n-=0GIE&HoZv2dgGxN`mz^$!Gt zcP3Z(0GY|{EDYG-r3t`qT^@C^w2+0i9+_99_30brjw@3-nk|qty;tA-+Kwopa`*In z$81~A(mTnWsov5WD8G)q>Em(LR6rJZ`k!BWM`+Aps~Y$^c*qqQ1vT7~jVL1Im$8Sziv__O z7Yr}6;g9VTkD|4VRQvuW+DnKo2;T`vCxhVPKUwhwI^o-W4oCyvtVwg<(Iqv}{icimyXFjzn0jg(wzXWHA&pN$a4;r0?efTN?mUtf4Z9_ANaH3= zL_~KYPgb-yoEomFL^pgx!-nElrMtxpL$ol8$LsfXnoP8&wE@ax97isy2117WwWc_O zsE?PC!Y&4!0-`~8?_h#hklW#b@am?N>g1m7_wECEV#WKdzYa>+x>0gJyV6Ldifq-w5!bsD1Tmcg zx%~TlQF_LIHWrdd>C=L?SxK_=YfZDNy+HoJ$QhA#R=j0^98I}55bV-_xFiJccuhmb z&h-cl{rZ0torfdT{~yPzuMv{HSN7rTv!#qP;%u_h+1nW*q*TV;A?K1U&dxs0R`w=j z@70-EAyNH4zyH9w`+VN7_v<+x6aM~+Tce+18%s3$!U2s1kJmTMaq$1WAAMH#an5Gm zr&`)f`<4$+#FAs3^~K-NCI9#zc{G~NcZ8%lS5#erxcA?#Sinrb9P!7Z^#tN0Hq3-O zt{14yJcx-k;yztnb1JJ%{;~j(ld!rD+K74-HqdCNc=?8IRBF_N?wu`LLM=OPc84)^ zC274UxnmAlWaA%UbX;S!Of<`F8(OB;+@NIsL{yFVhv`eAipUIz*ieflC%4OCvdfvq zST}xopss!6;^LwoBmLon*SuxQ78|hWI}Q?ZaGxhxe-G7hZ0&URp!IrkvOV`-UE<}} z*awd|1=Tk!eE+(NDOj7xtA?ALX2-7Fq*n0bI^Nw2=@-`NZtgC@z`{mDmjB)*CvTWz zq?&N=1uZd{Hk>|vq>p&f{t@JPVluk4P-T2S^utI|cT-$H_XHz_wxILxG=U7fg39;! zsP38eBhGHk^(v|mxT|DyT)QZxbbt}I3|UM~gBBFy4VAgwq+vln*oX2Iwn7wY)AX>k;a z+GzQ>yUFR98176wc)?gfJ}!JgN|%1EF4bEkQzmmn>A`(~UrzL%_PU!$6VJdp3LY1ra)xlxY6y0;*Ofb zP8o-j7OSvg#J6A=qm1UmpWbF2mnsXngc{y{D(_;xC9~A>`ZQfL1!|nCThu?}43A(< z3#RgEjlF##&0yLuq6G1T_#-bw!FHJ+UHk`8b+jr&uM=Ctv-YR;^n=+x;>E(n<}OP# z_Y|v2GLQny%U*6KSOIDL9K;`OQT=IRGc1v!ExO1jjv=pYK*-|fKz0Ck;o6b=VB1y0 zui3t3c$-9{6?l%>HlIYa-enTZc9;NIELDe^t_EQQ7pOf1oZ}bzcQxy@n5A5z0eB!r zmD1HV4pf-s&SV zC=T#xvh3|vs|EOB=8T^n`rj>jrf4iN>=TYQ)ly5l@JO1}usP?gM&5fH^c(l`rrx>W z7Tm(eQ$lA5do|wrL_8G0kmMi6r@te!qkP0D~EIcJ% z;(h9g&a+UXNm1Z$x2`K7x^XVH_9WOgq!|=tWw)*FOvYxZMh))l$Xf1^23zFU@s4Su zdz}*fmbW(dn{J$n^68s-iv@(h7U=udZ&zEzU#@QmONJh{#d2~ce7#gU4jnorCIJCx za6*&a=ZDE~TPXV$E7v3>HHBCVK;uzc$Y24)U_zIZ0VCd~LUS^b2FHKLX|S`#igB^^ zj56goD|q~!u+mi7I>(c1A;7^@L@T^D%B)Wsz9XP#Jcz$98G3#0G|?7UA|8jsf_+Hc z3sb+}FGo(J6;sC#Rk_B$CH4e}Pev_~@V*R@L9kT%&HOr=Hu2>u1`N@W-D2(-YZ56g+fZ2J0j26`a~WHbPUB17=ZAVJ=G_4G zOxst!_LuLn>fJ?aX@s3bD&vAi(P8V6pTb`K9Z7Uw9eJ$G?8nY`Ncwp*;jLMhcF~d- z0|n`Erb=Smftd++vb$>KBs`CNV&crE{lnR#k zU<&m8%5nwCwVv|68>-{tru#J@bE1kX+jXd03Kz4~WCcL#si{z2mk>duHvj`#@QELf zQ8nVdZ3Yu!K#v1ikF=H$KY*t3FxB;@DW>cTN!M^c>wI#dr)PO~?OZu2ISuW@3#C@C z+03LyM5_*`4seTd(H|`Oh>(NU7kX2cr{0v_V%oKM{l~Yb2Sxhe-`gjfYvD$^`EOKH zI#SEPbKY+>W^DAmELa6hpWf373=Qp%Rl6pew$a7`_JnR6aV!k+yyJQfQ2qrSl!S0~ zW3vq|yx;Hyp+P1bF3r7VX}`p29s}b)@#uEPNM#R@7?`|goJ!4Sc5IU1f(ibhYv(AJ zQm2HKIzA_d+E?3UAEh5EZC*uf?U|2|8s$E4uD3Rs5)a;)D`z^B$5lXlDvnD#x|I;v z6ah99>__;`-+-^*$E-$Nl>5O8ASU(Jp9*M>-pT+#J6|ExfY#*W&>AYL3Ukw&WUXL~ zCD&Q}(_MTcp`IFAL$~ICCsTvOvHJsTKa*elk;bxe1VfFzbymyf_y9}eVypfVBj6Tz zS0oJ$i#HJ&ghB?;U~a@YyrZH0Ounax?{4VSbG+b)cI)#CYQXv6Mr47&P#tk~a4M*Y z%!u$}(-q}mWq0PmwfD#~{6WixOu&BlFzm+lOQ;VAchr^028T2*lYauzXLKH($H|2X zTV0Mw+AYuX$b9kKr^yCChkdnJ8J(41Qu!Ivip8doSde_@Row(QP~KlP5@fOQWIkbscZPdw?a=MIptckJO;fKF<$X?xeW~vt6tsr^GR< zDh0443t9*GR|*c$o7@^Yb>tScX><@9>?Hf}?rSxTG6e$Msg?a@>{&|(L=J$O#1QjIeC~^YX1fA_lWNopK*GV`Pf3B=DdiHPq$QBvvVFod^R;;!`T*FktEWJ=Rvmeq7!U7< z(h!%4KiX!LR9oLlv#GtSueZdUspNeG(1ZXUtIteml49XRWO?A5J|~-YSd4s5zMU?a zr?}4xU2DV3`I+{S*W@&51{b=u;J8@YZdudy5yk|c(L_VvKmV7Ne3^sdXVOq{^$n6c3JE`!rzdE54g^0G&6D10n5bRD^ z1GGz1Dob+KTYgqsMs`oYEIz2aV_7X6uk@)Wy1B$k!Z~Y3#Ymo>rcEHV_p56g z-KwvUbh#ea16NPoLiah92S#cF<9jWH zf2fa>lhfpxx*f%B2L-uNTWws1V&ZH3LCl$F0)9RE9%BU<^px~squ+SOi*HHfWj%HZ zNS^e}rQa?o_RyFl*k$F)W^(xlMc9hcR`o~UERm<1JSK7J#`N2Wq-PfG_Wf27kI4uB zzY}|COGeiYsj=oRpvgi`e&yXj3RJ-=(kZh!NOK#7Zq+{)8A5uiZsB;YSUpk)s?~F- zVzRU&rvec#44ddGgE2z41{B$VDnY=p%#?o9Ndy0c%mJvdUaP$4@YaW4sKlKOPDr-`<|p5MP;!_jsi&www3GY z5XJi~U$jg`%w6qY{~aW<1Y8u(43b~wIHwh zn~_2A&@HFf)=T?_^dG`n9*lJlph?pc$d`JX@%1`=l-b|W7jmCash$TV`bG<(9miSx zBX>fCbqv1CxwNe9Q1RBIvNF|^@ro9zFRIj=IM63_m29s$oW5ao-9QkS%Q29;rh`?y z#DdsmvpLtZnGy6etJR&5FK~lI8Wx+_rbC1pTs|}4+281%b@bHp5j=}gBO(Z;65_Bi zx}=ac;`gRT=dEcc5FMangR%>I&wRMPCO$~wvGd9YT*+YV%sb;jDekQj`SqV|r0WG4#z4 z^lpF}7nqiRFoi;3U7@PX5j7qfBDol1Sidoqp+gpMvi9}mugbG0k$$EzeRb*nhT3;z za>t-Z%JylSR`S!9rK8n97l27&CrBtgTN=zvB_ScfnxqqOZT3n_S+czc-f_w@R=SHk z4jl$XjG|7dM+pV-c|M*Ph>HwYifg>NXyRA*x&muMdyCCE5QJsnUOFosbk%0av%bhf z(jy}SXio(Mf#PDfwz|E8g@*Br8!pZrwfBDnClODTU`HmXb@ME*Tl^X#&CEfLCB zmgnc^CZ}wV#4rMa`ers_?XM*q*Pzz%UYZ#b1aZWyR5lZ9b-heNgN@{zFJ-=BQOTf` zb!s$o+s4L*=6HWxV7foGyxFuo_C08L?H|3~VZ zeeg!nA5s|_Nm_#~op-R~+wX9%TfB$lK71gS&k((bm@KS6`ghl$ugOX&CKO%#)QT$f zfyrhtoR8F{X+1k+H0>Cy~vtdfzt52+-Eu#BZ+6>3rtZBaU zgK0wISrdA8?jfCkcnwE`A43#>p(C?()}JgG0ADP#3JNLAt$bDjJjl4K`^ z;nm1$yTiuz1h>FB|KC9ah=_-K5r@S^8sAap0v^MmSmd8@=cA`7e)D7;5mQ>f?6gyC zz2@X?3F`lD+%x2>b$nS`|3i+YcY`kT%;skl|Kz_H7~ScnIp4Rt1=Ky3FLY?vA%1XV0efU`KnkRykgAW)KwY_4a}Xd@yNX#e+NcT8!Gd>*n?$3s_DyS>?%T z;9457ddAe30$U?AOU0h@bOB7BT4Li&h z&dRMiHe^WGdg$?`IVPpg%k@e`r$Kn1D*-WG(_|NT9sx6pHl@?^RBV3lAE6*LqPlFP zbl>`TeGUV>5<%H1!hT2J+n)4fem)7@AM?X6djlvDoTq-dm%AO*x)QV}w+!_jqJ~;K z8W?g4e}tEL{?~0Fd^Ky?YdkJK7t!s^ESdL{(nOU#@n#&@KTQ0Q))*O z!C#h$zb`rzqRuHcev$FtPhNd$n=z8ntBj2|u5oPF?sGo`&FI@%011$ELt?i!;`BQ# zAJSXNg%A?G6k>j$5HkPOdpA2S$eA^v4^$C$zWzoyDR)S~_>*xd(RFe{UT!K>)1Y_Z zNo11ek_=KCQor>xsAJ&L#lMw$T@e23O&5a)Q=O{!LrkRPk3|lF7^Uz9MP@gS-f$-a z(cg7K$cOQ0Hw@sJ773q})&nPgJ|leeEnCW`l2jY)TWk!Y;^H7s(cNpP6pUv8_JoW8 zPP&fztd@T14WtNUvGPk4X_}_;s$~i0^rQV89&R?XT~U40&}c05cpY6vu$rm1^DWKn zlR4om`;h1^XpYv7lmgk@wkLM>W06l!jwm)4^PKq+FhlXib1n49Ntv!8a=D^c(u1 z!Z5wG9Xg>hI|hJpH4Dn+riSHLXSj-zpW%Edn&k z5(9`AC*S51OQwntEdU`UOp|-MI_{K{Yqy&1s+^A5N_TwQp*%m0Y<8cO5HsYq$0Q2a zTG^Gmd+IpD*Hv917ihoX;{n!UE*BHimRnp<=Q)_~@aNd1wqvi$?%1f8JKJ#wMISxx zjfvV(^a^*!A!oX$hTW)xZ7+7uqjlc5`j1)Fe}E9wp)qY6S-6%fPEMi$k z7ECM`!T~QpsmJbR3>VyoJmrIB=ol0$;q?apF2|XOve%=ApvDuF8@rEWxnY+%V-cw| zQQP9&pRXiVl$7?^g!T9)!c7=STgOw9y2r{(Gig~fv-_Kvxl2qlKm?hev`}pO-E@Qi zpG5GITLX+?8@?R);@P;xO1{Xe-C*}%P{o7*uO5b0tGl66ESI#I?)U?Y*Lbq$QqW|( zKU~br4F1Hqd##5RFwF}K6JNdh*nf%z>-SHZi{eyiDk&waD`=v%)jenh{q;j6(BH>5 zVqaQij}Zguuq&0vAVN>-fb-B&ONbu+jb{_%TXkHgTP^SiDkdtaD$^#lO~s73iksQ# z0rP2F8ymNd{fF`yRJQyr=ECp4bZ=E1nJ`(^*=?BSdj^MUGLjZHh(Ze-zdKf8U@39PJtvm2?ae zPTY9eepGuP>$FL;VDq?j%%k=_?QD=EUxmZs0=S-vaOOCL;sY53Wk7H1`w;KP5^UYHI+0=EXqHOgm5+_a% z_Fn~qw?*bue7ROO_V<;Ha_>9-kU9S$H|$%drKgX1q?zyIIc{R1^yKe#i=6{_AVqo@ zz^vBP-Gp7tYQh>V~zTK z*QeCo5(!R!C%`t{L7?R>BcbH#-+cPBWzstlUPpJ6D?&$vs*5o+kCRN?(pJ5uG`<%= zU1O7-jo3ae$clKDpNgemhO&HI%(N5ueN>*xIskvzG-Dvjv+q>m?yfqD7HgereL zgU9zW$Arp)S9M_hFI49=b+Ac=2q=$bq9&+gYbn@ z2fa@|bD?X#sOZeQF8d#6Xp0QZ->qZDzf)Sst80E?=uEV7$_#m2 zbX`rsdqO}b7G8Gl#@lD|ccUMODmul*=y(;z&rr}N^g01E+f{hDx1|^o&cPlTkZUN! zfHn0V(y)Uuwop$hc?#QYKn$NJBMRkM*~Bk8lAC-0^tuRw?+4AK2ZMWfhU!p%=dX)r zEp!QoD5{+M;hj5kRM==7P7}~;fL6ew6bhWGuzp~z6-JQAXd!4gXrq}?2nmMSDxfiR zRm)Lt*9VySB-L47o6zZHk?oM|SVNB)*_z}SvSI}WT)xc=>_;p>CboiPGKscd22dFS z^nT9|q;MHCYBJx?IoPPFkO3UNU*f>o7}yWQVedu2-Vx6I{nHAoS6V_EZtQK6*t(%D zK?}3VI`Lk)yl{yGoG+*=tS?BJA>g`0%_T5V-{^RpLTKS*9qS!!A>IiQqm>rGd31EQ zo%ECV-Wk0Qya*@K;JZ`=CIDB<2m(;dv=)B%b?ECVt&OCTL_)o+>yewCB2Yup(i)N?_d z-cgURYzCAG$dY|Bz9choWyLLIYKj|uf?g3_3P5d7k_i3#gG!#omYrvl^S_z-_tZx1 zP4`TcC=&Tbj7m})KVGn=Jl6L`@YF;iE6nnxlR73=yf z+2CG=m4SAOqF^FDaNY9#S^DIxNVm!wR^w?UDLNQDxlk9P?b(Yu{wObvkeC)4RVw$Y zF53L{qWe#hLCGJ?fop;f$1%)|%$CLAXWZqcMV6eoi}R2CQY(H)jsYA8VD{44cSV zxl`)fT4TE7Qb?F1P~$m@(^@q}7fnvX{dGPj2zxwm_}k_B3(YmqlwJrTm;(>P zYW?9Mc_G&MXXA~@w6B*bYuVET_1BNj=5O$ot(Y>uEz!Qr-X>^x2Cd9ZlO(6!I3M`q z7X7YaWrq}%-FnwMXSK+2!4ZMy(5dewOU7~?OoY_Y^4wBeU0_}+ag_Cau6au-^$0AP ztF!n)`6hE`TD$sXO!Kt6{h2FSO}y@eRZM=gw0f-9C+#9i9h}EX8oh|GhbkMtYyNV0 z`)|~fwW-GrPEr4E5MBCvn*nJn8rJG&>#eoHhm2nbK@|15?>`^)Y@$yScqqDY3{(pZ zhXU8YF;~JN;}KLr zPAAK91C;M6YO@f;(B+PM%VHH)Zqc}k_PoCBmjq(YnGRhS*xHX6_z?A5CF{Oe|D;}0 zh!VL+j#TcL(u2>mOC!_y!Qgqaer%#lhAx|H4TJf?8_4$4ZwFw|~ZymN|p~a~GJ2FM`0E zpgj!q^xU&%x#{M2C1ZoJTT0Rm+NlcsXyDE~Ye;HAn&`_Cq=KHEG*2b?>fP3mPJZ|> z*ld;UX=&KsYhd^~kv#c1z&6U^5O&}c@gwkaG?=Gmt{g}g)=I?7B6KAlbG%ZH?((v* zeA+#0mMTY}*!2+Nn}`8HE;6+JSISD}uN%aMw{YYA_J9m*4p@jP-H|oSUjz_p5$Dxl8_i$NV^R zDvJ_N(Xt}O2MVe+;|10lOUT!+vEgKzhP`x|kMNC(Yqn3qd-1U>2HJdoO|YbZD=l}V zDe_8wp>}lu@AeV$D1`nwg+o`7mF#G7f!-*H1J~Lc4$X2C2-B{yaiSV|U1c9vYb7rK zb5zr!0dhdL7>CD`rl>l}jMfmK;YQ5D!^LJ8MeUlx#macxo4FwE9Lk28d0*pc{DWLv zV9!pE8Q}v*Y9{I5$VE8lGWeKD=vrq_luMuMYN=D&|?NA%zzZPQnq2=h+n>ek5?WJ%*dI z-QlP|x3WERcx7*0g*A8(tZpB2mx4g8Oztxl$#qXPve)i|_&h7xl9#F|*IRS%#)HO( z$0u!{)4#AuQ|2uQ>Y?$gbZ&rgTwPT!I)b5&mqe54MX&#D-qp)W z$Yxhyd>LDKlv_{=og3Do3sZyF+nA=>o~Rbr17m20V!YDqN^#~x{IsbBDQc^!ku@gJ zn_aNXJ=yseFrAVlmhMLPzz3e$Vv+(J##b5@~bQ8Ov0c$DgC0tX93k}O}Eb*<4056=jn62S(aZNV&5<=Ny^ylZ8u{l$( zF0MEBdmd0$UHRLm<{EnO2V$RkhUn*thQHoe}DZ%VG zJ9%vTnCm0jd#vAji4OV*GH3~5wAC?d;&s8d)#?vod6kQAGLd{#Ire}Gk8FQkW{55C zIFqOqRej7#N0!iF%))G|i4~d94NbQ3*e%PS_XSw(p<=XJYKHebFLxK7bi1#8{5=}b z-!-1?WXP?SXU)WWL-!s7?_cfx=lQIyp`P`1k%4*!3Yz(c;{24ao=sIaY8~Hy0(z4CehI8n~Z~~6s+p7tzMH320kF>o2UjiQ7 z?r3WsN|hXc6<$&5Ih`pEwO-FUINk>j>Eh8-osaz1+>i>r@|y%gMt)^BMJ^r>m{~*^UvTt6)Fwx=0kvs zKYJP_lYe%XhqD<6$M;NIvfl9-c?LLcyn&Wrx576;S|AsXNK_iw)8nopO1^@G@e}mo z3l;ZXc4vdMN6_oJP5EiB@q#*WarOFA+u`<>Fk5%vIn65(9SHh_shwYsKm}vgJhonE zWORk;Tf7Gl4)Pi@7w)y*!`W9=fk7MZij%lc*5{ns_j-#%59()hC$T{0re@i{LbLQEZ(H_-qy1x9`OI5O4~w9cUsY&eCP(WhQ!Rqa) zt6I8Sb@h2{UjIEwzx_ISqamlLL^tJ)YC>ryQea#)>i8wh-U)*hNKU*|%yq=Zm`guU zTb(<(8Eio{1l^IsOWr5tsLeBsdMZpT4o8XAG*Q++r@gfsc)oh^eW!J{yH?wlB_lqM z&)@WB5Uo{l{c4u;6M6I4=zkga>IX*+?GEp;d93%mKC2E7y2%|xyO8{{gl}h840q*4 zTH7%@DpN3)W_!fPX1!heKvF2qrpb|OMXvniOM9_q{rL{|M`3nSukET(M=i=9IsEAhA6>lU_tm3^+G`4MbhWrVu+TeJBpx{?jf30(%Dg!#u!s^txf0h( z_)oyZ?QJsrT-KH+Z(}>&9M)6fQ}T(u@UgQ8;DUF=Tg$K!>wGjbdO7zG0T|rEtsTh% ziZISe0-wjcytEB!1k8?6WUj%1-P%M-Y#XEgRidlJ)Ni3JzuLI&yulwRK^eR!T5)Ie zn%SpXIB=iHSkD|O%Lf)2;UrQ9sgjq_u&I1>3WH}sgocXw{xMm(?5Yz*OhuP9sf3$+ zvpNQ?xif7%m(feW!eDz@&c>Kqjy|ZaSTZZ<5&`1F^=LrU`7v{$edDD|b48h$#|bHg z{+?%+m%Gnf`P8n=hA_ZJ(S)cQdtSe`hU-&glFs>ImYsXSM%PX^`XsgH!3quA+dL03 z`AjBjOh9#1|MFjhhz9l=Q|aVaMby@htorjhoGP~V;T_lBoqt*s*pi_4J)0J*B}CbY zx-f0HvsQpix^XJ0q=V`QCLhN(@UbN)M0Dw8l8H6v^$%}DQMy6J?SB{x;HEhUMlQqIyd_Db8spD$|2U9f@@C*Fo+an07Ah zifE-WAK;}cY`oIlcUhRLMTP7^BVqH4Infh0Sf~=GE_`Eo3=8g=5qM_FR%^B^bHMj z^IkqaT-n%+7&r-FD-p^W5A7`ixpefW#uL^NSOe~xEXLV(JQr2mXPB925FRLmGe6- z^9E(R=OLBQdV{lcZ-urgE+hN;HKir(wXbDP?Lk(AAH}Ti19(w)X$_@t2TLXN)}Wx;p&K1ChzdVex*A`RlCeTHl0q z%-zEFDa64w7qI&yJ$cvb>siebb48`bzglq;P+Iq>s6>j0B}K!=#>P7{MgyDnQ@ZG{ zwQQk84O!owlapxt32DOKEk7~#nR(j#&xv#}Gym!bU2E={?1kV;rkd2m$vL)eJtela z_s%_{C$F@VNl>g!`fASg~`NKU)B+eEBG-f-X*c!>03R_JJuTQvQK~ZPyzMxfScc}u4AL!C1gpYm!9clX{VJ%h*#{w!DMW z;jcFWmg8A3ih30u<{wp%EPGnu?Y%vADQlQ$g1}qK)}Bh0w4sbZUMGG35U>^lCHroE z4+?xm`MC7H7qvp*HZ#S`YOKQCoZJEbmc{BSoa&dQ(hb;*dhaVV_!OwL+f-Op%>c$c zpUF2drkZ;yt)VQsG3t#EbPJ_K`4UY_|K8eMZKe3ZRg0^Cy3LO?F!E!UVQ=n0OMD6T zdi4%gTsphGe>l?3rc~luVJU|AEG1$g&|E7~{jiz0pjPzCX-}SvC+K+y$0L?&l{;l! z1hzP%^qfO9&BQO8r|2}H{^Q@v*QW3)oR4~G49wz@2lsErM`GoIX%cn3doe{dSZEsu zBgHUD#alz=%#p9jKZHeuC*%8}%(m%RF&^V7-K7M}EaB@N*FpK}Ri713D<(8Sr0ejwcSl#+)8zt`*<b?Z&n+n)nkRe{$xFAZXYT}e)PpH^i&9q?rSBMgBi~j`bk8+EmQ?DrgLO+2reL zXDRepHmjx)Vk8 z;f(OdmHe?cG3NRB!y`_&a9Mp0p-3#|Of;fV{#PzE@8(DM1@Scc_iF0JA2%>D;(KLq zJGbGqwMgW+$p=wg{x3~mMjpSaliW%fE<Y@IpleGNib98w1;-$bZ8o_9Hep& zPuCRGI+vGkCRB)^s7vIxvx~Mtf_ge1?@ZrP+ePFN$HufieG|zj>lRE@9ZeT-n$T@7 z6G{c^D^b`@FT6W=)?ni9_-1r}d6|*;R5jx^q23BGNv&tOsbVp-+gQ#}w2#U- zk%U%6GpqMk8bl8#;(xDX|l-CrKeF* zxib!JV{0AUsGjID(a^mvKmUJ!?~m8{%rD;wl+Q)%O;a%?mUT2&Uy_XwD{C?YZaoP#qV>J#a2qp=^-#J68=Uur%n$vDJ~$LA3}O|a`@qPv zO1%b+&0|zH#0!|fF&Men%wfw@}Dk ziBUO8Lr#UnyJ?2n*sYiYSItR6))R;Px~Bk6y)I|yAo|RcKLwxcYHyyEV~-*7>%lwg zvKkVZ-OJy{6N>1If7pOaRQYzR>hD-;*@OdaX8Md9R;1?70*s%8)<4-*$Lss{(_0~d#NNGqm>(?%;&vjAvG5LT z&tKveA3clgloMU;Y`GO!bX3w1Ag0rywv?vj%cu2Ihe%y4q*hc`D`+Ay3krwHE@8R% zRs6nc_X@RqRLR-TBZz(Z7>w?7%w#6oBqyRjmiPQbw2060jP-Aj?Ae^CKJ{^a9P%iy zoc`j?JL!HB>}oLV9{OD{K_o-=n3RXQAE=GBk0B_q5(7+|}?&A_jBhIX9IBhL98g zI}v!*SSBjJM@>#14p0;$39MG!0Nex{nSFIIeQS$I*ARdI{yw!66Nm6Kwbk^oVzjn3?Ig>em62x*b)iN| zDz@}c6ILzSM1PD{fk!9E=!)(~zgGTVvI0FyhnhyaqxGMRF7WU8%ez#^aE8x-f?HV0 zAu%esodH*-pMGfnq4QmOq6Y`!*68FLU9lXsaKN*<`txVj>8U=#uW~PEV67&S@M!jB zcHk`?(pSLbp| z!?}5U{Y6_kGKrTxzi?Y@2}~Ie9mcZ=m&=nbivgb-`eq>Q#tdkBfm%rSsSrnvB7HNi zV=rzzl#lXFyN=;_}Vp5K}QrQrNS5YsE- zVsAE6XkcAxXihpmjf*n|yek0_%um~d@EOzJtY+x*q?Xq>P(GsL6XITcf&l@O<8eb@ z7Pz)VV3W1hsH`lI@<2E8-6Ru?UttuE(5qP@3t5fBb!m?CySo@HC?Tlid*hA*?FXFg zC*L`Xq<{gRkioaCqX0zY>IcFEf9Yd!xASO4L&Wq&yF)MQv{!mn2$y8p9>#&X26P&&nunMAv+8mzn4yKasC% z5IsT0y#YDa#o4 zDVp)M&fXeTpIR!&RWP||9C9Hn@ zu@xqLl_!jqMADRqp+!Q_u^>Jfy7~rlS_C{gf$pZD-W8HTdpW<_rY+d`cU7=Hc=D zUM?VqKNtn^ocWxP9M88k#N}&&)g$yjl1&m;+j_l# z&Ea%8>7k3Lkc4WM@h+dkZ5U>efuvu5+O)#T7qTpOXol+Sv2DUeD4r~a2gN-;t;C_C&iix*+LG7Wq z2m@;iMqd8&dj>aoVvP9sBiy{K?S13cDR0lciq~>(DUTi*xx38vrQxyhlA8RaoHf(Z zqIay9d~ny?4r#0o`C@CBmTg1C9*3V9HaHimLM+jzurVp`uhsSbqJCsAnLxp#t(g$- z;@_)#DloxkwA%?u4T-+2hrvvk(XM7{SFd^2_MZHrq*;CutFRoJ($@B0`}tW_;Irq0 z0zA^(3F(Q#3u>!IsHGe9UKo(7-Vu2$aNuA4zAM!wc22VXxz0 zo$gq;&+Fj&+icM6UAAw*&`B!{#ML?Qk$7zyc`UhB?;ElT95r>_{{VGCioUw8MH$bz zUg|N41;ehJR)TC5f9Z=PR$yULH)O#6%5jI4NQgyG% z&}oJ^7Y4G7#*3Ph@WyR}j~oya#ld;Gu{?hAf@jZ8$?{zKHYy4>N!tKTI5yjIM?0m& zn1r&fxwyEXszlkbvX07H^2-ax`%_|*5vMs(nqW1cG}%bBDI&K`AQeGq6KkxhLnF#b zr%((JzzS|>TX~e*nx+yRhxf} zS!PL-mLzUSOd{^E+Oeq$Y~xt37rguRces1|9+NBs*N|lqQKUFIea>=q&bC;JzHMu9 ztz$Z$^UD1<+21>&u4=q1!E0;_&T8;lC^g;_2QRlI&c!+&gE2{1AQ?tFHAHwK52xx0 z#yf5v9ix?aqD4kAn~qS{ae8_l9A|eJZx?ioHo*@p#wbHO4k~bIOj*=iUaoK+PS4I* zuSDb{NrcaPbhyuZ@4w#*yeuvkEZ3`mTg9Pc9!Tj#G6!#6fF`8G%CiikG%92O9ge20 z-)RqY_`1Iucv1FRlTG!Xt^*^S_iQ&?PG6jHvk;FNpTrf%(rt_S$;Jt`SmnBtMkwrN-ZrtML zuer_Vv!7&~=6v-Rf02`u6B!(6S}raxIXu{t?lzLi#73xpwh_JOCMfX(PWHwki;qD$*doTZrWB{bD_s` zqc|3uA|s8p`COW%i{&y*;k8tCg;t6z%f!K1Ls6DtNJcQt)>`VO4XsuBjY26EbdwDu z4_P&m4X7yCtT%W()7gY1iJ8tMD6Q5a8@b&|W2-7FpQ{=ixnLYbg>kx zdC5{;9|EO0;!w`utuO^-WI5@5ykZlRgi&GNf_D{V-G-^b-IP-wc6+>c_eXV+*{cqF zlIEFjSX?YPJ3Z%(H(%ispLmP1EP4FoS#S%Mtgk3a)+=!{IGW6u##36|vZ>cWE>T`S z(nhMHNO;t)b!ffA_*&(#bwgXpcy**Sby@L=w?2)xif?`GYaAZmqOL8Q)so40LY8I1 z3-{upuvu?Nk|tDlkxUD&*H~-W+dGi)*eL49*j2z&rI~E;uB56&Hw5MS@>W<2jocev z_@CXWG&-!GvLG_jVA^cO;zwwPF(3w#NffcED=xPeBpYEO2*xh$>x^7r3 zmcmWXbAgu9gi)UNN@j7KhTsaT<$|iJgkRrUs;UC-v9@J8or)HMbL1ltH{S*W$}AND zn=}XM7|HEAMH-DsRM$|JOn7*BG%_gq|FhGw%xd(er(L^)|H zo_t<`^P0xDeYF|UM)*dt-4-lXB8V~Fj~Pu<;vC|!$45q}V=c7Xf~N4)1yoy)twmkT zkkHsDh_NV)0^i0oTZc6eMS=@OMg|2Y`9!dq0A1MDljxLcWvMPar|&ITUsOQE1N#n} zi#5q4N5wjbl7vpGmi}rIiJ-Id$UHoXG|5pIYTMv!yK5jAp~q#(1Whcn`;kK{5wwsd ztHpbZNh{`)JvQgh`1ZHH$=+njd^VS?Q)^5jqSUF)u&%&6;WI|ckf#}Olu*}}+BIyp z1*1_;Rn@%z-~p@kmO3yCI#HUYZSX#&sw&o-4N(+vbaWsc@3q)yi?y|(Y-$;93*BDt zEUvYvAXjM6Xs0knF`rIIvz&5UQb#d95zM}-+dvi4eLRK0Ubvd%4n$&hUw46fwOsS; z>2r<__qccO4j=#cN2sfclaup)a}^qzXS=P~mNok~rntlt)e&BaK)JUqwrNm_@73}0 zI3|wseiXUdY}hUrY!^$iOz_e&WJo4X`QBgggN(8fU;Bk$;7dREGb}GIxV&5t#}PM< z4#RkA!8jkGG>kGa%WSPBP1C+ig^&=)P&c-zWiqZC5B4piEW;R0-BgT6Bcdp#D7QR( z_#RbRG8#{qPG{J*WjY>Xon^D#l4p58h?Hds)7b=PTfyL~lDe)rJrh&b&1#Kng?*8x z;>cWtY>;3eIh)NS0cdK9s-)N!EEfx$cO-Gb-Mg=Fcyt4;H0KxRJqByrwrAk%?e8(2 z&DaDXn$c)XQ4}O;Cdq2i$7Zt%RgMftWTTAPY$9Su*7pi$b=^>w zCClZK?RHDs2DcP1Iu=#cqG}I_&`*?vK@ioEctk`;ROb{f&=T9GqN%M&(ppH9oT3ms z+d4;4iFlXukS7`WWX@!^Pn^X>Q6^K6zGbyob9#QkWW6EsP8wy#rl=;R+SI7l(X1?S zrcsH-nF^IS;?&@LER+!|v@hi}&IRF)$e<#FjuhIcFg7e2zDkQspLQ}S<60H`lqB7c zeZt~w%X?pa&gJ6`wv@>yyyNW28LNvGah@{Tn=m<;qSLrnE{u}|qZJny=Zr^tVx#WG zY)|Wm*oo__4~+@w=2jS;1m^>XH=a037^NeO5m`HL8(g_0OA^+tr7Sk6$rNW>+9n8q z=qRW!MZIHy)+R{lWyDD=3nXBj+l@50s=AShr^t}SN$&yx5XUKbo{}aB(f*9}YR&1{ z8F`*@bacS}{sAYa=RA7yv=?u2K5&Zz_Gg1-b{rdS9M1XZhhJl{-0(OkMHwZ6BGzrF zJ6G5)>;`V8%w?;-{Jl=@?Gs=xP7f!~Pk48nGvAwY@9u3@mrK^GE!(1!4bjP?X&mcK z!Sry%Y;VF?Wi+;7xmnZTFd8DQF+dtcq>&+x49Y{X-E#Wm3GaUA+c;;rd+!yz6+H3c z@`8iC18&~DO;gw0zIPuyeDxQ;#G@w_l7KcUi7fE?W68*eLgT+>LC83ea{s$==c0hAK3L_x9(EbQm|s$cC&VX8D-g_g-bb zcR*`pDsR1A^ZfKV51%|_v00JjX$ZVdp><4TQk36Nl`YB}+Qy(0k29JmRm4g(L2cDQ z6A=-iqBsOm8OIbml)%diJT$FhF-t_Dy{L^Tr-@=IC7Y_|;>nh`zx0UZ(+XORMh8Ny zkg2P6O|hxiEVooe#s2L>vPp(l;&6I-e#+wq@3J>P5?gj;iYtl?s?{j3rA%vNoX|Rt z4Mvek6brFDPRP=nSVw^n@2Hj@;~_B-d76QDTwY$XSS(pxu8E?gr_C5+P^}d{XRr)! zYKxK)5z%!8rjsdX;ZrtE%Vr}QvwM5{TwY#aoj517ZB1DgJbm_*rfzxdwfo$=e;1tQ z>9glp>xko|x8rfn3Rlwa%BMU_`RGSJ%+2FNs;VYU6N+ss3<51(d2bz6(*Ppq?YkQ_ zL|fmhb*Ua<@B=_thpD!rD0%SSBNU3)UwcKgm9v~}Q3p6l6vA2yWocQh3dZvpqb#Pe z35{*3R!g*V__jtxDau(4kZDC(RGdG1&b!}!n`e)oa&+SeLuiJz4O$!a_l`*81f1}b zN23WJdFx}$XH(XzCFkcN<2fE>Xbp?ig3F6@Y}@eKYp-LB;?a`_RF&YGv)P=(qa(a` zoSmMCOl4gW#}VW4SQ=o7jG&*Lof0RSgM$N(Zyb~78JCwAoSr_%L?-Bvv>e|!CQf2b zPEK*oGM!C0zIlsLo>Mn1>&=G6<$^R3OZl=WL=+s)(cuy5@CLO)5#QV42#8O zui+af5%=!h4cvHv0xmBvS+ACX{opw`H~_RLaitk$S@7_|13Zvr8FeG@Sy>irw` zWW8E}x9sih39r9xc>MG^PoF&HmDgV3=FM9qNycP46-%#>RAhOM)`qGU>vm@yaU2EA zR5D!^Cp5G)g={)?C8nL17iTiY-8N)-#@WSL@OjHfR02VfP2@gXbSFh=G(L`ds+x5I z|0PKr;1Ju3KZ&S5QhCR5IFF*+&^d(=hFsR$E#v8wW#IR=*3wu@?G%SP!h6H{*^-OP zb1s$_oGs2cyF6pLx)e^d@}6i=&)u zI>H1hhcOC_!y8davSm#YMGzaDmG?=a5ute<4B5aD-4| z^X|Rt$9I!7=El)JdovM%uc|tXb<$6@<#|SHMLDSxLMLom9j4on%ffir)ppw;L+~E9 z+md(RdBEA}1xA}dwhuI>M)0@HX0(lGyRIoWHIwm-ERn@=xwxcQugT*KTb49xgH)Y~;xv6bVo9^16EwHOWxUaNZp!Z=RD(2wWVt-D+#F^h{+7MJHDVHn9Kl_oKh z@d%}5)Kwdp&c>u^#&kR(&l8?Kf6DWd=c1vk03D$M_trW~mZpO37A2d_is#Rtk|YUL zU9&CMpglKlAIm6rmdjAcbi#BtV>+EOnT*+%1=}+b=1G-DLX|18b8 zIKQB78Ybg0lj(%XbW9Y*+`4s(&3eUlv!QNev)kL>$D_D=@19JghWWRqwHPC~ca~+` zIKCmwfUr@DV{s+c_KQn4n>DNTin1(8!lYSQZrN-$jK?E9j_r1X)|%;bLXsrpqmf{{ zO-pB)BNdtpn6ANEPZFnMs}%h3>Z;xe5_!=o5eZEZ;?l+wd*NRzuY27R7tZI!xQ;=LQ@MJ zcWE~1&{Po#JRQ2gzaKw(5_XwZw^hyBSxb<_>VOdg}@xv z294T~DbyVv<~lF1Us@cd`(mgo(9QL${ulyPEhv^rK-0uYB$UF$$cXbOA)h3~vB4`( z-3p~EP11fg-{?q6MC)l9kt4LN6G$c-kt7+TY{G0Z7YlD42|cWCsLE1wIIN|qO4_Ev zIa#El@DW7LA&lilVM@~U7CA~W(5cluzOA+Hn~WWKzw`O(ey0r-s7}F(z|0WZQs8?B z-nQ+gz^v;vo+J_EkL=erxkS)r^oP2JPs#6(lr4QZP7 zer4S?HIWI8z)p)eNKdwwj#k+D?rGCG%jkZ3P?~l&Jc3TJlSZCoq4IBaB`SnF_m2o2 z^nshU5m-{I9v0MJqM}{=ZNYVu7oeYB5K>hPA*1Hg>!+rPN-~UlB6bs2vowuS}%GF==L5!wLeEI{? zodKfm{ih`GhBRJ3(TTUXeo#)W_Pw#8c;xTHP= z-ENcET|C9momPj7sCq&1;mrF`2C#z*WDGN$f9LvH`K~M9m-(FxYuE(4^KSwNRvX=m zvOox^R!So&`DHP5O#7FF*6DUBse?4h6i*|?rb{b6xSUL$Xk(dcakxW5$)rapk*l-Q4mB~aO0-~oAQKy#5Ei&NU&V z{$6Ew-MUS)4>}sXi``dVi@|&O!Ob}Q9R8)_?e5_aSKRQPzV>yeGSXeg@VpL2>o+Pl zyl1;3Ec-#3N&b^1ot*F{%oy7xo}fi5H+g~_U$GshU#41%)LCvcfr?#qvPOuR9GC{ z=GC9KaDO;2zvH_pxu8cW$M5^!6);5yNy2V%=stVY%E)`6Kzm%sHoL>`HnZ!&w_jIR z0`Fjhxe}-b@#w0?(3K19yKBp?0o8r~Qn2d3x%z@H2^RJD$JGt|%4=W0&#oWhpouh; zp&SO^{Fok-7j$=mv2O7HF4K& z{>kZ4i^Tez2&zn?d&rNrzc<6U!rtL*^U2 zzq*@c$H}v_HV9L9H;3;;*G0dXP7_2-IMKmLhh>|YwMwmF1(*fEDJ$DI|{S^;ox^YCt z_IjSGJ5kmOrrS2yx}t6Bpv_QY+XiPF@dWGBy>3(NFf8zTP|{qx+5MHf)HA#->jgMfz#_9)@p1gNJ^swEy_y5Qm!$_ehJy*M{3qfo6H zWF6gx5YC(11zmiorb7na!w}b&{1rj*F7Sqm!&!|p9%UuyqPmiQC$`hY#_n?{FLHk` zmDhc6)PwJbl~J$u8z^qOO>QvCcQx>ag}%eCKRCdAKq+%&0q-`~4_NI3tiE3h!=Den z>Ywg>zkys2yw_ojK8SR|a(KdqpHp26x_Sp2b-(?A@%4i;_YeA&VRgqYc^xK*%YN_Pe0lVa=Vr)9~8+!FlMzXP4AmJFe@SXAhC!uLj%h=+y2W^4+nA z3b9MPBBf>FUHRJ!^~-f4DjLvUgwOR5Vi*M6Yr&R&k@!CFddC1}7-Cc%UJTMdH>fbS zX`)Em;B}da>LC}Q&xD{G ziM>h}kh_~kdA(ZzA`b;lf^XMQ(?+4~)yCNF2J3Eo)i)LU8;USN*T;|GPd2=1oyX~r z)rN<)5>h zuk8bG7l?LQ(e==CHM{IG+~IGlYr*vc0&d?I7*tWi`^xPMM_qs4bZhHn47Lw;SB~w2 zFzo@>IS9P}zy5q+)_c7==+DE|EVz3cJqY@GSV><$hC$__lo+D=aCZ>0UDeAe?s_|Z za31=Ehut|D!XDlIf2H!g29@jrZ@6sTI_)+Oy=%nn0&iHrIE~lcj-f+2i^xN2jWQmz z7b;SuUJATG-&s{&o=->;y>&rYY1ots7bz?-uO$^z%AfszL|C<==S(-*B}v06X)L&-{&mSt_f#%mO|ae z)!#$I6+Q@2N-2CNSU$*juT)~;c-$cC?E+hm3JtSfcAL$$NU}T5mkaz4Dgp+9Rqc*? zfOYJG{|>hcM1fu4?e7^sXvAK{e0LSWphO;Q0>g869n&2KyKcj|4mErbbg_Gm`X&Bp z5d8h_2I_-oNGiN`D1WWlx;vOFnfMMP>hAAOuzrYrc5gpua=LIcs4kP;B|gKyy>q*- zhe6j1oS?33VDy9oWpp2_I@BQ2O5r+O*UQ%$6;fm+%0AkH_DrV}@^Q{$BRtc-$%euK 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

FI83asDe-?`bjBI1YM#Du)JX5iTXm+A2 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