From 9273560761bdd2c32d6a06954c5f9055208745f0 Mon Sep 17 00:00:00 2001 From: Muhammad Umer Date: Tue, 19 Sep 2023 06:26:09 +0100 Subject: [PATCH] chore: App Nav Work Overhaul (#1715) *chore: revert app nav changes (#1685) * chore: add indicator on tab bar (#1687) * chore: update learn tab icon (#1698) * chore: add empty state to my courses (#1697) * chore: add dashboard header view (#1705) * chore: Course Dashboard Error Screen for Non-Upgradable Courses (#1708) * chore: course tab bar flow changes in course dashboard (#1707) * chore: add error view on enrolled courses screen (#1718) * chore: course dashboard error screen for no access but upgradable courses (#1716) * chore: scrolling behaviour on course dashboard header (#1723) * feat: add new error screen for outdated version (#1725) * feat: certificate banner stylistic changes on new course dashboard (#1727) * chore: add scrolling behaviour to redesigned Learn tab (#1729) * chore: add collapsible section headers (#1726) * chore: resume course button implementation for new design #1737 (#1738) * chore: fix deeplinks with new dashboard (#1742) * fix: fix broken tests * chore: discussions deep link and push notifications support for new course dashboard (#1752) * chore: update status bar color to match course dashboard header color (#1754) * feat: show shift dates banner on new course dashboard (#1753) * feat: show shift dates banner on new course dashboard * refactor: improve value prop logic in case of embedded value prop on course dashboard fix: fix fetching of course price * fix: fix course share button on iPad (#1757) * fix: fix blank screen on fresh enrollment with app nav work (#1759) * fix: view showing behind collapsible headers (#1758) * chore: unit and component navigation (#1748) * chore: handle user interaction when user swipes quickly in page view controller (#1766) * chore: incorporate changes of course price and currency code for execute api in app_nav (#1768) * refactor: celebratory modal layout improvements (#1767) * chore: handle landscape for new dashboard and component navigation (#1769) * chore: address app nav feedback (#1772) * chore: fix title label constraint (#1775) * fix: revert of fix title label constraint (#1775)" (#1778) * fix: fix unable to dismiss an error message from course list screen (#1777) * fix: fix for subsection unwanted collapse (#1776) * fix: fix crash on new enrollment on course dashboard (#1781) * chore: expand next section after a section is marked as completed (#1782) * chore: update the edit screen title to Personal information (#1785) * chore: update shift dates banner on component screen (#1786) * chore: improve scrolling experience on discover title bar (#1788) * chore: handle header view in video block (#1798) --- .../Pods-edX/Pods-edX-frameworks.sh | 204 ++++++ Source/AccessibilityCLButton.swift | 7 +- Source/CelebratoryModalViewController.swift | 293 +++----- Source/ContainerNavigationController.swift | 19 + Source/Core/Code/NetworkManager.swift | 8 +- .../Core/Test/Code/NetworkManagerTests.swift | 4 +- Source/CourseAccessHelper.swift | 91 +++ .../CourseAnnouncementsViewController.swift | 22 +- Source/CourseCertificateView.swift | 98 ++- .../CourseContentHeaderBlockPickerCell.swift | 176 +++++ Source/CourseContentHeaderView.swift | 304 +++++++++ Source/CourseContentPageViewController.swift | 76 ++- Source/CourseDashboardAccessErrorView.swift | 245 +++++++ Source/CourseDashboardErrorView.swift | 171 +++++ Source/CourseDashboardHeaderView.swift | 397 +++++++++++ Source/CourseDashboardTabbarView.swift | 233 +++++++ Source/CourseDashboardViewController.swift | 3 +- Source/CourseDateBannerView.swift | 10 + Source/CourseDates.swift | 2 +- Source/CourseDatesHeaderView.swift | 2 +- Source/CourseDatesViewController.swift | 21 +- Source/CourseGenericBlockTableViewCell.swift | 3 + Source/CourseHandoutsViewController.swift | 23 +- Source/CourseOutlineHeaderCell.swift | 158 ++++- Source/CourseOutlineItemView.swift | 58 +- Source/CourseOutlineQuerier.swift | 11 +- Source/CourseOutlineTableSource.swift | 548 ++++++++++----- Source/CourseOutlineViewController.swift | 73 +- Source/CourseSectionTableViewCell.swift | 53 +- Source/CourseVideoTableViewCell.swift | 1 + Source/CoursesContainerViewController.swift | 81 ++- Source/CutomePlayer/VideoPlayer.swift | 10 +- Source/Deep Linking/DeepLinkManager.swift | 49 +- Source/DetailToolbarButton.swift | 12 +- Source/DiscoveryViewController.swift | 2 +- Source/DiscoveryWebViewHelper.swift | 89 ++- Source/DiscussionBlockViewController.swift | 8 +- Source/DiscussionTopicsViewController.swift | 24 +- Source/DropDown/helpers/DPDConstants.swift | 4 + .../helpers/DPDKeyboardListener.swift | 4 + .../helpers/DPDUIView+Extension.swift | 4 + Source/DropDown/resources/DropDownCell.xib | 38 ++ Source/DropDown/src/DropDown+Appearance.swift | 4 + Source/DropDown/src/DropDown.swift | 219 ++++-- Source/DropDown/src/DropDownCell.swift | 55 +- Source/EnrolledCoursesFooterView.swift | 187 ++++-- ...dCoursesViewController+CourseUpgrade.swift | 22 +- Source/EnrolledCoursesViewController.swift | 87 ++- Source/EnrolledTabBarViewController.swift | 69 +- Source/GeneralErrorView.swift | 195 ++++++ Source/HTMLBlockViewController.swift | 53 +- Source/Icon.swift | 11 +- Source/LearnContainerHeaderView.swift | 79 +-- Source/LearnContainerViewController.swift | 91 ++- Source/NSError+OEXKnownErrors.h | 1 + Source/NSError+OEXKnownErrors.m | 1 - Source/NetworkManager+Authenticators.swift | 2 +- Source/NewCourseContentController.swift | 328 +++++++++ Source/NewCourseDashboardViewController.swift | 627 ++++++++++++++++++ Source/NewCourseDateBannerView.swift | 138 ++++ Source/NewDashboardContentCell.swift | 29 + Source/OEXConfig+AppFeatures.swift | 8 + Source/OEXFindCoursesViewController.h | 4 +- Source/OEXFindCoursesViewController.m | 20 +- Source/OEXRouter+Swift.swift | 164 +++-- Source/PostsViewController.swift | 20 +- Source/ProfileOptionsViewController.swift | 25 +- .../app_update_image.imageset/Contents.json | 21 + .../app_update_image@2x.png | Bin 0 -> 17928 bytes .../Contents.json | 21 + .../dashboard_error_image.png | Bin 0 -> 25824 bytes .../Contents.json | 21 + .../empty_state_placeholder.png | Bin 0 -> 34832 bytes Source/ResumeCourseHeaderView.swift | 68 ++ Source/ScrollableDelegate.swift | 17 + Source/TabBarItem.swift | 6 + Source/UIGestureRecognizer+BlockActions.swift | 35 + Source/UIViewController+CommonAdditions.swift | 19 +- Source/UserProfileEditViewController.swift | 4 +- Source/UserProfileViewController.swift | 10 +- Source/ValuePropMessagesView.swift | 6 +- Source/ValuePropUnlockViewContainer.swift | 2 +- Source/VideoBlockViewController.swift | 35 +- Source/WebView/ProgramsViewController.swift | 30 +- Source/ar.lproj/Localizable-2.strings | 34 + Source/ar.lproj/Localizable.strings | 10 +- Source/de.lproj/Localizable-2.strings | 34 + Source/de.lproj/Localizable.strings | 10 +- Source/en.lproj/Localizable-2.strings | 38 +- Source/en.lproj/Localizable.strings | 10 +- Source/es-419.lproj/Localizable-2.strings | 34 + Source/es-419.lproj/Localizable.strings | 10 +- Source/fr.lproj/Localizable-2.strings | 42 +- Source/fr.lproj/Localizable.strings | 10 +- Source/he.lproj/Localizable-2.strings | 42 +- Source/he.lproj/Localizable.strings | 10 +- Source/ja.lproj/Localizable-2.strings | 44 +- Source/ja.lproj/Localizable.strings | 6 +- Source/pt-BR.lproj/Localizable-2.strings | 42 +- Source/pt-BR.lproj/Localizable.strings | 10 +- Source/tr.lproj/Localizable-2.strings | 42 +- Source/tr.lproj/Localizable.strings | 12 +- Source/vi.lproj/Localizable-2.strings | 42 +- Source/vi.lproj/Localizable.strings | 10 +- Source/zh-Hans.lproj/Localizable-2.strings | 42 +- Source/zh-Hans.lproj/Localizable.strings | 10 +- .../testCertificate_ios14_375x667@2x.png | Bin 245376 -> 255939 bytes .../testCertificate_ios14_rtl_375x667@2x.png | Bin 246453 -> 256937 bytes .../testCertificate_ios15_375x667@2x.png | Bin 245330 -> 255887 bytes .../testCertificate_ios15_rtl_375x667@2x.png | Bin 246433 -> 256914 bytes .../testSnapshot_ios14_375x667@2x.png | Bin 223476 -> 223613 bytes .../testSnapshot_ios14_rtl_375x667@2x.png | Bin 224067 -> 225952 bytes .../testSnapshot_ios15_375x667@2x.png | Bin 223445 -> 223564 bytes .../testSnapshot_ios15_rtl_375x667@2x.png | Bin 224060 -> 224157 bytes ...napshotContentChapter_ios14_375x667@2x.png | Bin 48466 -> 49500 bytes ...hotContentChapter_ios14_rtl_375x667@2x.png | Bin 49334 -> 50263 bytes ...napshotContentChapter_ios15_375x667@2x.png | Bin 48299 -> 49303 bytes ...hotContentChapter_ios15_rtl_375x667@2x.png | Bin 49274 -> 50175 bytes ...SnapshotContentCourse_ios14_375x667@2x.png | Bin 230683 -> 228289 bytes ...shotContentCourse_ios14_rtl_375x667@2x.png | Bin 230616 -> 228212 bytes ...SnapshotContentCourse_ios15_375x667@2x.png | Bin 230638 -> 228244 bytes ...shotContentCourse_ios15_rtl_375x667@2x.png | Bin 230570 -> 228168 bytes ...tSnapshotVideoContent_ios14_375x667@2x.png | Bin 77544 -> 78787 bytes ...pshotVideoContent_ios14_rtl_375x667@2x.png | Bin 78306 -> 79715 bytes ...tSnapshotVideoContent_ios15_375x667@2x.png | Bin 77522 -> 78640 bytes ...pshotVideoContent_ios15_rtl_375x667@2x.png | Bin 78287 -> 79411 bytes ...eListDiscoveryEnabled_ios14_375x667@2x.png | Bin 359049 -> 348922 bytes ...tDiscoveryEnabled_ios14_rtl_375x667@2x.png | Bin 359407 -> 349133 bytes ...eListDiscoveryEnabled_ios15_375x667@2x.png | Bin 358915 -> 348788 bytes ...tDiscoveryEnabled_ios15_rtl_375x667@2x.png | Bin 359272 -> 348998 bytes ...ledTabBarProgramsView_ios14_375x667@2x.png | Bin 353501 -> 35147 bytes ...abBarProgramsView_ios14_rtl_375x667@2x.png | Bin 353844 -> 35576 bytes ...ledTabBarProgramsView_ios15_375x667@2x.png | Bin 354089 -> 35150 bytes ...abBarProgramsView_ios15_rtl_375x667@2x.png | Bin 354482 -> 35514 bytes ...BarViewCoursesEnabled_ios14_375x667@2x.png | Bin 349589 -> 357468 bytes ...iewCoursesEnabled_ios14_rtl_375x667@2x.png | Bin 349807 -> 358109 bytes ...BarViewCoursesEnabled_ios15_375x667@2x.png | Bin 349492 -> 357470 bytes ...iewCoursesEnabled_ios15_rtl_375x667@2x.png | Bin 349755 -> 358077 bytes ...veryAndProgramDisable_ios14_375x667@2x.png | Bin 349589 -> 357468 bytes ...AndProgramDisable_ios14_rtl_375x667@2x.png | Bin 349807 -> 358109 bytes ...veryAndProgramDisable_ios15_375x667@2x.png | Bin 349492 -> 357470 bytes ...AndProgramDisable_ios15_rtl_375x667@2x.png | Bin 349755 -> 358077 bytes ...rViewDiscoveryDisable_ios14_375x667@2x.png | Bin 353501 -> 35906 bytes ...wDiscoveryDisable_ios14_rtl_375x667@2x.png | Bin 353844 -> 36311 bytes ...rViewDiscoveryDisable_ios15_375x667@2x.png | Bin 354089 -> 35909 bytes ...wDiscoveryDisable_ios15_rtl_375x667@2x.png | Bin 354482 -> 36249 bytes ...edTabBarViewDiscovery_ios14_375x667@2x.png | Bin 42398 -> 40568 bytes ...bBarViewDiscovery_ios14_rtl_375x667@2x.png | Bin 42515 -> 40874 bytes ...edTabBarViewDiscovery_ios15_375x667@2x.png | Bin 42371 -> 40555 bytes ...bBarViewDiscovery_ios15_rtl_375x667@2x.png | Bin 42451 -> 40772 bytes ...BarViewProgramDisable_ios14_375x667@2x.png | Bin 362619 -> 359127 bytes ...iewProgramDisable_ios14_rtl_375x667@2x.png | Bin 363102 -> 359764 bytes ...BarViewProgramDisable_ios15_375x667@2x.png | Bin 363238 -> 359107 bytes ...iewProgramDisable_ios15_rtl_375x667@2x.png | Bin 363861 -> 359774 bytes ...hotEnrolledTabBarView_ios14_375x667@2x.png | Bin 363662 -> 358092 bytes ...nrolledTabBarView_ios14_rtl_375x667@2x.png | Bin 364127 -> 358726 bytes ...hotEnrolledTabBarView_ios15_375x667@2x.png | Bin 364786 -> 359280 bytes ...nrolledTabBarView_ios15_rtl_375x667@2x.png | Bin 365315 -> 359909 bytes edX.xcodeproj/project.pbxproj | 108 ++- 159 files changed, 6003 insertions(+), 1022 deletions(-) create mode 100755 Pods/Target Support Files/Pods-edX/Pods-edX-frameworks.sh create mode 100644 Source/CourseAccessHelper.swift create mode 100644 Source/CourseContentHeaderBlockPickerCell.swift create mode 100644 Source/CourseContentHeaderView.swift create mode 100644 Source/CourseDashboardAccessErrorView.swift create mode 100644 Source/CourseDashboardErrorView.swift create mode 100644 Source/CourseDashboardHeaderView.swift create mode 100644 Source/CourseDashboardTabbarView.swift create mode 100644 Source/DropDown/resources/DropDownCell.xib create mode 100644 Source/GeneralErrorView.swift create mode 100644 Source/NewCourseContentController.swift create mode 100644 Source/NewCourseDashboardViewController.swift create mode 100644 Source/NewCourseDateBannerView.swift create mode 100644 Source/NewDashboardContentCell.swift create mode 100644 Source/Resources/Images.xcassets/app_update_image.imageset/Contents.json create mode 100644 Source/Resources/Images.xcassets/app_update_image.imageset/app_update_image@2x.png create mode 100644 Source/Resources/Images.xcassets/dashboard_error_image.imageset/Contents.json create mode 100644 Source/Resources/Images.xcassets/dashboard_error_image.imageset/dashboard_error_image.png create mode 100644 Source/Resources/Images.xcassets/empty_state_placeholder.imageset/Contents.json create mode 100644 Source/Resources/Images.xcassets/empty_state_placeholder.imageset/empty_state_placeholder.png create mode 100644 Source/ResumeCourseHeaderView.swift create mode 100644 Source/ScrollableDelegate.swift diff --git a/Pods/Target Support Files/Pods-edX/Pods-edX-frameworks.sh b/Pods/Target Support Files/Pods-edX/Pods-edX-frameworks.sh new file mode 100755 index 0000000000..286b9369dc --- /dev/null +++ b/Pods/Target Support Files/Pods-edX/Pods-edX-frameworks.sh @@ -0,0 +1,204 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +BCSYMBOLMAP_DIR="BCSymbolMaps" + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink -f "${source}")" + fi + + if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then + # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied + find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do + echo "Installing $f" + install_bcsymbolmap "$f" "$destination" + rm "$f" + done + rmdir "${source}/${BCSYMBOLMAP_DIR}" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + warn_missing_arch=${2:-true} + if [ -r "$source" ]; then + # Copy the dSYM into the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .dSYM "$source")" + binary_name="$(ls "$source/Contents/Resources/DWARF")" + binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" + + # Strip invalid architectures from the dSYM. + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" "$warn_missing_arch" + fi + if [[ $STRIP_BINARY_RETVAL == 0 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + mkdir -p "${DWARF_DSYM_FOLDER_PATH}" + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" + fi + fi +} + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + warn_missing_arch=${2:-true} + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + if [[ "$warn_missing_arch" == "true" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + fi + STRIP_BINARY_RETVAL=1 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=0 +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/MSAL/MSAL.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBAEMKit/FBAEMKit.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit_Basics/FBSDKCoreKit_Basics.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKLoginKit/FBSDKLoginKit.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/NewRelicAgent/NewRelic.framework" +fi +if [[ "$CONFIGURATION" == "Profile" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/MSAL/MSAL.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBAEMKit/FBAEMKit.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit_Basics/FBSDKCoreKit_Basics.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKLoginKit/FBSDKLoginKit.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/NewRelicAgent/NewRelic.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/MSAL/MSAL.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBAEMKit/FBAEMKit.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit_Basics/FBSDKCoreKit_Basics.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKLoginKit/FBSDKLoginKit.framework" + install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/NewRelicAgent/NewRelic.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Source/AccessibilityCLButton.swift b/Source/AccessibilityCLButton.swift index fef2b984b3..37aa97a944 100644 --- a/Source/AccessibilityCLButton.swift +++ b/Source/AccessibilityCLButton.swift @@ -34,9 +34,12 @@ class AccessibilityCLButton: CustomPlayerButton { } public override func draw(_ rect: CGRect) { - let r = UIBezierPath(ovalIn: rect) + let diameter = min(rect.width, rect.height) + let circleRect = CGRect(x: rect.origin.x, y: rect.origin.y, width: diameter, height: diameter) + let path = UIBezierPath(ovalIn: circleRect) UIColor.black.withAlphaComponent(0.65).setFill() - r.fill() + path.fill() + super.draw(rect) } } diff --git a/Source/CelebratoryModalViewController.swift b/Source/CelebratoryModalViewController.swift index c06586aae3..1939453c37 100644 --- a/Source/CelebratoryModalViewController.swift +++ b/Source/CelebratoryModalViewController.swift @@ -99,7 +99,7 @@ class CelebratoryModalViewController: UIViewController, InterfaceOrientationOver return message }() - private lazy var celebrationMessageLabel: UILabel = { + private lazy var shareMessageLabel: UILabel = { let message = UILabel() message.numberOfLines = 0 message.setContentCompressionResistancePriority(.defaultHigh, for: .vertical) @@ -109,7 +109,6 @@ class CelebratoryModalViewController: UIViewController, InterfaceOrientationOver let messageStyle = OEXMutableTextStyle(weight: .normal, size: .base, color: environment.styles.neutralBlackT()) let messageAttributedString = messageStyle.attributedString(withText: Strings.Celebration.infoMessage) let compiledMessage = NSAttributedString.joinInNaturalLayout(attributedStrings: [earneditAttributedString, messageAttributedString]) - message.sizeToFit() message.attributedText = compiledMessage return message }() @@ -134,7 +133,7 @@ class CelebratoryModalViewController: UIViewController, InterfaceOrientationOver return imageView }() - private lazy var shareButtonView: UIButton = { + private lazy var shareButton: UIButton = { let button = UIButton() button.accessibilityLabel = Strings.Accessibility.shareACourse button.oex_removeAllActions() @@ -149,17 +148,26 @@ class CelebratoryModalViewController: UIViewController, InterfaceOrientationOver return button }() + private let shareContainer = UIView() + private lazy var courseURL: String? = { return environment.interface?.enrollmentForCourse(withID: courseID)?.course.course_about }() private lazy var celebrationImageSize: CGSize = { let margin: CGFloat = isiPad() ? 240 : 80 - let width = view.frame.size.width - margin + let width = UIScreen.main.bounds.width - margin let imageAspectRatio: CGFloat = 1.37 return CGSize(width: width, height: width / imageAspectRatio) }() + private lazy var celebrationImageSizeLandscape: CGSize = { + let margin: CGFloat = isiPad() ? 340 : 165 + let height = UIScreen.main.bounds.height - margin + let imageAspectRatio: CGFloat = 1.37 + return CGSize(width: height * imageAspectRatio, height: height) + }() + init(courseID: String, environment: Environment) { self.courseID = courseID self.environment = environment @@ -183,9 +191,8 @@ class CelebratoryModalViewController: UIViewController, InterfaceOrientationOver super.viewDidLoad() view.backgroundColor = environment.styles.neutralXXDark().withAlphaComponent(0.5) - view.setNeedsUpdateConstraints() - view.addSubview(modalView) + addSubviews() setIdentifiers() } @@ -200,6 +207,7 @@ class CelebratoryModalViewController: UIViewController, InterfaceOrientationOver updateViewConstraints() } + override func updateViewConstraints() { if isVerticallyCompact() { setupLandscapeView() @@ -215,269 +223,154 @@ class CelebratoryModalViewController: UIViewController, InterfaceOrientationOver NotificationCenter.default.removeObserver(self) } - private func removeViews() { - modalView.subviews.forEach { $0.removeFromSuperview() } - } - private func setIdentifiers() { - modalView.accessibilityIdentifier = "CelebratoryModalView:modal-container-view" + modalView.accessibilityIdentifier = "CelebratoryModalView:modal-view" titleLabel.accessibilityIdentifier = "CelebratoryModalView:label-title" - titleMessageLabel.accessibilityIdentifier = "CelebratoryModalView:label-title-message" - celebrationMessageLabel.accessibilityIdentifier = "CelebratoryModalView:label-celebration-message" + titleMessageLabel.accessibilityIdentifier = "CelebratoryModalView:title-message-label" + shareMessageLabel.accessibilityIdentifier = "CelebratoryModalView:share-message-label" congratulationImageView.accessibilityIdentifier = "CelebratoryModalView:congratulation-image-view" - shareButtonView.accessibilityIdentifier = "CelebratoryModalView:share-button-view" + shareButton.accessibilityIdentifier = "CelebratoryModalView:share-button" shareImageView.accessibilityIdentifier = "CelebratoryModalView:share-image-view" + shareContainer.accessibilityIdentifier = "CelebratoryModalView:share-container-view" } - private func setupPortraitView() { - removeViews() - let imageContainer = UIView() - let insideContainer = UIView() - let keepGoingButtonContainer = UIView() - let buttonContainer = UIView() - let textContainer = UIView() + private func addSubviews() { + view.addSubview(modalView) modalView.addSubview(titleLabel) modalView.addSubview(titleMessageLabel) - imageContainer.addSubview(congratulationImageView) - modalView.addSubview(imageContainer) - modalView.addSubview(insideContainer) - modalView.addSubview(keepGoingButtonContainer) - - imageContainer.accessibilityIdentifier = "CelebratoryModalView:image-cotainer-view" - insideContainer.accessibilityIdentifier = "CelebratoryModalView:share-inside-container-view" - keepGoingButtonContainer.accessibilityIdentifier = "CelebratoryModalView:keep-going-button-container-view" - buttonContainer.accessibilityIdentifier = "CelebratoryModalView:share-button-container-view" - textContainer.accessibilityIdentifier = "CelebratoryModalView:share-text-container-view" - - insideContainer.backgroundColor = environment.styles.infoXXLight() - insideContainer.addSubview(buttonContainer) - insideContainer.addSubview(textContainer) - insideContainer.addSubview(shareButtonView) + modalView.addSubview(congratulationImageView) + modalView.addSubview(shareContainer) + modalView.addSubview(keepGoingButton) - shareButtonView.superview?.bringSubviewToFront(shareButtonView) - - textContainer.addSubview(celebrationMessageLabel) - buttonContainer.addSubview(shareImageView) - keepGoingButtonContainer.addSubview(keepGoingButton) - + shareContainer.backgroundColor = environment.styles.infoXXLight() + shareContainer.addSubview(shareImageView) + shareContainer.addSubview(shareMessageLabel) + shareContainer.addSubview(shareButton) + shareButton.superview?.bringSubviewToFront(shareButton) + } + + private func setupPortraitView() { titleLabel.snp.remakeConstraints { make in make.top.equalTo(modalView).offset(StandardVerticalMargin*3) - make.centerX.equalTo(modalView) make.leading.equalTo(modalView).offset(StandardHorizontalMargin) make.trailing.equalTo(modalView).inset(StandardHorizontalMargin) - make.height.equalTo(titleLabelHeight) } - + titleMessageLabel.snp.remakeConstraints { make in make.top.equalTo(titleLabel.snp.bottom).offset(StandardVerticalMargin * 2) - make.centerX.equalTo(modalView) - make.width.equalTo(imageContainer.snp.width).inset(10) - make.height.equalTo(titleLabelMessageHeight) + make.leading.equalTo(congratulationImageView) + make.trailing.equalTo(congratulationImageView) } congratulationImageView.snp.remakeConstraints { make in - make.edges.equalTo(imageContainer) - } - - imageContainer.snp.remakeConstraints { make in make.top.equalTo(titleMessageLabel.snp.bottom).offset(StandardVerticalMargin * 2) make.centerX.equalTo(modalView) make.width.equalTo(celebrationImageSize.width) make.height.equalTo(celebrationImageSize.height) } - - insideContainer.snp.remakeConstraints { make in - make.top.equalTo(imageContainer.snp.bottom).offset(StandardVerticalMargin * 2) - make.centerX.equalTo(modalView) - make.width.equalTo(imageContainer.snp.width) - make.height.equalTo(shareButtonContainerHeight) - } - - buttonContainer.snp.remakeConstraints { make in - make.leading.equalTo(insideContainer) - make.top.equalTo(insideContainer).offset(StandardVerticalMargin * 2) - make.bottom.equalTo(insideContainer) + + shareContainer.snp.remakeConstraints { make in + make.top.equalTo(congratulationImageView.snp.bottom).offset(StandardVerticalMargin * 2) + make.centerX.equalTo(congratulationImageView) + make.leading.equalTo(congratulationImageView) + make.trailing.equalTo(congratulationImageView) } - - textContainer.snp.remakeConstraints { make in - make.top.equalTo(insideContainer).offset(StandardVerticalMargin * 2) - make.leading.equalTo(buttonContainer.snp.trailing).inset(StandardHorizontalMargin / 2) - make.trailing.equalTo(insideContainer).inset(StandardHorizontalMargin * 2) - make.bottom.equalTo(insideContainer).inset(StandardVerticalMargin * 2) + + shareButton.snp.remakeConstraints { make in + make.edges.equalTo(shareContainer) } - + shareImageView.snp.remakeConstraints { make in - make.top.equalTo(celebrationMessageLabel.snp.top) - make.leading.equalTo(buttonContainer).offset(StandardHorizontalMargin * 2) - make.trailing.equalTo(buttonContainer).inset(StandardHorizontalMargin) + make.top.equalTo(shareContainer).offset(StandardVerticalMargin * 2) + make.leading.equalTo(shareContainer).offset(StandardHorizontalMargin) make.width.equalTo(shareImageSize.width) make.height.equalTo(shareImageSize.height) } - - celebrationMessageLabel.snp.remakeConstraints { make in - make.centerX.equalTo(textContainer) - make.centerY.equalTo(textContainer) - make.leading.equalTo(textContainer) - make.trailing.equalTo(textContainer) - } - - shareButtonView.snp.makeConstraints { make in - make.edges.equalTo(insideContainer) - } - keepGoingButtonContainer.snp.remakeConstraints { make in - make.top.equalTo(insideContainer.snp.bottom).offset(StandardVerticalMargin * 3) - make.leading.equalTo(modalView).offset(StandardHorizontalMargin) - make.trailing.equalTo(modalView).inset(StandardHorizontalMargin) - make.height.equalTo(keepGoingButtonSize.height) + shareMessageLabel.snp.remakeConstraints { make in + make.top.equalTo(shareImageView) + make.leading.equalTo(shareImageView.snp.trailing).offset(StandardHorizontalMargin / 2) + make.trailing.equalTo(shareContainer).inset(StandardHorizontalMargin) + make.bottom.equalTo(shareContainer).inset(StandardVerticalMargin * 2) } keepGoingButton.snp.remakeConstraints { make in - make.centerX.equalTo(keepGoingButtonContainer) - make.height.equalTo(keepGoingButtonContainer) + make.top.equalTo(shareContainer.snp.bottom).offset(StandardVerticalMargin * 3) + make.bottom.equalTo(modalView).inset(StandardVerticalMargin * 3) + make.centerX.equalTo(modalView) + make.height.equalTo(keepGoingButtonSize.height) make.width.equalTo(keepGoingButtonSize.width) } - + modalView.snp.remakeConstraints { make in make.centerX.equalTo(view) make.centerY.equalTo(view) - let height = titleLabelHeight + titleLabelMessageHeight + celebrationImageSize.height + shareButtonContainerHeight + keepGoingButtonSize.height + (StandardVerticalMargin * 15) - make.height.equalTo(height) - make.width.equalTo(celebrationImageSize.width + StandardVerticalMargin * 5) + make.leading.equalTo(safeLeading).offset(StandardHorizontalMargin) + make.trailing.equalTo(safeTrailing).inset(StandardHorizontalMargin) } } private func setupLandscapeView() { - removeViews() - let stackView = UIStackView() - let rightStackView = UIStackView() - let rightContainer = UIView() - let insideContainer = UIView() - let buttonContainer = UIView() - let textContainer = UIView() - let keepGoingButtonContainer = UIView() - - stackView.accessibilityIdentifier = "CelebratoryModalView:stack-view" - rightStackView.accessibilityIdentifier = "CelebratoryModalView:stack-right-view" - rightContainer.accessibilityIdentifier = "CelebratoryModalView:stack-cotainer-right-view" - insideContainer.accessibilityIdentifier = "CelebratoryModalView:share-inside-container-view" - keepGoingButtonContainer.accessibilityIdentifier = "CelebratoryModalView:keep-going-button-container-view" - buttonContainer.accessibilityIdentifier = "CelebratoryModalView:share-button-container-view" - textContainer.accessibilityIdentifier = "CelebratoryModalView:share-text-container-view" - - stackView.alignment = .center - stackView.axis = .horizontal - stackView.distribution = .fillEqually - stackView.spacing = StandardVerticalMargin * 2 - insideContainer.backgroundColor = environment.styles.infoXXLight() - - modalView.addSubview(stackView) - textContainer.addSubview(celebrationMessageLabel) - buttonContainer.addSubview(shareImageView) - insideContainer.addSubview(shareButtonView) - insideContainer.addSubview(buttonContainer) - insideContainer.addSubview(textContainer) - - shareButtonView.superview?.bringSubviewToFront(shareButtonView) - - rightStackView.alignment = .fill - rightStackView.axis = .vertical - rightStackView.distribution = .equalSpacing - rightStackView.spacing = StandardVerticalMargin - - rightStackView.addArrangedSubview(titleLabel) - rightStackView.addArrangedSubview(titleMessageLabel) - rightStackView.addArrangedSubview(insideContainer) - rightStackView.addArrangedSubview(keepGoingButtonContainer) - - stackView.addArrangedSubview(congratulationImageView) - stackView.addArrangedSubview(rightContainer) - - rightContainer.addSubview(rightStackView) - keepGoingButtonContainer.addSubview(keepGoingButton) - - rightStackView.snp.makeConstraints { make in - make.edges.equalTo(rightContainer) - } - - rightContainer.snp.remakeConstraints { make in - make.height.equalTo(stackView) + congratulationImageView.snp.remakeConstraints { make in + make.top.equalTo(modalView).offset(StandardVerticalMargin * 2) + make.leading.equalTo(modalView).offset(StandardHorizontalMargin) + make.width.equalTo(celebrationImageSizeLandscape.width) + make.height.equalTo(celebrationImageSizeLandscape.height) + make.bottom.equalTo(modalView).inset(StandardVerticalMargin * 2) } titleLabel.snp.remakeConstraints { make in - make.height.equalTo(titleLabelHeight) + make.top.equalTo(congratulationImageView).offset(StandardVerticalMargin) + make.leading.equalTo(congratulationImageView.snp.trailing).offset(StandardHorizontalMargin) + make.trailing.equalTo(modalView).inset(StandardHorizontalMargin) } titleMessageLabel.snp.remakeConstraints { make in - make.height.equalTo(titleLabelMessageHeight) + make.top.equalTo(titleLabel.snp.bottom).offset(StandardVerticalMargin * 2) + make.leading.equalTo(titleLabel) + make.trailing.equalTo(titleLabel) + } + + shareContainer.snp.remakeConstraints { make in + make.top.greaterThanOrEqualTo(titleMessageLabel.snp.bottom).offset(StandardVerticalMargin) + make.leading.equalTo(titleLabel) + make.trailing.equalTo(titleLabel) } - insideContainer.snp.remakeConstraints { make in - make.height.equalTo(shareButtonContainerHeight) + shareButton.snp.remakeConstraints { make in + make.edges.equalTo(shareContainer) } shareImageView.snp.remakeConstraints { make in - make.top.equalTo(celebrationMessageLabel.snp.top) - make.leading.equalTo(buttonContainer).offset(StandardHorizontalMargin * 2) - make.trailing.equalTo(buttonContainer).inset(StandardHorizontalMargin) + make.top.equalTo(shareContainer).offset(StandardVerticalMargin * 2) + make.leading.equalTo(shareContainer).offset(StandardHorizontalMargin) make.width.equalTo(shareImageSize.width) make.height.equalTo(shareImageSize.height) } - - celebrationMessageLabel.snp.remakeConstraints { make in - make.centerX.equalTo(textContainer) - make.centerY.equalTo(textContainer) - make.leading.equalTo(textContainer) - make.trailing.equalTo(textContainer) - make.height.lessThanOrEqualTo(textContainer) - } - - shareButtonView.snp.makeConstraints { make in - make.edges.equalTo(insideContainer) - } - buttonContainer.snp.remakeConstraints { make in - make.leading.equalTo(insideContainer) - make.top.equalTo(insideContainer) - make.bottom.equalTo(insideContainer) - } - - textContainer.snp.remakeConstraints { make in - make.top.equalTo(insideContainer) - make.leading.equalTo(buttonContainer.snp.trailing).inset(StandardHorizontalMargin / 2) - make.trailing.equalTo(insideContainer).inset(StandardHorizontalMargin * 2) - make.bottom.equalTo(insideContainer).inset(StandardVerticalMargin) - } - - keepGoingButtonContainer.snp.remakeConstraints { make in - make.height.equalTo(keepGoingButtonSize.height) + shareMessageLabel.snp.remakeConstraints { make in + make.top.equalTo(shareImageView) + make.leading.equalTo(shareImageView.snp.trailing).offset(StandardHorizontalMargin / 2) + make.trailing.equalTo(shareContainer).inset(StandardHorizontalMargin) + make.bottom.equalTo(shareContainer).inset(StandardVerticalMargin * 2) } keepGoingButton.snp.remakeConstraints { make in - make.centerX.equalTo(keepGoingButtonContainer) - make.height.equalTo(keepGoingButtonContainer) + make.top.equalTo(shareContainer.snp.bottom).offset(StandardVerticalMargin * 2) + make.bottom.equalTo(modalView).inset(StandardVerticalMargin * 2) + make.centerX.equalTo(shareMessageLabel) + make.height.equalTo(keepGoingButtonSize.height) make.width.equalTo(keepGoingButtonSize.width) } + modalView.snp.remakeConstraints { make in - // For iPad the modal is streching to the end of the screen so we restricted the modal top, bottom, leading - // and trailing margin for iPad - - make.leading.equalTo(view).offset(isiPad() ? 100 : 40) - make.trailing.equalTo(view).inset(isiPad() ? 100 : 40) - - let top = isiPad() ? ((view.frame.size.height / 2.5 ) / 2) : ((view.frame.size.height / 4) / 2) - let bottom = isiPad() ? ((view.frame.size.width / 2.5 ) / 2) : ((view.frame.size.height / 4) / 2) - make.top.equalTo(view).offset(top) - make.bottom.equalTo(view).inset(bottom) make.centerX.equalTo(view) make.centerY.equalTo(view) - } - - stackView.snp.remakeConstraints { make in - make.edges.equalTo(modalView).inset(20) + make.leading.equalTo(safeLeading).offset(StandardHorizontalMargin) + make.trailing.equalTo(safeTrailing).inset(StandardHorizontalMargin) } } diff --git a/Source/ContainerNavigationController.swift b/Source/ContainerNavigationController.swift index 533e5b309c..09712bea10 100644 --- a/Source/ContainerNavigationController.swift +++ b/Source/ContainerNavigationController.swift @@ -113,6 +113,25 @@ extension UINavigationController { } } +extension UINavigationController { + public func presentViewControler(_ viewController: UIViewController, animated flag: Bool, completion: ((UIViewController) -> Void)? = nil) { + present(viewController, animated: flag) + guard flag, let coordinator = transitionCoordinator else { + DispatchQueue.main.async { [weak self] in + if let presentedController = self?.presentedViewController { + completion?(presentedController) + } + } + return + } + coordinator.animate(alongsideTransition: nil) { [weak self] _ in + if let presentedController = self?.presentedViewController { + completion?(presentedController) + } + } + } +} + /// https://stackoverflow.com/a/33767837 /// https://iganin.hatenablog.com/entry/2019/07/27/172911 extension UINavigationController { diff --git a/Source/Core/Code/NetworkManager.swift b/Source/Core/Code/NetworkManager.swift index 4deec96fea..9f9186e87b 100644 --- a/Source/Core/Code/NetworkManager.swift +++ b/Source/Core/Code/NetworkManager.swift @@ -30,7 +30,7 @@ private enum DeserializationResult { case queuedRequest(URLRequest: URLRequest, original: Data?) } -public typealias AuthenticateRequestCreator = (_ _networkManager: NetworkManager, _ _completion: @escaping (_ _success : Bool) -> Void) -> Void +public typealias AuthenticateRequestCreator = (_ _networkManager: NetworkManager, _ _completion: @escaping (_ _response: HTTPURLResponse?, _ _success : Bool) -> Void) -> Void public enum AuthenticationAction { case proceed @@ -386,9 +386,9 @@ open class NetworkManager : NSObject { if tokenStatus == .expired { if case .authenticate(let authenticateRequest) = authenticator?(nil, nil, true) { - authenticateRequest(self, { [weak self] success in + authenticateRequest(self, { [weak self] response, success in let request = self?.URLRequestWithRequest(base: base, networkRequest).value - self?.handleAuthenticationResponse(base: base, networkRequest: networkRequest, handler: handler, success: success, request: request, response: nil, baseData: nil, error: nil) + self?.handleAuthenticationResponse(base: base, networkRequest: networkRequest, handler: handler, success: success, request: request, response: response, baseData: nil, error: nil) }) } return nil @@ -449,7 +449,7 @@ open class NetworkManager : NSObject { Logger.logInfo(NetworkManager.NETWORK, "Response is \(String(describing: response))") handler(result) case let .some(.reauthenticationRequest(authHandler, originalData)): - authHandler(self, { [weak self] success in + authHandler(self, { [weak self] _, success in self?.handleAuthenticationResponse(base: base, networkRequest: networkRequest, handler: handler, success: success, request: request, response: response, baseData: originalData, error: error) }) case let .some(.queuedRequest(request, _)): diff --git a/Source/Core/Test/Code/NetworkManagerTests.swift b/Source/Core/Test/Code/NetworkManagerTests.swift index 962d73e79a..765c57a56c 100644 --- a/Source/Core/Test/Code/NetworkManagerTests.swift +++ b/Source/Core/Test/Code/NetworkManagerTests.swift @@ -296,7 +296,7 @@ class NetworkManagerTests: XCTestCase { if response!.statusCode == 401 { return AuthenticationAction.authenticate({ (networkManager, completion) in OHHTTPStubs.removeStub(stub401Response) - return completion(true) + return completion(nil, true) })} else { OHHTTPStubs.removeStub(stub200Response) @@ -331,7 +331,7 @@ class NetworkManagerTests: XCTestCase { manager.authenticator = { (response, data, _) -> AuthenticationAction in return AuthenticationAction.authenticate({ (networkManager, completion) in OHHTTPStubs.removeStub(stub401Response) - return completion(false) + return completion(nil, false) }) } diff --git a/Source/CourseAccessHelper.swift b/Source/CourseAccessHelper.swift new file mode 100644 index 0000000000..a81620af38 --- /dev/null +++ b/Source/CourseAccessHelper.swift @@ -0,0 +1,91 @@ +// +// CourseAccessHelper.swift +// edX +// +// Created by MuhammadUmer on 05/01/2023. +// Copyright © 2023 edX. All rights reserved. +// + +enum CourseAccessErrorHelperType { + case isEndDateOld + case startDateError + case auditExpired + case upgradeable +} + +class CourseAccessHelper { + private let course: OEXCourse + private let enrollment: UserCourseEnrollment? + + init(course: OEXCourse, enrollment: UserCourseEnrollment? = nil) { + self.course = course + self.enrollment = enrollment + } + + var type: CourseAccessErrorHelperType? { + guard let enrollment = enrollment else { return nil } + + if course.isEndDateOld { + if enrollment.isUpgradeable { + return .upgradeable + } else { + return .isEndDateOld + } + } else { + guard let errorCode = course.courseware_access?.error_code else { return nil } + + switch errorCode { + case .startDateError: + return .startDateError + case .auditExpired: + return .auditExpired + + default: + return nil + } + } + } + + var shouldShowValueProp: Bool { + return type == .upgradeable || type == .auditExpired + } + + var errorTitle: String? { + switch type { + case .isEndDateOld: + return Strings.CourseDashboard.Error.courseEndedTitle + case .startDateError: + return Strings.CourseDashboard.Error.courseNotStartedTitle + case .auditExpired: + return Strings.CourseDashboard.Error.courseAccessExpiredTitle + default: + return Strings.CourseDashboard.Error.courseAccessExpiredTitle + } + } + + var errorInfo: String? { + switch type { + case .isEndDateOld: + return Strings.CourseDashboard.Error.courseAccessExpiredInfo + case .startDateError: + return formatedStartDate(displayInfo: course.start_display_info) + case .auditExpired: + return Strings.CourseDashboard.Error.auditExpiredUpgradeInfo + default: + return Strings.CourseDashboard.Error.courseAccessExpiredInfo + } + } + + private func formatedStartDate(displayInfo: OEXCourseStartDisplayInfo) -> String { + if let displayDate = displayInfo.displayDate, displayInfo.type == .string && !displayDate.isEmpty { + return Strings.CourseDashboard.Error.courseNotStartedInfo(startDate: displayDate) + } + + if let displayDate = displayInfo.date as? NSDate, displayInfo.type == .timestamp { + let formattedDisplayDate = DateFormatting.format(asMonthDayYearString: displayDate) ?? "" + return Strings.CourseDashboard.Error.courseNotStartedInfo(startDate: formattedDisplayDate) + } + + return Strings.courseNotStarted + } +} diff --git a/Source/CourseAnnouncementsViewController.swift b/Source/CourseAnnouncementsViewController.swift index 780f83fb79..b5e2c33a66 100644 --- a/Source/CourseAnnouncementsViewController.swift +++ b/Source/CourseAnnouncementsViewController.swift @@ -18,7 +18,7 @@ private func announcementsDeserializer(response: HTTPURLResponse, json: JSON) -> } } -class CourseAnnouncementsViewController: OfflineSupportViewController, LoadStateViewReloadSupport, InterfaceOrientationOverriding { +class CourseAnnouncementsViewController: OfflineSupportViewController, LoadStateViewReloadSupport, InterfaceOrientationOverriding, ScrollableDelegateProvider { typealias Environment = OEXAnalyticsProvider & OEXConfigProvider & DataManagerProvider & NetworkManagerProvider & OEXRouterProvider & OEXInterfaceProvider & ReachabilityProvider & OEXSessionProvider & OEXStylesProvider @@ -32,6 +32,9 @@ class CourseAnnouncementsViewController: OfflineSupportViewController, LoadState private let fontStyle = OEXTextStyle(weight : .normal, size: .base, color: OEXStyles.shared().neutralBlack()) private let switchStyle = OEXStyles.shared().standardSwitchStyle() + weak var scrollableDelegate: ScrollableDelegate? + private var scrollByDragging = false + @objc init(environment: Environment, courseID: String) { self.courseID = courseID self.environment = environment @@ -54,6 +57,7 @@ class CourseAnnouncementsViewController: OfflineSupportViewController, LoadState webView.backgroundColor = OEXStyles.shared().standardBackgroundColor() webView.isOpaque = false webView.navigationDelegate = self + webView.scrollView.delegate = self loadController.setupInController(controller: self, contentView: webView) announcementsLoader.listen(self) {[weak self] in @@ -174,3 +178,19 @@ extension CourseAnnouncementsViewController: WKNavigationDelegate { loadController.state = LoadState.failed(error: error as NSError) } } + +extension CourseAnnouncementsViewController: UIScrollViewDelegate { + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + scrollByDragging = true + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + if scrollByDragging { + scrollableDelegate?.scrollViewDidScroll(scrollView: scrollView) + } + } + + func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + scrollByDragging = false + } +} diff --git a/Source/CourseCertificateView.swift b/Source/CourseCertificateView.swift index 0c33896594..6248e91523 100644 --- a/Source/CourseCertificateView.swift +++ b/Source/CourseCertificateView.swift @@ -16,7 +16,7 @@ struct CourseCertificateIem { class CourseCertificateView: UIView { - static let height: CGFloat = 100.0 + static let height: CGFloat = 132.0 private let certificateImageView = UIImageView() private let titleLabel = UILabel() private let subtitleLabel = UILabel() @@ -61,31 +61,85 @@ class CourseCertificateView: UIView { titleLabel.setContentCompressionResistancePriority(UILayoutPriority.defaultLow, for: .horizontal) subtitleLabel.adjustsFontSizeToFitWidth = true - - certificateImageView.snp.makeConstraints { make in - make.top.equalTo(self).offset(StandardVerticalMargin) - make.bottom.equalTo(self).inset(StandardVerticalMargin) + + setAccessibilityIdentifiers() + } + + override func layoutSubviews() { + super.layoutSubviews() + setConstraints() + } + + private func setConstraints() { + if traitCollection.verticalSizeClass == .regular { + addPortraitConstraints() + } else { + addLandscapeConstraints() + } + } + + private func addPortraitConstraints() { + if OEXConfig.shared().isNewDashboardEnabled { + certificateImageView.snp.remakeConstraints { make in + make.top.equalTo(self).offset(StandardVerticalMargin * 2) + make.centerX.equalTo(self) + make.width.equalTo(138) + make.height.equalTo(100) + } + + titleLabel.snp.remakeConstraints { make in + make.top.equalTo(certificateImageView.snp.bottom).offset(StandardVerticalMargin * 2) + make.centerX.equalTo(certificateImageView) + } + + subtitleLabel.snp.remakeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(StandardVerticalMargin) + make.centerX.equalTo(titleLabel) + } + + viewCertificateButton.snp.remakeConstraints { make in + make.top.equalTo(subtitleLabel.snp.bottom).offset(StandardVerticalMargin * 2) + make.leading.equalTo(self).offset(StandardHorizontalMargin) + make.trailing.equalTo(self).inset(StandardHorizontalMargin) + make.centerX.equalTo(subtitleLabel) + make.height.equalTo(StandardVerticalMargin * 4.5) + make.bottom.equalTo(self).inset(StandardVerticalMargin * 2) + + } + } + else { + // old portrait style is somewhat close to landscape design so for view simplicity using that here as well + addLandscapeConstraints() + } + } + + private func addLandscapeConstraints() { + certificateImageView.snp.remakeConstraints { make in + make.top.equalTo(self).offset(StandardVerticalMargin * 2) + make.bottom.equalTo(self).inset(StandardVerticalMargin * 2) make.leading.equalTo(self).offset(StandardHorizontalMargin) + make.width.equalTo(138) + make.height.equalTo(100) } - titleLabel.snp.makeConstraints { make in + titleLabel.snp.remakeConstraints { make in make.top.equalTo(certificateImageView) + make.leading.equalTo(certificateImageView.snp.trailing).offset(StandardHorizontalMargin) make.trailing.equalTo(self).inset(StandardHorizontalMargin) } - subtitleLabel.snp.makeConstraints { make in + subtitleLabel.snp.remakeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(StandardVerticalMargin) make.leading.equalTo(titleLabel) make.trailing.equalTo(titleLabel) - make.top.equalTo(titleLabel.snp.bottom) } - viewCertificateButton.snp.makeConstraints { make in - make.leading.equalTo(titleLabel) - make.trailing.equalTo(titleLabel) + viewCertificateButton.snp.remakeConstraints { make in + make.leading.equalTo(subtitleLabel) + make.trailing.equalTo(self).inset(StandardHorizontalMargin) + make.height.equalTo(StandardVerticalMargin * 4.5) make.bottom.equalTo(certificateImageView) } - - setAccessibilityIdentifiers() } private func setAccessibilityIdentifiers() { @@ -100,10 +154,19 @@ class CourseCertificateView: UIView { guard let certificateItem = item else {return} certificateImageView.image = certificateItem.certificateImage - let titleStyle = OEXTextStyle(weight: .normal, size: .large, color: OEXStyles.shared().primaryBaseColor()) - let subtitleStyle = OEXTextStyle(weight: .normal, size: .base, color: OEXStyles.shared().primaryXLightColor()) + let titleStyle = OEXMutableTextStyle(weight: .normal, size: .large, color: OEXStyles.shared().primaryBaseColor()) + let subtitleStyle = OEXMutableTextStyle(weight: .normal, size: .small, color: OEXStyles.shared().primaryXLightColor()) + + var title = Strings.Certificates.courseCompletionTitle + if OEXConfig.shared().isNewDashboardEnabled { + titleStyle.weight = .bold + titleStyle.size = .xxLarge + titleStyle.color = OEXStyles.shared().neutralBlack() + subtitleStyle.color = OEXStyles.shared().neutralXDark() + title = title.capitalized + } - titleLabel.attributedText = titleStyle.attributedString(withText: Strings.Certificates.courseCompletionTitle) + titleLabel.attributedText = titleStyle.attributedString(withText: title) subtitleLabel.attributedText = subtitleStyle.attributedString(withText: Strings.Certificates.courseCompletionSubtitle) addActionIfNeccessary() @@ -119,7 +182,4 @@ class CourseCertificateView: UIView { } addGestureRecognizer(tapGesture) } - } - - diff --git a/Source/CourseContentHeaderBlockPickerCell.swift b/Source/CourseContentHeaderBlockPickerCell.swift new file mode 100644 index 0000000000..729c93635e --- /dev/null +++ b/Source/CourseContentHeaderBlockPickerCell.swift @@ -0,0 +1,176 @@ +// +// CourseContentHeaderBlockPickerCell.swift +// edX +// +// Created by MuhammadUmer on 02/06/2023. +// Copyright © 2023 edX. All rights reserved. +// + +import UIKit + +class CourseContentHeaderBlockPickerCell: UITableViewCell { + static let identifier = "CourseContentHeaderBlockPickerCell" + + private let imageSize: CGFloat = 10 + private let imageContainerSize: CGFloat = 16 + private let completedImagesize: CGFloat = 16 + + private lazy var titleStyle = OEXTextStyle(weight: .normal, size: .small, color: OEXStyles.shared().neutralXXDark()) + private lazy var subtitleStyle = OEXTextStyle(weight: .normal, size: .xSmall, color: OEXStyles.shared().neutralXDark()) + + private lazy var lockedImageView: UIImageView = { + let imageView = UIImageView() + imageView.accessibilityIdentifier = "CourseContentHeaderBlockPickerCell:locked-image-view" + imageView.image = Icon.Closed.imageWithFontSize(size: imageSize) + imageView.tintColor = OEXStyles.shared().neutralWhiteT() + return imageView + }() + + private lazy var completedImageView: UIImageView = { + let imageView = UIImageView() + imageView.accessibilityIdentifier = "CourseContentHeaderBlockPickerCell:completed-image-view" + imageView.image = Icon.CheckCircle.imageWithFontSize(size: completedImagesize) + imageView.tintColor = OEXStyles.shared().successBase() + return imageView + }() + + private lazy var imageViewContainer: UIView = { + let view = UIView() + view.accessibilityIdentifier = "CourseContentHeaderBlockPickerCell:image-view-container" + view.backgroundColor = OEXStyles.shared().secondaryBaseColor() + return view + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.accessibilityIdentifier = "CourseContentHeaderBlockPickerCell:title-label" + label.numberOfLines = 1 + return label + }() + + private lazy var subtitleLabel: UILabel = { + let label = UILabel() + label.accessibilityIdentifier = "CourseContentHeaderBlockPickerCell:subtitle-label" + label.numberOfLines = 0 + return label + }() + + private lazy var separator: UIView = { + let view = UIView() + view.accessibilityIdentifier = "CourseContentHeaderBlockPickerCell:separator-view" + view.backgroundColor = OEXStyles.shared().neutralXLight() + return view + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + selectionStyle = .none + accessibilityIdentifier = "CourseContentHeaderBlockPickerCell:tableview-cell" + + addSubviews() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func prepareForReuse() { + super.prepareForReuse() + + contentView.backgroundColor = OEXStyles.shared().neutralWhiteT() + contentView.subviews.forEach { view in + view.removeFromSuperview() + } + } + + override func layoutSubviews() { + imageViewContainer.layer.cornerRadius = imageContainerSize / 2 + imageViewContainer.clipsToBounds = true + } + + func setup(block: CourseBlock) { + titleLabel.attributedText = titleStyle.attributedString(withText: block.displayName) + subtitleLabel.text = "" + + if block.isGated { + addGatedSubviews() + completedImageView.isHidden = true + lockedImageView.isHidden = false + subtitleLabel.attributedText = subtitleStyle.attributedString(withText: Strings.CourseOutlineHeader.gatedContentTitle) + } else { + addSubviews() + completedImageView.isHidden = !block.isCompleted + lockedImageView.isHidden = true + } + } +} + +extension CourseContentHeaderBlockPickerCell { + private func addSubviews() { + contentView.addSubview(completedImageView) + contentView.addSubview(titleLabel) + contentView.addSubview(separator) + + completedImageView.snp.remakeConstraints { make in + make.leading.equalTo(contentView).offset(StandardHorizontalMargin) + make.height.width.equalTo(completedImagesize) + make.centerY.equalTo(contentView) + } + + titleLabel.snp.remakeConstraints { make in + make.leading.equalTo(completedImageView.snp.trailing).offset(StandardHorizontalMargin) + make.trailing.equalTo(contentView).inset(StandardHorizontalMargin) + make.centerY.equalTo(contentView) + } + + separator.snp.remakeConstraints { make in + make.leading.equalTo(self) + make.trailing.equalTo(self) + make.bottom.equalTo(self) + make.height.equalTo(1) + } + } +} + +extension CourseContentHeaderBlockPickerCell { + private func addGatedSubviews() { + imageViewContainer.addSubview(lockedImageView) + contentView.addSubview(imageViewContainer) + contentView.addSubview(titleLabel) + contentView.addSubview(subtitleLabel) + contentView.addSubview(separator) + + titleLabel.snp.remakeConstraints { make in + make.leading.equalTo(lockedImageView.snp.trailing).offset(StandardHorizontalMargin) + make.trailing.equalTo(contentView).inset(StandardHorizontalMargin) + make.top.equalTo(contentView).offset(StandardVerticalMargin) + } + + lockedImageView.snp.remakeConstraints { make in + make.center.equalTo(imageViewContainer) + make.height.equalTo(imageSize) + make.width.equalTo(imageSize) + } + + imageViewContainer.snp.remakeConstraints { make in + make.centerY.equalTo(subtitleLabel) + make.leading.equalTo(contentView).offset(StandardHorizontalMargin) + make.height.width.equalTo(imageContainerSize) + } + + subtitleLabel.snp.remakeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(StandardVerticalMargin * 1.25) + make.leading.equalTo(lockedImageView.snp.trailing).offset(StandardHorizontalMargin) + make.trailing.equalTo(contentView).inset(StandardHorizontalMargin) + make.centerY.equalTo(lockedImageView) + } + + separator.snp.remakeConstraints { make in + make.leading.equalTo(self) + make.trailing.equalTo(self) + make.bottom.equalTo(self) + make.height.equalTo(1) + } + } +} diff --git a/Source/CourseContentHeaderView.swift b/Source/CourseContentHeaderView.swift new file mode 100644 index 0000000000..ce96859e0e --- /dev/null +++ b/Source/CourseContentHeaderView.swift @@ -0,0 +1,304 @@ +// +// CourseContentHeaderView.swift +// edX +// +// Created by MuhammadUmer on 11/04/2023. +// Copyright © 2023 edX. All rights reserved. +// + +import UIKit + +protocol CourseContentHeaderViewDelegate: AnyObject { + func didTapBackButton() + func didTapOnUnitBlock(block: CourseBlock) +} + +class CourseContentHeaderView: UIView { + typealias Environment = OEXStylesProvider + + weak var delegate: CourseContentHeaderViewDelegate? + + private let environment: Environment + + private let dropdownImageSize: CGFloat = 20 + private let backButtonImageSize: CGFloat = 44 + private let attributedUnicodeSpace = NSAttributedString(string: "\u{2002}") + private let cellHeight: CGFloat = 36 + private let gatedCellHeight: CGFloat = 76 + + private lazy var headerTextstyle: OEXMutableTextStyle = { + let style = OEXMutableTextStyle(weight: .bold, size: .base, color: environment.styles.neutralWhiteT()) + style.alignment = .center + return style + }() + + private lazy var titleTextStyle = OEXMutableTextStyle(weight: .normal, size: .base, color: environment.styles.neutralWhiteT()) + private lazy var subtitleTextStyle = OEXMutableTextStyle(weight: .bold, size: .large, color: environment.styles.neutralWhiteT()) + + private lazy var backButton: UIButton = { + let button = UIButton() + button.accessibilityIdentifier = "CourseContentHeaderView:back-button" + button.setImage(Icon.ArrowLeft.imageWithFontSize(size: 44), for: .normal) + button.tintColor = environment.styles.neutralWhiteT() + button.oex_addAction({ [weak self] _ in + self?.delegate?.didTapBackButton() + }, for: .touchUpInside) + return button + }() + + private lazy var headerLabel: UILabel = { + let label = UILabel() + label.accessibilityIdentifier = "CourseContentHeaderView:header-label" + label.backgroundColor = .clear + label.alpha = 0 + return label + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.accessibilityIdentifier = "CourseContentHeaderView:title-label" + label.backgroundColor = .clear + return label + }() + + private lazy var subtitleLabel: UILabel = { + let label = UILabel() + label.accessibilityIdentifier = "CourseContentHeaderView:subtitle-label" + return label + }() + + private lazy var bottomContainer: UIView = { + let view = UIView() + view.accessibilityIdentifier = "CourseContentHeaderView:bottom-container" + return view + }() + + private lazy var imageContainer: UIView = { + let view = UIView() + view.accessibilityIdentifier = "CourseContentHeaderView:image-container" + return view + }() + + private lazy var dropDownImageView: UIImageView = { + let imageView = UIImageView() + imageView.accessibilityIdentifier = "CourseContentHeaderView:image-view" + imageView.image = Icon.Dropdown.imageWithFontSize(size: dropdownImageSize) + imageView.tintColor = environment.styles.neutralWhiteT() + return imageView + }() + + private lazy var button: UIButton = { + let button = UIButton() + button.accessibilityIdentifier = "CourseContentHeaderView:button-view" + button.oex_addAction({ [weak self] _ in + self?.handleDropDown() + }, for: .touchUpInside) + return button + }() + + private var shouldShowDropDown: Bool = true { + didSet { + if !shouldShowDropDown { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in + self?.shouldShowDropDown = true + } + } + } + } + + private var dropDown: DropDown? + private var tableView: UITableView? + + private var currentBlock: CourseBlock? + private var blocks: [CourseBlock] = [] + + init(environment: Environment) { + self.environment = environment + super.init(frame: .zero) + addSubViews() + addConstraints() + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func addSubViews() { + backgroundColor = environment.styles.primaryLightColor() + + addSubview(backButton) + addSubview(headerLabel) + addSubview(titleLabel) + imageContainer.addSubview(dropDownImageView) + bottomContainer.addSubview(imageContainer) + bottomContainer.addSubview(subtitleLabel) + bottomContainer.addSubview(button) + addSubview(bottomContainer) + + button.isEnabled = false + dropDownImageView.isHidden = true + } + + private func addConstraints() { + dropDownImageView.snp.makeConstraints { make in + make.leading.equalTo(imageContainer) + make.top.equalTo(imageContainer) + make.bottom.equalTo(imageContainer) + make.width.equalTo(dropdownImageSize) + } + + backButton.snp.makeConstraints { make in + make.leading.equalTo(self).inset(StandardVerticalMargin / 2) + make.top.equalTo(self).offset(StandardVerticalMargin * 1.25) + make.height.equalTo(backButtonImageSize) + make.width.equalTo(backButtonImageSize) + } + + headerLabel.snp.makeConstraints { make in + make.centerY.equalTo(backButton) + make.top.equalTo(backButton) + make.leading.equalTo(backButton.snp.trailing).offset(StandardHorizontalMargin) + make.trailing.equalTo(self).inset(StandardHorizontalMargin * 2) + } + + titleLabel.snp.makeConstraints { make in + make.top.equalTo(backButton.snp.bottom).offset(StandardVerticalMargin * 2) + make.leading.equalTo(self).offset(StandardHorizontalMargin) + make.trailing.equalTo(self).inset(StandardHorizontalMargin) + } + + bottomContainer.snp.makeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(StandardVerticalMargin / 2) + make.leading.equalTo(self).offset(StandardHorizontalMargin) + make.trailing.equalTo(self).inset(StandardHorizontalMargin) + } + + subtitleLabel.snp.makeConstraints { make in + make.leading.top.bottom.equalToSuperview() + } + + imageContainer.snp.makeConstraints { make in + make.leading.equalTo(subtitleLabel.snp.trailing).offset(10) + make.trailing.top.bottom.equalToSuperview() + make.width.greaterThanOrEqualTo(dropdownImageSize) + } + + button.snp.makeConstraints { make in + make.leading.equalTo(bottomContainer) + make.top.equalTo(bottomContainer) + make.bottom.equalTo(bottomContainer) + make.trailing.equalTo(dropDownImageView) + } + } + + private func handleDropDown() { + if dropDown?.isVisible == true { + dropDown?.hide() + rotateImageView(clockWise: false) + dropDown = nil + } else { + if shouldShowDropDown { + showDropDown() + rotateImageView(clockWise: true) + } + } + } + + private func showDropDown() { + let safeAreaInset = UIApplication.shared.windows.first?.safeAreaInsets ?? .zero + + let dropDown = DropDown() + dropDown.accessibilityIdentifier = "CourseContentHeaderView:drop-down" + tableView = dropDown.setupCustom() + tableView?.accessibilityIdentifier = "CourseContentHeaderView:table-view" + + dropDown.bottomOffset = CGPoint(x: 0, y: StandardVerticalMargin * 5) + dropDown.direction = .bottom + dropDown.anchorView = bottomContainer + dropDown.dismissMode = .automatic + dropDown.cornerRadius = 10 + dropDown.offsetFromWindowBottom = safeAreaInset.bottom + dropDown.cancelAction = { [weak self] in + self?.shouldShowDropDown = false + self?.rotateImageView(clockWise: false) + } + self.dropDown = dropDown + + tableView?.dataSource = self + tableView?.delegate = self + tableView?.register(CourseContentHeaderBlockPickerCell.self, forCellReuseIdentifier: CourseContentHeaderBlockPickerCell.identifier) + tableView?.rowHeight = UITableView.automaticDimension + tableView?.estimatedRowHeight = cellHeight + tableView?.separatorStyle = .singleLine + tableView?.separatorColor = environment.styles.neutralXLight() + tableView?.separatorInset = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5) + tableView?.layer.cornerRadius = 10 + + let height = blocks.reduce(0) { $0 + ($1.isGated ? gatedCellHeight : cellHeight) } + dropDown.updatedTableHeight = height + dropDown.updatedMinHeight = cellHeight + + tableView?.reloadData() + + dropDown.show() + } + + private func rotateImageView(clockWise: Bool) { + UIView.animate(withDuration: 0.3) { [weak self] in + guard let weakSelf = self else { return } + if clockWise { + weakSelf.dropDownImageView.transform = weakSelf.dropDownImageView.transform.rotated(by: -(.pi * 0.999)) + } else { + weakSelf.dropDownImageView.transform = .identity + } + } + } + + func setBlocks(currentBlock: CourseBlock, blocks: [CourseBlock]) { + self.currentBlock = currentBlock + self.blocks = blocks + + if blocks.count > 1 { + button.isEnabled = true + dropDownImageView.isHidden = false + } + } + + func showHeaderLabel(show: Bool) { + headerLabel.alpha = show ? 1 : 0 + } + + func update(title: String, subtitle: String?) { + headerLabel.attributedText = headerTextstyle.attributedString(withText: title) + titleLabel.attributedText = titleTextStyle.attributedString(withText: title) + subtitleLabel.attributedText = subtitleTextStyle.attributedString(withText: subtitle) + } +} + +extension CourseContentHeaderView: UITableViewDelegate, UITableViewDataSource { + func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return blocks.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: CourseContentHeaderBlockPickerCell.identifier, for: indexPath) as! CourseContentHeaderBlockPickerCell + let block = blocks[indexPath.row] + cell.setup(block: block) + cell.contentView.backgroundColor = currentBlock?.blockID == block.blockID ? environment.styles.neutralXLight() : environment.styles.neutralWhiteT() + return cell + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + handleDropDown() + delegate?.didTapOnUnitBlock(block: blocks[indexPath.row]) + } + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + let block = blocks[indexPath.row] + return block.isGated ? gatedCellHeight : cellHeight + } +} diff --git a/Source/CourseContentPageViewController.swift b/Source/CourseContentPageViewController.swift index 264a540ff9..1da0c37233 100644 --- a/Source/CourseContentPageViewController.swift +++ b/Source/CourseContentPageViewController.swift @@ -116,7 +116,8 @@ public class CourseContentPageViewController : UIPageViewController, UIPageViewC // Filed http://www.openradar.appspot.com/radar?id=6188034965897216 against Apple to better expose // this API. // Verified on iOS9 and iOS 8 - if let scrollView = (view.subviews.compactMap { return $0 as? UIScrollView }).first { + if let scrollView = view.subviews.compactMap({ return $0 as? UIScrollView }).first { + scrollView.delegate = self scrollView.delaysContentTouches = false } addObservers() @@ -213,21 +214,35 @@ public class CourseContentPageViewController : UIPageViewController, UIPageViewC switch direction { case .Next: - titleText = isGroup ? Strings.nextUnit : Strings.next + if environment.config.isNewComponentNavigationEnabled { + titleText = Strings.next + } else { + titleText = isGroup ? Strings.nextUnit : Strings.next + } moveDirection = .forward case .Prev: - titleText = isGroup ? Strings.previousUnit : Strings.previous + if environment.config.isNewComponentNavigationEnabled { + titleText = Strings.previous + } else { + titleText = isGroup ? Strings.previousUnit : Strings.previous + } moveDirection = .reverse } - let destinationText = adjacentGroup?.displayName + let destinationText: String? + + if environment.config.isNewComponentNavigationEnabled { + destinationText = nil + } else { + destinationText = adjacentGroup?.displayName + } let view = DetailToolbarButton(direction: direction, titleText: titleText, destinationText: destinationText) {[weak self] in self?.moveInDirection(direction: moveDirection) } view.sizeToFit() - let barButtonItem = UIBarButtonItem(customView: view) + let barButtonItem = UIBarButtonItem(customView: view) barButtonItem.isEnabled = enabled view.button.isEnabled = enabled return barButtonItem @@ -264,6 +279,9 @@ public class CourseContentPageViewController : UIPageViewController, UIPageViewC UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), nextItem ], animated : true) + if environment.config.isNewComponentNavigationEnabled { + navigationController?.toolbar.barTintColor = OEXStyles.shared().neutralWhiteT() + } } else { toolbarItems = [] @@ -318,7 +336,16 @@ public class CourseContentPageViewController : UIPageViewController, UIPageViewC } private func showCelebratoryModal(direction: UIPageViewController.NavigationDirection, overController: UIViewController?) { - let celebratoryModalView = environment.router?.showCelebratoryModal(fromController: self, courseID: courseQuerier.courseID) + + var controller: UIViewController = self + + if environment.config.isNewComponentNavigationEnabled { + if let contentContainerController = parent?.parent { + controller = contentContainerController + } + } + + let celebratoryModalView = environment.router?.showCelebratoryModal(fromController: controller, courseID: courseQuerier.courseID) if let videoBlockViewController = overController as? VideoBlockViewController { celebratoryModalView?.delegate = videoBlockViewController } @@ -392,6 +419,30 @@ public class CourseContentPageViewController : UIPageViewController, UIPageViewC updateTransitionState(is: true) } + public func moveToBlock(block: CourseBlock) { + guard let cursor = contentLoader.value, cursor.current.block.blockID != block.blockID else { + return + } + + let currentIndex = cursor.currentIndex() + + cursor.updateCurrentToItemMatching { $0.block.blockID == block.blockID } + + let nextIndex = cursor.currentIndex() + + let direction: NavigationDirection = nextIndex > currentIndex ? .forward : .reverse + + guard let nextController = controllerForBlock(block: block) else { return } + + setPageControllers(with: [nextController], direction: direction, animated: false) { [weak self] finished in + guard let weakSelf = self else { return } + weakSelf.updateTransitionState(is: false) + if weakSelf.shouldCelebrationAppear { + weakSelf.showCelebratoryModal(direction: direction, overController: nextController) + } + } + } + func controllerForBlock(block : CourseBlock, shouldCelebrationAppear: Bool = false) -> UIViewController? { let blockViewController : UIViewController? @@ -469,6 +520,19 @@ public class CourseContentPageViewController : UIPageViewController, UIPageViewC } } +// There is a bug with UIPageViewController, if user tries to quickly scroll between controllers, +// the UIPageViewControllerDelegate is not being called appropriately, +// to handle this, listen to UISsrollViewDelegate and handle the user interaction. +extension CourseContentPageViewController: UIScrollViewDelegate { + public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + updateTransitionState(is: false) + } + + public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + updateTransitionState(is: false) + } +} + // MARK: Testing extension CourseContentPageViewController { public func t_blockIDForCurrentViewController() -> OEXStream { diff --git a/Source/CourseDashboardAccessErrorView.swift b/Source/CourseDashboardAccessErrorView.swift new file mode 100644 index 0000000000..aacded5b55 --- /dev/null +++ b/Source/CourseDashboardAccessErrorView.swift @@ -0,0 +1,245 @@ +// +// CourseDashboardAccessErrorView.swift +// edX +// +// Created by Saeed Bashir on 12/2/22. +// Copyright © 2022 edX. All rights reserved. +// + +import Foundation + +protocol CourseDashboardAccessErrorViewDelegate: AnyObject { + func findCourseAction() + func upgradeCourseAction(course: OEXCourse, coursePrice: String, price: NSDecimalNumber?, currencyCode: String?, completion: @escaping ((Bool)->())) + func coursePrice(cell: CourseDashboardAccessErrorView, price: String?, elapsedTime: Int) +} + +class CourseDashboardAccessErrorView: UIView { + + typealias Environment = OEXConfigProvider & ServerConfigProvider & OEXInterfaceProvider + weak var delegate: CourseDashboardAccessErrorViewDelegate? + + private lazy var infoMessagesView = ValuePropMessagesView() + private var environment: Environment? + + private lazy var contentView = UIView() + + private lazy var upgradeButton: CourseUpgradeButtonView = { + let upgradeButton = CourseUpgradeButtonView() + upgradeButton.tapAction = { [weak self] in + guard let course = self?.course, let coursePrice = self?.localizedCoursePrice else { return } + self?.delegate?.upgradeCourseAction(course: course, coursePrice: coursePrice, price: self?.price, currencyCode: self?.currencyCode) { _ in + self?.upgradeButton.stopAnimating() + } + } + return upgradeButton + }() + + private var titleLabel: UILabel = { + let label = UILabel() + label.numberOfLines = 0 + label.accessibilityIdentifier = "CourseDashboardAccessErrorView:title-label" + return label + }() + + private var infoLabel: UILabel = { + let label = UILabel() + label.numberOfLines = 0 + label.accessibilityIdentifier = "CourseDashboardAccessErrorView:info-label" + return label + }() + + private lazy var findCourseButton: UIButton = { + let button = UIButton(type: .system) + button.accessibilityIdentifier = "CourseDashboardAccessErrorView:findcourse-button" + button.oex_addAction({ [weak self] _ in + self?.delegate?.findCourseAction() + }, for: .touchUpInside) + return button + }() + + private lazy var hiddenView: UIView = { + let view = UIView() + view.accessibilityIdentifier = "CourseDashboardAccessErrorView:hidden-view" + view.backgroundColor = .clear + + return view + }() + + init() { + super.init(frame: .zero) + } + + private var course: OEXCourse? + private var error: CourseAccessHelper? + + private var localizedCoursePrice: String? + private var price: NSDecimalNumber? + private var currencyCode: String? + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func handleCourseAccessError(environment: Environment, course: OEXCourse?, error: CourseAccessHelper?) { + guard let course = course else { return } + + self.course = course + self.error = error + self.environment = environment + + let title = error?.errorTitle ?? Strings.CourseDashboard.Error.courseEndedTitle + let info = error?.errorInfo ?? Strings.CourseDashboard.Error.courseAccessExpiredInfo + let showValueProp = error?.shouldShowValueProp ?? false + + configureViews() + update(title: title, info: info) + fetchCoursePrice() + + var upgradeEnabled: Bool = false + + if let enrollment = environment.interface?.enrollmentForCourse(withID: course.course_id), enrollment.isUpgradeable && environment.serverConfig.iapConfig?.enabledforUser == true { + upgradeEnabled = true + } + + setConstraints(showValueProp: showValueProp, showUpgradeButton: upgradeEnabled) + } + + private func configureViews() { + accessibilityIdentifier = "CourseDashboardAccessErrorView:view" + addSubview(contentView) + contentView.addSubview(titleLabel) + contentView.addSubview(infoLabel) + contentView.addSubview(infoMessagesView) + contentView.addSubview(upgradeButton) + contentView.addSubview(findCourseButton) + contentView.addSubview(hiddenView) + } + + func hideUpgradeButton() { + setConstraints(showValueProp: error?.shouldShowValueProp ?? false, showUpgradeButton: false) + } + + private func setConstraints(showValueProp: Bool, showUpgradeButton: Bool) { + contentView.snp.remakeConstraints { make in + make.edges.equalTo(self) + } + + titleLabel.snp.remakeConstraints { make in + make.top.equalTo(contentView).offset(StandardVerticalMargin * 2) + make.leading.equalTo(contentView).offset(StandardHorizontalMargin) + make.trailing.equalTo(contentView).inset(StandardHorizontalMargin) + } + + infoLabel.snp.remakeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(2 * StandardVerticalMargin) + make.leading.equalTo(contentView).offset(StandardHorizontalMargin) + make.trailing.equalTo(contentView).inset(StandardHorizontalMargin) + } + + var lastView: UIView + lastView = infoLabel + + if showValueProp { + infoMessagesView.snp.remakeConstraints { make in + make.top.equalTo(lastView.snp.bottom).offset(StandardVerticalMargin * 2) + make.leading.equalTo(contentView).offset(StandardHorizontalMargin) + make.trailing.equalTo(contentView).inset(StandardHorizontalMargin) + make.height.equalTo(infoMessagesView.height()) + } + + lastView = infoMessagesView + } + + if showUpgradeButton { + applyStyle(to: findCourseButton, text: Strings.CourseDashboard.Error.findANewCourse, light: true) + + upgradeButton.isHidden = false + upgradeButton.snp.remakeConstraints { make in + make.top.equalTo(lastView.snp.bottom).offset(StandardVerticalMargin * 5) + make.leading.equalTo(contentView).offset(StandardHorizontalMargin) + make.trailing.equalTo(contentView).inset(StandardHorizontalMargin) + make.height.equalTo(StandardVerticalMargin * 5.5) + } + + lastView = upgradeButton + } else { + applyStyle(to: findCourseButton, text: Strings.CourseDashboard.Error.findANewCourse, light: false) + upgradeButton.isHidden = true + upgradeButton.snp.remakeConstraints { make in + make.height.equalTo(0) + } + } + + findCourseButton.snp.remakeConstraints { make in + make.top.equalTo(lastView.snp.bottom).offset(StandardVerticalMargin * 2) + make.leading.equalTo(contentView).offset(StandardHorizontalMargin) + make.trailing.equalTo(contentView).inset(StandardHorizontalMargin) + make.height.equalTo(StandardVerticalMargin * 5.5) + } + + hiddenView.snp.remakeConstraints { make in + make.top.equalTo(findCourseButton.snp.bottom) + make.bottom.equalTo(contentView).offset(1) + } + } + + private func update(title: String, info: String) { + let titleTextStyle = OEXTextStyle(weight: .bold, size: .xLarge, color: OEXStyles.shared().neutralBlackT()) + let infoTextStyle = OEXTextStyle(weight: .normal, size: .base, color: OEXStyles.shared().neutralXDark()) + titleLabel.attributedText = titleTextStyle.attributedString(withText: title) + infoLabel.attributedText = infoTextStyle.attributedString(withText: info) + } + + private func applyStyle(to button: UIButton, text: String, light: Bool) { + let style: OEXTextStyle + let backgroundColor: UIColor + let borderWidth: CGFloat + let borderColor: UIColor + + if light { + style = OEXTextStyle(weight: .normal, size: .xLarge, color: OEXStyles.shared().secondaryBaseColor()) + backgroundColor = .clear + borderWidth = 1 + borderColor = OEXStyles.shared().neutralXLight() + } else { + style = OEXTextStyle(weight: .normal, size: .xLarge, color: OEXStyles.shared().neutralWhiteT()) + backgroundColor = OEXStyles.shared().secondaryBaseColor() + borderWidth = 0 + borderColor = .clear + } + + button.setAttributedTitle(style.attributedString(withText: text), for: UIControl.State()) + button.backgroundColor = backgroundColor + button.layer.borderWidth = borderWidth + button.layer.borderColor = borderColor.cgColor + button.layer.cornerRadius = 0 + button.layer.masksToBounds = true + } + + func fetchCoursePrice() { + guard let courseSku = course?.sku, + let enrollment = environment?.interface?.enrollmentForCourse(withID: course?.course_id), enrollment.isUpgradeable && environment?.serverConfig.iapConfig?.enabledforUser == true else { return } + + let startTime = CFAbsoluteTimeGetCurrent() + DispatchQueue.main.async { [weak self] in + self?.upgradeButton.startShimeringEffect() + PaymentManager.shared.fetchPrroduct(courseSku) { [weak self] product in + guard let weakSelf = self else { return } + + if let product = product, let coursePrice = product.localizedPrice { + let elapsedTime = CFAbsoluteTimeGetCurrent() - startTime + weakSelf.localizedCoursePrice = coursePrice + weakSelf.price = product.price + weakSelf.currencyCode = product.priceLocale.currencyCode + weakSelf.delegate?.coursePrice(cell: weakSelf, price: coursePrice, elapsedTime: elapsedTime.millisecond) + weakSelf.upgradeButton.setPrice(coursePrice) + weakSelf.upgradeButton.stopShimmerEffect() + } + else { + weakSelf.delegate?.coursePrice(cell: weakSelf, price: nil, elapsedTime: 0) + } + } + } + } +} diff --git a/Source/CourseDashboardErrorView.swift b/Source/CourseDashboardErrorView.swift new file mode 100644 index 0000000000..482a50d739 --- /dev/null +++ b/Source/CourseDashboardErrorView.swift @@ -0,0 +1,171 @@ +// +// CourseDashboardErrorView.swift +// edX +// +// Created by Saeed Bashir on 11/29/22. +// Copyright © 2022 edX. All rights reserved. +// + +import Foundation + +class CourseDashboardErrorView: UIView { + var myCoursesAction: (() -> Void)? + + private let contentView = UIView() + private let containerView = UIView() + private let bottomContainer = UIView() + private let errorLabel: UILabel = { + let label = UILabel() + label.accessibilityIdentifier = "CourseDashboardErrorView:error-label" + label.numberOfLines = 0 + let style = OEXMutableTextStyle(weight: .bold, size: .xxLarge, color: OEXStyles.shared().neutralBlackT()) + style.alignment = .center + label.attributedText = style.attributedString(withText: Strings.CourseDashboard.Error.generalError) + + return label + }() + + private lazy var errorImageView: UIImageView = { + guard let image = UIImage(named: "dashboard_error_image") else { return UIImageView() } + let imageView = UIImageView(image: image) + imageView.accessibilityIdentifier = "CourseDashboardErrorView:error-imageView" + return imageView + }() + + private lazy var gotoMyCoursesButton: UIButton = { + let button = UIButton(type: .system) + button.accessibilityIdentifier = "CourseDashboardErrorView:gotocourses-button" + button.backgroundColor = OEXStyles.shared().secondaryBaseColor() + button.oex_addAction({ [weak self] _ in + self?.myCoursesAction?() + }, for: .touchUpInside) + + let style = OEXTextStyle(weight: .normal, size: .xLarge, color: OEXStyles.shared().neutralWhite()) + button.setAttributedTitle(style.attributedString(withText: Strings.CourseDashboard.Error.goToCourses), for: UIControl.State()) + + return button + }() + + init() { + super.init(frame: .zero) + addSubViews() + setAccessibilityIdentifiers() + setConstraints() + } + + override func layoutSubviews() { + super.layoutSubviews() + containerView.addShadow(offset: CGSize(width: 0, height: 2), color: OEXStyles.shared().primaryDarkColor(), radius: 2, opacity: 0.35, cornerRadius: 6) + setConstraints() + } + + private func setConstraints() { + if traitCollection.verticalSizeClass == .regular { + addPortraitConstraints() + } else { + addLandscapeConstraints() + } + } + + private func addSubViews() { + backgroundColor = OEXStyles.shared().neutralWhiteT() + addSubview(contentView) + contentView.addSubview(containerView) + containerView.addSubview(errorImageView) + containerView.addSubview(bottomContainer) + + bottomContainer.addSubview(errorLabel) + bottomContainer.addSubview(gotoMyCoursesButton) + + containerView.backgroundColor = OEXStyles.shared().neutralWhiteT() + } + + private func setAccessibilityIdentifiers() { + accessibilityIdentifier = "CourseDashboardErrorView:view" + containerView.accessibilityIdentifier = "CourseDashboardErrorView:container-view" + bottomContainer.accessibilityIdentifier = "CourseDashboardErrorView:bottom-container-view" + } + + private func addPortraitConstraints() { + contentView.snp.remakeConstraints { make in + make.edges.equalTo(self) + } + + containerView.snp.remakeConstraints { make in + make.top.equalTo(contentView).offset(StandardVerticalMargin * 2) + make.leading.equalTo(contentView).offset(StandardHorizontalMargin) + make.trailing.equalTo(contentView).inset(StandardHorizontalMargin) + make.bottom.equalTo(contentView).inset(StandardVerticalMargin * 2) + } + + errorImageView.snp.remakeConstraints { make in + make.top.equalTo(containerView) + make.leading.equalTo(containerView) + make.trailing.equalTo(containerView) + make.height.equalTo(StandardVerticalMargin * 33) + } + + bottomContainer.snp.remakeConstraints { make in + make.top.equalTo(errorImageView.snp.bottom) + make.leading.equalTo(containerView) + make.trailing.equalTo(containerView) + make.bottom.equalTo(containerView) + } + + errorLabel.snp.remakeConstraints { make in + make.top.equalTo(bottomContainer).offset(StandardVerticalMargin * 2) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2.2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2.2) + } + + gotoMyCoursesButton.snp.remakeConstraints { make in + make.top.equalTo(errorLabel.snp.bottom).offset(StandardVerticalMargin * 2) + make.height.equalTo(StandardVerticalMargin * 5.5) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2) + make.bottom.equalTo(bottomContainer).inset(StandardVerticalMargin * 2) + } + } + + private func addLandscapeConstraints() { + containerView.snp.remakeConstraints { make in + make.top.equalTo(contentView).offset(StandardVerticalMargin * 2) + make.bottom.equalTo(contentView).inset(StandardVerticalMargin * 2) + make.leading.equalTo(contentView).offset(StandardHorizontalMargin) + make.trailing.equalTo(contentView).inset(StandardHorizontalMargin) + } + + errorImageView.snp.remakeConstraints { make in + make.top.equalTo(containerView) + make.leading.equalTo(containerView) + make.height.equalTo(StandardVerticalMargin * 33) + make.width.equalTo(contentView.frame.width / 2) + make.bottom.equalTo(containerView) + } + + bottomContainer.snp.remakeConstraints { make in + make.top.equalTo(containerView).offset(-StandardVerticalMargin * 2) + make.leading.equalTo(errorImageView.snp.trailing) + make.trailing.equalTo(containerView) + make.bottom.equalTo(containerView) + } + + errorLabel.snp.remakeConstraints { make in + make.top.equalTo(bottomContainer).offset(StandardVerticalMargin * 2) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2) + make.bottom.equalTo(gotoMyCoursesButton.snp.top) + } + + gotoMyCoursesButton.snp.remakeConstraints { make in + make.bottom.equalTo(bottomContainer).inset(StandardVerticalMargin * 4) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2) + make.height.equalTo(StandardVerticalMargin * 5.5) + } + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Source/CourseDashboardHeaderView.swift b/Source/CourseDashboardHeaderView.swift new file mode 100644 index 0000000000..07f70c1c88 --- /dev/null +++ b/Source/CourseDashboardHeaderView.swift @@ -0,0 +1,397 @@ +// +// CourseDashboardHeaderView.swift +// edX +// +// Created by MuhammadUmer on 15/11/2022. +// Copyright © 2022 edX. All rights reserved. +// + +import UIKit + +protocol CourseDashboardHeaderViewDelegate: AnyObject { + func didTapOnValueProp() + func didTapOnClose() + func didTapOnShareCourse(shareView: UIView) + func didTapTabbarItem(at position: Int, tabbarItem: TabBarItem) +} + +enum HeaderViewState { + case initial + case animating + case expanded + case collapsed +} + +class CourseDashboardHeaderView: UIView { + + typealias Environment = OEXAnalyticsProvider & DataManagerProvider & OEXInterfaceProvider & NetworkManagerProvider & ReachabilityProvider & OEXRouterProvider & OEXConfigProvider & OEXStylesProvider & ServerConfigProvider & OEXSessionProvider & RemoteConfigProvider + + weak var delegate: CourseDashboardHeaderViewDelegate? + + private let imageSize: CGFloat = 20 + private let attributedIconOfset: CGFloat = -4 + private let attributedUnicodeSpace = NSAttributedString(string: "\u{2002}") + + private lazy var containerView = UIView() + private lazy var courseInfoContainerView = UIView() + private var bottomContainer = UIView() + private lazy var datesBannerView = NewCourseDateBannerView() + private var bannerInfo: DatesBannerInfo? = nil + + var state: HeaderViewState = .initial + + private lazy var orgLabel: UILabel = { + let label = UILabel() + label.accessibilityIdentifier = "CourseDashboardHeaderView:org-label" + return label + }() + + private lazy var courseTitleLabel: UILabel = { + let label = UILabel() + label.accessibilityIdentifier = "CourseDashboardHeaderView:course-label-header" + label.backgroundColor = .clear + return label + }() + + private lazy var courseTitle: UITextView = { + let textView = UITextView() + textView.accessibilityIdentifier = "CourseDashboardHeaderView:course-label" + textView.isEditable = false + textView.isSelectable = true + textView.isUserInteractionEnabled = true + textView.backgroundColor = .clear + textView.isScrollEnabled = false + let padding = textView.textContainer.lineFragmentPadding + textView.textContainerInset = UIEdgeInsets(top: 0, left: -padding, bottom: 0, right: -padding) + + let tapGesture = AttachmentTapGestureRecognizer { [weak self] _ in + self?.delegate?.didTapOnShareCourse(shareView: textView) + } + + textView.addGestureRecognizer(tapGesture) + + return textView + }() + + private lazy var accessLabel: UILabel = { + let label = UILabel() + label.accessibilityIdentifier = "CourseDashboardHeaderView:course-access-label" + return label + }() + + private lazy var closeButton: UIButton = { + let button = UIButton() + button.accessibilityIdentifier = "CourseDashboardHeaderView:close-button" + button.setImage(Icon.Close.imageWithFontSize(size: imageSize), for: .normal) + button.accessibilityLabel = Strings.Accessibility.closeLabel + button.accessibilityHint = Strings.Accessibility.closeHint + button.oex_addAction({ [weak self] _ in + self?.delegate?.didTapOnClose() + }, for: .touchUpInside) + return button + }() + + private lazy var certificateView: CourseCertificateView? = nil + + private func addCertificateView() { + guard let course = course, + let enrollment = environment.interface?.enrollmentForCourse(withID: course.course_id), + let certificateUrl = enrollment.certificateUrl, + let certificateImage = UIImage(named: "courseCertificate") else { return } + + let certificateItem = CourseCertificateIem(certificateImage: certificateImage, certificateUrl: certificateUrl, action: { [weak self] in + if let weakSelf = self, let url = NSURL(string: certificateUrl), let parent = weakSelf.firstAvailableUIViewController() { + weakSelf.environment.router?.showCertificate(url: url, title: enrollment.course.name, fromController: parent) + } + }) + certificateView = CourseCertificateView(certificateItem: certificateItem) + certificateView?.accessibilityIdentifier = "CourseDashboardHeaderView:certificate-view" + } + + private lazy var valuePropView: UIView = { + let valuePropView = UIView() + valuePropView.accessibilityIdentifier = "CourseDashboardHeaderView:value-prop-view" + valuePropView.backgroundColor = environment.styles.standardBackgroundColor() + + let lockedImage = Icon.Closed.imageWithFontSize(size: imageSize).image(with: environment.styles.neutralWhiteT()) + let imageAttachment = NSTextAttachment() + imageAttachment.image = lockedImage + + if let image = imageAttachment.image { + imageAttachment.bounds = CGRect(x: 0, y: attributedIconOfset, width: image.size.width, height: image.size.height) + } + + let attributedImageString = NSAttributedString(attachment: imageAttachment) + let style = OEXTextStyle(weight: .semiBold, size: .base, color: environment.styles.neutralWhiteT()) + + let attributedStrings = [ + attributedImageString, + attributedUnicodeSpace, + style.attributedString(withText: Strings.ValueProp.courseDashboardButtonTitle) + ] + + let attributedTitle = NSAttributedString.joinInNaturalLayout(attributedStrings: attributedStrings) + + let button = UIButton() + button.oex_addAction({ [weak self] _ in + self?.delegate?.didTapOnValueProp() + }, for: .touchUpInside) + + button.backgroundColor = environment.styles.secondaryDarkColor() + button.setAttributedTitle(attributedTitle, for: .normal) + valuePropView.addSubview(button) + + button.snp.remakeConstraints { make in + make.edges.equalTo(valuePropView) + } + + return valuePropView + }() + + private lazy var tabbarView: CourseDashboardTabbarView = { + let tabbarView = CourseDashboardTabbarView(environment: environment, course: course, tabbarItems: tabbarItems) + tabbarView.accessibilityIdentifier = "CourseDashboardHeaderView:tabbar-view" + tabbarView.delegate = self + return tabbarView + }() + + private lazy var orgTextStyle = OEXTextStyle(weight: .bold, size: .small, color: environment.styles.accentBColor()) + + private lazy var courseTextStyle: OEXMutableTextStyle = { + let style = OEXMutableTextStyle(textStyle: OEXTextStyle(weight: .bold, size: .xLarge, color: environment.styles.neutralWhiteT())) + style.lineBreakMode = .byWordWrapping + return style + }() + + private lazy var courseTextLabelStyle: OEXMutableTextStyle = { + let style = OEXMutableTextStyle(textStyle: OEXTextStyle(weight: .bold, size: .base, color: environment.styles.neutralWhiteT())) + style.alignment = .center + return style + }() + + private lazy var accessTextStyle = OEXTextStyle(weight: .normal, size: .xSmall, color: environment.styles.neutralXLight()) + + private var canShowValuePropView: Bool { + guard let enrollment = environment.interface?.enrollmentForCourse(withID: course?.course_id) else { return false } + return enrollment.isUpgradeable && environment.serverConfig.valuePropEnabled + } + + private var showTabbar = false + + private let environment: Environment + private let course: OEXCourse? + private let tabbarItems: [TabBarItem] + private let error: CourseAccessHelper? + // it will be used to hide value prop from header in favor of embeded value prop on course dashboard + private var hideValueProp: Bool = false + + init(environment: Environment, course: OEXCourse?, tabbarItems: [TabBarItem], error: CourseAccessHelper?) { + self.environment = environment + self.course = course + self.tabbarItems = tabbarItems + self.error = error + super.init(frame: .zero) + + addSubViews() + setOrUpdateConstraints() + configureView() + } + + private func configureView() { + courseTitleLabel.attributedText = courseTextLabelStyle.attributedString(withText: course?.name) + + let courseTitleText = [ + courseTextStyle.attributedString(withText: course?.name), + attributedUnicodeSpace, + Icon.ShareCourse.attributedText(style: courseTextStyle, yOffset: attributedIconOfset) + ] + + orgLabel.attributedText = orgTextStyle.attributedString(withText: course?.org) + courseTitle.attributedText = NSAttributedString.joinInNaturalLayout(attributedStrings: courseTitleText) + accessLabel.attributedText = accessTextStyle.attributedString(withText: course?.nextRelevantDate) + } + + private func addSubViews() { + containerView.backgroundColor = environment.styles.primaryLightColor() + closeButton.tintColor = environment.styles.neutralWhiteT() + + addSubview(containerView) + containerView.addSubview(courseTitleLabel) + containerView.addSubview(closeButton) + containerView.addSubview(courseInfoContainerView) + containerView.addSubview(tabbarView) + + courseInfoContainerView.addSubview(orgLabel) + courseInfoContainerView.addSubview(courseTitle) + courseInfoContainerView.addSubview(accessLabel) + + showCourseTitleHeaderLabel(show: false) + addCertificateView() + } + + private func setOrUpdateConstraints() { + containerView.snp.remakeConstraints { make in + make.edges.equalTo(self) + } + + closeButton.snp.remakeConstraints { make in + make.top.equalTo(containerView).offset(StandardVerticalMargin * 2) + make.trailing.equalTo(containerView).inset(StandardVerticalMargin * 2) + make.height.equalTo(imageSize) + make.width.equalTo(imageSize) + } + + courseTitleLabel.snp.remakeConstraints { make in + make.top.equalTo(closeButton) + make.centerY.equalTo(closeButton) + make.leading.equalTo(containerView).offset(StandardHorizontalMargin) + make.trailing.equalTo(closeButton.snp.leading).offset(-StandardHorizontalMargin) + } + + if state == .collapsed { return } + + courseInfoContainerView.snp.remakeConstraints { make in + make.top.equalTo(closeButton.snp.bottom) + make.leading.equalTo(containerView).offset(StandardHorizontalMargin) + make.trailing.equalTo(containerView).inset(StandardHorizontalMargin) + } + + orgLabel.snp.remakeConstraints { make in + make.top.equalTo(courseInfoContainerView).offset(StandardVerticalMargin) + make.leading.equalTo(courseInfoContainerView) + make.trailing.equalTo(courseInfoContainerView) + } + + courseTitle.snp.remakeConstraints { make in + make.top.equalTo(orgLabel.snp.bottom).offset(StandardVerticalMargin / 2) + make.leading.equalTo(courseInfoContainerView) + make.trailing.lessThanOrEqualTo(courseInfoContainerView) + } + + accessLabel.snp.remakeConstraints { make in + make.top.equalTo(courseTitle.snp.bottom).offset(StandardVerticalMargin / 2) + make.leading.equalTo(courseInfoContainerView) + make.trailing.equalTo(courseInfoContainerView) + make.bottom.equalTo(courseInfoContainerView).inset(StandardVerticalMargin) + } + + bottomContainer = courseInfoContainerView + + if let certificateView = certificateView { + containerView.addSubview(certificateView) + + certificateView.snp.remakeConstraints { make in + make.top.equalTo(bottomContainer.snp.bottom).offset(StandardVerticalMargin) + make.leading.equalTo(containerView) + make.trailing.equalTo(containerView) + } + + bottomContainer = certificateView + } + + if canShowValuePropView && !hideValueProp { + containerView.addSubview(valuePropView) + + valuePropView.snp.remakeConstraints { make in + make.top.equalTo(bottomContainer.snp.bottom).offset(StandardVerticalMargin) + make.leading.equalTo(containerView).offset(StandardHorizontalMargin) + make.trailing.equalTo(containerView).inset(StandardHorizontalMargin) + make.height.equalTo(StandardVerticalMargin * 4.5) + } + + bottomContainer = valuePropView + } + else { + valuePropView.snp.remakeConstraints { make in + make.height.equalTo(0) + } + valuePropView.removeFromSuperview() + } + + if bannerInfo != nil { + datesBannerView.removeFromSuperview() + containerView.addSubview(datesBannerView) + + datesBannerView.snp.remakeConstraints { make in + make.top.equalTo(bottomContainer.snp.bottom).offset(StandardVerticalMargin) + make.leading.equalTo(containerView) + make.trailing.equalTo(containerView) + } + bottomContainer = datesBannerView + } + + tabbarView.snp.remakeConstraints { make in + let offSet = bottomContainer == certificateView || bannerInfo != nil ? 0 : StandardVerticalMargin * 2 + make.top.equalTo(bottomContainer.snp.bottom).offset(offSet) + make.leading.equalTo(containerView) + make.trailing.equalTo(containerView) + make.bottom.equalTo(containerView) + make.height.equalTo(showTabbar ? StandardVerticalMargin * 4.8 : 0) + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func updateTabbarView(item: TabBarItem) { + tabbarView.updateView(item: item) + } + + func showTabbarView(show: Bool) { + showTabbar = show + setOrUpdateConstraints() + } + + func updateHeader(collapse: Bool) { + courseInfoContainerView.alpha = collapse ? 0 : 1 + valuePropView.alpha = collapse ? 0 : (canShowValuePropView && !hideValueProp ? 1 : 0) + certificateView?.alpha = collapse ? 0 : 1 + datesBannerView.alpha = collapse ? 0 : 1 + updateTabbarConstraints(collapse: collapse) + } + + func showCourseTitleHeaderLabel(show: Bool) { + courseTitleLabel.alpha = show ? 1 : 0 + } + + func updateTabbarConstraints(collapse: Bool) { + tabbarView.snp.remakeConstraints { make in + let offSet = bottomContainer == certificateView || bannerInfo != nil && !collapse ? 0 : StandardVerticalMargin * 2 + make.top.equalTo(collapse ? closeButton.snp.bottom : bottomContainer.snp.bottom).offset(offSet) + make.leading.equalTo(containerView) + make.trailing.equalTo(containerView) + make.height.equalTo(collapse || showTabbar ? StandardVerticalMargin * 4.8 : 0) + if !collapse { + make.bottom.equalTo(containerView) + } + } + } + + func showDatesBanner(delegate: CourseOutlineTableController?, bannerInfo: DatesBannerInfo?) { + self.bannerInfo = bannerInfo + datesBannerView.bannerInfo = bannerInfo + datesBannerView.delegate = delegate + datesBannerView.setupView() + setOrUpdateConstraints() + } + + func removeDatesBanner() { + bannerInfo = nil + datesBannerView.bannerInfo = bannerInfo + datesBannerView.delegate = nil + datesBannerView.removeFromSuperview() + setOrUpdateConstraints() + } + + func hidevalueProp(hide: Bool = true) { + hideValueProp = hide + setOrUpdateConstraints() + } +} + +extension CourseDashboardHeaderView: CourseDashboardTabbarViewDelegate { + func didSelectItem(at position: Int, tabbarItem: TabBarItem) { + delegate?.didTapTabbarItem(at: position, tabbarItem: tabbarItem) + } +} diff --git a/Source/CourseDashboardTabbarView.swift b/Source/CourseDashboardTabbarView.swift new file mode 100644 index 0000000000..5730200b54 --- /dev/null +++ b/Source/CourseDashboardTabbarView.swift @@ -0,0 +1,233 @@ +// +// CourseDashboardTabbarView.swift +// edX +// +// Created by MuhammadUmer on 02/12/2022. +// Copyright © 2022 edX. All rights reserved. +// + +import UIKit + +protocol CourseDashboardTabbarViewDelegate: AnyObject { + func didSelectItem(at position: Int, tabbarItem: TabBarItem) +} + +class CourseDashboardTabbarView: UIView { + typealias Environment = OEXAnalyticsProvider & DataManagerProvider & OEXInterfaceProvider & NetworkManagerProvider & ReachabilityProvider & OEXRouterProvider & OEXConfigProvider & OEXStylesProvider & ServerConfigProvider & OEXSessionProvider & RemoteConfigProvider + + weak var delegate: CourseDashboardTabbarViewDelegate? + + lazy var textStyle: OEXMutableTextStyle = { + let style = OEXMutableTextStyle(textStyle: OEXTextStyle(weight: .normal, size: .base, color: OEXStyles.shared().neutralXXDark())) + style.alignment = .center + return style + }() + + private lazy var collectionView: UICollectionView = { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) + collectionView.accessibilityIdentifier = "CourseDashboardTabbarView:collection-view" + collectionView.showsHorizontalScrollIndicator = false + collectionView.backgroundColor = .clear + collectionView.delegate = self + collectionView.dataSource = self + collectionView.register(CourseDashboardTabbarViewCell.self, forCellWithReuseIdentifier: CourseDashboardTabbarViewCell.identifier) + collectionView.translatesAutoresizingMaskIntoConstraints = false + return collectionView + }() + + private lazy var bottomBar: UIView = { + let view = UIView() + view.accessibilityIdentifier = "CourseDashboardTabbarView:bottom-bar-view" + view.backgroundColor = environment.styles.neutralLight() + return view + }() + + private var shouldShowDiscussions: Bool { + guard let course = course else { return false } + return environment.config.discussionsEnabled && course.hasDiscussionsEnabled + } + + private var shouldShowHandouts: Bool { + guard let course = course else { return false } + return course.course_handouts?.isEmpty == false + } + + private var selectedItemIndex = 0 + private var tabBarItems: [TabBarItem] = [] + + private let environment: Environment + private let course: OEXCourse? + + init(environment: Environment, course: OEXCourse?, tabbarItems: [TabBarItem]) { + self.environment = environment + self.course = course + self.tabBarItems = tabbarItems + super.init(frame: .zero) + accessibilityIdentifier = "CourseDashboardTabbarView" + addSubViews() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func addSubViews() { + backgroundColor = environment.styles.neutralWhiteT() + + addSubview(bottomBar) + addSubview(collectionView) + + bottomBar.snp.makeConstraints { make in + make.leading.equalTo(self) + make.trailing.equalTo(self) + make.bottom.equalTo(self) + make.height.equalTo(2) + } + + collectionView.snp.makeConstraints { make in + make.edges.equalTo(self) + } + + if tabBarItems.isEmpty { return } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in + guard let weakSelf = self else { return } + let selectedItemIndex = weakSelf.selectedItemIndex + let tabBarItems = weakSelf.tabBarItems + let indexPath = IndexPath(item: selectedItemIndex, section: 0) + weakSelf.collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .centeredHorizontally) + weakSelf.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true) + weakSelf.delegate?.didSelectItem(at: selectedItemIndex, tabbarItem: tabBarItems[selectedItemIndex]) + } + } + + func updateView(item: TabBarItem) { + UIView.animate(withDuration: 0.5) { [weak self] in + guard let weakSelf = self else { return } + if let index = weakSelf.tabBarItems.firstIndex(of: item) { + let indexPath = IndexPath(item: index, section: 0) + weakSelf.collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .centeredHorizontally) + weakSelf.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true) + } + } + } +} + +extension CourseDashboardTabbarView: UICollectionViewDelegate, UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return tabBarItems.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CourseDashboardTabbarViewCell.identifier, for: indexPath) as! CourseDashboardTabbarViewCell + let item = tabBarItems[indexPath.row] + cell.setTitle(title: item.title, textStyle: textStyle) + return cell + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + selectedItemIndex = indexPath.item + collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true) + delegate?.didSelectItem(at: selectedItemIndex, tabbarItem: tabBarItems[selectedItemIndex]) + } +} + +extension CourseDashboardTabbarView: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let item = tabBarItems[indexPath.row] + let tabTitle = item.title + let padding: CGFloat = 20 + if let font = textStyle.attributes["NSFont"] as? UIFont { + let titleWidth = NSString(string: tabTitle).boundingRect(with: frame.size, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil).size.width + let tabWidth = titleWidth + padding + return CGSize(width: tabWidth, height: frame.height) + } + return .zero + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { + return 0 + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { + return 0 + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { + return .zero + } +} + +class CourseDashboardTabbarViewCell: UICollectionViewCell { + static let identifier = "CourseDashboardTabbarViewCell" + + private let tabbarItemTitle: UILabel = { + let label = UILabel() + label.accessibilityIdentifier = "CourseDashboardTabbarViewCell:tabbar-item-title-label" + return label + }() + + private let indicatorView: UIView = { + let indicatorView = UIView() + indicatorView.accessibilityIdentifier = "CourseDashboardTabbarViewCell:indicator-view" + return indicatorView + }() + + private let indicatorColor: UIColor = OEXStyles.shared().primaryBaseColor() + + override var isSelected: Bool { + didSet { + DispatchQueue.main.async { + UIView.animate(withDuration: 0.3) { [weak self] in + guard let weakSelf = self else { return } + weakSelf.indicatorView.backgroundColor = weakSelf.isSelected ? weakSelf.indicatorColor : .clear + weakSelf.layoutIfNeeded() + } + } + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + + accessibilityIdentifier = "CourseDashboardTabbarViewCell" + backgroundColor = .clear + addSubviews() + addConstrains() + } + + private func addSubviews() { + contentView.addSubview(tabbarItemTitle) + addSubview(indicatorView) + } + + private func addConstrains() { + tabbarItemTitle.translatesAutoresizingMaskIntoConstraints = false + tabbarItemTitle.snp.makeConstraints { make in + make.center.equalTo(self) + } + + indicatorView.translatesAutoresizingMaskIntoConstraints = false + indicatorView.snp.makeConstraints { make in + make.height.equalTo(2) + make.leading.equalTo(self) + make.trailing.equalTo(self) + make.bottom.equalTo(self) + } + } + + func setTitle(title: String, textStyle: OEXMutableTextStyle) { + tabbarItemTitle.attributedText = textStyle.attributedString(withText: title) + } + + override func prepareForReuse() { + super.prepareForReuse() + tabbarItemTitle.text = "" + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Source/CourseDashboardViewController.swift b/Source/CourseDashboardViewController.swift index 56ca6b904f..969eae1841 100644 --- a/Source/CourseDashboardViewController.swift +++ b/Source/CourseDashboardViewController.swift @@ -56,7 +56,8 @@ class CourseDashboardViewController: UITabBarController, InterfaceOrientationOve override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - + + navigationController?.setNavigationBarHidden(false, animated: true) environment.analytics.trackScreen(withName: OEXAnalyticsScreenCourseDashboard, courseID: courseID, value: nil) } diff --git a/Source/CourseDateBannerView.swift b/Source/CourseDateBannerView.swift index 9e9a7981d7..d3874d702b 100644 --- a/Source/CourseDateBannerView.swift +++ b/Source/CourseDateBannerView.swift @@ -10,6 +10,16 @@ import UIKit private let cornerRadius: CGFloat = 0 +protocol BannerView { + var delegate: CourseShiftDatesDelegate? { get set } + var bannerInfo: DatesBannerInfo? { get set } + func setupView() +} + +extension CourseDateBannerView: BannerView {} +extension NewCourseDateBannerView: BannerView {} + + protocol CourseShiftDatesDelegate: AnyObject { func courseShiftDateButtonAction() } diff --git a/Source/CourseDates.swift b/Source/CourseDates.swift index 45a5a35117..b0b4dde190 100644 --- a/Source/CourseDates.swift +++ b/Source/CourseDates.swift @@ -221,7 +221,7 @@ enum BannerInfoStatus { } } -class DatesBannerInfo { +public class DatesBannerInfo { private enum Keys: String, RawStringExtractable { case contentTypeGatingEnabled = "content_type_gating_enabled" case missedDeadline = "missed_deadlines" diff --git a/Source/CourseDatesHeaderView.swift b/Source/CourseDatesHeaderView.swift index cb5bbd92b6..9c4989e822 100644 --- a/Source/CourseDatesHeaderView.swift +++ b/Source/CourseDatesHeaderView.swift @@ -133,7 +133,7 @@ class CourseDatesHeaderView: UITableViewHeaderFooterView { setupBottomContainer() } - if !isSelfPaced && bannerInfo.status != .upgradeToCompleteGradedBanner { + if (!isSelfPaced && bannerInfo.status != .upgradeToCompleteGradedBanner) || bannerInfo.status == .resetDatesBanner { topContainer.subviews.forEach { $0.removeFromSuperview() } } diff --git a/Source/CourseDatesViewController.swift b/Source/CourseDatesViewController.swift index c3f9848641..151d5bd74c 100644 --- a/Source/CourseDatesViewController.swift +++ b/Source/CourseDatesViewController.swift @@ -9,7 +9,7 @@ import UIKit import WebKit -class CourseDatesViewController: UIViewController, InterfaceOrientationOverriding { +class CourseDatesViewController: UIViewController, InterfaceOrientationOverriding, ScrollableDelegateProvider { private enum Pacing: String { case user = "self" @@ -114,6 +114,9 @@ class CourseDatesViewController: UIViewController, InterfaceOrientationOverridin private var courseBanner: CourseDateBannerModel? + weak var scrollableDelegate: ScrollableDelegate? + private var scrollByDragging = false + init(environment: Environment, courseID: String) { self.courseID = courseID self.environment = environment @@ -643,6 +646,22 @@ extension CourseDatesViewController: CourseDatesHeaderViewDelegate { } } +extension CourseDatesViewController { + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + scrollByDragging = true + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + if scrollByDragging { + scrollableDelegate?.scrollViewDidScroll(scrollView: scrollView) + } + } + + func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + scrollByDragging = false + } +} + // For use in testing only extension CourseDatesViewController { func t_loadData(data: CourseDateModel) { diff --git a/Source/CourseGenericBlockTableViewCell.swift b/Source/CourseGenericBlockTableViewCell.swift index 75372f7c70..88e1de0a9f 100644 --- a/Source/CourseGenericBlockTableViewCell.swift +++ b/Source/CourseGenericBlockTableViewCell.swift @@ -19,10 +19,13 @@ class CourseGenericBlockTableViewCell : UITableViewCell, CourseBlockContainerCel override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) + contentView.addSubview(content) + content.snp.makeConstraints { make in make.edges.equalTo(contentView) } + accessibilityIdentifier = "CourseGenericBlockTableViewCell:view" content.accessibilityIdentifier = "CourseGenericBlockTableViewCell:content-view" } diff --git a/Source/CourseHandoutsViewController.swift b/Source/CourseHandoutsViewController.swift index 5f3880d4d6..89d58b587c 100644 --- a/Source/CourseHandoutsViewController.swift +++ b/Source/CourseHandoutsViewController.swift @@ -9,7 +9,7 @@ import UIKit import WebKit -public class CourseHandoutsViewController: OfflineSupportViewController, LoadStateViewReloadSupport, InterfaceOrientationOverriding { +public class CourseHandoutsViewController: OfflineSupportViewController, LoadStateViewReloadSupport, InterfaceOrientationOverriding, ScrollableDelegateProvider { public typealias Environment = DataManagerProvider & NetworkManagerProvider & ReachabilityProvider & OEXAnalyticsProvider & OEXStylesProvider & OEXConfigProvider @@ -19,6 +19,9 @@ public class CourseHandoutsViewController: OfflineSupportViewController, LoadSta let loadController : LoadStateViewController let handouts : BackedStream = BackedStream() + public weak var scrollableDelegate: ScrollableDelegate? + private var scrollByDragging = false + init(environment : Environment, courseID : String) { self.environment = environment self.courseID = courseID @@ -42,6 +45,8 @@ public class CourseHandoutsViewController: OfflineSupportViewController, LoadSta setConstraints() setStyles() webView.navigationDelegate = self + webView.scrollView.delegate = self + view.backgroundColor = environment.styles.standardBackgroundColor() setAccessibilityIdentifiers() @@ -149,3 +154,19 @@ extension CourseHandoutsViewController: WKNavigationDelegate { } } + +extension CourseHandoutsViewController: UIScrollViewDelegate { + public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + scrollByDragging = true + } + + public func scrollViewDidScroll(_ scrollView: UIScrollView) { + if scrollByDragging { + scrollableDelegate?.scrollViewDidScroll(scrollView: scrollView) + } + } + + public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + scrollByDragging = false + } +} diff --git a/Source/CourseOutlineHeaderCell.swift b/Source/CourseOutlineHeaderCell.swift index 7524011b2f..5e7ce7a0ea 100644 --- a/Source/CourseOutlineHeaderCell.swift +++ b/Source/CourseOutlineHeaderCell.swift @@ -9,12 +9,59 @@ import Foundation import UIKit -class CourseOutlineHeaderCell : UITableViewHeaderFooterView { +protocol CourseOutlineHeaderCellDelegate: AnyObject { + func toggleSection(section: Int) +} + +class CourseOutlineHeaderCell: UITableViewHeaderFooterView { + static let identifier = "CourseOutlineHeaderCellIdentifier" - let headerFontStyle = OEXTextStyle(weight: .semiBold, size: .xSmall, color: OEXStyles.shared().neutralXDark()) - let headerLabel = UILabel() - let horizontalTopLine = UIView() + weak var delegate: CourseOutlineHeaderCellDelegate? + + var section = 0 + + private var isExpanded = false + private var isCompleted = false + + private let horizontalTopLine = UIView() + private let containerView = UIView() + private let iconSize = CGSize(width: 25, height: 25) + private let headerLabel = UILabel() + + private lazy var headerFontStyle: OEXTextStyle = { + if OEXConfig.shared().isNewDashboardEnabled { + return OEXTextStyle(weight: .normal, size: .base, color : OEXStyles.shared().neutralBlackT()) + } + return OEXTextStyle(weight: .semiBold, size: .xSmall, color: OEXStyles.shared().neutralXDark()) + }() + + private lazy var leadingImageButton: UIButton = { + let button = UIButton(type: .system) + button.accessibilityIdentifier = "CourseOutlineHeaderCell:trailing-button-view" + let image = Icon.CheckCircle.imageWithFontSize(size: 17) + button.setImage(image, for: .normal) + button.tintColor = OEXStyles.shared().successBase() + button.isHidden = true + return button + }() + + private lazy var trailingImageView: UIImageView = { + let imageView = UIImageView() + imageView.accessibilityIdentifier = "CourseOutlineHeaderCell:trailing-image-view" + imageView.image = Icon.ExpandMore.imageWithFontSize(size: 24) + imageView.tintColor = OEXStyles.shared().neutralDark() + return imageView + }() + + private lazy var button: UIButton = { + let button = UIButton() + button.accessibilityIdentifier = "CourseOutlineHeaderCell:button-view" + button.oex_addAction({ [weak self] _ in + self?.handleTap() + }, for: .touchUpInside) + return button + }() var block: CourseBlock? { didSet { @@ -26,9 +73,21 @@ class CourseOutlineHeaderCell : UITableViewHeaderFooterView { override init(reuseIdentifier: String?) { super.init(reuseIdentifier: reuseIdentifier) - addSubviews() - setStyles() + } + + func setupViewsNewDesign(isExpanded: Bool, isCompleted: Bool) { + self.isExpanded = isExpanded + self.isCompleted = isCompleted + + addSubviewsForNewDesign() + setConstraintsForNewDesign() setAccessibilityIdentifiers() + backgroundView = UIView(frame: .zero) + containerView.applyBorderStyle(style: BorderStyle(cornerRadius: .Size(0), width: .Size(1), color: OEXStyles.shared().neutralDark())) + } + + func setupViewsForOldDesign() { + addSubviewsForOldDesign() } private func setAccessibilityIdentifiers() { @@ -40,17 +99,71 @@ class CourseOutlineHeaderCell : UITableViewHeaderFooterView { required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } - - //MARK: Helper Methods - private func addSubviews() { - addSubview(headerLabel) + + private func addSubviewsForNewDesign() { + addSubview(containerView) + containerView.addSubview(leadingImageButton) + containerView.addSubview(headerLabel) + containerView.addSubview(button) + containerView.addSubview(trailingImageView) + button.superview?.bringSubviewToFront(button) + + containerView.backgroundColor = OEXStyles.shared().neutralWhiteT() + } + + func setConstraintsForNewDesign() { + leadingImageButton.isHidden = !isCompleted + + containerView.snp.remakeConstraints { make in + make.top.equalTo(self) + make.bottom.equalTo(self) + make.leading.equalTo(self).offset(StandardHorizontalMargin) + make.trailing.equalTo(self).inset(StandardHorizontalMargin) + } + + leadingImageButton.snp.remakeConstraints { make in + make.centerY.equalTo(containerView) + make.leading.equalTo(containerView).offset(StandardHorizontalMargin / 2) + make.size.equalTo(iconSize) + } + + trailingImageView.snp.remakeConstraints { make in + make.centerY.equalTo(containerView) + make.trailing.equalTo(containerView).inset(StandardHorizontalMargin / 2) + make.size.equalTo(iconSize) + } + + headerLabel.snp.remakeConstraints { make in + make.leading.equalTo(leadingImageButton).offset(StandardHorizontalMargin * 2.15) + make.centerY.equalTo(containerView) + make.trailing.equalTo(trailingImageView.snp.leading).offset(-StandardHorizontalMargin * 2.15) + } + + button.snp.remakeConstraints { make in + make.edges.equalTo(containerView) + } + + rotateImageView(clockWise: isExpanded) + } + + private func addSubviewsForOldDesign() { addSubview(horizontalTopLine) + addSubview(headerLabel) + backgroundView = UIView(frame: .zero) + } + + override func layoutSubviews() { + super.layoutSubviews() + + if subviews.contains(headerLabel) && subviews.contains(horizontalTopLine) { + let margin = StandardHorizontalMargin - 5 + headerLabel.frame = bounds.inset(by: UIEdgeInsets(top: 0, left: margin, bottom: 0, right: margin)) + horizontalTopLine.frame = CGRect(x: 0, y: 0, width: bounds.size.width, height: OEXStyles.dividerSize()) + } } private func setStyles() { - //Using CGRectZero size because the backgroundView automatically resizes. backgroundView = UIView(frame: .zero) - horizontalTopLine.backgroundColor = OEXStyles.shared().neutralBase() } @@ -67,12 +180,19 @@ class CourseOutlineHeaderCell : UITableViewHeaderFooterView { private func updateAccessibilityLabel(completion: Bool) { headerLabel.accessibilityHint = completion ? Strings.Accessibility.completed : nil } - - // Skip autolayout for performance reasons - override func layoutSubviews() { - super.layoutSubviews() - let margin = StandardHorizontalMargin - 5 - headerLabel.frame = bounds.inset(by: UIEdgeInsets.init(top: 0, left: margin, bottom: 0, right: margin)) - horizontalTopLine.frame = CGRect(x: 0, y: 0, width: bounds.size.width, height: OEXStyles.dividerSize()) + + private func handleTap() { + delegate?.toggleSection(section: section) + } + + private func rotateImageView(clockWise: Bool) { + UIView.animate(withDuration: 0.2) { [weak self] in + guard let weakSelf = self else { return } + if clockWise { + weakSelf.trailingImageView.transform = weakSelf.trailingImageView.transform.rotated(by: -(.pi * 0.999)) + } else { + weakSelf.trailingImageView.transform = .identity + } + } } } diff --git a/Source/CourseOutlineItemView.swift b/Source/CourseOutlineItemView.swift index aa1aea6865..a08f497c1b 100644 --- a/Source/CourseOutlineItemView.swift +++ b/Source/CourseOutlineItemView.swift @@ -30,6 +30,13 @@ public class CourseOutlineItemView: UIView { private let fontStyle = OEXTextStyle(weight: .normal, size: .base, color : OEXStyles.shared().neutralBlackT()) private let boldFontStyle = OEXTextStyle(weight: .bold, size: .small, color : OEXStyles.shared().neutralBlack()) + + private lazy var contentView: UIView = { + let view = UIView() + view.translatesAutoresizingMaskIntoConstraints = false + return view + }() + private let titleLabel = UILabel() private let subtitleLabel = UILabel() private let leadingImageButton = UIButton(type: UIButton.ButtonType.system) @@ -39,6 +46,7 @@ public class CourseOutlineItemView: UIView { private var shouldShowLeadingView: Bool = true + var courseOutlineMode: CourseOutlineMode = .full var isSectionOutline = false { didSet { refreshTrailingViewConstraints() @@ -123,6 +131,11 @@ public class CourseOutlineItemView: UIView { } func setTitleText(title: String, elipsis: Bool = true) { + + if OEXConfig.shared().isNewDashboardEnabled && courseOutlineMode == .full { + titleLabel.numberOfLines = 0 + } + if !elipsis { titleLabel.attributedText = fontStyle.attributedString(withText: title) } else { @@ -132,6 +145,7 @@ public class CourseOutlineItemView: UIView { attributedString.append(attributedTitle) attributedString.append(attributedUnicodeSpace) attributedString.append(attributedTrailingImage) + titleLabel.attributedText = attributedString setConstraints() } @@ -181,6 +195,10 @@ public class CourseOutlineItemView: UIView { subtitleLabel.minimumScaleFactor = 0.6 subtitleLabel.attributedText = NSAttributedString.joinInNaturalLayout(attributedStrings: attributedStrings) setConstraints(with: blockType) + + if blockType == .Section && OEXConfig.shared().isNewDashboardEnabled && courseOutlineMode == .full { + applyBorderStyle(style: BorderStyle(cornerRadius: .Size(0), width: .Size(1), color: OEXStyles.shared().neutralDark())) + } } func setContentIcon(icon: Icon?, color: UIColor) { @@ -213,29 +231,40 @@ public class CourseOutlineItemView: UIView { } private func setConstraints(with blockType: CourseBlockType? = nil) { + contentView.snp.remakeConstraints { make in + make.top.equalTo(self) + make.bottom.equalTo(self) + make.leading.equalTo(self) + make.trailing.equalTo(self) + make.height.greaterThanOrEqualTo(60) + } + leadingImageButton.isHidden = !shouldShowLeadingView leadingImageButton.snp.remakeConstraints { make in make.centerY.equalTo(titleLabel) let offsetMargin = shouldShowLeadingView ? StandardHorizontalMargin / 2 : 0 - make.leading.equalTo(self).offset(offsetMargin) + make.leading.equalTo(contentView).offset(offsetMargin) make.size.equalTo(IconSize) } let shouldOffsetTitle = !(subtitleLabel.text?.isEmpty ?? true) titleLabel.snp.remakeConstraints { make in + make.top.equalTo(contentView).offset(StandardVerticalMargin) + let titleOffset = shouldOffsetTitle ? TitleOffsetCenterY : 0 - make.centerY.equalTo(self).offset(titleOffset) + make.centerY.equalTo(contentView).offset(titleOffset) + if shouldShowLeadingView { make.leading.equalTo(leadingImageButton.snp.trailing).offset(StandardHorizontalMargin / 2) } else { - make.leading.equalTo(self).offset(StandardHorizontalMargin) + make.leading.equalTo(contentView).offset(StandardHorizontalMargin) } make.trailing.lessThanOrEqualTo(trailingContainer.snp.leading).offset(TitleOffsetTrailing) } subtitleLabel.snp.remakeConstraints { make in - make.centerY.equalTo(self).offset(SubtitleOffsetCenterY) + make.top.equalTo(titleLabel.snp.bottom) if let blockType = blockType { if case CourseBlockType.Section = blockType { @@ -248,7 +277,7 @@ public class CourseOutlineItemView: UIView { } else { make.leading.equalTo(subtitleLeadingImageView.snp.leading).offset(0) } - make.trailing.lessThanOrEqualTo(self).offset(-StandardHorizontalMargin) + make.trailing.lessThanOrEqualTo(contentView).offset(-StandardHorizontalMargin) } separator.snp.remakeConstraints { make in @@ -260,12 +289,13 @@ public class CourseOutlineItemView: UIView { } private func addSubviews() { - addSubview(leadingImageButton) - addSubview(trailingContainer) - addSubview(titleLabel) - addSubview(subtitleLabel) - addSubview(subtitleLeadingImageView) - addSubview(separator) + addSubview(contentView) + contentView.addSubview(leadingImageButton) + contentView.addSubview(trailingContainer) + contentView.addSubview(titleLabel) + contentView.addSubview(subtitleLabel) + contentView.addSubview(subtitleLeadingImageView) + contentView.addSubview(separator) // For performance only add the static constraints once @@ -277,7 +307,7 @@ public class CourseOutlineItemView: UIView { } subtitleLabel.snp.remakeConstraints { make in - make.centerY.equalTo(self).offset(SubtitleOffsetCenterY) + make.top.equalTo(titleLabel.snp.bottom) if subtitleLeadingImageView.isHidden { make.leading.equalTo(subtitleLeadingImageView.snp.leading).offset(SubtitleLeadingOffset) @@ -291,8 +321,8 @@ public class CourseOutlineItemView: UIView { private func refreshTrailingViewConstraints() { trailingContainer.snp.remakeConstraints { make in - make.trailing.equalTo(self.snp.trailing).inset(isSectionOutline ? 10 : CellOffsetTrailing) - make.centerY.equalTo(self) + make.trailing.equalTo(contentView.snp.trailing).inset(isSectionOutline ? 10 : CellOffsetTrailing) + make.centerY.equalTo(contentView) make.width.equalTo(SmallIconSize * 2) } } diff --git a/Source/CourseOutlineQuerier.swift b/Source/CourseOutlineQuerier.swift index fc5bbcb43c..fa8d0bfd7b 100644 --- a/Source/CourseOutlineQuerier.swift +++ b/Source/CourseOutlineQuerier.swift @@ -45,7 +45,7 @@ public class CourseOutlineQuerier : NSObject { public struct BlockGroup { public let block : CourseBlock - public let children : [CourseBlock] + public var children : [CourseBlock] } public typealias Environment = OEXConfigProvider @@ -63,17 +63,12 @@ public class CourseOutlineQuerier : NSObject { private var observers: [BlockCompletionObserver] = [] func add(observer: BlockCompletionObserver) { - if let index = observers.firstIndexMatching({ $0.controller === observer.controller && $0.blockID == observer.blockID }) { - observers.remove(at: index) - } - + observers.removeAll { $0.controller === observer.controller && $0.blockID == observer.blockID } observers.append(observer) } func remove(observer: UIViewController) { - let filtered = observers.filter { $0.controller !== observer } - observers = [] - observers.append(contentsOf: filtered) + observers.removeAll { $0.controller === observer } } private var blocks: [CourseBlockID : CourseBlock] = [:] { diff --git a/Source/CourseOutlineTableSource.swift b/Source/CourseOutlineTableSource.swift index 1217a2cd81..c960264e8d 100644 --- a/Source/CourseOutlineTableSource.swift +++ b/Source/CourseOutlineTableSource.swift @@ -22,34 +22,51 @@ protocol CourseOutlineTableControllerDelegate: AnyObject { func resetCourseDate(controller: CourseOutlineTableController) } -class CourseOutlineTableController : UITableViewController, CourseVideoTableViewCellDelegate, CourseSectionTableViewCellDelegate, CourseVideosHeaderViewDelegate, VideoDownloadQualityDelegate { +public class CourseOutlineTableController: UITableViewController, ScrollableDelegateProvider { typealias Environment = DataManagerProvider & OEXInterfaceProvider & NetworkManagerProvider & OEXConfigProvider & OEXRouterProvider & OEXAnalyticsProvider & OEXStylesProvider & ServerConfigProvider weak var delegate: CourseOutlineTableControllerDelegate? + weak var newDashboardDelegate: NewCourseDashboardViewControllerDelegate? + private let environment: Environment - let courseQuerier: CourseOutlineQuerier - let courseID: String + private let courseID: String private var courseOutlineMode: CourseOutlineMode + private var courseBlockID: CourseBlockID? + private let courseQuerier: CourseOutlineQuerier private let courseDateBannerView = CourseDateBannerView(frame: .zero) private let courseCard = CourseCardView(frame: .zero) private var courseCertificateView: CourseCertificateView? private let headerContainer = UIView() + + private lazy var resumeCourseHeaderView = ResumeCourseHeaderView() private lazy var resumeCourseView = CourseOutlineHeaderView(frame: .zero, styles: OEXStyles.shared(), titleText: Strings.resume, subtitleText: "Placeholder") private lazy var valuePropView = UIView() - + var courseVideosHeaderView: CourseVideosHeaderView? - private var isResumeCourse = false - private var shouldHideTableViewHeader:Bool = false let refreshController = PullRefreshController() - private var courseBlockID: CourseBlockID? + + private var isResumeCourse = false + private var shouldHideTableViewHeader: Bool = false + + weak public var scrollableDelegate: ScrollableDelegate? + private var scrollByDragging = false + + private var collapsedSections = Set() + private var hasAddedToCollapsedSections = false + + var highlightedBlockID : CourseBlockID? = nil + private var groups : [CourseOutlineQuerier.BlockGroup] = [] + private var videos: [OEXHelperVideoDownload]? + private var watchedVideoBlock: [CourseBlockID] = [] var isSectionOutline = false { didSet { - if isSectionOutline { + if isSectionOutline || environment.config.isNewDashboardEnabled { hideTableHeaderView() } + tableView.reloadData() } } @@ -67,21 +84,6 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView fatalError("init(coder:) has not been implemented") } - var groups : [CourseOutlineQuerier.BlockGroup] = [] { - didSet { - courseQuerier.remove(observer: self) - groups.forEach { group in - let observer = BlockCompletionObserver(controller: self, blockID: group.block.blockID, mode: courseOutlineMode, delegate: self) - courseQuerier.add(observer: observer) - } - } - } - - var highlightedBlockID : CourseBlockID? = nil - private var videos: [OEXHelperVideoDownload]? - - private var watchedVideoBlock: [CourseBlockID] = [] - func addCertificateView() { guard environment.config.certificatesEnabled, let enrollment = enrollment, let certificateUrl = enrollment.certificateUrl, let certificateImage = UIImage(named: "courseCertificate") else { return } @@ -105,52 +107,6 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView return environment.interface?.enrollmentForCourse(withID: courseID) } - private func addValuePropView() { - if !canShowValueProp { return } - - headerContainer.addSubview(valuePropView) - valuePropView.backgroundColor = environment.styles.standardBackgroundColor() - - valuePropView.snp.remakeConstraints { make in - make.height.equalTo(0) - } - let lockedImage = Icon.Closed.imageWithFontSize(size: 20).image(with: OEXStyles.shared().neutralWhiteT()) - let imageAttachment = NSTextAttachment() - imageAttachment.image = lockedImage - if let image = imageAttachment.image { - imageAttachment.bounds = CGRect(x: 0, y: -4, width: image.size.width, height: image.size.height) - } - let attributedImageString = NSAttributedString(attachment: imageAttachment) - let style = OEXTextStyle(weight: .semiBold, size: .base, color: environment.styles.neutralWhiteT()) - let attributedStrings = [ - attributedImageString, - NSAttributedString(string: "\u{200b}"), - style.attributedString(withText: Strings.ValueProp.courseDashboardButtonTitle) - ] - let attributedTitle = NSAttributedString.joinInNaturalLayout(attributedStrings: attributedStrings) - - let button = UIButton(type: .system) - button.oex_addAction({ [weak self] _ in - if let course = self?.enrollment?.course { - self?.environment.router?.showValuePropDetailView(from: self, screen: .courseDashboard, course: course) { - self?.environment.analytics.trackValuePropModal(with: .CourseDashboard, courseId: course.course_id ?? "") - } - self?.environment.analytics.trackValuePropLearnMore(courseID: course.course_id ?? "", screenName: .CourseDashboard) - } - }, for: .touchUpInside) - - button.backgroundColor = environment.styles.secondaryDarkColor() - button.setAttributedTitle(attributedTitle, for: .normal) - valuePropView.addSubview(button) - - button.snp.remakeConstraints { make in - make.height.equalTo(StandardVerticalMargin * 4.5) - make.leading.equalTo(valuePropView).offset(StandardHorizontalMargin) - make.trailing.equalTo(valuePropView).inset(StandardHorizontalMargin) - make.center.equalTo(valuePropView) - } - } - private func setAccessibilityIdentifiers() { tableView.accessibilityIdentifier = "CourseOutlineTableController:table-view" headerContainer.accessibilityIdentifier = "CourseOutlineTableController:header-container" @@ -161,7 +117,7 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView valuePropView.accessibilityIdentifier = "CourseOutlineTableController:value-prop-view" } - override func viewDidLoad() { + public override func viewDidLoad() { tableView.dataSource = self tableView.delegate = self tableView.separatorStyle = .none @@ -174,9 +130,12 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView tableView.register(CourseUnknownTableViewCell.self, forCellReuseIdentifier: CourseUnknownTableViewCell.identifier) tableView.register(CourseSectionTableViewCell.self, forCellReuseIdentifier: CourseSectionTableViewCell.identifier) tableView.register(DiscussionTableViewCell.self, forCellReuseIdentifier: DiscussionTableViewCell.identifier) - configureHeaderView() + + if !environment.config.isNewDashboardEnabled || courseOutlineMode != .full { + configureOldHeaderView() + } + refreshController.setupInScrollView(scrollView: tableView) - setAccessibilityIdentifiers() NotificationCenter.default.oex_addObserver(observer: self, name: NSNotification.Name.OEXDownloadDeleted.rawValue) { _, observer, _ in @@ -184,7 +143,26 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView } } - private func configureHeaderView() { + private func configureNewHeaderView() { + headerContainer.addSubview(resumeCourseHeaderView) + tableView.tableHeaderView = headerContainer + + resumeCourseHeaderView.snp.makeConstraints { make in + make.top.equalTo(headerContainer) + make.bottom.equalTo(headerContainer).inset(StandardVerticalMargin * 2) + make.leading.equalTo(headerContainer).offset(StandardHorizontalMargin) + make.trailing.equalTo(headerContainer).inset(StandardHorizontalMargin) + make.height.equalTo(StandardVerticalMargin * 5) + } + + tableView.setAndLayoutTableHeaderView(header: headerContainer) + + UIView.animate(withDuration: 0.1) { [weak self] in + self?.view.layoutIfNeeded() + } + } + + private func configureOldHeaderView() { if courseOutlineMode == .full { courseDateBannerView.delegate = self headerContainer.addSubview(courseDateBannerView) @@ -229,107 +207,95 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView if let headerView = courseVideosHeaderView { headerContainer.addSubview(headerView) } - - refreshTableHeaderView(isResumeCourse: false) - } - - func courseVideosHeaderViewTapped() { - delegate?.outlineTableControllerChoseShowDownloads(controller: self) - } - - func invalidOrNoNetworkFound() { - showOverlay(withMessage: environment.interface?.networkErrorMessage() ?? Strings.noWifiMessage) - } - - func didTapVideoQuality() { - environment.analytics.trackEvent(with: AnalyticsDisplayName.CourseVideosDownloadQualityClicked, name: AnalyticsEventName.CourseVideosDownloadQualityClicked) - environment.router?.showDownloadVideoQuality(from: self, delegate: self, modal: true) - } - - func didUpdateVideoQuality() { - if courseOutlineMode == .video { - courseVideosHeaderView?.refreshView() - } - } - - private func indexPathForBlockWithID(blockID : CourseBlockID) -> NSIndexPath? { - for (i, group) in groups.enumerated() { - for (j, block) in group.children.enumerated() { - if block.blockID == blockID { - return IndexPath(row: j, section: i) as NSIndexPath - } - } - } - return nil } - override func viewWillAppear(_ animated: Bool) { + public override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - if let path = self.tableView.indexPathForSelectedRow { - self.tableView.deselectRow(at: path, animated: false) + if let path = tableView.indexPathForSelectedRow { + tableView.deselectRow(at: path, animated: false) } - if let highlightID = highlightedBlockID, let indexPath = indexPathForBlockWithID(blockID: highlightID) - { + + if let highlightID = highlightedBlockID, + let indexPath = indexPathForBlockWithID(blockID: highlightID) { tableView.scrollToRow(at: indexPath as IndexPath, at: UITableView.ScrollPosition.middle, animated: false) } - - if courseOutlineMode == .video { - courseVideosHeaderView?.refreshView() - } + + courseOutlineMode == .video ? courseVideosHeaderView?.refreshView() : nil } - override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + public override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { tableView.reloadData() } - override func updateViewConstraints() { + public override func updateViewConstraints() { super.updateViewConstraints() refreshTableHeaderView(isResumeCourse: isResumeCourse) } - override func numberOfSections(in tableView: UITableView) -> Int { - return groups.count + private func shouldApplyNewStyle(_ group: CourseOutlineQuerier.BlockGroup) -> Bool { + return environment.config.isNewDashboardEnabled && group.block.type == .Chapter && courseOutlineMode == .full } - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - let group = groups[section] - return group.children.count + // MARK: UITableView DataSource & Delegate + public override func numberOfSections(in tableView: UITableView) -> Int { + return groups.count } - override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return 30 + public override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return shouldApplyNewStyle(groups[section]) + ? collapsedSections.contains(section) ? 0 : groups[section].children.count + : groups[section].children.count } - override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - // Will remove manual heights when dropping iOS7 support and move to automatic cell heights. - return 60.0 + public override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return shouldApplyNewStyle(groups[section]) ? StandardVerticalMargin * 7.5 : StandardVerticalMargin * 3.75 } - override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let group = groups[section] + public override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: CourseOutlineHeaderCell.identifier) as! CourseOutlineHeaderCell + + let group = groups[section] + header.section = section header.block = group.block + header.delegate = self - if courseOutlineMode == .video { - var allCompleted: Bool - - if group.block.type == .Unit { - allCompleted = group.children.allSatisfy { $0.isCompleted } - } else { - allCompleted = group.children.map { $0.blockID }.allSatisfy(watchedVideoBlock.contains) - } - - allCompleted ? header.showCompletedBackground() : header.showNeutralBackground() + let allCompleted = allBlocksCompleted(for: group) + + if shouldApplyNewStyle(group) { + header.setupViewsNewDesign(isExpanded: !collapsedSections.contains(section), isCompleted: allCompleted) } else { - let allCompleted = group.children.allSatisfy { $0.isCompleted } - allCompleted ? header.showCompletedBackground() : header.showNeutralBackground() + header.setupViewsForOldDesign() } + allCompleted ? header.showCompletedBackground() : header.showNeutralBackground() + return header } - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + public override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { + return shouldApplyNewStyle(groups[section]) ? StandardVerticalMargin * 2 : 0 + } + + public override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { + guard shouldApplyNewStyle(groups[section]) else { + return nil + } + + let view = UIView() + view.backgroundColor = environment.styles.neutralWhiteT() + return view + } + + public override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { + return 60 + } + + public override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return UITableView.automaticDimension + } + + public override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let group = groups[indexPath.section] let nodes = group.children let block = nodes[indexPath.row] @@ -382,16 +348,17 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView cell.swipeCellViewDelegate = (courseOutlineMode == .video) ? cell : nil cell.delegate = self cell.courseID = courseID - + cell.selectionStyle = .none return cell case .Discussion: let cell = tableView.dequeueReusableCell(withIdentifier: DiscussionTableViewCell.identifier, for: indexPath) as! DiscussionTableViewCell cell.block = block + cell.isSectionOutline = isSectionOutline return cell } } - override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { + public override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { guard let cell = cell as? CourseBlockContainerCell else { assertionFailure("All course outline cells should implement CourseBlockContainerCell") return @@ -401,14 +368,13 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView cell.applyStyle(style: highlighted ? .Highlighted : .Normal) } - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + public override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let group = groups[indexPath.section] let chosenBlock = group.children[indexPath.row] delegate?.outlineTableController(controller: self, choseBlock: chosenBlock, parent: group.block.blockID) } - override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { - + public override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { guard let cell = tableView.cellForRow(at: indexPath) as? SwipeableCell, cell.state != .initial else { return indexPath } @@ -416,24 +382,116 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView return nil } - func videoCellChoseDownload(cell: CourseVideoTableViewCell, block : CourseBlock) { - self.delegate?.outlineTableController(controller: self, choseDownloadVideoForBlock: block) + deinit { + courseQuerier.remove(observer: self) + NotificationCenter.default.removeObserver(self) } - - func videoCellChoseShowDownloads(cell: CourseVideoTableViewCell) { - self.delegate?.outlineTableControllerChoseShowDownloads(controller: self) +} + +extension CourseOutlineTableController { + func setGroups(_ groups: [CourseOutlineQuerier.BlockGroup]) { + self.groups = groups + let collapsedSectionsBeforeReload = collapsedSections + collapsedSections = Set(0.. firstIncompleteSection { + collapsedSections.insert(index) + } + } + else { + if allBlocksCompleted(for: group) && !collapsedSections.contains(index) { + collapsedSections.insert(index) + } + } + } + + hasAddedToCollapsedSections = true + UIView.performWithoutAnimation { [weak self] in + self?.tableView.reloadData() + } } - func reloadCell(cell: UITableViewCell) { - self.delegate?.outlineTableControllerReload(controller: self) + private func allBlocksCompleted(for group: CourseOutlineQuerier.BlockGroup) -> Bool { + if courseOutlineMode == .video { + return group.block.type == .Unit ? + group.children.allSatisfy { $0.isCompleted } : + group.children.map { $0.blockID }.allSatisfy(watchedVideoBlock.contains) + } else { + return group.children.allSatisfy { $0.isCompleted } + } } - func sectionCellChoseShowDownloads(cell: CourseSectionTableViewCell) { - self.delegate?.outlineTableControllerChoseShowDownloads(controller: self) + private func indexPathForBlockWithID(blockID: CourseBlockID) -> IndexPath? { + for (i, group) in groups.enumerated() { + if let j = group.children.firstIndex(where: { $0.blockID == blockID }) { + return IndexPath(row: j, section: i) + } + } + return nil } - func sectionCellChoseDownload(cell: CourseSectionTableViewCell, videos: [OEXHelperVideoDownload], forBlock block : CourseBlock) { - self.delegate?.outlineTableController(controller: self, choseDownloadVideos: videos, rootedAtBlock:block) + private func addValuePropView() { + if !canShowValueProp { return } + + headerContainer.addSubview(valuePropView) + valuePropView.backgroundColor = environment.styles.standardBackgroundColor() + + valuePropView.snp.remakeConstraints { make in + make.height.equalTo(0) + } + let lockedImage = Icon.Closed.imageWithFontSize(size: 20).image(with: OEXStyles.shared().neutralWhiteT()) + let imageAttachment = NSTextAttachment() + imageAttachment.image = lockedImage + if let image = imageAttachment.image { + imageAttachment.bounds = CGRect(x: 0, y: -4, width: image.size.width, height: image.size.height) + } + let attributedImageString = NSAttributedString(attachment: imageAttachment) + let style = OEXTextStyle(weight: .semiBold, size: .base, color: environment.styles.neutralWhiteT()) + let attributedStrings = [ + attributedImageString, + NSAttributedString(string: "\u{200b}"), + style.attributedString(withText: Strings.ValueProp.courseDashboardButtonTitle) + ] + let attributedTitle = NSAttributedString.joinInNaturalLayout(attributedStrings: attributedStrings) + + let button = UIButton(type: .system) + button.oex_addAction({ [weak self] _ in + if let course = self?.enrollment?.course { + self?.environment.router?.showValuePropDetailView(from: self, screen: .courseDashboard, course: course) { + self?.environment.analytics.trackValuePropModal(with: .CourseDashboard, courseId: course.course_id ?? "") + } + self?.environment.analytics.trackValuePropLearnMore(courseID: course.course_id ?? "", screenName: .CourseDashboard) + } + }, for: .touchUpInside) + + button.backgroundColor = environment.styles.secondaryDarkColor() + button.setAttributedTitle(attributedTitle, for: .normal) + valuePropView.addSubview(button) + + button.snp.remakeConstraints { make in + make.height.equalTo(StandardVerticalMargin * 4.5) + make.leading.equalTo(valuePropView).offset(StandardHorizontalMargin) + make.trailing.equalTo(valuePropView).inset(StandardHorizontalMargin) + make.center.equalTo(valuePropView) + } } private func resumeCourse(with item: ResumeCourseItem) { @@ -443,16 +501,37 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView /// Shows the last accessed Header from the item as argument. Also, sets the relevant action if the course block exists in the course outline. func showResumeCourse(item: ResumeCourseItem) { + if environment.config.isNewDashboardEnabled { + showResumeCourseNewDesign(item: item) + } else { + showResumeCourseOldDesign(item: item) + } + } + + func showResumeCourseNewDesign(item: ResumeCourseItem) { if !item.lastVisitedBlockID.isEmpty { - courseQuerier.blockWithID(id: item.lastVisitedBlockID).extendLifetimeUntilFirstResult (success: { [weak self] block in + courseQuerier.blockWithID(id: item.lastVisitedBlockID).extendLifetimeUntilFirstResult { [weak self] block in + self?.configureNewHeaderView() + self?.resumeCourseHeaderView.tapAction = { [weak self] in + self?.resumeCourse(with: item) + } + } failure: { [weak self] _ in + self?.tableView.tableHeaderView = nil + } + } + } + + func showResumeCourseOldDesign(item: ResumeCourseItem) { + if !item.lastVisitedBlockID.isEmpty { + courseQuerier.blockWithID(id: item.lastVisitedBlockID).extendLifetimeUntilFirstResult { [weak self] block in self?.resumeCourseView.subtitleText = block.displayName self?.resumeCourseView.setViewButtonAction { [weak self] _ in self?.resumeCourse(with: item) } self?.refreshTableHeaderView(isResumeCourse: true) - }, failure: { [weak self] _ in + } failure: { [weak self] _ in self?.refreshTableHeaderView(isResumeCourse: false) - }) + } } else { refreshTableHeaderView(isResumeCourse: false) } @@ -468,6 +547,13 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView } func showCourseDateBanner(bannerInfo: DatesBannerInfo) { + if environment.config.isNewDashboardEnabled { + if bannerInfo.status == .resetDatesBanner { + showCourseDates(bannerInfo: bannerInfo, delegate: self) + } + return + } + if canShowValueProp && bannerInfo.status == .resetDatesBanner { courseDateBannerView.bannerInfo = bannerInfo updateCourseDateBannerView(show: true) @@ -479,6 +565,10 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView } func hideCourseDateBanner() { + if environment.config.isNewDashboardEnabled { + hideCourseDates() + return + } courseDateBannerView.bannerInfo = nil updateCourseDateBannerView(show: false) } @@ -515,7 +605,21 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView tableView.tableHeaderView = nil return } + + if environment.config.isNewDashboardEnabled { + updateNewHeaderConstraints() + } else { + updateOldHeaderConstraints() + } + tableView.setAndLayoutTableHeaderView(header: headerContainer) + } + + private func updateNewHeaderConstraints() { + + } + + private func updateOldHeaderConstraints() { var constraintView: UIView = courseCard courseCard.snp.remakeConstraints { make in make.trailing.equalTo(headerContainer) @@ -562,10 +666,11 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView make.height.equalTo(height) make.bottom.equalTo(headerContainer) } - tableView.setAndLayoutTableHeaderView(header: headerContainer) } private func refreshTableHeaderView(isResumeCourse: Bool) { + if environment.config.isNewDashboardEnabled && courseOutlineMode == .full { return } + self.isResumeCourse = isResumeCourse resumeCourseView.isHidden = !isResumeCourse @@ -599,10 +704,33 @@ class CourseOutlineTableController : UITableViewController, CourseVideoTableView let courseMode = environment.dataManager.enrollmentManager.enrolledCourseWithID(courseID: courseID)?.mode else { return } environment.analytics.trackDatesBannerAppearence(screenName: AnalyticsScreenName.CourseDashboard, courseMode: courseMode, eventName: eventName, bannerType: bannerType) } +} + +extension CourseOutlineTableController: CourseVideoTableViewCellDelegate { + func videoCellChoseDownload(cell: CourseVideoTableViewCell, block : CourseBlock) { + delegate?.outlineTableController(controller: self, choseDownloadVideoForBlock: block) + } - deinit { - courseQuerier.remove(observer: self) - NotificationCenter.default.removeObserver(self) + func videoCellChoseShowDownloads(cell: CourseVideoTableViewCell) { + delegate?.outlineTableControllerChoseShowDownloads(controller: self) + } + + func reloadCell(cell: UITableViewCell) { + delegate?.outlineTableControllerReload(controller: self) + } +} + +extension CourseOutlineTableController: CourseSectionTableViewCellDelegate { + func sectionCellChoseShowDownloads(cell: CourseSectionTableViewCell) { + delegate?.outlineTableControllerChoseShowDownloads(controller: self) + } + + func sectionCellChoseDownload(cell: CourseSectionTableViewCell, videos: [OEXHelperVideoDownload], forBlock block : CourseBlock) { + delegate?.outlineTableController(controller: self, choseDownloadVideos: videos, rootedAtBlock:block) + } + + func reloadSectionCell(cell: UITableViewCell) { + delegate?.outlineTableControllerReload(controller: self) } } @@ -612,24 +740,95 @@ extension CourseOutlineTableController: CourseShiftDatesDelegate { } } +extension CourseOutlineTableController: CourseVideosHeaderViewDelegate { + func courseVideosHeaderViewTapped() { + delegate?.outlineTableControllerChoseShowDownloads(controller: self) + } + + func invalidOrNoNetworkFound() { + showOverlay(withMessage: environment.interface?.networkErrorMessage() ?? Strings.noWifiMessage) + } + + func didTapVideoQuality() { + environment.analytics.trackEvent(with: AnalyticsDisplayName.CourseVideosDownloadQualityClicked, name: AnalyticsEventName.CourseVideosDownloadQualityClicked) + environment.router?.showDownloadVideoQuality(from: self, delegate: self, modal: true) + } +} + +extension CourseOutlineTableController: VideoDownloadQualityDelegate { + func didUpdateVideoQuality() { + if courseOutlineMode == .video { + courseVideosHeaderView?.refreshView() + } + } +} + extension CourseOutlineTableController: BlockCompletionDelegate { func didCompletionChanged(in blockGroup: CourseOutlineQuerier.BlockGroup, mode: CourseOutlineMode) { + guard mode == courseOutlineMode, mode == .full else { return } - if mode != courseOutlineMode { return } - - guard let index = groups.firstIndex(where: { - return $0.block.blockID == blockGroup.block.blockID - }) else { return } - - if tableView.isValidSection(with: index) { - if mode == .full { - groups[index] = blockGroup + if let index = groups.firstIndex(where: { $0.block.blockID == blockGroup.block.blockID }) { + groups[index] = blockGroup + collapsedSections.removeAll() + hasAddedToCollapsedSections = false + setGroups(groups) + } else { + for (index, group) in groups.enumerated() { + guard var child = courseQuerier.childrenOfBlockWithID(blockID: group.block.blockID, forMode: .full).value else { continue } + if let indexOfBlock = child.children.firstIndex(where: { $0.blockID == blockGroup.block.blockID }) { + child.children[indexOfBlock] = blockGroup.block + groups[index] = child + collapsedSections.removeAll() + hasAddedToCollapsedSections = false + setGroups(groups) + break + } } - tableView.reloadSections([index], with: .none) } } } +extension CourseOutlineTableController { + public override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + scrollByDragging = true + } + + public override func scrollViewDidScroll(_ scrollView: UIScrollView) { + if scrollByDragging { + scrollableDelegate?.scrollViewDidScroll(scrollView: scrollView) + } + } + + public override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + scrollByDragging = false + } +} + +extension CourseOutlineTableController: CourseOutlineHeaderCellDelegate { + func toggleSection(section: Int) { + if environment.config.isNewDashboardEnabled { + collapsedSections = collapsedSections.symmetricDifference([section]) + tableView.reloadSections([section], with: .none) + } + } +} + +extension CourseOutlineTableController: NewCourseDashboardViewControllerDelegate { + public func showCourseDates(bannerInfo: DatesBannerInfo?, delegate: CourseOutlineTableController?) { + newDashboardDelegate?.showCourseDates(bannerInfo: bannerInfo, delegate: self) + } + + public func hideCourseDates() { + newDashboardDelegate?.hideCourseDates() + } +} + +extension CourseOutlineTableController { + var t_groupsCount: Int { + return groups.count + } +} + extension UITableView { //set the tableHeaderView so that the required height can be determined, update the header's frame and set it again func setAndLayoutTableHeaderView(header: UIView) { @@ -644,4 +843,3 @@ extension UITableView { return index < numberOfSections } } - diff --git a/Source/CourseOutlineViewController.swift b/Source/CourseOutlineViewController.swift index d455ad5b3d..74ab3e419a 100644 --- a/Source/CourseOutlineViewController.swift +++ b/Source/CourseOutlineViewController.swift @@ -20,7 +20,8 @@ public class CourseOutlineViewController : CourseContentPageViewControllerDelegate, PullRefreshControllerDelegate, LoadStateViewReloadSupport, - InterfaceOrientationOverriding + InterfaceOrientationOverriding, + ScrollableDelegateProvider { public typealias Environment = OEXAnalyticsProvider & DataManagerProvider & OEXInterfaceProvider & NetworkManagerProvider & ReachabilityProvider & OEXRouterProvider & OEXConfigProvider & OEXStylesProvider & ServerConfigProvider @@ -42,6 +43,7 @@ public class CourseOutlineViewController : private(set) var courseOutlineMode: CourseOutlineMode private var loadCachedResponse: Bool = true private lazy var courseUpgradeHelper = CourseUpgradeHelper.shared + weak var newDashboardDelegate: NewCourseDashboardViewControllerDelegate? /// Strictly a test variable used as a trigger flag. Not to be used out of the test scope fileprivate var t_hasTriggeredSetResumeCourse = false @@ -67,15 +69,23 @@ public class CourseOutlineViewController : return environment.dataManager.enrollmentManager.enrolledCourseWithID(courseID: courseID)?.course } - public init(environment: Environment, courseID : String, rootID : CourseBlockID?, forMode mode: CourseOutlineMode?) { + public weak var scrollableDelegate: ScrollableDelegate? { + didSet { + tableController.scrollableDelegate = scrollableDelegate + } + } + + public init(environment: Environment, courseID : String, rootID : CourseBlockID?, forMode mode: CourseOutlineMode?, newDashboardDelegate: NewCourseDashboardViewControllerDelegate? = nil) { self.rootID = rootID self.environment = environment + self.newDashboardDelegate = newDashboardDelegate courseQuerier = environment.dataManager.courseDataManager.querierForCourseWithID(courseID: courseID, environment: environment) loadController = LoadStateViewController() insetsController = ContentInsetsController() courseOutlineMode = mode ?? .full tableController = CourseOutlineTableController(environment: environment, courseID: courseID, forMode: courseOutlineMode, courseBlockID: rootID) + tableController.newDashboardDelegate = newDashboardDelegate resumeCourseController = ResumeCourseController(blockID: rootID , dataManager: environment.dataManager, networkManager: environment.networkManager, courseQuerier: courseQuerier, forMode: courseOutlineMode) super.init(env: environment, shouldShowOfflineSnackBar: false) @@ -121,12 +131,12 @@ public class CourseOutlineViewController : view.setNeedsUpdateConstraints() addListeners() setAccessibilityIdentifiers() + loadCourseStream() } public override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) resumeCourseController.loadResumeCourse(forMode: courseOutlineMode) - loadCourseStream() if courseOutlineMode == .video { // We are doing calculations to show downloading progress on video tab, For this purpose we are observing notifications. @@ -154,7 +164,10 @@ public class CourseOutlineViewController : loadController.insets = UIEdgeInsets(top: view.safeAreaInsets.top, left: 0, bottom: view.safeAreaInsets.bottom, right : 0) tableController.view.snp.remakeConstraints { make in - make.edges.equalTo(safeEdges) + make.top.equalTo(safeTop).offset(StandardVerticalMargin * 2) + make.bottom.equalTo(safeBottom) + make.leading.equalTo(safeLeading) + make.trailing.equalTo(safeTrailing) } super.updateViewConstraints() } @@ -322,8 +335,7 @@ public class CourseOutlineViewController : private func loadRowsStream() { rowsLoader.listen(self, success : { [weak self] groups in if let owner = self { - owner.tableController.groups = groups - owner.tableController.tableView.reloadData() + owner.tableController.setGroups(groups) owner.loadController.state = groups.count == 0 ? owner.emptyState() : .Loaded } }, failure : {[weak self] error in @@ -337,24 +349,33 @@ public class CourseOutlineViewController : } private func handleNavigationIfNeeded() { - if let courseUpgradeModel = courseUpgradeHelper.courseUpgradeModel { - courseUpgradeHelper.resetUpgradeModel() - - if courseUpgradeModel.screen == .courseDashboard { - DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in - self?.courseUpgradeHelper.removeLoader(success: true, removeView: true) - } - } else if courseUpgradeModel.screen == .courseComponent, let blockID = courseUpgradeModel.blockID { - environment.router?.navigateToComponentScreen(from: self, courseID: courseUpgradeModel.courseID, componentID: blockID) { _ in - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in - self?.courseUpgradeHelper.removeLoader(success: true, removeView: true) - } - } - } - } else { + guard let courseUpgradeModel = courseUpgradeHelper.courseUpgradeModel else { // navigation from deeplink navigateToComponentScreenIfNeeded() + return } + + courseUpgradeHelper.resetUpgradeModel() + + switch courseUpgradeModel.screen { + case .courseDashboard: + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in + self?.removeLoader() + } + case .courseComponent: + guard let blockID = courseUpgradeModel.blockID else { return } + environment.router?.navigateToComponentScreen(from: self, courseID: courseUpgradeModel.courseID, componentID: blockID) { _ in + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in + self?.removeLoader() + } + } + default: + break + } + } + + private func removeLoader() { + courseUpgradeHelper.removeLoader(success: true, removeView: true) } private func loadBackedStreams() { @@ -395,7 +416,13 @@ public class CourseOutlineViewController : } private func showSnackBar() { - showDateResetSnackBar(message: Strings.Coursedates.toastSuccessMessage, buttonText: Strings.Coursedates.viewAllDates, showButton: true) { [weak self] in + guard let topController = UIApplication.shared.topMostController() else { return } + var showViewDatesButton = true + if let selectedController = newDashboardDelegate?.selectedController() { + showViewDatesButton = !(selectedController is CourseDatesViewController) + } + + topController.showDateResetSnackBar(message: Strings.Coursedates.toastSuccessMessage, buttonText: Strings.Coursedates.viewAllDates, showButton: showViewDatesButton) { [weak self] in if let weakSelf = self { weakSelf.environment.router?.showDatesTabController(controller: weakSelf) weakSelf.hideSnackBar() @@ -521,7 +548,7 @@ extension CourseOutlineViewController { } public func t_currentChildCount() -> Int { - return tableController.groups.count + return tableController.t_groupsCount } public func t_populateResumeCourseItem(item : ResumeCourseItem) -> Bool { diff --git a/Source/CourseSectionTableViewCell.swift b/Source/CourseSectionTableViewCell.swift index 8115b5831f..dc530ad09e 100644 --- a/Source/CourseSectionTableViewCell.swift +++ b/Source/CourseSectionTableViewCell.swift @@ -11,7 +11,7 @@ import UIKit protocol CourseSectionTableViewCellDelegate : AnyObject { func sectionCellChoseDownload(cell : CourseSectionTableViewCell, videos : [OEXHelperVideoDownload], forBlock block : CourseBlock) func sectionCellChoseShowDownloads(cell : CourseSectionTableViewCell) - func reloadCell(cell: UITableViewCell) + func reloadSectionCell(cell: UITableViewCell) } class CourseSectionTableViewCell: SwipeableCell, CourseBlockContainerCell { @@ -24,7 +24,11 @@ class CourseSectionTableViewCell: SwipeableCell, CourseBlockContainerCell { weak var delegate : CourseSectionTableViewCellDelegate? fileprivate var spinnerTimer = Timer() var courseID: String? - var courseOutlineMode: CourseOutlineMode = .full + var courseOutlineMode: CourseOutlineMode = .full { + didSet { + content.courseOutlineMode = courseOutlineMode + } + } var videos : OEXStream<[OEXHelperVideoDownload]> = OEXStream() { didSet { @@ -37,8 +41,16 @@ class CourseSectionTableViewCell: SwipeableCell, CourseBlockContainerCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) contentView.addSubview(content) + content.snp.makeConstraints { make in - make.edges.equalTo(contentView) + if OEXConfig.shared().isNewDashboardEnabled && courseOutlineMode == .full { + make.top.equalTo(contentView) + make.bottom.equalTo(contentView) + make.leading.equalTo(contentView).offset(StandardHorizontalMargin) + make.trailing.equalTo(contentView).inset(StandardHorizontalMargin) + } else { + make.edges.equalTo(contentView) + } } for notification in [NSNotification.Name.OEXDownloadProgressChanged, NSNotification.Name.OEXDownloadEnded, NSNotification.Name.OEXVideoStateChanged] { @@ -61,6 +73,10 @@ class CourseSectionTableViewCell: SwipeableCell, CourseBlockContainerCell { } downloadView.addGestureRecognizer(tapGesture) setAccessibilityIdentifiers() + + if OEXConfig.shared().isNewDashboardEnabled { + content.backgroundColor = OEXStyles.shared().neutralWhiteT() + } } private func setAccessibilityIdentifiers() { @@ -153,26 +169,29 @@ class CourseSectionTableViewCell: SwipeableCell, CourseBlockContainerCell { var block: CourseBlock? = nil { didSet { guard let block = block else { return } - content.setTitleText(title: block.displayName, elipsis: false) content.isGraded = block.graded content.setDetailText(title: block.format ?? "", dueDate: block.dueDate, blockType: block.type) - - if courseOutlineMode == .video, - let sectionChild = courseQuerier?.childrenOfBlockWithID(blockID: block.blockID, forMode: .video).value, - sectionChild.block.type == .Section, - let unitChild = courseQuerier?.childrenOfBlockWithID(blockID: sectionChild.block.blockID, forMode: .video).value, - unitChild.children.allSatisfy ({ $0.isCompleted }) { - completionAction?() - showCompletionBackground() - } else { - handleBlockNormally(block) - } - + handleVideoBlockIfNeeded(block) setupDownloadView() } } + private func handleVideoBlockIfNeeded(_ block: CourseBlock) { + guard courseOutlineMode == .video, + let sectionChild = courseQuerier?.childrenOfBlockWithID(blockID: block.blockID, forMode: .video).value, + sectionChild.block.type == .Section, + let unitChild = courseQuerier?.childrenOfBlockWithID(blockID: sectionChild.block.blockID, forMode: .video).value, + unitChild.children.allSatisfy ({ $0.isCompleted }) + else { + handleBlockNormally(block) + return + } + + completionAction?() + showCompletionBackground() + } + private func handleBlockNormally(_ block: CourseBlock) { if block.isCompleted { let shouldShowIcon = courseOutlineMode == .full ? true : false @@ -228,7 +247,7 @@ extension CourseSectionTableViewCell: SwipeableCellDelegate { @objc private func invalidateTimer(){ spinnerTimer.invalidate() downloadView.state = .Done - delegate?.reloadCell(cell: self) + delegate?.reloadSectionCell(cell: self) } } diff --git a/Source/CourseVideoTableViewCell.swift b/Source/CourseVideoTableViewCell.swift index 009360cb3f..24fc092e3f 100644 --- a/Source/CourseVideoTableViewCell.swift +++ b/Source/CourseVideoTableViewCell.swift @@ -114,6 +114,7 @@ class CourseVideoTableViewCell: SwipeableCell, CourseBlockContainerCell { private func setupContentView() { contentView.addSubview(content) + content.snp.makeConstraints { make in make.edges.equalTo(contentView) } diff --git a/Source/CoursesContainerViewController.swift b/Source/CoursesContainerViewController.swift index 8636da4c63..596601ff07 100644 --- a/Source/CoursesContainerViewController.swift +++ b/Source/CoursesContainerViewController.swift @@ -105,13 +105,15 @@ class CourseCardCell : UICollectionViewCell { protocol CoursesContainerViewControllerDelegate : AnyObject { func coursesContainerChoseCourse(course : OEXCourse) func showValuePropDetailView(with course: OEXCourse) + func reload() } extension CoursesContainerViewControllerDelegate { func showValuePropDetailView(with course: OEXCourse) {} + func reload() {} } -class CoursesContainerViewController: UICollectionViewController { +class CoursesContainerViewController: UICollectionViewController, ScrollableDelegateProvider { enum Context { case courseCatalog @@ -120,6 +122,9 @@ class CoursesContainerViewController: UICollectionViewController { typealias Environment = NetworkManagerProvider & OEXRouterProvider & OEXConfigProvider & OEXInterfaceProvider & OEXAnalyticsProvider & ServerConfigProvider + weak var scrollableDelegate: ScrollableDelegate? + private var scrollByDragging = false + private let environment : Environment private let context: Context @@ -127,6 +132,11 @@ class CoursesContainerViewController: UICollectionViewController { private var isAuditModeCourseAvailable: Bool = false + private lazy var errorView: GeneralErrorView = { + let errorView = GeneralErrorView() + return errorView + }() + var courses: [OEXCourse] = [] { didSet { if isiPad() { @@ -143,9 +153,9 @@ class CoursesContainerViewController: UICollectionViewController { } private var shouldShowFooter: Bool { - return context == .enrollmentList && isDiscoveryEnabled + return context == .enrollmentList && isDiscoveryEnabled && courses.isEmpty } - + init(environment: Environment, context: Context) { self.environment = environment self.context = context @@ -188,18 +198,14 @@ class CoursesContainerViewController: UICollectionViewController { ) } - override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return courses.count - } - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize { - return CGSize(width: collectionView.frame.size.width, height: shouldShowFooter ? EnrolledCoursesFooterViewHeight : 0) + return CGSize(width: collectionView.frame.size.width, height: shouldShowFooter ? collectionView.frame.size.height : 0) } override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { if kind == UICollectionView.elementKindSectionFooter { let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: EnrolledCoursesFooterView.identifier, for: indexPath) as! EnrolledCoursesFooterView - footerView.findCoursesAction = {[weak self] in + footerView.findCoursesAction = { [weak self] in self?.environment.router?.showCourseCatalog(fromController: self, bottomBar: nil) self?.environment.analytics.trackUserFindsCourses(self?.courses.count ?? 0) } @@ -209,6 +215,10 @@ class CoursesContainerViewController: UICollectionViewController { return UICollectionReusableView() } + override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return courses.count + } + override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let course = courses[indexPath.row] @@ -258,6 +268,43 @@ class CoursesContainerViewController: UICollectionViewController { super.viewDidLayoutSubviews() insetsController.updateInsets() } + + func showError(message: String? = nil) { + setupErrorView() + errorView.setErrorMessage(message: message) + + errorView.tapAction = { [weak self] in + self?.delegate?.reload() + } + } + + private func setupErrorView() { + collectionView.alpha = 0 + view.addSubview(errorView) + view.bringSubviewToFront(errorView) + + errorView.snp.makeConstraints { make in + make.edges.equalTo(view) + } + } + + func showOutdatedVersionError() { + setupErrorView() + errorView.showOutdatedVersionError() + + errorView.tapAction = { [weak self] in + if let URL = self?.environment.config.appUpgradeConfig.iOSAppStoreURL() as? URL, UIApplication.shared.canOpenURL(URL) { + UIApplication.shared.open(URL as URL, options: [:], completionHandler: nil) + } + } + } + + func removeErrorView() { + if view.subviews.contains(errorView) { + errorView.removeFromSuperview() + collectionView.alpha = 1 + } + } } extension CoursesContainerViewController: UICollectionViewDelegateFlowLayout { @@ -292,3 +339,19 @@ extension CoursesContainerViewController: UICollectionViewDelegateFlowLayout { return CGSize(width: widthPerItem, height: heightPerItem) } } + +extension CoursesContainerViewController { + override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + scrollByDragging = true + } + + override func scrollViewDidScroll(_ scrollView: UIScrollView) { + if scrollByDragging { + scrollableDelegate?.scrollViewDidScroll(scrollView: scrollView) + } + } + + override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + scrollByDragging = false + } +} diff --git a/Source/CutomePlayer/VideoPlayer.swift b/Source/CutomePlayer/VideoPlayer.swift index 0365ed2691..69f36a4f39 100644 --- a/Source/CutomePlayer/VideoPlayer.swift +++ b/Source/CutomePlayer/VideoPlayer.swift @@ -31,7 +31,7 @@ protocol VideoPlayerDelegate: AnyObject { private var playbackLikelyToKeepUpContext = 0 class VideoPlayer: UIViewController,VideoPlayerControlsDelegate,TranscriptManagerDelegate { - typealias Environment = OEXInterfaceProvider & OEXAnalyticsProvider & OEXStylesProvider + typealias Environment = OEXInterfaceProvider & OEXAnalyticsProvider & OEXStylesProvider & OEXConfigProvider public let environment : Environment fileprivate var controls: VideoPlayerControls? @@ -689,9 +689,13 @@ class VideoPlayer: UIViewController,VideoPlayerControlsDelegate,TranscriptManage func setFullscreen(fullscreen: Bool, animated: Bool, with deviceOrientation: UIInterfaceOrientation, forceRotate rotate: Bool) { if !isVisible { return } isFullScreen = fullscreen + if fullscreen { - - fullScreenContainerView = UIApplication.shared.window?.rootViewController?.view ?? UIApplication.shared.windows[0].rootViewController?.view + if environment.config.isNewComponentNavigationEnabled { + fullScreenContainerView = parent?.findParentViewController(type: NewCourseContentController.self)?.view ?? UIApplication.shared.windows.first?.rootViewController?.view + } else { + fullScreenContainerView = UIApplication.shared.window?.rootViewController?.view ?? UIApplication.shared.windows.first?.rootViewController?.view + } if movieBackgroundView.frame == .zero { movieBackgroundView.frame = movieBackgroundFrame diff --git a/Source/Deep Linking/DeepLinkManager.swift b/Source/Deep Linking/DeepLinkManager.swift index 11d1ac2998..4d002d4447 100644 --- a/Source/Deep Linking/DeepLinkManager.swift +++ b/Source/Deep Linking/DeepLinkManager.swift @@ -103,19 +103,10 @@ import UIKit return .none } - private func showCourseDashboardViewController(with link: DeepLink) { - guard let topViewController = topMostViewController else { return } - - if let courseDashboardView = topViewController.parent as? CourseDashboardViewController, courseDashboardView.courseID == link.courseId { - if !controllerAlreadyDisplayed(for: link.type) { - courseDashboardView.switchTab(with: link.type, componentID: link.componentID) - return - } - } - + private func showCourseDashboardViewController(with link: DeepLink, completion: (() -> Void)? = nil) { dismiss() { [weak self] _ in if let topController = self?.topMostViewController { - self?.environment?.router?.showCourse(with: link, courseID: link.courseId ?? "", from: topController) + self?.environment?.router?.showCourse(with: link, courseID: link.courseId ?? "", from: topController, completion: completion) } } } @@ -331,6 +322,10 @@ import UIKit return postController.topicID == link.topicID } + if isControllerAlreadyDisplayed { + return + } + func showDiscussionPosts() { if let topController = topMostViewController { environment?.router?.showDiscussionPosts(from: topController, courseID: courseId, topicID: topicID) @@ -349,10 +344,10 @@ import UIKit courseDashboardController.switchTab(with: link.type) } else { - self?.showCourseDashboardViewController(with: link) + self?.showCourseDashboardViewController(with: link) { + showDiscussionPosts() + } } - - showDiscussionPosts() } } } @@ -367,6 +362,10 @@ import UIKit return discussionResponseController.threadID == link.threadID } + if isControllerAlreadyDisplayed { + return + } + func showResponses() { if let topController = topMostViewController { environment?.router?.showDiscussionResponses(from: topController, courseID: courseId, threadID: threadID, isDiscussionBlackedOut: false, completion: completion) @@ -409,6 +408,10 @@ import UIKit return discussionResponseController.threadID == link.threadID } + if isControllerAlreadyDisplayed { + return + } + func showComment() { if let topController = topMostViewController, let discussionResponseController = topController as? DiscussionResponsesViewController { environment?.router?.showDiscussionComments(from: discussionResponseController, courseID: courseID, commentID: commentID, threadID:threadID) @@ -522,6 +525,8 @@ import UIKit return } + let isNewDashboardEnabled = environment?.config.isNewDashboardEnabled ?? false + switch type { case .courseDashboard, .courseVideos, .discussions, .courseDates, .courseComponent: showCourseDashboardViewController(with: link) @@ -544,15 +549,23 @@ import UIKit showDiscussionTopic(with: link) break case .discussionPost: - showDiscussionResponses(with: link) + showDiscussionResponses(with: link) break case .discussionComment: - showdiscussionComments(with: link) + showdiscussionComments(with: link) case .courseHandout: - showCourseHandout(with: link) + if isNewDashboardEnabled { + showCourseDashboardViewController(with: link) + } else { + showCourseHandout(with: link) + } break case .courseAnnouncement: - showCourseAnnouncement(with: link) + if isNewDashboardEnabled { + showCourseDashboardViewController(with: link) + } else { + showCourseAnnouncement(with: link) + } break default: break diff --git a/Source/DetailToolbarButton.swift b/Source/DetailToolbarButton.swift index 1f9fcdceb3..ec52c1d653 100644 --- a/Source/DetailToolbarButton.swift +++ b/Source/DetailToolbarButton.swift @@ -82,9 +82,17 @@ class DetailToolbarButton: UIView { } private var titleStyle : OEXTextStyle { - let style = OEXMutableTextStyle(weight: .semiBold, size: .small, color: OEXStyles.shared().primaryBaseColor()) - style.alignment = self.textAlignment + let style: OEXMutableTextStyle + + if OEXConfig.shared().isNewComponentNavigationEnabled { + style = OEXMutableTextStyle(weight: .normal, size: .xLarge, color: OEXStyles.shared().neutralXDark()) + } else { + style = OEXMutableTextStyle(weight: .semiBold, size: .small, color: OEXStyles.shared().primaryBaseColor()) + } + + style.alignment = textAlignment style.dynamicTypeSupported = false + return style } diff --git a/Source/DiscoveryViewController.swift b/Source/DiscoveryViewController.swift index 581a6c3703..5c9cea9798 100644 --- a/Source/DiscoveryViewController.swift +++ b/Source/DiscoveryViewController.swift @@ -47,7 +47,7 @@ class DiscoveryViewController: UIViewController, InterfaceOrientationOverriding private func configureDiscoveryController() { guard environment.config.discovery.isEnabled else { return } - let coursesController = self.environment.config.discovery.type == .webview ? OEXFindCoursesViewController(environment: environment, showBottomBar: false, bottomBar: bottomBar, searchQuery: self.searchQuery) : CourseCatalogViewController(environment: self.environment) + let coursesController = self.environment.config.discovery.type == .webview ? OEXFindCoursesViewController(environment: environment, showBottomBar: false, bottomBar: bottomBar, searchQuery: self.searchQuery, fromStartupScreen: false) : CourseCatalogViewController(environment: self.environment) addChild(coursesController) didMove(toParent: self) diff --git a/Source/DiscoveryWebViewHelper.swift b/Source/DiscoveryWebViewHelper.swift index 39b1141fac..c986098827 100644 --- a/Source/DiscoveryWebViewHelper.swift +++ b/Source/DiscoveryWebViewHelper.swift @@ -43,6 +43,8 @@ class DiscoveryWebViewHelper: NSObject { self.init(environment: environment, delegate: delegate, bottomBar: bottomBar, searchQuery: nil) } + private lazy var titleView = UIView() + @objc init(environment: Environment, delegate: WebViewNavigationDelegate?, bottomBar: UIView?, searchQuery: String?) { self.environment = environment self.webView = WKWebView(frame: .zero, configuration: environment.config.webViewConfiguration()) @@ -69,8 +71,57 @@ class DiscoveryWebViewHelper: NSObject { refreshView() } + private func addShowTitleView() { + guard let container = delegate?.webViewContainingController() else { return } + + if contentView.contains(titleView) { + if titleView.alpha != 1 { + UIView.animate(withDuration: 0.4) { [weak self] in + self?.titleView.alpha = 1 + } + contentView.bringSubviewToFront(titleView) + } + } + else { + titleView.backgroundColor = OEXStyles.shared().navigationBarColor() + contentView.addSubview(titleView) + titleView.alpha = 0 + let title = UILabel() + title.textColor = OEXStyles.shared().navigationItemTintColor() + title.text = Strings.exploreTheCatalog + titleView.addSubview(title) + + title.snp.remakeConstraints { make in + make.center.equalTo(titleView) + } + } + + let offSet = container.view.viewWithTag(statuBarViewTag)?.frame.size.height ?? 0 + titleView.snp.remakeConstraints { make in + make.top.equalTo(contentView).offset(offSet) + make.trailing.equalTo(contentView) + make.leading.equalTo(contentView) + make.height.equalTo(44) + } + } + + private func hideTitleView() { + UIView.animate(withDuration: 0.4) { [weak self] in + self?.titleView.alpha = 0 + } + } + + @objc func updateTitleViewVisibility() { + if webView.scrollView.contentOffset.y >= 0 { + addShowTitleView() + } + else { + hideTitleView() + } + } + @objc func refreshView() { - guard let _ = delegate?.webViewContainingController() else { return } + guard let container = delegate?.webViewContainingController() else { return } contentView.subviews.forEach { $0.removeFromSuperview() } let isUserLoggedIn = environment.session.currentUser != nil @@ -93,6 +144,14 @@ class DiscoveryWebViewHelper: NSObject { } addObserver() + + if let container = container as? OEXFindCoursesViewController { + if !container.fromStartupScreen { + webView.scrollView.delegate = self + container.setStatusBar(color: OEXStyles.shared().navigationBarColor()) + addShowTitleView() + } + } } private func addObserver() { @@ -342,3 +401,31 @@ extension WKWebView { configuration.userContentController.addUserScript(script) } } + +extension DiscoveryWebViewHelper: UIScrollViewDelegate { + func scrollViewDidScroll(_ scrollView: UIScrollView) { + if scrollView.contentOffset.y >= 0 { + addShowTitleView() + } + else { + hideTitleView() + } + } +} + +extension OEXFindCoursesViewController { + open override var preferredStatusBarStyle: UIStatusBarStyle { + return .darkContent + } + + open override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + + coordinator.animate { [weak self] _ in + guard let weakSelf = self else { return } + DispatchQueue.main.async { + weakSelf.setStatusBar(color: OEXStyles.shared().navigationBarColor()) + weakSelf.updateTitleViewVisibility() + } + } + } +} diff --git a/Source/DiscussionBlockViewController.swift b/Source/DiscussionBlockViewController.swift index 33a07af147..7bf55d77c9 100644 --- a/Source/DiscussionBlockViewController.swift +++ b/Source/DiscussionBlockViewController.swift @@ -8,10 +8,16 @@ import Foundation -class DiscussionBlockViewController: UIViewController, CourseBlockViewController { +class DiscussionBlockViewController: UIViewController, CourseBlockViewController, ScrollableDelegateProvider { typealias Environment = NetworkManagerProvider & OEXRouterProvider & OEXAnalyticsProvider & OEXStylesProvider & DataManagerProvider & OEXConfigProvider + weak var scrollableDelegate: ScrollableDelegate? { + didSet { + postsController.scrollableDelegate = scrollableDelegate + } + } + let courseID: String let blockID : CourseBlockID? diff --git a/Source/DiscussionTopicsViewController.swift b/Source/DiscussionTopicsViewController.swift index 11cf1b5f36..e60e297021 100644 --- a/Source/DiscussionTopicsViewController.swift +++ b/Source/DiscussionTopicsViewController.swift @@ -9,7 +9,7 @@ import Foundation import UIKit -public class DiscussionTopicsViewController: OfflineSupportViewController, UITableViewDataSource, UITableViewDelegate, InterfaceOrientationOverriding, LoadStateViewReloadSupport { +public class DiscussionTopicsViewController: OfflineSupportViewController, UITableViewDataSource, UITableViewDelegate, InterfaceOrientationOverriding, LoadStateViewReloadSupport, ScrollableDelegateProvider { public typealias Environment = DataManagerProvider & OEXRouterProvider & OEXAnalyticsProvider & ReachabilityProvider & NetworkManagerProvider @@ -31,6 +31,9 @@ public class DiscussionTopicsViewController: OfflineSupportViewController, UITab private let tableView = UITableView() private let searchBarSeparator = UIView() + public weak var scrollableDelegate: ScrollableDelegate? + private var scrollByDragging = false + public init(environment: Environment, courseID: String) { self.environment = environment self.courseID = courseID @@ -74,7 +77,7 @@ public class DiscussionTopicsViewController: OfflineSupportViewController, UITab tableView.cellLayoutMarginsFollowReadableWidth = false searchBar.applyStandardStyles(withPlaceholder: Strings.searchAllPosts) - + searchBar.searchBarStyle = .minimal searchBarDelegate = DiscussionSearchBarDelegate() { [weak self] text in if let owner = self { owner.environment.router?.showPostsFromController(controller: owner, courseID: owner.courseID, queryString : text) @@ -155,7 +158,6 @@ public class DiscussionTopicsViewController: OfflineSupportViewController, UITab self.environment.analytics.trackScreen(withName: OEXAnalyticsScreenViewTopics, courseID: self.courseID, value: nil) refreshTopics() - self.navigationController?.setNavigationBarHidden(false, animated: animated) } override func reloadViewData() { @@ -238,6 +240,22 @@ public class DiscussionTopicsViewController: OfflineSupportViewController, UITab } } +extension DiscussionTopicsViewController: UIScrollViewDelegate { + public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + scrollByDragging = true + } + + public func scrollViewDidScroll(_ scrollView: UIScrollView) { + if scrollByDragging { + scrollableDelegate?.scrollViewDidScroll(scrollView: scrollView) + } + } + + public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + scrollByDragging = false + } +} + extension DiscussionTopicsViewController { public func t_topicsLoaded() -> OEXStream<[DiscussionTopic]> { return topics diff --git a/Source/DropDown/helpers/DPDConstants.swift b/Source/DropDown/helpers/DPDConstants.swift index b5caa30aa6..52047beb4a 100644 --- a/Source/DropDown/helpers/DPDConstants.swift +++ b/Source/DropDown/helpers/DPDConstants.swift @@ -6,6 +6,8 @@ // Copyright (c) 2015 Kevin Hirsch. All rights reserved. // +#if os(iOS) + import UIKit internal struct DPDConstant { @@ -55,3 +57,5 @@ internal struct DPDConstant { } } + +#endif diff --git a/Source/DropDown/helpers/DPDKeyboardListener.swift b/Source/DropDown/helpers/DPDKeyboardListener.swift index 0d578abfa3..d89c41c8aa 100644 --- a/Source/DropDown/helpers/DPDKeyboardListener.swift +++ b/Source/DropDown/helpers/DPDKeyboardListener.swift @@ -6,6 +6,8 @@ // Copyright (c) 2015 Kevin Hirsch. All rights reserved. // +#if os(iOS) + import UIKit internal final class KeyboardListener { @@ -66,3 +68,5 @@ extension KeyboardListener { } } + +#endif diff --git a/Source/DropDown/helpers/DPDUIView+Extension.swift b/Source/DropDown/helpers/DPDUIView+Extension.swift index 8d6a4dbe78..4a343166d5 100644 --- a/Source/DropDown/helpers/DPDUIView+Extension.swift +++ b/Source/DropDown/helpers/DPDUIView+Extension.swift @@ -6,6 +6,8 @@ // Copyright (c) 2015 Kevin Hirsch. All rights reserved. // +#if os(iOS) + import UIKit //MARK: - Constraints @@ -60,3 +62,5 @@ internal extension UIWindow { } } + +#endif diff --git a/Source/DropDown/resources/DropDownCell.xib b/Source/DropDown/resources/DropDownCell.xib new file mode 100644 index 0000000000..5e53383f6d --- /dev/null +++ b/Source/DropDown/resources/DropDownCell.xib @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/DropDown/src/DropDown+Appearance.swift b/Source/DropDown/src/DropDown+Appearance.swift index c7de93ce1b..7ac057dad6 100644 --- a/Source/DropDown/src/DropDown+Appearance.swift +++ b/Source/DropDown/src/DropDown+Appearance.swift @@ -6,6 +6,8 @@ // Copyright © 2016 Kevin Hirsch. All rights reserved. // +#if os(iOS) + import UIKit extension DropDown { @@ -29,3 +31,5 @@ extension DropDown { } } + +#endif diff --git a/Source/DropDown/src/DropDown.swift b/Source/DropDown/src/DropDown.swift index 944ebcff94..b7bf95e112 100644 --- a/Source/DropDown/src/DropDown.swift +++ b/Source/DropDown/src/DropDown.swift @@ -6,6 +6,8 @@ // Copyright (c) 2015 Kevin Hirsch. All rights reserved. // +#if os(iOS) + import UIKit public typealias Index = Int @@ -44,8 +46,11 @@ extension UIBarButtonItem: AnchorView { public final class DropDown: UIView { //TODO: handle iOS 7 landscape mode - - private var isVisible = false + + var updatedTableHeight: CGFloat? + var updatedMinHeight: CGFloat? + + private(set) var isVisible = false private var isHitTest: Bool = false { didSet { @@ -56,7 +61,7 @@ public final class DropDown: UIView { } } } - + /// The dismiss mode for a drop down. public enum DismissMode { @@ -362,11 +367,35 @@ public final class DropDown: UIView { didSet { reloadAllComponents() } } + public var normalTextStyle: OEXTextStyle? public var selectedTextStyle: OEXTextStyle? public var selectedBackgroundColor: UIColor? public var normalBackgroundColor: UIColor? + + /** + The NIB to use for DropDownCells + + Changing the cell nib automatically reloads the drop down. + */ + public var cellNib = UINib(nibName: "DropDownCell", bundle: bundle) { + didSet { + tableView.register(cellNib, forCellReuseIdentifier: DPDConstant.ReusableIdentifier.DropDownCell) + templateCell = nil + reloadAllComponents() + } + } + + /// Correctly specify Bundle for Swift Packages + fileprivate static var bundle: Bundle { + #if SWIFT_PACKAGE + return Bundle.module + #else + return Bundle(for: DropDownCell.self) + #endif + } + //MARK: Content /** @@ -380,7 +409,7 @@ public final class DropDown: UIView { reloadAllComponents() } } - + public var selectedRowIndex: Int = 0 /** @@ -394,7 +423,10 @@ public final class DropDown: UIView { dataSource = localizationKeysDataSource.map { NSLocalizedString($0, comment: "") } } } - + + /// The indicies that have been selected + fileprivate var selectedRowIndices = Set() + /** The format for the cells' text. @@ -416,6 +448,14 @@ public final class DropDown: UIView { /// The action to execute when the user selects a cell. public var selectionAction: SelectionClosure? + + /** + The action to execute when the user selects multiple cells. + + Providing an action will turn on multiselection mode. + The single selection action will still be called if provided. + */ + public var multiSelectionAction: MultiSelectionClosure? /// The action to execute when the drop down will show. public var willShowAction: Closure? @@ -438,7 +478,11 @@ public final class DropDown: UIView { } fileprivate var minHeight: CGFloat { - return tableView.rowHeight + if let height = updatedMinHeight { + return height + } else { + return tableView.rowHeight + } } fileprivate var didSetupConstraints = false @@ -486,22 +530,20 @@ public final class DropDown: UIView { override public init(frame: CGRect) { super.init(frame: frame) - setup() } public required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) - setup() } } //MARK: - Setup -private extension DropDown { +extension DropDown { func setup() { - tableView.register(DropDownCell.self, forCellReuseIdentifier: DPDConstant.ReusableIdentifier.DropDownCell) + tableView.register(cellNib, forCellReuseIdentifier: DPDConstant.ReusableIdentifier.DropDownCell) DispatchQueue.main.async { //HACK: If not done in dispatch_async on main queue `setupUI` will have no effect @@ -522,6 +564,24 @@ private extension DropDown { accessibilityIdentifier = "drop_down" } + + func setupCustom() -> UITableView { + DispatchQueue.main.async { + //HACK: If not done in dispatch_async on main queue `setupUI` will have no effect + self.updateConstraintsIfNeeded() + self.setupUI() + } + + setHiddentState() + isHidden = true + + dismissMode = .onTap + + startListeningToKeyboard() + + accessibilityIdentifier = "drop_down" + return tableView + } func setupUI() { super.backgroundColor = dimmedBackgroundColor @@ -749,7 +809,7 @@ extension DropDown { fileprivate func fittingWidth() -> CGFloat { if templateCell == nil { - templateCell = DropDownCell(frame: .zero) + templateCell = (cellNib.instantiate(withOwner: nil, options: nil)[0] as! DropDownCell) } var maxWidth: CGFloat = 0 @@ -821,7 +881,6 @@ extension DropDown { - returns: Wether it succeed and how much height is needed to display all cells at once. */ - @discardableResult public func show(onTopOf window: UIWindow? = nil, beforeTransform transform: CGAffineTransform? = nil, anchorPoint: CGPoint? = nil) -> (canBeDisplayed: Bool, offscreenHeight: CGFloat?) { if self == DropDown.VisibleDropDown && DropDown.VisibleDropDown?.isHidden == false { // added condition - DropDown.VisibleDropDown?.isHidden == false -> to resolve forever hiding dropdown issue when continuous taping on button - Kartik Patel - 2016-12-29 @@ -838,15 +897,15 @@ extension DropDown { } if let visibleDropDown = DropDown.VisibleDropDown { - DropDown.VisibleDropDown = nil - visibleDropDown.cancel(shouldCallCallback: true) - return (true, 0) + visibleDropDown.cancel() } willShowAction?() DropDown.VisibleDropDown = self + isVisible = true + setNeedsUpdateConstraints() let visibleWindow = window != nil ? window : UIWindow.visibleWindow() @@ -890,10 +949,25 @@ extension DropDown { UIAccessibility.post(notification: .screenChanged, argument: self) //deselectRows(at: selectedRowIndices) - selectRows(at: selectedRowIndex) + selectRows(at: selectedRowIndices) return (layout.canBeDisplayed, layout.offscreenHeight) } + + public func showCustomView(anchorPoint: CGPoint? = nil) { + let customView = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 60)) + customView.backgroundColor = .red + setNeedsUpdateConstraints() + + let visibleWindow = window != nil ? window : UIWindow.visibleWindow() + visibleWindow?.addSubview(customView) + visibleWindow?.bringSubviewToFront(customView) + + if anchorPoint != nil { + customView.layer.anchorPoint = anchorPoint! + } + customView.transform = downScaleTransform + } public override func accessibilityPerformEscape() -> Bool { switch dismissMode { @@ -904,11 +978,11 @@ extension DropDown { return false } } - + public func forceHide() { - cancel(shouldCallCallback: true) + cancel(shouldCallCallback: true) } - + /// Hides the drop down. public func hide() { if self == DropDown.VisibleDropDown { @@ -942,7 +1016,7 @@ extension DropDown { fileprivate func cancel(shouldCallCallback: Bool = false) { hide() - if shouldCallCallback { + if shouldCallCallback { isVisible = false DropDown.VisibleDropDown = nil cancelAction?() @@ -986,27 +1060,42 @@ extension DropDown { tableView.selectRow( at: IndexPath(row: index, section: 0), animated: true, scrollPosition: scrollPosition ) - selectedRowIndex = index + selectedRowIndices.insert(index) } else { - deselectRows(at: selectedRowIndex) + deselectRows(at: selectedRowIndices) + selectedRowIndices.removeAll() } } - public func selectRows(at index: Int) { - selectRow(at: index) + public func selectRows(at indices: Set?) { + indices?.forEach { + selectRow(at: $0) + } + + // if we are in multi selection mode then reload data so that all selections are shown + if multiSelectionAction != nil { + tableView.reloadData() + } } - public func deselectRow(at index: Int?) { + public func deselectRow(at index: Index?) { guard let index = index , index >= 0 else { return } + // remove from indices + if let selectedRowIndex = selectedRowIndices.firstIndex(where: { $0 == index }) { + selectedRowIndices.remove(at: selectedRowIndex) + } + tableView.deselectRow(at: IndexPath(row: index, section: 0), animated: true) } // de-selects the rows at the indices provided - public func deselectRows(at index: Int) { - deselectRow(at: index) + public func deselectRows(at indices: Set?) { + indices?.forEach { + deselectRow(at: $0) + } } /// Returns the index of the selected row. @@ -1023,7 +1112,11 @@ extension DropDown { /// Returns the height needed to display all cells. fileprivate var tableHeight: CGFloat { - return tableView.rowHeight * CGFloat(dataSource.count) + if let height = updatedTableHeight { + return height + } else { + return tableView.rowHeight * CGFloat(dataSource.count) + } } //MARK: Objective-C methods for converting the Swift type Index @@ -1054,7 +1147,7 @@ extension DropDown: UITableViewDataSource, UITableViewDelegate { public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: DPDConstant.ReusableIdentifier.DropDownCell, for: indexPath) as! DropDownCell - let index = indexPath.row + let index = (indexPath as NSIndexPath).row configureCell(cell, at: index) @@ -1066,18 +1159,11 @@ extension DropDown: UITableViewDataSource, UITableViewDelegate { cell.accessibilityIdentifier = localizationKeysDataSource[index] } - //cell.optionLabel.textColor = textColor - //cell.optionLabel.font = textFont - //cell.selectedBackgroundColor = selectionBackgroundColor - //cell.highlightTextColor = selectedTextColor - //cell.normalTextColor = textColor - - cell.optionText = dataSource[index] - - cell.selectedBackgroundColor = selectedBackgroundColor - cell.normalBackgroundColor = normalBackgroundColor - cell.selectedTextStyle = selectedTextStyle - cell.normalTextStyle = normalTextStyle + cell.optionLabel.textColor = textColor + cell.optionLabel.font = textFont + cell.selectedBackgroundColor = selectionBackgroundColor + cell.highlightTextColor = selectedTextColor + cell.normalTextColor = textColor if index == selectedRowIndex { cell.setSelected(true, animated: true) @@ -1086,20 +1172,51 @@ extension DropDown: UITableViewDataSource, UITableViewDelegate { cell.setSelected(false, animated: false) cell.optionLabel.attributedText = normalTextStyle?.attributedString(withText: dataSource[index]) } - - cell.optionLabel.textAlignment = .center + + if let cellConfiguration = cellConfiguration { + cell.optionLabel.text = cellConfiguration(index, dataSource[index]) + } else { + cell.optionLabel.text = dataSource[index] + } + customCellConfiguration?(index, dataSource[index], cell) } public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { - cell.isSelected = selectedRowIndex == indexPath.row + cell.isSelected = selectedRowIndices.first{ $0 == (indexPath as NSIndexPath).row } != nil } public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let selectedRowIndex = indexPath.row + let selectedRowIndex = (indexPath as NSIndexPath).row - self.selectedRowIndex = selectedRowIndex + // are we in multi-selection mode? + if let multiSelectionCallback = multiSelectionAction { + // if already selected then deselect + if selectedRowIndices.first(where: { $0 == selectedRowIndex}) != nil { + deselectRow(at: selectedRowIndex) + + let selectedRowIndicesArray = Array(selectedRowIndices) + let selectedRows = selectedRowIndicesArray.map { dataSource[$0] } + multiSelectionCallback(selectedRowIndicesArray, selectedRows) + return + } + else { + selectedRowIndices.insert(selectedRowIndex) + + let selectedRowIndicesArray = Array(selectedRowIndices) + let selectedRows = selectedRowIndicesArray.map { dataSource[$0] } + + selectionAction?(selectedRowIndex, dataSource[selectedRowIndex]) + multiSelectionCallback(selectedRowIndicesArray, selectedRows) + tableView.reloadData() + return + } + } + + // Perform single selection logic + selectedRowIndices.removeAll() + selectedRowIndices.insert(selectedRowIndex) selectionAction?(selectedRowIndex, dataSource[selectedRowIndex]) if let _ = anchorView as? UIBarButtonItem { @@ -1108,7 +1225,8 @@ extension DropDown: UITableViewDataSource, UITableViewDelegate { } cancel(shouldCallCallback: true) - } + + } } @@ -1117,10 +1235,11 @@ extension DropDown: UITableViewDataSource, UITableViewDelegate { extension DropDown { public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { - let view = super.hitTest(point, with: event) + let view = super.hitTest(point, with: event) isHitTest = true + if dismissMode == .automatic && view === dismissableView { - cancel(shouldCallCallback: true) + cancel(shouldCallCallback: true) return nil } else { return view @@ -1181,3 +1300,5 @@ private extension DispatchQueue { } } } + +#endif diff --git a/Source/DropDown/src/DropDownCell.swift b/Source/DropDown/src/DropDownCell.swift index c6670160eb..bf49947ecc 100644 --- a/Source/DropDown/src/DropDownCell.swift +++ b/Source/DropDown/src/DropDownCell.swift @@ -6,42 +6,30 @@ // Copyright (c) 2015 Kevin Hirsch. All rights reserved. // +#if os(iOS) + import UIKit open class DropDownCell: UITableViewCell { - + //UI - lazy var optionLabel = UILabel() - - var optionText: String? + @IBOutlet open weak var optionLabel: UILabel! var selectedBackgroundColor: UIColor? - var normalBackgroundColor: UIColor? - var highlightTextColor: UIColor? var normalTextColor: UIColor? - - var normalTextStyle: OEXTextStyle? - var selectedTextStyle: OEXTextStyle? - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - - backgroundColor = .clear - - addSubview(optionLabel) - - optionLabel.snp.makeConstraints { make in - make.leading.equalTo(self).offset(StandardHorizontalMargin) - make.trailing.equalTo(self).inset(StandardHorizontalMargin) - make.top.equalTo(self).offset(StandardVerticalMargin) - make.bottom.equalTo(self).inset(StandardVerticalMargin) - } - } - - required public init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } +} + +//MARK: - UI + +extension DropDownCell { + + override open func awakeFromNib() { + super.awakeFromNib() + + backgroundColor = .clear + } override open var isSelected: Bool { willSet { @@ -63,18 +51,17 @@ open class DropDownCell: UITableViewCell { let executeSelection: () -> Void = { [weak self] in guard let `self` = self else { return } - if let selectedBackgroundColor = self.selectedBackgroundColor, - let normalBackgroundColor = self.normalBackgroundColor { + if let selectedBackgroundColor = self.selectedBackgroundColor { if selected { self.backgroundColor = selectedBackgroundColor - self.optionLabel.attributedText = self.selectedTextStyle?.attributedString(withText: self.optionText) + self.optionLabel.textColor = self.highlightTextColor } else { - self.backgroundColor = normalBackgroundColor - self.optionLabel.attributedText = self.normalTextStyle?.attributedString(withText: self.optionText) + self.backgroundColor = .clear + self.optionLabel.textColor = self.normalTextColor } } } - + if animated { UIView.animate(withDuration: 0.3, animations: { executeSelection() @@ -87,3 +74,5 @@ open class DropDownCell: UITableViewCell { } } + +#endif diff --git a/Source/EnrolledCoursesFooterView.swift b/Source/EnrolledCoursesFooterView.swift index 1660fe59c8..5de7d7978e 100644 --- a/Source/EnrolledCoursesFooterView.swift +++ b/Source/EnrolledCoursesFooterView.swift @@ -8,69 +8,174 @@ import Foundation -let EnrolledCoursesFooterViewHeight: CGFloat = 100 - -class EnrolledCoursesFooterView : UICollectionReusableView { +class EnrolledCoursesFooterView: UICollectionReusableView { static let identifier = "EnrolledCoursesFooterView" - private let promptLabel = UILabel() - private let findCoursesButton = UIButton(type:.system) + var findCoursesAction: (() -> Void)? private let container = UIView() + private let bottomContainer = UIView() + private let promptLabel = UILabel() + + private lazy var imageView: UIImageView = { + guard let image = UIImage(named: "empty_state_placeholder") else { return UIImageView() } + return UIImageView(image: image) + }() - var findCoursesAction : (() -> Void)? + private lazy var findCoursesButton: UIButton = { + let button = UIButton(type: .system) + button.oex_addAction({ [weak self] _ in + self?.findCoursesAction?() + }, for: .touchUpInside) + return button + }() + + private var findCoursesTextStyle: OEXTextStyle { + return OEXTextStyle(weight: .bold, size: .xxLarge, color: OEXStyles.shared().neutralBlackT()) + } - private var findCoursesTextStyle : OEXTextStyle { - return OEXTextStyle(weight: .normal, size: .base, color: OEXStyles.shared().neutralXDark()) + private var findCoursesButtonTextStyle: OEXTextStyle { + return OEXTextStyle(weight: .normal, size: .xLarge, color: OEXStyles.shared().neutralWhite()) + } + + private let attributedUnicodeSpace = NSAttributedString(string: "\u{3000}") + + private var attributedSearchImage: NSAttributedString { + let lockImage = Icon.Search.imageWithFontSize(size: 22).image(with: OEXStyles.shared().neutralWhite()) + let imageAttachment = NSTextAttachment() + imageAttachment.image = lockImage + + let imageOffsetY: CGFloat = -4.0 + if let image = imageAttachment.image { + imageAttachment.bounds = CGRect(x: 0, y: imageOffsetY, width: image.size.width, height: image.size.height) + } + + return NSAttributedString(attachment: imageAttachment) } - override init(frame: CGRect) { - super.init(frame: CGRect.zero) + override init(frame: CGRect) { + super.init(frame: frame) + + addSubViews() + setAccessibilityIdentifiers() + } + + override func layoutSubviews() { + if traitCollection.verticalSizeClass == .regular { + addPortraitConstraints() + } else { + addLandscapeConstraints() + } + + container.addShadow(offset: CGSize(width: 0, height: 2), color: OEXStyles.shared().primaryDarkColor(), radius: 2, opacity: 0.35, cornerRadius: 6) + } + + private func addSubViews() { + backgroundColor = OEXStyles.shared().neutralWhiteT() addSubview(container) - container.addSubview(promptLabel) - container.addSubview(findCoursesButton) + + container.addSubview(imageView) + container.addSubview(bottomContainer) - self.promptLabel.attributedText = findCoursesTextStyle.attributedString(withText: Strings.EnrollmentList.findCoursesPrompt) - self.promptLabel.textAlignment = .center + bottomContainer.addSubview(promptLabel) + bottomContainer.addSubview(findCoursesButton) - self.findCoursesButton.applyButtonStyle(style: OEXStyles.shared().filledPrimaryButtonStyle, withTitle: Strings.EnrollmentList.findCourses.oex_uppercaseStringInCurrentLocale()) + container.backgroundColor = OEXStyles.shared().neutralWhiteT() + + promptLabel.attributedText = findCoursesTextStyle.attributedString(withText: Strings.EnrollmentList.findCoursesPrompt) + promptLabel.textAlignment = .center + promptLabel.numberOfLines = 0 + + let attributedString = NSMutableAttributedString() + attributedString.append(attributedSearchImage) + attributedString.append(attributedUnicodeSpace) + attributedString.append(findCoursesButtonTextStyle.attributedString(withText: Strings.EnrollmentList.findCourses)) + findCoursesButton.setAttributedTitle(attributedString, for: UIControl.State()) + findCoursesButton.backgroundColor = OEXStyles.shared().secondaryBaseColor() + } + + private func setAccessibilityIdentifiers() { + accessibilityIdentifier = "EnrolledCoursesFooterView:view" + imageView.accessibilityIdentifier = "EnrolledCoursesFooterView:image-view" + promptLabel.accessibilityIdentifier = "EnrolledCoursesFooterView:prompt-label" + findCoursesButton.accessibilityIdentifier = "EnrolledCoursesFooterView:find-courses-button" + container.accessibilityIdentifier = "EnrolledCoursesFooterView:container-view" + bottomContainer.accessibilityIdentifier = "EnrolledCoursesFooterView:bottom-container-view" + } + + private func addPortraitConstraints() { + container.snp.remakeConstraints { make in + make.top.equalTo(self).offset(StandardVerticalMargin * 2) + make.bottom.equalTo(bottomContainer.snp.bottom).offset(StandardVerticalMargin * 2) + make.leading.equalTo(self).offset(StandardHorizontalMargin) + make.trailing.equalTo(self).inset(StandardHorizontalMargin) + } - container.backgroundColor = OEXStyles.shared().standardBackgroundColor() - container.applyBorderStyle(style: BorderStyle()) + imageView.snp.remakeConstraints { make in + make.top.equalTo(container) + make.height.equalTo(StandardVerticalMargin * 33) + make.leading.equalTo(container) + make.trailing.equalTo(container) + } - container.snp.makeConstraints { make in - make.top.equalTo(self).offset(CourseCardCell.margin) - make.bottom.equalTo(self) - make.leading.equalTo(self).offset(CourseCardCell.margin) - make.trailing.equalTo(self).offset(-CourseCardCell.margin) + bottomContainer.snp.remakeConstraints { make in + make.top.equalTo(imageView.snp.bottom) + make.bottom.equalTo(findCoursesButton.snp.bottom).offset(StandardVerticalMargin * 2) + make.leading.equalTo(container) + make.trailing.equalTo(container) } - self.promptLabel.snp.makeConstraints { make in - make.leading.equalTo(container).offset(StandardHorizontalMargin) - make.trailing.equalTo(container).offset(-StandardHorizontalMargin) - make.top.equalTo(container).offset(StandardVerticalMargin) + promptLabel.snp.remakeConstraints { make in + make.top.equalTo(bottomContainer).offset(StandardVerticalMargin * 2) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2.2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2.2) } - self.findCoursesButton.snp.makeConstraints { make in - make.leading.equalTo(promptLabel) - make.trailing.equalTo(promptLabel) - make.top.equalTo(promptLabel.snp.bottom).offset(StandardVerticalMargin) - make.bottom.equalTo(container).offset(-StandardVerticalMargin) + findCoursesButton.snp.remakeConstraints { make in + make.top.equalTo(promptLabel.snp.bottom).offset(StandardVerticalMargin * 3.2) + make.bottom.equalTo(bottomContainer).inset(StandardVerticalMargin * 2) + make.height.equalTo(StandardVerticalMargin * 5.5) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2) + } + } + + private func addLandscapeConstraints() { + container.snp.remakeConstraints { make in + make.top.equalTo(self).offset(StandardVerticalMargin * 2) + make.bottom.equalTo(self).inset(StandardVerticalMargin * 2) + make.leading.equalTo(self).offset(StandardHorizontalMargin) + make.trailing.equalTo(self).inset(StandardHorizontalMargin) } - findCoursesButton.oex_addAction({[weak self] _ in - self?.findCoursesAction?() - }, for: .touchUpInside) + imageView.snp.remakeConstraints { make in + make.top.equalTo(container) + make.leading.equalTo(container) + make.bottom.equalTo(container) + make.width.equalTo(frame.size.width / 2) + } - setAccessibilityIdentifiers() - } + bottomContainer.snp.remakeConstraints { make in + make.top.equalTo(container).offset(-StandardVerticalMargin * 2) + make.leading.equalTo(imageView.snp.trailing) + make.trailing.equalTo(container) + make.bottom.equalTo(container) + } - private func setAccessibilityIdentifiers() { - accessibilityIdentifier = "EnrolledCoursesFooterView:view" - promptLabel.accessibilityIdentifier = "EnrolledCoursesFooterView:prompt-label" - findCoursesButton.accessibilityIdentifier = "EnrolledCoursesFooterView:find-courses-button" - container.accessibilityIdentifier = "EnrolledCoursesFooterView:container-view" + promptLabel.snp.remakeConstraints { make in + make.top.equalTo(bottomContainer).offset(StandardVerticalMargin * 2) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2) + make.bottom.equalTo(findCoursesButton.snp.top) + } + + findCoursesButton.snp.remakeConstraints { make in + make.bottom.equalTo(bottomContainer).inset(StandardVerticalMargin * 4) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2) + make.height.equalTo(StandardVerticalMargin * 5.5) + } } required init?(coder aDecoder: NSCoder) { diff --git a/Source/EnrolledCoursesViewController+CourseUpgrade.swift b/Source/EnrolledCoursesViewController+CourseUpgrade.swift index d643ad1367..0729c374ac 100644 --- a/Source/EnrolledCoursesViewController+CourseUpgrade.swift +++ b/Source/EnrolledCoursesViewController+CourseUpgrade.swift @@ -18,17 +18,29 @@ extension EnrolledCoursesViewController { func navigateToScreenAterCourseUpgrade() { guard let courseUpgradeModel = courseUpgradeHelper.courseUpgradeModel - else { return } - + else { return } + if courseUpgradeModel.screen == .courseDashboard || courseUpgradeModel.screen == .courseComponent { - navigationController?.popToViewController(of: EnrolledCoursesViewController.self, animated: true) { [weak self] in - guard let weakSelf = self else { return } - weakSelf.environment.router?.showCourseWithID(courseID: courseUpgradeModel.courseID, fromController: weakSelf, animated: true) + dismiss() { [weak self] _ in + self?.navigationController?.popToViewController(of: LearnContainerViewController.self, animated: true) { [weak self] in + guard let weakSelf = self else { return } + weakSelf.environment.router?.showCourseWithID(courseID: courseUpgradeModel.courseID, fromController: weakSelf, animated: true) + } } } else { courseUpgradeHelper.removeLoader() } } + + private func dismiss(completion: @escaping (Bool) -> Void) { + if let rootController = UIApplication.shared.window?.rootViewController, rootController.presentedViewController != nil { + rootController.dismiss(animated: false) { + completion(true) + } + } else { + completion(true) + } + } func resolveUnfinishedPaymentIfRequired() { guard var skus = courseUpgradeHelper.savedUnfinishedIAPSKUsForCurrentUser(), diff --git a/Source/EnrolledCoursesViewController.swift b/Source/EnrolledCoursesViewController.swift index aa14fe8579..d1f7c95ffd 100644 --- a/Source/EnrolledCoursesViewController.swift +++ b/Source/EnrolledCoursesViewController.swift @@ -10,16 +10,22 @@ import Foundation var isActionTakenOnUpgradeSnackBar: Bool = false -class EnrolledCoursesViewController : OfflineSupportViewController, CoursesContainerViewControllerDelegate, InterfaceOrientationOverriding { +class EnrolledCoursesViewController : OfflineSupportViewController, InterfaceOrientationOverriding, ScrollableDelegateProvider { typealias Environment = OEXAnalyticsProvider & OEXConfigProvider & DataManagerProvider & NetworkManagerProvider & ReachabilityProvider & OEXRouterProvider & OEXStylesProvider & OEXInterfaceProvider & ServerConfigProvider & OEXSessionProvider - let environment : Environment - private let coursesContainer : CoursesContainerViewController + weak var scrollableDelegate: ScrollableDelegate? { + didSet { + coursesContainer.scrollableDelegate = scrollableDelegate + } + } + + let environment: Environment + private let coursesContainer: CoursesContainerViewController private let loadController = LoadStateViewController() private let refreshController = PullRefreshController() private let insetsController = ContentInsetsController() - fileprivate let enrollmentFeed: Feed<[UserCourseEnrollment]?> + private let enrollmentFeed: Feed<[UserCourseEnrollment]?> private let userPreferencesFeed: Feed var handleBannerOnStart: Bool = false // this will be used to send first call for the banners lazy var courseUpgradeHelper = CourseUpgradeHelper.shared @@ -72,7 +78,6 @@ class EnrolledCoursesViewController : OfflineSupportViewController, CoursesConta setupListener() setupObservers() - addMenuButton() } override func viewWillAppear(_ animated: Bool) { @@ -94,18 +99,6 @@ class EnrolledCoursesViewController : OfflineSupportViewController, CoursesConta } } - - private func addMenuButton() { - let menuButton = UIBarButtonItem(image: Icon.Menu.imageWithFontSize(size: 22), style: .plain, target: nil, action: nil) - menuButton.accessibilityLabel = Strings.accessibilityProfile - menuButton.accessibilityIdentifier = "EnrolledTabBarViewController:menu-button" - menuButton.accessibilityHint = Strings.Accessibility.profileMenuHint - navigationItem.rightBarButtonItem = menuButton - - menuButton.oex_setAction { [weak self] in - self?.environment.router?.showProfile(controller: self) - } - } override func reloadViewData() { refreshIfNecessary() @@ -151,15 +144,15 @@ class EnrolledCoursesViewController : OfflineSupportViewController, CoursesConta switch result { case let .success(enrollments): if let enrollments = enrollments { + self?.coursesContainer.removeErrorView() self?.coursesContainer.courses = enrollments.compactMap { $0.course } self?.coursesContainer.collectionView.reloadData() self?.loadController.state = .Loaded + self?.handleUpgradationLoader(success: true) if enrollments.isEmpty { self?.enrollmentsEmptyState() } - - self?.handleUpgradationLoader(success: true) } else { self?.loadController.state = .Initial @@ -173,9 +166,10 @@ class EnrolledCoursesViewController : OfflineSupportViewController, CoursesConta return } - self?.loadController.state = LoadState.failed(error: error) if error.errorIsThisType(NSError.oex_outdatedVersionError()) { - self?.hideSnackBar() + self?.showOutdatedVersionError() + } else { + self?.showGeneralError() } self?.handleUpgradationLoader(success: false) @@ -183,6 +177,18 @@ class EnrolledCoursesViewController : OfflineSupportViewController, CoursesConta } } + private func showGeneralError() { + loadController.state = .Loaded + coursesContainer.showError() + } + + private func showOutdatedVersionError() { + loadController.state = .Loaded + coursesContainer.showOutdatedVersionError() + hideSnackBar() + } + + // set empty state when course discovery is disabled private func enrollmentsEmptyState() { if !isDiscoveryEnabled { let error = NSError.oex_error(with: .unknown, message: Strings.EnrollmentList.noEnrollment) @@ -247,11 +253,28 @@ class EnrolledCoursesViewController : OfflineSupportViewController, CoursesConta } } + private func showWhatsNewIfNeeded() { + if WhatsNewViewController.canShowWhatsNew(environment: environment as? RouterEnvironment) { + environment.router?.showWhatsNew(fromController: self) + } + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + coursesContainer.collectionView.collectionViewLayout.invalidateLayout() + } + + deinit { + NotificationCenter.default.removeObserver(self) + } +} + +extension EnrolledCoursesViewController: CoursesContainerViewControllerDelegate { func coursesContainerChoseCourse(course: OEXCourse) { if let course_id = course.course_id { environment.router?.showCourseWithID(courseID: course_id, fromController: self, animated: true) - } - else { + } else { preconditionFailure("course without a course id") } } @@ -263,21 +286,13 @@ class EnrolledCoursesViewController : OfflineSupportViewController, CoursesConta } } - private func showWhatsNewIfNeeded() { - if WhatsNewViewController.canShowWhatsNew(environment: environment as? RouterEnvironment) { - environment.router?.showWhatsNew(fromController: self) + func reload() { + if environment.reachability.isReachable() { + loadController.state = .Initial + enrollmentFeed.refresh() + userPreferencesFeed.refresh() } } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - - coursesContainer.collectionView.collectionViewLayout.invalidateLayout() - } - - deinit { - NotificationCenter.default.removeObserver(self) - } } //MARK:- PullRefreshControllerDelegate method diff --git a/Source/EnrolledTabBarViewController.swift b/Source/EnrolledTabBarViewController.swift index 9a0fea82e7..f69ed16bc0 100644 --- a/Source/EnrolledTabBarViewController.swift +++ b/Source/EnrolledTabBarViewController.swift @@ -9,15 +9,15 @@ import UIKit private enum TabBarOptions: Int { - case Course, Program, CourseCatalog, Debug - static let options = [Course, Program, CourseCatalog, Debug] + case Course, Profile, CourseCatalog, Debug + static let options = [CourseCatalog, Course, Profile, Debug] func title(config: OEXConfig? = nil) -> String { switch self { case .Course: - return Strings.courses - case .Program: - return Strings.programs + return Strings.learn + case .Profile: + return Strings.UserAccount.profile case .CourseCatalog: return config?.discovery.type == .native ? Strings.findCourses : Strings.discover case .Debug: @@ -26,12 +26,12 @@ private enum TabBarOptions: Int { } } -class EnrolledTabBarViewController: UITabBarController, UITabBarControllerDelegate, InterfaceOrientationOverriding, ChromeCastConnectedButtonDelegate { +class EnrolledTabBarViewController: UITabBarController, InterfaceOrientationOverriding, ChromeCastConnectedButtonDelegate { typealias Environment = OEXAnalyticsProvider & OEXConfigProvider & DataManagerProvider & NetworkManagerProvider & OEXRouterProvider & OEXInterfaceProvider & ReachabilityProvider & OEXSessionProvider & OEXStylesProvider & ServerConfigProvider - fileprivate let environment: Environment - private var tabBarItems : [TabBarItem] = [] + private let environment: Environment + private var tabBarItems: [TabBarItem] = [] // add the additional resources options like 'debug'(special developer option) in additionalTabBarItems private var additionalTabBarItems : [TabBarItem] = [] @@ -40,7 +40,7 @@ class EnrolledTabBarViewController: UITabBarController, UITabBarControllerDelega static var courseCatalogIndex: Int = 0 private var screenTitle: String { - guard let option = TabBarOptions.options.first else {return Strings.courses} + guard let option = TabBarOptions.options.first else { return Strings.courses } return option.title(config: environment.config) } @@ -61,8 +61,10 @@ class EnrolledTabBarViewController: UITabBarController, UITabBarControllerDelega delegate = self view.accessibilityIdentifier = "EnrolledTabBarViewController:view" - selectedIndex = 0 + selectedIndex = 1 title = "" + + addTabbarIndicator() } override func didReceiveMemoryWarning() { @@ -84,23 +86,17 @@ class EnrolledTabBarViewController: UITabBarController, UITabBarControllerDelega for option in TabBarOptions.options { switch option { case .Course: - item = TabBarItem(title: option.title(), viewController: ForwardingNavigationController(rootViewController: EnrolledCoursesViewController(environment: environment)), icon: Icon.CoursewareEnrolled, detailText: Strings.Dashboard.courseCourseDetail) + item = TabBarItem(title: option.title(), viewController: ForwardingNavigationController(rootViewController: LearnContainerViewController(environment: environment)), icon: Icon.CoursewareEnrolled, detailText: Strings.Dashboard.courseCourseDetail) tabBarItems.append(item) - - case .Program: - guard environment.config.programConfig.enabled, - let programsURL = environment.config.programConfig.programURL else { break} - - item = TabBarItem(title: option.title(), viewController: ForwardingNavigationController(rootViewController: ProgramsViewController(environment: environment, programsURL: programsURL)), icon: Icon.CoursewareEnrolled, detailText: Strings.Dashboard.courseCourseDetail) + case .Profile: + item = TabBarItem(title: option.title(), viewController: ForwardingNavigationController(rootViewController: ProfileOptionsViewController.init(environment: environment)), icon: Icon.Person, detailText: Strings.Dashboard.courseCourseDetail) tabBarItems.append(item) - case .CourseCatalog: guard let router = environment.router, let discoveryController = router.discoveryViewController() else { break } item = TabBarItem(title: option.title(config: environment.config), viewController: ForwardingNavigationController(rootViewController: discoveryController), icon: Icon.Discovery, detailText: Strings.Dashboard.courseCourseDetail) tabBarItems.append(item) - EnrolledTabBarViewController.courseCatalogIndex = 2 - + EnrolledTabBarViewController.courseCatalogIndex = 0 case .Debug: if environment.config.shouldShowDebug() { item = TabBarItem(title: option.title(), viewController: ForwardingNavigationController(rootViewController: DebugMenuViewController(environment: environment)), icon: Icon.Discovery, detailText: Strings.Dashboard.courseCourseDetail) @@ -114,7 +110,7 @@ class EnrolledTabBarViewController: UITabBarController, UITabBarControllerDelega AdditionalTabBarViewController(environment: environment, cellItems: additionalTabBarItems), icon: Icon.MoreOptionsIcon, detailText: "") tabBarItems.append(item) } - + loadTabBarViewControllers(tabBarItems: tabBarItems) } @@ -141,10 +137,12 @@ class EnrolledTabBarViewController: UITabBarController, UITabBarControllerDelega controller = tabBarViewController(ProfileOptionsViewController.self) break case .program, .programDetail: - selectedIndex = tabBarViewControllerIndex(with: ProgramsViewController.self) + selectedIndex = tabBarViewControllerIndex(with: LearnContainerViewController.self) + controller = tabBarViewController(LearnContainerViewController.self) break - case .courseDashboard, .courseDates, .courseVideos, .courseHandout, .courseComponent: - selectedIndex = tabBarViewControllerIndex(with: EnrolledCoursesViewController.self) + case .courseDashboard, .courseDates, .courseVideos, .courseHandout, .courseComponent, .courseAnnouncement, .discussions, .discussionPost, .discussionTopic, .discussionComment: + selectedIndex = tabBarViewControllerIndex(with: LearnContainerViewController.self) + controller = tabBarViewController(LearnContainerViewController.self) break case .discovery, .discoveryCourseDetail, .discoveryProgramDetail: if environment.config.discovery.isEnabled { @@ -166,8 +164,27 @@ class EnrolledTabBarViewController: UITabBarController, UITabBarControllerDelega } } -extension EnrolledTabBarViewController { - func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController){ +extension EnrolledTabBarViewController: UITabBarControllerDelegate { + func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { navigationItem.title = viewController.navigationItem.title } } + +extension UITabBarController { + func addTabbarIndicator(color: UIColor = OEXStyles.shared().primaryDarkColor(), lineHeight: CGFloat = 2) { + guard let count = tabBar.items?.count else { return } + let tabBarItemSize = CGSize(width: tabBar.frame.width / CGFloat(count), height: tabBar.frame.height) + let indicator = createTabbarIndicator(color: color, size: tabBarItemSize, lineHeight: lineHeight) + tabBar.selectionIndicatorImage = indicator + } + + private func createTabbarIndicator(color: UIColor, size: CGSize, lineHeight: CGFloat) -> UIImage { + let rect = CGRect(x: 0, y: size.height - lineHeight, width: size.width, height: lineHeight ) + UIGraphicsBeginImageContextWithOptions(size, false, 0) + color.setFill() + UIRectFill(rect) + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return image ?? UIImage() + } +} diff --git a/Source/GeneralErrorView.swift b/Source/GeneralErrorView.swift new file mode 100644 index 0000000000..6b1c84589d --- /dev/null +++ b/Source/GeneralErrorView.swift @@ -0,0 +1,195 @@ +// +// GeneralErrorView.swift +// edX +// +// Created by MuhammadUmer on 05/01/2023. +// Copyright © 2023 edX. All rights reserved. +// + +import Foundation + +class GeneralErrorView: UIView { + + var tapAction: (() -> ())? + + init() { + super.init(frame: .zero) + + addSubViews() + setAccessibilityIdentifiers() + setConstraints() + } + + private let containerView = UIView() + private let bottomContainer = UIView() + + private lazy var errorLabelstyle: OEXMutableTextStyle = { + let style = OEXMutableTextStyle(weight: .bold, size: .xxLarge, color: OEXStyles.shared().neutralBlackT()) + style.alignment = .center + return style + }() + + private lazy var errorLabel: UILabel = { + let label = UILabel() + label.accessibilityIdentifier = "GeneralErrorView:error-label" + label.numberOfLines = 0 + label.attributedText = errorLabelstyle.attributedString(withText: Strings.Dashboard.generalErrorMessage) + return label + }() + + private lazy var errorImageView: UIImageView = { + guard let image = UIImage(named: "dashboard_error_image") else { return UIImageView() } + let imageView = UIImageView(image: image) + imageView.accessibilityIdentifier = "GeneralErrorView:error-imageView" + return imageView + }() + + private let buttonTitleStyle = OEXTextStyle(weight: .normal, size: .xLarge, color: OEXStyles.shared().neutralWhite()) + + private lazy var errorActionButton: UIButton = { + let button = UIButton(type: .system) + button.accessibilityIdentifier = "GeneralErrorView:error-action-button" + button.backgroundColor = OEXStyles.shared().secondaryBaseColor() + button.oex_addAction({ [weak self] _ in + self?.tapAction?() + }, for: .touchUpInside) + + button.setAttributedTitle(buttonTitleStyle.attributedString(withText: Strings.Dashboard.tryAgain), for: UIControl.State()) + + return button + }() + + override func layoutSubviews() { + super.layoutSubviews() + containerView.addShadow(offset: CGSize(width: 0, height: 2), color: OEXStyles.shared().primaryDarkColor(), radius: 2, opacity: 0.35, cornerRadius: 6) + setConstraints() + } + + private func setConstraints() { + if traitCollection.verticalSizeClass == .regular { + addPortraitConstraints() + } else { + addLandscapeConstraints() + } + } + + private func addSubViews() { + backgroundColor = OEXStyles.shared().neutralWhiteT() + + addSubview(containerView) + + containerView.addSubview(errorImageView) + containerView.addSubview(bottomContainer) + bottomContainer.addSubview(errorLabel) + bottomContainer.addSubview(errorActionButton) + + containerView.backgroundColor = OEXStyles.shared().neutralWhiteT() + } + + private func setAccessibilityIdentifiers() { + accessibilityIdentifier = "GeneralErrorView:view" + containerView.accessibilityIdentifier = "GeneralErrorView:container-view" + bottomContainer.accessibilityIdentifier = "GeneralErrorView:bottom-container-view" + } + + private func addPortraitConstraints() { + containerView.snp.remakeConstraints { make in + make.top.equalTo(self).offset(StandardVerticalMargin * 2) + make.leading.equalTo(self).offset(StandardHorizontalMargin) + make.trailing.equalTo(self).inset(StandardHorizontalMargin) + make.bottom.equalTo(self).inset(StandardVerticalMargin * 2) + } + + errorImageView.snp.remakeConstraints { make in + make.top.equalTo(containerView) + make.leading.equalTo(containerView) + make.trailing.equalTo(containerView) + make.height.equalTo(StandardVerticalMargin * 33) + } + + bottomContainer.snp.remakeConstraints { make in + make.top.equalTo(errorImageView.snp.bottom) + make.leading.equalTo(containerView) + make.trailing.equalTo(containerView) + make.bottom.equalTo(containerView) + } + + errorLabel.snp.remakeConstraints { make in + make.top.equalTo(bottomContainer).offset(StandardVerticalMargin * 2) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2.2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2.2) + } + + errorActionButton.snp.remakeConstraints { make in + make.top.equalTo(errorLabel.snp.bottom).offset(StandardVerticalMargin * 2) + make.height.equalTo(StandardVerticalMargin * 5.5) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2) + make.bottom.equalTo(bottomContainer).inset(StandardVerticalMargin * 2) + } + } + + private func addLandscapeConstraints() { + containerView.snp.remakeConstraints { make in + make.top.equalTo(self).offset(StandardVerticalMargin * 2) + make.bottom.equalTo(self).inset(StandardVerticalMargin * 2) + make.leading.equalTo(self).offset(StandardHorizontalMargin) + make.trailing.equalTo(self).inset(StandardHorizontalMargin) + } + + errorImageView.snp.remakeConstraints { make in + make.top.equalTo(containerView) + make.leading.equalTo(containerView) + make.height.equalTo(StandardVerticalMargin * 33) + make.width.equalTo(frame.width / 2) + make.bottom.equalTo(containerView) + } + + bottomContainer.snp.remakeConstraints { make in + make.top.equalTo(containerView).offset(-StandardVerticalMargin * 2) + make.leading.equalTo(errorImageView.snp.trailing) + make.trailing.equalTo(containerView) + make.bottom.equalTo(containerView) + } + + errorLabel.snp.remakeConstraints { make in + make.top.equalTo(bottomContainer).offset(StandardVerticalMargin * 2) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2) + make.bottom.equalTo(errorActionButton.snp.top) + } + + errorActionButton.snp.remakeConstraints { make in + make.bottom.equalTo(bottomContainer).inset(StandardVerticalMargin * 4) + make.leading.equalTo(bottomContainer).offset(StandardHorizontalMargin * 2) + make.trailing.equalTo(bottomContainer).inset(StandardHorizontalMargin * 2) + make.height.equalTo(StandardVerticalMargin * 5.5) + } + } + + func setErrorMessage(message: String? = nil, imageName: String? = nil, buttonTitle: String? = nil) { + errorLabel.attributedText = errorLabelstyle.attributedString(withText: message ?? Strings.Dashboard.generalErrorMessage) + + if let image = UIImage(named: imageName ?? "") { + errorImageView.image = image + } + + if let buttonTitle = buttonTitle { + errorActionButton.setAttributedTitle(buttonTitleStyle.attributedString(withText: buttonTitle), for: UIControl.State()) + } + } + + func showOutdatedVersionError() { + errorLabel.attributedText = errorLabelstyle.attributedString(withText: Strings.VersionUpgrade.outDatedMessage) + + if let image = UIImage(named: "app_update_image") { + errorImageView.image = image + } + + errorActionButton.setAttributedTitle(buttonTitleStyle.attributedString(withText: Strings.Coursedates.calendarShiftPromptUpdateNow), for: UIControl.State()) + } + + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Source/HTMLBlockViewController.swift b/Source/HTMLBlockViewController.swift index 3d0c411dcc..d379416d53 100644 --- a/Source/HTMLBlockViewController.swift +++ b/Source/HTMLBlockViewController.swift @@ -8,7 +8,7 @@ import UIKit -class HTMLBlockViewController: UIViewController, CourseBlockViewController, PreloadableBlockController { +class HTMLBlockViewController: UIViewController, CourseBlockViewController, PreloadableBlockController, ScrollableDelegateProvider { public typealias Environment = OEXAnalyticsProvider & OEXConfigProvider & DataManagerProvider & OEXSessionProvider & ReachabilityProvider & NetworkManagerProvider & OEXRouterProvider & OEXInterfaceProvider @@ -22,7 +22,7 @@ class HTMLBlockViewController: UIViewController, CourseBlockViewController, Prel private let environment: Environment private let subkind: CourseHTMLBlockSubkind - private lazy var courseDateBannerView = CourseDateBannerView(frame: .zero) + private lazy var courseDateBannerViewContainer = UIView() private let webController: AuthenticatedWebViewController private let loader = BackedStream() @@ -31,6 +31,9 @@ class HTMLBlockViewController: UIViewController, CourseBlockViewController, Prel private lazy var openInBrowserView = OpenInExternalBrowserView(frame: .zero) + weak var scrollableDelegate: ScrollableDelegate? + private var scrollByDragging = false + public init(blockID: CourseBlockID?, courseID: String, environment: Environment, subkind: CourseHTMLBlockSubkind) { self.courseID = courseID self.blockID = blockID @@ -43,6 +46,7 @@ class HTMLBlockViewController: UIViewController, CourseBlockViewController, Prel webController.delegate = self webController.ajaxCallbackDelegate = self + webController.scrollView.delegate = self addObserver() setupViews() @@ -61,8 +65,8 @@ class HTMLBlockViewController: UIViewController, CourseBlockViewController, Prel } private func setupViews() { - view.addSubview(courseDateBannerView) - courseDateBannerView.snp.makeConstraints { make in + view.addSubview(courseDateBannerViewContainer) + courseDateBannerViewContainer.snp.makeConstraints { make in make.trailing.equalTo(view) make.leading.equalTo(view) make.top.equalTo(view) @@ -82,7 +86,7 @@ class HTMLBlockViewController: UIViewController, CourseBlockViewController, Prel webController.view.snp.remakeConstraints { make in make.trailing.equalTo(view) make.leading.equalTo(view) - make.top.equalTo(courseDateBannerView.snp.bottom) + make.top.equalTo(courseDateBannerViewContainer.snp.bottom) make.bottom.equalTo(view) } } @@ -97,7 +101,7 @@ class HTMLBlockViewController: UIViewController, CourseBlockViewController, Prel webController.view.snp.remakeConstraints { make in make.trailing.equalTo(view) make.leading.equalTo(view) - make.top.equalTo(courseDateBannerView.snp.bottom) + make.top.equalTo(courseDateBannerViewContainer.snp.bottom) } openInBrowserView.snp.remakeConstraints { make in @@ -154,16 +158,31 @@ class HTMLBlockViewController: UIViewController, CourseBlockViewController, Prel } else { guard let status = bannerModel.bannerInfo.status else { return } + var courseDateBannerView: BannerView + + if environment.config.isNewComponentNavigationEnabled { + courseDateBannerView = NewCourseDateBannerView() + } else { + courseDateBannerView = CourseDateBannerView() + } + + if let courseDateBannerView = courseDateBannerView as? UIView { + courseDateBannerViewContainer.addSubview(courseDateBannerView) + courseDateBannerView.snp.remakeConstraints { make in + make.edges.equalTo(courseDateBannerViewContainer) + } + } + if status == .resetDatesBanner { courseDateBannerView.delegate = self courseDateBannerView.bannerInfo = bannerModel.bannerInfo courseDateBannerView.setupView() + height = StandardVerticalMargin * 16 trackDateBannerAppearanceEvent(bannerModel: bannerModel) - height = courseDateBannerView.heightForView(width: view.frame.size.width) } } - courseDateBannerView.snp.remakeConstraints { make in + courseDateBannerViewContainer.snp.remakeConstraints { make in make.trailing.equalTo(view) make.leading.equalTo(view) make.top.equalTo(view) @@ -176,7 +195,7 @@ class HTMLBlockViewController: UIViewController, CourseBlockViewController, Prel } private func hideCourseBannerView() { - courseDateBannerView.snp.remakeConstraints { make in + courseDateBannerViewContainer.snp.remakeConstraints { make in make.trailing.equalTo(view) make.leading.equalTo(view) make.top.equalTo(view) @@ -308,3 +327,19 @@ extension HTMLBlockViewController: OpenInExternalBrowserViewDelegate, BrowserVie loadWebviewStream(true) } } + +extension HTMLBlockViewController: UIScrollViewDelegate { + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + scrollByDragging = true + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + if scrollByDragging { + scrollableDelegate?.scrollViewDidScroll(scrollView: scrollView) + } + } + + func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + scrollByDragging = false + } +} diff --git a/Source/Icon.swift b/Source/Icon.swift index 17ac74ff06..450b920f05 100644 --- a/Source/Icon.swift +++ b/Source/Icon.swift @@ -91,6 +91,7 @@ public enum Icon { case Announcements case ArrowUp case ArrowDown + case ArrowForward case Camera case ChevronRight case Close @@ -133,6 +134,7 @@ public enum Icon { case Menu case NoTopics case NoSearchResults + case Search case OpenURL case Pinned case RotateDevice @@ -144,6 +146,7 @@ public enum Icon { case StarEmpty case StarFilled case ShareCourse + case Share case Discovery case Transcript case Trophy @@ -177,6 +180,8 @@ public enum Icon { return MaterialIconRenderer(icon: .arrowUpward) case .ArrowDown: return MaterialIconRenderer(icon: .arrowDownward) + case .ArrowForward: + return MaterialIconRenderer(icon: .arrowForward) case .Account: return MaterialIconRenderer(icon: .moreVert) case .Camera: @@ -250,7 +255,7 @@ public enum Icon { case .Courseware: return MaterialIconRenderer(icon: .classroom) case .CoursewareEnrolled: - return MaterialIconRenderer(icon: .bookmarkBorder) + return MaterialIconRenderer(icon: .menuBook) case .CourseUnknownContent: return MaterialIconRenderer(icon: .laptop) case .CourseVideoContent: @@ -285,6 +290,8 @@ public enum Icon { return MaterialIconRenderer(icon: .star) case .ShareCourse: return MaterialIconRenderer(icon: .shareiOS) + case .Share: + return MaterialIconRenderer(icon: .share) case .Discovery: return MaterialIconRenderer(icon: .search) case .UnknownError: @@ -293,6 +300,8 @@ public enum Icon { return MaterialIconRenderer(icon: .list) case .NoSearchResults: return MaterialIconRenderer(icon: .playCircleOutline) + case .Search: + return MaterialIconRenderer(icon: .search) case .Trophy: return MaterialIconRenderer(icon: .emojiEvents) case .VideoFullscreen: diff --git a/Source/LearnContainerHeaderView.swift b/Source/LearnContainerHeaderView.swift index 3c74a55e98..a5173db6d2 100644 --- a/Source/LearnContainerHeaderView.swift +++ b/Source/LearnContainerHeaderView.swift @@ -17,12 +17,12 @@ protocol LearnContainerHeaderItem { } class LearnContainerHeaderView: UIView { - static let height = StandardVerticalMargin * 6.5 + static let expandedHeight = StandardVerticalMargin * 10.6 + static let collapsedHeight = StandardVerticalMargin * 5.5 weak var delegate: LearnContainerHeaderViewDelegate? - private let container = UIView() - private let dropDownContainer = UIView() + var headerViewState: HeaderViewState = .expanded private lazy var button: UIButton = { let button = UIButton() @@ -53,16 +53,17 @@ class LearnContainerHeaderView: UIView { return imageView }() - private var originalFrame: CGRect = .zero - + private let container = UIView() + private let dropDownContainer = UIView() private let dropDown = DropDown() + private let dropDownBottomOffset: CGFloat = StandardVerticalMargin * 2 + + private var items: [LearnContainerHeaderItem] private var shouldShowDropDown: Bool { return items.count > 1 } - private var items: [LearnContainerHeaderItem] - required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -84,40 +85,37 @@ class LearnContainerHeaderView: UIView { addSubview(dropDownContainer) addSubview(container) - container.snp.makeConstraints { make in + container.snp.remakeConstraints { make in make.top.equalTo(self).offset(-6) make.bottom.equalTo(self) make.leading.equalTo(self) make.trailing.equalTo(self) + make.height.equalTo(LearnContainerHeaderView.expandedHeight) } - dropDownContainer.snp.makeConstraints { make in - make.top.equalTo(self) - make.bottom.equalTo(self) + dropDownContainer.snp.remakeConstraints { make in + make.centerY.equalTo(label) make.leading.equalTo(self).offset(StandardHorizontalMargin) make.trailing.equalTo(self).inset(StandardHorizontalMargin) } - button.snp.makeConstraints { make in - make.top.equalTo(container) - make.bottom.equalTo(container) + button.snp.remakeConstraints { make in + make.centerY.equalTo(label) make.leading.equalTo(label) make.trailing.equalTo(imageView) } - label.snp.makeConstraints { make in - make.top.equalTo(container) - make.bottom.equalTo(container) + label.snp.remakeConstraints { make in + make.bottom.equalTo(container).inset(StandardVerticalMargin) make.leading.equalTo(container).offset(StandardHorizontalMargin) } - imageView.snp.makeConstraints { make in + imageView.snp.remakeConstraints { make in make.leading.equalTo(label.snp.trailing).offset(StandardHorizontalMargin / 2) make.centerY.equalTo(label) } imageView.isHidden = !shouldShowDropDown - originalFrame = container.frame } private func setupDropDown() { @@ -126,16 +124,16 @@ class LearnContainerHeaderView: UIView { let selectedTextStyle = OEXMutableTextStyle(weight: .bold, size: .base, color: OEXStyles.shared().primaryBaseColor()) selectedTextStyle.alignment = .center - + dropDown.setup() dropDown.accessibilityIdentifier = "LearnContainerHeaderView:drop-down-view" - dropDown.bottomOffset = CGPoint(x: 0, y: LearnContainerHeaderView.height) + dropDown.bottomOffset = CGPoint(x: 0, y: dropDownBottomOffset) dropDown.direction = .bottom dropDown.anchorView = dropDownContainer dropDown.dismissMode = .automatic dropDown.normalTextStyle = normalTextStyle dropDown.selectedTextStyle = selectedTextStyle - dropDown.selectedBackgroundColor = OEXStyles.shared().neutralXLight() - dropDown.normalBackgroundColor = OEXStyles.shared().neutralWhiteT() + dropDown.selectionBackgroundColor = OEXStyles.shared().neutralXLight() + dropDown.backgroundColor = OEXStyles.shared().neutralWhiteT() dropDown.textColor = OEXStyles.shared().primaryBaseColor() dropDown.selectedTextColor = OEXStyles.shared().primaryBaseColor() dropDown.dataSource = items.map { $0.title } @@ -143,7 +141,7 @@ class LearnContainerHeaderView: UIView { dropDown.selectionAction = { [weak self] index, _ in guard let weakSelf = self else { return } weakSelf.dropDown.selectedRowIndex = index - weakSelf.label.attributedText = weakSelf.largeTextStyle.attributedString(withText: weakSelf.items[index].title) + weakSelf.updateHeaderLabel() weakSelf.delegate?.didTapOnDropDown(item: weakSelf.items[index]) } dropDown.willShowAction = { [weak self] in @@ -154,6 +152,15 @@ class LearnContainerHeaderView: UIView { } } + private func updateHeaderLabel() { + let index = dropDown.indexForSelectedRow ?? 0 + if headerViewState == .collapsed { + label.attributedText = smallTextStyle.attributedString(withText: items[index].title) + } else if headerViewState == .expanded { + label.attributedText = largeTextStyle.attributedString(withText: items[index].title) + } + } + func changeHeader(for index: Int) { dropDown.selectedRowIndex = index label.attributedText = smallTextStyle.attributedString(withText: items[index].title) @@ -163,27 +170,9 @@ class LearnContainerHeaderView: UIView { dropDown.forceHide() } - func moveToCenter() { - dropDown.bottomOffset = CGPoint(x: 0, y: 44) - container.frame = CGRect(x: 0, y: 0, width: 180, height: 44) - container.center.x = frame.size.width / 2 - - if let index = dropDown.indexForSelectedRow { - label.attributedText = smallTextStyle.attributedString(withText: items[index].title) - } else { - label.attributedText = smallTextStyle.attributedString(withText: items[0].title) - } - } - - func moveBackOriginalFrame() { - container.frame = originalFrame - dropDown.bottomOffset = CGPoint(x: 0, y: 80) - - if let index = dropDown.indexForSelectedRow { - label.attributedText = largeTextStyle.attributedString(withText: items[index].title) - } else { - label.attributedText = largeTextStyle.attributedString(withText: items[0].title) - } + func updateHeaderViewState(collapse: Bool) { + headerViewState = collapse ? .collapsed : .expanded + updateHeaderLabel() } private func rotateImageView(clockWise: Bool) { diff --git a/Source/LearnContainerViewController.swift b/Source/LearnContainerViewController.swift index 656941bc7e..b0283bee6b 100644 --- a/Source/LearnContainerViewController.swift +++ b/Source/LearnContainerViewController.swift @@ -31,6 +31,8 @@ class LearnContainerViewController: UIViewController { private let environment: Environment + private var headerViewState: HeaderViewState = .expanded + private lazy var components: [Component] = { var items: [Component] = [] items.append(.courses) @@ -40,11 +42,23 @@ class LearnContainerViewController: UIViewController { return items }() + private let container = UIView() private lazy var headerView = LearnContainerHeaderView(items: components) - private let container = UIView() - private let coursesViewController: EnrolledCoursesViewController - private var programsViewController: ProgramsViewController? + private lazy var coursesViewController: EnrolledCoursesViewController = { + let controller = EnrolledCoursesViewController(environment: environment) + controller.scrollableDelegate = self + return controller + }() + + private lazy var programsViewController: ProgramsViewController? = { + if programsEnabled, let programsURL = environment.config.programConfig.programURL { + let controller = ProgramsViewController(environment: environment, programsURL: programsURL) + controller.scrollableDelegate = self + return controller + } + return nil + }() private var selectedComponent: Component? @@ -56,11 +70,6 @@ class LearnContainerViewController: UIViewController { init(environment: Environment) { self.environment = environment - self.coursesViewController = EnrolledCoursesViewController(environment: environment) - if environment.config.programConfig.enabled, - let programsURL = environment.config.programConfig.programURL { - self.programsViewController = ProgramsViewController(environment: environment, programsURL: programsURL) - } super.init(nibName: nil, bundle: nil) setupViews() } @@ -78,9 +87,15 @@ class LearnContainerViewController: UIViewController { update(component: .courses) } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + navigationItem.setHidesBackButton(true, animated: false) + navigationController?.setNavigationBarHidden(true, animated: true) + } + override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) - headerView.dimissDropDown() } @@ -93,18 +108,18 @@ class LearnContainerViewController: UIViewController { view.addSubview(headerView) view.addSubview(container) - headerView.snp.makeConstraints { make in - make.top.equalTo(view) + headerView.snp.remakeConstraints { make in + make.top.equalTo(safeTop) make.leading.equalTo(safeLeading) make.trailing.equalTo(safeTrailing) - make.height.equalTo(LearnContainerHeaderView.height) + make.height.lessThanOrEqualTo(LearnContainerHeaderView.expandedHeight) } container.snp.makeConstraints { make in make.top.equalTo(headerView.snp.bottom) - make.bottom.equalTo(view) - make.leading.equalTo(view) - make.trailing.equalTo(view) + make.bottom.equalTo(safeBottom) + make.leading.equalTo(safeLeading) + make.trailing.equalTo(safeTrailing) } } @@ -189,6 +204,52 @@ extension LearnContainerViewController: LearnContainerHeaderViewDelegate { } } +extension LearnContainerViewController: ScrollableDelegate { + func scrollViewDidScroll(scrollView: UIScrollView) { + if scrollView.contentOffset.y <= 0 { + if headerViewState == .collapsed { + headerViewState = .animating + expandHeaderView() + } + } else if headerViewState == .expanded { + headerViewState = .animating + collapseHeaderView() + } + } + + private func expandHeaderView() { + headerView.snp.remakeConstraints { make in + make.top.equalTo(safeTop) + make.leading.equalTo(safeLeading) + make.trailing.equalTo(safeTrailing) + make.height.lessThanOrEqualTo(LearnContainerHeaderView.expandedHeight) + } + + UIView.animate(withDuration: 0.2) { [weak self] in + self?.headerView.updateHeaderViewState(collapse: false) + self?.view.layoutIfNeeded() + } completion: { [weak self] _ in + self?.headerViewState = .expanded + } + } + + private func collapseHeaderView() { + headerView.snp.remakeConstraints { make in + make.top.equalTo(safeTop) + make.leading.equalTo(safeLeading) + make.trailing.equalTo(safeTrailing) + make.height.lessThanOrEqualTo(LearnContainerHeaderView.collapsedHeight) + } + + UIView.animate(withDuration: 0.2) { [weak self] in + self?.headerView.updateHeaderViewState(collapse: true) + self?.view.layoutIfNeeded() + } completion: { [weak self] _ in + self?.headerViewState = .collapsed + } + } +} + extension LearnContainerViewController { func t_switchTo(component: Component) { if component == .programs { diff --git a/Source/NSError+OEXKnownErrors.h b/Source/NSError+OEXKnownErrors.h index 436801fbd9..ff7f81a514 100644 --- a/Source/NSError+OEXKnownErrors.h +++ b/Source/NSError+OEXKnownErrors.h @@ -43,6 +43,7 @@ typedef NS_ENUM(NSUInteger, OEXErrorCode) { - (id)initWithCoursewareAccess:(OEXCoursewareAccess*)access displayInfo:(nullable OEXCourseStartDisplayInfo*)info; +@property (strong, nonatomic) OEXCoursewareAccess* access; @property (readonly, nonatomic) OEXCoursewareAccessError* error; @end diff --git a/Source/NSError+OEXKnownErrors.m b/Source/NSError+OEXKnownErrors.m index 022ec0d42c..f130e3f278 100644 --- a/Source/NSError+OEXKnownErrors.m +++ b/Source/NSError+OEXKnownErrors.m @@ -41,7 +41,6 @@ + (NSError*)oex_unknownError { @interface OEXCoursewareAccessError () -@property (strong, nonatomic) OEXCoursewareAccess* access; @property (strong, nonatomic) OEXCourseStartDisplayInfo* displayInfo; @end diff --git a/Source/NetworkManager+Authenticators.swift b/Source/NetworkManager+Authenticators.swift index 1a389633a8..30757ded26 100644 --- a/Source/NetworkManager+Authenticators.swift +++ b/Source/NetworkManager+Authenticators.swift @@ -100,7 +100,7 @@ private func refreshAccessToken(router: OEXRouter?, clientId: String, refreshTok } performQueuedTasks(router: router, success: success) - return completion(success) + return completion(result.response, success) } } } diff --git a/Source/NewCourseContentController.swift b/Source/NewCourseContentController.swift new file mode 100644 index 0000000000..c0f6e42308 --- /dev/null +++ b/Source/NewCourseContentController.swift @@ -0,0 +1,328 @@ +// +// NewCourseContentController.swift +// edX +// +// Created by MuhammadUmer on 10/04/2023. +// Copyright © 2023 edX. All rights reserved. +// + +import UIKit + +class NewCourseContentController: UIViewController, InterfaceOrientationOverriding { + + typealias Environment = OEXAnalyticsProvider & DataManagerProvider & OEXRouterProvider & OEXConfigProvider & OEXStylesProvider + + private lazy var containerView: UIView = { + let view = UIView() + view.accessibilityIdentifier = "NewCourseContentController:container-view" + return view + }() + + private lazy var contentView: UIView = { + let view = UIView() + view.accessibilityIdentifier = "NewCourseContentController:content-view" + return view + }() + + private lazy var headerView: CourseContentHeaderView = { + let headerView = CourseContentHeaderView(environment: environment) + headerView.accessibilityIdentifier = "NewCourseContentController:header-view" + headerView.delegate = self + return headerView + }() + + private lazy var progressStackView: UIStackView = { + let stackView = UIStackView() + stackView.axis = .horizontal + stackView.spacing = 1 + stackView.distribution = .fillEqually + stackView.alignment = .fill + stackView.backgroundColor = .clear + stackView.accessibilityIdentifier = "NewCourseContentController:progress-stack-view" + return stackView + }() + + private var courseContentViewController: CourseContentPageViewController? + private var headerViewState: HeaderViewState = .expanded + + private var currentBlock: CourseBlock? { + willSet { + currentBlock?.completion.unsubscribe(observer: self) + } + + didSet { + updateView() + currentBlock?.completion.subscribe(observer: self) { [weak self] _,_ in + self?.updateView() + } + } + } + + private let environment: Environment + private let blockID: CourseBlockID? + private let parentID: CourseBlockID? + private let courseID: CourseBlockID + private let courseQuerier: CourseOutlineQuerier + private let courseOutlineMode: CourseOutlineMode + + init(environment: Environment, blockID: CourseBlockID?, resumeCourseBlockID: CourseBlockID? = nil, parentID: CourseBlockID? = nil, courseID: CourseBlockID, courseOutlineMode: CourseOutlineMode? = .full) { + self.environment = environment + self.blockID = blockID + self.parentID = parentID + self.courseID = courseID + self.courseOutlineMode = courseOutlineMode ?? .full + courseQuerier = environment.dataManager.courseDataManager.querierForCourseWithID(courseID: courseID, environment: environment) + super.init(nibName: nil, bundle: nil) + + if let resumeCourseBlockID = resumeCourseBlockID { + currentBlock = courseQuerier.blockWithID(id: resumeCourseBlockID).firstSuccess().value + } else { + findCourseBlockToShow() + } + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return .lightContent + } + + override var shouldAutorotate: Bool { + return true + } + + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + return .allButUpsideDown + } + + override func viewDidLoad() { + super.viewDidLoad() + + setStatusBar(color: environment.styles.primaryLightColor()) + addSubViews() + setupComponentView() + setupCompletedBlocksView() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + navigationController?.setNavigationBarHidden(true, animated: false) + } + + private func addSubViews() { + view.accessibilityIdentifier = "NewCourseContentController:view" + view.backgroundColor = .white + view.addSubview(contentView) + + contentView.addSubview(headerView) + contentView.addSubview(progressStackView) + contentView.addSubview(containerView) + + contentView.snp.remakeConstraints { make in + make.edges.equalTo(safeEdges) + } + + headerView.snp.remakeConstraints { make in + make.top.equalTo(contentView) + make.leading.equalTo(contentView) + make.trailing.equalTo(contentView) + make.height.equalTo(StandardVerticalMargin * 17).priority(.high) + make.height.lessThanOrEqualTo(StandardVerticalMargin * 17) + } + + progressStackView.snp.remakeConstraints { make in + make.top.equalTo(headerView.snp.bottom) + make.leading.equalTo(contentView) + make.trailing.equalTo(contentView) + make.height.equalTo(StandardVerticalMargin * 0.75) + } + + containerView.snp.makeConstraints { make in + make.leading.equalTo(contentView) + make.trailing.equalTo(contentView) + make.top.equalTo(progressStackView.snp.bottom) + make.bottom.equalTo(contentView) + } + } + + private func setupComponentView() { + guard let currentBlock = currentBlock, + let parent = courseQuerier.parentOfBlockWith(id: currentBlock.blockID).firstSuccess().value + else { return } + + let courseContentViewController = CourseContentPageViewController(environment: environment, courseID: courseID, rootID: parent.blockID, initialChildID: currentBlock.blockID, forMode: courseOutlineMode) + courseContentViewController.navigationDelegate = self + + let childViewController = ForwardingNavigationController(rootViewController: courseContentViewController) + courseContentViewController.navigationController?.setNavigationBarHidden(true, animated: false) + + containerView.addSubview(childViewController.view) + + childViewController.view.snp.makeConstraints { make in + make.edges.equalTo(containerView) + } + + addChild(childViewController) + childViewController.didMove(toParent: self) + + self.courseContentViewController = courseContentViewController + } + + private func setupCompletedBlocksView() { + guard let block = currentBlock, + let section = courseQuerier.parentOfBlockWith(id: block.blockID, type: .Section).firstSuccess().value, + let sectionChildren = courseQuerier.childrenOfBlockWithID(blockID: section.blockID, forMode: courseOutlineMode).value + else { return } + + let childBlocks: [CourseBlock] = sectionChildren.children.compactMap { item in + courseQuerier.childrenOfBlockWithID(blockID: item.blockID, forMode: courseOutlineMode) + .firstSuccess().value?.children ?? [] + }.flatMap { $0 } + + let childViews: [UIView] = childBlocks.map { block -> UIView in + let view = UIView() + view.backgroundColor = block.isCompleted ? environment.styles.accentBColor() : environment.styles.neutralDark() + return view + } + + headerView.setBlocks(currentBlock: block, blocks: childBlocks) + progressStackView.removeAllArrangedSubviews() + progressStackView.addArrangedSubviews(childViews) + } + + private func findCourseBlockToShow() { + guard let childBlocks = courseQuerier.childrenOfBlockWithID(blockID: blockID, forMode: .full) + .firstSuccess().value?.children.compactMap({ $0 }).filter({ $0.type == .Unit }) + else { return } + + let blocks: [CourseBlock] = childBlocks.flatMap { block in + courseQuerier.childrenOfBlockWithID(blockID: block.blockID, forMode: courseOutlineMode).value?.children.compactMap { child in + courseQuerier.blockWithID(id: child.blockID).value + } ?? [] + } + + currentBlock = blocks.first(where: { !$0.isCompleted }) ?? blocks.last + } + + private func updateView() { + guard let block = currentBlock else { return } + updateTitle(block: block) + setupCompletedBlocksView() + } + + private func updateTitle(block: CourseBlock) { + guard let parent = courseQuerier.parentOfBlockWith(id: block.blockID, type: .Section).firstSuccess().value + else { return } + headerView.update(title: parent.displayName, subtitle: block.displayName) + } + + override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) { + coordinator.animate { [weak self] _ in + guard let weakSelf = self else { return } + DispatchQueue.main.async { + weakSelf.setStatusBar(color: weakSelf.environment.styles.primaryLightColor()) + } + } + } +} + +extension NewCourseContentController: CourseContentPageViewControllerDelegate { + func courseContentPageViewController(controller: CourseContentPageViewController, enteredBlockWithID blockID: CourseBlockID, parentID: CourseBlockID) { + guard let block = courseQuerier.blockWithID(id: blockID).firstSuccess().value else { return } + currentBlock = block + if var controller = controller.viewControllers?.first as? ScrollableDelegateProvider { + controller.scrollableDelegate = self + } + + // header animation is overlapping with UIPageController animation which results in crash + // calling the header animation after a delay of 1 sec to overcome the issue + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in + self?.updateHeaderState(with: controller) + } + } + + private func updateHeaderState(with controller: CourseContentPageViewController) { + if let _ = controller.viewControllers?.first as? VideoBlockViewController { + if currentOrientation() != .portrait { + collapseHeaderView() + } else if headerViewState == .collapsed { + collapseHeaderView() + } else if headerViewState == .expanded { + expandHeaderView() + } + } + } +} + +extension NewCourseContentController: CourseContentHeaderViewDelegate { + func didTapBackButton() { + navigationController?.popViewController(animated: true) + } + + func didTapOnUnitBlock(block: CourseBlock) { + courseContentViewController?.moveToBlock(block: block) + } +} + +extension NewCourseContentController: ScrollableDelegate { + func scrollViewDidScroll(scrollView: UIScrollView) { + guard headerViewState != .animating else { return } + + if scrollView.contentOffset.y <= 0 { + if headerViewState == .collapsed { + headerViewState = .animating + expandHeaderView() + } + } else if headerViewState == .expanded { + headerViewState = .animating + collapseHeaderView() + } + } +} + +extension NewCourseContentController { + private func expandHeaderView() { + headerView.snp.remakeConstraints { make in + make.top.equalTo(contentView) + make.leading.equalTo(contentView) + make.trailing.equalTo(contentView) + make.height.equalTo(StandardVerticalMargin * 17).priority(.high) + make.height.lessThanOrEqualTo(StandardVerticalMargin * 17) + } + + UIView.animate(withDuration: 0.3) { [weak self] in + self?.headerView.showHeaderLabel(show: false) + self?.view.layoutIfNeeded() + } completion: { [weak self] _ in + self?.headerViewState = .expanded + } + } + + private func collapseHeaderView() { + headerView.snp.remakeConstraints { make in + make.top.equalTo(contentView) + make.leading.equalTo(contentView) + make.trailing.equalTo(contentView) + make.height.equalTo(StandardVerticalMargin * 8) + } + + UIView.animate(withDuration: 0.3) { [weak self] in + self?.headerView.showHeaderLabel(show: true) + self?.view.layoutIfNeeded() + } completion: { [weak self] _ in + self?.headerViewState = .collapsed + } + } +} + +fileprivate extension UIStackView { + func addArrangedSubviews(_ views: [UIView]) { + views.forEach { addArrangedSubview($0) } + } + + func removeAllArrangedSubviews() { + arrangedSubviews.forEach { $0.removeFromSuperview() } + } +} diff --git a/Source/NewCourseDashboardViewController.swift b/Source/NewCourseDashboardViewController.swift new file mode 100644 index 0000000000..e44259bf6b --- /dev/null +++ b/Source/NewCourseDashboardViewController.swift @@ -0,0 +1,627 @@ +// +// NewCourseDashboardViewController.swift +// edX +// +// Created by MuhammadUmer on 18/11/2022. +// Copyright © 2022 edX. All rights reserved. +// + +import UIKit + +// view used at the exact same location of status bar in case of hidden navbar +let statuBarViewTag: Int = 123454321 + +public protocol NewCourseDashboardViewControllerDelegate: AnyObject { + func showCourseDates(bannerInfo: DatesBannerInfo?, delegate: CourseOutlineTableController?) + func hideCourseDates() + func selectedController() -> UIViewController? +} + +extension NewCourseDashboardViewControllerDelegate { + public func selectedController() -> UIViewController? { + return nil + } +} + +class NewCourseDashboardViewController: UIViewController, InterfaceOrientationOverriding { + + typealias Environment = OEXAnalyticsProvider & OEXConfigProvider & DataManagerProvider & NetworkManagerProvider & OEXRouterProvider & OEXInterfaceProvider & ReachabilityProvider & OEXSessionProvider & OEXStylesProvider & RemoteConfigProvider & ServerConfigProvider + + private lazy var headerView: CourseDashboardHeaderView = { + let view = CourseDashboardHeaderView(environment: environment, course: course, tabbarItems: tabBarItems, error: courseAccessHelper) + view.accessibilityIdentifier = "NewCourseDashboardViewController:header-view" + view.delegate = self + return view + }() + + private lazy var contentView: UIView = { + let view = UIView() + view.accessibilityIdentifier = "NewCourseDashboardViewController:contentView-view" + return view + }() + + private lazy var container: UIView = { + let view = UIView() + view.accessibilityIdentifier = "NewCourseDashboardViewController:container-view" + return view + }() + + private lazy var courseUpgradeHelper = CourseUpgradeHelper.shared + + private var statusbarColor: UIColor { + return environment.styles.primaryLightColor() + } + + private var pacing: String { + guard let course = course else { return "" } + return course.isSelfPaced ? "self" : "instructor" + } + + private var shouldShowDiscussions: Bool { + guard let course = course else { return false } + return environment.config.discussionsEnabled && course.hasDiscussionsEnabled + } + + private var shouldShowHandouts: Bool { + guard let course = course else { return false } + return course.course_handouts?.isEmpty == false + } + + private var course: OEXCourse? + private var error: NSError? + private var courseAccessHelper: CourseAccessHelper? + private var selectedTabbarItem: TabBarItem? + + private var headerViewState: HeaderViewState = .expanded { + didSet { + headerView.state = headerViewState + } + } + private var tabBarItems: [TabBarItem] = [] + private var isModalDismissable = true + private let courseStream: BackedStream + private let loadStateController: LoadStateViewController + + private let environment: Environment + let courseID: String + private let screen: CourseUpgradeScreen = .courseDashboard + + init(environment: Environment, courseID: String) { + self.environment = environment + self.courseID = courseID + self.courseStream = BackedStream() + self.loadStateController = LoadStateViewController() + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) + addSubviews() + loadCourseStream() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + navigationItem.setHidesBackButton(true, animated: true) + navigationController?.setNavigationBarHidden(true, animated: true) + environment.analytics.trackScreen(withName: OEXAnalyticsScreenCourseDashboard, courseID: courseID, value: nil) + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + navigationController?.setNavigationBarHidden(false, animated: true) + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return .lightContent + } + + private func addSubviews() { + view.backgroundColor = environment.styles.neutralWhiteT() + view.addSubview(contentView) + contentView.snp.remakeConstraints { make in + make.top.equalTo(view) + make.bottom.equalTo(safeBottom) + make.leading.equalTo(safeLeading) + make.trailing.equalTo(safeTrailing) + } + setStatusBar(inside: contentView, color: statusbarColor) + loadStateController.setupInController(controller: self, contentView: contentView) + } + + private func setupConstraints() { + container.removeFromSuperview() + headerView.removeFromSuperview() + + contentView.addSubview(container) + contentView.addSubview(headerView) + + headerView.snp.remakeConstraints { make in + make.top.equalTo(safeTop) + make.leading.equalTo(contentView) + make.trailing.equalTo(contentView) + make.height.lessThanOrEqualTo(StandardVerticalMargin * 100) + } + + container.snp.remakeConstraints { make in + make.leading.equalTo(contentView) + make.trailing.equalTo(contentView) + make.top.equalTo(headerView.snp.bottom) + make.bottom.equalTo(contentView) + } + } + + private func loadCourseStream() { + courseStream.backWithStream(environment.dataManager.enrollmentManager.streamForCourseWithID(courseID: courseID)) + courseStream.listen(self) { [weak self] result in + self?.resultLoaded(result: result) + } + } + + private func resultLoaded(result: Result) { + switch result { + case .success(let enrollment): + let course = enrollment.course + self.course = course + prepareTabViewData() + + if let access = enrollment.course.courseware_access, !access.has_access { + let enrollment = environment.interface?.enrollmentForCourse(withID: courseID) + courseAccessHelper = CourseAccessHelper(course: course, enrollment: enrollment) + headerView.showTabbarView(show: false) + } else { + headerView.showTabbarView(show: true) + } + + loadStateController.state = .Loaded + setupConstraints() + setupContentView() + + case .failure(let error): + if !courseStream.active { + loadStateController.state = .Loaded + self.error = error + headerView.showTabbarView(show: false) + setupContentView() + } + } + } + + private func setupContentView() { + container.subviews.forEach { $0.removeFromSuperview() } + + if showCourseAccessError { + headerView.hidevalueProp() + let view = CourseDashboardAccessErrorView() + view.delegate = self + view.handleCourseAccessError(environment: environment, course: course, error: courseAccessHelper) + container.addSubview(view) + view.snp.remakeConstraints { make in + make.edges.equalTo(container) + } + } else if showContentNotLoadedError { + headerView.hidevalueProp() + let view = CourseDashboardErrorView() + view.myCoursesAction = { [weak self] in + self?.dismiss(animated: true) + } + container.addSubview(view) + view.snp.remakeConstraints { make in + make.edges.equalTo(container) + } + } else if let tabBarItem = selectedTabbarItem { + headerView.hidevalueProp(hide: false) + let contentController = tabBarItem.viewController + if var controller = contentController as? ScrollableDelegateProvider { + controller.scrollableDelegate = self + } + addChild(contentController) + container.addSubview(contentController.view) + contentController.view.snp.remakeConstraints { make in + make.edges.equalTo(container) + } + contentController.didMove(toParent: self) + contentController.view.layoutIfNeeded() + } + } + + override var shouldAutorotate: Bool { + return true + } + + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + return .allButUpsideDown + } + + private func redirectToDiscovery() { + dismiss(animated: true) { + guard let rootController = UIApplication.shared.window?.rootViewController, + let enrolledTabbarViewController = rootController.children.first as? EnrolledTabBarViewController else { return } + + enrolledTabbarViewController.switchTab(with: .discovery) + } + } + + var showCourseAccessError: Bool { + return courseAccessHelper != nil + } + + var showContentNotLoadedError: Bool { + // add more logic here, like check for the content etc + return error != nil + } + + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + setupContentView() + + coordinator.animate { [weak self] _ in + guard let weakSelf = self else { return } + DispatchQueue.main.async { + weakSelf.setStatusBar(inside: weakSelf.contentView, color: weakSelf.statusbarColor) + } + } + + if headerViewState == .collapsed { + collapseHeaderView() + } else if headerViewState == .expanded { + expandHeaderView() + } + } + + private func prepareTabViewData() { + tabBarItems = [] + let outlineController = CourseOutlineViewController(environment: environment, courseID: courseID, rootID: nil, forMode: .full, newDashboardDelegate: self) + var item = TabBarItem(title: Strings.Dashboard.courseHome, viewController: outlineController, icon: Icon.Courseware, detailText: Strings.Dashboard.courseCourseDetail) + tabBarItems.append(item) + + if environment.config.isCourseVideosEnabled { + item = TabBarItem(title: Strings.Dashboard.courseVideos, viewController: CourseOutlineViewController(environment: environment, courseID: courseID, rootID: nil, forMode: .video), icon: Icon.CourseVideos, detailText: Strings.Dashboard.courseVideosDetail) + tabBarItems.append(item) + } + + if shouldShowDiscussions { + item = TabBarItem(title: Strings.Dashboard.courseDiscussion, viewController: DiscussionTopicsViewController(environment: environment, courseID: courseID), icon: Icon.Discussions, detailText: Strings.Dashboard.courseDiscussionDetail) + tabBarItems.append(item) + } + + if environment.config.courseDatesEnabled { + item = TabBarItem(title: Strings.Dashboard.courseImportantDates, viewController: CourseDatesViewController(environment: environment , courseID: courseID), icon: Icon.Calendar, detailText: Strings.Dashboard.courseImportantDatesDetail) + tabBarItems.append(item) + } + + if shouldShowHandouts { + item = TabBarItem(title: Strings.Dashboard.courseHandouts, viewController: CourseHandoutsViewController(environment: environment, courseID: courseID), icon: Icon.Handouts, detailText: Strings.Dashboard.courseHandoutsDetail) + tabBarItems.append(item) + } + + if environment.config.isAnnouncementsEnabled { + item = TabBarItem(title: Strings.Dashboard.courseAnnouncements, viewController: CourseAnnouncementsViewController(environment: environment, courseID: courseID), icon:Icon.Announcements, detailText: Strings.Dashboard.courseAnnouncementsDetail) + tabBarItems.append(item) + } + } + + func switchTab(with type: DeepLinkType, deeplink: DeepLink? = nil) { + var selectedItem: TabBarItem? + + switch type { + case .courseDashboard: + selectedItem = tabbarViewItem(with: CourseOutlineViewController.self, courseOutlineMode: .full) + break + case .courseComponent: + selectedItem = tabbarViewItem(with: CourseOutlineViewController.self, courseOutlineMode: .full) + if let controller = selectedItem?.viewController as? CourseOutlineViewController { + controller.componentID = deeplink?.componentID + } + break + case .courseVideos: + selectedItem = tabbarViewItem(with: CourseOutlineViewController.self, courseOutlineMode: .video) + break + case .discussions, .discussionTopic, .discussionPost, .discussionComment: + selectedItem = tabbarViewItem(with: DiscussionTopicsViewController.self) + break + case .courseDates: + selectedItem = tabbarViewItem(with: CourseDatesViewController.self) + break + case .courseHandout: + let item = tabbarViewItem(with: CourseHandoutsViewController.self) + selectedItem = item == nil ? tabbarViewItem(with: AdditionalTabBarViewController.self) : item + break + case .courseAnnouncement: + let item = tabbarViewItem(with: CourseAnnouncementsViewController.self) + selectedItem = item == nil ? tabbarViewItem(with: AdditionalTabBarViewController.self) : item + break + default: + selectedItem = tabBarItems.first + break + } + + if let selectedItem = selectedItem { + selectedTabbarItem?.viewController.removeFromParent() + selectedTabbarItem = selectedItem + headerView.updateTabbarView(item: selectedItem) + setupContentView() + } + } + + func tabbarViewItem(with controller: AnyClass, courseOutlineMode: CourseOutlineMode? = .full) -> TabBarItem? { + for item in tabBarItems { + if item.viewController.isKind(of: controller) { + if item.viewController.isKind(of: CourseOutlineViewController.self) { + if let courseOutlineVC = item.viewController as? CourseOutlineViewController { + if let courseOutlineMode = courseOutlineMode { + if courseOutlineVC.courseOutlineMode == courseOutlineMode { + return item + } + } else { + return item + } + } + } else { + return item + } + } + } + return nil + } + + var currentVisibileController: UIViewController? { + return selectedTabbarItem?.viewController + } +} + +extension NewCourseDashboardViewController: CourseDashboardHeaderViewDelegate { + func didTapOnValueProp() { + guard let course = course else { return } + environment.router?.showValuePropDetailView(from: self, screen: .courseDashboard, course: course) { [weak self] in + self?.environment.analytics.trackValuePropModal(with: .CourseDashboard, courseId: course.course_id ?? "") + } + environment.analytics.trackValuePropLearnMore(courseID: course.course_id ?? "", screenName: .CourseDashboard) + } + + func didTapOnClose() { + dismiss(animated: true) + } + + func didTapOnShareCourse(shareView: UIView) { + guard let course = course, + let urlString = course.course_about, + let url = NSURL(string: urlString) else { return } + + let controller = shareHashtaggedTextAndALink(textBuilder: { hashtagOrPlatform in + Strings.shareACourse(platformName: hashtagOrPlatform) + }, url: url, utmParams: course.courseShareUtmParams) { [weak self] analyticsType in + self?.environment.analytics.trackCourseShared(courseID: self?.courseID ?? "", url: urlString, type: analyticsType) + } + + let location = CGRect(x: shareView.bounds.origin.x + shareView.bounds.size.width - 18, y: shareView.bounds.origin.y, width: 18, height: shareView.bounds.size.height) + + controller.configurePresentationController(withSourceView: shareView, location: location) + + present(controller, animated: true, completion: nil) + } + + func didTapTabbarItem(at position: Int, tabbarItem: TabBarItem) { + if courseAccessHelper == nil && selectedTabbarItem != tabbarItem { + selectedTabbarItem?.viewController.removeFromParent() + selectedTabbarItem = tabbarItem + setupContentView() + } + } +} + +extension NewCourseDashboardViewController: CourseDashboardAccessErrorViewDelegate { + func findCourseAction() { + redirectToDiscovery() + } + + func coursePrice(cell: CourseDashboardAccessErrorView, price: String?, elapsedTime: Int) { + if let price = price { + trackPriceLoadDuration(price: price, elapsedTime: elapsedTime) + } + else { + trackPriceLoadError(cell: cell) + } + } + + func upgradeCourseAction(course: OEXCourse, coursePrice: String, price: NSDecimalNumber?, currencyCode: String?, completion: @escaping ((Bool) -> ())) { + let upgradeHandler = CourseUpgradeHandler(for: course, environment: environment) + + guard let courseID = course.course_id else { + courseUpgradeHelper.handleCourseUpgrade(upgradeHadler: upgradeHandler, state: .error(.generalError, nil)) + completion(false) + return + } + + environment.analytics.trackUpgradeNow(with: courseID, pacing: pacing, screenName: .courseDashboard, coursePrice: coursePrice) + + courseUpgradeHelper.setupHelperData(environment: environment, pacing: pacing, courseID: courseID, localizedCoursePrice: coursePrice, screen: .courseDashboard) + + upgradeHandler.upgradeCourse(price: price, currencyCode: currencyCode) { [weak self] status in + guard let weakSelf = self else { return } + weakSelf.enableUserInteraction(enable: false) + + switch status { + case .payment: + weakSelf.courseUpgradeHelper.handleCourseUpgrade(upgradeHadler: upgradeHandler, state: .payment) + break + + case .verify: + weakSelf.courseUpgradeHelper.handleCourseUpgrade(upgradeHadler: upgradeHandler, state: .fulfillment(showLoader: true)) + break + + case .complete: + weakSelf.enableUserInteraction(enable: true) + weakSelf.dismiss(animated: true) { [weak self] in + self?.courseUpgradeHelper.handleCourseUpgrade(upgradeHadler: upgradeHandler, state: .success(course.course_id ?? "", nil)) + } + completion(true) + break + + case .error(let type, let error): + weakSelf.enableUserInteraction(enable: true) + weakSelf.courseUpgradeHelper.handleCourseUpgrade(upgradeHadler: upgradeHandler, state: .error(type, error), delegate: type == .verifyReceiptError ? self : nil) + completion(false) + break + + default: + break + } + } + } + + private func enableUserInteraction(enable: Bool) { + isModalDismissable = enable + DispatchQueue.main.async { [weak self] in + self?.navigationItem.rightBarButtonItem?.isEnabled = enable + self?.view.isUserInteractionEnabled = enable + } + } +} + +extension NewCourseDashboardViewController { + private func trackPriceLoadDuration(price: String, elapsedTime: Int) { + guard let course = course, + let courseID = course.course_id else { return } + + environment.analytics.trackCourseUpgradeTimeToLoadPrice(courseID: courseID, pacing: pacing, coursePrice: price, screen: screen, elapsedTime: elapsedTime) + } + + private func trackPriceLoadError(cell: CourseDashboardAccessErrorView) { + guard let course = course, let courseID = course.course_id else { return } + environment.analytics.trackCourseUpgradeLoadError(courseID: courseID, pacing: pacing, screen: screen) + showCoursePriceErrorAlert(cell: cell) + } + + private func showCoursePriceErrorAlert(cell: CourseDashboardAccessErrorView) { + guard let topController = UIApplication.shared.topMostController() else { return } + + let alertController = UIAlertController().showAlert(withTitle: Strings.CourseUpgrade.FailureAlert.alertTitle, message: Strings.CourseUpgrade.FailureAlert.priceFetchErrorMessage, cancelButtonTitle: nil, onViewController: topController) { _, _, _ in } + + + alertController.addButton(withTitle: Strings.CourseUpgrade.FailureAlert.priceFetchError) { [weak self] _ in + cell.fetchCoursePrice() + self?.environment.analytics.trackCourseUpgradeErrorAction(courseID: self?.course?.course_id ?? "" , blockID: "", pacing: self?.pacing ?? "", coursePrice: "", screen: self?.screen ?? .none, errorAction: CourseUpgradeHelper.ErrorAction.reloadPrice.rawValue, upgradeError: "price", flowType: CourseUpgradeHandler.CourseUpgradeMode.userInitiated.rawValue) + } + + alertController.addButton(withTitle: Strings.cancel, style: .default) { [weak self] _ in + cell.hideUpgradeButton() + self?.environment.analytics.trackCourseUpgradeErrorAction(courseID: self?.course?.course_id ?? "" , blockID: "", pacing: self?.pacing ?? "", coursePrice: "", screen: self?.screen ?? .none, errorAction: CourseUpgradeHelper.ErrorAction.close.rawValue, upgradeError: "price", flowType: CourseUpgradeHandler.CourseUpgradeMode.userInitiated.rawValue) + } + } +} + +extension NewCourseDashboardViewController: UIAdaptivePresentationControllerDelegate { + func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { + return isModalDismissable + } +} + +extension NewCourseDashboardViewController: CourseUpgradeHelperDelegate { + func hideAlertAction() { + dismiss(animated: true, completion: nil) + } +} + +extension NewCourseDashboardViewController: ScrollableDelegate { + func scrollViewDidScroll(scrollView: UIScrollView) { + guard headerViewState != .animating else { return } + + if scrollView.contentOffset.y <= 0 { + if headerViewState == .collapsed { + headerViewState = .animating + expandHeaderView() + } + } else if headerViewState == .expanded { + headerViewState = .animating + collapseHeaderView() + } + } +} + +extension NewCourseDashboardViewController { + private func expandHeaderView() { + headerView.snp.remakeConstraints { make in + make.top.equalTo(safeTop) + make.leading.equalTo(contentView) + make.trailing.equalTo(contentView) + make.height.lessThanOrEqualTo(StandardVerticalMargin * 60) + } + + UIView.animateKeyframes(withDuration: 0.4, delay: 0, options: .calculationModeLinear) { [weak self] in + UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5) { + self?.headerView.updateTabbarConstraints(collapse: false) + self?.headerView.showCourseTitleHeaderLabel(show: false) + self?.view.layoutIfNeeded() + } + UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) { + self?.headerView.updateHeader(collapse: false) + } + } completion: { [weak self] _ in + self?.headerViewState = .expanded + } + } + + private func collapseHeaderView() { + headerView.updateHeader(collapse: true) + + headerView.snp.remakeConstraints { make in + make.top.equalTo(safeTop) + make.leading.equalTo(contentView) + make.trailing.equalTo(contentView) + make.height.equalTo(StandardVerticalMargin * 11) + } + + UIView.animate(withDuration: 0.3) { [weak self] in + self?.headerView.showCourseTitleHeaderLabel(show: true) + self?.view.layoutIfNeeded() + } completion: { [weak self] _ in + self?.headerViewState = .collapsed + } + } +} + +extension NewCourseDashboardViewController: NewCourseDashboardViewControllerDelegate { + func showCourseDates(bannerInfo: DatesBannerInfo?, delegate: CourseOutlineTableController?) { + headerView.showDatesBanner(delegate: delegate, bannerInfo: bannerInfo) + } + + func hideCourseDates() { + headerView.removeDatesBanner() + } + + func selectedController() -> UIViewController? { + return selectedTabbarItem?.viewController + } +} + +public extension UIViewController { + func setStatusBar(inside contentView: UIView? = nil, color: UIColor) { + let overView: UIView + + if let contentView = contentView, let taggedView = contentView.viewWithTag(statuBarViewTag) { + overView = taggedView + } else if contentView != nil { + overView = UIView() + overView.tag = statuBarViewTag + contentView?.addSubview(overView) + } else if let taggedView = view.viewWithTag(statuBarViewTag) { + overView = taggedView + } else { + overView = UIView() + overView.tag = statuBarViewTag + view.addSubview(overView) + } + + let height = UIApplication.shared.windows.first?.safeAreaInsets.top ?? 0 + let frame = UIApplication.shared.windows.first?.windowScene?.statusBarManager?.statusBarFrame ?? .zero + overView.frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: frame.size.width, height: height) + overView.backgroundColor = color + } +} diff --git a/Source/NewCourseDateBannerView.swift b/Source/NewCourseDateBannerView.swift new file mode 100644 index 0000000000..2aa13abe83 --- /dev/null +++ b/Source/NewCourseDateBannerView.swift @@ -0,0 +1,138 @@ +// +// NewCourseDateBannerView.swift +// edX +// +// Created by SaeedBashir on 4/12/23. +// Copyright © 2023 edX. All rights reserved. +// + +import Foundation +import UIKit + +class NewCourseDateBannerView: UIView { + private var buttonHeight: CGFloat = 32 + private lazy var container = UIView() + + private lazy var messageLabel: UILabel = { + let label = UILabel(frame: .zero) + label.numberOfLines = 0 + label.accessibilityIdentifier = "NewCourseDateBannerView:message-label" + return label + }() + + private lazy var bannerHeaderStyle: OEXMutableTextStyle = { + let style = OEXMutableTextStyle(weight: .bold, size: .small, color: OEXStyles.shared().neutralXXDark()) + style.lineBreakMode = .byWordWrapping + return style + }() + + private lazy var bannerBodyStyle: OEXMutableTextStyle = { + let style = OEXMutableTextStyle(weight: .normal, size: .small, color: OEXStyles.shared().neutralXXDark()) + style.lineBreakMode = .byWordWrapping + return style + }() + + private lazy var buttonStyle: OEXMutableTextStyle = { + return OEXMutableTextStyle(weight: .semiBold, size: .base, color: OEXStyles.shared().neutralWhiteT()) + }() + + private lazy var bannerButton: UIButton = { + let button = UIButton() + button.contentEdgeInsets = UIEdgeInsets(top: 10, left: 15, bottom: 10, right: 15) + button.layer.backgroundColor = OEXStyles.shared().primaryBaseColor().cgColor + button.layer.borderColor = OEXStyles.shared().primaryBaseColor().cgColor + button.layer.borderWidth = 1 + button.layer.cornerRadius = 0 + button.oex_removeAllActions() + button.oex_addAction({ [weak self] _ in + self?.bannerButtonAction() + }, for: .touchUpInside) + button.accessibilityIdentifier = "NewCourseDateBannerView:reset-date-button" + return button + }() + + private var isButtonTextAvailable: Bool { + guard let bannerInfo = bannerInfo, let status = bannerInfo.status else { return false } + return !status.button.isEmpty + } + + var bannerInfo: DatesBannerInfo? + weak var delegate: CourseShiftDatesDelegate? + + override init(frame: CGRect) { + super.init(frame: frame) + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + func setupView() { + configureViews() + setConstraints() + populate() + } + + private func configureViews() { + container.subviews.forEach { $0.removeFromSuperview() } + container.superview?.removeFromSuperview() + backgroundColor = OEXStyles.shared().warningXXLight() + addSubview(container) + container.addSubview(messageLabel) + container.accessibilityIdentifier = "CourseResetDateBannerView:container-view" + + if isButtonTextAvailable { + container.addSubview(bannerButton) + } + } + + private func setConstraints() { + container.snp.makeConstraints { make in + make.edges.equalTo(self) + } + + messageLabel.snp.makeConstraints { make in + make.top.equalTo(container).offset(StandardVerticalMargin) + make.leading.equalTo(container).offset(StandardHorizontalMargin) + make.trailing.equalTo(container).inset(StandardHorizontalMargin) + } + + if isButtonTextAvailable { + bannerButton.snp.makeConstraints { make in + make.top.equalTo(messageLabel.snp.bottom).offset(StandardVerticalMargin * 2) + make.bottom.equalTo(container).inset(StandardVerticalMargin * 2) + make.height.equalTo(buttonHeight) + make.leading.equalTo(container).offset(StandardHorizontalMargin) + make.trailing.equalTo(container).inset(StandardHorizontalMargin) + } + } + } + + private func populate() { + guard let bannerInfo = bannerInfo, let status = bannerInfo.status else { return } + + let headerText = bannerHeaderStyle.attributedString(withText: status.header) + let bodyText = bannerBodyStyle.attributedString(withText: status.body).setLineSpacing(3) + + let messageText = [headerText, bodyText] + let attributedString = NSAttributedString.joinInNaturalLayout(attributedStrings: messageText) + + messageLabel.attributedText = attributedString + messageLabel.sizeToFit() + messageLabel.layoutIfNeeded() + messageLabel.setNeedsLayout() + + if isButtonTextAvailable { + let buttonText = buttonStyle.attributedString(withText: status.button) + bannerButton.setAttributedTitle(buttonText, for: .normal) + } + } + + @objc private func bannerButtonAction() { + guard let bannerInfo = bannerInfo else { return } + + if bannerInfo.status == .resetDatesBanner { + delegate?.courseShiftDateButtonAction() + } + } +} diff --git a/Source/NewDashboardContentCell.swift b/Source/NewDashboardContentCell.swift new file mode 100644 index 0000000000..ebdafd6123 --- /dev/null +++ b/Source/NewDashboardContentCell.swift @@ -0,0 +1,29 @@ +// +// NewDashboardContentCell.swift +// edX +// +// Created by MuhammadUmer on 23/11/2022. +// Copyright © 2022 edX. All rights reserved. +// + +import UIKit + +class NewDashboardContentCell: UITableViewCell { + static let identifier = "NewDashboardContentCell" + + var viewController: UIViewController? + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + selectionStyle = .none + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func prepareForReuse() { + super.prepareForReuse() + viewController?.removeFromParent() + } +} diff --git a/Source/OEXConfig+AppFeatures.swift b/Source/OEXConfig+AppFeatures.swift index 4cad3b0264..10254bbc8f 100644 --- a/Source/OEXConfig+AppFeatures.swift +++ b/Source/OEXConfig+AppFeatures.swift @@ -82,6 +82,14 @@ extension OEXConfig { } return false } + + var isNewDashboardEnabled: Bool { + return bool(forKey: "NEW_DASHBOARD_ENABLED", defaultValue: false) + } + + var isNewComponentNavigationEnabled: Bool { + return bool(forKey: "NEW_COMPONENT_NAVIGATION_ENABLED", defaultValue: false) && isNewDashboardEnabled + } } diff --git a/Source/OEXFindCoursesViewController.h b/Source/OEXFindCoursesViewController.h index 28c9f53939..fc7fce35b4 100644 --- a/Source/OEXFindCoursesViewController.h +++ b/Source/OEXFindCoursesViewController.h @@ -17,8 +17,10 @@ typedef NS_ENUM(NSInteger, OEXFindCoursesBaseType) { @interface OEXFindCoursesViewController : UIViewController @property (readonly, strong, nonatomic) UIView* bottomBar; -- (instancetype) initWithEnvironment:(RouterEnvironment* _Nullable)environment showBottomBar:(BOOL) showBottomBar bottomBar:(UIView* _Nullable)bottomBar searchQuery:(nullable NSString*)searchQuery; +- (void) updateTitleViewVisibility; +- (instancetype) initWithEnvironment:(RouterEnvironment* _Nullable)environment showBottomBar:(BOOL) showBottomBar bottomBar:(UIView* _Nullable)bottomBar searchQuery:(nullable NSString*)searchQuery fromStartupScreen:(BOOL) fromStartupScreen; @property (nonatomic) OEXFindCoursesBaseType startURL; +@property (nonatomic) BOOL fromStartupScreen; @end NS_ASSUME_NONNULL_END diff --git a/Source/OEXFindCoursesViewController.m b/Source/OEXFindCoursesViewController.m index 5da3e99c78..8e64274bfc 100644 --- a/Source/OEXFindCoursesViewController.m +++ b/Source/OEXFindCoursesViewController.m @@ -33,13 +33,14 @@ @interface OEXFindCoursesViewController () Void)? = nil) { + if environment.config.isNewComponentNavigationEnabled { + navigateToComponentScreenNew(from: controller, courseID: courseID, componentID: componentID, completion: completion) + } else { + navigateToComponentScreenOld(from: controller, courseID: courseID, componentID: componentID, completion: completion) + } + } + + func navigateToComponentScreenNew(from controller: UIViewController, courseID: CourseBlockID, componentID: CourseBlockID, completion: ((UIViewController) -> Void)? = nil) { + + var parentViewController: UIViewController? + + if environment.config.isNewDashboardEnabled { + if let dashboardController = controller.navigationController?.viewControllers.first as? NewCourseDashboardViewController { + dashboardController.switchTab(with: .courseDashboard) + parentViewController = dashboardController + } + } else { + if let dashboardController = controller.navigationController?.viewControllers.first(where: { $0 is CourseDashboardViewController }) as? CourseDashboardViewController { + dashboardController.switchTab(with: .courseDashboard) + parentViewController = dashboardController + } + } + + let contentController = NewCourseContentController(environment: environment, blockID: componentID, resumeCourseBlockID: componentID, courseID: courseID) + parentViewController?.navigationController?.pushViewController(contentController, animated: true, completion: completion) + } + + func navigateToComponentScreenOld(from controller: UIViewController, courseID: CourseBlockID, componentID: CourseBlockID, completion: ((UIViewController) -> Void)? = nil) { let courseQuerier = environment.dataManager.courseDataManager.querierForCourseWithID(courseID: courseID, environment: environment) guard let childBlock = courseQuerier.blockWithID(id: componentID).firstSuccess().value, let unitBlock = courseQuerier.parentOfBlockWith(id: childBlock.blockID, type: .Unit).firstSuccess().value, @@ -85,10 +113,17 @@ extension OEXRouter { if controller is CourseOutlineViewController { outlineViewController = controller } else { - guard let dashboardController = controller.navigationController?.viewControllers.first(where: { $0 is CourseDashboardViewController}) as? CourseDashboardViewController else { return } - dashboardController.switchTab(with: .courseDashboard) - guard let outlineController = dashboardController.currentVisibleController as? CourseOutlineViewController else { return } - outlineViewController = outlineController + if environment.config.isNewDashboardEnabled { + guard let dashboardController = controller.navigationController?.viewControllers.first as? NewCourseDashboardViewController else { return } + dashboardController.switchTab(with: .courseDashboard) + guard let outlineController = dashboardController.currentVisibileController else { return } + outlineViewController = outlineController + } else { + guard let dashboardController = controller.navigationController?.viewControllers.first(where: { $0 is CourseDashboardViewController}) as? CourseDashboardViewController else { return } + dashboardController.switchTab(with: .courseDashboard) + guard let outlineController = dashboardController.currentVisibleController as? CourseOutlineViewController else { return } + outlineViewController = outlineController + } } showContainerForBlockWithID(blockID: sectionBlock.blockID, type: sectionBlock.displayType, parentID: chapterBlock.blockID, courseID: courseID, fromController: outlineViewController) { [weak self] visibleController in @@ -102,6 +137,15 @@ extension OEXRouter { } func showContainerForBlockWithID(blockID: CourseBlockID?, type: CourseBlockDisplayType, parentID: CourseBlockID?, courseID: CourseBlockID, fromController controller: UIViewController, forMode mode: CourseOutlineMode? = .full, completion: ((UIViewController) -> Void)? = nil) { + if environment.config.isNewComponentNavigationEnabled { + let contentController = NewCourseContentController(environment: environment, blockID: blockID, parentID: parentID, courseID: courseID, courseOutlineMode: mode) + controller.navigationController?.pushViewController(contentController, animated: true, completion: completion) + } else { + showContainerForBlockWithIDOld(blockID: blockID, type: type, parentID: parentID, courseID: courseID, fromController: controller, forMode: mode, completion: completion) + } + } + + func showContainerForBlockWithIDOld(blockID: CourseBlockID?, type: CourseBlockDisplayType, parentID: CourseBlockID?, courseID: CourseBlockID, fromController controller: UIViewController, forMode mode: CourseOutlineMode? = .full, completion: ((UIViewController) -> Void)? = nil) { switch type { case .Outline: fallthrough @@ -168,11 +212,10 @@ extension OEXRouter { @objc(showMyCoursesAnimated:pushingCourseWithID:) func showMyCourses(animated: Bool = true, pushingCourseWithID courseID: String? = nil) { let controller = EnrolledTabBarViewController(environment: environment) + let learnController = controller.children.flatMap { $0.children }.compactMap { $0 as? LearnContainerViewController } .first showContentStack(withRootController: controller, animated: animated) - if let courseID = courseID { - let navController = controller.viewControllers?.first as? ForwardingNavigationController - let coursesController = navController?.viewControllers.first as? EnrolledCoursesViewController - showCourseWithID(courseID: courseID, fromController: coursesController ?? controller, animated: false) + if let courseID = courseID, let learnController = learnController { + showCourseWithID(courseID: courseID, fromController: learnController, animated: false) } } @@ -191,23 +234,42 @@ extension OEXRouter { } func showDatesTabController(controller: UIViewController) { - if let dashboardController = controller as? CourseDashboardViewController { - dashboardController.switchTab(with: .courseDates) - } else if let dashboardController = controller.navigationController?.viewControllers.first(where: { $0 is CourseDashboardViewController}) as? CourseDashboardViewController { - controller.navigationController?.popToViewController(dashboardController, animated: false) - dashboardController.switchTab(with: .courseDates) + if environment.config.isNewDashboardEnabled { + if let dashboardController = controller.findParentViewController(type: NewCourseContentController.self)?.navigationController?.viewControllers.first as? NewCourseDashboardViewController { + popToRoot(controller: dashboardController) { + dashboardController.switchTab(with: .courseDates) + } + } else if let dashboardController = UIApplication.shared.topMostController() as? NewCourseDashboardViewController { + dashboardController.switchTab(with: .courseDates) + } + } else { + if let dashboardController = controller.findParentViewController(type: CourseDashboardViewController.self) { + dashboardController.switchTab(with: .courseDates) + } else if let dashboardController = controller.navigationController?.viewControllers.first(where: { $0 is CourseDashboardViewController}) as? CourseDashboardViewController { + controller.navigationController?.popToViewController(dashboardController, animated: false) + dashboardController.switchTab(with: .courseDates) + } } } // MARK: Deep Linking //Method can be use to navigate on particular tab of course dashboard with deep link type - func showCourse(with deeplink: DeepLink, courseID: String, from controller: UIViewController) { + func showCourse(with deeplink: DeepLink, courseID: String, from controller: UIViewController, completion: (() -> Void)? = nil) { + if environment.config.isNewDashboardEnabled { + showCourseNew(with: deeplink, courseID: courseID, from: controller, completion: completion) + } else { + showCourseOld(with: deeplink, courseID: courseID, from: controller, completion: completion) + } + } + + private func showCourseOld(with deeplink: DeepLink, courseID: String, from controller: UIViewController, completion: (() -> Void)? = nil) { let courseDashboardController = controller.navigationController?.viewControllers.first(where: { $0.isKind(of: CourseDashboardViewController.self) }) if let dashboardController = courseDashboardController as? CourseDashboardViewController, dashboardController.courseID == deeplink.courseId { controller.navigationController?.setToolbarHidden(true, animated: false) controller.navigationController?.popToViewController(dashboardController, animated: true) dashboardController.switchTab(with: deeplink.type, componentID: deeplink.componentID) + completion?() } else if let enrolledTabBarController = controller.find(viewController: EnrolledTabBarViewController.self) { if let courseDashboardController = courseDashboardController { courseDashboardController.navigationController?.popToRootViewController(animated: true) { [weak self] in @@ -215,32 +277,53 @@ extension OEXRouter { self?.showCourseWithID(courseID: courseID, fromController: switchedViewController, animated: true) { controller in guard let dashboardController = controller as? CourseDashboardViewController else { return } dashboardController.switchTab(with: deeplink.type, componentID: deeplink.componentID) + completion?() } } } else { let switchedViewController = enrolledTabBarController.switchTab(with: deeplink.type) - if let switchedViewController = switchedViewController as? ForwardingNavigationController, - let enrolledCoursesController = switchedViewController.viewControllers.first as? EnrolledCoursesViewController { - enrolledCoursesController.navigationController?.popToRootViewController(animated: true) { [weak self] in - self?.showCourseWithID(courseID: courseID, fromController: enrolledCoursesController, animated: true) { controller in - guard let dashboardController = controller as? CourseDashboardViewController else { return } - dashboardController.switchTab(with: deeplink.type, componentID: deeplink.componentID) - return - } + if let switchedViewController = switchedViewController as? LearnContainerViewController { + switchedViewController.navigationController?.popToRootViewController(animated: true) { + switchedViewController.switchTo(component: .courses) } } + showCourseWithID(courseID: courseID, fromController: switchedViewController, animated: true) { controller in + guard let dashboardController = controller as? CourseDashboardViewController else { return } + dashboardController.switchTab(with: deeplink.type, componentID: deeplink.componentID) + completion?() + } + } + } + } + + private func showCourseNew(with deeplink: DeepLink, courseID: String, from controller: UIViewController, completion: (() -> Void)? = nil) { + if let enrolledTabBarController = controller.find(viewController: EnrolledTabBarViewController.self) { + let switchedViewController = enrolledTabBarController.switchTab(with: deeplink.type) + if let switchedViewController = switchedViewController as? LearnContainerViewController { + switchedViewController.navigationController?.popToRootViewController(animated: true) { + switchedViewController.switchTo(component: .courses) + } + } + showCourseWithID(courseID: courseID, fromController: switchedViewController, animated: true) { controller in + var dashboardController: NewCourseDashboardViewController? + if let controller = controller as? ForwardingNavigationController { + dashboardController = controller.viewControllers.first(where: { $0 is NewCourseDashboardViewController }) as? NewCourseDashboardViewController + } else { + dashboardController = controller as? NewCourseDashboardViewController + } + dashboardController?.switchTab(with: deeplink.type, deeplink: deeplink) + completion?() } } } func showProgram(with type: DeepLinkType, url: URL? = nil, from controller: UIViewController) { let tabbarController = controller.find(viewController: EnrolledTabBarViewController.self) - if let programNavController = tabbarController?.switchTab(with: type) as? ForwardingNavigationController, - let programsViewController = programNavController.viewControllers.first as? ProgramsViewController { - programsViewController.navigationController?.popToRootViewController(animated: true) { [weak self] in - if let url = url { - self?.showProgramDetails(with: url, from: programsViewController) - } + if let learnController = tabbarController?.switchTab(with: type) as? LearnContainerViewController { + popToRoot(controller: learnController) + if let programsViewController = learnController.switchTo(component: .programs) as? ProgramsViewController, + let url = url { + showProgramDetails(with: url, from: programsViewController) } } } @@ -258,7 +341,6 @@ extension OEXRouter { func showDiscoveryController(from controller: UIViewController, type: DeepLinkType, isUserLoggedIn: Bool, pathID: String?) { let bottomBar = BottomBarView(environment: environment) var discoveryController = discoveryViewController(bottomBar: bottomBar, searchQuery: nil) - discoveryController?.hidesBottomBarWhenPushed = true if isUserLoggedIn { // Pop out all views and switches enrolledCourses tab on the bases of link type @@ -397,7 +479,6 @@ extension OEXRouter { func showProfile(controller: UIViewController? = nil, completion: ((_ success: Bool) -> ())? = nil) { let profileViewController = ProfileOptionsViewController(environment: environment) let navigationController = ForwardingNavigationController(rootViewController: profileViewController) - navigationController.navigationBar.prefersLargeTitles = true controller?.navigationController?.present(navigationController, animated: true) { completion?(true) } @@ -480,13 +561,21 @@ extension OEXRouter { } func showCourseWithID(courseID: String, fromController: UIViewController, animated: Bool = true, completion: ((UIViewController) -> Void)? = nil) { - let controller = CourseDashboardViewController(environment: environment, courseID: courseID) - controller.hidesBottomBarWhenPushed = true - fromController.navigationController?.pushViewController(controller, animated: animated, completion: completion) + if environment.config.isNewDashboardEnabled { + let courseDashboardViewController = NewCourseDashboardViewController(environment: environment, courseID: courseID) + let controller = ForwardingNavigationController(rootViewController: courseDashboardViewController) + controller.navigationController?.setNavigationBarHidden(true, animated: false) + controller.modalPresentationStyle = .fullScreen + fromController.navigationController?.presentViewControler(controller, animated: animated, completion: completion) + } else { + let controller = CourseDashboardViewController(environment: environment, courseID: courseID) + controller.hidesBottomBarWhenPushed = true + fromController.navigationController?.pushViewController(controller, animated: animated, completion: completion) + } } func showCourseCatalog(fromController: UIViewController? = nil, bottomBar: UIView? = nil, searchQuery: String? = nil) { - guard let controller = discoveryViewController(bottomBar: bottomBar, searchQuery: searchQuery) else { return } + guard let controller = discoveryViewController(bottomBar: bottomBar, searchQuery: searchQuery, fromStartupScreen: true) else { return } if let fromController = fromController { fromController.tabBarController?.selectedIndex = EnrolledTabBarViewController.courseCatalogIndex } else { @@ -494,15 +583,14 @@ extension OEXRouter { } } - func discoveryViewController(bottomBar: UIView? = nil, searchQuery: String? = nil) -> UIViewController? { + func discoveryViewController(bottomBar: UIView? = nil, searchQuery: String? = nil, fromStartupScreen: Bool = false) -> UIViewController? { guard environment.config.discovery.isEnabled else { return nil } - return environment.config.discovery.type == .webview ? OEXFindCoursesViewController(environment: environment, showBottomBar: true, bottomBar: bottomBar, searchQuery: searchQuery) : CourseCatalogViewController(environment: environment) + return environment.config.discovery.type == .webview ? OEXFindCoursesViewController(environment: environment, showBottomBar: true, bottomBar: bottomBar, searchQuery: searchQuery, fromStartupScreen: fromStartupScreen) : CourseCatalogViewController(environment: environment) } func showProgramDetail(from controller: UIViewController, with pathId: String, bottomBar: UIView?) { let programDetailViewController = ProgramsDiscoveryViewController(with: environment, pathId: pathId, bottomBar: bottomBar?.copy() as? UIView) - programDetailViewController.hidesBottomBarWhenPushed = true pushViewController(controller: programDetailViewController, fromController: controller) } @@ -593,11 +681,11 @@ extension OEXRouter { let programDetailsController = ProgramsViewController(environment: environment, programsURL: url, viewType: .detail) programDetailsController.hidesBottomBarWhenPushed = true controller.navigationController?.pushViewController(programDetailsController, animated: true) + controller.navigationController?.setNavigationBarHidden(false, animated: true) } @objc public func showCourseDetails(from controller: UIViewController, with coursePathID: String, bottomBar: UIView?) { let courseInfoViewController = OEXCourseInfoViewController(environment: environment, pathID: coursePathID, bottomBar: bottomBar?.copy() as? UIView) - courseInfoViewController.hidesBottomBarWhenPushed = true controller.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) controller.navigationController?.pushViewController(courseInfoViewController, animated: true) } diff --git a/Source/PostsViewController.swift b/Source/PostsViewController.swift index ce8e6555a8..4b81b9c5ea 100644 --- a/Source/PostsViewController.swift +++ b/Source/PostsViewController.swift @@ -8,10 +8,13 @@ import UIKit -class PostsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, PullRefreshControllerDelegate, InterfaceOrientationOverriding, DiscussionNewPostViewControllerDelegate { +class PostsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, PullRefreshControllerDelegate, InterfaceOrientationOverriding, DiscussionNewPostViewControllerDelegate, ScrollableDelegateProvider { typealias Environment = NetworkManagerProvider & OEXRouterProvider & OEXAnalyticsProvider & OEXStylesProvider + weak var scrollableDelegate: ScrollableDelegate? + private var scrollByDragging = false + enum Context { case Topic(DiscussionTopic) case Following @@ -733,3 +736,18 @@ extension PostsViewController { } } +extension PostsViewController { + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + scrollByDragging = true + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + if scrollByDragging { + scrollableDelegate?.scrollViewDidScroll(scrollView: scrollView) + } + } + + func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + scrollByDragging = false + } +} diff --git a/Source/ProfileOptionsViewController.swift b/Source/ProfileOptionsViewController.swift index 2a6c5dc03d..d2c48c748f 100644 --- a/Source/ProfileOptionsViewController.swift +++ b/Source/ProfileOptionsViewController.swift @@ -78,13 +78,11 @@ class ProfileOptionsViewController: UIViewController { super.viewDidLoad() title = Strings.UserAccount.profile - + navigationController?.view.backgroundColor = environment.styles.standardBackgroundColor() + setupViews() - addCloseButton() configureOptions() setupProfileLoader() - - navigationController?.view.backgroundColor = environment.styles.standardBackgroundColor() } override func viewWillAppear(_ animated: Bool) { @@ -92,6 +90,7 @@ class ProfileOptionsViewController: UIViewController { environment.analytics.trackScreen(withName: AnalyticsScreenName.Profile.rawValue) setupProfileLoader() navigationController?.navigationBar.prefersLargeTitles = true + navigationController?.navigationBar.applyDefaultNavbarColorScheme() } override func viewDidDisappear(_ animated: Bool) { @@ -123,19 +122,7 @@ class ProfileOptionsViewController: UIViewController { profileFeed.refresh() } } - - private func addCloseButton() { - let closeButton = UIBarButtonItem(image: Icon.Close.imageWithFontSize(size: crossButtonSize), style: .plain, target: nil, action: nil) - closeButton.accessibilityLabel = Strings.Accessibility.closeLabel - closeButton.accessibilityHint = Strings.Accessibility.closeHint - closeButton.accessibilityIdentifier = "ProfileOptionsViewController:close-button" - navigationItem.rightBarButtonItem = closeButton - - closeButton.oex_setAction { [weak self] in - self?.dismiss(animated: true, completion: nil) - } - } - + private func configureOptions() { options.append(.videoSetting) @@ -309,8 +296,8 @@ extension ProfileOptionsViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { switch options[indexPath.row] { case .personalInformation: - guard environment.config.profilesEnabled, let username = environment.session.currentUser?.username else { return } - environment.router?.showProfileForUsername(controller: self, username: username, editable: true) + guard environment.config.profilesEnabled, let _ = environment.session.currentUser?.username else { return } + environment.router?.showProfileEditorFromController(controller: self) environment.analytics.trackProfileOptionClcikEvent(displayName: AnalyticsDisplayName.PersonalInformationClicked, name: AnalyticsEventName.PersonalInformationClicked) default: return diff --git a/Source/Resources/Images.xcassets/app_update_image.imageset/Contents.json b/Source/Resources/Images.xcassets/app_update_image.imageset/Contents.json new file mode 100644 index 0000000000..fdccfbda1e --- /dev/null +++ b/Source/Resources/Images.xcassets/app_update_image.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "app_update_image@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Source/Resources/Images.xcassets/app_update_image.imageset/app_update_image@2x.png b/Source/Resources/Images.xcassets/app_update_image.imageset/app_update_image@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9e8f1d5ec10fdd7b36c638b91a061c8857bd578d GIT binary patch literal 17928 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 literal 0 HcmV?d00001 diff --git a/Source/Resources/Images.xcassets/dashboard_error_image.imageset/Contents.json b/Source/Resources/Images.xcassets/dashboard_error_image.imageset/Contents.json new file mode 100644 index 0000000000..968c61be7d --- /dev/null +++ b/Source/Resources/Images.xcassets/dashboard_error_image.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "dashboard_error_image.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Source/Resources/Images.xcassets/dashboard_error_image.imageset/dashboard_error_image.png b/Source/Resources/Images.xcassets/dashboard_error_image.imageset/dashboard_error_image.png new file mode 100644 index 0000000000000000000000000000000000000000..d007cbee42e791ba2ec28e1287214bffe34db746 GIT binary patch literal 25824 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 literal 0 HcmV?d00001 diff --git a/Source/Resources/Images.xcassets/empty_state_placeholder.imageset/Contents.json b/Source/Resources/Images.xcassets/empty_state_placeholder.imageset/Contents.json new file mode 100644 index 0000000000..df35c8ac87 --- /dev/null +++ b/Source/Resources/Images.xcassets/empty_state_placeholder.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "empty_state_placeholder.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Source/Resources/Images.xcassets/empty_state_placeholder.imageset/empty_state_placeholder.png b/Source/Resources/Images.xcassets/empty_state_placeholder.imageset/empty_state_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..6a26c0ab656d3c950213bd07ee100d753c00bc96 GIT binary patch literal 34832 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 z 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 Oyi|BCUoK}B`hNg~j}IXL literal 0 HcmV?d00001 diff --git a/Source/ResumeCourseHeaderView.swift b/Source/ResumeCourseHeaderView.swift new file mode 100644 index 0000000000..b1dd7eb897 --- /dev/null +++ b/Source/ResumeCourseHeaderView.swift @@ -0,0 +1,68 @@ +// +// ResumeCourseHeaderView.swift +// edX +// +// Created by MuhammadUmer on 12/03/2023. +// Copyright © 2023 edX. All rights reserved. +// + +import UIKit + +class ResumeCourseHeaderView: UIView { + + var tapAction: (() -> ())? + + private lazy var button: UIButton = { + let button = UIButton() + + let arrowImage = Icon.ArrowForward.imageWithFontSize(size: 18).image(with: OEXStyles.shared().primaryBaseColor()) + let imageAttachment = NSTextAttachment() + imageAttachment.image = arrowImage + + if let image = imageAttachment.image { + imageAttachment.bounds = CGRect(x: 0, y: -4, width: image.size.width, height: image.size.height) + } + + let attributedImageString = NSAttributedString(attachment: imageAttachment) + let style = OEXTextStyle(weight: .bold, size: .base, color: OEXStyles.shared().primaryBaseColor()) + + let attributedStrings = [ + style.attributedString(withText: Strings.Dashboard.resumeCourse), + NSAttributedString(string: " "), + attributedImageString, + ] + + let attributedTitle = NSAttributedString.joinInNaturalLayout(attributedStrings: attributedStrings) + + button.setAttributedTitle(attributedTitle, for: UIControl.State()) + button.backgroundColor = OEXStyles.shared().neutralWhiteT() + button.layer.borderWidth = 1 + button.layer.borderColor = OEXStyles.shared().neutralXLight().cgColor + button.layer.cornerRadius = 0 + button.layer.masksToBounds = true + button.oex_addAction({ [weak self] _ in + self?.tapAction?() + }, for: .touchUpInside) + return button + }() + + init() { + super.init(frame: .zero) + setupViews() + setConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupViews() { + addSubview(button) + } + + private func setConstraints() { + button.snp.makeConstraints { make in + make.edges.equalTo(self) + } + } +} diff --git a/Source/ScrollableDelegate.swift b/Source/ScrollableDelegate.swift new file mode 100644 index 0000000000..00f74aa7d4 --- /dev/null +++ b/Source/ScrollableDelegate.swift @@ -0,0 +1,17 @@ +// +// ScrollableDelegate.swift +// edX +// +// Created by MuhammadUmer on 01/02/2023. +// Copyright © 2023 edX. All rights reserved. +// + +import Foundation + +public protocol ScrollableDelegateProvider { + var scrollableDelegate: ScrollableDelegate? { get set } +} + +@objc public protocol ScrollableDelegate: AnyObject { + func scrollViewDidScroll(scrollView: UIScrollView) +} diff --git a/Source/TabBarItem.swift b/Source/TabBarItem.swift index 64e20da23a..56bf0f5fb9 100644 --- a/Source/TabBarItem.swift +++ b/Source/TabBarItem.swift @@ -15,3 +15,9 @@ struct TabBarItem { let icon: Icon let detailText: String } + +extension TabBarItem: Equatable { + static func == (lhs: TabBarItem, rhs: TabBarItem) -> Bool { + lhs.title == rhs.title + } +} diff --git a/Source/UIGestureRecognizer+BlockActions.swift b/Source/UIGestureRecognizer+BlockActions.swift index 92b2dade91..94b22de482 100644 --- a/Source/UIGestureRecognizer+BlockActions.swift +++ b/Source/UIGestureRecognizer+BlockActions.swift @@ -64,3 +64,38 @@ extension GestureActionable where Self : UIGestureRecognizer { } } +class AttachmentTapGestureRecognizer: UITapGestureRecognizer { + + typealias TappedAttachment = (attachment: NSTextAttachment, characterIndex: Int) + private var action: ((AttachmentTapGestureRecognizer) -> Void)? + + init(action: @escaping (AttachmentTapGestureRecognizer) -> Void) { + super.init(target: nil, action: nil) + self.action = action + } + + override func touchesBegan(_ touches: Set, with event: UIEvent) { + guard let textView = view as? UITextView else { + state = .failed + return + } + + if let touch = touches.first, let _ = evaluateTouch(touch, on: textView) { + super.touchesBegan(touches, with: event) + action?(self) + } else { + state = .failed + } + } + + private func evaluateTouch(_ touch: UITouch, on textView: UITextView) -> TappedAttachment? { + let touch = touch.location(in: textView) + let point = CGPoint(x: touch.x - textView.textContainerInset.left, y: touch.y - textView.textContainerInset.top) + let glyphIndex: Int = textView.layoutManager.glyphIndex(for: point, in: textView.textContainer, fractionOfDistanceThroughGlyph: nil) + let glyphRect = textView.layoutManager.boundingRect(forGlyphRange: NSRange(location: glyphIndex, length: 1), in: textView.textContainer) + guard glyphRect.contains(point) else { return nil } + let characterIndex = textView.layoutManager.characterIndexForGlyph(at: glyphIndex) + guard characterIndex < textView.textStorage.length, NSTextAttachment.character == (textView.textStorage.string as NSString).character(at: characterIndex), let attachment = textView.textStorage.attribute(.attachment, at: characterIndex, effectiveRange: nil) as? NSTextAttachment else { return nil } + return (attachment, characterIndex) + } +} diff --git a/Source/UIViewController+CommonAdditions.swift b/Source/UIViewController+CommonAdditions.swift index cfc57f9acc..7ad3ee397a 100644 --- a/Source/UIViewController+CommonAdditions.swift +++ b/Source/UIViewController+CommonAdditions.swift @@ -46,10 +46,15 @@ extension UIViewController { return (navigationController != nil && navigationController?.presentingViewController?.presentedViewController == navigationController) } - func configurePresentationController(withSourceView sourceView: UIView) { + func configurePresentationController(withSourceView sourceView: UIView, location: CGRect? = nil) { if UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad { popoverPresentationController?.sourceView = sourceView - popoverPresentationController?.sourceRect = sourceView.bounds + if let location = location { + popoverPresentationController?.sourceRect = location + } + else { + popoverPresentationController?.sourceRect = sourceView.bounds + } } } @@ -60,4 +65,14 @@ extension UIViewController { } navigationItem.leftBarButtonItem = backItem } + + func findParentViewController(type: T.Type) -> T? { + if let parentViewController = self.parent as? T { + return parentViewController + } else if let parentViewController = self.parent { + return parentViewController.findParentViewController(type: type) + } else { + return nil + } + } } diff --git a/Source/UserProfileEditViewController.swift b/Source/UserProfileEditViewController.swift index a538e31b19..cba0b11284 100644 --- a/Source/UserProfileEditViewController.swift +++ b/Source/UserProfileEditViewController.swift @@ -210,8 +210,10 @@ class UserProfileEditViewController: UIViewController, UITableViewDelegate, UITa override func viewDidLoad() { super.viewDidLoad() + + navigationItem.largeTitleDisplayMode = .never addSubViews() - title = Strings.Profile.editTitle + title = Strings.ProfileOptions.UserProfile.title navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil) view.backgroundColor = environment.styles.standardBackgroundColor() diff --git a/Source/UserProfileViewController.swift b/Source/UserProfileViewController.swift index 07e853e8ad..57f51ec452 100644 --- a/Source/UserProfileViewController.swift +++ b/Source/UserProfileViewController.swift @@ -70,10 +70,15 @@ class UserProfileViewController: OfflineSupportViewController, UserProfilePresen presenter.refresh() } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + navigationController?.navigationBar.applyDefaultNavbarColorScheme() + } + private func addBackBarButtonItem() { let backItem = UIBarButtonItem(image: Icon.ArrowLeft.imageWithFontSize(size: 40), style: .plain, target: nil, action: nil) backItem.accessibilityIdentifier = "UserProfileViewController:back-item" - backItem.oex_setAction {[weak self] in + backItem.oex_setAction { [weak self] in // Profile has different navbar color scheme that's why we need to revert nav bar color to original color while poping the controller self?.navigationController?.navigationBar.applyDefaultNavbarColorScheme() self?.navigationController?.popViewController(animated: true) @@ -89,7 +94,6 @@ class UserProfileViewController: OfflineSupportViewController, UserProfilePresen if let owner = self { owner.environment.router?.showProfileEditorFromController(controller: owner) } - self?.navigationController?.navigationBar.applyDefaultNavbarColorScheme() } editButton.accessibilityLabel = Strings.Profile.editAccessibility navigationItem.rightBarButtonItem = editButton @@ -97,7 +101,7 @@ class UserProfileViewController: OfflineSupportViewController, UserProfilePresen } private func addCloseButton() { - if (isModal()) {//isModal check if the view is presented then add close button + if isModal() { //isModal check if the view is presented then add close button let closeButton = UIBarButtonItem(title: Strings.close, style: .plain, target: nil, action: nil) closeButton.accessibilityIdentifier = "UserProfileViewController:close-button" closeButton.accessibilityLabel = Strings.Accessibility.closeLabel diff --git a/Source/ValuePropMessagesView.swift b/Source/ValuePropMessagesView.swift index c339bc974e..7a1b513119 100644 --- a/Source/ValuePropMessagesView.swift +++ b/Source/ValuePropMessagesView.swift @@ -50,11 +50,15 @@ class ValuePropMessagesView: UIView { } } - public func height()-> CGFloat { + public func height() -> CGFloat { tableView.layoutIfNeeded() return tableView.contentSize.height } + override func layoutSubviews() { + super.layoutSubviews() + tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height + } } extension ValuePropMessagesView: UITableViewDataSource, UITableViewDelegate { diff --git a/Source/ValuePropUnlockViewContainer.swift b/Source/ValuePropUnlockViewContainer.swift index 622ded2edd..e1f182dff5 100644 --- a/Source/ValuePropUnlockViewContainer.swift +++ b/Source/ValuePropUnlockViewContainer.swift @@ -54,9 +54,9 @@ class ValuePropUnlockViewContainer: NSObject { func removeView(completion: (()-> ())? = nil) { func dismiss() { + controller?.removeFromParent() container?.subviews.forEach { $0.removeFromSuperview() } container?.removeFromSuperview() - controller?.removeFromParent() container = nil controller = nil shouldDismiss.unsubscribe(observer: self) diff --git a/Source/VideoBlockViewController.swift b/Source/VideoBlockViewController.swift index b4e6d144dd..4a3d812eb2 100644 --- a/Source/VideoBlockViewController.swift +++ b/Source/VideoBlockViewController.swift @@ -31,7 +31,7 @@ class VideoBlockViewController : OfflineSupportViewController, CourseBlockViewCo private var playOverlayButton: UIButton? private var overlayLabel: UILabel? var shouldCelebrationAppear: Bool - + init(environment : Environment, blockID : CourseBlockID?, courseID: String, shouldCelebrationAppear: Bool = false) { self.blockID = blockID self.environment = environment @@ -442,16 +442,29 @@ class VideoBlockViewController : OfflineSupportViewController, CourseBlockViewCo } } - // willTransition only called in case of iPhone because iPhone has regular and compact vertical classes. - // This method is specially for iPad - override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { - guard UIDevice.current.userInterfaceIdiom == .pad else { return } - - if videoPlayer.isFullScreen { - videoPlayer.setFullscreen(fullscreen: !UIDevice.current.orientation.isPortrait, animated: true, with: currentOrientation(), forceRotate: false) - } - else if UIDevice.current.orientation.isLandscape { - videoPlayer.setFullscreen(fullscreen: true, animated: true, with: currentOrientation(), forceRotate: false) + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + if UIDevice.current.userInterfaceIdiom == .pad { + if videoPlayer.isFullScreen { + videoPlayer.setFullscreen(fullscreen: !UIDevice.current.orientation.isPortrait, animated: true, with: currentOrientation(), forceRotate: false) + } else if UIDevice.current.orientation.isLandscape { + videoPlayer.setFullscreen(fullscreen: true, animated: true, with: currentOrientation(), forceRotate: false) + } + } else { + DispatchQueue.main.async { [weak self] in + if let weakSelf = self { + if weakSelf.chromeCastManager.isMiniPlayerAdded { return } + + if weakSelf.videoPlayer.isFullScreen { + if UITraitCollection.current.verticalSizeClass == .regular { + weakSelf.videoPlayer.setFullscreen(fullscreen: false, animated: true, with: weakSelf.currentOrientation(), forceRotate: false) + } else { + weakSelf.videoPlayer.setFullscreen(fullscreen: true, animated: true, with: weakSelf.currentOrientation(), forceRotate: false) + } + } else if UITraitCollection.current.verticalSizeClass == .compact && !weakSelf.shouldCelebrationAppear { + weakSelf.videoPlayer.setFullscreen(fullscreen: true, animated: true, with: weakSelf.currentOrientation(), forceRotate: false) + } + } + } } } diff --git a/Source/WebView/ProgramsViewController.swift b/Source/WebView/ProgramsViewController.swift index 7f764fc185..ef271ba374 100644 --- a/Source/WebView/ProgramsViewController.swift +++ b/Source/WebView/ProgramsViewController.swift @@ -14,15 +14,20 @@ public enum ProgramScreen { case detail } -class ProgramsViewController: UIViewController, InterfaceOrientationOverriding, PullRefreshControllerDelegate { +class ProgramsViewController: UIViewController, InterfaceOrientationOverriding, PullRefreshControllerDelegate, ScrollableDelegateProvider { typealias Environment = OEXAnalyticsProvider & OEXConfigProvider & OEXSessionProvider & OEXRouterProvider & ReachabilityProvider & OEXStylesProvider & NetworkManagerProvider - fileprivate let environment: Environment - fileprivate let webController: AuthenticatedWebViewController + + private let environment: Environment private(set) var programsURL: URL - fileprivate let refreshController = PullRefreshController() private(set) var type: ProgramScreen + private let webController: AuthenticatedWebViewController + private let refreshController = PullRefreshController() + + weak var scrollableDelegate: ScrollableDelegate? + private var scrollByDragging = false + init(environment: Environment, programsURL: URL, viewType type: ProgramScreen? = .base) { webController = AuthenticatedWebViewController(environment: environment) self.environment = environment @@ -31,6 +36,7 @@ class ProgramsViewController: UIViewController, InterfaceOrientationOverriding, super.init(nibName: nil, bundle: nil) webController.webViewDelegate = self webController.delegate = self + webController.scrollView.delegate = self setupView() loadPrograms() } @@ -104,3 +110,19 @@ extension ProgramsViewController: WebViewNavigationDelegate { return self } } + +extension ProgramsViewController: UIScrollViewDelegate { + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + scrollByDragging = true + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + if scrollByDragging { + scrollableDelegate?.scrollViewDidScroll(scrollView: scrollView) + } + } + + func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + scrollByDragging = false + } +} diff --git a/Source/ar.lproj/Localizable-2.strings b/Source/ar.lproj/Localizable-2.strings index 79379f405f..afccc5dfcd 100644 --- a/Source/ar.lproj/Localizable-2.strings +++ b/Source/ar.lproj/Localizable-2.strings @@ -13,6 +13,22 @@ /* Continue text for aleart button titles or for other places*/ "CONTINUE_TEXT"="Continue"; +/* Find a new course button title on the course dashbaord error screen */ +"COURSE_DASHBOARD.ERROR.FIND_A_NEW_COURSE"="Find a new course"; +/* Course dashbaord loading eerror */ +"COURSE_DASHBOARD.ERROR.GENERAL_ERROR"="An error occured while loading your course"; +/* Go to my courses button title on the course dashbaord general error screen */ +"COURSE_DASHBOARD.ERROR.GO_TO_COURSES"="Go to My Courses"; +/*Error message title on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_TITLE" = "This course hasn’t started yet."; +/*Error message info on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_INFO" = "Come back {start_date} to see all your course content here."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_TITLE" = "Your access to this course has expired."; +/*Error message info on course dashboard screen when audit access expired of course or course ended*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_INFO" = "No new sessions are available at this time."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ENDED_TITLE" = "This course session has ended."; /* Label for date when course starts */ "COURSE.STARTING" = "Starts {start_date}"; /* Label for date when course end */ @@ -29,6 +45,10 @@ "COURSE.AUDIT.EXPIRED_AGO" = "Access expired {time_duaration}"; /* Course audit expired on date*/ "COURSE.AUDIT.EXPIRED_ON" = "Expired on {expiry_date}"; +/* Course Reset Date Banner Header */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Missed some deadlines? "; +/* Course Reset Date Banner Body */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Don't worry - shift our suggested schedule to complete past due assignments without losing any progress."; /*Title for Discover*/ "DISCOVER"="Discover"; /*Title for Discovery*/ @@ -43,5 +63,19 @@ "MY_COURSES"="My courses"; /*Title My programs*/ "MY_PROGRAMS"="My programs"; +/* Title text for the Home section of the course dashboard */ +"DASHBOARD.COURSE_HOME"="Home"; +/* Title for audit exipred error */ +"COURSE_DASHBOARD.ERROR.AUDIT_EXPIRED_UPGRADE_INFO"="Upgrade to get full access to this course and pursue a certificate."; +/* Title for audit title message */ +"COURSE.AUDIT_ACCESS_EXPIRED"="Access expired {expiry_date}"; +/* Enrolled courses loading error */ +"DASHBOARD.GENERAL_ERROR_MESSAGE"="An error occured while loading your courses"; +/* Enrolled courses loading error try again*/ +"DASHBOARD.TRY_AGAIN"="Try again"; +/* Course Dashboard Resume Course button title*/ +"DASHBOARD.RESUME_COURSE"="Resume course"; +/* Course outline header gated content title */ +"COURSE_OUTLINE_HEADER.GATED_CONTENT_TITLE"="Some content in this part of the course is locked for upgraded users only."; /* None option in the caption list to de select caption language*/ "NONE"="None"; diff --git a/Source/ar.lproj/Localizable.strings b/Source/ar.lproj/Localizable.strings index 185881927c..24fa5732db 100644 --- a/Source/ar.lproj/Localizable.strings +++ b/Source/ar.lproj/Localizable.strings @@ -336,10 +336,6 @@ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BODY"="مما يعني انك غير قادر ان تشارك في الواجبات المقدرة. يبدو انك فاتتك بعض المواعيد المهمة بناء على جدولنا .لتكمل الواجبات المقدرة كجزء من هذه الدورة ونقل واجبات الماضي الي المستقبل، يمكنك الترقية اليوم"; /* Course Reset Date Upgrade Reset Banner Button */ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BUTTON"="Upgrade to shift due dates"; -/* Course Reset Date Banner Header */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"=" يبدو انك فاتتك بعض المراعيد المهمة بناء على جدولنا المقترح"; -/* Course Reset Date Banner Body */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="لتبقى نفسك على المسار الصحيح، يمكنك ترقية جدولك و نقل واجبات الماضي الي المستقبل. لا تقلق لن تخسر اي تقدم فعلته عندما تنقل التواريخ المحددة"; /* Course Reset Date Banner Button */ "COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BUTTON"="تغيير المواعيد المقررة"; /* Course Dates Title */ @@ -617,7 +613,7 @@ /* Prompt shown to users on the course list encouraging them to find new courses */ "ENROLLMENT_LIST.FIND_COURSES_PROMPT" = "هل تبحثُ عن تحدٍ جديد؟"; /* Button title opening course catalog */ -"ENROLLMENT_LIST.FIND_COURSES" = "ابحث عن مساق"; +"ENROLLMENT_LIST.FIND_COURSES" = "Explore courses"; /* Error message when user is not enrolled to any course and course discovery is also disabled.*/ "ENROLLMENT_LIST.NO_ENROLLMENT" = "يبدو أنك لم تسجل في أي مساق بعد"; /* Prompt indicating user needs to enter an email address */ @@ -780,8 +776,6 @@ "PROFILE.CURRENT_LANGUAGE_LABEL" = "اللغة الحاليّة:"; /* 'Current Location' label on top row of edit country in user's profile */ "PROFILE.CURRENT_LOCATION_LABEL" = "الموقع الحالي:"; -/* Profile edit view title */ -"PROFILE.EDIT_TITLE" = "تعديل الصفحة الشخصيّة"; /* Profile screen fields visibility off info message */ "PROFILE.VISIBILITY_OFF_MESSGAE"="معلومات ملفك الشخصي مرئية لك فقط. يظهر اسم المستخدم الخاص بك فقط للآخرين على {platform_name}."; /* Accessibility label for edit profile button */ @@ -1073,7 +1067,7 @@ /*Deprecated version detail message*/ "VERSION_UPGRADE.DEPRECATED_MESSAGE" = "نسخة جديدة من التطبيق متوفرة حالياً."; /*Outdated version detail message*/ -"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "النسخة التي لديك من التطبيق لم تعُد مدعومة."; +"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "النسخة التي لديك من التطبيق لم تعُد مدعومة"; /*Outdated version alert message for login screen*/ "VERSION_UPGRADE_OUT_DATED_LOGIN_MESSAGE" = "النسخة التي لديك من التطبيق لم تعُد مدعومة. أحصل على أحدث نسخة لتسجل الدخول."; /*New version available without deadline message*/ diff --git a/Source/de.lproj/Localizable-2.strings b/Source/de.lproj/Localizable-2.strings index 79379f405f..afccc5dfcd 100644 --- a/Source/de.lproj/Localizable-2.strings +++ b/Source/de.lproj/Localizable-2.strings @@ -13,6 +13,22 @@ /* Continue text for aleart button titles or for other places*/ "CONTINUE_TEXT"="Continue"; +/* Find a new course button title on the course dashbaord error screen */ +"COURSE_DASHBOARD.ERROR.FIND_A_NEW_COURSE"="Find a new course"; +/* Course dashbaord loading eerror */ +"COURSE_DASHBOARD.ERROR.GENERAL_ERROR"="An error occured while loading your course"; +/* Go to my courses button title on the course dashbaord general error screen */ +"COURSE_DASHBOARD.ERROR.GO_TO_COURSES"="Go to My Courses"; +/*Error message title on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_TITLE" = "This course hasn’t started yet."; +/*Error message info on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_INFO" = "Come back {start_date} to see all your course content here."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_TITLE" = "Your access to this course has expired."; +/*Error message info on course dashboard screen when audit access expired of course or course ended*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_INFO" = "No new sessions are available at this time."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ENDED_TITLE" = "This course session has ended."; /* Label for date when course starts */ "COURSE.STARTING" = "Starts {start_date}"; /* Label for date when course end */ @@ -29,6 +45,10 @@ "COURSE.AUDIT.EXPIRED_AGO" = "Access expired {time_duaration}"; /* Course audit expired on date*/ "COURSE.AUDIT.EXPIRED_ON" = "Expired on {expiry_date}"; +/* Course Reset Date Banner Header */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Missed some deadlines? "; +/* Course Reset Date Banner Body */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Don't worry - shift our suggested schedule to complete past due assignments without losing any progress."; /*Title for Discover*/ "DISCOVER"="Discover"; /*Title for Discovery*/ @@ -43,5 +63,19 @@ "MY_COURSES"="My courses"; /*Title My programs*/ "MY_PROGRAMS"="My programs"; +/* Title text for the Home section of the course dashboard */ +"DASHBOARD.COURSE_HOME"="Home"; +/* Title for audit exipred error */ +"COURSE_DASHBOARD.ERROR.AUDIT_EXPIRED_UPGRADE_INFO"="Upgrade to get full access to this course and pursue a certificate."; +/* Title for audit title message */ +"COURSE.AUDIT_ACCESS_EXPIRED"="Access expired {expiry_date}"; +/* Enrolled courses loading error */ +"DASHBOARD.GENERAL_ERROR_MESSAGE"="An error occured while loading your courses"; +/* Enrolled courses loading error try again*/ +"DASHBOARD.TRY_AGAIN"="Try again"; +/* Course Dashboard Resume Course button title*/ +"DASHBOARD.RESUME_COURSE"="Resume course"; +/* Course outline header gated content title */ +"COURSE_OUTLINE_HEADER.GATED_CONTENT_TITLE"="Some content in this part of the course is locked for upgraded users only."; /* None option in the caption list to de select caption language*/ "NONE"="None"; diff --git a/Source/de.lproj/Localizable.strings b/Source/de.lproj/Localizable.strings index eadd054e82..56eaf2765a 100644 --- a/Source/de.lproj/Localizable.strings +++ b/Source/de.lproj/Localizable.strings @@ -320,10 +320,6 @@ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BODY"="was bedeutet, dass Sie nicht an benoteten Aufgaben teilnehmen können. Es sieht so aus, als ob Sie einige wichtige Fristen verpasst haben, basierend auf unserem vorgeschlagenen Zeitplan. Um benotete Aufgaben im Rahmen dieses Kurses abzuschließen und überfällige Aufgaben in die Zukunft zu verschieben, können Sie noch heute ein Upgrade durchführen."; /* Course Reset Date Upgrade Reset Banner Button */ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BUTTON"="Upgrade to shift due dates"; -/* Course Reset Date Banner Header */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Es sieht so aus, als ob Sie einige wichtige, auf unserem vorgeschlagenen Zeitplan basierende Fristen verpasst haben. "; -/* Course Reset Date Banner Body */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Um den Zeitplan einzuhalten, können Sie ihn aktualisieren und die überfälligen Aufgaben in die Zukunft verschieben. Keine Sorge – Sie verlieren keinen Ihrer Fortschritte, wenn Sie Ihre Fälligkeitstermine verschieben."; /* Course Reset Date Banner Button */ "COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BUTTON"="Fälligkeitstermine verschieben"; /* Course Dates Title */ @@ -569,7 +565,7 @@ /* Prompt shown to users on the course list encouraging them to find new courses */ "ENROLLMENT_LIST.FIND_COURSES_PROMPT" = "Suchen Sie nach eine neuen Herausforderung?"; /* Button title opening course catalog */ -"ENROLLMENT_LIST.FIND_COURSES" = "Einen Kurs finden"; +"ENROLLMENT_LIST.FIND_COURSES" = "Explore courses"; /* Error message when user is not enrolled to any course and course discovery is also disabled.*/ "ENROLLMENT_LIST.NO_ENROLLMENT" = "Es scheint, als wären Sie noch in keinem Kurs eingeschrieben."; /* Prompt indicating user needs to enter an email address */ @@ -732,8 +728,6 @@ "PROFILE.CURRENT_LANGUAGE_LABEL" = "Aktuelle Sprache:"; /* 'Current Location' label on top row of edit country in user's profile */ "PROFILE.CURRENT_LOCATION_LABEL" = "Derzeitiger Standort:"; -/* Profile edit view title */ -"PROFILE.EDIT_TITLE" = "Profil bearbeiten"; /* Profile screen fields visibility off info message */ "PROFILE.VISIBILITY_OFF_MESSGAE"="Ihre Profilinformationen sind nur für Sie sichtbar. Nur Ihr Benutzername ist für andere auf {platform_name} sichtbar."; /* Accessibility label for edit profile button */ @@ -1009,7 +1003,7 @@ /*Deprecated version detail message*/ "VERSION_UPGRADE.DEPRECATED_MESSAGE" = "Es ist eine neue Version der App verfügbar."; /*Outdated version detail message*/ -"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Ihre Version der App wird nicht weiter unterstützt."; +"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Ihre Version der App wird nicht weiter unterstützt"; /*Outdated version alert message for login screen*/ "VERSION_UPGRADE_OUT_DATED_LOGIN_MESSAGE" = "Ihre Version der App wird nicht weiter unterstützt. Aktualisieren Sie auf die letzte Version, um sich anzumelden."; /*New version available without deadline message*/ diff --git a/Source/en.lproj/Localizable-2.strings b/Source/en.lproj/Localizable-2.strings index 79379f405f..7f3b9bf272 100644 --- a/Source/en.lproj/Localizable-2.strings +++ b/Source/en.lproj/Localizable-2.strings @@ -13,6 +13,22 @@ /* Continue text for aleart button titles or for other places*/ "CONTINUE_TEXT"="Continue"; +/* Find a new course button title on the course dashbaord error screen */ +"COURSE_DASHBOARD.ERROR.FIND_A_NEW_COURSE"="Find a new course"; +/* Course dashbaord loading eerror */ +"COURSE_DASHBOARD.ERROR.GENERAL_ERROR"="An error occured while loading your course"; +/* Go to my courses button title on the course dashbaord general error screen */ +"COURSE_DASHBOARD.ERROR.GO_TO_COURSES"="Go to My Courses"; +/*Error message title on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_TITLE" = "This course hasn’t started yet."; +/*Error message info on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_INFO" = "Come back {start_date} to see all your course content here."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_TITLE" = "Your access to this course has expired."; +/*Error message info on course dashboard screen when audit access expired of course or course ended*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_INFO" = "No new sessions are available at this time."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ENDED_TITLE" = "This course session has ended."; /* Label for date when course starts */ "COURSE.STARTING" = "Starts {start_date}"; /* Label for date when course end */ @@ -29,10 +45,6 @@ "COURSE.AUDIT.EXPIRED_AGO" = "Access expired {time_duaration}"; /* Course audit expired on date*/ "COURSE.AUDIT.EXPIRED_ON" = "Expired on {expiry_date}"; -/*Title for Discover*/ -"DISCOVER"="Discover"; -/*Title for Discovery*/ -"EXPLORE_THE_CATALOG"="Explore the catalog"; /*Title for dialog when user is leaving the app when tapped on link to be opened in external browser*/ "LEAVING_APP_TITLE"="Leaving the app"; /* Message for dialog when user is leaving the app when tapped on link to be opened in external browser */ @@ -43,5 +55,23 @@ "MY_COURSES"="My courses"; /*Title My programs*/ "MY_PROGRAMS"="My programs"; +/*Title for Discovery*/ +"EXPLORE_THE_CATALOG"="Explore the catalog"; +/*Title for Discover*/ +"DISCOVER"="Discover"; +/* Title text for the Home section of the course dashboard */ +"DASHBOARD.COURSE_HOME"="Home"; +/* Title for audit exipred error */ +"COURSE_DASHBOARD.ERROR.AUDIT_EXPIRED_UPGRADE_INFO"="Upgrade to get full access to this course and pursue a certificate."; +/* Title for audit title message */ +"COURSE.AUDIT_ACCESS_EXPIRED"="Access expired {expiry_date}"; +/* Enrolled courses loading error */ +"DASHBOARD.GENERAL_ERROR_MESSAGE"="An error occured while loading your courses"; +/* Enrolled courses loading error try again*/ +"DASHBOARD.TRY_AGAIN"="Try again"; +/* Course Dashboard Resume Course button title*/ +"DASHBOARD.RESUME_COURSE"="Resume course"; +/* Course outline header gated content title */ +"COURSE_OUTLINE_HEADER.GATED_CONTENT_TITLE"="Some content in this part of the course is locked for upgraded users only."; /* None option in the caption list to de select caption language*/ "NONE"="None"; diff --git a/Source/en.lproj/Localizable.strings b/Source/en.lproj/Localizable.strings index bdbfcd6f45..43f7e55896 100644 --- a/Source/en.lproj/Localizable.strings +++ b/Source/en.lproj/Localizable.strings @@ -321,9 +321,9 @@ /* Course Reset Date Upgrade Reset Banner Button */ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BUTTON"="Upgrade to shift due dates"; /* Course Reset Date Banner Header */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="It looks like you missed some important deadlines based on our suggested schedule. "; +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Missed some deadlines?"; /* Course Reset Date Banner Body */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="To keep yourself on track, you can update this schedule and shift the past due assignments into the future. Don’t worry—you won’t lose any of the progress you’ve made when you shift your due dates."; +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Don't worry - shift our suggested schedule to complete past due assignments without losing any progress."; /* Course Reset Date Banner Button */ "COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BUTTON"="Shift due dates"; /* Course Dates Title */ @@ -569,7 +569,7 @@ /* Prompt shown to users on the course list encouraging them to find new courses */ "ENROLLMENT_LIST.FIND_COURSES_PROMPT" = "Looking for a new challenge?"; /* Button title opening course catalog */ -"ENROLLMENT_LIST.FIND_COURSES" = "Find a course"; +"ENROLLMENT_LIST.FIND_COURSES" = "Explore courses"; /* Error message when user is not enrolled to any course and course discovery is also disabled.*/ "ENROLLMENT_LIST.NO_ENROLLMENT" = "It looks like you are not enrolled in any courses yet."; /* Prompt indicating user needs to enter an email address */ @@ -732,8 +732,6 @@ "PROFILE.CURRENT_LANGUAGE_LABEL" = "Current language:"; /* 'Current Location' label on top row of edit country in user's profile */ "PROFILE.CURRENT_LOCATION_LABEL" = "Current location:"; -/* Profile edit view title */ -"PROFILE.EDIT_TITLE" = "Edit profile"; /* Profile screen fields visibility off info message */ "PROFILE.VISIBILITY_OFF_MESSGAE"="Your profile information is only visible to you. Only your username is visible to others on {platform_name}."; /* Accessibility label for edit profile button */ @@ -1011,7 +1009,7 @@ /*Deprecated version detail message*/ "VERSION_UPGRADE.DEPRECATED_MESSAGE" = "A new version of the app is available."; /*Outdated version detail message*/ -"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Your version of the app is no longer supported."; +"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Your version of the app is no longer supported"; /*Outdated version alert message for login screen*/ "VERSION_UPGRADE_OUT_DATED_LOGIN_MESSAGE" = "Your version of the app is no longer supported. Update to the latest version to login."; /*New version available without deadline message*/ diff --git a/Source/es-419.lproj/Localizable-2.strings b/Source/es-419.lproj/Localizable-2.strings index 79379f405f..afccc5dfcd 100644 --- a/Source/es-419.lproj/Localizable-2.strings +++ b/Source/es-419.lproj/Localizable-2.strings @@ -13,6 +13,22 @@ /* Continue text for aleart button titles or for other places*/ "CONTINUE_TEXT"="Continue"; +/* Find a new course button title on the course dashbaord error screen */ +"COURSE_DASHBOARD.ERROR.FIND_A_NEW_COURSE"="Find a new course"; +/* Course dashbaord loading eerror */ +"COURSE_DASHBOARD.ERROR.GENERAL_ERROR"="An error occured while loading your course"; +/* Go to my courses button title on the course dashbaord general error screen */ +"COURSE_DASHBOARD.ERROR.GO_TO_COURSES"="Go to My Courses"; +/*Error message title on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_TITLE" = "This course hasn’t started yet."; +/*Error message info on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_INFO" = "Come back {start_date} to see all your course content here."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_TITLE" = "Your access to this course has expired."; +/*Error message info on course dashboard screen when audit access expired of course or course ended*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_INFO" = "No new sessions are available at this time."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ENDED_TITLE" = "This course session has ended."; /* Label for date when course starts */ "COURSE.STARTING" = "Starts {start_date}"; /* Label for date when course end */ @@ -29,6 +45,10 @@ "COURSE.AUDIT.EXPIRED_AGO" = "Access expired {time_duaration}"; /* Course audit expired on date*/ "COURSE.AUDIT.EXPIRED_ON" = "Expired on {expiry_date}"; +/* Course Reset Date Banner Header */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Missed some deadlines? "; +/* Course Reset Date Banner Body */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Don't worry - shift our suggested schedule to complete past due assignments without losing any progress."; /*Title for Discover*/ "DISCOVER"="Discover"; /*Title for Discovery*/ @@ -43,5 +63,19 @@ "MY_COURSES"="My courses"; /*Title My programs*/ "MY_PROGRAMS"="My programs"; +/* Title text for the Home section of the course dashboard */ +"DASHBOARD.COURSE_HOME"="Home"; +/* Title for audit exipred error */ +"COURSE_DASHBOARD.ERROR.AUDIT_EXPIRED_UPGRADE_INFO"="Upgrade to get full access to this course and pursue a certificate."; +/* Title for audit title message */ +"COURSE.AUDIT_ACCESS_EXPIRED"="Access expired {expiry_date}"; +/* Enrolled courses loading error */ +"DASHBOARD.GENERAL_ERROR_MESSAGE"="An error occured while loading your courses"; +/* Enrolled courses loading error try again*/ +"DASHBOARD.TRY_AGAIN"="Try again"; +/* Course Dashboard Resume Course button title*/ +"DASHBOARD.RESUME_COURSE"="Resume course"; +/* Course outline header gated content title */ +"COURSE_OUTLINE_HEADER.GATED_CONTENT_TITLE"="Some content in this part of the course is locked for upgraded users only."; /* None option in the caption list to de select caption language*/ "NONE"="None"; diff --git a/Source/es-419.lproj/Localizable.strings b/Source/es-419.lproj/Localizable.strings index c2bec81a9a..868ad6ba5d 100644 --- a/Source/es-419.lproj/Localizable.strings +++ b/Source/es-419.lproj/Localizable.strings @@ -320,10 +320,6 @@ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BODY"="lo que significa que no puedes participar en tareas calificadas. Parece que no cumpliste con algunos plazos importantes según nuestro calendario sugerido. Para completar las asignaciones calificadas como parte de este curso y cambiar las asignaciones vencidas al futuro, puedes cambiarte a la opción paga."; /* Course Reset Date Upgrade Reset Banner Button */ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BUTTON"="Cambiate a la opción paga para poder cambiar fechas de entrega"; -/* Course Reset Date Banner Header */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Parece que no has cumplido con algunos plazos importantes según nuestro calendario sugerido."; -/* Course Reset Date Banner Body */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Para mantenerte en el camino adecuado, puedes actualizar este calendario y mover las tareas vencidas hacia el futuro. No te preocupes, no perderás nada de lo que hayas avanzado cuando cambies las fechas de entrega."; /* Course Reset Date Banner Button */ "COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BUTTON"="Cambia las fechas de entrega"; /* Course Dates Title */ @@ -569,7 +565,7 @@ /* Prompt shown to users on the course list encouraging them to find new courses */ "ENROLLMENT_LIST.FIND_COURSES_PROMPT" = "¿Buscando un nuevo desafío?"; /* Button title opening course catalog */ -"ENROLLMENT_LIST.FIND_COURSES" = "Encuentre un curso"; +"ENROLLMENT_LIST.FIND_COURSES" = "Explore courses"; /* Error message when user is not enrolled to any course and course discovery is also disabled.*/ "ENROLLMENT_LIST.NO_ENROLLMENT" = "Parece que todavía no está inscrito en ningún curso."; /* Prompt indicating user needs to enter an email address */ @@ -732,8 +728,6 @@ "PROFILE.CURRENT_LANGUAGE_LABEL" = "Idioma actual:"; /* 'Current Location' label on top row of edit country in user's profile */ "PROFILE.CURRENT_LOCATION_LABEL" = "Ubicación actual:"; -/* Profile edit view title */ -"PROFILE.EDIT_TITLE" = "Editar perfil"; /* Profile screen fields visibility off info message */ "PROFILE.VISIBILITY_OFF_MESSGAE"="Your profile information is only visible to you. Only your username is visible to others on {platform_name}."; /* Accessibility label for edit profile button */ @@ -1015,7 +1009,7 @@ /*Deprecated version detail message*/ "VERSION_UPGRADE.DEPRECATED_MESSAGE" = "Una versión nueva de la app está disponible."; /*Outdated version detail message*/ -"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Su versión de la app ya no está soportada."; +"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Su versión de la app ya no está soportada"; /*Outdated version alert message for login screen*/ "VERSION_UPGRADE_OUT_DATED_LOGIN_MESSAGE" = "Su versión de la aplicación ya no es compatible. Actualice a la última versión para iniciar sesión."; /*New version available without deadline message*/ diff --git a/Source/fr.lproj/Localizable-2.strings b/Source/fr.lproj/Localizable-2.strings index 79379f405f..27d88652b3 100644 --- a/Source/fr.lproj/Localizable-2.strings +++ b/Source/fr.lproj/Localizable-2.strings @@ -13,6 +13,22 @@ /* Continue text for aleart button titles or for other places*/ "CONTINUE_TEXT"="Continue"; +/* Find a new course button title on the course dashbaord error screen */ +"COURSE_DASHBOARD.ERROR.FIND_A_NEW_COURSE"="Find a new course"; +/* Course dashbaord loading eerror */ +"COURSE_DASHBOARD.ERROR.GENERAL_ERROR"="An error occured while loading your course"; +/* Go to my courses button title on the course dashbaord general error screen */ +"COURSE_DASHBOARD.ERROR.GO_TO_COURSES"="Go to My Courses"; +/*Error message title on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_TITLE" = "This course hasn’t started yet."; +/*Error message info on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_INFO" = "Come back {start_date} to see all your course content here."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_TITLE" = "Your access to this course has expired."; +/*Error message info on course dashboard screen when audit access expired of course or course ended*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_INFO" = "No new sessions are available at this time."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ENDED_TITLE" = "This course session has ended."; /* Label for date when course starts */ "COURSE.STARTING" = "Starts {start_date}"; /* Label for date when course end */ @@ -29,10 +45,10 @@ "COURSE.AUDIT.EXPIRED_AGO" = "Access expired {time_duaration}"; /* Course audit expired on date*/ "COURSE.AUDIT.EXPIRED_ON" = "Expired on {expiry_date}"; -/*Title for Discover*/ -"DISCOVER"="Discover"; -/*Title for Discovery*/ -"EXPLORE_THE_CATALOG"="Explore the catalog"; +/* Course Reset Date Banner Header */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Missed some deadlines? "; +/* Course Reset Date Banner Body */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Don't worry - shift our suggested schedule to complete past due assignments without losing any progress."; /*Title for dialog when user is leaving the app when tapped on link to be opened in external browser*/ "LEAVING_APP_TITLE"="Leaving the app"; /* Message for dialog when user is leaving the app when tapped on link to be opened in external browser */ @@ -43,5 +59,23 @@ "MY_COURSES"="My courses"; /*Title My programs*/ "MY_PROGRAMS"="My programs"; +/*Title for Discovery*/ +"EXPLORE_THE_CATALOG"="Explore the catalog"; +/*Title for Discover*/ +"DISCOVER"="Discover"; +/* Title text for the Home section of the course dashboard */ +"DASHBOARD.COURSE_HOME"="Home"; +/* Title for audit exipred error */ +"COURSE_DASHBOARD.ERROR.AUDIT_EXPIRED_UPGRADE_INFO"="Upgrade to get full access to this course and pursue a certificate."; +/* Title for audit title message */ +"COURSE.AUDIT_ACCESS_EXPIRED"="Access expired {expiry_date}"; +/* Enrolled courses loading error */ +"DASHBOARD.GENERAL_ERROR_MESSAGE"="An error occured while loading your courses"; +/* Enrolled courses loading error try again*/ +"DASHBOARD.TRY_AGAIN"="Try again"; +/* Course Dashboard Resume Course button title*/ +"DASHBOARD.RESUME_COURSE"="Resume course"; +/* Course outline header gated content title */ +"COURSE_OUTLINE_HEADER.GATED_CONTENT_TITLE"="Some content in this part of the course is locked for upgraded users only."; /* None option in the caption list to de select caption language*/ "NONE"="None"; diff --git a/Source/fr.lproj/Localizable.strings b/Source/fr.lproj/Localizable.strings index 24287686c0..d3eb51f33c 100644 --- a/Source/fr.lproj/Localizable.strings +++ b/Source/fr.lproj/Localizable.strings @@ -320,10 +320,6 @@ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BODY"="ce qui signifie que vous ne pouvez pas participer aux devoirs notés. Il semblerait que vous ayez manqué des échéances importantes de notre programme suggéré. Pour faire les devoirs notés dans le cadre de ce cours et pouvoir rendre les devoirs passés un peu plus tard, vous pouvez mettre à niveau votre inscription dès aujourd'hui."; /* Course Reset Date Upgrade Reset Banner Button */ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BUTTON"="Upgrade to shift due dates"; -/* Course Reset Date Banner Header */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Il semblerait que vous ayez manqué des échéances importantes de notre programme suggéré. "; -/* Course Reset Date Banner Body */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Pour rester sur la bonne voie, vous pouvez mettre à jour ce programme et rendre les devoirs passés un peu plus tard. Ne vous inquiétez pas : en modifiant les échéances, vous ne perdrez pas les progrès que vous avez faits."; /* Course Reset Date Banner Button */ "COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BUTTON"="Déplacer les dates d'échéances"; /* Course Dates Title */ @@ -569,7 +565,7 @@ /* Prompt shown to users on the course list encouraging them to find new courses */ "ENROLLMENT_LIST.FIND_COURSES_PROMPT" = "À la recherche d'un nouveau challenge?"; /* Button title opening course catalog */ -"ENROLLMENT_LIST.FIND_COURSES" = "Trouver un cours"; +"ENROLLMENT_LIST.FIND_COURSES" = "Explore courses"; /* Error message when user is not enrolled to any course and course discovery is also disabled.*/ "ENROLLMENT_LIST.NO_ENROLLMENT" = "Vous n'êtes inscrit à aucun cours."; /* Prompt indicating user needs to enter an email address */ @@ -732,8 +728,6 @@ "PROFILE.CURRENT_LANGUAGE_LABEL" = "Langue actuelle:"; /* 'Current Location' label on top row of edit country in user's profile */ "PROFILE.CURRENT_LOCATION_LABEL" = "Lieu actuel:"; -/* Profile edit view title */ -"PROFILE.EDIT_TITLE" = "Modifier le profil"; /* Profile screen fields visibility off info message */ "PROFILE.VISIBILITY_OFF_MESSGAE"="Les informations sur votre profil ne sont visibles que par vous. Seul votre nom d'utilisateur est visible par les autres sur {platform_name}."; /* Accessibility label for edit profile button */ @@ -1009,7 +1003,7 @@ /*Deprecated version detail message*/ "VERSION_UPGRADE.DEPRECATED_MESSAGE" = "Une nouvelle version est disponible."; /*Outdated version detail message*/ -"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Votre version n'est plus supportée."; +"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Votre version n'est plus supportée"; /*Outdated version alert message for login screen*/ "VERSION_UPGRADE_OUT_DATED_LOGIN_MESSAGE" = "Votre version n'est plus supportée. Mettez à jour avec la dernière version pour vous connecter."; /*New version available without deadline message*/ diff --git a/Source/he.lproj/Localizable-2.strings b/Source/he.lproj/Localizable-2.strings index 79379f405f..27d88652b3 100644 --- a/Source/he.lproj/Localizable-2.strings +++ b/Source/he.lproj/Localizable-2.strings @@ -13,6 +13,22 @@ /* Continue text for aleart button titles or for other places*/ "CONTINUE_TEXT"="Continue"; +/* Find a new course button title on the course dashbaord error screen */ +"COURSE_DASHBOARD.ERROR.FIND_A_NEW_COURSE"="Find a new course"; +/* Course dashbaord loading eerror */ +"COURSE_DASHBOARD.ERROR.GENERAL_ERROR"="An error occured while loading your course"; +/* Go to my courses button title on the course dashbaord general error screen */ +"COURSE_DASHBOARD.ERROR.GO_TO_COURSES"="Go to My Courses"; +/*Error message title on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_TITLE" = "This course hasn’t started yet."; +/*Error message info on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_INFO" = "Come back {start_date} to see all your course content here."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_TITLE" = "Your access to this course has expired."; +/*Error message info on course dashboard screen when audit access expired of course or course ended*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_INFO" = "No new sessions are available at this time."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ENDED_TITLE" = "This course session has ended."; /* Label for date when course starts */ "COURSE.STARTING" = "Starts {start_date}"; /* Label for date when course end */ @@ -29,10 +45,10 @@ "COURSE.AUDIT.EXPIRED_AGO" = "Access expired {time_duaration}"; /* Course audit expired on date*/ "COURSE.AUDIT.EXPIRED_ON" = "Expired on {expiry_date}"; -/*Title for Discover*/ -"DISCOVER"="Discover"; -/*Title for Discovery*/ -"EXPLORE_THE_CATALOG"="Explore the catalog"; +/* Course Reset Date Banner Header */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Missed some deadlines? "; +/* Course Reset Date Banner Body */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Don't worry - shift our suggested schedule to complete past due assignments without losing any progress."; /*Title for dialog when user is leaving the app when tapped on link to be opened in external browser*/ "LEAVING_APP_TITLE"="Leaving the app"; /* Message for dialog when user is leaving the app when tapped on link to be opened in external browser */ @@ -43,5 +59,23 @@ "MY_COURSES"="My courses"; /*Title My programs*/ "MY_PROGRAMS"="My programs"; +/*Title for Discovery*/ +"EXPLORE_THE_CATALOG"="Explore the catalog"; +/*Title for Discover*/ +"DISCOVER"="Discover"; +/* Title text for the Home section of the course dashboard */ +"DASHBOARD.COURSE_HOME"="Home"; +/* Title for audit exipred error */ +"COURSE_DASHBOARD.ERROR.AUDIT_EXPIRED_UPGRADE_INFO"="Upgrade to get full access to this course and pursue a certificate."; +/* Title for audit title message */ +"COURSE.AUDIT_ACCESS_EXPIRED"="Access expired {expiry_date}"; +/* Enrolled courses loading error */ +"DASHBOARD.GENERAL_ERROR_MESSAGE"="An error occured while loading your courses"; +/* Enrolled courses loading error try again*/ +"DASHBOARD.TRY_AGAIN"="Try again"; +/* Course Dashboard Resume Course button title*/ +"DASHBOARD.RESUME_COURSE"="Resume course"; +/* Course outline header gated content title */ +"COURSE_OUTLINE_HEADER.GATED_CONTENT_TITLE"="Some content in this part of the course is locked for upgraded users only."; /* None option in the caption list to de select caption language*/ "NONE"="None"; diff --git a/Source/he.lproj/Localizable.strings b/Source/he.lproj/Localizable.strings index 7db3ebfcbb..ae23b1a2c2 100644 --- a/Source/he.lproj/Localizable.strings +++ b/Source/he.lproj/Localizable.strings @@ -328,10 +328,6 @@ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BODY"="מה שאומר שאינך יכול להשתתף במטלות מדורגות. נראה שהחמצת כמה מועדים חשובים בהתבסס על לוח הזמנים המוצע שלנו. כדי להשלים מטלות מדורגות כחלק מהקורס הזה ולהעביר את המטלות שנקבעו בעבר אל העתיד, אתה יכול לשדרג היום."; /* Course Reset Date Upgrade Reset Banner Button */ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BUTTON"="Upgrade to shift due dates"; -/* Course Reset Date Banner Header */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="נראה שהחמצת כמה מועדים חשובים בהתבסס על לוח הזמנים המוצע שלנו. "; -/* Course Reset Date Banner Body */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="כדי לשמור על עצמכם על המסלול, תוכלו לעדכן את לוח הזמנים הזה ולהעביר את ההקצאות שהוגשו לעתיד. אל דאגה - לא תאבד שום התקדמות שהשגת כאשר תשנה את תאריכי היעד שלך."; /* Course Reset Date Banner Button */ "COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BUTTON"="תאריכי יעד של משמרת"; /* Course Dates Title */ @@ -589,7 +585,7 @@ /* Prompt shown to users on the course list encouraging them to find new courses */ "ENROLLMENT_LIST.FIND_COURSES_PROMPT" = "מחפשים אתגר חדש?"; /* Button title opening course catalog */ -"ENROLLMENT_LIST.FIND_COURSES" = "מצא קורס"; +"ENROLLMENT_LIST.FIND_COURSES" = "Explore courses"; /* Error message when user is not enrolled to any course and course discovery is also disabled.*/ "ENROLLMENT_LIST.NO_ENROLLMENT" = "נראה שאתם עדיין לא רשומים בשום קורס."; /* Prompt indicating user needs to enter an email address */ @@ -750,8 +746,6 @@ "PROFILE.CURRENT_LANGUAGE_LABEL" = "שפה נוכחית:"; /* 'Current Location' label on top row of edit country in user's profile */ "PROFILE.CURRENT_LOCATION_LABEL" = "מיקום נוכחי:"; -/* Profile edit view title */ -"PROFILE.EDIT_TITLE" = "ערוך פרופיל"; /* Profile screen fields visibility off info message */ "PROFILE.VISIBILITY_OFF_MESSGAE"="פרטי הפרופיל שלך גלויים רק לך. רק שם המשתמש שלך גלוי לאחרים ב-{platform_name}."; /* Accessibility label for edit profile button */ @@ -1035,7 +1029,7 @@ /*Deprecated version detail message*/ "VERSION_UPGRADE.DEPRECATED_MESSAGE" = "גרסה חדשה של האפליקציה זמינה להורדה."; /*Outdated version detail message*/ -"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "גרסת האפליקציה שברשותך לא נתמכת עוד."; +"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "גרסת האפליקציה שברשותך לא נתמכת עוד"; /*Outdated version alert message for login screen*/ "VERSION_UPGRADE_OUT_DATED_LOGIN_MESSAGE" = "גרסת האפליקציה שברשותכם אינה נתמכת עוד. עדכנו לגרסה האחרונה כדי להיכנס."; /*New version available without deadline message*/ diff --git a/Source/ja.lproj/Localizable-2.strings b/Source/ja.lproj/Localizable-2.strings index 48721ee964..14bd0ab70b 100644 --- a/Source/ja.lproj/Localizable-2.strings +++ b/Source/ja.lproj/Localizable-2.strings @@ -13,6 +13,24 @@ /* Continue text for aleart button titles or for other places*/ "CONTINUE_TEXT"="Continue"; +/* Find a new course button title on the course dashbaord error screen */ +"COURSE_DASHBOARD.ERROR.FIND_A_NEW_COURSE"="Find a new course"; +/* Course dashbaord loading eerror */ +"COURSE_DASHBOARD.ERROR.GENERAL_ERROR"="An error occured while loading your course"; +/* Go to my courses button title on the course dashbaord general error screen */ +"COURSE_DASHBOARD.ERROR.GO_TO_COURSES"="Go to My Courses"; +/*Error message title on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_TITLE" = "This course hasn’t started yet."; +/*Error message info on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_INFO" = "Come back {start_date} to see all your course content here."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_TITLE" = "Your access to this course has expired."; +/*Error message info on course dashboard screen when audit access expired of course or course ended*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_INFO" = "No new sessions are available at this time."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ENDED_TITLE" = "This course session has ended."; +/*Title for Discover*/ +"DISCOVER"="Discover"; /* Label for date when course starts */ "COURSE.STARTING" = "Starts {start_date}"; /* Label for date when course end */ @@ -29,10 +47,10 @@ "COURSE.AUDIT.EXPIRED_AGO" = "Access expired {time_duaration}"; /* Course audit expired on date*/ "COURSE.AUDIT.EXPIRED_ON" = "Expired on {expiry_date}"; -/*Title for Discover*/ -"DISCOVER"="Discovery"; -/*Title for Discovery*/ -"EXPLORE_THE_CATALOG"="Explore the catalog"; +/* Course Reset Date Banner Header */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Missed some deadlines? "; +/* Course Reset Date Banner Body */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Don't worry - shift our suggested schedule to complete past due assignments without losing any progress."; /*Title for dialog when user is leaving the app when tapped on link to be opened in external browser*/ "LEAVING_APP_TITLE"="Leaving the app"; /* Message for dialog when user is leaving the app when tapped on link to be opened in external browser */ @@ -43,5 +61,23 @@ "MY_COURSES"="My courses"; /*Title My programs*/ "MY_PROGRAMS"="My programs"; +/*Title for Discovery*/ +"EXPLORE_THE_CATALOG"="Explore the catalog"; +/*Title for Discover*/ +"DISCOVER"="Discovery"; +/* Title text for the Home section of the course dashboard */ +"DASHBOARD.COURSE_HOME"="Home"; +/* Title for audit exipred error */ +"COURSE_DASHBOARD.ERROR.AUDIT_EXPIRED_UPGRADE_INFO"="Upgrade to get full access to this course and pursue a certificate."; +/* Title for audit title message */ +"COURSE.AUDIT_ACCESS_EXPIRED"="Access expired {expiry_date}"; +/* Enrolled courses loading error */ +"DASHBOARD.GENERAL_ERROR_MESSAGE"="An error occured while loading your courses"; +/* Enrolled courses loading error try again*/ +"DASHBOARD.TRY_AGAIN"="Try again"; +/* Course Dashboard Resume Course button title*/ +"DASHBOARD.RESUME_COURSE"="Resume course"; +/* Course outline header gated content title */ +"COURSE_OUTLINE_HEADER.GATED_CONTENT_TITLE"="Some content in this part of the course is locked for upgraded users only."; /* None option in the caption list to de select caption language*/ "NONE"="None"; diff --git a/Source/ja.lproj/Localizable.strings b/Source/ja.lproj/Localizable.strings index e79d007c88..40a07b01ef 100644 --- a/Source/ja.lproj/Localizable.strings +++ b/Source/ja.lproj/Localizable.strings @@ -316,10 +316,6 @@ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BODY"="採点対象の課題には参加できません。推奨スケジュールにある重要な期限が守られなかったようです。このコースで採点対象の課題を完了し、過去の期限付き課題を未来日付に移動させるには、アップグレードしてください。"; /* Course Reset Date Upgrade Reset Banner Button */ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BUTTON"="Upgrade to shift due dates"; -/* Course Reset Date Banner Header */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="推奨スケジュールにある重要な期限が守られなかったようです。"; -/* Course Reset Date Banner Body */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="このスケジュールを更新し、過去の課題を未来日付に移動させることで、学習を計画通りに進めることができます。期限をずらしてもこれまでの進捗が失われることはありませんので、ご安心ください。"; /* Course Reset Date Banner Button */ "COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BUTTON"="期限を移動"; /* Course Dates Title */ @@ -560,7 +556,7 @@ /* Prompt shown to users on the course list encouraging them to find new courses */ "ENROLLMENT_LIST.FIND_COURSES_PROMPT" = "新しいチャレンジを探していますか?"; /* Button title opening course catalog */ -"ENROLLMENT_LIST.FIND_COURSES" = "講座を探す"; +"ENROLLMENT_LIST.FIND_COURSES" = "Explore courses"; /* Error message when user is not enrolled to any course and course discovery is also disabled.*/ "ENROLLMENT_LIST.NO_ENROLLMENT" = "あなたはまだどの講座にも受講登録をしていないようです。"; /* Prompt indicating user needs to enter an email address */ diff --git a/Source/pt-BR.lproj/Localizable-2.strings b/Source/pt-BR.lproj/Localizable-2.strings index 79379f405f..27d88652b3 100644 --- a/Source/pt-BR.lproj/Localizable-2.strings +++ b/Source/pt-BR.lproj/Localizable-2.strings @@ -13,6 +13,22 @@ /* Continue text for aleart button titles or for other places*/ "CONTINUE_TEXT"="Continue"; +/* Find a new course button title on the course dashbaord error screen */ +"COURSE_DASHBOARD.ERROR.FIND_A_NEW_COURSE"="Find a new course"; +/* Course dashbaord loading eerror */ +"COURSE_DASHBOARD.ERROR.GENERAL_ERROR"="An error occured while loading your course"; +/* Go to my courses button title on the course dashbaord general error screen */ +"COURSE_DASHBOARD.ERROR.GO_TO_COURSES"="Go to My Courses"; +/*Error message title on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_TITLE" = "This course hasn’t started yet."; +/*Error message info on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_INFO" = "Come back {start_date} to see all your course content here."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_TITLE" = "Your access to this course has expired."; +/*Error message info on course dashboard screen when audit access expired of course or course ended*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_INFO" = "No new sessions are available at this time."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ENDED_TITLE" = "This course session has ended."; /* Label for date when course starts */ "COURSE.STARTING" = "Starts {start_date}"; /* Label for date when course end */ @@ -29,10 +45,10 @@ "COURSE.AUDIT.EXPIRED_AGO" = "Access expired {time_duaration}"; /* Course audit expired on date*/ "COURSE.AUDIT.EXPIRED_ON" = "Expired on {expiry_date}"; -/*Title for Discover*/ -"DISCOVER"="Discover"; -/*Title for Discovery*/ -"EXPLORE_THE_CATALOG"="Explore the catalog"; +/* Course Reset Date Banner Header */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Missed some deadlines? "; +/* Course Reset Date Banner Body */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Don't worry - shift our suggested schedule to complete past due assignments without losing any progress."; /*Title for dialog when user is leaving the app when tapped on link to be opened in external browser*/ "LEAVING_APP_TITLE"="Leaving the app"; /* Message for dialog when user is leaving the app when tapped on link to be opened in external browser */ @@ -43,5 +59,23 @@ "MY_COURSES"="My courses"; /*Title My programs*/ "MY_PROGRAMS"="My programs"; +/*Title for Discovery*/ +"EXPLORE_THE_CATALOG"="Explore the catalog"; +/*Title for Discover*/ +"DISCOVER"="Discover"; +/* Title text for the Home section of the course dashboard */ +"DASHBOARD.COURSE_HOME"="Home"; +/* Title for audit exipred error */ +"COURSE_DASHBOARD.ERROR.AUDIT_EXPIRED_UPGRADE_INFO"="Upgrade to get full access to this course and pursue a certificate."; +/* Title for audit title message */ +"COURSE.AUDIT_ACCESS_EXPIRED"="Access expired {expiry_date}"; +/* Enrolled courses loading error */ +"DASHBOARD.GENERAL_ERROR_MESSAGE"="An error occured while loading your courses"; +/* Enrolled courses loading error try again*/ +"DASHBOARD.TRY_AGAIN"="Try again"; +/* Course Dashboard Resume Course button title*/ +"DASHBOARD.RESUME_COURSE"="Resume course"; +/* Course outline header gated content title */ +"COURSE_OUTLINE_HEADER.GATED_CONTENT_TITLE"="Some content in this part of the course is locked for upgraded users only."; /* None option in the caption list to de select caption language*/ "NONE"="None"; diff --git a/Source/pt-BR.lproj/Localizable.strings b/Source/pt-BR.lproj/Localizable.strings index 2df9f9f8a5..9a16b39e84 100644 --- a/Source/pt-BR.lproj/Localizable.strings +++ b/Source/pt-BR.lproj/Localizable.strings @@ -321,10 +321,6 @@ Se você não conseguir acompanhar tudo nas datas sugeridas, você poderá ajust "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BODY"="o que significa que você não pode participar em avaliações. Para completar avaliações como uma parte deste curso, faça o upgrade hoje. Parece que você perdeu alguns prazos importantes baseados em nossa programação sugerida. Para completar avaliações como parte deste curso e adiar tarefas já atrasadas, faça o upgrade hoje."; /* Course Reset Date Upgrade Reset Banner Button */ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BUTTON"="Upgrade to shift due dates"; -/* Course Reset Date Banner Header */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Parece que você perdeu alguns prazos importantes baseados em nossa programação sugerida. "; -/* Course Reset Date Banner Body */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Para se ficar em dia, você pode atualizar esta programação e adiar as tarefas já atrasadas. Não se preocupe – você não perderá o progresso já feito."; /* Course Reset Date Banner Button */ "COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BUTTON"="Alterar datas de entrega"; /* Course Dates Title */ @@ -570,7 +566,7 @@ Se você não conseguir acompanhar tudo nas datas sugeridas, você poderá ajust /* Prompt shown to users on the course list encouraging them to find new courses */ "ENROLLMENT_LIST.FIND_COURSES_PROMPT" = "À procura de novos desafios?"; /* Button title opening course catalog */ -"ENROLLMENT_LIST.FIND_COURSES" = "Encontre um Curso"; +"ENROLLMENT_LIST.FIND_COURSES" = "Explore courses"; /* Error message when user is not enrolled to any course and course discovery is also disabled.*/ "ENROLLMENT_LIST.NO_ENROLLMENT" = "Parece que você não se inscreveu em nenhum curso ainda."; /* Prompt indicating user needs to enter an email address */ @@ -733,8 +729,6 @@ Se você não conseguir acompanhar tudo nas datas sugeridas, você poderá ajust "PROFILE.CURRENT_LANGUAGE_LABEL" = "Idioma atual:"; /* 'Current Location' label on top row of edit country in user's profile */ "PROFILE.CURRENT_LOCATION_LABEL" = "Local atual:"; -/* Profile edit view title */ -"PROFILE.EDIT_TITLE" = "Editar perfil"; /* Profile screen fields visibility off info message */ "PROFILE.VISIBILITY_OFF_MESSGAE"="As informações do seu perfil só ficam visíveis para você. Somente seu nome de usuário pode ser visto por outros usuários no {platform_name}."; /* Accessibility label for edit profile button */ @@ -1010,7 +1004,7 @@ Se você não conseguir acompanhar tudo nas datas sugeridas, você poderá ajust /*Deprecated version detail message*/ "VERSION_UPGRADE.DEPRECATED_MESSAGE" = "Uma nova versão do aplicativo está disponível."; /*Outdated version detail message*/ -"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "A versão do seu aplicativo não é mais compatível. "; +"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "A versão do seu aplicativo não é mais compatível"; /*Outdated version alert message for login screen*/ "VERSION_UPGRADE_OUT_DATED_LOGIN_MESSAGE" = "A versão do seu aplicativa não é mais compativel. Atualize para a última versão para entrar. "; /*New version available without deadline message*/ diff --git a/Source/tr.lproj/Localizable-2.strings b/Source/tr.lproj/Localizable-2.strings index 79379f405f..27d88652b3 100644 --- a/Source/tr.lproj/Localizable-2.strings +++ b/Source/tr.lproj/Localizable-2.strings @@ -13,6 +13,22 @@ /* Continue text for aleart button titles or for other places*/ "CONTINUE_TEXT"="Continue"; +/* Find a new course button title on the course dashbaord error screen */ +"COURSE_DASHBOARD.ERROR.FIND_A_NEW_COURSE"="Find a new course"; +/* Course dashbaord loading eerror */ +"COURSE_DASHBOARD.ERROR.GENERAL_ERROR"="An error occured while loading your course"; +/* Go to my courses button title on the course dashbaord general error screen */ +"COURSE_DASHBOARD.ERROR.GO_TO_COURSES"="Go to My Courses"; +/*Error message title on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_TITLE" = "This course hasn’t started yet."; +/*Error message info on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_INFO" = "Come back {start_date} to see all your course content here."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_TITLE" = "Your access to this course has expired."; +/*Error message info on course dashboard screen when audit access expired of course or course ended*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_INFO" = "No new sessions are available at this time."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ENDED_TITLE" = "This course session has ended."; /* Label for date when course starts */ "COURSE.STARTING" = "Starts {start_date}"; /* Label for date when course end */ @@ -29,10 +45,10 @@ "COURSE.AUDIT.EXPIRED_AGO" = "Access expired {time_duaration}"; /* Course audit expired on date*/ "COURSE.AUDIT.EXPIRED_ON" = "Expired on {expiry_date}"; -/*Title for Discover*/ -"DISCOVER"="Discover"; -/*Title for Discovery*/ -"EXPLORE_THE_CATALOG"="Explore the catalog"; +/* Course Reset Date Banner Header */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Missed some deadlines? "; +/* Course Reset Date Banner Body */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Don't worry - shift our suggested schedule to complete past due assignments without losing any progress."; /*Title for dialog when user is leaving the app when tapped on link to be opened in external browser*/ "LEAVING_APP_TITLE"="Leaving the app"; /* Message for dialog when user is leaving the app when tapped on link to be opened in external browser */ @@ -43,5 +59,23 @@ "MY_COURSES"="My courses"; /*Title My programs*/ "MY_PROGRAMS"="My programs"; +/*Title for Discovery*/ +"EXPLORE_THE_CATALOG"="Explore the catalog"; +/*Title for Discover*/ +"DISCOVER"="Discover"; +/* Title text for the Home section of the course dashboard */ +"DASHBOARD.COURSE_HOME"="Home"; +/* Title for audit exipred error */ +"COURSE_DASHBOARD.ERROR.AUDIT_EXPIRED_UPGRADE_INFO"="Upgrade to get full access to this course and pursue a certificate."; +/* Title for audit title message */ +"COURSE.AUDIT_ACCESS_EXPIRED"="Access expired {expiry_date}"; +/* Enrolled courses loading error */ +"DASHBOARD.GENERAL_ERROR_MESSAGE"="An error occured while loading your courses"; +/* Enrolled courses loading error try again*/ +"DASHBOARD.TRY_AGAIN"="Try again"; +/* Course Dashboard Resume Course button title*/ +"DASHBOARD.RESUME_COURSE"="Resume course"; +/* Course outline header gated content title */ +"COURSE_OUTLINE_HEADER.GATED_CONTENT_TITLE"="Some content in this part of the course is locked for upgraded users only."; /* None option in the caption list to de select caption language*/ "NONE"="None"; diff --git a/Source/tr.lproj/Localizable.strings b/Source/tr.lproj/Localizable.strings index c3756e8656..db0ca02095 100644 --- a/Source/tr.lproj/Localizable.strings +++ b/Source/tr.lproj/Localizable.strings @@ -320,10 +320,6 @@ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BODY"="dolayısıyla notlu ödevlere katılamazsınız. Önerilen programımıza göre bazı önemli son tarihleri kaçırmışsınız gibi görünüyor. Bu kursun parçası olarak notlu ödevler tamamlamak ve tarihi geçmiş ödevleri geleceğe taşımak için bugün yükseltme yapabilirsiniz."; /* Course Reset Date Upgrade Reset Banner Button */ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BUTTON"="Upgrade to shift due dates"; -/* Course Reset Date Banner Header */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Önerilen programımıza göre bazı önemli son tarihleri kaçırmışsınız gibi görünüyor. "; -/* Course Reset Date Banner Body */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Plana uygun kalmak için bu programı güncelleyebilir ve tarihi geçmiş ödevleri geleceğe taşıyabilirsiniz. Endişelenmeyin, bitiş tarihlerinizi değiştirdiğinizde ilerlemenizin hiçbir kısmını kaybetmeyeceksiniz."; /* Course Reset Date Banner Button */ "COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BUTTON"="Bitiş tarihlerini değiştir"; /* Course Dates Title */ @@ -569,7 +565,7 @@ /* Prompt shown to users on the course list encouraging them to find new courses */ "ENROLLMENT_LIST.FIND_COURSES_PROMPT" = "Yeni bir maceraya hazır mısın?"; /* Button title opening course catalog */ -"ENROLLMENT_LIST.FIND_COURSES" = "Bir ders bul"; +"ENROLLMENT_LIST.FIND_COURSES" = "Explore courses"; /* Error message when user is not enrolled to any course and course discovery is also disabled.*/ "ENROLLMENT_LIST.NO_ENROLLMENT" = "Henüz herhangi bir derse kayıt yaptırmamış gözüküyorsunuz."; /* Prompt indicating user needs to enter an email address */ @@ -732,8 +728,6 @@ "PROFILE.CURRENT_LANGUAGE_LABEL" = "Şu anki dil:"; /* 'Current Location' label on top row of edit country in user's profile */ "PROFILE.CURRENT_LOCATION_LABEL" = "Şu anki konum:"; -/* Profile edit view title */ -"PROFILE.EDIT_TITLE" = "Profili düzenle"; /* Profile screen fields visibility off info message */ "PROFILE.VISIBILITY_OFF_MESSGAE"="Profil bilgileriniz yalnızca size görünür. {platform_name} üzerinde yalnızca kullanıcı adınız başkalarına görünür olur."; /* Accessibility label for edit profile button */ @@ -1009,9 +1003,9 @@ /*Deprecated version detail message*/ "VERSION_UPGRADE.DEPRECATED_MESSAGE" = "Uygulamanın yeni bir sürümü mevcut."; /*Outdated version detail message*/ -"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Uygulamanızın bu sürümü artık desteklenmiyor."; +"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Uygulamanızın bu sürümü artık desteklenmiyor"; /*Outdated version alert message for login screen*/ -"VERSION_UPGRADE_OUT_DATED_LOGIN_MESSAGE" = "Uygulamanızın bu sürümü artık desteklenmiyor. Giriş yapmak için en son sürüme güncelleyin."; +"VERSION_UPGRADE_OUT_DATED_LOGIN_MESSAGE" = "Uygulamanızın bu sürümü artık desteklenmiyor. Giriş yapmak için en son sürüme güncelleyin"; /*New version available without deadline message*/ "VERSION_UPGRADE.NEW_VERSION_AVAILABLE" = "Uygulamanın yeni bir sürümü mevcut."; /*Video player remaining time default value*/ diff --git a/Source/vi.lproj/Localizable-2.strings b/Source/vi.lproj/Localizable-2.strings index 79379f405f..27d88652b3 100644 --- a/Source/vi.lproj/Localizable-2.strings +++ b/Source/vi.lproj/Localizable-2.strings @@ -13,6 +13,22 @@ /* Continue text for aleart button titles or for other places*/ "CONTINUE_TEXT"="Continue"; +/* Find a new course button title on the course dashbaord error screen */ +"COURSE_DASHBOARD.ERROR.FIND_A_NEW_COURSE"="Find a new course"; +/* Course dashbaord loading eerror */ +"COURSE_DASHBOARD.ERROR.GENERAL_ERROR"="An error occured while loading your course"; +/* Go to my courses button title on the course dashbaord general error screen */ +"COURSE_DASHBOARD.ERROR.GO_TO_COURSES"="Go to My Courses"; +/*Error message title on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_TITLE" = "This course hasn’t started yet."; +/*Error message info on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_INFO" = "Come back {start_date} to see all your course content here."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_TITLE" = "Your access to this course has expired."; +/*Error message info on course dashboard screen when audit access expired of course or course ended*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_INFO" = "No new sessions are available at this time."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ENDED_TITLE" = "This course session has ended."; /* Label for date when course starts */ "COURSE.STARTING" = "Starts {start_date}"; /* Label for date when course end */ @@ -29,10 +45,10 @@ "COURSE.AUDIT.EXPIRED_AGO" = "Access expired {time_duaration}"; /* Course audit expired on date*/ "COURSE.AUDIT.EXPIRED_ON" = "Expired on {expiry_date}"; -/*Title for Discover*/ -"DISCOVER"="Discover"; -/*Title for Discovery*/ -"EXPLORE_THE_CATALOG"="Explore the catalog"; +/* Course Reset Date Banner Header */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Missed some deadlines? "; +/* Course Reset Date Banner Body */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Don't worry - shift our suggested schedule to complete past due assignments without losing any progress."; /*Title for dialog when user is leaving the app when tapped on link to be opened in external browser*/ "LEAVING_APP_TITLE"="Leaving the app"; /* Message for dialog when user is leaving the app when tapped on link to be opened in external browser */ @@ -43,5 +59,23 @@ "MY_COURSES"="My courses"; /*Title My programs*/ "MY_PROGRAMS"="My programs"; +/*Title for Discovery*/ +"EXPLORE_THE_CATALOG"="Explore the catalog"; +/*Title for Discover*/ +"DISCOVER"="Discover"; +/* Title text for the Home section of the course dashboard */ +"DASHBOARD.COURSE_HOME"="Home"; +/* Title for audit exipred error */ +"COURSE_DASHBOARD.ERROR.AUDIT_EXPIRED_UPGRADE_INFO"="Upgrade to get full access to this course and pursue a certificate."; +/* Title for audit title message */ +"COURSE.AUDIT_ACCESS_EXPIRED"="Access expired {expiry_date}"; +/* Enrolled courses loading error */ +"DASHBOARD.GENERAL_ERROR_MESSAGE"="An error occured while loading your courses"; +/* Enrolled courses loading error try again*/ +"DASHBOARD.TRY_AGAIN"="Try again"; +/* Course Dashboard Resume Course button title*/ +"DASHBOARD.RESUME_COURSE"="Resume course"; +/* Course outline header gated content title */ +"COURSE_OUTLINE_HEADER.GATED_CONTENT_TITLE"="Some content in this part of the course is locked for upgraded users only."; /* None option in the caption list to de select caption language*/ "NONE"="None"; diff --git a/Source/vi.lproj/Localizable.strings b/Source/vi.lproj/Localizable.strings index 27cf6b5dea..09389327a8 100644 --- a/Source/vi.lproj/Localizable.strings +++ b/Source/vi.lproj/Localizable.strings @@ -316,10 +316,6 @@ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BODY"="điều này có nghĩa là bạn không thể tham gia vào các bài tập chấm điểm. Có vẻ như bạn đã bỏ lỡ một số hạn chót quan trọng dựa trên lịch biểu gợi ý của chúng tôi. Để hoàn thành các bài tập chấm điểm thuộc khóa học này và di chuyển các bài tập đã quá hạn đến tương lai, bạn có thể nâng cấp hôm nay."; /* Course Reset Date Upgrade Reset Banner Button */ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BUTTON"="Upgrade to shift due dates"; -/* Course Reset Date Banner Header */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Có vẻ như bạn đã bỏ lỡ một số hạn chót quan trọng dựa trên lịch biểu gợi ý của chúng tôi. "; -/* Course Reset Date Banner Body */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"=" Để duy trì đúng hướng đi, bạn có thể cập nhật lịch biểu này và di chuyển các bài tập đã quá hạn đến tương lai. Đừng lo lắng—bạn sẽ không mất bất kỳ tiến bộ nào mà bạn đã đạt được khi di chuyển ngày đến hạn."; /* Course Reset Date Banner Button */ "COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BUTTON"="Di chuyển ngày đến hạn"; /* Course Dates Title */ @@ -555,7 +551,7 @@ /* Prompt shown to users on the course list encouraging them to find new courses */ "ENROLLMENT_LIST.FIND_COURSES_PROMPT" = "Tìm kiếm thử thách mới?"; /* Button title opening course catalog */ -"ENROLLMENT_LIST.FIND_COURSES" = "Tìm khóa học"; +"ENROLLMENT_LIST.FIND_COURSES" = "Explore courses"; /* Error message when user is not enrolled to any course and course discovery is also disabled.*/ "ENROLLMENT_LIST.NO_ENROLLMENT" = "Có vẻ như bạn chưa tham gia khóa học nào."; /* Prompt indicating user needs to enter an email address */ @@ -718,8 +714,6 @@ "PROFILE.CURRENT_LANGUAGE_LABEL" = "Ngôn ngữ hiện tại: "; /* 'Current Location' label on top row of edit country in user's profile */ "PROFILE.CURRENT_LOCATION_LABEL" = "Địa điểm hiện tại: "; -/* Profile edit view title */ -"PROFILE.EDIT_TITLE" = "Chỉnh sửa hồ sơ"; /* Profile screen fields visibility off info message */ "PROFILE.VISIBILITY_OFF_MESSGAE"="Thông tin hồ sơ của bạn chỉ hiển thị trước bạn. Chỉ có tên người dùng của bạn mới hiển thị trước những người khác trên {platform_name}."; /* Accessibility label for edit profile button */ @@ -991,7 +985,7 @@ /*Deprecated version detail message*/ "VERSION_UPGRADE.DEPRECATED_MESSAGE" = "Ứng dụng đã có phiên bản mới hơn."; /*Outdated version detail message*/ -"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Phiên bản hiện tại của ứng dụng không còn được hỗ trợ."; +"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "Phiên bản hiện tại của ứng dụng không còn được hỗ trợ"; /*Outdated version alert message for login screen*/ "VERSION_UPGRADE_OUT_DATED_LOGIN_MESSAGE" = "Phiên bản hiện tại của ứng dụng không còn được hỗ trợ. Cập nhật lên phiên bản mới nhất để đăng nhập."; /*New version available without deadline message*/ diff --git a/Source/zh-Hans.lproj/Localizable-2.strings b/Source/zh-Hans.lproj/Localizable-2.strings index 79379f405f..27d88652b3 100644 --- a/Source/zh-Hans.lproj/Localizable-2.strings +++ b/Source/zh-Hans.lproj/Localizable-2.strings @@ -13,6 +13,22 @@ /* Continue text for aleart button titles or for other places*/ "CONTINUE_TEXT"="Continue"; +/* Find a new course button title on the course dashbaord error screen */ +"COURSE_DASHBOARD.ERROR.FIND_A_NEW_COURSE"="Find a new course"; +/* Course dashbaord loading eerror */ +"COURSE_DASHBOARD.ERROR.GENERAL_ERROR"="An error occured while loading your course"; +/* Go to my courses button title on the course dashbaord general error screen */ +"COURSE_DASHBOARD.ERROR.GO_TO_COURSES"="Go to My Courses"; +/*Error message title on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_TITLE" = "This course hasn’t started yet."; +/*Error message info on course dashboard screen for course yet to start*/ +"COURSE_DASHBOARD.ERROR.COURSE_NOT_STARTED_INFO" = "Come back {start_date} to see all your course content here."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_TITLE" = "Your access to this course has expired."; +/*Error message info on course dashboard screen when audit access expired of course or course ended*/ +"COURSE_DASHBOARD.ERROR.COURSE_ACCESS_EXPIRED_INFO" = "No new sessions are available at this time."; +/*Error message title on course dashboard screen when audit access of course*/ +"COURSE_DASHBOARD.ERROR.COURSE_ENDED_TITLE" = "This course session has ended."; /* Label for date when course starts */ "COURSE.STARTING" = "Starts {start_date}"; /* Label for date when course end */ @@ -29,10 +45,10 @@ "COURSE.AUDIT.EXPIRED_AGO" = "Access expired {time_duaration}"; /* Course audit expired on date*/ "COURSE.AUDIT.EXPIRED_ON" = "Expired on {expiry_date}"; -/*Title for Discover*/ -"DISCOVER"="Discover"; -/*Title for Discovery*/ -"EXPLORE_THE_CATALOG"="Explore the catalog"; +/* Course Reset Date Banner Header */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="Missed some deadlines? "; +/* Course Reset Date Banner Body */ +"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="Don't worry - shift our suggested schedule to complete past due assignments without losing any progress."; /*Title for dialog when user is leaving the app when tapped on link to be opened in external browser*/ "LEAVING_APP_TITLE"="Leaving the app"; /* Message for dialog when user is leaving the app when tapped on link to be opened in external browser */ @@ -43,5 +59,23 @@ "MY_COURSES"="My courses"; /*Title My programs*/ "MY_PROGRAMS"="My programs"; +/*Title for Discovery*/ +"EXPLORE_THE_CATALOG"="Explore the catalog"; +/*Title for Discover*/ +"DISCOVER"="Discover"; +/* Title text for the Home section of the course dashboard */ +"DASHBOARD.COURSE_HOME"="Home"; +/* Title for audit exipred error */ +"COURSE_DASHBOARD.ERROR.AUDIT_EXPIRED_UPGRADE_INFO"="Upgrade to get full access to this course and pursue a certificate."; +/* Title for audit title message */ +"COURSE.AUDIT_ACCESS_EXPIRED"="Access expired {expiry_date}"; +/* Enrolled courses loading error */ +"DASHBOARD.GENERAL_ERROR_MESSAGE"="An error occured while loading your courses"; +/* Enrolled courses loading error try again*/ +"DASHBOARD.TRY_AGAIN"="Try again"; +/* Course Dashboard Resume Course button title*/ +"DASHBOARD.RESUME_COURSE"="Resume course"; +/* Course outline header gated content title */ +"COURSE_OUTLINE_HEADER.GATED_CONTENT_TITLE"="Some content in this part of the course is locked for upgraded users only."; /* None option in the caption list to de select caption language*/ "NONE"="None"; diff --git a/Source/zh-Hans.lproj/Localizable.strings b/Source/zh-Hans.lproj/Localizable.strings index b10eef97d0..1139f82528 100644 --- a/Source/zh-Hans.lproj/Localizable.strings +++ b/Source/zh-Hans.lproj/Localizable.strings @@ -316,10 +316,6 @@ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BODY"="这意味着你不能参加分级作业。根据我们建议的日程安排,您似乎错过了一些重要的截止日期。要完成本课程一部分的分级作业,并将过去到期的作业转移到未来,您可以今天进行功能升级。"; /* Course Reset Date Upgrade Reset Banner Button */ "COURSEDATES.RESET_DATE.UPGRADE_TO_RESET_BANNER.BUTTON"="Upgrade to shift due dates"; -/* Course Reset Date Banner Header */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.HEADER"="根据我们建议的日程安排,您似乎错过了一些重要的截止日期。"; -/* Course Reset Date Banner Body */ -"COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BODY"="为了让自己赶上进程,您可以更新此计划并将过期的任务转移到未来。不要担心,当你改变你的截止日期时,你不会失去你已经取得的任何过程记录。"; /* Course Reset Date Banner Button */ "COURSEDATES.RESET_DATE.RESET_DATE_BANNER.BUTTON"="改变截止日期"; /* Course Dates Title */ @@ -553,7 +549,7 @@ /* Prompt shown to users on the course list encouraging them to find new courses */ "ENROLLMENT_LIST.FIND_COURSES_PROMPT" = "寻找新的挑战?"; /* Button title opening course catalog */ -"ENROLLMENT_LIST.FIND_COURSES" = "发现课程"; +"ENROLLMENT_LIST.FIND_COURSES" = "Explore courses"; /* Error message when user is not enrolled to any course and course discovery is also disabled.*/ "ENROLLMENT_LIST.NO_ENROLLMENT" = "您还没有加入任何课程。"; /* Prompt indicating user needs to enter an email address */ @@ -716,8 +712,6 @@ "PROFILE.CURRENT_LANGUAGE_LABEL" = "当前语言:"; /* 'Current Location' label on top row of edit country in user's profile */ "PROFILE.CURRENT_LOCATION_LABEL" = "当前位置:"; -/* Profile edit view title */ -"PROFILE.EDIT_TITLE" = "编辑资料"; /* Profile screen fields visibility off info message */ "PROFILE.VISIBILITY_OFF_MESSGAE"="你的属性信息只能由你浏览。对于{paltform_name}上的其他用户只显示你的用户名。"; /* Accessibility label for edit profile button */ @@ -989,7 +983,7 @@ /*Deprecated version detail message*/ "VERSION_UPGRADE.DEPRECATED_MESSAGE" = "应用程序有新版本可用。"; /*Outdated version detail message*/ -"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "不支持您的新版本。"; +"VERSION_UPGRADE.OUT_DATED_MESSAGE" = "不支持您的新版本"; /*Outdated version alert message for login screen*/ "VERSION_UPGRADE_OUT_DATED_LOGIN_MESSAGE" = "您的应用版本不再受支持。请更新到最新版本后再登录。"; /*New version available without deadline message*/ diff --git a/Test/Snapshots/edXTests.CourseDashboardViewControllerTests/testCertificate_ios14_375x667@2x.png b/Test/Snapshots/edXTests.CourseDashboardViewControllerTests/testCertificate_ios14_375x667@2x.png index ae709f371ded53fa369f285b5743f7ea88737e7f..34e1847a3c75b0afe4fad431b3060cddda6adede 100644 GIT binary patch delta 223210 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

DIjhjo^6@$dec8WhXyM)!@HA=ZX(j@D9lO7qGsC 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

$xMb(| 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�|@@+?-I1y>66*&IoiziuV_N8 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�d#`-r>$JD^98f<0K01hks|DCW)R<+%vB2PNp=Wc%-KR_!y0*qEQ7 z`HTPl#Gmfh4UoX(ut$v*71lDX|9Xw?5nZBAa=g4euxMC;HuJXTR#MH;iI;~ELQ4QY zK@N$~De9pm3vwT9GTZ%52+*@Ah3Pz%EOs06;D)XcKAS!z(Eh)PvX+C=`fO>?bxBAd zzANI%A}wNNqO8`@NgAQnz&+IMEOb~F8%~Trv>P+Ie`9W@q%8hAd5|+ZnGt@zm5exb zbMRQZ<{R#OmH>k*N)uxt59tO1CLI>JjhcQfCkchrZL(TZ*^>bwnc-B>esV=djJC%c zA5c!K80>n6tIw#A@9x}j{5xvKq)Fcsb3OmHS*xx`=%uFRxeU&h_^ZG$Cj2|V{WP{k zBfWkHrx3s-X)MV9-1AOTJ#pd{5qI`M?o}lJ%CoWBUFUcIPl_DF$+h)>lSH^Pxh@MM8w$}Y{P2mJO;`Y{7o?HUW12!eaXU7?N6bUZu`KcB;J!P zb9d4(Hl0n~*J-C2LRNqli$_ZL^%Y0)J2eK%jC}LIJ+h*b+aw2Jdh6dQ{?I_OcwbJp z)CNTK+KQ&gvje;Hk_S_w9WOdowsScl3xnD%t7Mx?eKk8z*`+|wzZ?!d3OzsM;!!5% zB>v;V*@eJ&S6O7PZu>dPklr5gH$Aa{>pA{lA0IMEtWo1948eQ(3gDeg?IE?d*d?&ykMhVa`u1 zdf1?O=E%>rUzn9(_5>Q?wgByjfuJ$h;wI3!aY$edWbX6L+S zhl7^VxBgxA2xoFyJ&voiT_BHnd?YkiNiX-Lc@F3EzqWEt5=ZwH}P&G9~ApuzDv8s$-NlV`WQ7XN=o+ZV7Z0lW-WA zzA^*}o@ulZB;01N>1+!*#~gEC7`U^|RXeNTpr4Egupb(idpc-vUb9JlA^IX6A3K^@ zg`uh=H@@u(^$3@RyF6?36H6GoR3N)|tAXZ+Q+fAe5C&x zn%E#0Y*Xhk?YHDoKMsvu2vg@`C$K?{aOb|J^lTJ|lvx;f#Ms;PxwS@w+qRpja4;_K zxH&~mOs0R@A@T6b?M4(i`DNCok76IDDl*G?_)~hlK!xe2#O* zGQUu7x#@3y4S;uJD)ZhU`8$g%s$jpdyk6bT3=Z~AD+noOV(+F)VS>Sr>)n28M7wi49zqy_Don%r-w3KL zM#e!ikx?&8_dxto@ju<-UN3ntCbIT?Ugy`&X=RDt%DqsCk-Ur|l(GxMi|YMn%UY4v z09w3#=JM}wWF($`!WuT_jt|_rXYO!fqoRmiRT=De*DIxARBTN;4a^a0S@x#y`U%9}_!}KgI3%_+8levarrS71ghA6E#{5cJKuqhet{$AA2&CS69kp z#kt~#EFZBi6heq&^$qO9C3lvW!fo0CtYh$r60}y8=SMX|a9s=%kDlyrL1t#HIj2U# z+fM_X*z^50z@wKg2TwiH$v8@ytm&%}`_VJb92DI5fJ9t6{ylZvXXSFIvJat}Fs!7+ ztS7$zu4kkw0gYq14D*`FxuY75N6msZgW_fk$3?oBEFBmVHGN0da}`VpG%8F_Zq2=KU}U45#~hb#3oXU{2ot8OWp6A}4XMpa1fXho5OkVKVt&b}LCQlU}HckvT z@rfPgL`8v_>(Lpqwrll%F_=EyLW$BXI(}<$nH6zy2F`0-&;2+{ym=#gvgPVxmT-!u z@Z@~7aWcXS9tZIAobb;qVkY;BF&XLvBqXdeXlX2>y{T7{E*-%Y$6PWr3X!*ydG(rX z%L@bVzMi*TNrP>6fB?vsP+wNl)E!iR_am8C))m8T?l$wjD#5Ye33jOKzdVpGM@X_W zi%K^~_E>U?8t+-X`@-Y$Tc{NEx$sOqbO{|&R#;lFcC081 zt>u{er0NR{@&3apye+D-*&V*5vHLliyLHNya9f2A0YWKhl#2RO@=}2#baI*r`RErl zTspDxfH_DZ5vH(KQcJL!xqLdfK+gwDsMKSE!_fwl^e4S={9;0qro;yqZ?m!oBxt;? ze#x)NBALcY1q|t!Np|+zTLG2fd76#wS7(X24}eUXlxp?$3x?f6yY*i$ef47$Wh0Yr zJ#o6Wa*KMY+W1ON8hxnnd2t$BKAN+!_VuH$ltil7br+^XqfGRqB0N+bBM{XBcTqhF z>>G)!;-7uYx!}oNDLw15(5Dqs9L}1^wi%yWvESwdI<~pea3%Qz?kE(pPuSdRP4^Io zBmr8?L9|JTJX#3Ki-OxM4F9VecUa28+|Dg)W^bvxv}Va&%e4@zwtLg|7g=i7QO4Ng zu0EK-W3ey7D4RRnAv|f7oQgG* z!f{k6)s^z_HOHn(GZJEl_k=7`;t(Vpq3I-F{Yb%l^ezd4OFmb|lC+mKG|YI0H&hgR zw3^T4RX)b;PSM3kd8h;jcyDeod)LTY?PS}D_>G6B1^B5`1I_&HbYA7n;S%xyI_yvP zstmOl5pMA+gls}(s{y}Y)bB}Ijiu0T0;qwxO(J4t9^JVc_j4}G*{gd(ctYI6)^=r6 z1+^jREg^G#=cGH@$3I{FrvT_2eZ0BAH|5FuE3bq}0Hp{^QxAmACumnptk=*_si=J4yD!a0Wm*f&2aOx-t^9 zqU-V7JUe3s6hycDV5Or*-QLvMD1nf4&h4N*KsaQ})IE}09;{psV@5CB>b-V{`Ef$6 zC5?1QPMMPo|6{U%?G=hmhS=}$zSqYjkFfX1aHiqOgYf61Z%Cjghjl6fEiNFV<3>2k zFr30)x)^oTz9;uw7!Vi}Z+f!2EsOwj<=je=(a2NT$tTJPcC3ZUCR~ERj4!7B6)?U( zIw-LNO1RE8h>l9yL$R#R?;L8`>~{Rsqi;8*-_u)~7xARcQZu=H_v1NAO%Qalbl}s= zcA16Ol9sqib{X_#TrY>adnp){U)MKDc8XSINQVZ3+T8Bb1CgI=60N)iadQfOE0iZJ zf<$Higfuw!yOV#i);mm$p-~b--jHAB4o?8cB~v!7&o22^_;8D+yDY6Z1hNR+Yz7%! z!b_d*IR|HG<^^h=sYzB({8>o8QK0gfx)=zp2_Z|G#y#$Iw`Qsxv_ zNgfwkNMPM#Z~I4!k_6+3HQx>gv(-m}r35dP=q%s21o zN9-7lQUP6?`(&_}q2rWE0ykXT8FIsin-6FuCY_6iHJ{ zjmJA&uEX7GR&^~t!$`8)mW+aZw}feda&LF$?J9c3@XzWwlf&cWTLiH$gj*jO66cPj zL@eCZTX40<^Y+bH(S{f&j(O7s4pv0icO!df{*A%Lo#l3h>4&e#SssI;hLpT8HZVDQ zfQQ;Q|A3~7`hR@mf3%>=q5GU?TR`OBqvqFpp-sA@QisZv2U6g8&$FtcFWogApe)3R%`I4mb?|0|$iEV@EE| zqA!3Q#HxDUj&o@()>Cy+T;})%&vlRCs@&c5G$DI@hL&Os>9P zcZ%Oc7Judy^!ePgTdqv#UrytH^aX)DY5ALWxl)SgKtS1yxoyrWjj=gji5InQG(Tm zB3}t9Wqna|l0h^9FV;*gTV^*>in?$iA9n+2cT3>aU_SSD3}eYa>ECRt_ts4x4^4 z5KpS!pekFw_3o1#aa&8d-m8STw5B#uxy3gQDW<+v4e}(wqw`I<{Gmvb+s@dbd2Xs= z%2<{uK@1c$)|TEkHyoy_UW}RQRrG>=OtpO|rV#0K8*_i#_Aq9DBpo}_olWbWuP;F9c?qJCyl&Ez`=Ixp=`dxR?;SwXG zw>@w6=tBUfBJ{x&jYdk)idl1~o&)~i^L`On#UXn-W@ysOYwm;edYJb4;k4U*7%JI0 zjTvB@46ho|gN1u|G2F{%+jZGAM&xL!pN*_{_WBzekex-fey2smXdwd@$?Ud6((%fd zWD+XOvDxh#I>b(<$)vV_ERdkk_XjE3gWqgB3IJB&rb$MSdp`BR0T~U|(csbig~Ugd z+fP=uHr-ye{TNa`ZQ0x`%3+1>(`k7ds|x8x=y6nHK!Cgkos*H1>0!-qIvm1 z&S3WDnc0dv{v;6<5=~P^h9oIGK(e=dg_j9Y6|>U28eD%AK~<60l*<0 zO^1^~&4h(W884M2wh4fXTZ2rurkVHWdeRcb9cRJ0U5oxTdW*NCewyOwUBO#p30Nz$jD;p%`Bz$?0m#R84>S9#s zRs){>(xSFf0HeN%3xhqq8o&BVgP~9X^)I>~vkTry&i$O`2D1QWRgM>K_IpDdzqe`ma&_v#BZze!(o;`mYftS3;f zrjhf`5{tb;dMmM02G765zl`Vmfxqacj2l65?1PgxTf>X7N8gl<&a+Ao^QSWxN1KitOK&WTLqC{Ax{v2WW3MY%h$^3Y z46`j~9^8SQe8|Nq+3o9p-aRF=XpYjiEpk+53iG*+!&hq}y8}1cPe64FNvP5&E_e@@ z1;;syu>qX+i|6wKIS5t%oc|)TrB*Vf_@KB~*mhXhB}3TV>DfI|CP*;{C6@Z| zwOEmwFqP^ZGS9r9v$^KzF{g;#g;%vkUfqwJvF@8@|R9rhhP=8cw%u#M*jTsw_^TyGcbI|ZzktU@1kV% zLRL<)S_VKi&5sz3bW4b{;k-U}{FX@$U+8YsQN(kfpB;yLC%+ZCu9i9((JQj^w{nlR zkxLf;T5Ta*Z+OHd4}rN`b%Ln2#Rc@+^dy|>Ie zo&}#oBW8)wDnf(^@z#YJ7uxev5N6+3!Y=4{{-OBcgVbA^&mX>;_K#7OgFN-Zm``1oN@5|GfmlJykn`hM;4%@$wI^ z*hQrt%0L--_ea;pNQ^02^1EP}&Rzh+9Sh}$H?x!DgcI6xjj!m8M@4h*9cg6J;T~f$}NxyZbzp= zXBf5VBW-7?)jv0e^o|mi=x0|E6*hkih=kEF-#t@u1zPb#Qb`rBGhTMml?qTZ=8cKDuAdb z^OJ4;Z7!R=ks#Yw^T+%zM%q<=7{gi4oZknrPrK~g zfq2Vi>BnN|`wi` zIKicQ^V8yxfNt1|g<$H$anxHIyVU|q&tn~lM8Wk?ch?ze3o z3%uFQ$J;fRD2@mTnWWagX%t+aTPun!kq!M4TU6C)zObGyP;cOH#4pPtto@s^YtuZd zzOk|BzcO!?TL~Oq&vY4?Zn@J)=2QE{h{;M@plr3J950t=nxd5 zynS;UaI$Dc%TsxBinYn)-@jU32kJx5YoRzXmTODJ8s929AjPHdW@$mKnuPn!UBtZ> zm2Ms2v@53<6CG73ngGlBdd~e3%Ap&Q-Ra`+R(?Mvpx+91)h<<$PNz$|r8Ehp1fr_t zwKIYs3-iuuwAT^WopZbcDO2B=Ica4J7}hnYpr^i(3!6SrZ?i#0eecfOndN$5IbK93 zgo8;d;O%2;w6c8Y9$d&P%ibb~u1wRek72Ikx)5O(6U3aSYCz z+;|2oyu?MghaGK_)^;k{*>sdyJ*>Tq64}Mar5+(OhQRWwQMQiuvB~7dC{vw`&|z=J zKNiz-pIVG6?|5UX0|%7FsVg-5xi4F}A{GU68>~*EP-?$sI3cR2hNr4no*ZXgD=TWC zo~O?^qJjE5o5b%V{LDYs`bYzJx4Lx^W zKN9O~kts!$Olp;M88G(OP)hV7Zj=pQXECc5%w-2J)YPpkmdfF41w*pO@H2m7q+KUx zU&jgi_DwB`u9ub_vGcx#UCJE|?OtCsMp(OfM%X3mAT1enc+}RvGh}1Z0x%x?z|H-2 zr?|>vu`8zClMO0A)8P;$ahKk@hNr~2B}e>75QG<-)aon~pTjOYhi2fqY#pnSee)#P z;23{^clA%FPG7_xwZ2N;8qG)uSRFh23x{^8siR$2(Z$KERSr+k>Ew&iRVry4og_x!wTMpe49Q$olF<{ z4`5aq_z!BMGOZ4YU)uYmG7#6275bX$lG%T(5tXLbG(yaUYL^v0r#>KzsN7Ps=m zC#8V}^z7E572Ui6S!~{i%HC_;7YG+uxW!@K(Dw|adPNd=f?^?tKdk+C^H8oU2>z1bkYvS*Z zXsr3oc((bs;W_VbNX&BFoX@frS9eYXdGEyatgURbd*x*_R>JR$R}N)h9o-kzYg!pF zT-}OdZ%t3Ij=V-k(hnSgV3t8LitgstXZ{pZspxh{g*&s(Zqlnb`h6nu&inRVI}liI zZ+sbHlaqiAo^QQrqAdT-Gw;&yG9OZ|Kv9WJkSsPabiaim=KiCZiOnrf_T%C0HVwCO z^>6vodHDa3PmF9|5+9WEsViymSXrn{ykxiE)i_GDmF$r{Gonoe^i}D(siRo~`^o7! zN6JcshdNfe<+-@~=J_>cLRnS_V`Wxz zI%pf-UmszAi&L0@?%`Tmm-KEH*JE?sft4t8o#0%h=gvoS)ZK+5&5*C#jQVFaSmIbm zuV2!oAL0Aeb*});>c6aZ5WfcV{QEUsD2`VI6CM6&Bx=59FJ6`~F~XCLU~0A7G7lye zxfzcW^plRnyA>F>EnTsA0gEmjHM#DQ|3m?r0UlT_MJw`iFo#pPO-B7yIAK)H?x=%X z_@qyBBB}h{1t*VT48AZwiZ^7z2`XScJ^O=?=g=T10FaR_Pb#}gu$k$I5kE*&$2H%4 zW{;6HQuJcec}O20oG_6reiBf7Pjz5v-U}HpwD(j;8L=&9GJImNK%ITnJF&kn#Z1z; z#+1e7viO3oB)l*`btp68LMq(Y-Zkg-wTrzztD#S^*LuR;bUQ9#$Bx@C(DKAx6;f*N za6=)_4uE&3gtqg{PU`H1wNZ&&?Q^ePUK}Hz0f;~7bh+%nL4Ja#u2GrVaxoBk6zR^q z{7c0;!H?zN0SL3o%JNn>noG;(5e!jPQ%6))^NYX0%8T zuZp!+3N6o=2|O?;+7WdLuJW{sN57npZ(EnsAD{93hydRxE0X>|kk=AunJ02+pq3tc zl`{Du!1=sm=BMaqc3+L~XCuYoH= zIg3^(^B~|q_M}navo>>9DB))=z0V!Z`yJhdYd>;oH)_jfoqzH&e3)C^)*z*1>bzG1 zBzDv)3XVb5+tT%VjEXG~&6A}+q2s-`m#xK~WJf8~ZH6&u@Wf>uQ*PbRq5vG@)XRH8 z*qM9ah%20!g939GW$WqvT(8iB!WdlB9u>DyRY6PrdVt3|dQW|B52U>o=Li{=Thq+Y z_Vd@_kP@r6_{x#As@b{nyLoahXTfN7UQ;tJqf5$jaS`2n&*o#t9iim}3ElfM(wBvN z-8cQu>E7kc<%^`CqAI+93@}~1PjT|>Gh1D(LZ%e3Ck1QAsqE!iH|}jug`BQ_sSWn! zcGgHi=GlIks4BdabmC^>H!HJh^$7iVZP`;sVD7)Obyz*5%OJQ+3TFwi#xSSE&G)i0 zN?D9RLq3_dW_B{JCP*iq5URtQJk+*09XyOca+}>ulXUU-Kh6J>1=7q+l$bzA|E3+G z#AFbt35hJnYOl1kFF-=@Er)i%@vw|*p@WU@!zplxyC{3+(3Akm{d#Dk2lKOsBAJMZ zwlt2}Uw@hc+@N>J>qb70#SPt;I-#dfS{WaTjaMmQkU@~w&T1A68#Q2q7xI=GU`Gd@ zI$LW%y0D(om>nP{EoX%kWMY}qX<*wh83=r6CQl$q6mI0dunv~&!cO+VzwAtKbUbQZ zZ3ya5UT%QBy>Qt!r!7wewB%PdyesWZ=+LArjC?yIvga*?n|`Tjjj2g6^y`YlzPl2* zLb6}4ki(bDOpv12Ms`-+1Gs<>gZAgfSk{E%TKI%7{Ibo+a(2I38!;;;YK0+ra%v<=I!ir0!?!br4c1O;El1Q!-32 z=XmDAr(4nD_cn*Fd6KW*!E6VrszI>8$)(2a=n^c2FtgkA25l**}HGDhdsM!d@tj*w|kdV1O=t; zz;ZjTw9{qBunVy`Hlw~O^@hjo8AF5rAc^|sWU)hg#BwFgkf1=iux8c{Et)jH(5r6d zysQ}&JtRlpt@EY zGiwk;4lCOuWJ(YsHr~c{@}J^@iEJ+T9}Cm2J`4K+JsU>{Hpf-%eY!%y!NN~p^a6Y5 z>Gl!LCiKTCzLL`nNXMGiok11m^Wi`ZRTZ`~Z})AxalAc|b5?qG{eg}}2OIcmy!5)u zcKERN&hct`yo(2nlf9+pyT`Wt#OK7uwtd_75_b&mM+O0lUe>q7D;bsTK|ovQNYj1Z zssR!Tc9Bi&CU_zQHPUFUag0WyfGL58cA{V!%EZwKio4B!(pEdX6eO+}xxuRCx1^TG z*2@C_drYgK#3XZi%op!9>uY~dAh$C@SkTCH6p+tgGjfrcO_C=>B{vcXIrxjJoioE8 zi_s5L|Gk+{$kFxIGQN^hZBNmvlGq3}XNWHCWr%RPrqf)wpb0-Iyi^tSv(&!+gXV?k z!@?vt&>U-gglLs^m& zfSR3`VBa2@VbXnH?w{H$q{S{&G}o5wUi2l(Pbfe9VOKB5{PHadJ$Uub1$1u!WJhEh z?j+~@Ta_h{oQpV4QOv#izO$R|gwu)gz@0f~%wwZ#cICa0 zt=L&f(tMCp3KM})N%-k*kF=kbgwBi5vw8VVnvI5${^`O)<_ZfwZY*?l>iC(4o{2H= zcc^Q`p0*wly8R&bPJ8P5^SA<4lHHPvFT?~-{EtnTuCtW<>U;uaJ|>rY>cehdI<@yI zjA>%b8W?J+0#etFVg5A2GspB6)DI(TYXM&d;y7g0o%rWDXC@Y3%bZE=_mI|D-&x&B zs$wV+uj3>wdsivJ;F(ze4(_|9bT2!T^j(OtObw?}0J;jy=qn7;{=m*Jm3?#LhdIl( zBsb}9lJd2=s!kRG4<=a@5HEa^W2HAaiRGrqn^yw>n~YY4c3`a<^g_vo&e=Vz{yQuv zT}S5gYTl_<%6h1wcK)~UHX*|qXyG$4cv+jaHf^EcyvwR zIn7pLD7RM(`Q^3pAdK%5m;Ux%@J@Ex3u&PU;mZbG?}zDNhf{IE=4BxAsJu&xnpSvf zt5VE>X4dI#6{1uiSC!aqknue5S@WXNIpAf350!M2)>=FB#@EwKx$q`qN`D zLSyGn`|`E8EGuhHk=ThYA7)Y?cfP5RD>WQo@#q3Gmn{ndIzL6WJsKPxsJ>2nDS%^9 zT-%r4`yM_G7enp*S#DRQ9?1AKN)40ib-CXz8)_Yks{4MnI$Aa{r~jo6LR)8poK`bf z-tGwsjJE7@F+}O{vqL(@I8&HOcuU%*hkv*r_R9NxZmD|hm75DNszQ;YWZm-35QxnJ znwwMDHM}R14x<-AREl~@sMtEZ0Q67Z+1q1MdFu|D?B=ob?^Y#Wv|CW@DxRc^6#lWV zESI`3dh8OuZkMOx1q(k5A)nUmXi!Ub?C}?2TBlp!d}H@}+6JBW z(KF+AW=n?ue4_ZX-$_T4q(%5;nHz(HAkM|AMCIlQysoI^@u~ENJfF8TaQYW{KUnqR zSq_K&3D4!ZT^R7R4@+~!9Fmt{ONe!6sQo$L{M~ipZEEuC1%t|K)$}|BY<_#2{h$`V z2ftPbf2e*SXt;_Z61;kI0=+;hsD;A>WxrEXlIt#cDC|g=3&T*jnoJ08EA)0|T1;Fg z6TxNiQ9*JN^W_En`xA;8c@ z)f`TGazxgJr!olyPtDlnz2Ybs6FD%pelTr)-~G#Iu~gpdXn&hD(ms}~s-oJKD2lnyIT$QwC;D) zbdj|wJz<%P0%)1+Fs@vc42){9zsXpLPzI6TogbxesKLY1q8|;@J)ESI(fV)U68QYi zS5j7HBsq{*Vcv*Kknw`ZXndV$s@HE3vd?O%R2q>*tytC6Bk8OiEO`P^@~FbeY0?=s zZf83Cd>J_SosPf8E9lB~+ac?rXPKJgO}S$jcbzPNXsI0@K(GsxNCGKu2-$5x8FGSg z1Xs56O@*{eAg5S|joX=w6XEi&jww0v8@>d!a1~4;p1lhH!W2?abo6>Ynf z1;+xc^6Qmp?6-IyQ9$aW&3miI2_~po&xw`kuUdOiQP*YNWuZ1(mPb(?R%@KXFf={3 zAE;Fb{`vxYRP?$T>z=q1POqslMXs_=!yaSJ7!KT--3R!%&GOOQr}HX zkH3ENu=Lb9kaNeZJ*T4wz`Xk3Ulxq>p4Lb)W$Ib-5TG1=FZZFwE03s)_XLE^+0QL6 zsPcgpveBHIwO1RtY4MR9JfKsQIs^w)vV59uqhjBX+cYl|*YhAJE zQ0QW$vKdhnS3UA~xt@0S*P2#9DN3eSr|zS(#SSZE3|?tnU^F#rMSy>R!>a)oVpe_@ zQjD8%c<1*XEH+CNW5(kWRKLp9Ofw@81D1niBOTuFj5f{i@3r|uvkZ}{84~?YMXBv8 zGhC*zrp29Heuk;T0)Hi&$r1c^g6_{4ghN!1b1B&qK*dgYjNMS?Alb;_pXmXE(rDMUDn$RGbo^Y>nB$Ir6~IuTh*pqWf|TVwL4 z(kGU<@X>Z^BZG8Kr{5>&Uc~D-SeV$)i3I)duaqNb`Y<&d$)n`54K-c?*2`h0{1%Az`nf$1 z`kICtX8V1srP4q72XOh_Df)An!0iGOu}R5!lRBAJ;~dlHy`*mC))bWOdNsfM@IO%8MlOcaZE z{24&YRQzN~D){sVSf$FP-}3ur?0Z#!t<`!4NL^5mx1$`K{!eF~RYJ>3i#a}py35F8 zR;aW2?+P34^wTcZGmQW8u%Go^v~@{8>}q9r#8!O=o{E(zi)2{yJ(;ykp~Gc2nU6LXb(ttbKWan3REO=y*0h_`q6ReDr^x*I9Ig??vW3_h5aQ&i~BbF zCj?R4xL1#*8DxqF3<(Pfm&w0%;z$x7IH!E`2MB)bKJfI<^000#n$1B8!TO6$phw@I z^0qOSAPq+_X{x7$A0osLWlzA5_Gv1+d(UwX%lZ3)?B zP*uDDa!@gPW7W8R9n{dnZ+By-oM}Oj-7ow3YNXpJ5;;{qgjDk%xX51t>$S1s$v;lr z&Gl(6b!o1RZp;@3EMeiYO;NPqyo$*$yHsvV$+emEOVzYmv_a|m)wF+T^O5{Dw8G~( z52WS~THpd;l~@KkYV!sk&jox++Oc{cX!ZzI;|_V&m|S|22p=?UPnb?p-}kU_HhU<1 zMp4J)L8$L9``e$En{KZjos5>?-iYoVyqwQ?ZdcP07(JbpkS_7QM|?bKbO9JYo~Dxu zRdyM)I35wgYWm}72UH+tI-gV_=ywN2d#x%{39JBL?Av_TKzbHiciV#Y--WePAC}GR zRK*V34w^#a7mP1YK?%bCvB;X)1TC9B`Xy2iVtuHDHfa+fW=Sl!309nVn_s>G#LVF? zDDGAJO@j}*j^>v3J6&-WT-(O?LF(f&Z~37)=|#Sv#Cbz-N`w7MqrfX5H3ojK^WH=a z3AilKN@t*>!9j=sC2)jJe8>G?*Pjw$%~dx(PTof%S~U;mB^75_b4N^iaq;CzoW+pE zgSbE4o7$hdS}0tm`N$}ZxV#g&E^mV6owza<$?0yF!pnBG=v7tfVR`*SAC{+3S>f(E z1@HDMUZMTnsx-DE*FMu&dT*{5{+#B3^Z6dO0lcEx``wU>y;Q$H4SS=^Bo1n49b1qS zK42|JNY3@D6W*VjYWgjTPzhl*wI?(xczJbo4zkNYxUqR#?lSrYqv30-mKs*`9+yMP zy5|3dB`${BX=z9Apzl6M7n*{)baFgSB(sI7`r~+i*rR7b$SzLpQA3JV4iT73eL$LV zco!KAk<r}nF4uJZvxgPR%QGyUzr|r< zBCSWG1$5uQCUio$Z(wzKi?0kEzzxLP)dO2?{Io7rUAMJyJ<#Uj(2%Q&W*@)Y*9cS*|M4M)g5j)SUPafxH)moq7XwvjXg*CKJ4(9VM)x4(DNw-8x3F9 z+>uBhxztF}&aWicflMYh4YOEKWe!YdZ0YC=-aT-UAqidyR&&-Rx z2OlrzsNd^IZlU3K$MG%wi7*<;C4hzKnBjed{~duhm2lc!LbqOc$JBI}ko{)Q_)8`Ejg71^+>l}`9PaboO(F^ z0Voz6hxGuaBQa28`Mc3lUm+tC_t7FHJU#~XM`yyp1$x}BScqDn;2bMfvw>kAB{nsQKQDh6f1qWzyr2_x&!A;W%L%t| z4*qtV$s0@YNA(kI^wJUR#ME!-qp~N#;*;sqq&%4qMc!YkE9O$~WDNP;YNrD14ag zNW;e7+GP3}ybr7S;UAcc(1R9~xlZZ`0=5X3QT9BUe#dftdViFm1EXy`ER6{_8^=sq zjVqQFQdV0|q3rKvIz?_?E(vw-aP^IM4D;aQQIEYW3hYR&hL+J-5Lno#@QB?R&x?Pr zqE=-5^j%!w4n&GqViPEb^eof?upet6-yi+e@RId-J}j_ouV6%S8NVmXJyH;~T_Z zv%Q9^b2kzy_XULlapJ_HgCGiBEnsh4UJh(6{Ia8v#j5mAHAq9p+6qE|GZW!x#6Cz# z>yLz;^-hHWMk~KdlsaXqb9(TZYe`Qt-{ZsZ@9Ej@iS%tR=c!q6U01ArX{0Ez_s4Ec z08{f(|G;X?fwCNwp3PkSm+#U_Kp;Ro4NxYGa&Et~+CmCMbmd1Lu77;5B_(?C0+7w{ z@+qo6pa1Z?LipP6jGc&%LQ`+Gu>%+3Yn?M}EJ?ra6bxNQ3!!c!-mm6$oYqco?OzCt z2<84}T$0*Y+j!8CDH9JaqVR;e;*!S0=(>)xTX?otgN120f@JO5G}zNhM?f|23eEq# zu6|3KfC=Sph%%On+$9vzL9tohc7Sezrc^Um4_E2F%oe8{GYE*aZf{^&&2y_$i%tJY zt|gtN>pZRs3kZBFGo={Va*s!&PxXv6<a<-DrEo(cp7)$C?3>QtJdywDcy-{1R zG-M@)f0XmZ6zp736tfavPa|41OL(Jl{jVesSsBaXl-OiHa@)>fnT2vq8d!4W?;JRH z-7Z|MvR`JB*ntR15RsJjfFrD3&4 z*5#{-$z?LwmGH;eUnD{z#xjGj>wON}To0@+{M8{SQ&W6E4^)CV1yzu{d)bwg0?BLk zFgDgT#kA;P3HmmL$}&t^li^t1M}(D`i{t4NzXroZYzr&q0;zLnQW&G0Fh{RjFm z%R?W|!=-!WaUe0h6>d0BCzfy(#YYe2{6yQZoLVwSP!`{5?MDpl7dn#fZk?0VxSiRA z$8N`W_tb)?sGq@c9AWbf`R*A(nV2$=$OLzDG09{Z z>aKEF(w%Y~-hts44= zzmg};NL5vDXLnfvnGRLY#j;C?$BgO^j$1P?CWu-sNQ4}mHlw82w0Ln;^XRDGLp2_> z^R_NmL!wK&yGNf^6}`8EojQJMd@|rFrv?5ZM?)BH1e;tqUu7eI;_ljf_sffx91t&1 z^rWMh_F|P2c~xMYcrX8-JrS|QCj^N@f4t=-gM5z}tupNcI?F0B7}_IMlZk&8%i!?Q z2tzh++TUeory6Wy5(3T{wW2)?+c^p@j3<}&)cc~gePeabJZ@uzoBM+QeH(jtMjK7% zN%^zhsPCeGmXkDi;v=%#?)_fEY0vO%ir(a~jHc|2pJ^s=MDwPSE5h$Q?BJF;QAHaq zaPS%8qQ8*@wC+i;TqwA%Taf*GT^1By1R}oH38y1k@piMsG3(Y;80hxP=sLeqI7H7M zOtHQ1)`~MjYSFts*Uz0EM@po&P7|VsB}8=Tvcd&uUI#0Ed8uBvp?56OUgMZ*`^Jdy zYHkt5hEHQpA_CpR+78_}(aUFVe$orji~NJ*e}fGGjvsS+=IGtTWDVmFt@q|UjiztX zy9#DLI_^#^|Cm{Lvo86z0>c$vzhL6MU`nr}xCs9Gnci@=dGwGokia{?kStI4oy-$N z=~}u(D2-RWO8x@U`ZFp_HJrJ3*I&-dz65F^Vi zrNilf&s8ElkjE}I=_lX*e>5;b8D3R2*zoBOSc}Hh>6YLQtw||Eebuyg-jQtb0(K9P zRTtg^!dSywb&KE3?NsZ&Z#az zDol^`U)hPzIrCup;Ai?jxAU=m0|f2hJ}xSS-WCh36@Mm;ZVx-wJ6u%n(Kf`HNT})1 zot2sA$t!#+*8jAiYPROg%f@UYzR0%e2ifqL4-|>VAr!vuNWQj#5k{?ZHvyuo{%EXb zWTC9A?dyZdB|P!^>E&>$+HhRQ@oke}-Ox25Zf^kV(71Q1$L9T=9#2E+y>+EK`1Bf1 zibgf;x5-z#q}1Z1Wu6-aO#UJ9NP<+Ma@>k(B`W?>bS= zjFC5Q!uo1ny4Bi8SMGq0BVYxb!im~b5+oJxAh^;;l$B+_aFEaMkj+`B%auHu-G4Lw zx^zj0f7@#)An?ubv005wci4ApMm*6C48ZoyJ*t^P zP~owPp?P2*KS7Y{-ES?m8;ztL2Lw;8py4~xpr#fdOyR+l7)BH2l z)Jt2X{KCt>#n9i4VZgNgj~0##_RsUZ&~vw3Iuv+CNz2V(r4j9BPK&}Gh|6Gj&=MkP z-g+e9;Oh*e5y;*Z@#8A^PjW)1pcsC`3PjsRKWl)cUH!`)&>;9jv|3b5#NVcgRrAt; z{`<`$-krYvUjKi3aSDD!_iYxcw6FSe4Yc-*$ysXq>Od8^aWWwE_N3^U_bat4xV}4f z6}0yy-h;bs}Q|vhRd(1fBq^!CKSpfRRu+zP6&tGr)5s$qCui?5|MIoB{#73 z-W9E)dqOM3;#LjP+MsB#tj@{J`sMXM2U6jhE5%Q9u0`=VaYPl@nS3a?@=5P2A)nPS zfd+{B7G8b7+ClIyR?so_?M7@`EE2DgGp2WN*RO>A)b;9`zJ)XO~+XPzqG&&q$BLJ~udl9`ZC@5;@{QqeB>bR!=FKR+SB>f`N3`GeM zkdS6W5m134qJ*T<(%pOpDj4)YL}D}|B{h0O=@3T4=#t#1Q5zc%zvp>9|LyscPpE!?(@!R@Ni1yU^GF|>wA$fhCK}YNvelpY9oUaD?MA?4a|K|>J%`#|p z_cE}{ytDi3Y{m=gUsLP5z4Ap}8u;s|a?$V4<+|o+Ea|dT%hz4ZYGPv^8F%Yd43EP- zM~iTAL81ohTx&@>4b(0h@H5qN)f>ZK&mvC}Q}PVZb`rz<2BA8n-g+YMD{JSoX8|?L zmd<@jRP6;MDM|T*%)m93E(vo=GD8Zy7c5w-7gTP&M9^*cdez!W8f|h6&~Fz?dess2 zUggzk&byrvBBYKiX9*h2yew(M>QGK=U26 z`JY;5j&-J?63LjbBlPC;Liyw)@*tL4zV_xbUY z|L`cH!S|P}UN66ftvXnz?)Fh%2YPh&MjgL=SvdT5G+z|QTM)hfS+xrR2z#`ZAIb4T zCMVKS*}v~xv$cBnkCTE*oa9s>YaQ>7xnP>dE!yfzOm;?&B?eRfQnU6xo!?%L>7P(8 zqf99_PTRN!?OH_Z;a6_QXEkvsD0dk0@dc`L!72&zWbz_*&FmR6X;zZ*OGIP*_t zhicdda@g1}MC^d2rISAUMQ{^huV6YwnfyU#6r>1_N@b;AP7!j{XK(UJbRg;dIAxxFWp%EUnV zP^0;Bg*^R?;N9Pr=P{?Jjq?>gSV&ko*~DPl3v!+XDk2;?)_pAnTo*ke)IF_(#z3LZ zv?urS(iJJ|6=Pn(Z?-UTxJ_-4f|iEzTCj7NfY)6l6<5*s!&;uBzqJ3zAovCrFPN6B4Mw(9IIG_41W2;LMkm z)U_cYIP>elfj^*TuCvvQx29*f_$w*;m~j!d!~KcZ>x$4b(+DF+b}^n0OYIZu!C|$e zIqqVaM?E{5g?<`a^;?fW_LA--Tx6(qMjuo|{>yXV;BRH@pOwHdnEGWlU#miYnv z3$T*)+b!7=O@Ch>8YvHW`}z}V%qQgfjXBpDTRn%fsFgkkN zWv1(z=Dh%wLDP9y-L@Xk22W$ZEuf(iP5q4ly=n<-Wv%j>wpJUD;?y}y>tK;*HodYl z4DzjJ;PW4@Ualkmv5nB*;4X&$HErd^q#UWT5hzx3f|S5+NdLr<=)5I2B1RmQltx!bqQ^$Eopv&i?`xl6DZ0Y6ouMmWGV+@P`oiI9 zYk0k+QrFz>_hhMsU~tfiVw_XSd=N-*Uw^*>G#xBak=MmDQOhL4xPHe?)$54QQsl!4 zV6(kG*=?MqgNN(Pw~qk(imNw8CE8rJ1al`qdIW9u3cPD(2d(#iL8NPw3pX0e>$`d) z92sYLu7XBAuV2dAHB!-zdTzK7*{>oK6=;&^?=OJ}7Gqf@1cx{_H2u_{;)%B^t3aQx zu|0vab(5^8)UmfELdyW9-4l+bvhdw2t z|8O+(p)L-LEh(Rj95g(MP}Y1PZTDBx`1`}(42asg-V9o7vaqO|j=*}WL8y^G_UV+A z#SbpXiq<<7hg?ol^jhGE|Mzmlc0M?vX;HVcP>pJGz@C1xAZA26gIFL~^Q&dnMH*eQ z`mf88!X`b?+`UywVxsQ)d(gA4UeKGa>u4l*=Wdc-=a^>DRhcSu94X^ym>`zK3O@rN6z*ZYJzm7 zUUofiW^*XZ78~CCGj3uIL>dl{P+fjW`%#*fojdLl8Lq&3|FpCC0|I)>#^R}JSHQov zuEO)5=NsNOcHN&}*u`3T`>r6QFpA#tjaumcI@3fl+nUNErM{&CBBqR4kX8=$!alq7 z@V}pK`rh?RdOa`*dM)9JASR_|_%vJIU;8nXji)vd7j`!p7#9?K=l{U^lKuLhFZ^3w zX%fqJEJbraK$*sbWbw-;+AYu$8^ow)9g*IBT1I(pte^V2a}%+I#Xdh^D98Rf|IX)G zf{a_AaD{9yYpYTqknQd!A?nsgWfao?4|AP&=qGE9M4ohCw59zER_?7wkFqL)-*)aU zm}WvwM9;BlmaC%*X|1|$NsJd$W8+REEH|KLK}K1oSj>$sez<$&(vkFF3JB*^vG0Gx z;lxpa8jf(>z6I7-FXo$X&pAf&hE0bT7-%$MC}97Ef!=jMF?guLqit>G(6V{Y^X64S zqn8bzaqZmT?LiQ>}kTMV8_5qW}q)w&T(GBD=rbiC6cQhT+8XVELhY@J^1AJ4`bU#%f#=VjT`v;yAzX^=%4pSfgX z{+xQDPNE?vZ&Kb`<#ch2Gh7*j$;EJg1qoOM`N{vsxGv2~y!Wa-FIFutf->Uc|4_{l z4ZA`7kC)$BaX`s=T_gTzivRU=!&J<8QMoh2tavpvi1gV3XKH9M&B^;bm6(zkXX3_i znd(1aqo8Sif4Xx#{$%pOMKfu!bU1!vKBEDmEYu=vl>Ii0hEp{8cz0if*KD;l#MBfn zXUYcNILBnl3N$&3x-G7r4du=3nex~?Rj+=?7ye};HDD@j)pF$)+3ujope>J1qthZI zxF-hXyWKsSS*F_i!@!Dsi)kg-){x|8eu)B<3RnoaFmdqSf%Gms2#e#KN?gXg3y9xP zAu;+cQWG7|hDE(U1=!68F63xs@t|i)Y>DQ8SxYJNa!P&L%&JfV9?Z-SNaT2^HUE@+1twwwAr4=q)r|sm!h&`ZU zNYXxLd6VK!{f7@{%3kB75%(blJ}r1G7aQo&)E^JgiQki-e3TvH`_K0EJ2{q#gOSDm z6$&$?=#P-eYccL+PlY?fn|JdKTfJsz+5OXF8mR(Wzb;*gNebqUmP%JXIWeyNv7kt-#d70X_`?p+F)1b%TBjlUb1er&hHtpBN z%HEY4-2o8}XXe>v<4aIQf2now$`ju$ULx;kF0bE=hu9h1?^1$ybi;j#hAsIOsySA$ zwSbYCo;M~28{(c&hs?*Cs2<1j$s~EAD3pYKjyPf{U2WLEJ9o?fNPNxgBIik1T#m}2 z6^o^}w;(>l6g7wTCW8kAL6hPkeJ#%`swc*!?rgvHaHG$bp}KPv3m$e17?{1;>MH!0 zul1$oGM9W^fB2Ts0<>#&KAd`Bn&L{$IP0XjJUNPqiK51>woMKQm@7P=A1Xwx&O#>% zn&u}$xTak?gIZCqRE!5x5-S(kW3vF7o!}KF;ocAA0hV1$QX$E?l-A@n=CC#>r+R#u<7zY)V zqFiXLr=dHwkp1ow)Db7kHhcOl=G~|1Zs@Rw=~YggMH%xCr-vv6@u1z`1(JiEPS~Dm zbit7K=3Bst=kSvzZR>Ur)wL{LUGjAYg03Kyl`5O%(ip?D<#bh5tM5H|c|u*`MOLAS z#*MlRQ`bb31F#@$r%t{e6g{%l{f0grCuO9AoRqnT){Br?`W|Fs2Mj`1)_i9Z`NN|@d+_g zD!PLFNBdL9jX<*9gQEeA^4b0FYl%0Ru30rtxNJTPHzvm;`4pI7IJ|FiJ zTi)o!?Yonj@mC+etzL%e-&rrMd(CDvmb&VdfzZ4LzFQvvtQvU7dleH#1sCQvSvJ!AbGif)2 z4fnh2m(xT%PAbk<+tlC{?YaoHXvi;^Ftc@%BUgzr>jgl6lC0+Y{9a+G`+4_;0K78L zKMT4c@v3Ql?yIP*nu2h6kVwHQ@W4s&)7ACo@vbkUn72SYa}->={h=+_`A=y=N=CnV z!6;cr_N_ z7(2+yaQYGwU8CcgTnf;6uAO81k)P@4C79^Bu-|h&}8w>su#X_1OWKLfvZ;3SaYqY*b1*%G>nkZoToW2FgUlT+0-*M4!?47>yj_u^L z4%J8R0{x7d*^w^_aN3&fI*H*}7G6w|dTuF9*Fd0C)otenhQM??dS;hlEU6Sj-%DpfX<9Ulf`H(6jhG5(W<09`AP|(A5Rl>JE{3)qrqb#Gq1ZT_&U;>#P4B!^sG2Y$)kE@P-V3Dx@+WfO{u*NfA;#13!i zg(-kI%1{8QK4ltIEHy)QjOr?d8M$ z;IiJWJ-dJPEePTZ%5TwxNX|6rw~ zOc2JLPjihDCJO_f$}M(o&4dS5v2D|Mrks~Qe5(`Q1=;-K?=W_UY>55<+mOHxqp81$ z(_YT0wecMIZ;;Vwo0a#i^s6;j``^*|C2R&$fRND0hRW=f{0tbY*YJv2NNu*20PJO7 z_7m0Kzv4|Hj(V??5bP%;Ub>nnuzHCS0@F0(yN)W zmEvs&wx!7ap=iviQNr z$?6=n$*Cn3QDKy*PWIt^wl_}jzw0<*mGToodXQ_N*vC2@c9Wmcl-v)lL{;fLrc?dY zp-0vt9$7t*77bz7*QHa6_PfCETbP|;@V;Qy^rB3kdSJ+dfWA zXXB^2(e4-%vW*d*{}^~Jr?k%K%p}Q=Qq#~lv<4NS_Z{wMxIM6SGwS=r1Jis^B}-Rm ze5ZwxBY<@&pCv&LAu8!xqG`Elw=I9BJ5aZGFwpZ6uCO;-DmT8D zaXLG8y_v82QRjbYkiI^j*=lJ6%h|Oz?QqWM3z(eiCsge{lT)U--9M{&)TRdvfDhxwiB8qzQjJ<`SLNTH6xsh5RVrM#ilX zH_`rCy&a$pX`53O_)iogUl_CXp(Suh?H>N*CZ=cgK)<{>EhoD3bANI44&OpajLhd5 zC&$q4L}OH#9x!Ki(Wm8d3=sOJho54y<99ScVONd+alMCwh@X$3rYTbt2NG9{9-@aO z$jG?Gbx@DB&Aj=?`MJe@1bSP@GOJFX#~{0f={uL_xrOk-JT6?O)p9~ybTRKm-XpIB z<3Vxe z%FpO;CUffid#{4sEDU~yFL&K%sqbr%$Dqe`pmZTGb*EL9y91FG%7tz?Evh@Miu?MM z)UQXjK!%mm=s3(pz7NtGV6s|Rv9W`XwN%Y_$32}!TRe?d$mVh*%97KN2N}qrag@7& zxix8oq^vK{D^_x0l9v1xx%&%u95+Ec)jc{yg6#wNhY>kpK`Kbel2YP3E{HhCJu9%A zvYRNd*=}T`-4Ym!+z0x&&v9EZh)O;oG@#I+PVH*H5@_$5Zx9 zPSMzzMCE}>qN2p`6O*hM??P4QIbyQ8V-Rh2neHspsJ~XJY`Flm(am`Wpl=_uD!o7? zPDe$>D)dash9qA^|2!wqc^ISba&NzXWagF%4&%kL30Vj>Obk7h27u&)Q2dU$Jx$@7 za8t4wFaDrb!5atn@PxU6dVW?1&xLcoA2bZwfKx6XB++V`=fHGD;^)V(~rV?BR{?a=eO&pi`BN|#xt@xB?y%oO;}9j@e^7jsWG2|O0BVwH5} zJ3LqZH5yU1v+6Z1*dRK+5#ZLjmR;m)d0eNwTN*){wrn8-H(|#g5`w;Y=HE9s$OIJQ zawjh1wqAoWx4&}znNtt7VhFz8_0g;&X;8-iY;nJ2^>Y3WxK*9aI8DYT`bPcX!hu=} z195h(4u2eY67-|_Rahy%&^%R=q~j55$f4`~M%L*qvtR-aeGomg-({wxLbT`XlkgA8 zCf&Hz!oHpe;8@6kdKM2-OlFa)kJp4u&W|p|Y!=q2wlGV!&TdZ>R0ow;kCjhghcS^3 zZshV7s$>uJ?7`RuvE3xq?Z)GbeSX5`xqIJ67G)|bQH3hl{9zOu_Nf^e)atpLGfndU zuezjR(_ZsmEor-Qwj;7ue+mUxa=zFT4K_zj&I|!ZQ6(6Im2(Jg+>I}T@#6{pGz%xu zQ-R)W^QaixLxzrJmEG&?I$2DCze)bB+1zeKSiCwN32vT1$@^ZP|XykpIXY14rRrs^6|W7+dH*% zjf958oo;q8MlynV`H6i*#xf6>YRm3o0}tKzpEtj(lC!=3bZJ82?t)2F>=zoOlb`vgO%^D?fXS~DNyE7|h@cV3x%NDdBOZB*JFRQ|Q!0!uKuIZvSZ zw%UJ%l|s(6eU({S1xG;4TTq&@I5%%6Ya;+0>=|El5NVPc~9mM1iOUHXD^d8vh zk;M0*@)%T1i!ORsk3x~ji~N47AOxH?olkrY{Y`?=`bM*=NqJ)aO^&uxkI-`OHQ|_H z52vBcl*=!!)w5YLcuvH}DQCS1*A_Gaq0A)7U|`IrHGFBsD~Y?&}-6V!@2{Bo91ffcFJK}@D9Ptr*LVF00r8AEg1>^LjBbBOP;O+?`M z;!(4Txn{Rnf+miT=k5X|jIYHZS(!m`7K?N&(RUbG7V-u_TCp@nM=$4;n5PZ@aUOh?m^_yYriA{0xW?^oShy?)Ly9a1 zxfqlrga-IT%{7(wFSh^iv6LzNf0>oU_K0gS!>N&XoqcVQ3K@QP52;|_pSkZgm*m5q z{Y_-eu1zJ^%_6H*>OnEXx>TAxhqUmJ_qSAz-Y2*hBv^HoLTdnto%&IvX2s#eQzAi; zympz%wGILy@AR3>=f^{TVdbiat}yF%aUEv5(QCYnE_ZV_KHH@g=v{AmhI*R*(mw2k zBXPN6lqR>A%9Pj#-bhCd!LBd7ancR1S?a)KH4?NeH5g&G=lF1^&jHxeJpj#WfGH7h zV-tIKjG+aKFoOPZ40|y# zjP@|bRDr!J`c*JJru1&-kYDy(8>k~X>mbKuM^%$YPQAI8YF ze0IF(?iizj?&kWm>==p%&xYN3*KWLf>CD=r0vq~;EWO3rY<(QnaU{_aq*?f?NVSn} zxv*zwW4BeIo}_Zb-L<8gvq6JTUc5|CzS|ytK6D$j`cuwsRP2DK-bih4KW=fYJE;iz z(NGCcW$HvMhj1)Fy*iZzKIg}E`KA~+e&?MaDdU1sN*d!4DmIRGpahm5xg5iI-`iCK zPcYHc$zCTJJ?p0Yh?F0yFdi}uKEIelgYGVUeNp%x{|%v>7=ktH!kp|w$kFUuY{Ux3}-iofVJB`Gp&isi+ET_ z@90!XliI^Jo_g9xNI|nj?dZ_JSE$c$k@)67Qnuv zTD*9CX)hA~`roy$yZSt~`W_qa<^#7pikq1+ne#<^TT0-lCNSIp_@c3Ucb!fBhkm6; zW-RwYmi+!UZc=ga$)R=H9(fS~XsOBGE^if>?<|b5!mkjFXan{ov-NGv0X8j!g(3!Na{koi>CH(pq*$g3p#T9x$W9?m?xMuu+ zkS>)%Xd?~#-Fvephn5dk*;5RQ)O%@E=zT@9pisW4KiVF;h_ejE-Qh9E)>xkrR?m{V z!5fWZ8|7a&K)*h@Ydllqy;7<#a>*V8CL%(eaN}1)o%yg9ymhE1%B`%w8hKRhS(?kM zhF$x9))T1;dyyCPj)EAVQ6hBR&FPWLhP# zSHk^NBYq8FigT41^{^j`0ycF9V}kbcc5-x^y&CgW6~1SRm>{>g*HR?*KQh?4n5a5F zlwWX(Z+C&H&T0JUF|*&wIYM~PtUo_#@rb+rt*&BrF3Q>$6S%-FtSl7LX)w8C>TU}K zmG-NGW^P%{ihPPs9onH520EBlqM1qMd5y3ClShj0ZT?;>^Ke@&+C9e#kvgv(iP6iH z*S=F6urNTtX)hKahM6LaU;ecw4Oqgw@*-{aGlI<9Xxkdan${M2jj&{TPaCSv$0BGV z_`?!~*4RQzn)OVap?j~KAaxHl@~IRy4Y6>fuJL~5+x>Q|JRu7S0FQJUtwXoWTd!zf zZUk!=tqXVku!6o&<5lVzsumX1n1WpMX^$U}N@y8b9c_VohCKJEsABp#F@?|1C;kMm zlC5QwRFqc?t&?2Dr?#5Lj>?KQ2H$`x>dPDPFnpxx9$n$`dOY&!!M=wH!;nzCO8fHs z=!Z_Y+e1Fy6;2GWbnI>>v-c)_ytrg*rl|b;PQK%yn_@WKe&CCRIBomm3g=fpCd+6F zf`aPcV!pg`wsxiNtzp06vUH|dJuo46(v@s!Zr=2Cuphb+{KKPD%vKG@-)hO@ZwmAz zHNH<%%V+g_i6pEwScYxMdS6VP>E!}VnJ@U#K{_H_KO_L*ma2CZC-*seG^Lp$d+0L5 zuC#{PzZOlSTO;HWZ?-&`A$r4iQ&i8K!kcXrU5h#Of_FbQCy~k=-Rwl+h(G5pZId~0 z3u(`JnV--@DG$Hxh90uf`ryUKv?z9UA&L|^bE07Qy2AU}v$(b$75+8O^ZmZRhSRcn zb6Xd)%_yL(5yx=iNucg(s$z8VqN!WvP?jE8E|exUwk$L?=7LYx6MS0Avf~DdrGuA` zrFASboDU7vA4aSR;x2o-sxD3RXiEd}l;XbYUubt}B?|Og{zUfCRk=A11}XAPKG9en zk`|MbK#N;X|GxesUbwD;Ff$=p?Uys;F;O0a?*-6uBOSDw9Q$|OO-kgvlzY47LYY|B zzsW|IrPb`Z2YH$+X$WIg%%)_Sz8~sCJetkJ>-47Ypt06&(mSy1=Gn_EfnbhmTi2l> z9DQf+&i;#*)h&#FJ`YKeXYl;f-TLoE$DjHE@I&0x78vO}nxpW2C)6X&#{!Xl#J@wF z1ok#(Cuy@+dQC^8H_&RTbELv{)2{~jmElLb;#N3-^p1^a1=CkJ)Zh8pm*Ro`u=t=i zmN^>mC6}h|&k!D`MbC?bF;g}`{X=`x@y^F>TRc9<4Q?M|l(BvJ)`<544ITlTf9b7% z)jK<d!xZ~jd*v#(yo zrNR=txNVNE*<;uO%w^`U9_W1dAQzK4sf^BRR2mrAmE)%rzB+2aSx1McuSB*C z4QPTA*t3NYCc8%iH2zWpqb~Dw!HTWNC7eeq4EbZL$($0kQgPMt*?GYmZR7J*H~Vu~ z+2bg{&$a^AMqPxmd~h5q)m7Z`B<(dcDI8LsN#XaSJ%hcqHVpXCFioMK_GiZ-Osof8LTOWSre#4fV_pUn)0g4N&b(pB* zR@J#5O!tPqmcS~`+H}=A%+;jaGQ0KC(lCJ%mCMs!a#5ZC!5C&-bW##i?>00Mbk^;e zV$0;$w63+1(=$GfFj^nXq30{M!ilN7P0N7{Gs5O8vnPxzOHJz|20ZDTAoUPvDheLr zza0QSU5^l!I;;!N9N>Hpz$Gr8%R`qX)2AvfRG1{LJF!vVy<())hwoatf%`#W@r)Nl zD}is0gH%H3@d6XrgLtipmpg#ZMRPj;3y6g!Veujo3E?OEk0V)7P4V4Z<0Kg>JZwavGwqQN$&+4@Z!>WXG(fezUi zc$c+xn%R3pnP~EV5bIO_3aJv{^yCvPWaZnykp7pbI6pss^_Kjt&LO2f&3~(!I~Q_~ zmPgjDWR8Q3RuYw8TV=E&^kXjRo(uomjKmQ>vHC!bqSSrs+&riA3ew0b6|Hp_9*V@R zUYEWGczQd4`&a6_!!w1SA)(%We~eid;x)zDGgOuzDR*v~PLD>ZkWzJ1=tetSbe>s- z<1i4n(gB*LXgIWy)AxZY@~x+9!Tc3c#-Ai5zja-R{Mh)gzf1Ihi_t66E0vm@@}r!M z@VvU3R0qGDQ~q|Ac|kE@eN&XA^w&-S1abnX_p!u9%SUK}x)9)Hoi2|+PmEAlV0agL z_5R!jtyP|7+HedqZV;0=FNZH4F@3uRX`3k9>X$gRWSjaM=Mog_@PIUN=+3%OBEyr# zbG#d?#?9osV%IfWk3V@50-fmH#Kw#XgF_-p<>5X|EGa?WW@hE6A-bx5)}?s#V?cHK zcU<%8R@c&WSj&3-=AgUdv{%hSJ^Vfam&=HyJKAUjOI{!b6z5ZQ*7k74fr#o?bYN6} z+}XsZQX`8slU47cnYDS)_s}~^H{6`pD1PougMXI;He6=>&`Qr(6Idc*XzlU*AB3{t zOWR7c+1dM}XBYLl(%s{RrCgNEpP{0w&aENN_;qnu)E336eY zdEU#HJalGSM8!>z(lFWps!h*by8*9IG#LeRIdTV80iwskfKk_`pB+;-UmCN<53p&_ z>ZO#c-I8W>Ka_7&g_L+a_z<>7(6`hVZd(Z;2>JC>2>B&Vq;-9IB{|}RH?7TuxYEY& zK8mNQl^IZ?y=JZgWo3np4wxJy2E4zH6Ed)@D#vO z!k%zZnB!$Bo%;72mUc-d9ywKXPt~kGwau^jCUSBBE-G^2UIYNmXBK95Zl=7k@*=$X zra6l%-CP-Es9-W8u_DFHtzm|ACKEVC)VKOT@z51uG74;0SeYvOMW>IDcF%??igDU{ik7))*VA-Bl*p8s)Y60w^$2p6YaTf zi>%eF{{nw2se3n9l}b6UO^j0i@RFqx4x>H0(}WKjXKnp0Go&2S9L8R(=j_}>fXz&s zLkO#Np%kT9A~tF*{XkX21=)dH`D3RX_T(Ah@1#qjqo-x*11(mZw& zyDUcK)dTca9YAgRVL zc-no<175UXsvKk6n3I#b|H>g!0`g zHXKBJz@{DkuPGztM)UVZk$7U9%7)*=iosQ*T9;Bs^EaJ@!agFhW-||kx4RT>+GK*Q zAVn`2pJUWLC3kFR`#XF4M7O-5``V#KMz~Yt{ngF&< zBobZ|->At-ZSMchR0HU00*Ol17k_aKtfSp1WN)ECEeGoT))LF=8qIV3f`A=QM~kpiFwiyG{*hqtN=_<<*;Y7q@AZ2zF=D%T7fep!Vnbrj+dtd<;WZ&Q$mMCB zJxCpwrBflbfG_(KO^3H4r<;DOskGdo!MBFvxOnWR@vtV&@k_{or%fY@G3FK3p^Es1 z*;66-FXAT;AKA}&F?-YrnwqS90OUYa*oh9LR<6nK_T0ckZl=yj_W2XGc0$_GwO;?1eMO^=@7JKL_2tuPcaAODI=fpDMdEQB!9FZq>k~ z+8{m|CN7fK4mmjMz@wQj-Q(_`ouIz|*gpdS1n0om`LUsylptuTqH5r?Cc=?%+N^P; zG;$&_1uLUw2HE+B4O8v#7-y{vv1OPlI>H1e;Lt}aBmqdb2s~(Y#QchKKcEiW&fVNEVR@7S$s{eE%oQhl%w00C-*pV zyX7JGTIG-T2T*GW15nZMr~L-mqjSjrcM&*hJ}&B2Bve1JtoaU6jextJZ<}^-=b01|ud^RVGI}IZs@y*wE0}g5~3UdF1Z>I}QWX zjLNxhojw|x3AX^Ozx;CaEhXR4qf?w!{UR+_pBpFCosNx!`~2DZSSJ-!u@&SEi@D77 z(H*vR7h=~wEySTK+vrSciT2iLQA?31Sy_p;y+r6So-SrK!DHj9jOdjhn=WaaA7mqS z8+s{`9bvjcR${HfB&^y<=aAoh{fn`&NHKiptrzi~Vl*Jw<0Fx0z{K8O7vt-fo^afa zGEZ}J+;F!JsLF{u;uIi$q(97kGNXyh&LOKDyljvIjrwJcKK4mLSPF@;EX79H=+)fN zS0*rrF<6^Btm|T9f_j^^rVZ!IAg&{BXV{4&`{}736E0zlgq7f7f{yK007-Z-)pNr` zv#S7|3P3tPTH!&$o7@e{nR`AJGwNED95a9raG1iAcR$k%L+k41j3s}i zgdX!utaGJ_lH|fSNIPcP?{tXtZ-XiU>%|;Y7)nqL@%7?CE_EjD&MQmE&5FfUTLB@< z@t}5gdQ-Usm|VddW;%P`v%+WLath&cr7r=6y(O__?(w$z>-7?H5=_kamf)03?}mBh zo#dkRVS1(f4CH9#-um=WA>@gs0n1|P3o1*m*3E>}yq5B{u86oG`!!Z}0ol5J>TX=L z4c!vVEc3BFy6T~OIi&THE7yw|*ni}b@@mFfra)2s?7{HVoPEKTsgp zIJI^;pzn!dxX7(Plf1~+zGPFO%YV(ghGSR{FKgGQ3WY*1d zf+a#5#i~x+ShIW);ts3je$V>1eh645kXf1R(xn9)^Yk&Zd;iqRFHY`KP6xd%%q!Lw zh}N#~)(|bIvzm_;_|;yzZPLHN_AewUiT(Q@k8;czeZ}RV6879s`^;9%#49}XHT$Ru z?TlLQM<6pkVO#nzk&B^$KKOW1T$ouPM~kO-JD+8m#=m02?KZs|kv4&(1gxcxw)p)U z>{xqO0ji4CNJHAv?KNhB7`i1i4cxmUAeA^fVVgcak-hx{PMgmci5#;}ZvF}QB)qfK zvyuGitYH-Q;y?H^j=3G-fce|oF7sh|MyLNiT2K{2)U7l=6`uP13nK4u?os`w#fWd^ zT1y|~@HA+5ZLQy$T3g7tejE57WFS&0Mcn%yo{!jc2G&a`$o}$mX|{FlFiAHo4)Mf9 z`;15FlMzB~-&k6`#HE)%)M)%tqy5vtT~YZZ+V7V8I0mQbdG*RwKs!Fx_V8%6Z$dL( zc0>W3&#KnmhxlXE{PKACs1Nh@0x;-o|Mt{8p+;k#n^)KNt!u0dKxs_AP1_r*_kPVT z|Kg77P}wW60KI?uLvRMfnZ*)a!(U8VA(DTIn_`yZ2*L`ZXf$rZNV*oOjXrQQ#mMv6&3FXhk z6=bdbfgf%7%t`|blm?}9F6`}XFn4WZ%~OH{)qqO%JiROJC^U>Zfd@*>z3|?GIq%HH zuC&JSzBqm7IBjcW(giBCWT>sp_{?en6_+L)!oyIKCD?$h-lDtOdwHLlG5NYuAZPTp z`-fPc{F7crVjgpL=Yw%CAYFQ&C(0~^DVB~0h;TC*7X|)AM2=8DfjwVYolm?Fj%Z3z zzpZ-6iuw}6>KVtc-0)zX;;hHIk$z~BkV0K<-5h!!C$3r8L)nJM$HWiN-O5D>Ho`hhDo|-i%wqk0 za^Zbf-qmC{JP4Oun>g)IBOHa@6am(ea;l z(=NsG_0>I-@aI?xf}{&kk>DV<>7*?BW|9{3w(MKf8F&q}>? z8mY9O;NMIccKYVo#oPzUs0hAI;w+JrX*p)=F$N6{U?i>G{vh%b@Ym9R3xfZY`uCoQ zEKekAx!bucWPIx9PjMAHbGOzH8(eF?EdAqm?ozSYB+W_|Ln(+u6=w=!2Kw1Fxw+Au zoT;pZiKbQWEZU+DVtfP%@M82FvY)%S`Wv93%b-iY3lYwn(!am=!%9*x?jR3ti{>A} zp)eb~gnNpZn?*6}@?a#+)$|kcdBtXzi3$0(3H7jd9TT}mQ(1XOxLQq|%i3gH#}@m8 z40U-Vt$42|*wyH`m++5ffG6hCHkP)%I6srhQ3oUQlkPjgnh=TFsL+KVbu;Y5erd7| zHm~{1-U00I4lBPKGvjD+e%!E;;h*gJTw|a4QH+2P0iWp?+sFy~k-e`MS%-9;s5eko z96@)P);vSpA^oqS-nCL@=~_C`2^Lx9p7oQsVRfgU^;T`|SqJSmT4J&&mw&Wz%I^^>&|xPSb0l%yNs))MKyIC@oM-zNtx{ zFlc#oQ0P~+mzc&@x0?Q5gs+;CQk0~u6V^;1_L)W*2mzZlpS}$x0`dM#2&m#sN0D6xlH!rRZ#%_66!^QA}R^Bl+ zx^%STe;Q3I1W6TtYtMd$a^>v8T2@HJhz=J%^hJBs@_15j#)taVjJbeD-bK13D>0#j z+!Qqy$)GepGxNxr_OEa^Gh!SdI$@(@h}7`j4}JdgQbSV`i%HG(cvf=6KUDOswbUW! z<_pS(fEV5&*R1y#N>=J^W?e03{HC41@*7Vn$aLrqzAWMeM{h4JU2&1<$u7ln&e|uv zOLOr!RgT47uev5fFHb@D;~QlDLQ&Eb?|uiLx~QuXNgqP=c@9-u<~A41F;|iNFK@z0 zhP6|VExcOW3ViVn@K8oE#qdJh<8d#}zDnXvAj~gD$9YLcnh+=;hsqU8j~hi0c^bd# zqqZF0dm>GtM4dUALRP7<)=u0Y8zBD$^w8dZ^eaw-(8E_BesDN|d;TN8ecwVq9|bhO zTa4AV+}4Bgjkb(__E}GiwH#U^sb2kSVq4TG-jiXql=xxwA5ZaZ0Z!{-^j$5lYd&^D z0hI6Wx%j`MUxi=cxKS+I7nPu0yr4_tt(Kx$b(+3B=BrUp9XC0M zV$e&exxEt?oJ38t?}C3kl$$G^E@@rhU+2o}oOxH=a;DZk2Y(V46!&e9GAXokJY zq*f-~pTa$OMMJX2v2l+OLDwW$dyj0rYWr_A)Xc_c9)Yl-kvm>1f*+bfnz0LU`JcpY zajc^Q*PfqdcJI|_itbIt4|CanVufAb;J6&i4+EmVj&et(|MD!>9Hen|+|+*C@{n>` zfZM83^Rqslh%Mdsp%+NR&>}a0SeSx8*6y^0iZT588+KG^yC$hVi!mYlWGH!wIkaC2 z7!4HiFed7F3YfW?rL-`g=0!@ax5De!_30!uUJN9A8oO%~L=WV){xFMO8q%o0t+V^X z3`ONeP5R3SmPyM?EhOpyI)RDSa;rCofv`n~kD<)Zf-KH&)cQ7QK+8Z5@7Vf89c8m~Ga=v5-zdX{Ym0(?%Vsq2zmhBq>0_aRH*q=e;*wR*c zkXF?7Swynu_j;7pk7SQ#2Y1dl9RKODq*Tte3AMQ;I-HeiEbzcKA3~Qe!`dpLTk?}N zr7eP}2>bJ@wClA-Uo9Z(z4+l-*CfWgC)4W-51N6dg-9Uw(xS)xx#_AvGO`G2mH8%Q zx2IoP8f&?+5jwSh{{ti?PpoypH54dZeOAwLiS=GK-T^yi&cx%%vO#9ppY!m zL%cBgv&Bj-!nG#nztVzc^WrIDLo)w#nYI&xI zL^}m7HPyw3!!=tZpK$E8ck5!rj7@aVHP!`#MJzIz%a6sBHn)OWYZhm%L8M`&GKa)6 zZ>1oFJ7RCuwdmBRZyN5Z4w}pCM{ZbyZj?@tzt2?A=Zr7lP=M9L=WAbE)ITaQKM$6= z!l$v)INvtqV6X8Vzk?YA8gYJY%A5d*L+!Xgn^P`BI+lsw&SxrMf9`TKPmbiApbZZF zj?MNql($tLgG|d=r@7nk>&GMYm?ejwqvb{|^vg@(2e=v_dYIK;NDk&hR^2hEb=UPN zC6iK^ubf*zEmlVDT412(_DfZQ8H6}O71#-_rD;AL?idHV>Fq``)bdnUVQrjfo5$1eWyu5P6L z>RI_Y;fGU7dsdVV`Y}9(=l+ASn3lzLoj;B2W_zb6C8x27W;W%_%$!?_)18-{!w!_igD}j)aWT5~dBK zg&K9%pxnh{%F{2k@uc({&okU{j%q#vqW>rA^6~XaDEKY(&Gf-4?$HN6c=A-nOfwh# z@u>etLG=TYCAuj+-U#rPP^oSsO@qf{Vn_a8?-j@SDteq;>ii{vM*(fUBhQT|Hw&*V z*T_82+33yvh6t_w(en+mLZHaEQGG#sJbiA`-ej}|a4N57j+}*?1ajQpxE+%flL&Y? z$Zv3{`bioInZzB`X{m>61YKPEj8<$a^h; zF%{cx%8C!1l~rUD(T4*)1Zd#5(5bJpat(?)B2P&&7i zrFW78#eC*ViT_2`4jp=?ug(IZWNRO8rgcqkpZBq^KkSLO5xUsy}fBj5}{Bxv*P65QFgP?t+U zTMFL9!$C{Skoud9gPgzHnD=<~gM&|-U%F-oDp21sz0a3g$k#yk<>O>nhTT{Zu01^n za$Mu-yVTM@aVxtARrlkKFDgIPV|YQHz(Lx<2Dq4|ux31-2K|AsW}PM9;pW;!RkXYB z4_QA6&m-S7fYk-W%3fg7Wsf%aDW@QAZnZ6x>SPhVDrvL#eZezkXU&lDNIre55}A2K zW%=KLl%x}P(DfVajBYN69QEpQFCMAVGLWk@IJJ{e^0shDRkZb^`tj0r{m{YJYg?@; zzz_9eE3_?*ubLd>X01@{mkXr>^l_29wtKy-rorV1yv;2m1}cmO0|$vF$4zM4IZ^wN zj@_t!V|S$qBDTE_XStS%_odVqRSvt=w`<~eBMlsFb;?Vp7qn;jl^&C|TN(}b#~b!~ zlQcqWg_q^~NGDKx6kRK;l35^J=Asl3yv=S);qvYhIi;Mp?8`(KM2lvrUHw(BW>}G! zyx2z_|F4dQ?d;|KihYIi)L%{~R!l&>tRrK?+|k1A*3r!E(ya#i;Y9>9A#K-Cr%JL% z0L8e=LBy67Sg-~f!tD5{??LzUjgvoOg9m?&xI%8VyD*bs?b-%XD42YuW&v~>Bcs2> z@I7VT?C^^0PbPmV9*k=s_*xyWion**`EzPK;oQ^0%|UGvxvJu3;>&;@{1osCYcvA9 zghO(1hq#t!IZDCP&1p>&O92%|D*r(Y1!`86M&_~5BuvtEATMErmKyvzqKB-roW-AT z;;e1Vf%+pWFs)pgsOI@w8Q?IIFHGs2ad|a=G?j%-mf4e?AB>VhmifA+8@-xZ5>b_VMTG5Q;L)J;w+1`2SmJ>yV1#xU>9U2d5i z8%z?jB!x~f&*b9>lA?AdlPq)8+b~YaMo`NgG@q$RqTxNvoh&`$yQQg@?9rXW>xlhU zbB^`5lF8zIqDaj78S>0!=yFA<9lhkUu^al>OJaWJYcbphxMk14e|06+Ke?gqu4Gh2 z&e(9SzkFoY-1K^9VOx)%``*L+W0eN1$)5g%EQH9#op70fmB8&bSNd7#C%wZ z|K%N%>B(mB0a4=3tTNC`;v>nsA+nN#Xf3ca@M_D%@@nA#x@A_g9swI zd}>_il2r!X?muB2UaVI*9pHx=Rqv8-ACD7F2%{A13Q1CB&WE5(9H2>zAxyUws|6Uf zJ_X=yjPYSurzAm31*sCcbt-SBS$%i*XNfxMn(46Pav{`ciX4*@HX18B@&4}T7^+$d zbV;0kZ~6+dFwJgD=iQdA&^}kt>`um?()N?Hn0fm$5pOCf&7wPaRI z{BQ7kfqp+DNUv9|aCw6Zwu_F(VvxN#*}8sCznuB6?3){K0DNJ)ouDiqZUrpLCaUV) z42%1$Myy4OG#GYqC}@@TmR0v>@+`doC50oy%D0 zXRz40Plh-F&rR9Bmy`dk4xx<3*h;JS+rI;X^Mn+Z%?rDIW!G^qXVMp7a;R1&Yy~HF z#ytDW`4jBD26d|M`ZQw61CYz{mrob++RX4&Z|-1|$}8Rxb(D=R`|*o^T&ovvDTxxb zYjA~Mi|*X@589<+Vt^@WAZQ$r+ zO!MHFg1PLcbdlXN@&!g{1VDm0AZ<;qTg0199$o)@nu}3@Cj0qvso!}>V^3=inNkt7 z<-f%Fo=CK?Nc)5U;`Zv(zY`y`!Ecl-=^*L}XU&T?^z6)*%%)vyj{W7%zq@@sDJ=V9 zOV3vFZhrr&9ur>6=!`$AcP9vjj50lHRC}J@9~(XKg~UUc*M~qeGuAiW&vD%J{38t~ zaj@f@&)unC!(h>3xlQ|R32mqd>`=upLuQSPE&H&=`;vzMz#zKCdNlsg-lxnUL)pyW z>bT#|qgUpGWGJU%^(Yq-t^M6DY&r#C3~OXUO61hOW$7M&p0|1z*$&+%xo_!Vj9`2q z2RaF5ql9W_wb|dMh@2p~I%n@^_soQia`o{GbJ;r17%@5bl~Q)3&RE!Rk5L@AsgyJ1hE}hTn9e0T0}gNL;n#|0 zt`f#Sa`i_tK%+=zll{K8<*5R@$ucM9n|hFQOE*B2ShrH%muF#j5Ub6|{{(Ak!ivpK zJkfeKKmF02!yX$6{&=CkzUveAi{E9oBv4zmlP~Qb5Yp}lg=Y?wxNHn-jQU;G90?>W zSg?q_Ra$rIEsJs?Nh80!G!?3G{<)hr<4;T99&r7PGB4~%xTHBlF|{l+M*+j}SiQv& zXB)tOI=Mvy!m~W|R=dxV6{qog-gM{liSb&}cn_IyBbng`k^909w~twND-%ZvaW|=F zasB)zC>x_fPvandc$vc7j!GD}1gY_-YfQ{i9Vb_!f zr5)|DOIkIdY;$dTa7;nk_49V~OGZ~p7z*Gd8-W#Tp^w+Mh9=%f@!HKm3hJo#pQ;j7LppwC&My;qz`b8tDK6@)>RpnSKK{}TK#xn`q9o-|NR6GZwWjXi~woP z25w5p^(gx0SHOu<<5qw~@?D)~)3FkBXQro!LK?^8MavfG_?y`i51lI-sl&lNyFg9v znyI_T!`TqWsk$aU$Fpa`+fy~>?{o-k<@M(U?%GP{>{8K}N#$&WoA5Si*CLw>-+GH8 z9lE=BH-->R`1CSzMgmYKSSyBXE(JGNsY8OJl{L|@<@^6xH1Ec|uB~ji8rsD3mS^oh z%Zv&Pa;sIGj?O(u*VHMdWAb`-F42v@Bn%osnu=e5*mndGr}{r6_OF-lLlr(pr6vE; z{-gi%BEuT&ZsEpezU5LCwWbHV91u+44Z4(Ect`yug&%xj1@v6%Q7RtwOW$n1A7BsT z8xvO&kmP6?giSRYv@#qUU#GFBZDl%$}bF!XDzuVi7BXyCH;Fx@Vws-W?bhzWsM z3@&w`0gnfe1En@H!D{;W0th(*&FRF@MCEd>%6<91wIf#bp<$YSCzwc8um1OI zQlf?W3{ScyikF*6JKI9|8MjLMJnau!t}*QtJW%Q%zyU_gSQ1&JfiWFF8q`f)I1~}~ zo~*4b)^0{#lo<^AxXre=^(()$C;4VM`pKJgEAy2p!^oWp!(IkSHdFQoGP@(;x`nf^ zj+fWwS?#_X>9TPXw?jd0kFTGK$%To1^w8-v-B{YA&tUC3k0goL0wpqk%i?8;H7OpI zv(d@21A_kBCjC5kvEu0ra90;!j%pO{xElI-cPqLsrq80)VX2x0&L2tMZzM|4Kg1jV z*7kEk*q_D@k(XCX2c9HvesU-YQ}a7?o6KqN3JMZAan<#+MpQxk7Uz3Fa)T2|=Z2pT zwQ1PqzTcT}UF>aO*`;5`sCA6&^3~>;%HbM)z+uFrzx==Adu#ud#KSmT%*@QVn*MOc z_EkgnsWm0!`hHhmm@MbM(vdlT!`~~y=&jsW!|LaHkWI(Cp}Ju-K{j5^dEQgqpxP^Y zzU!Ng!hX0;*Qj}$0{`kS3FOOM+kwYimg(iC>_;9Q(%+#yTOHzGLlu8fT7X*UH-*IQ z0G0-BV0|b0JzKjw$Oi5+m@fl~`rhtxDeycpxUQx%=l5)}GGyq5@7?aGe?orLhI(q| zlc=9{8>z9I-)3YFgGI>FaWs=zMlux+1&phkJWGE1UUoJ;z`p+Xj>qpU3rOYG-r@W; zt%5qrCGGw4tZFGg@zC-*XFqLI7o%L>1z49Uq|iqS3ybFPc8<@E=}m;+AWhlj9oHTkqHp*l}5x z?I-dov28>`6gP&br{iY^O<_fX=Qj#QQ`(!)7M7P{b(_t`8Y(83ANXBq( zDtyYkrJ<~EECAb&zZ39wcsNGT-}emEOg`!VnII@WO=lil<1uEbGtX5s6DVQS3u4JW z&|ZGH00Vt3Pfz3_h!DW#!XpDdiue6;x?V^)qDpqFXm8kDtrY-}XZ%A~QaeJ8nyz2}!*q=G1XRbfMVuF8 zC)~#A2+9`2VqGLy$|RoJZKZ=RC*}veE-F3D^P_^`qg;7B(wfPxZd1yf=J|GXN+o4o zIt0c}uZGoqX}G|%k^vfvVRuNp8+5aG`(R(u>4g5pgTV(=S?4~k;)hrwPLA9wIwys+ zs)6FjaadzJ8)hdVnfn2=rNL;$t5wCRT>sI zO%uh}JbgUz1F^DuSbWjFM_ILlgO}5;spz%1N6n|PWRWzzgsa*mJBB+ZNZSF(d+}@YpNY@pVAlQjR*U$ z>2heqZ#o^!?bY4oL&OvVkd^QOW%U? z;O3qG>`R<1#BXc{9%>N&Hsz>wjVOy;`I&x-FnI5sPx$FuJVC>dq<5M#V!TWO=dzaE zAD#K9yE89L`hBK-tMAQM&^N)3!0=PsLS>k=)p5(zudz+tt_jh>$cV58r%pXf@Ol4u@4j*VgAzs1pIOh)Hu=WG%zpQ+V#iXh0D_38^;Jd2&FrO!C z&4UfA?fFKtXWRY)GK8({qMOGv`?Hh?{(<>umzGn%5?+2U_b+sf;%kgKcr6K)f)2?Zf=ujOE{O9p;GORnH|#fdTkuggn;*3 z4-uZXhRagg6Y+)&IlK}@>XZbRUlwxE;mJRZ{7Fzv_XaJ|eZcoN70u908_UT!83z`M z_H*FqVT(lV2=m-jyYJ`sT6d&#Usfr)i!@|l(`1V|YA3U9P9VZ-!j2@8u~&0gX%TGi zUmqEU!H8bG(5HHi3cB6iPu=*m+;=XlX`Ca*TtYy9a@__SEB2OCk-z`;AH&{%zyR5C zGUcl@K`0mc{W{5PiZ4sVNIE{sjUN1a2f;QM-ps3};~# z*GCKDei2Ig^=MD#@li3R023{HMhC9+$Fl9e(31q&?4m;y+pHXuaADXx_NEC z&IrSK-2!ER?F||tKub8Om2^erhf6c~a-830nH@WqajZKFO^z7 z&x2j`^H;DUsG`Z&cdzGw(Bs`zalj|wBTkdxLA3Ip%Oa7tULqeQuYapcHI!lJ0H9^I z!dIP6oV|&8gEB@+mIG|}k|%l9Xp0ov`;6kdA`iE7uk(t#sO1`%O|3*(`gJWGVv+KBFIfR}YjjBK;{_A~25ON?mtM-+)?TR8AY#ob3;0WsQv&olxtH zEeX7y7*g=-FOnPOFih>A9Ng$ldvph#S8=PJF+b-NG|YINC&7JXW<(Fe`LjpdnzysR zs$G{Dt8{xkbRJH&Hw%G!_=#Y~2>@czCH}nc+N`A__)#7;!d(zy_n!9uIr{-lA7+oI z1&_FZ*Os^1(Y*ss`RTe;QxHxH+Q;AXNLaswl&V1GN=u{=2Bx3`+(*QqlAru3Z8*Un z)}Q4W_`6t*Q-^3}-BOAj<=deDj+T;i>AcZtJ4b_g(;bIEr!r#F3@Ubd;aQZzACm%1 zKb_k!wbtVfmi`B$WF9u0-DEn>wZ+Y}+Hc|m$b41EBA2r6{BUl{^QyN>Mv)xF&AG50 zf2A_<-Wj8&kFcV$c$m}RxL&)GQ7(;Kx%=l(=6Bww*?EUL^?lY5yH8_#V+fSJ-2}Yi z@OAsgXxXDp)<)5G!UtP?qe;@-z+hcjHR*H6@3GU7%hUu@)|#9pkOzjAd9CZvK{FdL zxncwB;^+`&6D|?96q1>;{LdnRX8dM0+&<_!HRfGe)h@x2Nv31;yled)QCs)KPX=q6 z4V(W->Gdr%ME~{^uT`V-kZ7aan+v?YHp-PmHq~iF5ZCl&osL|& zg+A1Z`hAa8h2~aY4Yd?6b04;gI|4XY_uB*U;W<={>9f5?J9(AZ9K_Kga;*cHbSv;P zRUuR73zc7bo#xXj7+ZPb&UH|^H_Ieh-%e3to;huZ(!)uq}Kes0Zw2vS)3*KjE{=hjtp6oXG zlRgn`q|wK+a$dR@hg=Seq%Xc0m9<$}?&3YCSRm_~k{J=79Egand;Ee2Tani^owJ+X z{p3dD7s~Bi%_AeFRmcgyleFfVR9o*U|i}QYV`3MdvE>ODZ~{mdKG5_b?HkeFyXDL$+jW zpxDJ6zc-2QB0Pv}Er_XVgz&*1;>B}AOVy5}G}+5@EDae!@NhFNz9{#e1C3`C9VEl~A%_TJjNgRu;CMkkaZ%6);zi?Z;!}`15SF*2wQN zd5e8Ms63{_$1yJqBO#7_Ys8UdPm`=Ts`0on%ywo&=ucwYjZU>PqmHL z7gWvicl6%m`s6I>|HH4K#8_A#+iz9e`53w~N#69*JkF!DlF0u2*-h!ugtEvRuhHZq zuD(nj;|JM_mXr6u<o7w0T*8eYT_bVAYI`g9PTYsAA z?#@{Q(I=0U`-7JiBOsERk*<%@5EJmb5>uZt!*H*Pv&QfG8M{fP)mmAcmEz%*+{;-- zA+=)9{=5HV@`1#V(gSt9DgQY|i|xj0PNqfqn4vJl&O7{~dP3Nt^ecxYuxnG2(U9CO z&v^uNnQw-^UiIy-((5%kfuhoAF3>xBmc|-OS$;=`V(c9cWHK6Nxo1Je@jK2`@hOX2 znX{~jMRH>;NPtl;+4zbLi3Nyn;KH4-<43&#qY>e3Kt+1*6>ODLf)8r)z@g}U;1PH&yo;AOJllbF1> z^lV%%!fTp@^rP0B*POgA^LM3)dkc1CZ;%n;)nwL@nd;JszU<7WLz|I1SXMxD22Q75 z1yCQSRyVe75|km*`}|m0F4`Rdp&S9v%_lR9;9}#2xsr`MH%3I$s5J!HmSK-e981ZV zFs(8Uj_A&rtE90QGxVAof$bT%ak`v*Wnr&n-O+t13ZT9#J2=s&U~giwLNvdYc0SHF zjbrd`610BO>0y3wu6;Qs1J)1(+d@koY4E=2nHIG<8EBhNZ#a0|6E4jZ{hPNgX@fnr zSPl5|pgFT%vN2agz-Tx`mDn}S;mcDAf%~bfqNu9hg=yXCNY83#yz4@STYa-@86lV2 z`4m3b`4jT86YMB*lh}SnPZqTeHl-%n?&fq@$=N?c#k3=iTQ*zXw)w2zJ+-{2Gk>WL z0f=KgUeE(ZnGn$$!O2qb~`Bj_+LXm zQPwU!-8Mxzrh2RcHY!&^Vrokz!{cibf~nF;F)xJUvJ6++z=D)_76@$=rab2=N*tza zr6vKLkLk!LW#8`>6ro<88B!76unVFi!oDCiA=Cpz<`V$|8CD`8y5jWRZIv#cnP^$f ztNC0=yQ$O$f1qAUU4(MI`s?om76UOX!JIsKol_0$GSu|9!QPnvy9$!v7u+WORE%5HHnq6uiB}xTZ6!1K$Q;qkdBi_e?k2CJ z_>fUi za@Fh<3;jb<1}TWvuUP?-83A)FKijHx>SS~?7tJi{$$B}7LbZr+^}{q>;kNWi-kk;m zRbl))cFz*WsY7e_swdY1Xfii@0SB>%{c6?!;utR+sl;=_k2bk55C+lP90BIJs$Ytf zOpy$2k9}(~$v?pOcgsfv8@JRl-^ITg7Pt&?w{?o6Qkxr@-rpaqR#9dJgsz}1vjPgS zkJ5UbynHSkJMu@eGGV#8x$s68@9N0g#A+*yCiBIgx>|fwgh}>^(M82SV5x7SQ6#(; z$<5b1HJ>%!k>#m8n&)T+Ki;yrj@qp=McO)N9lK%+kmDcbj~>0{Ag1H_5b$fc5B{&^ zrvG-fwJj3G2wlO}7(f9rn*CFIOz9CClHYPC+;JDasy@=@SJsgz`sF|9^-o^3WBYvz ztDa=ze0Z9^HJqryIEp~yBl*<)6NTcozE2mfksFR|oMd0)Fv?4kmGh{0OCERH76>Xx z<#yox@wj6B!Et;5K{T@}Qxx)pI^xNEZ`qKl2)M$zqR-3Gl>*^a%gQ4_+1DBE$8CrG1~-`qtqo`K2_gH#A* zI$CnZZjYaN%`r>EJb2p8u08z`RmE^8w_r|@e(IT-k1cj}G?5|fb%UYvY-rOkTj8FY zaVX>$%6K@D2VcAUV`aKswMUA7-kc1O`CS*~XQIf!WHDu1LDwGG?!0K}nn_xbRNd2) zcHT=ox(nX94QFMt&(rHGE`KG0S@4*7+SBrVY#W*(0*fqMRI#AGt&iF>w_BvVO1?;5 zl|z-e=IeKQzLSLjS%)3(gkc>R#LT&()E~&$AJb%E*<0 zE9v7NvUT>U{vBmM!sRn|as(;0ubgm)ULV3yAn{8$Y47hXmxQX6pqWbLl$2~JksB~C$`e{9pzl`c0Gr4*zp5zr)m@csAMZK(M{qaZK_OGB zzdHI-o>s&B8h~n{7%t*{#*T>6SpVbD?a>J9 zWt8Z%!TyFFvtF(NnVyoLIfvu04r}usw#5tI(E8F!os*%LP;`sfn+_OL%b+6VR=I$b-AYh@(uK_LI5H;LKtBl2vz9B*@7+FN~;2VSp||CkX# z)$#SHc98AHdB%Wi(j)VjNZc3+yw0`5)F(@8G>cJQ3RtIzdgz)RSrfUV&WRkK@kUsC zAaI_o$w=CUh|+2GOK0ZX-bg`um?(OTAo*MuyrkOcbOEF>z$*E*Qd)#O%{FGFN~y;N zTT#(-g{rfK#O`*EFY2Jg6MyR3I{#z-M_3q@DDjoE-RUzeqT4SXEcrsgs3p!-NJNF- z6{&nwJWjsaGLj1;$e5YcrIJ{rQ+1{UHfG8xD0SLepca8wq4$|V%6})O2$!3|K=ajjL*8|QXB8?`*)N(wJt_~eD3k3N zZp2SQKUQmO1(^JkxSoZK`k0n|nLBu`QPnyq4pClUOl#YGCumzK6=5SleV-Alx2j|UsNolhX;kwXSw_ql=p+`7|9$a6Ma7CB8@rg!SJE!skO<_wkZDLd_68_A zDgxjRl_T`lHw!|OxD*ZTk0wfw)Z)l60U3-N!;3aQjKnFW*d8=)&UsIZ>Fj(Vo1V&; z8rmrffX&|K?)dqpysWreInea4m!o3Dhg?d?TQjps8kZnisS}|Z9TI$jCkeDRn!Y+= zM$`pXO|1)f%7+MJKF=r3)(`TR~K^1TswhUyCO@P-dga zHV`z>`1G&P;~~m@W=^LuUB-zsHD|mC6G5d>+shM5QCPQqd3^z;;cWn$FEl@W>O1ln zvf9IW&XD`{&UZ{ozKYQFhT~S6$^ovgKG4rlp?$ZI;5#~|iS*Q8TtL3@U8TID5!m-& zqxAGw9H-)9M?6$uHeKOsb{J>?%&2xznR5?s;|#gogqWy?b~o@O`isl&tmqqNM*mZ; zI9ySSVcN+dufVZzKNNp(|Bq_!WdDs^J1gp~LSc@R_%c~b&$l6y>Y>u8uIyD41NNaA z@F+Y8p?V=~LDos8)TKK&+f$hK|{(*FrBNrOJ*zBgjqm3 z3nY!4mq%ndR3IRU-(P^p*)an00}CFaD68;t8A3<#JGaQLd@*wz$m(E+yto?Tc(TT7 ztkr3GtRuEs5uPk)r)30GEsG?d>}pt6;W;@>jLT-ZwQ1HvuIL&f=ydIdu2zKk4k~)a z5-{Fl%_+GRFn6MTijR_$j@^U?s5Qc@*2cP?q27-t6kQa>6!*u0N)7LgA2a_`H4^Vq zt9qI>?Dh^d)qEB>nRevLvR}7o-+k8RhR;E>+%u6TV|L=?9N!DPH2Sp4eyS&TE^B$v zm|pzQ)uouXb+}PKW{IhzuO#ctsnm{t>Pp%PNcAgy38fPQxyn8M_4|dZvH2R@|GASp z15tL-SshWRjG~MyjyG;z2cZ=xAI{h^y+KH8M zM=lhVqeVXFSFpyO*{xuQ6X(UkgRF&$ceTT)P@2Ov3+!^MlmG*+A)X z)K5~ptgh0ud5kh;o|O@w(st=ay!ZHA!=U8^pR_IT#~YDmAnb7M%_1IJxsLLH;XZ^& z(3`O2Mcuky2V;qTBn0V%Y#JdPPeUpP%G{aVO`SUZlX2+p=z1Eun!7*VU}v!c;ip^Y z40O^JNt)-Pm9YEY!492{(~!AIX&9aMMr5#CNm( zwT*W8F%kkq-pD=*AF|DYjO&mD6^xg(?Qo=`O14s7&NUP-W&4Ku96C%g7@>sW#j;sA z8@@|+LJN`dRim?!$lp;9{Yq7$3%23>R6~ay&8NMx;b_d)`KG=M{ zLZ>0w7Ki-BXf1XAGI?Rz^607M46nZi#JkqsZLtIRFl-aW0Fg}C24zh%pd($jU)rJe z%C`a2Bl!OV24qL47YcsQ*e%Gwai?G~={ktBn`<@Ywj~Yau+BnH>Cn5=7*w(1%epPh zWu7G}W@{dEC|EO;wN=7|j7kWPu1RP&C=Ha)q@5Z2MBh2u{rK~GA9@}nAY)a1LSJ0> zx73Vi@L)B}ughkt*_AkHoHoL%KLzmi`%VD8%Zc|Jy~5r{`M(kvhZ@ zhS**c+umFFm=D6ZzfO4VQy3oTV;K89N(AZ2(|9hd^>e$AiuBJahMbeOKO**vecPXkXp5akPi>pMO_ZjH7e2VjC`wPs@D z*Oj?+zfXFl**g!fCCaPj^bw!!9;Z^40h z(=#a(eG_6FMRLWw&AvHAF>Lhlj>G1tM6#40_F(nR{Z&v2YPXbh%&i1PGGg#%ybdmW z3tCDMP)REdLxpvT1$n2WA^-7zl+jqbeK z3!3u<+43Ed?(N>tZD!X2D_eLgx2-bt#b5Vf!+LMKXLkB&n2agBrLqsa{zAHjZfKkM)s7XT>w`PW`x%deB#lo#gTwVZeuG&j!fE%m zhCTeIV%@8`Z#IH}EO#M4ZsO>RIu@ziMR}wTs*3aIN@!wCfdp)-%g5Pz^H+bdo&J8a z^B45_$1l@-yp8!Hp|a!#O_s|A?DY|#pu8as*j^FtVIku5hbok}kWZua!@bB&hIh(# ztHvyQc~jxA&jfVv>kmQKHP2>dV>i8bxV+fdb!K%|!Ym$u%HZfoRj(GjBj4++4K{YJZp8V*f8n|5*%b> zfn0R`-t^VIngPmoEqGjzD@#LYzbmh+c-F9z`u)|PKK(OYPK<#!9z>5iMzV&oklM{Y zG$X=4>Jb2uhr_H~o|%Au@75=nH2yuzp~Yzq2gWQ?eTF^Wu-uqU*@nR`4^5+z^$d30 zc`q;Lt2Q)d3XI(ky%G(WEmk?}v^qmGil#&yf`9AlekZUyi+QKxWB)Q7`sbxVi>5oW z@jv$i?Uecz??Sj6QIluIO`Dk^Y+@hjEF~G{5de^{NT(x`(*KsaBN*bf%1PmCmy}ta zc}{QO-C6g$L&uL9Z>Sn>mk5sv@3SjT2a4o)lO`gs|gQQl;YkJK=3?X@G!%2T`7^>FC-Y^MP*!*^?3dWJ9!*E%Kv+n^Eva7*R|P&*;ai+vD329$|B;b8&fy$wPvU6OqVIgabubt zsruhr_92;$ErWGt1)B8uCGZyBy2_sjMIh#JdVGH_&S%8~lb2UXC?&;*k6w5SL8zm$ zm%XWsr(JLZ{Z>^p)k*jT`$x<0KBkWdJ7$lZ+pk)^AN|!8$5(cZZrq+u=YnN@nb}~S$n@Do2pje4o1Q;1p!jsP zXLL0`SsEADKl*2r*bNQhl()1yXVv&~rY)X`yy@m_g2#Ku!v6)N-EkLYW-!)uTku4( zH|aV4;X!}VubeW(qq)4@V0UNM58@mUU3wPZFqW9?pn}y%NUq^}+%sI{z9B3}u&wVN zyWjPuQFxSFOD{-!JtwGzPr{pN9}MX+0_!6xOWb~4(7rlec!UXsp3H^} zg-2xtOdr@YVXdG+344h2uOqLY$%Kr>WR--YeULK*23u6Op-~UoUMsKj@tukK5lRg! zjLGwotrRuzh@PaK1d%`CLx!Uj;U+mF$(h$3@09lFQ{@+l`BBU+%^4ety5-_woJz{Bh2Czu&L->-8M3 z*PJSk&d0BL9pP2J(lX6=7i42H1Ms5puhg<*J%6{})0ogmNQn}zmCc8=-1fZ8ex*;d zB^2H?F*dago>lYQ`5EYXUZv0U^5WGy!CG-&C{W1tIoY=V=uHE)(PBh-4)X1cAuc}d zWFalI7G-;-)y9cRUda(vuLBY2c7n};XR@C+#JLZib799C+5AElI4dw^7J;h4*1o|b zVCmq5B9u+~&h-}07d&CULYnDM&DP)oKDTo4HUAyNOR{6gTbcDY4^Lky+OKQL^xe4w zXsTmGcJN&lRx1t%;W|wCS&K^ldzs#*6zk^9=uZg0om6xm9a5 z*4`LUo?fH(Xm)d?0ixJw(6_01PFV?06c(QA$J@Lwd*`6?At~m`^Y0jZX3*H{b!T@O zBNgR9`gd#ZS>d+Kr^~bhjFyStDq+jtR6yE@^);Dh;BdJU`@~qzhYU^T3*)%~t!zZR zIxoS&@?V% zm|AO5CLN3$tIZ~C{QhErPc`t3JKPZB^ZHwAi%S;lp~_j7j(0Em7rh=R=H{l~MF=q!!n>f*0Yg}*M%K5t{n$OhVCvY72K4cnD!>nkVXLaXt~c?X z1U}gOPK|*osGV0R&@ZLFQZ&6W5GQQfjE3P%STx-d=;{N4ip5u79 zS10YW9+e6(@-sW?XXc}?vDmr$KhJ%Hy?ruaUS>uKo5g;eDZBMqu6j@0_Y^`iC4%Qc zd1cTz(8|Jky4aD@ckmV1AvT#l(nx8MdtTO$osl$vA2dIX7*yrmc_XzZpFJS!u(>nG ze577^z${R$S}*#%o7U_(k{k8utWkfSdOTTz?dSlQ2ASCgxf1!|$c;MAj)IX3Z|ff* zqvJIm|JR;_qT?dB92!P5?Rz9H!bBm$fxS^bE*6G(u%DCUHGRL*uYaNlbjehBtLR?# z1#KI8Wj?Cbc=qX0SKBLD3h}P)PdYF(k2vwYFl|&s8n@B_Ar=~2m^-(CjpPIHP6GV) zI~ssP^Q~Q`uPp>-Z)ea+ETNq6Wej}6Dt%hnk?i@lXJ3Y%q|50(^%B(Wpg$+nU5Ter zE?cm-W=^JT5$ThX?y+rM77%5qavqj)i{)pbZkVmxuti!x?2EkLKJA#TKK1pGSb!7C zUj>Q8d}mgBfZFhb9g02m>wck}l*n$)d=uCpyLMDt&JONCn$6~e2vceYxs^NF#jnol zMx2!vvH~cOGl{~bzCX;y9mUpbeWim0Zk_nE#08|!2SA_kXRJ*r|CJK9R6{pWd89{c zyWwAsnT-@0{z+sbfC}~(^kE!>FR*eg^jQ0Kk=CRU!+2HSpLf?wh89^1dYdpf}xU|Q55$^jc=GQ;Cc}s89#l^3^J&bAJ$qk{i zJYWW&3&u0mzw!1^@}vTB5F;M*OaN?p+nXE$*~IIIZw0dhm;ZsPx#kB(TM3ZnacTaq z{UhPnVMMQ=a{W2sRkfB^j_{%{UN=*EWqB>7aleH?#z2}sd*|k=d3GRX+M%Yg?wy@$mu$q??veMgk(o~;9?rLhWzGe&Lj0>&?jZdN8r3vk!LTToMhx{4SXZwL86u9bg zq`CC@Z>||Gew&@h)j2vkE02KSh1a>rLRtlo;}@iixm?FcZdJd;eKr^Z@yZhoYaM5n zI>~DadGfr-Z|J5;hoO7@AeYr#BP(Hj z6K|GtMnR$PR@>q0nkUUf67C~0Wb{aIs76*q(Sdu|?|nFfPb@25i54z;|89*I75qW$ z73a(&n!Pen6$Z&j;M~OPIjMF0fnf8ZN(|kosNC}BwFkOq=<;cK#?EoX6={*?<}^J9 znbY#Sk0-Ydq|dO~=k1!KW5aC`rgp8@6iAA=TFxs$+&aw|*uV+Zoe%{d+cQ|Kvo2Z+ZXk zs(f&6gNRZZwNL2F{fs!JeT3MaLvTE1HN7<BXScN1NY)7mvNK-gzBmDf|#ZVUA zwzIYKmm2hBz9aRqAg?r@QdT<(8D7r}j7qhf>M{RzJWNq#%GgMOR5r7fTAZ0327;qX zB)dRXv_dL2XOP1{ZzgE!wH06ES(SV#v6K{PNQ6R0K*uRXPYZOA@)5-*?W2EsYq9Gw zXZXQZm>WAyC3^2OYRn^WKQutOvCP3xK#95?Eb5b+eHkjp2G^*}i7ZL38k+~GL@MV6 z)a>JH%%qy0C(zH6xEPzTc;UDHQ#UBFF;Sxjn~!;vzSYtcV`N^ENPo5LOE%BReXqmR znw&*H&`VQ|;{NC^SRdn31gixVjf34$CGsKG1ssdr*Few&bUHH?) zc4v8(3&I4$lRx=(hz)FBLIcoS6{M=Z3vb<)YR->wbHw7mF75uit+hSgbCWN4;EttN zLG3hdH>d(sJn2V?qB09IvbO_zeU1Sf2Ps#5xZ1r7M8P9&xhVE^8=Mz=bVfx_FWmK5^Di#P zaN>2P+YNO(x8rox17PQGi=o+ZD1DHK&^^(Q%8=}9(t}YHdX}()LrS?rLgEA1ioRDE zTm`$H-K@1e_#Eq0W;-s;MB^3P-(nu^e%A9XL!qyAMr617)|OUr|E_Z>@Z7NV%lDs6 z!W|cHo(Zn|rGp=N+4f=fja1itgOanbn)G$aKDsq)Gt)07K2ZBW z9?_1J;1?8_DqSrJt;icO{PAbAP};n}t^udBsF4(gDDd>aO}(|eH#FVJk!c+5uw#@W zR9$=#{N}O{a`PBuEJTR-c*JdpK!Bab=^FCG3tK0QLR>nkaYh{@(~caDi(SO@vt&8% z`yKyL{TjIdCBqHo*B^)&5IS)?cfZ<+U(p8D8_{jjH`}yykKY7d55L&2M*oGO71s4N zIA+rp2gt*>WA-?ficfG^;TN|$x`aMXl6b9(;x1N%i3&@bgbHV3Rn9L1!UG01AW95G z`r6c5NoKt;)6X!8S)7hpon;G{oeMYn)orx}cEAswVO@zn8zbW@b_#2)qSNKUOY|np$C!}R*P_o z=VfkfeIg$#jwq$w&r01+89SVGqChzUX3J zE^y<)XUApEg^fy|ZiCa)9as3Yhs#-G8L|3sS}HUO4qye6L8DnVEAGxS;6)&XX=r~SGz;!X%x%l6Vq_$d8__b(S+ z&}==U*v!YIr#fRISE?i^x@l2%nBY%Era+RkQ(CKn?u?VzB6*Q>Bx{L(gL<@s!|K6O zI|u4c{Cw$&jmy*k75L(z!m_hq$%S7>O0nNDs=@8ce(zRBYl z-!9&y_O9?bPa#EFZr+TF9Vaty)#>-2g`w;(Xf4>aLb`Q4SmMq<$;)XyEkw}FHPMRh z3F8e&1dAy6?-`K{d1|* zas9GFV9RZpW2Ccjw4PIjZe`ANc_?;IG~9H&rTmiaTD~1;$AEDHMwyL(%bj+oYd1*? zP#YF7vlhn{Zq>zyq?F_0B`f7|MDVWns+Lz6og}EM$veb=j^i<4z*YjhV$&wB{B6ZE zjR3b=L#r*5qlC_`xnnZaE%B_nin1c zZ)?T>qL$*@`{Q@ZbTp(+d~r3ssKB?>_$8Hz&-3WN)j+ncQXyhmQbFiY#XccEvVC^< zE^Ct6Um z^B9(As2N`^-{E@Bs#oXWaj~yFa-aRU{>stw`fiAg7}OX?NFQ*9CT}FURLc3^D~@O)WN zBk12yInPHs8z6&TE$NB*c(5W8g@j~{srt5n*{tqL$jU9m{^auf8u(+7&obM|=b20C z0*}nwb${%J@6+XxSP66MA(>(7Ia=M?{!q&bUl>>uxwp5VVkb3AV_Vk z9qrGA33u1~4U|`^b~lMT8+#`|HXta^Ym*MAClEIO&nknD<||(}BzS;?UQs1Zsha|} zR831QRB~bC?tZr{=2bAQItgpW%7Dq1kWn{UuVBMLY+}{7GW%eGpZ+exo}w(&&uVrq zdPhDBhx|oan(1F!ttql`*=N2#q8qaA0~SrnO06A93|!VI9BK0V1$;jUtvvV#{;{Sf zl%}R$^8Qg8$iV_e%me)n!nn$9TL3vhYfH=m{o#C@t(4KRsI1@KcdN6vn6fClc;y$8 zT!XH0K>9)J^7k5|nzF%c3bhv+KhI|;qAl*Z?p`{#W)|g7^IhRaqb&7HSfxYEClIdU zRFEtc_dvqW9nz!YTS|^Zb~*J|iX3Bup!p4@q&*Qg@gRqm_bgJx3&Ag{JitZpVy}rN zy;fH%L-&@-TdG>RQJr%VL ziVz!{n;m&Hm79vvyP`3n1*u7rZvSA~G+lSK9LEmEOd@S72{xS1?o zeXiSSj-vr{eJA8I*C)|#4N8m6UA&_`2qpKP$J5T!`O$CBxGvLNy#}k~>O4g=+~@t? z3F154X3L~k0uz%L?wW^C1!@%sd5ByRc(?EjX1VxXXjX47(~X^CPXyTBqPaa7+VS8; zXEDSUJh*W4OR8yzBBz{W!@sHso@ zeCi^$WF=Gf?)H#Ut2I!I?sJ!=7>W==*`lD({*_}{PJf7qXC)L`;A&qxeOjSMR!r1X zR!=RCZ@IM2@(mqYENufk%pi&Gw&n_%7qH)d#}|HyZtrq#>+e{bAiaHZn}eRcp%i*= z^*OeawFN-6?f%Nk*-a_ucUUx9LMz6gM+_!jC|^Cgs)E;|0iMl>0FC^UWRh!=xlA6X z;v#R!2vjj}cz~61!E@aq!PLz3fQ`)DM*~ZmanD96F`u?f=hrj6~ySjttN(n8BWQhRzwxjQc(ozbu+j1Vd zWm4M1ztSK_Eu?<-d4zurSJ35^?iA08EV5i;on!W&S4w8ib82Eok%w5V1T=C0xnmSb z6LOE!=C`!A+rE3U19DP!kKHljH@Coya$Bw1?SLR{{9r#L;q$96tOqsTN^EVTJ#Id! zW8PtqwM#4@pUtLQ8Q{^d(VtBloz>$HCO-GY*PE6n6#lxrdwR2v@CB>aF&qH5RRw`p zip(0eju~09u?xW$tq|Exm{>R(|8hN|Jg*B>rxiO>ppW~acDgMKQ+}{<+2<2I8uzhH z7x40^yVJ$Qb(IGSxTwcyrhh5gXPG^DC;iHld;8R%AQeb+v2tsr=WBEaZu^%zx%t9+ zsmxO3_vCOsCceOYVp-{P!+}v`ru79moz#(|P9p^bx4$8v2i^Oq2{q|kv~DvHiBAZd zprjFr-o=;9T*tlq$oGqIufu2qImpNlfb@8|#t|PK)cB=wIl28*jB0$uoq-gaF^|OW%Iq=q|mhq zs^4=N)D25|bLx;xSlTJ3_pSb%d&bwaItW~}ijv$jG>r1KHBNAY5oWY?pZ>EJaDx}D zF>Up5M$R`rD*W|(Y9&5vJKQNfa$}yopm=i4H-_NY6TLj}+fvY!g2jAWq#^LvUBqoJ z7D!gYHK7dfO*K$nsfA+80UUj|zIrT@*@xYGkgjb#mv2N;ilR8-QDL@Cc$$6doU;BfqVJnnamwU2!C zo`~GqV_g3}L_KIJG`BWQ(UwXEkd&k~YUNQypZ)+pS1BOc{Ck|xu4;Lvl#E5oO?}s6 zkN8nN9w*VPD`S;JD$$&VN-9HF%MOecvr-L7_yP>KggyATZ$+Nrfmlq=NagI`rdo3C zs}1qKqU19s&lKrt1OEx?AUz?JxGPQNa(vVnnVYZW-C6>5G848?Yx2OeD&G1YJ?pXy z-toVpVYS!4abwKR==*wbFce;T&P>1=a378ycbPJRicorR`125on?{zCx!c&$+`BpT_i-l)~y z%jvt>9hXu$YHJ$-^(7!_`r{DScz@$u3~?zL>CF$X>-uFmC+5 zcctMrOzUR+H9CGi*YmSRTL^_UiE-I@FQd^C_?Q;%@Scr_B}@59`=jv4j{*$ur(|A# zyeIa@hgOcY^Ec>{(x)lUXPMyEEaOdi24*D~>%sb~_UG;`&$E^_;tK<0Ks8wFw7H(| z%O8g4k8T%l=+FnthRP8Z4`&b~tXcw=0;K`>G($5j30LEqx*gVn3Hh7R2Y8fY0ZJ`% z9FW?kMNm8=Y|Su8)YALEIPTkWl?pK|#{HfuLPF!c5lxTZZg~|tk%(f?2qSH|48;sb zn&x^oBlUxCN$!L~eV4mTG(I7HB?lUl={L(_L-u)V7qIUsT3=;`oreA!Pb=0@2<$Om zu90~XuN){&XmAgU=`KFmoiRA(b}4Ql0PFJ9E?HajlOC(}Eb=>w={dR$3*e95juF>e zzgY7{Wm@ef2(0JttI4I&`Rny?563qf-;Q^ad>d1G(1Kt)yPLWq=<@+B>zCZ?03xG> z7a;wS%<4Tm|M~x)HtxLOQenr_JWk7}b=MN1=E@36tDwp|ozt&i`9N!&1~hnm98%Ko z{UTSqGc@blG+2sW^L5{^=RA&0EPU$qEAdJw!yNmiZ_?$4MDRavX=T&wUL*FrkOPqB zgsUOOec&_r4DeGD&=A<$yTOdgGv53U@Oiy0!ne{e(@22-JmH7Tsp|PacG0G0` z(y6!*7mMlngUIS~hS*1sEC6Z6jh6GUoWAgr@p{p1$5?}xPjWEubg%;#TaLkV_ib!F zU|Gp~`6`kpvzA~hhU*T=;L433g)Y0;N>-JWJ8?-gxEh+dA!(`reS&ev~^B%gq(TxOJE9PDF(F_!e1>UD+a2>fK4ucxkT8$Nf6b# zdWrS`QrY_=?}_vvyb^P{RwR*1;S~B+Y@XJM@}zLf0=MnS-ReE4H=!+`{W?Ke)YE-l zTZlme)1hsAM!a4JXgz&`DY(`4B~~+HQw4+g=T^@@uP3^HV6K{nAJ?R=IHeo-}D3iYb9An-)}YRr)0G^8(|LjGbXX1_Ab3qH4f-8 zrm6dA{CoD-Z)QCAE-$%?pBz&qV++EOY%yhG zQ+I;hl!2%n-K~TY;PvT`Z$V!m36t$&+X=Ed(ptGwpD7+El@~YcqgvWHJ85+r-Voev zLYm5FY26;oCa<05@4U-D)oG>;9b7j%{L=J@5<#;MZrK>S^k*h3ZF6nX9 zqZ`WPr-H*@TOZjrzx%7%nL5U}Vw)7M=M|<;6#|@d22cJ$N`NFT;hEy5N81c9N)(yC zxJluV*VQBdrPC-%pu&xLG)Egl&80CwZ?XF5P#rR0nSxA zaanC@=a;2V+O^LLD$xgbb3*AuB<%}=#D0G>khb5zb~UG3?2$M`+#B*U-{r5D`N+0Q ztu?SS?!RT;7rJesTP*0eTyo<@Vyta{$mrC_=nb{I$4R^lpU&ZrewfNU%hmd9Kfab^xh5Ab!!t2T!XK#)vCYp4s*;97)>Rb!2^Unlp0c&6^!Whd5;b1M`Axv3=9aU*Wa zj42}VtxPrWlJr>w%d5xicO4)}a~086{wz{!xBn6%nw*h` z(~ZhXa%k(yR1S^SM;__STT(4Hb$3UmEJS-%*?Xpa$@1tN+C7u)+DTW=SQ zwc#u^9mP5ck# z^7Vq|G-TUjhb6B28O|QbqBl#i5o=1G|&&U@Hlun&W~wdtpeObJ?AZ9oZ^GCv>5x(>Uw#N zHnk~5qecR_l})c|@$#Y(ExxH9QPE}P0oVCw-7>xq-f`pUa^cE|f4WU={yFkY%QH>(P?@pAIEEU!A>5qbQEA?|f=DPO z1RKSz#>(I~)7UQD)3b)wRQu=;yZFTdw}#16<6~m+$&EeS=&c4u>HkEz%SBFLFgj_PglO-i+7zRM2*?4h*$oxQ2s7tn%L8!2w=$+FM#bBlf`oPWECZiv)%lI z`o=EjuYZV)X?=Z{!@4mns5B~wpsaMOFcC=hKwQBpG$Zs{ZA-ad^ckor`9INH ziytP5ZX6*tm8fynzj7rQXO_XWF1{{$9mv?7Q`Y#kt><0p%suQut8BA>t$`-SjH~iw zKi3fhG|73rtEN!=MFk@bzqlnnVrYD`vC8^5a;V$jpEj%V-OTSk`+~rsHpvK{SwB5_ z_vporEPf9`F((e$y*GpNa*MZK1$@x7Vq0sr$C1vka; zT70ywY2PtFQEF(Q!psRL!8CBz=@5dD6bT7vKfUV~KD~AQoMkT)MePt#vaorSKDV*> zV6y3z)b+Efi`6Eg`PnAai*o!$p5Ng7H=p1TwhyXvCBV6^cVvle$gB5yxf>|$Id>Jd zL@M)rXFj&!ksePiNZt4%=~n{$U34_APATm&PqJAonv7{~og*r3lk$Tz(0v{2zk7mE zXMJlAZ>-dV_x=QV$DYVfhg1T)X*ackaVD?J8WYfxPj~+Gl)6uAl(BQ{;}u8O<42$l z$6@x@I@E`|lTkH%nsz_VaE~R;+uWuil0)u^rlQc+QIf~|oQ9PN?Yaha{s$V1eF_aV zolF^BXlsBSf|PF!d{UI_?G%f+@kQW>S>2!RER)BOA!%u#Abg_Vy}rdb`W( z?jnEW^BLG3JL}JBT%QirjStCuCX&Q#kbN4ihyQZGm?UW3P?UT{c1(AJ7_VK*y|rJJ7pMx^h4bq!tH$?m z_HNx?qOL2p__nS_?aKeY60S32gfd@bf*`qEs->A;$QOb@oS3P@?)p8GO>ln9)Z?ayZSen(@pH_b8?SSWl0P;jXD&E&jdu95 zJ}0d6yW||2efw?PMV>=7t$(`Mv*uf0d(tnqYZhz@-z`$zDZL=qJ=4$BFDu1z%J4YR zZ!`Lj(t6WvCN)`jg};cP0K;0dnR2uO$1e>>_`x=4{Ai1n@m%^_>vAiX#;A73UKPAG zu3`^84q+N~GsqWKitqwi7A6bg5;oqL+`Wns;pbvb!hrO59f7lysX`i7~+;%$_RiWJJ;m@(+pj}b$;kQw3E zS_(mM1CP3NyGr0^q(%#g3ny7yW#_5NbbNwnZ}0KO@wh9lkcU!fWgV5&tyF6{42a_J33l*Cz-t)Jb!b|o)!@4@`t1)&MYLY)I=KIK>WF*lS5Hk?|_ zKd#J=0KC~9ChzB#TSvR0Yu7J4oM1P1H4De0LleJk=c~l8+h(Ys`0c~mI`v=^Gf`;kzSP;pi^j{Mr_55t#XA9XhKM`)H8JP?w)ZMf1pH^e3Bo@tZ923c?$u*rY1De+qm*vFrWY2#( z3`aEGA1cnKenQ@_68>a+pzk>hpLtQ(e*yOcmbjII!KQ42 z>*PI1=-3sadzK|Vuq&!Lc8m?XB5+bB7IgG07 zkB*{!S``P&g1BjtlO1eBU6DfVxLaEhe2YMxPG!zAH^G(w<65Bz9K?TTI9&O>2VvwLnTh_5%BJ^(sq9TnhDd=}|cA88J6I`t{rskH)qBzBLLbVF0Hx#iS9r1XSi*rEV|3WSu`Dg#;VXQ8>Dxdu_Dsnq&)Z3hHJ&F@JT zMP=`}Kw>Vg01YPsnT)eJUoauFz2um??xOzOv@}tBAofLFHq1<5l+s0I>w!03(wH%J&AH=nZRPBV%I| zo(0~^m24Wb3K4j#He-crOW+3` z{99>rgu@&>Q6{%>4E0<;wg0=!>{5f>V;H#()8_UlWw^gq2?=$L&hKxxa?`E~VP_g| z0?kK4GKO2byr-)jAhwa%E0qgTp&&h3HlLu3&g=lIvs`7ZAjIl-FNFPNak#@XbjS&vx>Y5Vl^}iD+jT*AxYvPzn0jE6 zqM-VZKEBp-z^}{SJ@}8}wwLgN)?r|l_&IssE7l%-I@Vh78ZKS7UmuFE%U)`->x*(Z zpRix|!G@I8m6Jro*tfvcRDL_86qn_Lm8O+kR`yVL^nC{@MRAp)B!1ODWSF#`OU)5? z(RqpH7^mxFP(X28$QS-(vO>_hg&;FEH3Dof%xotT+@Il>Bca6`79my z#>|De5+8pmVV{yPK`lxwXHIFY_4H-5;6zUUz}z@i_m83@e%9)A?56Ir&9Y=d5t*vd;TBU#4zJvowOw^ z6-y7Bi`dZ4O*6n7LI6^%Nv>^B9~)nLU&?*Ob@5>9c+3_3lZu6xnWfM+&*yi7SHEq& z5IQf%JZk9k+QY`=Hl7!eKq5O*C^GaR<*+ZZ(x(W`i)U6y>!O9;HxLb|Fc#pt6cpV= zA@BOjKuoFpZeFIJEE$}qu|ZFv*J&$Q>jl%-_W~T*abi`*K%UfRDru0vxQ|CpNpr~GlE4MpdbFXd!XB5nnF}8ds*W>D zRMdL@8ln4r7v%S#ZN%O&_JVqUjG;fdqkBU{jyx^QAuAkixA4O%rTBNPA6n-Gg zx<^fp&)4|94mS+m^CDwdSnL&0R#XB&(7SMnPcz@!LrzTZT4B}?i{0$L&X=*~a7rvb zepB03^ZsXV2v^7X5Pt48wKTp=8Wrv2|K?a`l7JymW&a5=adrDRv}x+i$;48&Jg;*4 zp1Zk^o}t)Q4x!9gcXrMEq@v~Ya~A?n4}W_ec*U}L(v^HH$xxFg-2$zYi_sxjwk zr!_9eM3*jRN4j`TTx6{&Zg3M_$z~lKNnPzjz~MB8qo+YNDhmmyEI-pv>kj}xPHlt z^M1#oG25I`_Z2=Lc={dvGn}Qo?w|~ag#G+Z?W{1eNaXYz3kzr?CH7wzZ)e3=WO_Ia z>u&-Gr)3k#UEjA>Czba8{%yh6+fjB0wsv|EBATsZjzJmvJ_6bB{&$!K zOiJ&r!cX9}seU0w?>`yn*Kli*(7qQI8~xJ$9>K7o$-n16Wrh`OYaj3n(3;`d_BZOf zV8L`9_{7H6!5-lnO@W>vSJ|cg662~8P)P8T738Dmgr|Gfpf(u=ccdAw76?DG- z{E&t8{t178oZ@SZ);LLu><<0X*0yYEy)8jGR>VLEJ-9Ou@Y7GzH^DS>`V{QQ6kzVPke zCvN3KMn2{DfN?Oqq@^DFz*5^7(w951r1AIUMI}$nxMPhk^yYLL>V~`<`3@HQ9LhK80dXL?R7^ z7Zw`~TW&2qBXGr1rW@7n;4Xmm_ zzXiE*1E2kohdxc`$-Xgc^Mez)(7R89!8>26PX*nCZ|1ZgOFdMI`;WmWw5OnZbAJNe z@aAxI3f#hAGjCLX?>NFa*&0z$=Pq7aKeL-L|Mmz$XYoFQ|Jb9aC{R;=XW|a2>ykvR zw{P49+-1gp>RvYSdjx-EoDowXg+!M-BH)ufZ>3YcVWTG4i(P(7S{WSgYok_#fl+qodG=NR^393rL z>?SdWj15x(=-2D14_tSQh3;Oh&Mcdo{kz*byQ|u}TF}LvI$jsM6c^<-bD}8=^(@s( z;o}CronOxb$RR}RKyB58_BNe(Ra3(=%B;{Gr*P|}Pn0ZBKQ^h$6w%h|#~%?PO-Zy1 z6kw6T>J`hE6vO9|&0%hdz``Z6`HbT&XT0TgoyAvSV;VA_!c_9gr+`BZo%r7Qv!?BY zZj=}>pUD&_o~$6(a7=zyI9pfe9f)DAqN=HRG9 zl90Huk%}1_?1DQCC-RR<-t4ILl9^F-g^*9Va4rQjLa-(Jq5%`o;CYL}596A6A9#=> zy<30#4Ers(S*D=QtuHdGMQ`qeCGcop?w;tmeaKBv=sfYa!ikrt()O&;0?( zbQn-*FBtv+*lpzm@5d-un_WX*rx*Qr_p=8@Kj-mol5Y|ac4R?Ck>&F?q(oljHKT+xbkl`j%DR!-U+~Q%!7RJzwn(Sl;L;?ox=5XdbV0IyOFRiy8K)uZ z1A3APo>6K#ou7)f%4f^9$E}6AZ&)0UxPSfuVF1G4kMcF{`d@lLs#vpKC!h3hyw=N0 z8RAw;JgR$aWYqAR5Vz46tt$F{M{8~t$c#tiJ;Et=c~91=N+z8+kc{ie0zhfgYDuN6 zXJ7UdzV&c#bd>Gs5)h)8RvRO$%1|zZ3foT-Md(R!ug@vUcHtP$o?tODEq(HimP-8* zV0`y#=<;LWT>Rp>jWkhU&Yt>w_ru=FYX$&oS*N@nJ|w4qjJ0n*(`+E)q=i&HP_qe%7=dGa)9o z-aoeM`PR%Q2BYMz({f7a)u~xZ9z|tgR!I<+N;OXmw^V{$cjRJD_`O3VOR5h*edb1s zZcqwdQN5teGJ4&YFZjl07X0L~Weh21D~98B07QFTC(wLCDX&ijbG!`lH|AHYZW#eh zD`QY-E;CCMKet)#uTX5oGPZMv>gXXbm$s5gY{0_9~kE)?pN!5Tmzw3ALXAv7~iXSYW1)SoKUDc5h!|3(~R8FuuR|I_HImU8!h@Na4r7Ux{fK`HlI?Qj5QsrBd zTY{67XJYf(uLZC2oqEX=(5%6Qhj0f+hOm@TXla(OWzJy`Vb5+{+P9RXb;W$spUg<%a`kod+k3%ZRb}S;t$tJM$H3>?yI+H zP?SsLY)RM>TD>|dZT-w*LxaO|i(hK2?5?t5?Y11T@h)PUUa@%3i#vI7FVP zsgl~_I|e`9t5b@Br>Z+DDm|ILL@99Zpgx39Y@oFpHpr+Am_uhv6x7OUzX zv!bo}gO@d%XE;0MU&9py6L_8;dEpCB|8bE2*~to{xImJb~~LjA}( zN#f*AbHuAucIanh?!{s~v>H&echy5n4~Zccu%IP?{Mz~g*VJw5hFbdw(1GmY>Fw9| zH?>?sc>Mm`l)6Tpluu7pKu-2QB)o1ktY#_23dbpE#6tWM;w!0zGu43My88@fMar(L8e^g8CHq-WYd>k_S=u%{~67CWrD_ zBw)8iZrLQl=PL9^_E~EU~Q#pnH@poL!z@{IiJV7n0wwAhmW3V9PjMeQZqFJ)Y_R z{U0a2k_weVjuoYlL&@2e4kWQkNZ67J$zjf??O91up-7X{QVuzeggGwfQ_kn(VrCAR z!_3axcfDTk&+q3CH-9}n9@pW19Us@lQYt+ zIG`8Mr`oTFA9%?3A^MteuM}CK?Qa{}z6mFr3!y0lVnsQg>3n?O<=Nmp-%eNv42XWq z6o1vX^P7he__6q!1jx-8(;r%Jr9UC?GyZAB49(Zlv{L-1W95JkvnOOdOaa%?Lut_; zB%NR5_cA)*V1_vFH@PvJgn`RFRYhpDA`y^>k5|+$%A~9t56DT-c0NXYAe~34;Vqek zVLvibLFVae5S;BOhgA@@6ipA`6^`0TjiyelU;S1~Z_vHN~D@`d2C|s_hN^4DBzHpbf4@LLdC-9pvlMCr-}sxY=yp zwM3>|xrw2MPburVUVs|fwx;(Hd-iCbTQtmu=xsStm%v=VGZ zA(xv*E=hs@JeaYR>bk55*!OqriZ$0Wxqg@N&o?HKg`A3HR*5$AcL$MTYPSC> zn%)Rl5D-N)uH_J{{I(z^buqeB5&=0vSvLW{^jS8ixn96|)Mie`8<{Cqi#As%(n2~G z#E}d8cQvav~>8$Dz zltM;YL_ob;H#k;Se zA3GLwBNcB9*$@Q+gnkx}wwb&0603JbNota?&aEa`gL97r9n@B7JSJ4KRMgPTzJRECJaBeSI^@Fp=>7po0g*U95I@UlsHn5e2~qH<*jdxye_gE6C_>JWysMD1 z9hp`pOufi|r%?Re1_d%GCJd@nKZbcEy#1z_LK!u!4-sDfBHyRM>$ea~eZ5+=om5?l zv6*z7yjV8jIspuRq{!Kzg>}+B-xMkKVhATH6rd`YcTTNeI7d~mg+YPA52gAkN8OGz zy>;7y;NGqk&#y%&c;Q)cCX;e46{DeVP0+6DBv+P1e4hc#GDKnd;}uSMMeOz+V9WkJ zK{|addH{zu8uvwmmK3L-cSV9^!9Og1P}V&{UYsP&0#z9p#7G#T{PgmuE`GEMc>w<( z2zKn2)pz?TA4%G+AF9Q)}T|yBeoe6Y>KLTLJw)4aPfGSpvE7EmInZrJ3NYqRVG=*Z@vvpeW#|ak6uLiMU`96uD zs^r(G$jO6;nd8YDP)qnwzW|u*nIg2tftI<|Q z39BjzN8{|Dr2mQlSMvQI`?qNRusCPjpIQuc)P0XV>OoN;NoRDzx+HXd)aZ}pb8t;kwtgw3WVMW5GlI{+DiZDl^atzZoNZ0fKM7~oaY?U#suJ>XEDxRE@u@>uTmzZ%`gxXzcR4=iBdL4 zrXGK*$2_g-7D1Q?odOGtWV(o5E z6}$ZvndYMOpND%4j&3%5Su4ZLu5R-XPbW+O|8$4)zc(8kle3ax*K@>qe&;U|DGwhX z?hD+KeRam5IH-064OBifXVh}-Qe>aw`Aq;w&q>#nAjuc#0FVZ?7i%4WogG1Mnfk|! zLMvUju1sF|ds4FWWcP;OdqxxLJ*OiSYjBq(98CtE_@xAE1*@v)Gyv`tyHA#3a_-AiFDA(eUvr9H6hVpr zmcQWpqvc8wQs09Wf+@0ON=T?eWYX9Me|W=mE<(%qb>(_He6?m97MjDi*!{|&;)otr zF^R-ZQ>kFpZ+Fwm0gfol#7Tq1-hZda?2gAW}g6WYRFowbfd zh>{<&r35}y3khgEo&T|F+^%4n03eGlbr?PkPfXpWw#Q7(UmZbKBEa?Ot^x{3^Av*d z)b2(86dNgF+J0@y55po0BZbnUuhZ$f(k53T)!HI(pFsNHdw+I#=k`8tD(V$f^!?;# zhQ}6Gzg_YmEv9LNrM{uE7*knisxv6#y_zcVtlC;^sED0+u=>3Y8C*N6~-UJ>jMK^hDy` z`{w~2W9u?d1e?7v>=}F>)j#`L_Ln!^dYW;d`(Hc;h19O$tED!5172p2l{F&}$vQzm zT+9|MK9bT<%$#)p;rtj~{S{qxrl$#*cbXfn_5%Fo&WSNI>XuHfz7JNyIkE*(2y)5M zXWGUWm`B42nK(a~Zixz+@5=samHcX=z0m!xyoky-$P){!Os-_LtVhpNX=ohniob@M z;gr}zZJrDeYd7UH{b59S&2_UtAB`Nb{kKT)^Puw*K~8L&%a*5b>4H@3qOe8sKxV# zNI<_>a0ovH?>(qcH`Z$_sQ|L$T}OQ&{TM2TBPQ{l6(Ckqh*Da*=PGf1jO(Eld!`l1 zhrN;y6pHKOeOl0Z4{P4IR!rKcsVNiLl)%f9n~2}C;u*DenYNmewfmsn;RZ;WJesw3 z$O&3OD5WTAU?ve0cFZIP(cB!Uj3@1Vb)u?G&0nFuXLQX2A5SAqL8(=7h?YmL7?Fy| zPyUlLJDw1LpovYimHm^KD87xANb#y%J8pG?NuthH-ha^2N1;!jwKp&`>+!$NK~BM$ zXU8u5k<5914j-w#>OVQzTt5WiDOq{{BZ6CBCP=axX?;OfJ=*ol5>Ta;Q((il-j)68 zOfSQ!%ZYLilFH*e_|)k%q_@w7gTVc3A4Zo#Mu3Vf{(Z;)GdU8nlhkH}T#H~|`qADV zxv$*ck-hS-DdkrMdL)+5dyp%Hy44RJR|yb^BxQ0VZB*V@jC>6=dcN-APTreVlV%c% z?cO!UdCZ!bNzlWl-7DM(Zf+J4W!oCbrS&;A5?_}7W~41V&Hl$#_>UL+c%)cmtQX)j z=>=3iGoR#dH?fzu+}qV~C$8b)x{M5ozd++WNB&Y1nvVP&BkrEEY)@i(`XC*7Lfv+F zFWGL>o{5TfgZ6xG%*Ns+DFY8n9zXljcUg~g+8lar*YQ!JKX3TT7%!+!&PFsiuPe%oLE+(_77ld*@n1yNl12@> z^V?kZotLbR1|f;Q^~&T~#AlNl2q$g9x4ygOy?4TPpxBqxYI=RS$@locGLKgzXLe3} z7s2!-nMcMWMu%bSH^A&&Mm%qWS3~JwY~|u>n2x}T4-_$Mj~E{I;jQw#P~fd-Zr`vT zVh~>y#^dx(Rn@iu92aN~QhULNx9x*to&y#fhg0=RVOkBI|b_0VqCPj6H1oAuNbsoB~A{5-6N{0=9WVD)A?JD-n4MGE-*V2j-FRNU9C645>S%1X!@b*uyxcJq)p#xK@8q zWKs{H;8$8+|MO;(&vpoM8O|s|wyn|E6v7ocSmD4LPharoW44;UcRpBnpRe!@HLGR6 z+B~l!nh8hV=W)0lYjTOE{M-AbNN(t$)_0bh|r@nOr_943snf(}steu~ot?O~MjFoeM5 zo}9xkJUQl$exR7v(*lsEc1J;(YQO)v?a8t78wm?g(b9=CMW-_d!+ z$J23@<>Bt#)YZ9m(tu_HtErVoV-iH?PaJ5NIN)}FRE8B-s*aFX$pH0O)3pHuP^bP# z6zN}cuKqCx84yyN%+b+_FKEhdBXl}=e7At3E2#YI;n!u6O+_8Q*VySeLY_o-FLIkx z09)USY&g#aQ{1?}3c&1W-uf_}$HGTEbXljucvO4vUq{iCgY3pI&O^?yK)}%CgK672 zt`xTsjnf578UQ$k9&e$5FB3de0lK{?#JtmFA=vb1vz(uvkZ2zQrGuanWuD_>T|@} zybeUbC_lQ!wHc}t{1Ls8(?S(uaLS=U4{+72q=M>?YMfQKcL@WSrsBoKy zVcafYX?e1Kb+VXRC1`MBPxpgVIN4lnM64j$$``?~<>u7JRr11&VYb;CIXvjO7VHkBO;a{#9Wpf}n>a4C8n-Uh(85e}N@4$~2xcjZhN{^%i0B<$-4` zV4xGg>RDs=kVzHtME-GkhU@2Z^V$fGII1I%B0OEcQo}_TfH}Fmp<%suPMAHN1{#dG^5#{a4XI}wzi z;ghv-&(pnE(U(&IP%%!Nx9E*?VyjCe_tJGeZYvD@9uBe-`QyX1!YwTeb3Q8uyl+Dx z#!*nt3c$fwhwzEYu6l#8A8+;3SQ)6QTrUi$=Z%9|R0-fi*HfXF(l~!{NsP`x1XVC< z?R8YNqc3uuFGwn!ek5*<#wk{x=XT>5qeArp9zwHxe&Y=@83|!_#|?LWc))%JUKh4z z&K@yQ-*0Dv+p@%Mb=I+Qe^8w7mrQDOG&4(2`JK4Rxt6*H=JG`v**@;6t=XMxNZ*=i#Uy=3K8fJSChPEn)DUk&b7`kJ4dt6yOrDC|>k{ z*{cvT^>B`>hHSy;A8CRxPJ^>y=_032@2eH9*>`su%yPpAQ4hm54yzEs>}VcsUhzUL zXM55f#wEg#jjVw&HG%Vd#KK_Lrf|yz++2zD1T4!+ zc}nk0V^1J27Pq0dod(QT{_2nH<$tCUmn4iquS*~=YTmtAsR&zZ7OFoPa{ZnwUNYL# zcVl`*ni79m414H<@|f(SUXNS&wtH0`FYUWJ?q@FdV{~%;S~UyTp5oRnRJszWt(^r- zmf{A$QPh&3)MzH|4XJxIPE=HCG5;9~-AFNPJIwR+QvfH@0a=4Bqih53`E*M7A*+Kc zBSjJS=r1)4<(5~#h5$4(IB8MWUg%`*Rs3-9vSP{)l`0$ry?yUsaAg7eo#N&t>w{Ui z?NRPyl?)gy5EgvPr*gX@ebe%2%Zl;)FiN+cSj_5)l(sx0$kd4>l3xP0CTTtb<-~(+ zS|U4IDyQxMJJVKtmuA9^{)D7ag0koE+{v{k3X=Q0&z%h}Kn9f#tKsNUygAR!9-*u}LpZ>$Wu&W2 z!)_UoA6yn&U*-w(epBUxsjpd^qYQ>Nc%jXy4Cp!!ue7Y+)+6zG%cBnau)J`q%Wgb= zf6hP-p5e1xp+u?QENSBI1!hrtXo@o%O`{-Zk|wbl9F6el6;xW`w!EyhbKJ7TyPa4H z^GEiKcCBApwQJqy?A5fBR8Pl{t+{y5PA^4U8b%27fz%|RMnO^VrZoAKOc#|K-$af4Kh(XYufhL`IJ`KUF| zNyHdE(qd{_Dk7tHe#W0BkMXLnktbT5T#V=IXpYO&KXzP+smqD z)y@QtISb2`c9>q>@vLKfKFuHKF(9S+?@H7*aNB=G|9H)1)!4t;iUvdKGnvx zz}O9q_~;Y;Q+>ZpMlnH)(KYRZG_@mVPkSB7s##sY{IaX9zg=6u(CNw9R9Q{%m%R;*$Rk)k>;fhGlfSG^h`VNm> z!reG{LEq(SIsj~aRkS6BHy?<$Ct6I&`qY-Hiajjzy=g#ICg+Xc|l{5^ml zO4XEf0ZNY9_U^Dx{ov4CYVoNhsj)xZ{0nAlK8jo4NZcI04EKG%sP=1Wj&E^{)rhg(`=V~m6kM$J~o6%o?> zI!}8yzK{w7*l{M?$@!ZQ<^k6cIK_I;WLiMVnlpve|jWgFI{&1-Z`2u@biO) z^SZ~3_*ep9xI5Cc(XB`Y9q}c`V$)1M!7GS>sn=O z|M)Gc)pbe!#t~9K-3|1hPz4+ds~RSx1vId-*vK1GCF;dV=;Z~@sRA~4W231WMNu+- zVv~#lAU4Hrfz!`v4t>I}ZLZmqg%zQB=*`nhXBWEseIyHXz z$iW9!jhUpdSJvzs$LOAzx}d|EU7cmq&FQ*P$_ZzIcrcg#VgGvJ97<5=Y5mE4Pxr2G5)57j zMkm{4i$G=Wgo+T3o7iWRzp5#@T<_5AJgW_N%e-LXkvR8zKpcyLAwz8ujn!}~X15-G zD)pr@dcQ>J;cR`cqVO`ULHR^adM#^H=E>tU#>#IfH|299c8?n4N~o4tr>ldj^#&ZU zXo5(5CbPaz+kK3E)9_p{78A1XB~1qPHZayQidE{QP_~(9Ipg43dkE^Fb*ette_%0v zmU4YY;&lPD%{w`F;DLz9KtN~NAG?7MA?Db{8!|~Zohv(8alVa*GKQsWLz7qsaP>c7 z=KE=dRx#yQ-!zu+U$7>A4?yKwrA{aT90`c=tc9eiID31_KVJ2|q|fiSF|1Hh`lu3Q zS=uq>rtEUnRi9zA3k{7&N0Kl}=05v_w@RAM^0yorfu;YMSI~TQ@4^A|$X%%L>lQB= zr8n(dvgt`WnGR+Hf67OpAo01jELQY;gR7f!|McyKYZ7m&qPLhE*8`llKB<@e0tRMk z^D^9O?}@TL&zx5gP*e1eEo_z+NR@GG%p+TR|I_8-)Dkmz%GzVcssUWBe(rrdd#-xC zZgyC!&v2Jc{bkib)@DRO>2;XI$Mc%@1Gi_SX2)z5G94{!&gAt{q!=gCBECh>&F$Gc zqq%?JblkuZmK<~aZo1Cm!9Prn-sZ-29 zqbe@D>B6cq`|{?K>E`S@n(wAns#^Q(r*UYQnX9jf5*c52eGHE5_MLLQ84ZMd(}%Z9 zrbfc7ewiMWl<>B;yTWs1L`B}Gue;c;8f{};2cI1#H6ewvZK2qWb4BF_=ijjX@26+P zOjRZdebuUpu^0?p_>`L;H+#S)!%dNmlP(7=s9KdIirj9*j_vcNB0L%K z?2^uAS!SC{mMwNugrn**o(SNW1CSrrE4Ir(TKj&83T1Dkm~5-Mmg$THD&~rC2qhtf z_A`RzlDwpnYY}xmsxH~z!$!_*#dl#2=UjQ)sqB3knGMWKvD%2I#H&J==JBYta-<4* zBd7b_{Glo{T(x_2>FoJm5@q4#Tknpsp4<{0bPDLdVoN-Hf_z6pgaVib=DOD%*3@mn zc4^dXX}yVgY;}iEtYGU9(XQWNwCP|-Opvj_o$})Hk-N4YeIyOhG;pZw8XW1``j-4& zQ6;ezCR<#)8GJeq%ir6c-+2_Wd{@<6h}Nqy^V9J-IU8kuJ;!DaiWGc@$}m48Wh=Su zu}|Lchk5#)`F9_?TL71uo2L0mxlu=!Ja-D+vvpMu-|WA9_t*k;&|U5@C%aUfzpR=~}|Hv<_6xZm|q$XRDbEu2ateNR3brE-#5|>mApSl+C-5;uNHbcyWr;5w z)K^B#d33}kJU(JBg1{;iihRdTMD0=v%)tds2aYOmdNR$j1#b+Th-{BmmRvFH6h>j) zG8{N9f~iZ%dw>&f@$(&t1)E2~Pkt51ZH6xAsf4FBJH}(xcvx|0h)b;zV?J?uHd=Av zjuzZq^5Kh(48-=hLg2u;6W+C2wQAZ1M{-Cq9$a$G+5!aKQme9XG|xt^mprL=Bq$uV zr|j7F`M5)^2&P(m=C2ZEXb$j9XL=^y4v@7;e=Qhm0ZawR3A@_P!lhSZ2KPrxn3WCC zOE&L_Q#MD5nk$_)OOz>nXc{b8LsPvM{Ug*RlzUAn>BtLxufaT50n#Fa1p({Yw7vi|(5{Xl-;x^in=z3f@M&swhF*Ahc0mMTT_~ z;=yDqtJc-78el2g!XyhnBqc(X@hp6=4%&wQG5rnlmVk+Y7}C#SN8Im>#}Hf^6B8ff z!&a<wj@}3>+IVF-HNeW;*g!j2Uzm~&ZOsqA z1LzHFmdPDhJ~`v)z{nhEkT?Vlwo?`$7 zeZ1DjcsN~lIzjjd$^HX2QOqOEZf2w5;_D`lZ!V#wuZ1@x`GOODBJHmgA<0`3UFR~) zy*u`HgxrDFtrTGD^MyazO;e__Ki=&GEIZDh(s_C(tfoQt+ld&i}XvttD5Ea4?n#usjYv7>wKpft~oaNuKd+2n(e(*F!%Lkg>Udu;8>x` zXvD+cH!!u#WPqj8?!9c|a=4Nty;u29N6lN`Sty*yU#iyvVJv;~pH@RA+b6#a0j7rl zyU_*{Wc3om^X=n(tu&d$A9-Q5A7?~mMu%N$rNXYw9FErM)Kk~{qc``G<}lja!HQx$ zN-7BG)U!NmtpG!I)D&#R6?|K~O}jFcabvS5&`$9t=ppKb66YM0FPCju!BK}lVpu-J%g*^!-r9lwX&f#UqRO ztxuw;*Ag|0Hf<`+t9`^sC{)!q^)FdO*IUW0ebAiMgY22hn>=EQE&$qr|$dK|8_Q+$P$un%2M z*%rGtmvO=%`i7*SfU26dcD_npZ>JQ8ARj!{pIM_oidM`&_tk9pqqpw0sXXDwr>}Or z&uAqcH^u$=Zpq0@a|krU7|txlJow076w3PTlHtIoWPepWwX;JQ*i5taUd$DYR2=;# zxba8QA>e)fciZ@fDCd!a>Z7Yt>rKzT#wdX2_zru=lGIM(vo7QdA#vlrl?XLNGJ4ZR zLT&Fk_0dx%s+wc<=Kq{{gH^+s-F`TvvPkv6kX#@3?YdKEOTw>6anOx2SclO067@Ga zSIMQ1nmYA$ks8WNf(ud-=l8 z@T}|A1m+7`m@tEG8h%@^evhhka!)i0Z@X!4OgsTBe|(ul0roZx#c};uwsSME*tjm@ zG1IVPn{rmX<$`m24vgue&DP$7F13!yb#>&%CetI+zVLeTQigE--(w(#x}Y!SR;hxI z`y(39RxJpZ^bf1x%oPzsnL<5v0`Ub{5YoWPPCxRKAv}NiYdmPKh<9Px*4i$m4>B5& zo%|`8-)z|hh}%N7@z-3lbu^;7$U z?sDZn^NZ0b*^-s!cn}&hT!DL^AIr5;9AY<6sNw~BJO$F`_fR9A;*|rLGu|WymOn8H(zCz6>D~L@ zcnPP4x#cjcT6OXI>)br`qjNf{mR{#7H`9P3&FTWplw)LLLdcg*ngf@fghxAgyu}7f zL7zkfFHi=?UXxTAgjSc7wnqKx9vQ;sn`y1s#(5Pfo*8gWcGRdB`~-qb$>7}Rz!+ZV zVnZ2G@PKJ|qj0tQ1GJMDMjge!I&Pjh@VxWh;dRUE$1y!l#~ns53_d#Fvf-_DCm*1; z=ZluY8o%zvQ4&=R^t%BPRuY#J*fZ%UNe4ud=@V5)RO;{NQ%w=vW>? zSYCOGb*napYo?FaHS zB<{4RSSj`1pkz;(4M@fmL;z(@<>n9Sbt>&Cf&&b{gGtUU;-pRe*!J){83VI(umjt+ zyFm|McntWlKIzH8*GR%QcFw2Esq8G@6}{_4<6Jm{Fk<=Dbofrn@^D~YTBloy7G(HL zKn%VE;T^a#X)(l{WKQxKx2U;~-=sl01*HG7L3&dt?o{^4fk{{(P;6T~L0BQj+HIv_ z)LfE+Y_ruW>pC&le_DDJ4BB1|?SL&^LtJAFZ-`)qUvkCH&3QN1J$z~>{``T!US)K>WHI{?&7rpZx!;wQs)Lp6?f-qPXd=6^FHzhc**a zdno-=X(YwmK@)G_j@VLD$*qu2*skwR(UglyWO?pW!@%EB)chSto%XqsDM7-ZE$F7L zXphWJ6S)_*9y<`a%Q7f_@Xf8Z$5!dWWp?codMVg+LFL{Bip_yaiDgHO7~JTUA~V~+ zTK~eq4Ce5x3}fo^#VK2G=k4*$l?S7*Y7WpUu1>uX%kjMd_@$#XdU2n0(v1a*yv=t1 z`>m(^qu*$Js((>IxSi5Fw~NV)Pt6%TE>LO7Kp&uKAbitx+Rq==`Te88hC7>clhI+D zvJQ<@7u~xno$Z@s=8ZjVH;Z+Fc?`yHiZuP1I0DZ2yv2TUd31u&vK>QzZcH1;2gOC3H*Og#JusSB6=A9Zs1 z)H&Q-2Teaz39Yr>XFqMp=9A=nB|yOF`>h-ZCSIx4vHFDdhkyfQL-qbLnf&JShyd*= zBqk7Y8oN8p`1eKLx}m}y2N!r69b|1&z?HNEj+cPGgU;@g{`*g!)&CTrR4uHp-$l+$ zJ-jz+;>nHg2B~>1syf4dp* za1}@5IW>=(=kgQy%a(|J?#1HHCY61fwI_{hF`*pP3nOJPaonr;K(G?|Oe9M1*0Dhc zwb}2m3w`Im%>_`|Wu5t`oXK6;!<7^j$#ApnxBtoD+Pw?@VT<{gOSttE-|3aR#cZM~ z#yc<;D+~AegnbjS^6laDxvTVFCp`SXq8{Q9$E&gmrE*NVAI zBMlx@a=JwWbC@~&uM$b`sy-}aHWiDlygYR!`AUw>S?I^&m6_<=1V+Zeu=hx!lw*zv z1rj*3!&W9qA|Z&~j&T&u9iBWX`9IOq+BeiD;Lo}DY3<*`#EiXmf1~WLc^as0uecg= z+WWjmTW{{h0PSGE#{2bztm#~fxl@>uv>{D{9PEb$%e9Z4d0CbGdL}A^`kwm!f2tj@ zXIHbR@0%fujW^A!+xmacCna;J{Hel0;)m;~>}i+eT_30J_+?mhMn-(FF7AB2#;=|~ z9-eM|^5uU*BM9)%_t{aaPrI2D53n1plC>J9BPiYEtVC-+5}LmUWxYXo$`jN5_|u*3 z(WYb&=Wu0u?<-3iA-and3)>12+N54R2ujBzA%r4j1K|Lm3^r_)9 zkcT~tTsTyAkyGmbuiSkgz9OPzX+><{P1;%6+|`e)xT9nY4m9aiIUVH9FIe=loqZb^ zP|k7k5Cp^+OXM6mmqXiYP+-p$)th=(K}xdEp<2olKwULH+ehBP9)4~&b}dgeU$n?A z(T`X4h`3JYSme1J$wpmFizZVho^V&gKi!4hh5a8|`M6x5gdWzr3SghIiLGg0DwhY* zjBO)0TE`>7kzeI7Y2c?NIMbKJO%^-&#cMo~U%Qa59J%Ys(8?Nto5vnGHxa#B)(bLe zoWs_^VHmbJnEf+7aO4xYdZl;;#XRiguhx4MvrqK6lc@48r*c60r-F(`+!Th8aU@wPvVgq!lI|DG8H2W`xb_p|0r#=fBle?QewZ$ zGpd;t@=UCj8EG8g z>Z1Le*v(55^>eS)s(V4KOB&-Bi4XWGl|XwZcvO63Jw1G_Zbcz<-UYHq8*>c?;_-^y zbq{aQL3Nj$|C>CZ7_nY|shYjnWh3`k!^Ql?=!^GKhIslQ+$QIG5TP{|@cb4rVGiQY zE+j&v;n1+9>=f!A%4hLMJrToJ8OGy?jTVvz7e3vj<1pF{iqz5+Tp5Ib;rt>C1;OU$ zTy`qg=9WtxfM;K^B}GZK)*Lza2-^$hsUO=&I(!a(2<>)p#@N#5;`i(HTXqj1}_hOZ4Cyo>ez1{4$be8Lw5f9rZ?A7A1W4|leP$u^grB{~PKK=%6%3Rn z*UTqaPAPT?LEwT~tRtsfQO-dYlHuqoLY$F?ZFwWWm(GpUlqTkQU~qlmYSp;^Ul9QI z2}Mc?W$usj#9pwthw4^|(0BUECV-kDk|JVFHNUN-Sk=W&d zh|La_8X+paBh0g zFQ+pzp(J^aaNX$u8%T2hMzjuvD7XVsb7%k1a+6l!C%4aAg^$O93!l`FZclhZg88M$ zDm-_)awgtn&pEfAt%F;4UR%psT)LYf%Bg7*OZsQT!7ZK0dfJdHs4`d2rwqWKvZKsv zSBekF%?Nuv`M97c0yyUdhyHoypxAeQQD(fT zp1I7m6jFs4`wJdQlB)Oai(BF2D^-c1HZ%P6!QCsHm#0b}f5kd@*KMvGpj{F(P(H`ot6BSVRLzc+ z3Hi1*Y!6HS1dzF`HA_~>fjR5Rl+aycW22NXLac$w^3IziPXTyw-S&j)9KZFtEexoC z?4B)mkVQf(t~5C`zsLe9lldTGVNsVM{@5sCt_^nUP@7Y#*8k^0_Q^}{ws_Jmbpu+3|uLytey^<90nwG+ZDjd3;Ulm5`=HW>$hzXSOvw^ov3GF z7Sbo@kZtn8w;9oJY_UDkWUeP?QXfJ#2zg!cb;rS%D|;K-6oK1BjQ)P7Gf!nskmvgs z&%Mjy{yNvYcvJD2*VbY}M-RUmdi>a8()4e~C#6+BUzImx-d=0t@PUg=SU-GG=r+(S z?}11&2DTdMyKNJsL}sQ^?+KA=`_@ zFH6rU1Zl{cy;u19Mq}wTbMlU?2w_;M=XIA5S|9$!KHPxtmOtKJSYfeGe01*U$A~xB zOP`a>KRROAVa+C*K>hw3dcXw6?--WuB4dMeAX^))&J)gGnrdRdHjeb~HEBZy@(nWe zTjFl|qz{frcv8F33N;kl-I3ajy|ZUCC#_Q`K}*!S7-F=lgWl#}%G%Tz5$55qI`8z< z&LN*CX7uOxU?xZz?C*8_FV6nwq|sb1_}4B(!2e-%tquWhsrF#DElEpkG^xVR8G(P_ z>@3<46=Cr_tmQB&H&(e&0e(_U^5N0g<4aieU3~ON4eI;qptPJur zr05_`3t#K@^O-~FLy;FxeUfbLHa2cJ3qF-lv0kU$c_~7$eR_8yz;CsDlpZ3*&(7|d zyWd>*qhT0$6;7-Bd}(UD+ywl8Q9_5rwHJCPu!4f*%eCLQezxZ1CeLZYYw^>uWVlfV zcJNeQ+@C6vf``%u#(WAL?)_E;`OZ>3-I%$k1SQEQ9UQo{EV8m|E)Eg4%-=$w(WSbo zOb+c8-~=qc=(s-j0{qMhwrA{#>hDsYX92*I9DZIVo50=TuT$O_TR95kbv~(QJo303 zmB*Iv{K(Hl*n=gg@l_+5{2=RZ7}IAZ-Dj*>{H|K0<3wTV#I3Ai57t4AL(styI92f&SCi zrW`|eJ#o+G^%$=F`o$E`I+GEnKev7;g1(~G$v5$&z>%HT8|nNP84BTa_TQ>$B-ZCq zvq@QRnXd~{*Yy8F96i^g^SkEuVmH_3EAry}-V7ySe`t2GAL0%MJD4_%1cxx)rcMbFApAMN_$JAEB8F9>b%6jiG`New@;2KcQM zP2a8BrcZv`FCOF-@}KMp2?@>Z$m}W`MyP34QtFeFEw>-o zDe(=XCR*}f`!nO&XJ-2^sG}|j7|0*8IDc#9OvM<`$g((&FU;RZ&9g<;#268e5$#gl zQOK?SzfP}sX(Q$o+=qJPs3@u^X!+;)Uh&h$)O#+w#&^Bb4nZTCc>yV%RfB$sb}Kgb#f)uUqb`XOUM{ry%@Lrn1JN;B1kxP!?AuJ>XV8 z3`2^R-?m7E2Eaag6~8=sSlLhf>(efD>L-{=0ke|cCdbB#IXm}9>0 zJI0h4yTdj_%!v{yev1UAN)H0d{scH69aDDX@S~)1Bx7ATc7Q!p$CqM z)ljo6hokA+6jL#^v*=k6ef*8;{O8E;^WwGYhX<{ZpQ7vIPvfPYFz9m&!P(i=QHOUN z&yz!r`o;7KWYLxQOR^h<*Y{Psx&#`O7H+eKEm>!8n4r>QaeXp zYaThWpB38u^GYeC1oH1j`iO%pv+jd*R5-%#VZS5t-6r%V52mLe-1P#-$;e}YACY>_ zbaZoAo>-~2ur3(_aa!TRqdzEjR~YF|MCC5|Qj_3xj)7n`15i8Mi^;reJJg$*{EuTF z0en}GPj5n<#zEkZkrw+qbr*++UuM20$D#}>$#nFmxQ?Bh)aUXhRCl+^O<&xQUQ-(v zwHT*ujmT@3Dalcx$78(_C2}y_KVj%^?1+MlOP?IBO+ViSw)g>2J8tx#Dl)PUOiMOP zmtTqrh!`1xd)@t36G>p#3R}?nN0E#>wc}(#?kRl&wP08jN|1W4FIlndKyuO|@1MB) z+v>j$+=iy5aUclAgIOf&YV0pD5o1d{{n&Go$t6NC}PV7HmR4&}{iD%y0k2 zua;55_f3bS|2yYhCyTNE4t^~?R)fO_0J=!Us7Wp;<3<@bCL}LICTyQ;&%|->DWS~? zm*xb~{1-rAx`L-5LyMHAxFP4lVGsPCUw+E7k>5@g&$YA|a_Q76SDtrcQDf}Er^GaE z$}47@oOKC!V>4LV{}|@y#&2vC*{mOq=oTkanXJD7-1rz?m>Pj-Te_beq5aMq|Dp;% z9r~|_fvKS2e;k(_64E8jG^QTS*3@uFR#2uYMO_-_5q zyoKMtuNJ+2o%j0R_|+P?F{4A?F(vHXk>uPg0^VnZpDEq^IKhzq@?Up-!4!V?#cva3 z(fB4fHE^TvkujSlbM-Hfik9!VZg-|QSi6H`-~0Ok;Ge;3{b%qt;j&0M-V>U`sQ_Kw z`S$x{jxS7~JLlZ}Z}RfminH_eZ%`^o1!eOq;>)Cm`pA;hf#irQq?+lOkK4!puFR0= z3%~I&*~I#=<)*KOX_X&>IjNsGr9V{ppRam-fd>HpiSVv|>oTunKpV7`*R-`h|>Rf**{2^@AV4G9v|n; z;jIRN#8Xi{T~sT+*FtR$&s`b7;`8ssgTX=d96#CWa~)cB)rb^Ad89yhm+>~FVLUWL z>Qt}{6*4b5p}@lN?`JbLF}<#$hW2EIyx4p51sKh2*7AEOnb5RGi!brYn9%qZ7bE#U zqq*7f$7is1u$4HFhl%mY?ARq-5O~7=U`Zz!7qAyPTeV4WunTexa{V_Zo>=`+mPzL; za*j`JW%_Y92pik>I=r#l*KbJt68qDH1CUlDu@;U_Mdb!TsI~x|EuDXV?MV2_uXX$( zo$nlz|L*KntMBlI1@4`rNQiNeI}Q#RoYB*#_A%{f$3> zo)|LN_Ik|b*BX9H8AX0dSRi4}KNoTa?&BOVRUqC0oG#lCOgR48ivHuXzg;bWoXp*| zUXqnnB=cAjsnsC-;D46Ee|#|`4)mAi>R0#nd=*Z2n5V`53;ltk{*o>s`g^G$f)4)Y zuYW`37r_O$`zCDcp`h}&Z`%Ley#GTf98skPPhMm+V0`gAj>+*puQ?ek2BFe_!P4I! zGyfJS7)A;V=LcncnOrY*Y+2$g=x=C(Q?8Gv1H9QOpn8 z-Y8&sKsXQ_Mb*?TU}9x=1M3bKH5=aQDGX!~5rT7v5Z#xzvdYhkb=K!eQ#P(=$OufS z2~D?t;XsxRAa9zfh>Gwy%omT4J2*TMwbZN-)W znyfI4ziS;&92Cax+2lrMvz!#CQ1Tp0Jr9F)a7gt#O)4Gyrdom?{Sm}TY3ii2Mz^FF zB%vGYU=jR|fcsMr!KFy@Ufl(Np{m!jw(uYp{v`E-^R>$iP+2ygJeXte2bJCQ@w(aD zrAt0nIZSUooWj0ZvfgribW8XWu#@5IX_*ddsWw~T@|`!Fbgx?gfb6q2ykJlYfx7i$ zmvF@oe$3f7I8-RGP2#Txg=4hNDE@rNa$whf;FF1~K(d0){p;6|2H7TU4Tde$EFfz?ScAgR%m{N@j+|NKI|tnBO} z#%)PKriFfARuwD*G&m;qc>)z}cU)1S)^w{Hhv%&nLYuD5bqYAj9T#%UKfi3oJe#%1uiM-9{+rD2&)zQ6V#ayke zTOx3}dz1GB^Y%HX0)61)b;k#p`;w;#TA*Sc9ja-Drr-+-w#j}`4H{3GJec;-!+whkD zhr*cbuB<}*oXv_rY4%$lpm6K80?n0gHC$O=Oc#!}SrpXci~+Y?uP5n1 zjkx^dp)EnLh{wspyy3hM{e$_J^SYfd)*!P_l3B-GI{w}fJ!IadP6g(kOI^4^%9?Ol zTjl-ugX{-?tG@kY#I&PFARYyW_xE@B8Okmt=@ zJO6&eyEK?`v}>}kp-_=?34r>|6O}kIa}%k)a;GowC7dhAE!E{%PBS^T>Mn(bAxUJ} z-p|1b-|ixZJa2&o(>vBebih&i%IImeY$ul`je-7{D|#=)?|0%%`0@u{iM46sYo_fu zK5s-oclFax1`{WF?BHyNL>2}>_c%7L)S+Y!i9em^H8Z^RK4F0zCwM9WC(BDsYB5&d z^y%@Iw4D$L#=P~yZNbGzvVFf(Cj1TiB@)K!RPpJF7Kf` zvPU+f^MG(g^{!4{YMkPs?hHKsr>N`j){h4$L@6XeG>rGG__?d_Q4{VWLvRpc0|UD^ z`fh3`rlKH70vQ)w zOEYhv9fO7gEjbs@Pkwd~Lyhzs*|1_+m1%#7GlQ4bH*c~HKbY5=e1COhk$d?<4c&%4 z;Q1rlwRh~5VN5+(ppEfIvK_N^SlL(_vHJ%bZ#^;{186GI@0JU$K?SG{=(-uj^GoDZ zTM-<=Ql(_aT-ybGrOQOlBlQw!C=M!b90994Ug=@9_^d$CkR-G5R-ZC=kMX_-Ww5TB zv!OP7ARY}5xqGDwGkrEVDN|x#wRk(WouK7{ugm5M2<_Ux+7{GGi?vHJ=@f1`MW0Jr zBd<9Cid%0(Vng^+jN6uiYQ~M&{(_{2?7i8ZkO-weItgQ)5S>>kg2|cGe!>>2y(*26 zi1Q0wzJQLp88sr*Fl;Zb2tVxqOERwBiHG~nJ?Cr*=(@qJ!T>-+rvR8CPGm|`{ilY7)P8xs&M z>ANr`8EG5phKyrJ&3U|SoL9rGeRHcmmk|jzVE(fBY+i(1RDIR{!^PHV+rv+|`?GGq zUEJ+N>P_7-iav3U7LtW)^CSPnMyiQ7AF!d?Nh3bu_!}W|S9qYiwJmCE1b~<6f`E=o zlL>zNT?jYk@}yZh`jTff^pntbt<(17iEc{ChkdQ5Gh46^9Fqmz%@Pa20P=}T4_qsa z$Xt*cPUueHnd?r_;a6-hn;pV`Nxut--ZN+Vt$>(+27x)piZxWFRWjE^m>xT8&daj< zsLA--H1LT)qU3b5_KTOEO6|1C41U~Sg5^C`KrW`LqlO)xNxi!IU{p`?+j-3aY5gs> zIr923ey9U@TBXNYoQwDTZuk-2t%z({&%Bb)5shq~#UC`z?rLQbwHYl8j)CoC)~yC( z2fAR<9;U9LHdjO^yWP8`IEV#-9k5RJ8hr=v;SabqU~*CuM>pR_lo99De`H-Ux3*JlM=ih14z@t_6%7*h$RxcD*}# zaRTWVL)|y?;(?D)YoO;{f+ENtFXr9Yu6!06*anekQ)c&>y?bJCWfS)5stARLZf?#~ zOWXG1gM>bfX9u`Nx0G);ssH47>Doo(o0q`i+Eg^_by$kxPj>+l&T6Z(j+Gg0UQooX zP)f`oe=BGdGIZnTHr$89BPvWJJ=mVJnaarg$tRU;q! zF+df6AlggJ#pea*^n0z#y(?ate8q?A;b|uod zfP9o%0zDrSN0lww8!-zS`rnS>d+AJ)Y20II@n^(nY;Hx zzq7tS;cKbMmLD}Ht(r=IecI6y_`R2;^-vz}UGcbN&v81f`5O^n)9z=R}*! zZYcWP5P7z^C_j17McKa0LFjO7^NM8YOvpM&V(B6$9**3K^`*c5c155|cMlmfRc>W* zIhu01R(hOwuUT3-RDis!`OwuRqkAS<@@o6b%E3xy^C-C&#~Q19#$V+2rk3Pq3Y)6J z33_2{Kw66V(5f{4JI#!#qO)z+kXVUgfnnzcc~@D>wXjXt)P}=Jw_rcvqvznmtxShq z^Q*UqCF4g$gG#r4XrK@k5SAaVr49pJx-ViWbD&K$h?&z8snS^a6&~#Iqyyq9q-BgF z@atWgM&mEaGL~-iWfD!+ub%i*+t#Uu6LK=^fw&;(Cz#y{B6CmI|M;N;7!F-K{>TfO zaoTNk=z1uDcBT964WbQ&Hb2wnzNbiT)ClgnzeTM`&X45+uM)0q`V8^J<)t4+B&VX>Cv$K<)#ZI2hz+bN@QiM&Y( zZFiS=oFLH$qw|cJMQ2wkXCEVp;MC8JnYbae;Y}EePYPZ1e%IoOCDe_SWWN}N6c5jI zG*C&YM5W*eAM05!sUehL?ZOf8Qucs~+PYT;S;+4HWyn|d;NyocuC+twhD@WOS?Z{v z=7Zw<=FRO+kG@%1(U9T|ilf0i?MX;lQJ7RrV=vk14jdyU94HF3HeDD@N*7v{#n2*q-6st<{IqJDeDn?TTmFm2I_^U$WT%e~J1mW?2arN$=~U60kYS zptSLc=ex~{J5lx(eQkR6CT?}|0Y?t<+aqfOvCSG;jF!nNW(TOsgYVaQT~sdL5)Ax; z^Jax+eWLNDJpoY&WDu?Zj#>lGk_c_V6Ia=yFNpqWv=B_PX`T8k*UpO}+p(K|xHG*Q znl#eG>_h{^Ot9S+Nwf{#=MpYmjp1W*d9aiuzbOeNM#f(qk&{1ZFldafVPX5qYn`Z$ zTJW>c`}B1hLihP&@jV0ksrTH+)C1@WZP6hWDqQ7l*cQglU&Mggw{Hu zh>xL<%x@YFy!peLE$m3^*-}%3n!}+ z4CNhw_p}HDYWCgnYEX7yHLYK!P^2P?k4ae0{ke(Xi&*{R!u+M+(K&41{?7{vOO=9~ z=jDs~^EAQTuTZh4EhgwetH+hrp)>lQ-AV}snJ^KTXY3nrO?#)6tQ!+OK_+>nQx=T& zl`SW>H73D<8@S`%Z-k@5r`d@)q7BXRCkB8Xj|fBJOEIawdyG9BgI$@h%)Z(3IW3bp znmU^ZLKHcabc;**j0hG0>jy_{!5bhXP#24>{pPV^pZrWvNU-H>Gr#Z8p@XNv{vwW_ zv z3t22)lQqQpzv4Zfi4HaAzntLJOq_TwpJ`X+&m%wT;KFb16;ri2dd>gW>!QUimyd~Q zo{8FKNdCBbu^)m|6XuaL&&LlzzDR$x(%fYX*57lpw;dN#=w`v3&cfJBW42!uLsXiuV%eG26&zV1IxsD#I8*D zoACBk0(-nRYoQJg=o`+a1Q3hZ_t(MeNc$r*da^{vFJH6>{ex?IG~qDMrK`;*zqC$g zD+JS&`OeG$mdE~s-vl@5$@LRl>Q!G#!5YJT1Cyz1Ly3`{$Cu+OgVko%I$PtXYq@PD zKq(H$TU2U2$F)^00~+c1#Fz#ox9!Q`RSplC!tiFul7L?S_U=3@jJ1~k^O^NK!+U*k zS>_+@%h$`hf@l`N9l};ZN@?>-5pm0sv>gEzpu9=yzSEeio^%KC|m z)POrkBs#`%oS%iOq7={f;}qm^@e99IJh2;GAc#H%ETuXLpxk`-vNzPoE9~fP*_BtS z5LEV79>n=@J~lN0I9tpz8Q&!VZ_V+Lp&!1gCj(~1v$r- zks1{M^@DuK;MgpX7&BK-PVcc5a43(JF%jS%xGB4x$WjOT16U-SF`ueF`={Pr^5S!Q zWjVW7;;v(i+dMC2?+VPJy^t*b;m2)q&bu;Grr+1Tc}U3SNakF|!x z^|eoMyTArzQZwyg0aRhm%MICVQ@HTG@R}`f)0$E`%w4rx5mXpp!BWIVYK2n}h6C#+ zyY#`LD=A7`!Y)`1kM5DrJ0Akhs|1dS!%4qk5npsvR>Zxr2)i5y9^R~y;UxPub?d7? zC&iAj7zUTpUZo>c>P<$1x=>Nj8j$?fP;=R z?|8k(20}>Oa&>nw-0K;>IM9@n)eT}^Fy-*U5V7I6w-Vtqk-=(o0V*R zQMoa}*F@E`E%)tgg3YV9=v^?iJaDcSCnwtsX|FwyYYPsCPfM}0|LWkk?8MVLWbTMG zpJQX+4){nN?XjnS@|D{T|3rt^sQ4CegAIm_xoLP@W_95=G9YE}`lX_=)xv{%>dT+^ z*n6HhQW%DXV_$TJI2SJ|L1XH%SNm9$>{Q0M`n7&?4aYl%`|0*`&ERPZfa$D*c)=0) z!5-;!DUO(PVM8Gi*K+!|6#uEfWnMUp4HkH3oKpMggt)|T!pIFr{ak;@2jifR5d%yMw`N zKT0l1lxiff=JLqR_Z`4wDHw@VN$lS2$tFW9A10rD9V#?|$M;Y4L9RPgSxlg=9Q$LPLdJnuG#xn!hyzLV{C#jW$svt-B>sQD61!gfu2bvT)N z$ua@@C4E!skr_y7{n)%>%p7mUyIEL)R5K5~`D|J4h<-Rl5YP?~eg<86k1M)vh7)8L z2^P9#Y`n*(bO|vRr-u6!i=aK#%V6c#{j|*Ip8Y|Oo<03>#pYvVrk@ev)e0r8c|ejd z>x3L9-ekk3)xL)ehjL#t-%zs%txvl0G&-J~fnhW0XZ}zvYF9~ebE5!OdTu=RI8BSO zh|yALx$EmxJ&+ZN^1MaqU%vjjX*J*RDpbJj8iS>fRPs}AYV*w>KNOFAY2`v~CHf2I zy>(HDY|v2{xG+bOmcdib8DZuOm4qxmkGac z;SuvNgWSy=jurP9#nwmEnMd3k%gk%=gBxK4QTC0VLkNJ=d7kwFL}s?ZY*bS^q?supF~I_YC^@f(j|)A=G&<5CoM!y}BD@2zM0W{*@e$q=AN|aUuEN#XpLC+H;~mcGpQ_LN6F+*YzGt0dF4M zs>#(GeK}`x&8ydQeJ6kk>LwV(;+Mvi|6WS-)!V{3y>jl zOHro!Wwo+_S}g=Yt}>)Tb`Sorq8Kn@F#y8lDWZ*z z7RN0>xC(3cioQr5_78Wq?(&;&(y^ajv{Me`YNj!vosTc{6b8_oV2^-bbt-(7IG_x7HG2p#9@NvIfvF zENt6l(eVnoshNEK3~79yrm#P))p}$U96k^W&&%@>1Sb%{4iSG&$mLg-Rl(G_`ugY3jf1 zoz?en0;hF>)=&bw4y9V2c_^E8ul?Zs`P=2n*RO?CLrr-1a-E6Gno|4W5D!%Pac)Tf z1&h#6r1x;MHfm?3IQ3h@`^*1K$xF#A(e+qt!-AN#&`7y3x+kuh;g?zU{GluiKZff#4i`dig9t{LvN___FxOAG4|UHDly@b<*& zQ)0)3of{FZ`D_pR-n{pDWMOPM{_bA8B4`7T@xF1h_WzbURkMJ~0@Vre?`2%c+#k6% zLPNP9YTTUPp3K=BYYFxUbA@mQ$ z`$bYz^d$(fGZekFBt^#m^66BL%v2ZQO4mX@PpBLXD~#2`%JOewPr`s)izNjyy$iR|E-FGWMm`=ZS@5Y8D@&XQ8|hwR!P~#n!ea3_W zs)|8rTP!H#atfdqa*3L~F_}Hzys1T8k27MpE2MBs-y6@_a1QRMsOYq+IZsFn`fC&Z zeNk_qb&`&yz6jWd=__J?5CNVlK$hjtZ?-{4i&rtLh~51ScBW&$MX%=Z7X74(Jf9}8 zD1vB_HUFw$W%g9odSv-FJ4@XHNePZdW5PK0SE7Oa4h!Kf(VtRRuE4S={m>#K=eRY? z`ZV}}Pt{sKw91k?ct41#)4SQdLm(5)k8y&xV&?s}N^4y|l&Ci)yZ}_W)p=E)koP#R zLU^~iSMEw1rNswyyJuQ7gd@hhj?5w_D8!S?U7+$en+xRgvIhqq{Ng${?T=@q!#;Cp z#;|k9|B%m$$2!8Bmok~dVhQe}P)WK4ha{3cY-erN99QQ$EIz5TCsp;RA=M0ctFJ0^ z%@fd%&I&xTGUedW12mjf#g1(k8EFnbj(Nn{GHZK_0n6mK z2e`MFV-#_dqa4o=Ht6}688ckaA#N=9UX1DFV}yH6mJ*T(+8@#go*RdoMRA7usOfka z=P7FtNb3d_Hm?~iKW#IZxd`jaoG6@}Hrlm-azodOnhET_SuJ$Y<7AF2*$eoct;XLKHN z%LFdZVOO7bQ{wb0IZwj?Z_*m$VZA@2aB+ufu5FFhncPUM0;1QD-w6O1^A}vh!53$n@SppPk)XhjXbgX#V@KQm27zf7^ zIib7*40zZ+SJ7nP;2onsckCtNzC+dkz$b9jbKaG;yd(m4+@u;=ASc=)=fJv4s^@$d zU-_d)U?n)XYtSyq@0z3oC$JYv^uDwciUO|~Sez@81x6S2t`QW^&L&+5#G%kaYTW+N z+@DVHt%=z{9qik8jGl^m!CHr!ijotaN@H@I4FhMKBd@|nwiKeORh78rBS(R2Q|o8ks|P+ zScnJnu-(QL$=MnD58`zT(?Ort%N>#rk3OzFq4VrjXLRW7c`!K}42qDb1e=LMvl*?l zzU>-_yW=i6%9m&mY8piB0{nFQ9F1_kP$G-x&{|7M{0^X7h6~zZJiCKE81jtJx!Fzf zjjsj{5w0N%Lg~iNxG^Hv^y`MBO{YdK(vgegvZf+7nA>~D=TJ*FuWDFv>=Eb66PAR( zZazy~wp#oz3e@zy)2{p#qSOq36-J;+}og*Ix=gRrZ)yxpHoy zf5JV7?Y`yPK`9B~1{#+5^}L+N1|pv$!3=UTFm3T!tnWflm;BuTuZC#Y95U77&S%AR zudY~*U01|zurILu(0`4CKi^4`YCToxC!JhncOU&a$&qWt9wgs+`}uD8 zhM46s@tQ?Z7w(z)P8ouD(%<58dGv!c9=AqBMBg2%(liv^4s)$%{|gy(7D{e$F_zbi zmkmu+1QHkGvxvQ<`Z9qC>ZK&tGWGYkK&(P}UY~*h^O%L(c`JZsFtPW?{^W^k6vzth zls{j7irHVjJhi^tQ;_9D%?F8?v>!S-OYQNPIbxmM_sg z&b(}ao`IenI8a#kGJBqT1)AOl>-Z5%n9>GD=SFP=3~90I3?@j97Tc?$Y1M@gf%oQA zvb{+k7Pp)~Hfa_M6bjNm;kBj?=_zJhz7)}n?#XaV7DvT`{nR{1`nVOK%-Ki)AIr+Z$BLT`7!g?gT9UsoME-no0b0OfI*<5L zyNCt}+h=QE-*r3J?1rSRxYo~Rf=p{sgX8QlTu3wpUoA0tNRK7clWNe+ zv}%ybHG`#UF43WmGX|D7T}o$taQyij*p%k z8Pvj;;-P5j_c8)mXGOMM)wAX-G=_5DD#fIzp%2Eyh62bN!eL^0Y&qn&WAe8XmFT}h z7`T*OP8#VWVD(T*w+p!ts`xWgfE)AqGv3;|i}>y~Jb=xY7gN})gbJhPzyM%_9Md?) zCzjWJ1a0<&Z+>kBWZIvnhJ0alN8i4US?%|ipZ;8zAizz75^`3$u71XV+mWGi5=XE> ztDnQV%%5JY!VDs0d3#MZ#BWbl_9keexXM7HFo&dlQC0iugX$T0R|YKDRKl*bzN6Na@Rr)Mb^4{)F7;Qx z%uq+@Uv&W2?m5~CemJCLnbvKyMWj9nmSf>Ue( ztXysJ;DGffk8<67UuL^U7`-soMWY#y*(2ryi`xKR{LYs2QU1bfehjy%CLjGDp*PX; z%LSgPyerQ9G1|vk5uY`d%h3mBS=Z=^gRJNbo5=M@jbq#1+m<&(;N}7iuB26 zQbu8~n*UIevoW#5Ito@vy-4b?=0U+VqrE&+53enewor$BEM}=5hrElbEjanEMTJp^ zLBIEWO7Ki!HQ*q<@u`{Lq|Nr90i8s$hqOWqLGb zm5VYn)7dPNZPazs#!e>I2A^^uylLtJj`@gfb$^vQlnV?@1b3TLB`vpxS4>kf6c4G=?p zKrTmjY#g)J5USLB=VvDjGp8zkrBcMB8CxNc=l|_`@6*{Ka0wTmRP0Ibp8*s>Qbl6UuA%fqaP4a0ywH8?WbUz`DW%d5{amE^v9p)w9g6$~ zS41w0?Bcs(2~WK@c$*I4+8(q1>KTDz&rH~a9iLE@l-e;*^wkuuf}`6}(Z`QaV{#R>w9ZV{EPt{4omxq5?hBwgo}CR2WUUvgeo>!)9Fyjh z@Z{`rs>PtW`-UARVcB!$ZA2crkp4l`1vC%knp*wh`Xqk^hL2NBK@L* zsKC29pv)-Mky|`Elv;Nl^|>~w+fVsHK-seT?+z}z}EaM+a4&V*Pwbcvw#Cp&5r$#~R0-0p3pfJqrMgdz;qT$!GDaq{0A4zAbjLp7z zdq~-hH&MlCz^jdEQud-}b&c0SddK~sACvcI;{H1K_F0gRRooK)wi=O0~ZHmNV9|lV9(QO71NDLlfymwmR`xnw)${#@|bqyZIAV zvd>?BV<_=$;8fn939a{Vyo~2WzJ%qnbmPxl+pUbcz=3Ywsb}iA^G_>klJTXpdkKR! zWr?R<8G(`1UjzGZaNka?W_=cVx1VSCW&~7M%X>k@{G_Q85m7&Sg+b~_lE{OO?Yk&I zK@mU&-jXJ><$~R=@0ov3;Eod7ejmrQIBsubHXIHsX!_%-j=W0p2lYwgN&P1@`9jH8 z$DHm*%mMLQWlqP#7){otrLvlK5qY%Z6IV%Sfx^1!Q_V3=G+x;#UWqPtS^m1>(O9Ay zbIr$}iY*grgN)?YTv#)GIq0xe@cK%78Cn4YmV<-7LyqKY(4%NHWg??lPz-f0we^Oz zMeymU-i%Jm)vQ2MRqt0dmbl976HeNpZvvLaM?g(BJY3fD!@*{I3+=e90K z-ojCjl)u~By-*baUNbIte_ALK*4eP;51h-NcIUcgE$26MonNgl$YR?eN?YCN6D3j1 z0VllY;9C9EsToH6nHvWsum*<1jw-sENv9Ez0BrK|=)L_`v7w8u-2mx6mmh~8u<>{y z$@xAvYYmHmZGFq>fnXr(hJI@nO?wt4UGqM-Gs%9eP;8SSWcnut;75zl#ir-WNLH?#ov8sT_2AtsgC#V=zEe&K5FLeY4=tzRQmd89*PCY=EO6WpsppPp5!$c zrcUQ(a8v74FkRa{b6L?#}U)K~mxhRToVC+{}7F^qn`_>d!eA+x}!z+*T`c=6 zf?yayF06H+$ZzyQqpYzJAmo&6x?5B(ULtX+wwU;Y)id_;o}D0ePlD53>)sNI0}pN$ z3xQo{>7Tjj@JkW1JycJ_SDqbUgzFX-->O9_KFF&hC1}msEwSm`kC&%aFbI&C@^H#Z zp{%mFm$e+G{ux5&2rKlZT-5M>ub7XOlqSW0?Mk%4Buv$LlD*Oc_U94l;V={x@3s|5 z=Rhz0s9^087sgGB7sHKde@}UMiQSO-ceM+_Mn#FJ#3JFOT|Y>i8xOvy8rEbXpHKBY zl#$->VQ;fC*uNN5QPlAw@0S$tP80a9>byHQ6Qq14M3dE&<@{?@M7Og8w>%eylurrm za{M{X4+NXs5eI~{!rz)wSY9ivLWjBPqHYV!FGuu_4u-L92v?4oMrUIx#x#;W9u--O zt=)|X=vVETFD_}m{$cV}>jOqs^QHPMG;B|eK!~iLY=d}@e(f?g&mUKam}Oh2s?Xs- zUsh#>Y_&Y?^h@v!-CVf-)#S^l=8@sNaVn|2Msg2Y!4BlzlO1O(N1BJeT6jzSuzOE2 zKqb)0nmwvjfG)}UF8SJd_);u(5xiLs;Ko(AE%3z2ukJGH<^5Xk9!fWkVLospZKPOw zW~i;w#+{HdEW)Y9)Zsmn;77;WjZVyH0aq1|X;SWq(J`IA-?FDg+MV1BAb zB4#B$H31x&@Wq5`XE(FZ3fh_!A#GXS>S4;#mIUFmEqkL>;IxJeV`P|9uL*^uXKczAj%xTMlNibLJZYb5Zxj4B3|uQetrGU`lN=a z0P$RpAG5QbR35jqB}zij=iY$&H4`-O2+1zc{%TVx8h1;5-ZPc?4&=xSRnfz*@quIU zqi^e9s6}8_cbor`tB^W8ZdmhH4L%ja?pzL&>6rH0atZoO!fst|I%eu^ca;Sa8;2fj zR}cbteLQgV*^0Ypou*bxn*QS`gBhTuM`D&QET?I0+*)l${jZ=a-sjo{@^Q`++Vc~? zTm>**8WX7$49eMqFyRP7H(%<}6D(K=n!RLsJ>#^pQl_S5{k96KLalB2eX+Lu0rRG* z%>&Uu4R!vNN7f6spqg%}0o)H^hXW(oDj(0ZX2%>+I$?cXh0 z_)F63F?tnI5M8bGmMPAGtt{n+ z;?dTJyB5oAv=h%K)$a;N$nL%cxNS0|Ao_iZ1xhQ}I$6#L#F(OAJ&j#Sy-=gGN=k1r zB`}no$9*>S(9$QSCa8p(uK5r+8$WaHrVie0NnVHBICf@z#J8Rg#27iJp=0SCDkbb>JHn9UaZvVg(LE*qiC@4ft~!zXrK4IV*DW=f4+^j3KrEXfNASTOx}Vz*pyN^C)hER ztj06e)){K7_quwD1pq&+6#OTx7Od`xLDQU!7W9 zX~Hb!(Pj7RKepH&W{hM)H&)Vqw?`aki+n<_K?xauy14~Oe=S+pO`0eMmS7F=|gkx!i zI5^3g9Sfm3T^9Y?P`;J94Et`Sc`CKu=}Brw{yCsX^vGP6bPM={9ft3|WGQeU|zg&kAwN1 zI++Ay&#Z@=YFMzZn~PN(IDuVt1sW&w^4V#OSKa|V-6i+pq^i_XrmIbKDx)sReR$)r zk_^@tb9;?ep?_VS{{DgIcuuT5y4_lh0eYZ&FOfY;{FM^}RI~LwV>$KN`K#HK-mj!3 zDgRZ)hyvC8TQIYO6;sFOJCi^0UHRgoT?#QiGti;uOv7b4dH3|Yn#UC$FRV7m#D`zL zUM%Jh>`T$6bj%224Nl&8^)f+bx~fZ=bq~j*#BO|dnh3G6%JS}8)EV&o>Rm5`rPtob!yZ=;{qISt$(#$SiSOP3+Z`P4Q;UX|o^9Tx2^b07nmmMoy9nnF z4UqPRH9e3@opNbTZIe5~)zDsA(piQwf5%Mn)vmn2*4O5%bkG9&pZ?U6B_mx~yq0S7 z#9uam$L8_|jt=AxGc;eeGoC87h^U|(6$@1FO=mamp>?KtnPh))$5qUW`E!!Ommy*z6|;`|0^e5pDfGZ(&b&+s;A>_y7F<3Bk4ezW6;I*?ggwSMbW!aFZ6s6f!X zgRfBSqi4Ytv6Wih>>(YOvhy19;v!^g*Bp5gH_9J2+W*Ko%0{xW>;(S!wO8PmTQRcv zLU4v5ao*?Xo5T&({zC?f?SV(F;(}0WU?>Rd(!^i0Jr4R_IqwX7{h0irg%kS_KqjL6x7e?h<@qK;qA6y^ryRBX|#)0F3`^{ zO&sn>^E|d9u@TSi{UN#t36ZOe`@Y_lIcw*d6qMeiG}d0^abv_XaoE-_09cd9)^jZo zv!6qEyqj&4Pc_+rH*tq-&fiFrX6N`1Vnh7hB(@;5_B^$dXlA`YvGhHhAL@3&9n<2~ z18t9&BXtbMNJ<>A;7f`~pYjf?K2#mI@5Tl%ubO*oToS5kUSZ5zQzvnD%U`ooSssU| zA3FLrg=nBQvVP87-+aOW2>8T1v`BREVtS&=AePofM*HU?4^YEfs|Na7bOJYHgIhdq zkt3-uUiIgZ)35Bey_ML(B^nQ-VpMU%=N&>0vfz?)o(uQ&#E=;d@V77nhOgXCRw^Jj zhGV_R_F#rHI?*$BpaJYxF~+3va^l*T4hON=T$WzA*0tEP98z5<^G&B z_RPtWI_kqdt+eDJ#6 zulK0FzYA%Y!L#t~lfnoJymG^yB!6yy0b+{m&i1*P#B6w;`7(1&S~HbYcNb1MQDDT! zYnF?+kO8lbpYn${&xMg&X(smZk8%Tr?#Mj05l9A!+yBVubBGpdLvTm=1(_%vmRZaJ z;n3CU41g&eMHR&2g^`90Q3!3=R~(K1plZsQ#T{<^m(|5FF8NcQ1cuv&jX%e^?)LI{ zJsy2&=ULoK?p-@w_{n$kD|+eua+*wqzc8vkf`jf?06$y1Tmw~vEUyW@0!xr8ebRF4 zro^l)UTTnxTZH8oGWX$nic|I_$4Ps=HXF2p12DKH&mblznTFt@q{A6s)R9-aAJOiH zY-GW|OUFP>ZgtodQ~m~`E`~f+RSht7YT8xslw zlbf@0sp{o3ucQ1`_xKezyF#o@HVCk2Mm|jGi%&kIdI_HRcNNIfB-5M0(N!fNK>^U{ z25AQh^H<@k;AdA@p^Vx={+rcwcl9J9gKaQ4RGl=_ZLZNcMU%>-iyLUQr_+vW!Q1uw z+MnJ0$fZJo{bVEW&$h*i;T7lXw>iEqOMd0Y1xr584SAiq4JYYv-?i+dcSGyQcUq=; z&vo&QT;6OC(ftUh&BQL7<9F5sQUH6-cj|^_w|J`A+r{%*3oV*v#-C%9_%K49Q}@q; zO$=AZP2h+wO?~$zf!58h%_pwbT|tR;yl>fjN1<-fwkP8{?xM+~*PsQK@k+Zs$l)Sh z19~Qjc`j0RqneST_2tXSAAVkuwvB$um%v+RP4#4D;Ip`3DTjA5AfFnbZ3n3Bw5{0c zl{~I4Ued#9m2zDJt2eHU1#t5Cd#gQ&4N%e&>L$w}`%&Ux_`WIONu)t>AU>0_DULUc zd^I`d1BW+HenKC2?3&STTHOqsT5&)0Iix7Jx5MrN@`sLAVvW?RclDz_41ruCHagPa z^21B%pvx3oYxF-S%3afN^eh_gur>;NxzeQ_`hl z7EKJnI3x~qJNzv$d1)V0QaMlKMGSeXHxGIGvS{I8Yku;@xjSjmzRFA~50y28UAW8C?|wXSUp9g>l9EM);?eXBvRUsipC z@iyjmTwhO=mMpg-Y2vjC-`C1dUu=-JcnnurvqiBDL)d&4nL;KZZiC|-2Ex#*npu~g zUI@-;KBcdmTYK>x>v7o6RO;ZKyh|VbUcRIz7Ys8{yWwEoa@%5v|7q1Z)U&l(*5mh` zXDYEzGTx2o*~Uy-GcIhRfo$0U>%%Wwr~$5u&bclItNu4asqRJmX8H$iU5rj-L*+@u z*6XyMro;1o(u3H-lh9*k0ZNu!2mJAy8`$glRw;l#R~seg>OHxKh4n}Go;*7E@ufw3 z()GLhQIgO8CF3449R1Cu24;alC${i;YNl;XERmD)^Z~$KGAVoWBM|?=O|?zgRxp}V zbI)a|?jUEW4HwYk(f9@Oz%=~1Dk z)I}1n)_S@%TlZ3dR{-O(1{Kw9un0tE##Ym5d#B_|lVbs4lAW^>sS^9l{L&+dthA$z zhwH)HT=X$wbonO@vA9wGnmLH2H1QMk~efY6oRm3I-~Zgj$u$?Hry zBm5Ihxs6x@+x(xc!x`_sc7K|Rfa}Ms^u}eYzurTyf*>roSr(fz5BlEVU2^i9E*-XA zTklpWSNXY;y}idrpg)S%%to|dw7Gz=$89Z!6_tx-COVRQ3d1HJHeBnq#M_= zqmWt*ayK3|c;Yx+RCq(%-XET+xONyW*wRyb&1T75_BnaP zut~MLY>?3Ix%8J2ZNB7?+-W$dL_tSOFVACI0e%U0oE(sB&``4%JWUYCJ(PM1eUzXy zA*HUQd_4A|mGvdflicYQ+Q|aLXL`e8AoL7ZIOVm`@@i-7?cF(95M5&2Hz}Gs@pb@1 z7d+Achz5sOBeCo)k+?{+bayH$>pAR?XA0?bTXy~?3OL&~)c~bVnemg2v>eeH$QV>p zb3*BgOJB|Am-8iQYYex9BBzgFEVW0Ev61HzsEDwJ6-#zq3aRk4drcGtb@v=SS=q}; z1!BtO!jR{XU{fz1y{OU<69zr1w$_x&A+B9OhX?AE+iKK$oT(`X(Ug;u7;s7Z*V zL=_!E!dncna&IHr9)Mj;k3D0#m`wp>=2YPYo!+&jZ?6rNkq zBtCd=62JfQ(I^v9OD5JCsfBvsMSH9Z3i}=$T6ZQcs z5>0w(dTD?4mfHK(q=@9_^9N4=@0A@s#OJDKEst_9Y;59pTElKyvNaT&yyUw?7wyU` zSa{d?PLEh;(hK4bhnjhfe60IJ$$8u0L66YeNdk6lkwbVKR4P>J16|hoQ=#{$C?)i~ zc-~MHg%^(8g}52rhyGC9?PAWQp(>iI@#q%z15at_iPW^C@Yt@8zSwc8 zXugh5_VdxS(KG;rX3C5G636{Y?&kf4IN-GkD-eM4>Z?b~Qn3Bpn;^bv_ans2Z6s7n z-KyP^!XiRY0^`fIs3}6VyXe%gjF5ME@y9HJ{>YlBjg*6ROtlqGaUHxmhC3xSAN#^3 z1_X+|J7=@Bna%KNNPEL){|>N!sWl}q{tCN5bAkl$Fo~zurSzL5i{o$nojlPTq$SW^ zowTUwmCTnL7$qx~3TnSR_(QUr!v&Fa?Xj=44wl`(k(M9KvEd!K@y$v>)eWgHFX2z(^x}uVr~3a5gLS*{3qdMr zfzdzpfaMF{nTX+|ouA)wyn(#F@1^JYR`gD}wV0H(rts4#F>r=|?JO^we%A4+wO#?8 z=8aXV+Ek#dQKBml1hE2OOU}nF-0P0MHF_xyPlf+tQVOYM?LxIaaJ6e z*Emd2yhRQoY#|AGg>jV)ElJm~6K@Nmwbm*!z~h`Oj;n=LlS1>xcbznh#;7%SQ6H;| z>$V>&qcJ;qf6%+2y;1)Xv5e>#BfKuZ%jMB&}j&IkGs?m@x6L5$1>x1%W#7jk3 z)`XV>_Tk*gk?KNEKKY_MALkrjd{^M)IIfYT18%Q4e>W-KS);3zy$j4ThkDy5c0_dc`tFm=B!6Vp? z(Mn<(SDst76#XW482~+kHo=75u)}**>701(m&cE3{jIdWKD1|l24A?odJ%FyUFPAa z(u4&s#mMyu?rlC?dVC$^rixRcnhZ@*n)^{4CCWGD#E<<%Z+7kp!= zFsir$)P!0WCBM8QLvhx92&{3jrCOhV6xZAET>^UZhtzD8*U9Bx_uNYm`>K%V7Gc$> zR|DbEK_lbNcE5Wv9kPRfTr*$jKEqno4Ko-%EdtR0dep(IM13cZKv~1m3~bnJ1-f z^d_kregm%4iQwscqrzfZ!-rgNjlK#h;ZR8*2l4k^neSfb#O{(kU_GM&$o01?pEQ>r z9`>)af(@w|@QWPaagk}tK2Dake*o;3peCH&@>Vj6b@{>FD(oy+AFo`iQOeq_*j|gg zcM&`at>yI*A^CL2vS>akH&o6mU9v^ycmxR?DriZ($+z#Quaj`syY6BFM!vA>q#k1- zGTXnJS^;1;rJP@ePRqphQ}A=;4JgBGSAjB5c1XOas@qQIG9~cn`!&>cOu32oYR{;@ z5*4)hj67vBD8w5o5yBwEeJ#gibdu*HQmq2EyDatcr>Nfu%1S<#&zhArM-P`kMu z_4JtI1f*B}S+Q=kJi5Z#-@5D^{SPSsz+K_T-Q|?=It&$jziU@7%|flqV*3bv4f}8k z)Q=25e-ddS`yXiVH!%J2$)qX@+JBgIEfxd`bK`L*bK&_}^s_~AmC?;gV5tdnWxzp~ zb-OF^OKF=LLJaTj69}xUKD&b!p)G#k2$hLv|om3?c1gTt>w6eW{*(TL2 z-j}ka#;L~_XbjGU~9X-LXN*LsO1gyD@;Gby+7;@XMZqyWuEg)Ez5W)Z@e}A{IU0V+^WpgnVZ)q zb;F-~fp@rGZGUwMf5h;qzOcyYpVnMazgluZTh}?FuemHqZoKXP_PE4b-Q;0W%QmJ~ zkM{C)?2WkHkbC2c!@vIt{QJMQdFpqSM8Q!PE^~C8%M?d zQNnLwRW$>n%n!SA9z8<4e9Zc=zFKPtkR{ta_#6;H>Xi zHrVr*O1++5dKc|Y^!QZk>UbVm-@5S7I_Qm(_@|N|KS=$5 zwO8e8;s=Y1mOI!O7k7-Y|@eULgWt0U%`92Z@&6DRybe zuWrGSQZ|Z6Nue%Zxsq7)qAJk=RhiARavd&hvAVWq!Q-a(DiFBJa@uDmwcR=DbhX+@4@@jMPX2!SFBRpHV3*~;E?zbX zkSgq#f?$PJB7my`N=iyiZp;1G0^dSwVW?V7R~fcPQwDr)MpZgj+%eM)Ch6XUJq)=` zM+9q=hqZ(q45J|Tj9d%hG>zbce(N-4g(^>~tE-bjI_@2Jyg!E}-F`ONTC}wA7SsE- z$7NAm8yt7kr#NX1K?>1B?`&_APMwD5Yn*b@YZ=G^j*gB@jkUD;9Z;h7V;6X64|T_$O zt_SDQ^r;glR8PKku9}WcOnzaZnwNr-^S|un(eG`9p9MdJ!5Jqg`x}VxP{)y|CZ~o-S|`{Ii+SufsW6VGGJozR z^f|1IZ*xvX%;0Fk?S@rD ze7kLTL%s{-^+niM3oTz4-h9Hpm6cZ6lMfp((8Zv3y!?NpP@IsV+c=}jr5rsu&kdRCEK zgH!cBZF3Rg>!YOck)z7rPY-XkJ&RGC_Sl$W)!{Qpd2}eT|}(n z9}L#fXR-UQ?>6o&4`eQG&bFjJ+GoCtHr%w(?wQ>VC{9tf<%(!hfC=6Wfe!qa zN*j!gyy*P?{0pnkVf_&grG|1f8S;#)oz433vI8Fa8LYB9p1^IrTDN?E3wFu~yMzaX zLWgim7ZobVVYSd|ShSdr!D$<^tiL1In`r#DwL76xM|qY~K6HQSZ1!@+TZX5oiHYv6 zIR1qjkIqsb%(jH&VIG)lzAVt8$+!iN{xAv|&OcQ!zi0_k5K@SM5;_A_m6e0N_BS(x zN#v;+f#)0%6%Kbpb_xwD9;ZXG=$cFK>D-|wM-qD3m1I(v7j%>N4BH@zDobf@BGrl`%cckh`p_lIAIWM*yG2s|}$n>H>| z@8|k3#)FA$At#6P^ePy4zZakK^70zIEdMP4_%>OoZ}ANlyBp1=*(os!Gvc1NETY9q zI431Yx_`B?w=ZWqUpXI=a?!)ur^TPJ{3iQXznx#o5ntsDeDvnt{rG=Ed)-V*-qj|V zGoiP9ssdOQ?lp^$ZqnFEy$(_f>g&Jia4sgW&>&o~3pJ_X!HyZu?LXOF0kluAszkCq z3RT+&<}=7YoLqVnk|bg`8o#&aG452+Twq~{f8^iDzH8J$_r!IEP20eL`6~Bk#rlp& zb}{g#nCSUq0-iRN1=A!&wr@d7xms3cUE@4M!;p}n7;@pa8L{tITzZf8zYd0=@iob) z+iyC!HJz&zEgtcZIFkW|c4yw8jxW&hVD3`v>-MX^+__rxIHMkcFn*(N649peZlMTBw;I*v3K6 zz(65)k|obpc(eI^Ea5boXvEzp`|50CiY#_(D(|*cU)%RJI#v{*!k7u#*U=Y}{KPol zU-SGXMMw<&z@xi&?@Gsk6G!VDr9A1w*tj^BYBynF;j>q4g5U%qOc z>~EQ$UV=k59^*GZ@f6OHkW<}T>P?A;iin83wCV5*qviQ|H!|d^bYo-1LT3#3neot4 zAxE^hwvNuN?P>rU)kaxYd#ZO9_9-QWcjJmFF^G~O3w?C3Lv3hdnt|Mz@yuF#W1jIL z_Lv4+lmn}oMAzwZo2ar1dVXU%z$^^EqvH~H^im(84qB?97}E%kHsO4*7wD`4+NGxv zMRIKgPcZsL|>{{sFH9-2>Yx||2KS}4m+Q})*Ug-Zi zL(?TSTJ(Ief7^JByx$fWb|*89SODoc)9b8x-?LM{%rfDYYAj>jgRiuL`&yR^M?%k+ zSr1$na$Qst^4flNr|k8@6=HSW!`tVCtJai>}xo5>p7MT`a!|-_k$`nZ$+t zq49B>bZ)@&!Z$wa;(%&*pxm98$cjcG0(=_hA}GiU+GJ#)mzq)>g(8;UAh{$fBkw7L zJnbt{)RNfeMi4HcFXofJ3F{95^OscBP<|6Vz1y^xzni&}r=Kw`xlI}zaDA`kuy8Zt zDwf^YsPL38WXc|~X{q42-}cXU_VX>O-+*A`=xAppPE$oCr0GMUb4gQ08$b2) zF7Zw0d$wG{J=(NBzv4@W;E7+tg>l+u)?Z1BJ8S5|RC0GI z@GB{LV%8L#U7w!b=z7jXUWqgYjW+yY=4Ddv?cP5JyTC}pc+p7N#8C&pYlTvCE$zwL zv0om<+2t+E70x-EH=i-3!I12^Qw)knknufu<5%6+=q>9!BQFGobP@)}2Zc2*^TEj* zhq$$;#tWB%-1FB_?3fLRGtt(Chy+GnSZ=1@_m9&Kd0#AbbRZ-obQW7)E%k-OIBnV6 zmk@l^B-}$BIpT7-ePe$&ogq9;?I_wNnV|auxxSUAl4J#>IVCP0+oq~LT)R%EDkEcz z^y$Z`kLYpHwVUU6>CV75Nvne_z>@K-tXWS9o86$~GaA$=^y6rS^lRQs381jUnaMwh zDc0krUTlfA974b>j_OT8W5m@9v~jfjyc2$gAz+%eC8yHuWzVnoO`e09mbcd0>*uVg z5q>_NO_!;tC9!~#2JJ9IoGLbvbKRO#viq1-Z0CarAW-g9uVi}-_rK&j@-TW?1-QpB z-Pt_Z=}U-^f5AiC=Rvs^0?Q?a1<%w?jivZ!3Kr6cXLA;BeW*R9SH36Oo67uIk(IiP zc)c`I`Dnn`*6SKRVwwbBmJ1}A!+Wil<^`;HyBuoldWe3+>&T+{PN$2-Ol;p}D=JRz zi3#@}D7{)AZCP7c$L$X8x4(AMupB3noH|7$%2ZyE{d0#Gus%tV%+l7>ZZ=e)cy<2_ z`K3lTwGCJXQ*{3e1^x{DCwUG=g^df36_!mOzUfyJFg2GPBS$epzz#3q;@tmW7nWdA z&b8tuiNQo*0Xdoq@NEG-86QV`ot)&@SJUEAf6DuXt>Na2U&vM z9W3|O$7k_G@bvVTQHRi=b+6rx>1jjY7}vy?tC{8qUdtsnl=X^D)@xfLW$xpA23YGUb&EUfvC9hK@kkgMiU0Wvjjy*5sD!G^{c|c3Gr5>+rJ- zmT6EtbwsXC!KnX13yqZU$F!Q8e!b&XEq(}^38+*H-ox@CYO)946&oy9D#v3I>*Wyn zrPFc%32njczCyPxk*F&_|aj;vB1!r(1o2{zM+dL}tP z-_2U6+`bAEF?UJp5q52!D2kRQVCZ{XpQk&-AHk{-un|@#;exq?1NxA^TPbQCBZW?n3 zp!$#Z1g80q^98h^J@gfh{I$>%BZR50`r)U@SNI~ z+~vy2Q?gdQ$zOcZN3=I!1;2|U`hXRCwViAHjnL&$S;CS93%PS4>+ zC!1>W<#k#6NP_M(Rl!9x4tXm8kjjwhr6oKjwCSboFad2r`f}Sla;q1Ezxkq4d^^6Zmn@XTpYHW}oz(HJmSM9=A<~v(|skI(4l8mLuz_*(>>^#qMZ0j(%}y+rpMMF z$`EJ-O`zKJd({QVlo<_c{#`S}2>e|f!>c<>+44D4dW7r@A!Y?_>lYsm{cIR$*;LY8 z6q*(&9X{aaC^2^d)N8Vlj~(o(I!oFoeqgf;W7u}1!>xa(G>(7`Ak$=ckmDXtZO)Kp6a|VWvZM*VvLGep(C- z+Y>m7njY43+(bxO@e0k2DcbR5V!|cxyUsOFxLBiInc&mDk(nAYQ)>HbY2m?XVKPK2 zpuT>`?YSZ-f|FxKU->a|)`#3u*<(h{ByWBx^fJ4v1`BKq!9xm^XbUb?J) zTAp<`0N}y?;n+^^Srep*=CjeSEO@)o4}BqBk>ZPx+3kbM=mM$`*8aPB8$YV1UvU}& z73WrM`&gSD77RL|yn4hhWj$FhobE+$)V3`b11gfn5GFz$Y{3j!7U^EZ4QGo)-SQ}6 zZkjxPr#^E~YSGm^1DoY@KR4}>Tvz{4XRS9yN^I+cmqX}C4R}juoO0yh*WrGcYuS>t zO{d$A&Bp138QE7#&ctt47bad**eW?|E-UQUlA27%EyUS)IJ3L<<{xfRH7w$mV}*|L z05s?1UX`q)n z?(cF}6Ds_Sx>~Ts!?mSrI}e?m+{!w~XwQ?$1~~*dvYpzu+ar77mrnos``OP z>kS!u2gmrtDOY38YR!Ft>SD&bJL9?}0SRuxhB-#?J;UV3#Xg0Au|s#mgPjyY_fl%- zA!8omaQoiwnET}{w3*=f0Z=iF)NvvKK9;vz>)19dFsj5+t%M(tY1=ElTQ)!I*QWrn z_%*#RO@3QZ{(%148as3Q%Sg@0G85<>!$pExZp4{Hf*)cjQ5!;O^;VY2gg3MEY8xkt;lV%d zwWmx0d%pEt3%)5PIpD|C;#uA22K3Wt&g%`lPIPn41-+<8>k@U`zzl5M5?yRKq-k4N zNm!uq38h(cQOpb$sivlchc7#)TFiG$R0XV1WiBPGO*2)h_jOTuF$*~c9IOLf{!P!K zbmnssjZJ6;ieAv6yO=b_pPwjSXi&2whs69Sbun-5W5V&Mgv67|BznA4Q|a8C#>UaV zFAuk_4kO2BXR1u_lFDpItX&^Mt+0Jyc|(sCrkU`onICcw2ZtHgJQyTfZybCK8a=n@3k52*|fixoW)zIlpCudtM-Yo)uDZzd~zfbg%0o z+P&_V8EPqVd#^XGi}cEz;hfq>GIuQ}>s;BJI*k?OoN`Nfym!-OzmRg#^8j?_=#$4Qj3wkf0~{g2S(>E&W+6+{ZI$FYhNrzgZtgFXfhO z7IY>yDZ}-xDUn>w9j^H1+*1D5>Vv01dqA{oY9r z#L_^i(cX<0k@MB_ zOHel4Jzj38sI%lB414f;#cxI7CFI~`=MC?|Y)N-KDn1R>HyP~rDhy7Dj@ooZxvm*o z8^q19rdYJoBt2@m{P7%v0}mXz50z@Qd2Xr9L56>l0DRCEi6ndzh*s~P*Kl@P6{$2mG9ci(0E=I4%1#^n&pOt9kk zTRPlW{|vk^Z@N^fL52oO%e362t39%70tSy`4Z*jrJoD50VDeR^0xp~psWgednRKPHL)jeiojAef9(J>oG zwF$@aG@OOU!^0-nOsR`qLb}J4-*^Y(EaFu6h3lv5I|U4MndgmVY`!uHzy87` zX?wjX#dwe0sa&|-B(*KI%*Q2{&%0b(u(k;hVf0B((3U}pQU-OoBuG@L9vnI@h805Z ze1@AaFTonlTHlq2+Qf%P^f=g$T@&eQKN1d~FJwsTns9{eloYSbX%Z@Yx3j(=%huxN z(UdVop!x)On`FFC5=~^i3)_xfxMOay3R|uLF`?OQfeRBUh^@fK}<>~(T&a(cH zC(tQZr{wJRkDWedi)Tj0cdjJ*Gr<+Xx^48KmR&c&fvSN=RYqk}?fWq^u%OgL7J$7R zT4PE0M&Q28C(`vE%t?7`my0W%Sb@Mv1k{bBTH#<{&giP6_aY_tq9BsdmykW>Ir+BZ zxU_!LBPobYM6CLF&|WZ6p{##<0N?3?4eAuFl_PAFlR_qcb{;40MK&PwkKAMv-wUmA z4+&)HTe=C9o$5ZBPyRXv@QbJ*x*m)wpNFg)LW)Wz>DR2YJPDnG z3L&Xj_Vy`*RKqDD4Z^M=M#Zp5tfxn~D>6kI6UXwsh4Q*k{g%F>eJp>0%a%iid8kIg za_>bfEH~*vxa=|QEKo(gzaWlRuvlXYBuMi%86gF#O|bWP@SZqBMIC#lS_b((;?EXm zx>`T8Ru_?t_be&J^`B>qBWmBLYMY-xo~AsYia7@u4(>ddouF}XVRu;OTYTtBy`W|O zX46=0Wx<4#dBWj%%xec&b>XV!!exxcgPsb!yW)z)e)eVt`szI!k+ZZu_fTqU>nzMQ zs6t-DyRT5iw-m{ldg3rJr!>uFH}`(J;yYK|OVXi}vJv$&ksd<#6v;qF_t@gsgK#g`;|H;=n7 z2TkM}u5GCFUvtQZ3dm1^UN;kE0$ZP2pjJijQ7HYg)8kJLJYYuh7^H$i`~s ziMmet@>csSmX^pFNq@z=W!|7J`(9B@mIi!LDn+<4s6+J08aCoasP+$nYpd6k(*STy z74^>esM>e%?F^>|v5N}s)-asc&m%M7Fua8Ra0j(~vg^c}Nyy&TlP#I3c1;$0;EXJ( zh9E`+@{_MXCy~p={GfJBMBH+p<5gXY3OalTd65*5(Bo_7U~6cJlSl)Cp5U_tv^@8SARKr{&^CTKw0y}q&D4qCiKW04R#=7 zS9Eq7GhP;#6(6cq_sbY%ySoVOmpL@ILv;C8F4nGuzerUI>go6{(yiK>KKO~!NE1$D~_Qx3MWoP5H)hRqnO zd65!|RE%mmCdbmaaDWd-MH96D`#HbtpNSXy)&#P0a)R1?Yj$#iAB+wtGwgD zY#KDME3PN=MBhixPYudh)+ZBlBs`MZf>nb`^JynvWQyq#2E@I4sG{wt$|u3uETTIV zVr)J(iO1~R!B1xN1e*joo|q%=?250pW`;A14on$M-q8_@7+mKJ8s*2KKk%Xq38N_{ zlkkDB_Z9&UsE~ATFcsGJD1RW`Mr4xz_?CQGYu^3XwX3^{!K2H?LRhllRU4Dx4Q`>u zWNkZijhL=8(!-XU7EXM+)(PvoQP%mktaI5hS}|Zo=m*tkc~rtu_`wTpb3YN&w+HK8 z{)-=E0|PhugdmISI9xw_S9Yji=MnDu?JhOVZ=(Q#rwlO}%T|GzIu0Q#%Me}_)RnMU zG(|$v{BH!lKCJ6Y|5hkVw2eBD);6A|Vo6FU6&9Lyu{_9Ak4dxq{G?tdoUqcH4;EId zY(~D)H>F$?ETQ^X5`Nk*VRUMK%GBcX%E)l{HLz+WaMqZ4$?!$7Um)uX&KdfNxOUZo z5CG_|$xW(*JmoD9C+&q=Tb@8!UGKe6wIl}h^6%jV88{1Eawwxl7{9947p#l4{ahB( z>uKBrhyH@&AUcp#bLsX9-!b%Rpawwo9gN2g6T6AF-6QN7yByCceRS_#ahY;F% zY3H~;gF;xcPa<)K#V8ec7__`=LWNLk1av@U4$(%VMzTm(LL$_yDjT`Jw&#WD==Q!F z!Y|ZRYX$Bmb)w&CPkT>U&4hB?3|{&Qtwxm)Ph40;wZ0}doUIhu&&A-3N-(Drv?T4j zvrOS;2PjN6Dnb@1IN-!P4@+9Bfkzlk@mWom5lV|uz>3(?9X)U0Eelc)4(0yVRZ^7Fp40Us425h3CFTa41gEfIpT zLuAW)Lqz4mmks3J#?y!{$00y=!r`{sYK=lwGrTzyoaE%kf$z)TlFJ?4pm0{135OLg zVupEugN+Y(LZw6o%o7{fq*ps6QMsRNc z0hX3b$~H#!tdW$Jv-?jol`IC})9(doQi*!KP{97C4a!ks5e3A>GD(;PA6y^em@to= z>@oJiC`E!b(b0YwEl&94^?dwUBgRJgTg>0?*JiM5Uqa(WStYL~GqnrcTrN7Y9AgwR z-4{o+2r?!ywF^#x}>rr9&p_o+p(CQ-S* zx+$@tsIOh3P{7c`G$(9ie`Orv>^yZ}|5dNd?Rhncwdr~SEp?}vsm`Rj2b4I(Q4Vi9 zhBTNzz!vcb6S=hZnw}z7ahlo1m$7a#(@~0EH(XSAq7}2bCUA_T0{2te)4r zr@{`xY!1ifTQ)KyWJixq-bQzytBCzL+3_Bl>egvl31p;;Zp9$MiUt z_hnF@?!Eml#L8lLBo+Z$x-{|-yNxC6)j;KHdExbj#l@bQ3$MB!FL*r5k#>hkZdmJI z1$>U!1sD7bmIq<@=!WI3v3W^}u_-f^tMpWn1B?)(_^)O{A*>$O>oUcUpy}VHU-2W< z=lR7V-t`Barh4`T9Lo2>4RkI1KT^u_0yP zWXGW^4ypTDvuoyR)wE-hT8#s%G_s~Z>i4*Y;k#Yq%=GrNB;pFADULt%OuN_Wbi$2ULX+2H5A*Bd-iI zsB(-x7f=+yW{8`sv>lQ3oXSy0bsu6V9b0(K9r_&0Kp0vR+2;u?qDd6vp=0qR0xtAe$RKmBL=P)tl;h;MW zI<60lcK&r;Y`cl$Rk{p-l7unu0m;ICH=hLyNYtwP5`15D7v?lx2s!Dbt4>yTf z@PIxY1)q~DXnX1Fsq`i5^J}AspCy%R|ZbJ1SozElX@zKI}iHnE#-uMeM z-`;brL4(Bu87H2flvz0HjPr?Yq@F?AtS#@S_UBkwT|zuqBY_AxlY{Dv+N&KVd4=}l z;3C+XA5Y=w=3{fT&@OPX7W~p<;S0w{4tW6A6*S8#={T*~ITA)|9`d_eaW|G8EVrB@ zAGGGkpXMfoEXG;}(@~kGD^O)^#j$ieSZ+Q=es|zhQ@w(p3#ZP`cFOozp?lG>Az*~zvK@1|H$6GH>asgPm#npykUbd zQ|(s1JVnCTc#8bj&z`1lX0Z2f4S2)WM}=^z$A2Dag`EZ`kCZE-zup3V{hP7z4F&mG zEZeiE0=)NPGqNLofAiOO?xIdLfx9}CEdPAfw2_2_6heFV-KeWYRcgM;D#PE8{9jW2 z!n>4z6ZngyUw@arC-00;|McF*zl4g{{jZ@w;0 zk1}pHg6Q4A$6s)U<3(1hafhJ2{1#a{BgjR76fa=^4^?kY(^3iNvk7%>sx$o-%HOYY zOp+)1;xVsV#4P@WGte*GSU9SOoHJ&F{~v@sSQDEpGFc5dZ2B|Wwf{^uz$fM}WF4~0 zcm7ryIPl8&c1v3&zpadONX{G`$t^AEd=;& zB8TdbwYb9!zrU@C(faIP()qW-xqz0*%L=w`Dxvj0|L4s{`C8E9{$sUUALqb9yVH{U zqe|ho|H|_Ik~{Fn@)XNw#wcXS{=8}mO8t+G{Cn2Q!TX2~v;Fee|EP|+`9HE!>MQ65 zBSd$1sz{ew9-C7vk1;6?t+Vihu8+`uMgPB*2HM|yp$k6FX%eo%UYH8q9uwlBt}D2& zMKP^w?3G)X zO#iq4*a8@p3Y(1XZ`ZEDC&+0U ziQ+Y>9JY?{MN5>mU=|Jdkah-ERP1alr;<6$i0ms|rL zb_%d4Za`==#%4CvJ59?fQ=f*f7gbH!22-&myCyNy5%wy(2zXjlFRa4$VOR_M;p{I@!;3En8sH7*`ElVC1(;_s}VJzP^Ko|sU` z%*izDqtPI+W!4*OLXDn*xjwH(ZvDDs9z?zrH=9>>q;7ni>7|9pveZRT|K+)FrpbYq z=dgI9c&p;+XAJqH^zT^mMpUt|;wdN8?f!l`LaKKvef5Y>ak{+;GBdbo%sq7tE#ccY z8L0rcQPuje4Uj*~5WpJ25v*9v7ALfMf~erirj`G!)UPr1qzpDyY~)8q#G_leaw ze7?zF!^+Q#L>0fZZoM?!j<^Mn!S1X1_LqgBC(ylWZ8K0c1%ZUFeoJ&&3RwsY8Ud`OKbOI_r@ za0oJp)nbB(KP=Hh%cs~usZ&a1mOajXs4Rk)ea!_76xG(X=;6uGZU%J2Q7MG+3&y2Z z1}DiysAbzBgRlmkTr$P$E-17U_D5{L2Xa+buX^XRyY} zUtLy$wC-G8JEH?dT`+#^jAX=zuzBC+zPGlhp(%Y*?UieX+{8T%gjdd|svu?n*sSQ@ zmuEd{nHP+gQ4t@ws>NXJ(#T7F`96Q5>wAFths`C)y^IfE`mTZN5^<_wBb^Q?-XM<3K zq9SQEtfildJ7kb;`2dkH4Pu=bPW$+Jy9L7Azrn$^aj|k3AvJi=+LDEOWuUEmPbNT0 zE^PEnq~4#|6%00G0dPkSw-FuPpe9}Iy8vQ$P*r)S)UK|YRpX0%k+GM0hBa+JH3IZP zh#!u@*t2Q5x6t;g@3DJ>bK*k`w}~^-hnXfbL#j4iM`lxW9kS|X6fV^uOGLZQ61-t- z080FcUeywe(#D;JxeMm%yATuCf=l&V&EHHuhdp{@K$L!Y`cKMa2--g-b|RsKxBR|-%@#3paxGYWdMp4!J)( zITggvb5qSF$_~bwPioI zz?)Jx!eWu(Np51#@nh&E=74!oHMdkO;rzx#gH%g+C1FGDhS}k+jegf9^g)IjX7eiT zpDFzTbt@YhLnBh@vj-yS=H9MuUVlaaj3wAB*hQ|macTDmYg?nhoo0&)gm*K27G;s$ z^bn6=nPm^vUcNhK4V!6jv2l+$(AoD(18 zlFR!uENEyIOdQo#!F|?e)nO&O74&QyJ0yRSwqN;Yzt*o*1E1XD!+f5DFxx`&PqKU2 zD*XusK0`5>6rwYdqBF^4+^Bt(t@GV$aAouN)PQlE81M@qlVdnc6+JHZKuZ`2Oi|?-1zvOHC|9M{3)IJ@M9d^h3j|2uC|FabN z^WG?XhYBs(A8Hvxr~hrL1b}4y$>^`xAMxsS#tZ)8;%{<)rRo2$`*(KvKSnL^m#qKJ z=>JP{|HrBQ#s6O#`g^Tn{XZz&{|2?d|DVGBZ^#z-j~93UYo-AFzqZ`}hH(EIvIYGA zcl_)>qxP5m{crf$e`X4Q+yB203;!9p|KrpG{}Vy%zoJ%v3}0g25f3it#tnTiB8!8n z`~rQ_JLOE$)9=TD{eeQNvA{ed5GVR%5w2<{EY z+7SC^_xIaE!QsG=ak~esY;`w5AB;Gc?et0|ajGZ&JeqQDF-c_GXxMNUUmx3=*+jD) zBX1a|sWu>>-F)!%OR1V`qebjRl~*S$+Jm*iA;F*&gJ{}gwf0ZnF0TSY*T z=Bj{HyQ0#hmjH@_C{f2VIwHOI&_x84-a`q!34tI42%YZ)MBTgV z?k#)ox4&E-&UAAa^4!{QW8M|x^$V(QAxF+n;33_5_Sf@HI~V@B zN}%L)k8)jxe`Qpq5&;jTw{CVD@6z^TMohOe2Q<*B6@?Hp*}t>Ktf#INX$%P9EOApS zH_ThcDk)(4!fOjhax|gMlJGTpzCk)HxCJ*2Mgq z&bvdx0@i#N?4>hsm=4Yd`5}Yp<&aQUbm>@-YUpWl5g|VRMWlv^z1r1vaE0%og2|v@ zGK?L{)yZ6_=#e!z9~@|`Am?n&Uo496vPQBj@>i5DQ~2Jg3t7DIHHwIC0Gtg-Ea8_( zQkm^oYgRtP!|BvnFW^-hW?I5=AfF_T7L9>GMyNxAd9RmnCl}U066wWctHeGUYq*@LLNI=w2|7x8P<}9vT3THG(*9oW zOIDuur3I5Vj4nu)Sqz2}$=4Gfs9)g#1g_)H(^qbN7<)y|O=B^bj z2C2F)cCcq=bS!3-RrL8qmCyD&8NrAIQzfVyi)suYkF^0)#7VS`-SG{Z3LbUg&Ciu3 zb%p4ojxy$KGX!ttUe7b?Jo~!iWPk}10GOpt8$VG%?T^Vrs%s6l-w5M*(m6Jlln_Z; z5W{GgmU2j-&!uzB!NtAUiJYx`eL%&3XrWD(!Vkw={weZWz@U0R(|l38NZp+!plJxd z6)e!6K=7KIBPl!_V~=HWC#>S(y+=k9CP*JHF(QhKQ>vT|T}bw!Ip<`J_C~s>Vc+!5i0gT0)wM4v4Gfx!;gS-rrJkDUEE!!IZk@^RWi=9z=!T<&>NdjWuT>L2F0pVXLsxOz1dZV3v%2l8XO zb-0{sh_w6qI{IJVLu)wC-Qez26pJ=!i?3J(wfJ9&C}{P$JiL2FF92*(rzNS)rh29j zsX;@||5iJ5L$@K6u-89mZv`xZiK@kMc%c2rSG&-{?=H|$6d?}WE3QC!^VqYQ0>``= z!muUo#YPBR$jN;zr^;;B*f4mjBR(v2yn&abAPLzElA@!nGXj{{aXw_=OIsIdn8C!8 zf{dgB;Q=`+U;cu+Zi&7xA2G4{gXv>OyJm_)$1QtJ3b@NRJ2HG|&p4`OjD=Od0F7l# z`|{Nt-a@Ed)q$!DKK|LN89NTT5kHRUfGhSLm9#qon|pjjs^g26)`3PG!JB>ur>x{Y zI3urVKk74)bYV3Dl;R^KxkZY|YHjIQRB{hovx(tY=<%z5S3EQjaW)=oawaHfz(qGl zW2;D9IoG7Ovt*#ussG9eM8cX_C1g`=HAS+Moj04~J%t=Yl>zr6U5BV7nD~<&- z^M#D~N`}6@H@x_>Ov>qGI9*>oxPNR#Jxtgnxuwe?O~hm>P#`VEBpIi^md5gVqPHAA zssEsyRTQKs{!%uJ%K}VdWhPk1N*6h~&Oq*+6*%EQuph#OxCu-F?c%Prrp8fb+Z~ zfVPW?NiS8Ng&%@3?Mk2-&GoYa)ESkyxV&4;ytQOIN(1%jD?h9HCBF?iHF2$pc;|J$ z=Ip;MXF}i5kNXA&X?JRUEx#5fG^1bs^wlmV#eFPn#_raT_7L3yY3@%7kM~qmQUWbw zQM(?Ekv^?AYJG?>~RN!hgQNU-=J!>F`I<>F-$KKVM+zPovY{ zvBG~IoS;9APXDQP|1|V(D;N6z3;o;5h3uO3-jME2BLK9P|M52P5B!t=&L;aOW()xi z%Za+jBz0s4Zx_Had3j>L8?3X7J|ZCJtx#8WP(p1gVlwrG`pB^jhn6sT6*HnS@j@+pk|L^t z&nD?n5_idX1!qfg3|ikxHqMgquE$NzZLX<%z4v3FAa9y!fndWkg&=+Y5bnAfhR!(r!GZ%(zR{@~4<^4{J#hDn5twMeKjOn# zudElLL(ZoOLB;{GXkE3d$`p)!sNn9dg>A?-c1YAQeK~)N0l- z{A<%W4FJzMTDDmuvYB;i^VZ9y)xqUkTa*dY7XYctO9l70FPPOi*lYu#!N!BAaiO;`)fhp76`hGD-?XhHb3niAoRpVfd~Nrd&p*IK zaome_@mA?J${?DwgLb5;f^E;L)@Sj<@%7SJ}THMih$TzyWa_?)&`Co6%L6=HCT(I z^nd`BxAE}fgG1=0JZJy5c$tGuLvuBZWYst}<&q1i`{|3qyRe;$#u|jj?K~pQBWm6g zg8u*MD^U|~yO)>a+b$kQxb>{QKY98;gp%A{xN-%U}EZo{XbHJ*c{m=>vS zJT##yQ?Ud}w7f>?g}OBCGhberi%`GEiAm5gj)BSbQ=Cw+E~sP9Az zf5h^ZX0Z4Ah_wPVGJf^3#c+RZo)47T(B*me!{hl%W zwIF~j4!SIYtL!HoIJ8klhcKbV>QIFvz<+p}gx7ppsv>Pgu;Yyfb-P>E1pFvOJ|6}^ zZdQdFwO?`zhyLKBR2_BaInNWhMs&nXsFP?|vG1y|Azw2%y9HMmo)pfAzEGn&JMWtQTk@`!ov|r8@)dJILc1 z69E2K52n{bcl`?-vu9Gz@_d-e0%NMg#U9M7op5aApV+S@k4O8O0ovF98?>+5Y@!!F zu7~Hs4LZ%gl~k_l_z~+Ptno)bR8r-ky^Uc^A;Wkvt`?^v`*hkB%#duj2lM$_u`}iC z^AMKN!%0YJ0;>GB%!r)`ZsKVWQXe2IWZG_(qAY3rv3=wmotbfw9s2%hO4F<=stU`3 zK1U;8+_ddtV)y;&CDgwH_YJClZUi0M{v>sxInC|)84sa>0-eN>R#L&L^cqWNrCo9) zWdT?@sfxZdzP`kpp!RRfx^zw&oton}xl%QuTp=fBbd-h{^(9yr+rZnjW>T3I)N$9> zR->Tb@^)q!Ezwe5k#Hw3qIV99>vJ+otI_mYygngWP*K`Uk6uN)H);$pK?_=GYZv1o z`l7N8TRz*(w?||z*YS9Fv(Gv=n;Hj*mq06h&zk80pwv>j)N_f{i&nzKLtl+C z%5mzGIo(uDXHijfTc4gctWn8GN4UX1jg4tuzt>oq~VPF8g&#zMQ+yWn}zar zN8fS1Tu02ddmy$r4s9cUiZ_yZRrab{B{xNI3X*o)Hd-~@R5}pjFgLg;WQUxC$G$Ch+1DYS$L@Clqxi@^)1r1 z;y0NC7*on}T%=R>HT`swva#{7%11MePu_TQ9V_C#_b`T;+-Ari-CH&Rl6g(<7lUl@ zwwzJTXb9)%L)lD3R1`QJIafLXnnnBW%`A~LjJSR}OHDix%`T+3lv+{~edw0S=}Lx# z3>U7u=21L0&$?}UO*}@H0ZOIY_q;aplE3rKT|;_K_2<|i^pD`67lWg|FEjPb`Ut)V z_F7IY!isLGF}0{d&ibdwpnJM#hPPRsk8Z1SzO`hhCD~yVHzNeddgOjXTbr|6^$~l^Aw#7>v7(gCuX-K(CwAz^)v9Y?uybRN^Tyn-ODLIT1dj$^sGAons%-=x{W6@Isp(76z zZuM*!Oi2nt5+yFurHd=@Z2kH|wMOA7xP+}n9-$pe!aGxB2Ujrd%XzfMMs4ENH^@bm zG6VV%a!lyc8b;MDe_EAao1!Fyqj%5PHvtJ5)Ns{~C3;I!2z_}(TOr4LqqWNae5AR1 z60LA*CuQO`cu2?k19tcbvevuP;BV@Y-6!r%#o{ifrcYX$9~(UdhwOqv9=aFjTWq=D zUN^XIplNkl@=a8+t~iWC-3iR#W>@T1vV~N>^E?bNtsdDzW%ho=+vlxqLFy~|?!Wmb zU_|J*IAVr32bLvx)@HHas63AlB#uTQe$|WUeeJTsn;-8g`e$G{MtgZOurW_}^9pUS z4F1dr-gDQ(FENGg8kgn?S8(WX7laLd`^k5PzvhTp#hvOv4tx~aK7SkV{_JpZ%L(m2 z66>{Z7f2!fVD>Y@$n`@!n^c!|q>g`cJ=<*&{@{4?Hn(7tPuTIo?)QU8i!V~_bR_&E z)hYK!aq$ZNTcw5mHF0+i)PJM2(0^08|Ae&A54P~PEBBw!E%bve{1f8-?b1S^kLBO9 z+`mU!Xs18sKlC$cs`@aa<#^H`a6$IxV9U3oW##&Yd~bt=@8pidYuV$!p^Cu&ztRtx zXGYTagsb=OwkbXOpD?qaZIS=~7?99ziRJ%^0r>~``~Q>y32k?Q{bS7i+vue``^KN> z7W!Fx+y96G3H=A$-5p4NyBY7_mKNCm|HRLJ=4Lzo_cI1$&0R_D8b1zjiBfjqQjbx6 zT(J7XNQZF)PWxuj9Ov#kvk*Ht80zNt7+%T&gIZrtwt)+vguSU*xJsQCxhP=E(fqR| z*m@5NA)$oN;dTL6NmXUn*$U8CpRsf?2SfSODs%M=>$Mt00;?_XCe@AFAH=eP{BK zIFUdpsoBr)BT#<^7(%3v&C2G)&B+BQz!7oZdV7Fu2zRGarEzWxTz4Vy1%L3TJoQlZ zHQSXdRvU{E^|vmi9c}+aL}#q&iYp!ny_AkXtqjhPvyEx z?3n@?lX^U!<`;b;^-^wuX^@S#EIEC z{6XllS~lP8nt@=(=ed$E@1gftp&<&0Jx8yhULY7SD8g)KdI;-Ma~cKW<&>`%G?b&a zDy|>D1K-K_+(LJdzKKXDQ_A^J-hq$xA;K(|_7{CQx~E{kbxl*5Pz+bfCBz2tAQFa@ z&{m{iMDM{VO;D+CP$e#s(E^|hd5}}N6RxDLV}ehqVBG5$oolbZ21`pkD9el}FzmQ^ zz&;_|*)nafte7;Iwkm2h%~5mo!Tr)QGwaD;9$fA&#O92nU0u+qy1tYN>I%;+3Xz5A zmFYIwdiNEqCB|wHdSq4)y0(l2Y>HUD#1x_s2z3jC@zDW${NPdfLN1{yEk|z#h<+4w>qq z(+bFIM?#H2|5RbobeN76L?h1{xYK^82}Nh_U_|hm3)6-VoLpL%yCR{@72O7IB&k>~ zLs@nMPj86nY^fqz*jj!JbY>`NyZGjath^1VUw5#|$+ze+Na#@N#3=Zim9FR_)~%Xs z$b&kTzc^1MTQ!ri6gFy&j5jnK@fQiQQ)^I)bxF?Rh$-rsE?dJ4DOo#7L4dNL|J>Ud z%A1U@$kMlscAlt3dy4#efvJ{wCwR&+ZZj2ehgkVUNON4)obP2kx9dqtAnLtyv!m+8 zR0Oiw@3$;Kn-{6Nh5S<=Pj5ro=^4Mr4TC3}hoT3$OVcNzUuG!OI4aa2hs={sbu0y3 z67;V2=8Wi!a@Q|K*S4@tBGjgBrmFrthyjbWnToko;On}-qXJG?b;QEF00zySzY&NH z>AvqEOv5ZudwBZ|TJ?7v!1DS%nxKw4=QWdp4#Z#<%^u!9du@o4>e#Jg&-=Vj={1CF z`H5fYaY^Od7Ch<1-lfe*KZPJdsZzwwkae)1$qN$BDkMbC?(n8Jz3ilrTLpvxueaXR931Ij!fM{F#0E5MQ?WK4LlKg#F+|cUIFp)9N0i49Y;6V? z7Tpq4PJ-vkal?;|B~z=95YT)*i@9y%bu_4Z%2RXqWkGb#U?5VW`&BjH*nsQ9*#W{g z6X8}enSSu9qsjJanaL&qAT3gcRgBd5AF6Rj%cQO3$E zRPAJ2?AUI6iRVEPXNJ(mf^HzPUd;o$<3p8puvdGK#>}JR20MgSY!I+*zi{F5@xr8lM zZ%9&#l4Q5JgpUE25XbW`fs3EtE93Y~%(r^Ucmb7>HMX4f^ZMe(oCMRjTBBM5Ym<%1 zyQk;FDKR5%_nuJKl zD=4^QVqQAyXKS2t@Wdi$XXGyd04^XglHF*T+Z^ZZR?v?>iAbrphPgQo+W3?&SFzFX zw7nC#WMfg6y?$kzP~%n&rV&Jn(#V_TzKn6-6}4@I zk!=@Yd_PiaM_Oc+8syvm}O*R+t*MJ<2RVmkgRa3sxwR7 zwmS|mLrp$#-xa4OmJQ|OSWY()r^Pw$lNM7}U6~VRs@?U{4?1`ZZ4g5==QLZG&}nX0 z*TCzww>RSO4Qhjn9}SZ~Tywia9XVdKY&{kDX^6(LujB$#=xfgSuwqOJ=d!KY`?t_o z-ymaYadMw}j01|TaCCT(o{L_;aa!5I|0;E0k2qXVMq}-XAV78#tAk(}5Bx)M{fy^f z7-!0fEANdE+l^Un+fbO8x#GusyZ!ev9Af%S8*ZDjvGxH^&yKfh?~|OVN}&+`BHAyS z6mypLr6u6hcZOKX=X71rhfFgoh;*;n*fg4S3Fd6BPl#l2aL2JOzP%dYV z>=WnSf3vsQ)$;0Z35bOVkK)a1582*y^l4$GRg)rD`s@Z^e2ud^Vv*eN>c-7keeKYWLh#>xC`ULr}J2Qe8}XhjuSfv3Au?q&S;jwTZS zE!Nm_<%uAKFoHn+Cdyq~j$gmud2zLOW$_+7qkL1v{6$8;qV}x`dYH^+gBRy6WKM>M zP2&gCZ&_7F?~5wyNHJmS%FRf!+l-|U`AD~aCPI2oxkm5{?lcKhcGHKZhh$~2CM~rwyIcwI$lJa zPEto2t;AaxKN(EN&o5s??qvuVFW>5Ja;0J{P;VB%=S>Ywe0nH>iJIFciIZyYnzBJ!ZB49S<|6a^XKZm^+Qj`1_K z?)u3Y;3ts>%`A?Vu};%}k>1ke^KlHqE}ByJKn3H6kzc6D>{=r3<7@XtuN7i!-pooz z@pR}S0M}E6g#zrUALhM@JRwp}yFB&Nq_#Kh#GO60&b7(yi>#%f4EtV3; zk-1^-%E+u(3#PmP2e}BEYhdw%>IeDwh=oUYgYY|1M?Aj|!X(Y?o$xpXV>;SSX!DiP zce8(+sc2sF?Ogh8j)-TN^PymYX!701-0b-SQsXw?f_bu&VJ*RHx7T+s>6t%*E}`v7 zCf5(~u28Ysh%)TPvFEwJo0PFTD5Et^a7mVeVAmdLz6$$CBU-3T=UE<1JrdZC65zCW z!r*s^D74G$e5-0V9mPnrb1(w${k-I768yq~8dXKK@3q;Th9Ziuxco7ADp`Q(5`mHK z+JPpXa*7|j@{MwW-+y)pdS_G+p9;*A2&Q&9r*3b-KKaMo(wC-vS&$>m?jpPso&Tu> zx#j_8LwAVV_wFi866|%~=b+&E@83q{ob4;p-U1g`eUo7HrxNH7of~)`N1jNqtFV_p zo!WA%$fjm~ok{U|}pd+9RI+dpt|@rBwyo_-T(jrQAUtK40LJwz{m zilV>yxz$47mSz`*`=`wIZ?jtH4<-x!6K4CbS#9X$5MJc(r}`Yga6N$Z5!?KsZ>tb< zg>hZ^F^A44f9BZVEidPH;PN|e`5!3^`2V+AOgpCZ-|_RGDGd4_`T5V>9FIT!FZ}#R zC;QROxB1s@|9wCInVawW|9{)hf9B@j_}_oLJ^gKd{xdg+{(O7-nc4nrRtx?4_VhEe z{c5$~6!+)&q-t(ou?;66WWDN!wl?Y)3=~R5qCQg$wVw5so@i_$vVr0qRkQ8ot0J@) z!dH09eZFpKlOUF}S(!7*bEBq9u#NGO0q6M3@r0B3nzdOchW&!JLVQ965?hN;kP|P_ zVpB`KriYqj7x}EJ7oG{$JeX)On%sI9@0WNQA5(n65VzlS7Y}^zE{6WNy|{AluiA@8 z(8S)f>Yx#n3Orkcx=dvdL5E|Ln2K5jSW^61KTYjHYb54cbuOiRqG{Xp(WwJ*09 zeJcm4C+)2Oo}&WLxizFaU__3>gcq+F-IVO{D=(|DYQ9QLG%=8C(3VO6*WUxmUn~eTIZB7R-EG^0 zbXe-vb9a>YUlXGcrXj+C5jAhqBU{yj=$Xo+*`b~Na}2L<1#>feKk>qLKe1ROJTy@c z_q%T569}dG9}vYGLH~#-{s1VFrhaQAe)NZp#O3*rH|$#*abNn<7HCbU^-V%LTz6CuN0IMp+<# z%RH1|aCj?!A#X^rsmA9x1LFkDZoq^~wH|;;w5)BvCm&*rev2V0$^0YrP}wA}qn^=e z8uZRH=)N_9&^FRplj*9pR?=okGifFBwc=1rGq`xlnJ@U^QyX)SZJvV#XpjVevp>E3 zF}TiRpb?^KTA33~f6=UHuKL9Fi-8wU6jMJj{8&9#!$4h<;WApZC%?$Cq}w_`+Fj?U zEq7GOq0bTNY7M^!5Un6&?}=24kpWf>DvVw~iofErprc03+z>JBJ#IRy>pOthd4;WP z`5I+Up05W5=J{e|pE#hPSjNIV^KDvgP{VsqA+QyysV9RfNw&8-uD~5w`C`3HTq0$n z8JHPQA$XZ)UY^@oiG~Dw5A(IR7;5_0$cNBkhvJwJFbA~p-_L=M@p1h-Nu6Pzo zu2F?`gLy=@G@2&QO}ew=S}22^sh>oGe&Y%OS}KJDk6D#EcmUb7FSUOf+(+%HU13wx zlCUu2 zlB^blVR5Pp>Y+D_`&3E=z7 zd_;uH*VbB`irfMkN5GW7k1F2~M99u*myU>-J%)Wyx&Wx)vYEcI{sPI>t6*Y7w712F zD}397B;DYky%TV4ieDwt9h*!~4sEFFe`^q7)5!s5uL)gZH`MoapT-xjjLTNW9m-Ak zIcNw4XZAsR zukLl<_mT2yIKeMxzPxz+Sd+NMFJsX~V=hm)6X(K&URLid_M5eG8JOsiX&I>Boak6U zN4}24>Gp>?Xh_CJPNq+dqzv5MNG>WW%As&fl&m9&Sm6kBj`Fr>${2bZAT#Ym9<@@h zr!ukTMqw=*!*4j^H(8TeX;|)pOA?ZWe2YD;0=9fDI=pG+2npHX5)R zY{>e+QvSrSy*gsV0_DrobD`zSki(<-^R!n#^g`XPX)_6tMJ2P`++!xrha9=1A)@w2 z_%GI!BhyDsR3NbD0_f(7q!5@MBbDmI3ichZ6s_wurEV+n(%tUcdwb7jrhM#yuTu!7d~G2?5P8o|ik2oEO#_;d!UzUOw_X-CF%)wguON27+-Z zUPG}=8#j%%=*&tijJ9-$XzdPt$Ue88c5cUBM9E5CaAB~&q7Jtymd%d^ovb=qwPO%w#FDQCPVgP{z+nIllcATyN1B`0_<$5_DeM zZ&^vg%w;paSqP@xcv}6k!;t)kNj=n4FD?IEDXYSc`>Js)JOe^4C$wPbsd$Tagesp` z=YwRzU322Z8&j->gp!c)Y7B)-rnX9D$^4x&{pVJZQLA@Va#kDt4yGSDU5cH{G@SMr zYck7M9wwB&r;Wn8%;`dR#w93X>DRg}>sVCdi;y&qOO-UssP&1Q52O!K-8GR;(=S}L zyjgU!x&Xf)JzL;$V{cwsA1|uU3l_vXPVRST;9_xEc6y~p3(Mg&6ahX+5zDa^FTAV`X6T5s*=S`AuZOT2I~Ln6T0q2wIei5~lBTLZ|J-XQY;4=lc>G@9 z;_6Zhwi2kQaAR`xyvVMO3^i$he{*AK?Y{j42<~>U8G2OhvhRvP2-Rx?<4-AgkN6r7 zihx%j5xwv4e|^R6Uxe%dPdR@gz?el=(WrZ!OQd5vc;FwU^=E$%H+b>7I;i9aQR8nD z(AxPHgZanbzH&#PZFxR*&RgdNHOOKWzP|G#S{m`45B%ZZ|NHVo|LF_-p*(*qKV7)( z)cmLf(QfR)YZ?Nf*TP8C^>d;V|`Qy{xi_Gul&!S_3u0iIuY=P za{W8c`s+u%dwB(OiAiSCN3dpXD1->;1Nx@l`d9ehM)3*6k=fGEdTG=CupDRD75CBN z4%0dKu01$w==g&kfoi!in@4{5+jEcJz2w1Mx}VTKn=^*7qEpfKU)#Ta=!dst-@893 z*MjK`)L)PRRl88iRKNJXd^9Y3eVv%fXmP@iP?x`H;S4(!5I{JD8{@L4Q2Cq8H#INs z=fb$K8==vt~Je01a9xB?ssY3vM8GoxQbMZS%QxZcr)8wf9;de7PB78 zBmKnB!_I!U!s=_H;72*tr4%Q4Z|@i;{zZK}AAuj~0x?BRgMN_w5MJ{7e?@XM2Q;u@ zeQV2EEdEL&MpcGSOCaLYr=xn8&HoHf|m}elhTjhnaxK*LX69Xa^*1YDB ziW;H3T6_(DFu`i6?a$|o3WfibtkAzA?0-R4X#dZI z4GOf-STVnK>ApX%l7sArSNt`Sk$9!~p@ZAjd9^^U^ZDF>jF7eN#gtmYAmty|cqy+K*PsKbR`3_`&9COG) z!up7J6wq>Iu4!LU;jI2X+#sa6kF!AmM1XUl?>-#Ic}3m^fmK0ZbTu&D^+X&pNY{nG z<&Em)^IM&&W^wpw_KOwH9iBq{ppCchnJs8Xed~gQ`gqmshdgaQ>89bQhqZk=9~JKU z#e=E7XZ)Gx+2<1$`tE1ZPK5bPR`nc{j|j+b%8G1QXCx{Vn1pP-Yrm?rpPDPxmbxOz ziNxxRTriF&apHjOi}O)5Bb&o$=8Y-~=8exX%qE#5^%FIAGLr!{2_I}d_J>m1gKB*n zxRkpMS`}Jo7R!?~E1HbIAMQaR%;#xQ4rafrp#4P3C5exfX}* z7g{7#9gaAD4ECb8yqV&*G#UVIK92xLeeM}REKJMA^*ha`&a{<01oClVl@g8U?iW{v z&-UaQwGmJVJ-;AGc1Si_vA-=wwB{EEN;oumiv4i)M#GynbgV>u$f8E?r8tKBZx_x> z#4lhn3Xo>lzCetNZqb#Rl;bcr1sVQ0og&u4(U(0Q5!S7eX?);{d*$=wFk0~4PL7)^ z6N2bfmlg!>bgp?XmgI}mz?%B770RN|2qF1RMU#!jp6P`$nV9^yH_LDoffdueluqaAlNuS{z<;% zCvqn9`Tpu8HQ%*s;|tT;$T67B@!muv`)sK|yzXoVw|B(5H@ujIH#N;6+J@pZs0DpN z@=D!E`y{%Rlq#C#w%MDL1C6&PDaa)!59!6{t}g|ur`xB0SysK%v)K*>%BXjgQn)hY zW|z*OigoiNa^g!d&9ey$H(TabJ02pi#1zt#AL;alOXhTMt*HmJCdf(|^m^P`tr=rx zun@Z_H7pgr-Wxh>x*n+*w~!TkXEp4|oreQPrI%ix4n@vplrE_xC@#K`xRv&P_+|mh z@^;Fg;QYta#eQpp9u)E35NlCl_QX@wfQ9NPm!^JbI0)PcQSA46%YOW|-Y;UNjRNS@PFG1)-s(_`=MQSYyutxm?WP%p>hp@+cjvV) z$IaRt(_|Mtk8+IvMQHBBa8o!T=0h|gt%HMpZN&O%rj~;O2uuSTJ=`U5ap`ehV)COL^fD z+X_PJw>369=5b&p_Gb&pqfh%148(dP#LBZ64%j)DAA<`~YRg<<>Ift2xhA zr3rAui-NR#Ufx(y!p=Fh(Ai0GRlC&nIcZ>?Rz(OhDm8f3X@+in{&IX|>vVV5@(g+8 zhUTS8Grms6#@8;Xsa!inQy7?~X)+GVQ)q!&3alT^cC{g4WYmVG$J8yEK){Rj` zg`VMFP77hn>$gbv)>eAnfJu#bEQ{p3e!}4}ou)LS78}CQe)e*jZ08G7(=d1|80eap zm7M2eG5fZGfQTZXX>*?9)hVXVS2YL)$!b0WMtfgt6y|c+Rlip?{)o$xPN02$EFpl# z!?)$vwQL=zu64+ZslR(`G9jw}c+S8p{ezpI75BP7hBMHAx5v_u@hByp1lLa=jW$7r$TIr@fn?8FgsgD1b=#EAvx>$P1)mGBqZhgq$ z#Y9YF?qjWr6AH}P6hZ5L*G__Pkqw`VEeN!LD&NK^x@mJZ3h+J^I&u6Mi|;`n*c{+r zt=@O`Q5SyerJcn@s!-4M&O@gKkvNstkYSbNJgd0({a)7?uk(@iZ#>S;v+-i25jh!_ zkuN1KDW*@4GLyYOAbqL$+(hdc(>~~tpt$*)V2a8o@_G)_SvC2cR_8BL$RDl*ll3r$ z+z?O8*&aQS^Wo;#82e_=?yEEm?youR$M>cx1kOl1a%AO}!!aEq9ZL9lfxS;EXV=MZ zwPmM1?YtE{-L$xWbE=3F6q_B=;D*0`vHUxp_;Rj#k-a`ufa=wi z{O-bm)9fGO8u_k|1>yL{#LJz%qXwqEDURLW?!u39 zKa_((EP`S0ufLk5k-KW;9j?w+saYCi{%q*VN~OcS>e7RD@E6a`?m5)5s51sO=%pH{ zbaUg)JY|!>VFZ4Qg90V&Uu~3LocIL0ML0>*NJvc^>);_UkTBqdWYrB9a=;Y6;blIQ zNiOC;^hqp(10&BvrV_;6qT)*K8U>xCtd7_^z_4d7X6UxVFIxpA9=d@mN7vFX*6rB1 zBI6h#1KpUY_RA|CvW4qzWIB__^}<^usU`#sLe&DU}7fX)KK54<-1nnZIwz=_pIeuI6P->!hAzP`tj}>HLd3ou^7rNASRA?0Ig=uHu$(!28SmC($<$}% zj*C-WCVHQqllVp9u?EXjdjd{29iFx7ql#;i`7b)`SbcCzQQfjl4SCb5st2-nd z+zzu5(}uDqrg+rNjW`phLDb&(fRIo?+xE=O?3bkraOfq*-#-J0OU8Q? z37yArT{YM$_RtYi1Aj%RX)7P+;nq}x;3SXQ*wSbjs_S!Kw~}umfDE!QjooDRe2?*Q z@|UNDkQuY}!_b=-^O7lv&N5v*Lb1<6F#Tfl5t*3hbavH4S$@POpVPnvy62Xq$7oMF zUaq5v$u3niBRKa2t3ACQ1ED&jg49;x&+B7TwcUJ9ohPvApi2ec=)2ATuA6-U}Q=zcoxm7Mm38^drNR!*9t z2CwzBWv;n^)vxE|@(*r!;VTN#NS2fP@t};ok2Pb)(Yhh)JUG_-~Y)Z$NnQ1 zFU?Bf-Pcsr?ea>k#StR8Hw0X@m%AeAa5OkY8#KR&y0icCy^*zH=C$NG&lizrwN)zz z$H@GJ8t<&BEAAyC#uR-(Xu##5v6J<(uPmBIIxO^h#H{6A$=!0fP8H6C`y)%nLyc7C z>L#wP>(k#qZkI2SC>Y!o$%Y=jzd_9I@!*gOTN7iY>zniJWNhFyo5LFw?Y^LgnU?|uY<{luZ3_@(o-s(OQ718l%}=o5 z?tiFAmO50L*`iS8p|~)7M5)?CX3Cu*X$tZFBXn~d-YZhPN0qdm z&0l-sqB&lBj2+8k#k%m0Zt9Zg{9|`v-7_bmYBQWNu7LeoBJ!cFl}97gORhbzl6tTu zO@Q|OqC;#<6L`u zwFt-hB?T^BlNht~VE(lmKE&+RJQuB_d?f9a|JW?vM)fW&?s2#Q3qrDh4Y~^#y}d=F zlP|G#i9aEy61YAOQ3mW8jksq~77*Y4lpV7i6%s>ewPrPNYcim!WQx@8>D)+pw#2Q4 zl8K@Ghs&g#WzXRbgWWZ3)D$W6PL&zdBQcDhv2 z6pmJ%mp`HK!jhCkuTwr|JpMvsz|6u2&hZ!MXAAeV57!}!j=D+^9-xLx%{>in$n>LF z3E>TLza4@ufoe*baUT^f#(iu7TGvUns#oKQ?ig%m;s$Osx~u*s7&k~K%433btmX|qoY zWje077)LO$w=I|g!tE;!`2}m7<6Z@jag^NPuIF9*75;kQ5-oj!5YJjy$@58(MrmeU z=*7uR*<(aeSvaYa1~jm}7vCg?Bv(&X9lsu@z{6sk;1!frqBVGY_O`!)P>3QAW}%(4 zz_?#OIy%-Xdn%^n2^03ARoPpeClsDG{LLOz$2csQmqYydXRBBelnu*c_xY6gpY>&~ zXScgB-#-%$B8{HY5zIY@Ta|m&GSlew&7m>J7;3uGR=yFG)ky!s10vY0`qtiy5{%V; zBuB-$*k3o5(obD{=6VeBg0Jr;y3b=5@L+kY6^Lr zUg>xkvWUP3^bTC_S3GX_P@ejRa**9+pDR%h2Ru4urR%bb<{!du8NRlvjk*vfDRy27 zx)(t`At)IdK{LYm`n~s4c4UZwV;9n2{7FMzUBR;=e=Y9I#0P~&Yx!2530OTJ%^Cjk z=pwczBWxx`w@Rn#NL6p!Y*@{RBIAcwr_Vl`Y@A489MvpYiqK+n$Z*K8o{r-3*zZGG zYJ6|p_4z{eaX(Q7%&4BLQ87~f)7Cjh151cidbl&<^s7@a?aO4|!J+|{XVTp*+DmJb z&gpbJ>$5c0>2U4?zI(37P$h`W@>QT9>MTQUBi&i=tBrQed`I+9#HH*bKVY{vHA4YD zn83_iO7$HJbW1u5>VrM0i|>CxY2%*)%upxPvd!oRls7~Lz>rA|Dr{2UA;*8=iSM=u Z?v>>~W=J>|vIqPpc|+!U`ZZ1W{{uP0JW2on diff --git a/Test/Snapshots/edXTests.CourseDashboardViewControllerTests/testCertificate_ios14_rtl_375x667@2x.png b/Test/Snapshots/edXTests.CourseDashboardViewControllerTests/testCertificate_ios14_rtl_375x667@2x.png index d32f2d081d90779eb385b1647b8603e624be5fee..f0f0c3f090aa9bfb1bbcf55e410f9be77b51e23f 100644 GIT binary patch literal 256937 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