From b0ae6f9325c4aa9969e4b131ca0fe3bc8100c34d Mon Sep 17 00:00:00 2001 From: David Crawshaw Date: Thu, 3 Sep 2015 10:34:24 -0400 Subject: [PATCH] example/ivy/ios: add iOS source code Change-Id: Ifabbfcfd75a92b0eb81631e3bb6eca1e4228139a Reviewed-on: https://go-review.googlesource.com/14208 Reviewed-by: Hyang-Ah Hana Kim --- example/ivy/ios/README.md | 14 + example/ivy/ios/ivy.xcodeproj/project.pbxproj | 390 ++++++++++++++++++ example/ivy/ios/ivy/AppDelegate.h | 14 + example/ivy/ios/ivy/AppDelegate.m | 40 ++ .../ivy/ios/ivy/Base.lproj/Main.storyboard | 111 +++++ example/ivy/ios/ivy/DocsController.h | 10 + example/ivy/ios/ivy/DocsController.m | 31 ++ .../AppIcon.appiconset/Contents.json | 74 ++++ .../apple-touch-icon-120x120-1.png | Bin 0 -> 12400 bytes .../apple-touch-icon-120x120.png | Bin 0 -> 12400 bytes .../apple-touch-icon-152x152.png | Bin 0 -> 20376 bytes .../apple-touch-icon-76x76.png | Bin 0 -> 6817 bytes .../AppIcon.appiconset/ivy-ios-180.png | Bin 0 -> 21589 bytes .../AppIcon.appiconset/ivy-ios-80.png | Bin 0 -> 8501 bytes example/ivy/ios/ivy/Info.plist | 46 +++ example/ivy/ios/ivy/IvyController.h | 20 + example/ivy/ios/ivy/IvyController.m | 179 ++++++++ example/ivy/ios/ivy/Launch.storyboard | 58 +++ example/ivy/ios/ivy/Suggestion.h | 21 + example/ivy/ios/ivy/Suggestion.m | 198 +++++++++ example/ivy/ios/ivy/main.m | 11 + example/ivy/ios/ivy/tape.html | 44 ++ 22 files changed, 1261 insertions(+) create mode 100644 example/ivy/ios/README.md create mode 100644 example/ivy/ios/ivy.xcodeproj/project.pbxproj create mode 100644 example/ivy/ios/ivy/AppDelegate.h create mode 100644 example/ivy/ios/ivy/AppDelegate.m create mode 100644 example/ivy/ios/ivy/Base.lproj/Main.storyboard create mode 100644 example/ivy/ios/ivy/DocsController.h create mode 100644 example/ivy/ios/ivy/DocsController.m create mode 100644 example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-120x120-1.png create mode 100644 example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-120x120.png create mode 100644 example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-152x152.png create mode 100644 example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-76x76.png create mode 100644 example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/ivy-ios-180.png create mode 100644 example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/ivy-ios-80.png create mode 100644 example/ivy/ios/ivy/Info.plist create mode 100644 example/ivy/ios/ivy/IvyController.h create mode 100644 example/ivy/ios/ivy/IvyController.m create mode 100644 example/ivy/ios/ivy/Launch.storyboard create mode 100644 example/ivy/ios/ivy/Suggestion.h create mode 100644 example/ivy/ios/ivy/Suggestion.m create mode 100644 example/ivy/ios/ivy/main.m create mode 100644 example/ivy/ios/ivy/tape.html diff --git a/example/ivy/ios/README.md b/example/ivy/ios/README.md new file mode 100644 index 0000000..02885a5 --- /dev/null +++ b/example/ivy/ios/README.md @@ -0,0 +1,14 @@ +# Ivy iOS App source + +This directory contains the source code to the Ivy iOS app. + +To build, first create the mobile.framework out of the Go +implementation of Ivy. Run: + +``` + go get robpike.io/ivy + gomobile bind -target=ios robpike.io/ivy/mobile +``` + +Place the mobile.framework directory in this directory, and +then open ivy.xcodeproj in Xcode. diff --git a/example/ivy/ios/ivy.xcodeproj/project.pbxproj b/example/ivy/ios/ivy.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8e6d974 --- /dev/null +++ b/example/ivy/ios/ivy.xcodeproj/project.pbxproj @@ -0,0 +1,390 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + B461D25D1B31B27700EC4870 /* tape.html in Resources */ = {isa = PBXBuildFile; fileRef = B461D25C1B31B27700EC4870 /* tape.html */; }; + B48878331B2E714100C7CC3C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B488780C1B2D1C3F00C7CC3C /* AppDelegate.m */; }; + B48878341B2E714100C7CC3C /* IvyController.m in Sources */ = {isa = PBXBuildFile; fileRef = B488780F1B2D1C3F00C7CC3C /* IvyController.m */; }; + B48878351B2E714100C7CC3C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B48878091B2D1C3F00C7CC3C /* main.m */; }; + B48878371B2E714100C7CC3C /* Suggestion.m in Sources */ = {isa = PBXBuildFile; fileRef = B48878311B2DF1B200C7CC3C /* Suggestion.m */; }; + B48878381B2E719000C7CC3C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B48878111B2D1C3F00C7CC3C /* Main.storyboard */; }; + B48878391B2E719000C7CC3C /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B48878141B2D1C3F00C7CC3C /* Images.xcassets */; }; + B488783D1B2F9CD500C7CC3C /* DocsController.m in Sources */ = {isa = PBXBuildFile; fileRef = B488783C1B2F9CD500C7CC3C /* DocsController.m */; }; + B4F12E871B3834120077D7AC /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B4F12E861B3834120077D7AC /* Launch.storyboard */; }; + B4FB2A9A1B9890540087EE14 /* mobile.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B4C2833A1B98889100878964 /* mobile.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + B488781E1B2D1C3F00C7CC3C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = B48877FC1B2D1C3F00C7CC3C /* Project object */; + proxyType = 1; + remoteGlobalIDString = B48878031B2D1C3F00C7CC3C; + remoteInfo = ivy; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + B461D25C1B31B27700EC4870 /* tape.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = tape.html; sourceTree = ""; }; + B48878041B2D1C3F00C7CC3C /* ivy.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ivy.app; sourceTree = BUILT_PRODUCTS_DIR; }; + B48878081B2D1C3F00C7CC3C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B48878091B2D1C3F00C7CC3C /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + B488780B1B2D1C3F00C7CC3C /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + B488780C1B2D1C3F00C7CC3C /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + B488780E1B2D1C3F00C7CC3C /* IvyController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IvyController.h; sourceTree = ""; }; + B488780F1B2D1C3F00C7CC3C /* IvyController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IvyController.m; sourceTree = ""; }; + B48878121B2D1C3F00C7CC3C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + B48878141B2D1C3F00C7CC3C /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + B48878301B2DF1B200C7CC3C /* Suggestion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Suggestion.h; sourceTree = ""; }; + B48878311B2DF1B200C7CC3C /* Suggestion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Suggestion.m; sourceTree = ""; }; + B488783B1B2F9CD500C7CC3C /* DocsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocsController.h; sourceTree = ""; }; + B488783C1B2F9CD500C7CC3C /* DocsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DocsController.m; sourceTree = ""; }; + B4C2833A1B98889100878964 /* mobile.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = mobile.framework; sourceTree = ""; }; + B4F12E861B3834120077D7AC /* Launch.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Launch.storyboard; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + B48878011B2D1C3F00C7CC3C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B4FB2A9A1B9890540087EE14 /* mobile.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B488781A1B2D1C3F00C7CC3C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + B48877FB1B2D1C3F00C7CC3C = { + isa = PBXGroup; + children = ( + B4C2833A1B98889100878964 /* mobile.framework */, + B48878061B2D1C3F00C7CC3C /* ivy */, + B48878051B2D1C3F00C7CC3C /* Products */, + ); + sourceTree = ""; + }; + B48878051B2D1C3F00C7CC3C /* Products */ = { + isa = PBXGroup; + children = ( + B48878041B2D1C3F00C7CC3C /* ivy.app */, + ); + name = Products; + sourceTree = ""; + }; + B48878061B2D1C3F00C7CC3C /* ivy */ = { + isa = PBXGroup; + children = ( + B488780B1B2D1C3F00C7CC3C /* AppDelegate.h */, + B488780C1B2D1C3F00C7CC3C /* AppDelegate.m */, + B488780E1B2D1C3F00C7CC3C /* IvyController.h */, + B488780F1B2D1C3F00C7CC3C /* IvyController.m */, + B488783B1B2F9CD500C7CC3C /* DocsController.h */, + B488783C1B2F9CD500C7CC3C /* DocsController.m */, + B48878301B2DF1B200C7CC3C /* Suggestion.h */, + B48878311B2DF1B200C7CC3C /* Suggestion.m */, + B461D25C1B31B27700EC4870 /* tape.html */, + B48878111B2D1C3F00C7CC3C /* Main.storyboard */, + B4F12E861B3834120077D7AC /* Launch.storyboard */, + B48878141B2D1C3F00C7CC3C /* Images.xcassets */, + B48878071B2D1C3F00C7CC3C /* Supporting Files */, + ); + path = ivy; + sourceTree = ""; + }; + B48878071B2D1C3F00C7CC3C /* Supporting Files */ = { + isa = PBXGroup; + children = ( + B48878081B2D1C3F00C7CC3C /* Info.plist */, + B48878091B2D1C3F00C7CC3C /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + B48878031B2D1C3F00C7CC3C /* ivy */ = { + isa = PBXNativeTarget; + buildConfigurationList = B48878271B2D1C3F00C7CC3C /* Build configuration list for PBXNativeTarget "ivy" */; + buildPhases = ( + B48878001B2D1C3F00C7CC3C /* Sources */, + B48878011B2D1C3F00C7CC3C /* Frameworks */, + B48878021B2D1C3F00C7CC3C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ivy; + productName = ivy; + productReference = B48878041B2D1C3F00C7CC3C /* ivy.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + B48877FC1B2D1C3F00C7CC3C /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0640; + ORGANIZATIONNAME = "The Go Authors"; + TargetAttributes = { + B48878031B2D1C3F00C7CC3C = { + CreatedOnToolsVersion = 6.1.1; + DevelopmentTeam = YE84DJ86AZ; + }; + B488781C1B2D1C3F00C7CC3C = { + CreatedOnToolsVersion = 6.1.1; + TestTargetID = B48878031B2D1C3F00C7CC3C; + }; + }; + }; + buildConfigurationList = B48877FF1B2D1C3F00C7CC3C /* Build configuration list for PBXProject "ivy" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = B48877FB1B2D1C3F00C7CC3C; + productRefGroup = B48878051B2D1C3F00C7CC3C /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + B48878031B2D1C3F00C7CC3C /* ivy */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + B48878021B2D1C3F00C7CC3C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B48878381B2E719000C7CC3C /* Main.storyboard in Resources */, + B4F12E871B3834120077D7AC /* Launch.storyboard in Resources */, + B48878391B2E719000C7CC3C /* Images.xcassets in Resources */, + B461D25D1B31B27700EC4870 /* tape.html in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B488781B1B2D1C3F00C7CC3C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + B48878001B2D1C3F00C7CC3C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B48878331B2E714100C7CC3C /* AppDelegate.m in Sources */, + B488783D1B2F9CD500C7CC3C /* DocsController.m in Sources */, + B48878341B2E714100C7CC3C /* IvyController.m in Sources */, + B48878351B2E714100C7CC3C /* main.m in Sources */, + B48878371B2E714100C7CC3C /* Suggestion.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B48878191B2D1C3F00C7CC3C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + B488781F1B2D1C3F00C7CC3C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B48878031B2D1C3F00C7CC3C /* ivy */; + targetProxy = B488781E1B2D1C3F00C7CC3C /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + B48878111B2D1C3F00C7CC3C /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + B48878121B2D1C3F00C7CC3C /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + B48878251B2D1C3F00C7CC3C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = arm64; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALID_ARCHS = "arm64 x86_64 armv7"; + }; + name = Debug; + }; + B48878261B2D1C3F00C7CC3C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VALID_ARCHS = "arm64 x86_64 armv7"; + }; + name = Release; + }; + B48878281B2D1C3F00C7CC3C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + INFOPLIST_FILE = ivy/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + ONLY_ACTIVE_ARCH = NO; + PRODUCT_NAME = ivy; + STRIP_STYLE = debugging; + TARGETED_DEVICE_FAMILY = "1,2"; + VALID_ARCHS = "arm64 armv7"; + }; + name = Debug; + }; + B48878291B2D1C3F00C7CC3C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + INFOPLIST_FILE = ivy/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + ONLY_ACTIVE_ARCH = NO; + PRODUCT_NAME = ivy; + STRIP_STYLE = debugging; + TARGETED_DEVICE_FAMILY = "1,2"; + VALID_ARCHS = "arm64 armv7"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + B48877FF1B2D1C3F00C7CC3C /* Build configuration list for PBXProject "ivy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B48878251B2D1C3F00C7CC3C /* Debug */, + B48878261B2D1C3F00C7CC3C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B48878271B2D1C3F00C7CC3C /* Build configuration list for PBXNativeTarget "ivy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B48878281B2D1C3F00C7CC3C /* Debug */, + B48878291B2D1C3F00C7CC3C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = B48877FC1B2D1C3F00C7CC3C /* Project object */; +} diff --git a/example/ivy/ios/ivy/AppDelegate.h b/example/ivy/ios/ivy/AppDelegate.h new file mode 100644 index 0000000..0585c7d --- /dev/null +++ b/example/ivy/ios/ivy/AppDelegate.h @@ -0,0 +1,14 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#import +#import "Suggestion.h" +#import "IvyController.h" + +@interface AppDelegate + : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/example/ivy/ios/ivy/AppDelegate.m b/example/ivy/ios/ivy/AppDelegate.m new file mode 100644 index 0000000..41221c6 --- /dev/null +++ b/example/ivy/ios/ivy/AppDelegate.m @@ -0,0 +1,40 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#import "AppDelegate.h" +#import "IvyController.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application +{ +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ +} + +- (void)applicationWillEnterForeground:(UIApplication *)application +{ +} + +- (void)applicationDidBecomeActive:(UIApplication *)application +{ +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ +} + +@end diff --git a/example/ivy/ios/ivy/Base.lproj/Main.storyboard b/example/ivy/ios/ivy/Base.lproj/Main.storyboard new file mode 100644 index 0000000..b773a75 --- /dev/null +++ b/example/ivy/ios/ivy/Base.lproj/Main.storyboard @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ivy/ios/ivy/DocsController.h b/example/ivy/ios/ivy/DocsController.h new file mode 100644 index 0000000..c29682e --- /dev/null +++ b/example/ivy/ios/ivy/DocsController.h @@ -0,0 +1,10 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#import + +// DocsController displays the documentation page. +@interface DocsController : UIViewController + +@end diff --git a/example/ivy/ios/ivy/DocsController.m b/example/ivy/ios/ivy/DocsController.m new file mode 100644 index 0000000..49525ad --- /dev/null +++ b/example/ivy/ios/ivy/DocsController.m @@ -0,0 +1,31 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#import "DocsController.h" +#import "mobile/Mobile.h" + +@interface DocsController () + +@end + +@implementation DocsController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + UIWebView *webView = (UIWebView *)[self.view viewWithTag:11]; + NSString *helpHTML = GoMobileHelp(); + [webView loadHTMLString:helpHTML baseURL:NULL]; + if ([self respondsToSelector:@selector( + setAutomaticallyAdjustsScrollViewInsets:)]) { + self.automaticallyAdjustsScrollViewInsets = NO; + } +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; +} + +@end diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/Contents.json b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..295161a --- /dev/null +++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,74 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "ivy-ios-80.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "apple-touch-icon-120x120-1.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "apple-touch-icon-120x120.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "ivy-ios-180.png", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "apple-touch-icon-76x76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "apple-touch-icon-152x152.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-120x120-1.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-120x120-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f3db5c38a6cc694958f452e839ec6baf05ceb72f GIT binary patch literal 12400 zcmV-$FptlPP)#R9S_sB2wibp=ro3yK945m2Nk zNE7KuqzFg}J%kX_Cz*17e@rsDcjnH_O$h3KU%&f$-Av{)=REh^^PKXW=XuU^MDI;` z5(xj@n?R1-5u&kRDRP(t_L;GhmB zbm-_|7)&Rs$_;hi5ZL9UC#p!h2Gg0Pl-f*Er)5yh)~3#@Zsop(HG=8=ekt@s4VSMv zn7sVy%$}hy7}tz<*r3DOrCxe3Qd3t=)BC*|hyl#(_luCmD@FW)FDL#-u$mfzt4Yr+ zy}hFRAE_FzWW}e7tLjRZ!oLUT_A)g+A8tvV63bA%OjbTyLtkfZkUFi=5Bojnsp<=# zdXPTzgVdQbs!7l6U%@hnc&68_WPrSZnsTtFD1)Sv0n&;f&kQ9%$jeACl%NvoU4_A6 zGdMl7c7-AlYhNcicGk{PPxw4>A=ed=?d4APrkxnFR+C?*u96~LB}GU_8Pe@Sn9K-^1(PiTB|HMf8s?)+G1jj` zrxVpoXA}!e&#bGKEdLBR{7Qpjy7X64$?B-+jHnjflG3ab6d&DBN#;T9Cy!vx&nD60 zAkpd~KEgt5bU2Zb;n-|eOeO_~(}knVL2R!`rOO8%)e}x zGe4JtU$#)NXDiCdUuhaqO6$gTXw$k0En1}0v`HFCN%1I(QuVr)61%;W%*-sh+5GsfV8JzKCZc!id6k^+a|P)Qh;cD+gLcO#bgq|44wcUdX< z8Jo!4x`wE;`{`0IoZdY<(4$9tTDD9Nz{pS{VAZee^SS)EaTh_3e&xZAp1>9NwN z7RW+1UP#Z-7yI4>mdt;VsHg~}l$4b@SiO1+AAP!!SU4$9=W|YW9}M?#bPecS}r3?Z3AsPU=p!UFAPA>9}`^- z^x)&Oo@Cji-n4JuTzAgM%skD1UYp0FgQX%m>u=1PAph?eIC&)h`DikAcaUeTgYoH)zV&%MK{ z+;~#P{u6VYQGq~GkgCE>EO(QH)x-|nO9$$K%?|}y7bQHTx9d6-3-3rDh)n*%v27Ic?ZQ7 zZm2YhEMHAYk06Try9blhi}VZ`o?HFD=cXJ>ORLNK?>xnlDgB9@buVYXdKb6LrJ<+3 z9fkRvT{xSIQ-^c&g>TtB^G=q1Ih{LhA4GI?gwHdC-*b)L7{qFdUQ|>B_y6r?cCLJl zsV(v-cxnXa*L+36{+*nkHi}pJMzMIoziHg4zAn9u8+UQ*O^*@o4ClhJ{PG#p^INII ziB!z0derhu`tVR(@k36)hAad~mz%n8+{U8$|E|=ZxFw%2SV5hXMEYKJg>Ea7QZo0$ zB|Q7l24coOO?cxrmBZ7?Bb-|_o3>>~_}kdQ3>w%6lSxrEKAl$SH>dvzx~jpetjt0G zYsb^LNgDr|{s;;2F#*%Q|Nd93T(*gqo|s5@xJS^6N{S#V(bHqE8aj!x$38dwY_skH zxIz~r1t<#nrR9Q!kl>bF$jqZl^R_(q+B`gqmX?ZiiclCkb{K;PUB$zb zUt!(4=EV0JM9#uDxh~boLsM^~b?YYO!h}jlkh0Q5ErmwoEd{{^Af!J%Jv-j zh2n}eIU(C)-m|x|Z^cUpAt=fzq2OF`c>{n2i&wCH|6bmi{gkd~UvVw{dM&TM_7QVG zc#eh*Qfffh`M+~H98T_k;CXD=7%})-%_!(}xrmF2qRTa{*tTsCBj4Re%IHbPd$3e% zvi$1P(-JO5CUfTOdFm!7VlOB|O6fJK-8}3%((2V^)Tl@J@Wbb*RVz-nW!*6NDuxX1 z>zN;<^b^oRje~lr{;Wb)Rfq4fcTeN$E?wwVT9Y zaB+QmuqYpDHTns(x{BB<`tkLGe{kz9*OOYWHnn2>Rb}m3HKALl){Gr9jkjk%Ns}gN zL7KYMf0OET3BPogsJW_XdI7bPZtfcMBsUGbj$U0mYDP6*qp2;*$`5O|aPEx+}wPu5f+bF?;XV}mkIUj*5S2hCUf6kpX0!RW2zdf zTwZA~bTAPF6O|Y`=?Iq2C{`o%)b*mR`3kJGtc=kkZ=iSAj+M`?STd>VMNtH{NDKdc z^9yPX8Xa)Ssa@Ju{;z}{qC8C@vfnMt{cs7kD2tb|6@@{??AnP5y#BApc;NmQ$U2*& za)1%u;kZ1j7OP@9p_5MhS<-3hMYYCNVUZExTsO2ACacM-npAh13d|O5Wy`i-*kNgk zIkuJ$EA@G$>CGL#%a(y{aVp;d>7wxIk?dYMor2TFI7^(`-4L2#SCCtrPrc@~eN=GO zcd679#{OWB)EdED4mTH$=i@GO`M7?0dU|~QXa?RgnG54*V~$PKnKndFc|malZX}hT z>KiXEg+kd?cks@fFA0yaA%$mkDn+Hgl@tPrz+_cu)}aB>(UCqHA9OTB#xQg-@js85 zttM(Uh{0qtd+M{|7GSoS_+rU-9BR}bCAO9hU+}@C->p|_Bs7f0WKlE%i_j5b zyz`byIMKx_dM^R;8hr*TdKgG|DfEQzdk_*6CP6}443P<8<#Vrvzfb-*w$V=^O=cZ_ z2tzzmDiwi3$G6Z&sstihbY@9TEjI7Y&7wgIQoC6^a~Ceb;c!s2XN$@iGVqF9>bTT`KtW1Gd3P3m z-CzH%Gv;w7y!aUovjfE}h)fJ8u3j`k!8`0A@f(WtFsa7S!BkT~l`$?M@1@W)k`DcJ z0DJcxX3w7ASh{#74fij@m46}RkSx6X(+<<3&B|16Wy^gWTMF91dsA2{+WRuymQ}2_aBS3Q|gXUD=WLMSE}-T=1J=rTVjCB=Gso ztlifTYCCylI_LT?n78x=BBR2+YgF%wOzkh_v%y2{tbH~sho65wz|Xr6knzhQ_Ut{( z(PO7@I$fAd3XL1pqhH@H+f~V3k+f zqRonP(r8G7il58QWYT-%i_Cs&s^MWLzo3YnJNL77`(Czh-^Y%f`#E*`oZ`(PiOjH(~bW9x{;7j>G?73sW(}WaueZA+gGiut(KpamFh^T(*3HswI*1K zApiN>`EAvUn9Y@*eaBCnW!?H6tlO}I4I6innR!OzROc68Lk|n!kf%=9sbfplt)Am` zFa0C07hnE>Xa4oJ{(JboU!eC5fSb)GdiH3~&>OB|=#Z<)K9|GwuWhCFT~mTLQ=gt} zR&R0^-YHk=7X)zSU!ZrI4Tr0l)_{y13q1Z!>dj6n|EAvqt5dH(`FVv^AC4~pGsPqjH*`F4gT^AP z;pOY13hhdTgjN6B3>hl2Hsk@lj{en4h3x88CKqwl|p(do&2)r5XX<7B{w%8yS3}zq@;usCr+?^ z#}3x5Ur$L%N$5JRRhQcLy+}motAh_zExtJul)(k-7LoPlW8f$=)Y{s%ZOcb<=hC`$ z>!1%lcI+4f1`g!t(WAy%ug|q(>u0oTnI2dWJb#f_U;Bs;<}TqvZoX&VkV>_x_Y8?= zpO7M8z_mSj{PA&g?b1efbkEAZK!ZjDtJDjdHE+(_Z@x*dE3XW^+Q`pm=B!yf|H2D6 z9gd*%to56b_WF0h8QlDvvjLY$?lL=>z zDg6wK5vi%EY}>qqaXbnMWa`1lxIz4r4j%;B!FQ^_kV(XJ_j z(9^>NAQXi;?|;SkzdqyltjNf4l9Lk+(|c_4WD*k-b?e6Ea&hqBLC&5%>&5Q4{dT%{ z>lU=kWycTTE-gl*jr8HCqE&8bw?SBv8)8nXryU}EdqX+))*EjS8|&#&n>KBtXV0F* z$H&vRZ(n}?`Dd-sn@TH8T3VV<*h1m|9G_>7A2&kRH|pb$zu}o@XCq7|jlL!&C51O; z&Sb&-`Bm=8ipj*M^H;F+>$QIVSG}+77~JzsC6nAdYLt#?5sn-=Li_gZY2Lg!si~<< zm@vVst{gICNWeM(DB8T7{O{+hcqe@nnG&Tk_LK07dnGJZq}!=q;VP_a*REWB_0j${{d)TM?@xAiwuZ44FL~j@g^-O${k?75rrdGcKtHo$c6JUA zJu=Ba?XYvJ_ijP=pA|%E?h`qVWH+_E?l_4(xprNh9-y8$(F5KjSbOK5*}{jy?36% zY&QE1%`;|xMnO?Y`C495r%oMKtysaoUwVni$jI{d!tk@yw*Yo$93ms*pys*P{iP>u z+cXK8-(s=oPEl^Ro6Vay`}NFCn>K08i@LYTLh=(I5Zn^ozdufI{<1eNt3a?Fn6vdY82 zh9^!0rt5NWaq(=VTl#x)XxwIl_+*8*>qX4qd-Mee)qUj15pU}mF=7N^VcI=PF)=aR zaKjB60mJ2T@%#%f80$eoFypn!jJWX{9Y+B;e*7$%C(f!A?~>soM{@7@@yvPmU4GoO ziL9(F3X6&i3q^jI5NzAN*UuT@%AW0cY|_}EdF>@7y!XKeUW2|m|Ld>6?v-5tuDa?f z#*X#S`|-yggO<NgxIg_3}duo;-ug{plq{ki$smZcfExbMJ32wjjdap*w8Z`9tQ53Syouf&!W|Z3P0gW)W7FUq`ug_I= z=D$@$#oz!7?`7|k`{A=8rOgpH-pD8O=6St4Dtf6}i&b&0`QZl!4;g~PcOma{)v6W8 zryo7fRed@KO}BW-8g9DvF_g>fS&~#Mh7-qD>1+EOPVOH63|}k^taylxjpf4+K49SW z*L#^Ognl@PvG?4=C!c;AP(qIxbPusNO+*Qc4896b4|V>ZVBfdd&@lStmtS(n=+P7w z7J7#wlgZ>K0DQZAIX8|RiKDD6D8268+Vazex%BDXNykqMjgOaC31MIjU1dylI~}fo zzGW7(nYr&i!^8=o0h_;IB@a&g zH$_DyLG|_54H&?Hzx;)!O`70xyUEDNVD3jBap1rKL*x88y-5G+WJqOO z(V7KZ{NyFvg?WZ6BP=|ewr$!F6BEPPtSt8L-;X?lOiFY-NmJg#+N2{Pg0P5k z0j&H}3YAl}=QF(fAe6Y;+KJwGf$xLa?RK_p-_GjQtJ%9}kB7Mdlo^Rh@w_o(3hP$S zpEqq*t$wn&;}3rJ}q|o2IdD^&Fm_ zb|1DdTg{e9F_G}Vf3P&^pj{eCAIEqJih4JkcV7_d9d&~IMQ`9d^_xFKeVMCQut2Iu zA&7_!=h25pvuD>AjJta{CX>m}v0S~KG~kXt0e6iaf~*+&gFLf3m;}rwh1+i%6nb}| zYMpGcn3*zpEL%6tqhG(SHC7&^o1E9~r*z-eN?v()FsgP!3V~w8C{T86Z?!Z)f$sRY zXdZp&PWESf$+J)2Pi$;dNC){)*v&T$pn21@;M$*R-qP)6>J#_Uph4Ygm9JUTG?p!y z!QwAp<%-U&LJD(+%2aB{{`1<9yb}$+JRx;IkNb#uK`nj3%I z#q2qY_(=S-O@xMnCRh@+Al{60n*To_}@%6CS)Zv_Drhe7r7R zEa2;9>-l=wde*MnPCB#3^^k6_DJiw- z)29>HT-}vxujxjeI<=?>aC*rBKn?m!ZQ1e*WAB;9Z%0ld6s2;jYX}Bc7$XFdVMDLx z*?&Dq(Q#9%;9jd>*rtDvULx;e*Trc`;Ktvx8oG6ms;iNlb-nk zYtv4l4=|Gz3^s6OKRF!7kzcf$oy0g=wroWEcFpMAsU_XIwxMBzlo}ZxFZC)dEo1J7 zOL=F`LVnrvn`WDr`STY!eI}cnoIDB& zikLa;GkzQMK8nGZ(W1e^<1*N+SMll0K854W3Cx>*FG-2<)URKMxY%f~^eBUdToCwg zT>-uAESH1cvCPwK-kia~gU2{`E*GcMiN#_eJ|TwGl-e|J)_@KjS`Z%>V~C#NDJtZ9 zP-S{|j(w7i17Af63)huad^@yR28gMp{$B#7#8mQQlIeYAM?e20?>aRorWYa0H=PKY zTAyAp%=4MvFtvRC4=uDAp=V48lm_cXx9Z4wzDp&}W z8XHq$3MWox`7umy&h_<|G8+HND8`=}BV?Sc;1~hZ*ew5OpmK=zp7$fQ z#t`*WObK;4c`{2A#!xft2!q3&FgVQquclKw76z)9YGNhMO5Zunkw_9<%xu`P7ckYT z%c)a`G-3Dr#)m*-wls3^l+>Z;D^RKFp|i;MdA`KJg0+U}UB+{4id|3@o+&sllXeyN*1J)QY2sh`nAEBqC#$+~twasS$r6_*PL>g@ZgL_{dkIzHnWA=?4t66Y zVcWjqw%Z13C1tcPrpEq%oUE$H$qJUPRjbC_Kd=?0dw;?x-xQk879(dqZoU7-B;8&$N(kxMV_XQDz zi`FmV=EtwY;qXMjF`3joR|e5Pi;$WueXY5kG+R|oR&_LOHAS!HFm*#rh>xXzJ;}z4 z*_dK$hcL^P_h8`_u6%CqPBkYDFYc#d!}^q#I&nB$I2~?WE`I~_p+lMM-TRw&tBC)$ z3XJu9-*jABys9l*exanq9yHy~UHf_GorN_L@2lo9Pn39<%gwMMeJROi- zS3X!~<{5flbr)8vl@9Hj)3jLwY9}RNvsoxAF5%?KEOzeL&(UM2Xwf2_yUX2&svKiW z9Zmsl{40&IAqb|4lZ8KX9S#>gx_3mp@gKPMj*tdwvovs6amm(|bh)hqdHE$c!(D_q zEx2qJtZs?LY{Fz#*qw2J>92mog3n$iA|l*JvQ!Osmx2Y-9)-XfHb`ObFJG~8)h2fC z+|Q9CC)u`j4`pQz!Xs?dO-^Fy(5t!j+8$ifuPbJ==@OsoV>A)MfAG}7F6I>w7Z>Ag z;Cjq0Ep;MLXctw&p|VnhHB5(hcq1d3z2Bto$LI-E#{jc})% zFqa#f)y%o<9Hu?>1`9rWh4ApO@?&>G9hVdML=K~7w%{g2ZMr5+(mV%+7@#LrTDR(z zrFz)Eo}Eqe<_#Ht@5q46wU?ApTwF%`mg(&K?Psj5x(79EDV`{$mBEAso~We)PXtrv z$%CXtTR4_^h7aa0Bs)8w3%P~l=ND60VCTYx0wzB65^ulxByn-kK_awcKw~6yv{u@s zOyDT+1c?k^9jvD5g~t9f{ZS4bI?nqad=-?r1%-ARH)%xafoumHhL3D!R)R z)$mZV>jx}mD{stvmm^0`aQMhcCQW{k^En0N<`psR>6twG$Y>fiObsC@5OBGpyHrvO zSy1y)+W&;XNC95{_e1>nDg7f4-;vSxZE9W#nZrMT6@W+X;S;^RafW3S6@WkWyYBVtw&ev*fl)iI# zH8AnNf%$8r*rXQA;raI%==_1Uw*ZUgoIiwUi>Y)cJ3ugI&kNn z)$mMcj`j$p$ue6=dU_$k8iw=qVJvq&hbgHZ4!fOC7O%u%vU>L9)`+I4D$(MrMlbYT z)AXtu_1^zZO{vXelg9GQzuu&v&`v~T6mPyYk27a;NUm3(#XoGJxVQwz@%=%yT1qfY zrcg|nlhUwftS9d7=LzrBA7@r3nVFe52Tx=>>FmxpSVe)wXE%n98IFL0S0Dk10GLs; zUQN?8Di{X3J!$&)?@q&pwfSb*T4G{iaW?M4ho3DbDLxK&_u(ANJdWeUA;12s{xqbE zjvh3g$UY-Mf-5VNh+e}9?{Xbc1IF<3tMiNI)8O|!M`N$j1|0EsCv zmF4GR$oS>Z|M$tdOg>phkDekktUe!owv>pXY@+@$n!?&muxD%_X5>TI+V;lpxI0AZB^;*@;Vvy9tlOXfd=t14Dn*A>EtYk^>tm+4+H8&P%KZ7u4GdwS zuOierEI(r0jQhj1?pNcCtD+G@uB4zF& zNuXtv5x;B+xShD)9M9H;Q%OllGT^{%WG7*D(gnkeyhu&byYy`zaz_*L0V=^g0JQIyzMxDw3@A_nY z{`pEaSlbbqn2MK2k@2dClogK?+PPO~F-0KCb+z%fqiPC-VAxRrRjNi_n-Nv_sT}YBTj$w0sOKCrxch|n}SlcU~h`CxknnrJmYZm z9nWyz>}||nu)?5&c`&o02=Kio&3pXe=0bpp55G*k#AG^mXvLZhTREC}im1p4KAbj= z`(ln@nK2ss&hK=5*8?5-4yNd#4?Z2(mm@GHf~6AzYlnU;`sj0F3Quvx6|I9vXn}gG zf$RUm8Sj8wN+v$^GB#{ncg>aL7Z&l z*{xEV4%UM!c<)xV1GfRp9U`3+3Q>1F&Esndne^CexLj`S4n`e;N`nzxdn9z?RsC5o zq1ikp{A3F?X1A9ycI;GQtWgZQwl`8rUYYp;7cS<}s9`;Z555Kvsr#?5Ft%s?pM7gh*HMdwADD?CkmvdJKJ>b?bKo)MR;FR9rre@t2~Fk~OT|3ZA#j z;V}G+B};!`*szJ*dE*UqYTpv4)5U+@{E)@pu0c^0ru^d`8Z}5oBKcy;Dt_GhGghmG zDgU?!lgUJ6WH`kqf1`NyCj{eRh`mWNC`O2M>gnHHuQ|nI-eBnSt9f+Ns}vO#`w3Jp zzVt3zw)~1ucUC?y<_8;cPTc&W=M@Km3j>l{^kylX2KcD?C%fH`< z$)xbu-|wbRkIsN#)3)8rnfE0C6UN;}dV^F?B%$pY6cv|Hyy1(WL$s*#?*1B3y;Lo5 zRN4N`#I1jae@(c7n{OK63AbP7V8p10`FhFBfO+lqGOSj!$I0LixJpV&vDvHv1ESgO zrHmN$Fw4H4<@ei9Kka75o1e2HE1K|ue?_U4g6sS#;^s{x@9ZhEb8?A@2xICa_tB+O zYmkC1J2H6Y<+mtvI2bmt9}kYZ)mt@x|L05WJ8+of+KD(PeuAlXnr@j)(Kk$Zy7Elg za!p8imk}EMv}&`IG>Cy$v!YfAm=o*a=rEAQ-|b}48*fr8+Q#7{C#h4X7FS%+CO`~M z&w*E&nWt&lypcvZAat}$mjnCvEANw#5JPgEM1MDA={Yg<;K58HBf?2dtJ;mC%zhyYx#+SI%Mo*11UOMoQo9s2=CER;?Pba^)t54ejS6 zm7*i5);xCcVgb?7k(KkQW=pka-X1>e8XkD?dF)|v{AQ|8Sm(cBz3Z<;dq*AVJxHX& zz8-VOQ*_DONd44gB$7p6f6rSVe2$co0ay3rkq5?<>-XVI)_G>U4D1K6hixqDur;kEP}Q*jEH`>)8NE95)*6TaJY089{{xy;<#`jPZeRtsHVv15;ZtI zx7&?CsCHMPIwD6R-I69v8gSYbjdS!n#HgPl1BW1r=sl7ZEAp^@x|kAsDT}`O9)M9p z|HAmYMtMCubMx}~=d-U1 zU{XA1CMk;G{P{e7I2XZ>?;gdSw-r}mF6Oc#!f+5_fp8Pp%wSa{W&tL}Q+AW0js5I$ zgHwXTEhu$?-3cX5D0V573M+&~p+v@_M8~5<*TNLr8dE|)?5*o^^yq0CHmvVurpx8V z>2l+8x^X()IGipTHLSvHG}qsl{~D8Fc7yWgo{a8*%)^d2BWdHmez{)q>UP z*`{i-n6X$)Y~8j8OTD4m?A37^sU~J^(3#yd4dv5WbWOLzSKAX1gV&0}B zMBY22a>e6A&s-q^3R$^@M3*o6YKBxXpsqV&=Oo2e91RQsuxPwaYmltn!%>b+9mBOkj*2CMyRc zTkyl$?KEgmAG_Vd(Bcw1xw-ii7nQJi^EMhaYJ|H0@3s_ekTRWE%~FTUW-Czx?<2C` z?UZa=&gui3+417X02H}Rltv|DYuS^qzfA_ktZFk_dLm`^UPIAlFBJ>cL2_TZnFPm0 zvg|OdZ#R}NU%|L>W5_SaCp_Fn<3)lrk^&G-Y}hQznvgKI4Ek~hqybR(ew=iE>ybmicXU-OwX)da;VxX z+V=0yy2^uALt$FuxgO?py2xui0GrFnS6_XMsZmFkF8!7Z1x3_NO5kE{A*RDhD`>uMU_`p=^3FhcKHCA#b_XP^wmmm+E6EtLdv4*1==*v^MU9rG87y^;%%6lTJk6 zTe0t6gSA;#ER8z`=ykt8rbH(Y-s>iW*+O`a;ka_oVycx&%uQ1;B{e_^kHlJj&Xm;2 z|9fJh?%R93qK9Yys*f5Xi0JJ32$c>Uaa)^Cdq`tB<|sv2tT;{{!kp3=p_o(>nom$` z^{Jc{Zlk(x%sw;KCD3yhO~V)W3mcLVehkp zym?jBFI7oX)AXp}wAH1j=FY@#}v&OlZsf z2V!PF=K7e-Q0;)LDyEJHrI8G40Mkqle@aaF*}?w^%pCXx4h)?RCW54s(q{!NRDzuJ z!SvFFaOm?>l^LDc0=`#G(hD@#RCDI7COxx9fUFFD=816QV-FQR0*N|}S2L!66sn(E zLLDtfXt9b`=!*q>CAEa^8+lGIuNw2|eKko>+pUdh3=ADwQw@6lLY9wAtqzYAP{_iV z@Z=Za-A8=&K3fk9DV+F^Lb`c>2YQz(Al2l7KZ?d@*C$wtrqNVE$P#)&)}>;?7xNc( i{xq0S3p@Ow*#84Cambl4S(rrt0000#R9S_sB2wibp=ro3yK945m2Nk zNE7KuqzFg}J%kX_Cz*17e@rsDcjnH_O$h3KU%&f$-Av{)=REh^^PKXW=XuU^MDI;` z5(xj@n?R1-5u&kRDRP(t_L;GhmB zbm-_|7)&Rs$_;hi5ZL9UC#p!h2Gg0Pl-f*Er)5yh)~3#@Zsop(HG=8=ekt@s4VSMv zn7sVy%$}hy7}tz<*r3DOrCxe3Qd3t=)BC*|hyl#(_luCmD@FW)FDL#-u$mfzt4Yr+ zy}hFRAE_FzWW}e7tLjRZ!oLUT_A)g+A8tvV63bA%OjbTyLtkfZkUFi=5Bojnsp<=# zdXPTzgVdQbs!7l6U%@hnc&68_WPrSZnsTtFD1)Sv0n&;f&kQ9%$jeACl%NvoU4_A6 zGdMl7c7-AlYhNcicGk{PPxw4>A=ed=?d4APrkxnFR+C?*u96~LB}GU_8Pe@Sn9K-^1(PiTB|HMf8s?)+G1jj` zrxVpoXA}!e&#bGKEdLBR{7Qpjy7X64$?B-+jHnjflG3ab6d&DBN#;T9Cy!vx&nD60 zAkpd~KEgt5bU2Zb;n-|eOeO_~(}knVL2R!`rOO8%)e}x zGe4JtU$#)NXDiCdUuhaqO6$gTXw$k0En1}0v`HFCN%1I(QuVr)61%;W%*-sh+5GsfV8JzKCZc!id6k^+a|P)Qh;cD+gLcO#bgq|44wcUdX< z8Jo!4x`wE;`{`0IoZdY<(4$9tTDD9Nz{pS{VAZee^SS)EaTh_3e&xZAp1>9NwN z7RW+1UP#Z-7yI4>mdt;VsHg~}l$4b@SiO1+AAP!!SU4$9=W|YW9}M?#bPecS}r3?Z3AsPU=p!UFAPA>9}`^- z^x)&Oo@Cji-n4JuTzAgM%skD1UYp0FgQX%m>u=1PAph?eIC&)h`DikAcaUeTgYoH)zV&%MK{ z+;~#P{u6VYQGq~GkgCE>EO(QH)x-|nO9$$K%?|}y7bQHTx9d6-3-3rDh)n*%v27Ic?ZQ7 zZm2YhEMHAYk06Try9blhi}VZ`o?HFD=cXJ>ORLNK?>xnlDgB9@buVYXdKb6LrJ<+3 z9fkRvT{xSIQ-^c&g>TtB^G=q1Ih{LhA4GI?gwHdC-*b)L7{qFdUQ|>B_y6r?cCLJl zsV(v-cxnXa*L+36{+*nkHi}pJMzMIoziHg4zAn9u8+UQ*O^*@o4ClhJ{PG#p^INII ziB!z0derhu`tVR(@k36)hAad~mz%n8+{U8$|E|=ZxFw%2SV5hXMEYKJg>Ea7QZo0$ zB|Q7l24coOO?cxrmBZ7?Bb-|_o3>>~_}kdQ3>w%6lSxrEKAl$SH>dvzx~jpetjt0G zYsb^LNgDr|{s;;2F#*%Q|Nd93T(*gqo|s5@xJS^6N{S#V(bHqE8aj!x$38dwY_skH zxIz~r1t<#nrR9Q!kl>bF$jqZl^R_(q+B`gqmX?ZiiclCkb{K;PUB$zb zUt!(4=EV0JM9#uDxh~boLsM^~b?YYO!h}jlkh0Q5ErmwoEd{{^Af!J%Jv-j zh2n}eIU(C)-m|x|Z^cUpAt=fzq2OF`c>{n2i&wCH|6bmi{gkd~UvVw{dM&TM_7QVG zc#eh*Qfffh`M+~H98T_k;CXD=7%})-%_!(}xrmF2qRTa{*tTsCBj4Re%IHbPd$3e% zvi$1P(-JO5CUfTOdFm!7VlOB|O6fJK-8}3%((2V^)Tl@J@Wbb*RVz-nW!*6NDuxX1 z>zN;<^b^oRje~lr{;Wb)Rfq4fcTeN$E?wwVT9Y zaB+QmuqYpDHTns(x{BB<`tkLGe{kz9*OOYWHnn2>Rb}m3HKALl){Gr9jkjk%Ns}gN zL7KYMf0OET3BPogsJW_XdI7bPZtfcMBsUGbj$U0mYDP6*qp2;*$`5O|aPEx+}wPu5f+bF?;XV}mkIUj*5S2hCUf6kpX0!RW2zdf zTwZA~bTAPF6O|Y`=?Iq2C{`o%)b*mR`3kJGtc=kkZ=iSAj+M`?STd>VMNtH{NDKdc z^9yPX8Xa)Ssa@Ju{;z}{qC8C@vfnMt{cs7kD2tb|6@@{??AnP5y#BApc;NmQ$U2*& za)1%u;kZ1j7OP@9p_5MhS<-3hMYYCNVUZExTsO2ACacM-npAh13d|O5Wy`i-*kNgk zIkuJ$EA@G$>CGL#%a(y{aVp;d>7wxIk?dYMor2TFI7^(`-4L2#SCCtrPrc@~eN=GO zcd679#{OWB)EdED4mTH$=i@GO`M7?0dU|~QXa?RgnG54*V~$PKnKndFc|malZX}hT z>KiXEg+kd?cks@fFA0yaA%$mkDn+Hgl@tPrz+_cu)}aB>(UCqHA9OTB#xQg-@js85 zttM(Uh{0qtd+M{|7GSoS_+rU-9BR}bCAO9hU+}@C->p|_Bs7f0WKlE%i_j5b zyz`byIMKx_dM^R;8hr*TdKgG|DfEQzdk_*6CP6}443P<8<#Vrvzfb-*w$V=^O=cZ_ z2tzzmDiwi3$G6Z&sstihbY@9TEjI7Y&7wgIQoC6^a~Ceb;c!s2XN$@iGVqF9>bTT`KtW1Gd3P3m z-CzH%Gv;w7y!aUovjfE}h)fJ8u3j`k!8`0A@f(WtFsa7S!BkT~l`$?M@1@W)k`DcJ z0DJcxX3w7ASh{#74fij@m46}RkSx6X(+<<3&B|16Wy^gWTMF91dsA2{+WRuymQ}2_aBS3Q|gXUD=WLMSE}-T=1J=rTVjCB=Gso ztlifTYCCylI_LT?n78x=BBR2+YgF%wOzkh_v%y2{tbH~sho65wz|Xr6knzhQ_Ut{( z(PO7@I$fAd3XL1pqhH@H+f~V3k+f zqRonP(r8G7il58QWYT-%i_Cs&s^MWLzo3YnJNL77`(Czh-^Y%f`#E*`oZ`(PiOjH(~bW9x{;7j>G?73sW(}WaueZA+gGiut(KpamFh^T(*3HswI*1K zApiN>`EAvUn9Y@*eaBCnW!?H6tlO}I4I6innR!OzROc68Lk|n!kf%=9sbfplt)Am` zFa0C07hnE>Xa4oJ{(JboU!eC5fSb)GdiH3~&>OB|=#Z<)K9|GwuWhCFT~mTLQ=gt} zR&R0^-YHk=7X)zSU!ZrI4Tr0l)_{y13q1Z!>dj6n|EAvqt5dH(`FVv^AC4~pGsPqjH*`F4gT^AP z;pOY13hhdTgjN6B3>hl2Hsk@lj{en4h3x88CKqwl|p(do&2)r5XX<7B{w%8yS3}zq@;usCr+?^ z#}3x5Ur$L%N$5JRRhQcLy+}motAh_zExtJul)(k-7LoPlW8f$=)Y{s%ZOcb<=hC`$ z>!1%lcI+4f1`g!t(WAy%ug|q(>u0oTnI2dWJb#f_U;Bs;<}TqvZoX&VkV>_x_Y8?= zpO7M8z_mSj{PA&g?b1efbkEAZK!ZjDtJDjdHE+(_Z@x*dE3XW^+Q`pm=B!yf|H2D6 z9gd*%to56b_WF0h8QlDvvjLY$?lL=>z zDg6wK5vi%EY}>qqaXbnMWa`1lxIz4r4j%;B!FQ^_kV(XJ_j z(9^>NAQXi;?|;SkzdqyltjNf4l9Lk+(|c_4WD*k-b?e6Ea&hqBLC&5%>&5Q4{dT%{ z>lU=kWycTTE-gl*jr8HCqE&8bw?SBv8)8nXryU}EdqX+))*EjS8|&#&n>KBtXV0F* z$H&vRZ(n}?`Dd-sn@TH8T3VV<*h1m|9G_>7A2&kRH|pb$zu}o@XCq7|jlL!&C51O; z&Sb&-`Bm=8ipj*M^H;F+>$QIVSG}+77~JzsC6nAdYLt#?5sn-=Li_gZY2Lg!si~<< zm@vVst{gICNWeM(DB8T7{O{+hcqe@nnG&Tk_LK07dnGJZq}!=q;VP_a*REWB_0j${{d)TM?@xAiwuZ44FL~j@g^-O${k?75rrdGcKtHo$c6JUA zJu=Ba?XYvJ_ijP=pA|%E?h`qVWH+_E?l_4(xprNh9-y8$(F5KjSbOK5*}{jy?36% zY&QE1%`;|xMnO?Y`C495r%oMKtysaoUwVni$jI{d!tk@yw*Yo$93ms*pys*P{iP>u z+cXK8-(s=oPEl^Ro6Vay`}NFCn>K08i@LYTLh=(I5Zn^ozdufI{<1eNt3a?Fn6vdY82 zh9^!0rt5NWaq(=VTl#x)XxwIl_+*8*>qX4qd-Mee)qUj15pU}mF=7N^VcI=PF)=aR zaKjB60mJ2T@%#%f80$eoFypn!jJWX{9Y+B;e*7$%C(f!A?~>soM{@7@@yvPmU4GoO ziL9(F3X6&i3q^jI5NzAN*UuT@%AW0cY|_}EdF>@7y!XKeUW2|m|Ld>6?v-5tuDa?f z#*X#S`|-yggO<NgxIg_3}duo;-ug{plq{ki$smZcfExbMJ32wjjdap*w8Z`9tQ53Syouf&!W|Z3P0gW)W7FUq`ug_I= z=D$@$#oz!7?`7|k`{A=8rOgpH-pD8O=6St4Dtf6}i&b&0`QZl!4;g~PcOma{)v6W8 zryo7fRed@KO}BW-8g9DvF_g>fS&~#Mh7-qD>1+EOPVOH63|}k^taylxjpf4+K49SW z*L#^Ognl@PvG?4=C!c;AP(qIxbPusNO+*Qc4896b4|V>ZVBfdd&@lStmtS(n=+P7w z7J7#wlgZ>K0DQZAIX8|RiKDD6D8268+Vazex%BDXNykqMjgOaC31MIjU1dylI~}fo zzGW7(nYr&i!^8=o0h_;IB@a&g zH$_DyLG|_54H&?Hzx;)!O`70xyUEDNVD3jBap1rKL*x88y-5G+WJqOO z(V7KZ{NyFvg?WZ6BP=|ewr$!F6BEPPtSt8L-;X?lOiFY-NmJg#+N2{Pg0P5k z0j&H}3YAl}=QF(fAe6Y;+KJwGf$xLa?RK_p-_GjQtJ%9}kB7Mdlo^Rh@w_o(3hP$S zpEqq*t$wn&;}3rJ}q|o2IdD^&Fm_ zb|1DdTg{e9F_G}Vf3P&^pj{eCAIEqJih4JkcV7_d9d&~IMQ`9d^_xFKeVMCQut2Iu zA&7_!=h25pvuD>AjJta{CX>m}v0S~KG~kXt0e6iaf~*+&gFLf3m;}rwh1+i%6nb}| zYMpGcn3*zpEL%6tqhG(SHC7&^o1E9~r*z-eN?v()FsgP!3V~w8C{T86Z?!Z)f$sRY zXdZp&PWESf$+J)2Pi$;dNC){)*v&T$pn21@;M$*R-qP)6>J#_Uph4Ygm9JUTG?p!y z!QwAp<%-U&LJD(+%2aB{{`1<9yb}$+JRx;IkNb#uK`nj3%I z#q2qY_(=S-O@xMnCRh@+Al{60n*To_}@%6CS)Zv_Drhe7r7R zEa2;9>-l=wde*MnPCB#3^^k6_DJiw- z)29>HT-}vxujxjeI<=?>aC*rBKn?m!ZQ1e*WAB;9Z%0ld6s2;jYX}Bc7$XFdVMDLx z*?&Dq(Q#9%;9jd>*rtDvULx;e*Trc`;Ktvx8oG6ms;iNlb-nk zYtv4l4=|Gz3^s6OKRF!7kzcf$oy0g=wroWEcFpMAsU_XIwxMBzlo}ZxFZC)dEo1J7 zOL=F`LVnrvn`WDr`STY!eI}cnoIDB& zikLa;GkzQMK8nGZ(W1e^<1*N+SMll0K854W3Cx>*FG-2<)URKMxY%f~^eBUdToCwg zT>-uAESH1cvCPwK-kia~gU2{`E*GcMiN#_eJ|TwGl-e|J)_@KjS`Z%>V~C#NDJtZ9 zP-S{|j(w7i17Af63)huad^@yR28gMp{$B#7#8mQQlIeYAM?e20?>aRorWYa0H=PKY zTAyAp%=4MvFtvRC4=uDAp=V48lm_cXx9Z4wzDp&}W z8XHq$3MWox`7umy&h_<|G8+HND8`=}BV?Sc;1~hZ*ew5OpmK=zp7$fQ z#t`*WObK;4c`{2A#!xft2!q3&FgVQquclKw76z)9YGNhMO5Zunkw_9<%xu`P7ckYT z%c)a`G-3Dr#)m*-wls3^l+>Z;D^RKFp|i;MdA`KJg0+U}UB+{4id|3@o+&sllXeyN*1J)QY2sh`nAEBqC#$+~twasS$r6_*PL>g@ZgL_{dkIzHnWA=?4t66Y zVcWjqw%Z13C1tcPrpEq%oUE$H$qJUPRjbC_Kd=?0dw;?x-xQk879(dqZoU7-B;8&$N(kxMV_XQDz zi`FmV=EtwY;qXMjF`3joR|e5Pi;$WueXY5kG+R|oR&_LOHAS!HFm*#rh>xXzJ;}z4 z*_dK$hcL^P_h8`_u6%CqPBkYDFYc#d!}^q#I&nB$I2~?WE`I~_p+lMM-TRw&tBC)$ z3XJu9-*jABys9l*exanq9yHy~UHf_GorN_L@2lo9Pn39<%gwMMeJROi- zS3X!~<{5flbr)8vl@9Hj)3jLwY9}RNvsoxAF5%?KEOzeL&(UM2Xwf2_yUX2&svKiW z9Zmsl{40&IAqb|4lZ8KX9S#>gx_3mp@gKPMj*tdwvovs6amm(|bh)hqdHE$c!(D_q zEx2qJtZs?LY{Fz#*qw2J>92mog3n$iA|l*JvQ!Osmx2Y-9)-XfHb`ObFJG~8)h2fC z+|Q9CC)u`j4`pQz!Xs?dO-^Fy(5t!j+8$ifuPbJ==@OsoV>A)MfAG}7F6I>w7Z>Ag z;Cjq0Ep;MLXctw&p|VnhHB5(hcq1d3z2Bto$LI-E#{jc})% zFqa#f)y%o<9Hu?>1`9rWh4ApO@?&>G9hVdML=K~7w%{g2ZMr5+(mV%+7@#LrTDR(z zrFz)Eo}Eqe<_#Ht@5q46wU?ApTwF%`mg(&K?Psj5x(79EDV`{$mBEAso~We)PXtrv z$%CXtTR4_^h7aa0Bs)8w3%P~l=ND60VCTYx0wzB65^ulxByn-kK_awcKw~6yv{u@s zOyDT+1c?k^9jvD5g~t9f{ZS4bI?nqad=-?r1%-ARH)%xafoumHhL3D!R)R z)$mZV>jx}mD{stvmm^0`aQMhcCQW{k^En0N<`psR>6twG$Y>fiObsC@5OBGpyHrvO zSy1y)+W&;XNC95{_e1>nDg7f4-;vSxZE9W#nZrMT6@W+X;S;^RafW3S6@WkWyYBVtw&ev*fl)iI# zH8AnNf%$8r*rXQA;raI%==_1Uw*ZUgoIiwUi>Y)cJ3ugI&kNn z)$mMcj`j$p$ue6=dU_$k8iw=qVJvq&hbgHZ4!fOC7O%u%vU>L9)`+I4D$(MrMlbYT z)AXtu_1^zZO{vXelg9GQzuu&v&`v~T6mPyYk27a;NUm3(#XoGJxVQwz@%=%yT1qfY zrcg|nlhUwftS9d7=LzrBA7@r3nVFe52Tx=>>FmxpSVe)wXE%n98IFL0S0Dk10GLs; zUQN?8Di{X3J!$&)?@q&pwfSb*T4G{iaW?M4ho3DbDLxK&_u(ANJdWeUA;12s{xqbE zjvh3g$UY-Mf-5VNh+e}9?{Xbc1IF<3tMiNI)8O|!M`N$j1|0EsCv zmF4GR$oS>Z|M$tdOg>phkDekktUe!owv>pXY@+@$n!?&muxD%_X5>TI+V;lpxI0AZB^;*@;Vvy9tlOXfd=t14Dn*A>EtYk^>tm+4+H8&P%KZ7u4GdwS zuOierEI(r0jQhj1?pNcCtD+G@uB4zF& zNuXtv5x;B+xShD)9M9H;Q%OllGT^{%WG7*D(gnkeyhu&byYy`zaz_*L0V=^g0JQIyzMxDw3@A_nY z{`pEaSlbbqn2MK2k@2dClogK?+PPO~F-0KCb+z%fqiPC-VAxRrRjNi_n-Nv_sT}YBTj$w0sOKCrxch|n}SlcU~h`CxknnrJmYZm z9nWyz>}||nu)?5&c`&o02=Kio&3pXe=0bpp55G*k#AG^mXvLZhTREC}im1p4KAbj= z`(ln@nK2ss&hK=5*8?5-4yNd#4?Z2(mm@GHf~6AzYlnU;`sj0F3Quvx6|I9vXn}gG zf$RUm8Sj8wN+v$^GB#{ncg>aL7Z&l z*{xEV4%UM!c<)xV1GfRp9U`3+3Q>1F&Esndne^CexLj`S4n`e;N`nzxdn9z?RsC5o zq1ikp{A3F?X1A9ycI;GQtWgZQwl`8rUYYp;7cS<}s9`;Z555Kvsr#?5Ft%s?pM7gh*HMdwADD?CkmvdJKJ>b?bKo)MR;FR9rre@t2~Fk~OT|3ZA#j z;V}G+B};!`*szJ*dE*UqYTpv4)5U+@{E)@pu0c^0ru^d`8Z}5oBKcy;Dt_GhGghmG zDgU?!lgUJ6WH`kqf1`NyCj{eRh`mWNC`O2M>gnHHuQ|nI-eBnSt9f+Ns}vO#`w3Jp zzVt3zw)~1ucUC?y<_8;cPTc&W=M@Km3j>l{^kylX2KcD?C%fH`< z$)xbu-|wbRkIsN#)3)8rnfE0C6UN;}dV^F?B%$pY6cv|Hyy1(WL$s*#?*1B3y;Lo5 zRN4N`#I1jae@(c7n{OK63AbP7V8p10`FhFBfO+lqGOSj!$I0LixJpV&vDvHv1ESgO zrHmN$Fw4H4<@ei9Kka75o1e2HE1K|ue?_U4g6sS#;^s{x@9ZhEb8?A@2xICa_tB+O zYmkC1J2H6Y<+mtvI2bmt9}kYZ)mt@x|L05WJ8+of+KD(PeuAlXnr@j)(Kk$Zy7Elg za!p8imk}EMv}&`IG>Cy$v!YfAm=o*a=rEAQ-|b}48*fr8+Q#7{C#h4X7FS%+CO`~M z&w*E&nWt&lypcvZAat}$mjnCvEANw#5JPgEM1MDA={Yg<;K58HBf?2dtJ;mC%zhyYx#+SI%Mo*11UOMoQo9s2=CER;?Pba^)t54ejS6 zm7*i5);xCcVgb?7k(KkQW=pka-X1>e8XkD?dF)|v{AQ|8Sm(cBz3Z<;dq*AVJxHX& zz8-VOQ*_DONd44gB$7p6f6rSVe2$co0ay3rkq5?<>-XVI)_G>U4D1K6hixqDur;kEP}Q*jEH`>)8NE95)*6TaJY089{{xy;<#`jPZeRtsHVv15;ZtI zx7&?CsCHMPIwD6R-I69v8gSYbjdS!n#HgPl1BW1r=sl7ZEAp^@x|kAsDT}`O9)M9p z|HAmYMtMCubMx}~=d-U1 zU{XA1CMk;G{P{e7I2XZ>?;gdSw-r}mF6Oc#!f+5_fp8Pp%wSa{W&tL}Q+AW0js5I$ zgHwXTEhu$?-3cX5D0V573M+&~p+v@_M8~5<*TNLr8dE|)?5*o^^yq0CHmvVurpx8V z>2l+8x^X()IGipTHLSvHG}qsl{~D8Fc7yWgo{a8*%)^d2BWdHmez{)q>UP z*`{i-n6X$)Y~8j8OTD4m?A37^sU~J^(3#yd4dv5WbWOLzSKAX1gV&0}B zMBY22a>e6A&s-q^3R$^@M3*o6YKBxXpsqV&=Oo2e91RQsuxPwaYmltn!%>b+9mBOkj*2CMyRc zTkyl$?KEgmAG_Vd(Bcw1xw-ii7nQJi^EMhaYJ|H0@3s_ekTRWE%~FTUW-Czx?<2C` z?UZa=&gui3+417X02H}Rltv|DYuS^qzfA_ktZFk_dLm`^UPIAlFBJ>cL2_TZnFPm0 zvg|OdZ#R}NU%|L>W5_SaCp_Fn<3)lrk^&G-Y}hQznvgKI4Ek~hqybR(ew=iE>ybmicXU-OwX)da;VxX z+V=0yy2^uALt$FuxgO?py2xui0GrFnS6_XMsZmFkF8!7Z1x3_NO5kE{A*RDhD`>uMU_`p=^3FhcKHCA#b_XP^wmmm+E6EtLdv4*1==*v^MU9rG87y^;%%6lTJk6 zTe0t6gSA;#ER8z`=ykt8rbH(Y-s>iW*+O`a;ka_oVycx&%uQ1;B{e_^kHlJj&Xm;2 z|9fJh?%R93qK9Yys*f5Xi0JJ32$c>Uaa)^Cdq`tB<|sv2tT;{{!kp3=p_o(>nom$` z^{Jc{Zlk(x%sw;KCD3yhO~V)W3mcLVehkp zym?jBFI7oX)AXp}wAH1j=FY@#}v&OlZsf z2V!PF=K7e-Q0;)LDyEJHrI8G40Mkqle@aaF*}?w^%pCXx4h)?RCW54s(q{!NRDzuJ z!SvFFaOm?>l^LDc0=`#G(hD@#RCDI7COxx9fUFFD=816QV-FQR0*N|}S2L!66sn(E zLLDtfXt9b`=!*q>CAEa^8+lGIuNw2|eKko>+pUdh3=ADwQw@6lLY9wAtqzYAP{_iV z@Z=Za-A8=&K3fk9DV+F^Lb`c>2YQz(Al2l7KZ?d@*C$wtrqNVE$P#)&)}>;?7xNc( i{xq0S3p@Ow*#84Cambl4S(rrt00001^@s67{VYS001BWNkl1tm%n z$w6`s3kwVEvUyLOet(?Q)6)~qg7V1T$_eo6ICCnVG+I_g0@yXjs})S--N#zCask+Uk!!%Bbv0)!lGADF8vST z{GWu4|B`+IKYE$SE8%~S|2_Uj3braIXw_sLWD*Dv;=!Qz3lnL~{PH!bN?s8xQ7dUM zbcV2_sViTO7A*d~sC@b#f@QWW=)$!s7)#B`D#W-_^>bA|dX;{01u&!e+-Q_#RRu4- zYnV*?-v$e&;9BW_4fpWB$N!6m6(Gz&t{moq!iezOz&(XBj~V`tg%v4>7!15@I;e0I zPhX)m9TiR&Ffk=VcbW?dZkYRk*hUK$5#lYzOWY4UEbaP7YE5)IJyNnBTOq;=hV|p` zt*qFFUtjajsp{J7ghaS^#BlO~W?4kzH$uu9>vA0!T3w({M^*Rwu&7~~L?^8XmL6^- zN7V2w+JB`yKPX6NXfD&d;NJ8GJtRiM8p6>O$(qAU+aKnVrmRt`kx zgVO${l~+We45o}CG@`Dj+{DJF2wMt()yD=!5kx5hiB=~Nx{|$aROTK<<*CD{%smQs z-buL5pN7BSJQ9fqY4LWXrY0gOF&=SoF>pBSusdu30FT=XpU;PiN;k^ODo|WfhQi`< zT(0z^T#A7$EfbE6+HlsW3umnch^c!GVrn;pWOoSh;@4v|sA(Zp97)*LjKJbniIk$^ z_3!}*V)KrX_Gb86QC|t?jt=WC|9`cNq#ifQkM2R)f$bB?eiK=gQ@C6nC@+M{KOd?IdU2Y4xYgNL#J?&BqF9^GsHJ(i-e}_5Sx81AX)ySZQ(1rgbPc)z~z;T z(5`MG`tPRE%a=>AYu7<+-m(W9H}1xkeWyXQnbMjK`5z;y%G{$U+O!-+n^z&>(ouBp)C}Fb-GHuL z+aNo;CS$$F83+QLWnj=KicPB;!h#QY3qlnv=$7mE`>}n;0W4p>5x@Sr0SAgDBz3tJ zY29x_Or1torCmIi&f(15w~=ym113FnAMU<82Ue?iQCy;n5? zYqzG5D$OOK9)%d;&6(M6;I7njnEKZE@K+zQX1!EUgs&GZ!>rjqA}_Tuvi|WT;u^Q& z7%7fx=gm|p<;+sqw7hX-FtaS9{NN50uKO8fo0p?y%~;&hw+nJ|I^+5#4IoJpWBo~j z)u9T*xBx0NVq6)r+$B)t4b|5ytWcGsf(0Ni?;?I&yc&zXS&qL72~vCCg|wURfHfgm zWDcw9C$|0M%5t3h>O)xm_y*5EeIM?-uYZ8Bg8c?Ugm@7EM|HyCU0)+M#;Ku1q>w4a@)dt#%3GgfkG~pfJ@_2r8Z|ez z7>Q=pNGZw>??%C@?@+PnS9EP!6N3izM88|Qpjx#Qa|&S2jBpD=IX3RGOv85y^a478_Kd(lW)1;77*g1K+t$zi=Pe%vs`#l|S%i^}Ed z*u2#phF~1TzrQ1``)=T7fQyzs4uipEo^3u3WVl&%gLFPNpGw*7`BwtV=kw#I zpV#2Se=WdXS0b|R9f!o$T?JDy;L1IQQ}0hikJ=KZz5NvG)XvmZ0{DDB5J`eXQrn>R z==l)J#(n`?dZw~pC^M^)$Wn+hGm}ICP)b4~pWqp|mqX8k#9DrIA6mD*E@B%_f>g?! zA*@5!H{aYI8`sapyZ5$0;Xeo9?3}kDyWL!Qp)v^+_=K+gGA{qI42LJ(1J_Hp;j!!z z>|OO9eqHi0?jP14$;t7N@aTbQ2cGDMlAV8m1~+BMJ|FVtzl+jW@521&2Vv2|w^6rF zrm%lPWp3WQ2W@Y-2g`ok2%p<8Y%dBL=_^EjWlBI1p&wb1CTLBeDKrhvvmpZYUcQK| z%*Ki(yLvAHV?GjmX|WL8`;S|2+rXPJ<*nKH_>u0&81)*G+TF~^+Nffh1psex0WK~5 z0wv47ME}l>G4hSO(5X|)$cj%eth4Zlaw~?SLq&UC2*=-%AkU{KYbP+L#2~^lLidbW z63>H%H{B>TG&;e*M~AU-ZGOuUW+JCbW91oF!= zvaT77>^a*(B!cLy7znJC8tMEZ87y%LC@wBjEM>iwK3vW%!EHTy;OST1#flZ1@ZkrO z;B-0^1+&F8zNQ|Q{rV~9&HoAi9G`=@d!9jB?>kYxe>?KNcn8<`&f)n?jNeo^TaF=>O{W6F|keizicT$buN>h(}6myhPNZC!PQqiMEkib^026A)H zD*zPdl|hy%vZ`0ZypJX$B_VB9`3xOcZ9g2R&*OFl8H$e!~iZq^u~)<126TnmMt3xh|2(OetrRZ_Zf+{O|HlI zQTM~;_MoEDjfzSa%E~KoxwsUU3X9-#`vCxdZrY8wCT)TrZA2|ZLBdKWijbItDBe*Z zWYJ0$G8roP$|xve>Rf~UJJy8ti|$end>%QXPb386Mh!#bmGy9QuZQvV*Kecg^$m6P zgjt!@uxR1iSp3uPXxrv`)U1`EY2?hSYxH%GL}75P)|C-W`wG@_RH?mFTK1~b65*7n zd`=X)K(&-XA1@-XG!@lRE!iPBapEin-u5I0^zMQ7ZCc>au~P~%lq3mOs|AS(alwTE z!HSiCBC*v_)u<>O9RjIj7sE%q zi1*%`fPn*hKtar`n#FJfMyQ!JHg2e3aaI=st|e>@KqAAt9+O4|8zOj!5lstG3RX3Q zee4DjrIv<=#q(~el67(4ci=dN3>lB9FN{aq7S}U&7A%QJpxB&&?XoLZZi45U4j^`C zM7E`(6>d7F$~sz!O3y|Z`z4}U6(qLrg`a;}i$_P_g@mM7bZXlyAibBVYKUyx{5o`O z(+m%fe;FmkWf*o}|42m?E(<7AO*Kg*Crx94jri|Kqkq#X`g&{-6*dfJQ_Z0YNJxIHSQz(J;ftGIc;ow}Du=Xc-70u*F)#LQ+B`NES=rlq|4V zEU?kLhOLxxnuQfk z3vIlOV5!qWvyRYdFaG^MpZgF~{y7dUn_U|uMWXl(7}W)Y+@S%*nPA89<7cpX|0TpX z@5IrDl8IN)4rQK^KpIH~AXAFKFCc>kekokRusN-etVAfmW+l`q zNeP%g{SD0h{AbJz5m{6#LsTKp)ig!^pMZ6BY;_iW^)@=RYaaP7!=o+@2uT%M849bz z0*l>(x8IqA)WM@56B3~bFm%DviGp^hBAukx*&uQa@$I6bUurkX0jH+Xso(wJEVS%Ulc019*}7)!bfp74Z_7 zW@&F#)0XRm?>*%n6y=semep$_R&bEsFa`JCKMC8fy9>$P23DaFI6-kSP39PzfuGzqohIK)sA0!R`;{id~$l~qk8=O&DU6+&rn{|OB;yKGvugAu~L z1Pfxk z!gZiT!K@KQiNRcyur*d(S!@=h)lEW7k`n-d#csv6{rm9AqCZgmALA4>KxwGose+DV z%0Huw$byE)DbjrT1A{`w*g&79h=+UASTk;DTSjK!?*yG3))8P+sT)Aq37uI})?vugWgAt7)eE zcb4^^#4{RP^zia}edyD76doOY7qYU_(eLq3QU9Hvb+_?Fb6Bbmo%phPO(8Nx(LQ4u zHph-%m!P_(1RXjxM@*6facMCi5>ZLci9!+%g~U2M4RX?QR+1aJEO6!|sE zVWu)ZKR68l3kwXakf9|3(ZEpyFF?2ck+#yS12d5_xQMkFk?VqjVpuE^hTYd6b!ul~ z&-x8GR&Il%&b1n5L`26NNPSJ3{&s;Hxf2Te0Om)0CXXjS7biz{#OhU_p?$li+5mN@ zE%EXvhGS#J?uoFtE^+a}UJ zL=9I3OX+n{)rM3AD}q;}Ms+Z#V*`|IT%tcfDNGKuX@*??TRznnJwu0M45pW5oEqH~ z2iH$WMn>9I=O@mcyM$f458^Xui!{0@{X+PmgT}fHBcZBFkmX-JAe{DqX)^#}IiiYKlq`h$QGPdtHfbBc> zWBZN+*tzo{^79Kc^-vYQN*p?T3WpAz#Fq<}qFQIF}XHcqG_?kMtUkU zu%ei{nfHFb9}5=#hR^3L#+I%7Ap8BMyEZm128|ll!FAVWqgm62XxXAMTDEA6)YK$X zebTI1BeY8P;QWb$aMZiDYTgus`X_SzZx?7)S3#lldGC$I?2$KMK>zNBc(A`7j~9RK zIf6}F_F&7Fz1XsKA5NV<2P(^IVj=<`4?29n4L3B!!Y|)M%^KB>)O1w}rC@fvH$$2{ z-1Fxz;jVk0!IrIiui7XmStK;5UmG1dG{cRZTB2*0)~HvvM%etFufv?Vi!o{0MPxqo zk{OAI=KMyQ{F;A7D{JcaA%Ap7oZh#H*-0cGR!d6CuxZO){IPKtHvYLA+jks5MTP5c zn_BAEuZdO5W*{rGT9iUGBcWN<^HZU(ugH79U&c+n9>$if`~LQ+H@jX9^z6|dIlVjK zrtWPK8y6GCtf;6I_1ca=oliFar0Nle$aPE4Q^J{9Ykp-UXk3U$n7H!4{zUt2pJKrm zQ&a-DlG1W)+_W2O*KNnT^*gZpufyy&Z#BGDSuQ zOYPY{Fp?}=u@Sf3KK|;pjoE26HU>R=w8Ovw-O;b_jYv*TK>vYbaOl=o5L3TtSp2RY z;fX>7tEdwRc{rr}-Wg@%gq1Xu-53$@c2l->C2r|=BSL1=J9Zwxij|wNa`hH$+rA$j zk5{>ggecVKpX*XU+u}iKlFfS_6zvkwf)#-w3fG{v!dSU- z^VM$~6Gug*3qLPeho6_MgTrCN%{|(~;c%dQ`|pUU-&7Daf&UeF->3Yh522kk(eS4k z7&Xebtwu$UA$V}qYgo2?BQ9MkGTr(AspIW;=3>~;ey~_1APQ%cT0551JAur=U}3Ri zm=e~u?fd`7SFLWh7fXKK5a8Y7_W~X_l5ZUWOHwrrnVPom1aj??^HGn*)bB&Z&b26A z^Bu}IE{$42VzF4zu|o&+?9l_QTeU(~jT-QJy*POAAb$AqM=bsISIDw_RU7U16*JMX zL-Q+w;rGk9e7P8xE)}7?q7oGqE|e6PL8cV3u}-8{OF`YbHISGXS0yolEK}6Z&Ot$8 z@qeADgv7)nW#C984}2JsBi4MrYkxUMwU^S$8JD^%QS|FP6fd0v-=(~$k<7@*z__tv zF?8rqR8LRWOt*c<4m|MCLpZSi>V3`ArjEyBqwiEXDkM5fy^2aVR<7KHm8&*k%a%Pj zbodlX%PN$_!#QUq0BYCHM8}TJk<+^~`uFdKq{MiIpdA_t2$$Q7l=N=ORdf{&htr9^ zIXURrqX(KcZHmmyOgJ45l$Dj?Y+fGr?%j(uYu94c>eZ;MsEBTGNX4lM)^z;Y_-SH?LTp{=LIlTMcJk0-M2}(-KK_n@xHZe0Yh3w>ISw@W0j(^KDd_GK`JQLS98;t2QzC~H38y1@llEtD_R-33ZktA5GR=B-> zd_MOlG;4V~UV8asc)h+rxr8#Vn*w;)Y*y9g97}RK z61onG&_ld-rafK7Bg!wQHE4 z5JJ$iM-Rht4CX6jXV*l_7LA$VTPcz#E-FQ@K9As!KmUToYGsz$k#u&412t>a62dow z8zBUe#e(IlHe&NHSv<%U*}fqA37N_1cJS-9x((1^yo6 z;^Oe$yYGg5KTt~X)?05OGcyydTD3yGdi8MAO*i56>C-~5ETLx!2??;-Y+9}Xweex@ zA0K^JP(%UFv>2c=#qbf&WAFaskoakW5ICGpj2$}`$BrDq2k*V7_G_tymjJ&Ik^IbfHlC|G6X3|taFEV3hFA+rCM6%Z)yr5i;YSg%Y*f3;eW`-*; zefo4vnluSzWo6-HYuBztPEHQoZnvsoLWEgbTB>9~^$1JQDAzQqi-#V#Ehr@B?D`48 zg0FtXl3zC{ZJ&a9d-mvoo!hr#>Xa$Ss9qfoyWJd7>)=HK`}Z*UjalJ=i^Xfm?KcNp zjGG;?2|=Sqjf9J*P+Jxj7Gn7D;i#;vRJ{NAL-w_RzNMW^WWnj>t9#ILYlai9S&Q(s6YuBztaj{so79uc02&^{aErpiU zOr$?P4e>Yhf*JNo@>2?<({*xxbc`;57R{T7hfbHvh1}d+O{5PWKCH=rF8=AKs1_CM z_3N)Z#t2u5YOC+Ew31J&;6pojpV z`01xLDzo6;y?UW#ixxtBT&}BU`9UNJYu0RKL?#hC(}oRd;kjoYG_7Jge*8F2o;sz; z+;{ET74h-nI0CocdTaRl;K752W%d($Q;Y`aCK+kgJKJ3wGe z-i2R(jXK%cxaZz`@$P%?VcGKKIC1hMJRT3q%gfEx-{iSt=Yin`?T& zxq~SR_M|V z>+iq8;w`K`Tm?{FlH0@V=o#F?-f5Mvv#m?#hRh zv@Y=Y<%qnC=c^dFcDo%hF);yNMij%3$4duR=sorOP+a&&(0Q-gcC5I#6gTIL#@>BL z#XK*Aw7yOcC;o{7C9--US)Y z&owtvH~8_a+RL^;Unjd=$bao#cn<9_HFOg~@Y9b!BBxKEuus=eC3o%Gg|xIZbnMtM zAcA04je&+O#*N*&;n1N&+6~Jck|g1^S02UqC+{_>imE_rdKXx=R)%_Uc&^gn_jqvZ z=u*_Km7$sDe0~9P`aOn2hff*8i;a!Nm-FZ2)_(oMZO*p6=$cZBix)4VNwa2}3jy|s zX>}9Q9-jtFe2TW&8xyxoy)TJVkcGC&m#_OCp2IuMTU=0zp~Hq@>(;Fb>2h{^)`yF?viAzTukdl&!?-sp{@ni2*579&&rUfK0qDITtnH73Qp+`em zS%q?^78j-_GcyeQ?P8w$GB}k zcM~Q*GTxpx4J}%=!WRn`1cF=%+L{o8ymRL;VBkQkT(!y+t`!@9LH=701!7Hwmn4+& zMM0JBHYq@|e=x^``3ukE+=M=$kUqV8}&BIHtyn@1l z0#hJub{i%=JscA!42RWbRd~BoI}PSNR0lr4T6KEi(&f^t=XNPdGjN~Ri!-N|BO@b? zu_M;r@J}hlw0Gy>)z@di=ku8=BQq-tg9i;lmm6%EGWFR z9+qINZpsgm8le98a~B?X_!XQwm3P&N-f+ZCs)mf$zJWEPUIe^OW1Akq!XsHpA5wm9Fwd8WtUq-W!Xibo#bUt&!w2H8os00;=sSbNCGvVEc0Z~0e$Z__0@kBO z3hPiu>4`}6>LjQa_50DUUsoNxA*f^ISyECwKK=MP{QTnwkvQZmZaN>TqAptX;Gacn0Uj-ULLk%lJxpnp&M|h3l`YubRR|_tao| z;TO$ayN|$@ZTqj9yCPF7Yyh!N8xHON3Dwh6H0r>QhMZp%CVhE@3sc{jix2*_0Io{+ z--^4Gn2L-ye}bi24PzdJ1V=EPc#?|4d*&#@Zi@fL(`vP1@SvX9xNZ)VVN>*r+x=e+;r0oxPMrG&?}LPMIjrMeLjpII}{I$ z7$n4t_sye-t3iZuHp1rDwQ6Nx`oEsVzTMwq{FC>F&BU*!_$8+E061Fr)HJWB+%>8D zU2arNzFcw{MW4Tbip{@9x4aiI^^_tmJ{JA@-iW*J>VsZAI|Lk-2!fm|qkL&B7=lsZ z6hWwjj5Z?6WKdLAxX~x)5p3SJU(N6v30C!dW^lv>S;mVmJc55d`;efH$}q~RKw5m@ z0Yy|iDum^#bmQkG>#%UqGOSv?8E%)yc$KMD2SSki&>M)m>CUJe?vT3Qo{4%5>pr*z z7hk>GxExXAlYro`cdw4<->)lr-P{2&F%Er4HNf8+ZN~Byo3LixHk>|v-W*|tR*=_sLbZR+ zgLqe#PLtIBHkWET^b>BAq`36b9q=CAWh{mW>&TpF->w;M>edE5d$dD~=8Xd*RUp7* zFql@vv2fS|B1n(~G-xwL8IR30?D8NyDurPM@S=o?!l(A6vKW!>(P2uy_A496WRqr%#`csL(iFZ0dwraJ0TjDPT0g8#a*;+nQ%+wKp zK^#_nSX}%1{63t`yNGk=F5%*(%P1-;MMZ@RA5UM1%a42pTg~YCZ&K&mT(gcmgRf9JoA;QaFjX56b@@c^t5mmFuRf39@SPvPl3vq9KAyn7 zIZgH5t%*D9!mIzlU*9}~?E1BoZ+O$FkY=5j_=?nhtmp?mim#^c4L&b8zFzCg2GqV@ zI9MK!H@JBga5{qubH+SHZ`2WeZ;JMzT=^orbiRL4TT`L~%V_clKIqzg1Wt{Z4NG!5 z#LD^=m5UTuu@w{8&`Zg+-y-d145@Bb=^I!^<=u zQI@F6VjDtPUEYrlVO(t6?N-?BR+aRVnD9s)C|(b*kSInAFT#xCV%}Z>iwIy578}Yv z6Tt%9E)R&!4k4{j9onHZ=pU>KhoxE#oXO2s#tc(coT#4@?dInlA}Po~M5)A_Oh-*p z0{7WO%?eQ!(F#62!jcv-#)}#1R3u5*PfU!LlAX|AXe-}n;T74YsJB3^bh$xnjw)H5 zSVJohs_JSenOH`BK>=9PY9RMaE*I322;w0!vA_+~CjcLOUDR-9Ih9R)KnG36Q&hnA>CAC_(qcwNP^J|0&OmT0U|dP@Z1m^PDb^>@^< z(ksI%NkMd2f+wO__F?f61z?Rxz?r#7v09_*NE{Tfq-Nplu6&&-k8;B<|HQo4<)~zm z+=p5fSOU?XYG$HUkd>O7)_Ar+zpc#PYkAf-5^GTzaQT6FNb1$UUL=#?d#jpnqs%=O zFM$A9QZjMo>;(-cl4AFgBJaxlGh%qH1zSl4dTuZI<|i5-h?-f}cn_-L)3nOvy-cg! zahiu^R7avCMk4~aBD`cOqtZ_h4=tJyiC`l4R>hWfgD;b9PAN74xfhDDX3bV~>(*8y zk6CCzNj}x^$V|YzgTXXR6y+1)cnSkarzrN0xv5I&i&-lr<-*`;@tRtAQ5~KOIt+zg ztR$8>inN!@<$>SoR1uHamF?C|y`W=ET6SU;!MCgcpsd@lxPH)S*g=s;#x^ z$fkxWJzLV&ZF?cb#B1-fCHlT8tg=}*$*epDfLvaJG`oy(V~6T4>WH3LftZ~ZHPBJ7 zxRr*J(Ns+bPdz+{Nm#@{Bczu53GmRUvvI?lgC#oNd~-HPTq1PoglKct62xJ)1t(S9 zm#_K?qle#u`1sgx{Au3Amx&?94Ay$5C_PN%kGvzov^-qVG^0*`HDQ^9YZewv;>Gtt zH0IfX>wka#Dq=1jhg?xw1v;US!k+dh1)+=~8+RQxbfXmT`{7-;2oF6tnAy;&NUAOj zRI@!Olb)*bvdUyF`l3o$P~#CXQ>S6r;SWQF7gfN5Zk?im#o)m{Hv=p5oJJ}~4e??; z>!{jG2@4wSm6er_u@BsW^55o$X@anw&Cm~rEC?v1fbf(JoX+zZJdZ=*-n#+)+BZO2 zTC&nj5c`c1RLRU40@LP*gAip5MLlz49u73(ENYuoN7iY2X4mFSwIld|kCSN@79qkq zY2rjonvg>)U+DXwcx2=qpc}pc{9YA}DEK+5elD?u9RB66sq%T*ns4!sfAoXjC&TX# zgpi?>-Ih)ny&E%i3Cx^Xv)`~uFk#+t-k7=YonlyFVP$Ys=J9~|p0J~|VpSEwBM6IX z!&1Q`{M5+6qWZ8@_ass$@FvrI`cT*(B5p4bK{*Q8A(sO{Qc^qy_GpgE9lt}DUIa8F zMddY`QplC1NIts@9on~q*XxJR=ZD`XLzZQ=(=*Cx2e^Amz^QYTk#a@vlp;Bz;%XF{ z2@3TW$*qIII;K-5FxP8btyfOI+q@^V@`~4zP@<@olpqP><6~6=#bLz0nn>QL$zzXISnM|`j zAV?%FAw;!*FC-5A^2??8aq()rIb}BNb{n$m)kLjY8AwSWrYj*7YcCX@F^5t z4*2d!O-+K$Ze;|jV!V{XO?|u~+88Em9$QByG@wYNYY0n&xO_f8WEtq*u_;y`*bHa$ zZV^2e6&SNI3Vkb8k)gJHR(6#mK5sAT)q4o#C+hl`gccsd~5_35i6$HPUjUw zJYIyWvmUIFGLwkjaj=wbp47zU_4wg-`_QRV8!TPE9**YS7-=5SwQ#ZOsty!pqkwzQ z2DH7t5lTub;rGk%#yAk;vjwI{hZT0e4B2jl)k;xZQHCLRK80yhpTdndw&K9+nf2;f z(;1ipYpPnHG!>>ADqclg%Ls@Vrvn2AbjQE}H-$UG0a4ag+ z7}HXb**D?0sxf#G0}~ttEF;r_0Nmxv|HPcRKjE`kF9r4sm>@2<+l!Vhn!xkH4@&k! zR5p#UEmBaPz@3EIe;CQ{+P)GE8#TbCf)W%Il%lA(9L1%TC@XiNqQZm9N-tcM9#mF( z@W6vF;GqWxBd70;YFjXF)S+5pVZw1Jlr;|#i?JgNzM8qGln6w!8Ua!%1lxThW!vp` zq^GAKBcmFUk`mNG90aOygz7+uz`O+tzidi7a>8jlBls#|5w1Ns20y6V>D8+vTDEMA z{sW&tMTN^0aaFp!usfWnA(exc6(MZC%sQc?YO7L7DV^aYQk40X{qXPq0||-A*tu&T z9vL+e7cUi~sHhy53QAB~R*CWoH!3QE)Eu_`fyXt_?nhzYdB z$l)zrP>Uc4({)5GQc&T@EboaXEcLE(O<06-YfWBEpn(^(MLmF0WDyZdXp1{S?LG17 z;pm%lBkumkM0mYEL*gp0aHFiug~ko*!EBhtKvFLKS9?4#wUgQO^gT;DN!uz)j~k1gsm_k z#8e3{2{Te?2qVFWBB+t@l|WlqOPDgvzzTIW5et>Ukt^R`n(ae$+KWI9i}`(O{4g|X zSO?>ung+iK;wmYrK&{%f;6AzwGN>-Sgsx4>!2s9pbto*njOBl9gTL0bs9mQvR<2l& zML+xoXG|;#3QKYL$Z34=!N0NKiz%?%?F!X|NR^~_EmWsy41`n&iwad&RDUoPsH#MG z8RgZ3MfFu=P^yKf$@Za!brkdg2&TR@9;Z*A!|d7LYZBM`4cjnt<^mKImm@VT4W47W zbtLgh32Yz`0|@6ppD@3HYxmv_@W&=1Y5Zr9^H1SSZXTBHK91O4!{CgGL4JM#rcRxX zciwplb?Rj4C}N{ItD29RP(1&gWt&mrUkzLlMOk8a7K?=W^Cn~FtZ%S+^WHFVm6TRu z#>|B%EvrO)d?LR8VJWt5-33Xq0%s4a=tGNkBn7X<47My!08mg@Intl~0&+nf{H2$1 z;CvC%Cd>vcF9wwfzW;s+s;4KR|E=AE{2$Tuo~-g3#Qo~M6M16Rf+6xUZ3IK_G=dck zOf`-~6NaeVXz#V~A_PcIPQbjmlQDMOo49cCGAdnOxZOT{{_k(FWXT#h95F~sOT|}T zeUH4ne8f=?69qx~Yl~s2*$5RI7eh)+L)tTQKvFW{%|C^s zM~`DmZV|ShEW(8gg{lyBBCpTjjN2eEROHMGRi=MX8UOJ{bDYtm;vNDRBIrCsBEUuu zFJo9xnIH1u$V4H^^zniYJ|b8xT3mziW&rU;GxeMhLZq%%qiP>|%#i`S0Q7^k5 z+_jrw`LdO8yFKunJ_s$^kr4>#7v{ktnxc@|4u2n%c9=RV!@Z+AuTlx zmh@UE&T4}4@-leO90{%-LsKJF{Dv01QaC`ALKH;9yQmeaTFHWpsViWw*E9gZ|w%ToMOv)@?ATnO5*bWEaQ>RxPqt(8OTJ#@w}5iCWG zC^QV95jJZ!GMUyi?bb1w1_x{U$IoHOk`*{`@EB53QedlnE%MSD@d18=Hbf7K=p z&U%$-+hmBXjU#4GPNyBEE`~nVV419S6I0UM9r0J01H~Mv~U#UrBLSw$Cqirf=O6DuMg8cSb(^k2atICc${`y;X8X2lmgB+ zy%5uBAl!S_2SD0mG-yJ3FPRC88|@j};~vaeaS&U!?A4A+PX)hJBOTSqYXno2o<>s_ zqRz_);M7*8k$52BwxnvdV;nkLJ|nxDBQ8dWaEjC_RJ>K5a+XoX z(}Pi2Rd;D%1dDQxtDxGJON41fb>!PqAFmLs;-XSCYj+>$xUXPIt`=U|y0$HYqj@(- z4yV3{NGOdgLi|}k4i+5FM89EK7<*4cvJQ?8*odRt?Zm^PCSXy;1|J@0zCCzY zRI!taGf`I0^|4xCbPuTA=@f`5bNg0CuOc&-MDA>0+6(;rs|^ zt;3%DbFDnwZ~TDK_-yrYeE0oIZ4+q4%7ZH9th%Pm&@h|kR;olNQUHlU%|aNyh3LFD zFuzurOcU)rjoPbGDl|`4n?&oFVlyt{*R9)z*~dXN3jDcwp2U zNPKV#h-6Xg7s2Qj75&T807FNNUQ!Z=?Sw`sPc!M16|p2&hi$|(47&SSoXNYuS(ye2 zND*&AWB^DQvuBOqQz}?WgJMFUR?CnG;Xq)_N2rq7XHAm{XWFdvhXIvf(G)DI_Co=I z(ko<#9}z$+>&Uv&6p?J`zbwnRf5h`BEh<6DqPJ1`=Pv>AgQ22Hizd{xAZe==uHI?O zZidoZpFzI?PvTO+W&Ir~)M#gofnW)u-86!!f>2}l+>R*opl!_5L9xiBnEvrXO#kR>On&YO#5kSs`FwcylX;Nk0A-B4e@HMO7(s`&%~3nE z8p@ad8yBDJ2haYE96dyA*~0q?INGtQ;~!BITfxkIt6GQih8z^cC82B17<@DDWpwJ$ zLNf~$Ni1OMlU3}xqayal03I7$M5VVhf+dQdLN)L(8iuI8P*bIgr0VvQDe%gxpWxSD zHsH+{#v<0~0HqZF{%SD}A3X^G=-&ATv~AHOC_(|&Z{CRwn|A^L8m8Jo7r%=0r-mS| z??a}M4Ld)Pb&YeW>X~MGYR-t*-lQY^4^KzV(8>6G&f>_12!hB)3KH6yrF<5-);lBH zx@h=Q(}JT{cEn_WD&So`SV~-tVQJw3RoevMR=V66KH_<7+VB@9KmP<`olZ~yE7tsp zh2Q@Q07y$o!kCBu5gzXfi%RhRr}G1wXRQ`YczihCf9+{BI%-Y7DlP>8487x4WY?()yWNhF!)`~(!YS}yI%|q^l&b1`Q`46#(ee2z zIHmYxq&ztT3kzzYW0w)w^Vbngv*yrMZf?GYiJ{nUsoKmLnkLg?<3cS%KyBz+=Gh`x z5ExUk^{K3I;nJldU9)dKzbsSCp8W&b+;BH~cj<(oLv9Vq`zXHuc?G7t{~7##8H5l_ zczifoT;Dj{mva{Uh;6$9tIDR=HN-u)-x7wsd+#B@>q7am&rQ*Wq;|QaZ)&S|!W1k) zJ|ZE$|D!n9??v1==s8S&V;0OZjHyQKht0F|45 z2K9PO$idhSQph-X{)?A+K%AaJEhAymQvNrR*4nT&;-6iFxBjfe4IS^ps#Tj6(s}}d zS)YA}2S(fmi^VGRjWm6c000k1NklG@A2KJW%&`#y}#o-};^ zG@Z4KivV2`&q2;jShT&R^;DfrCXs>@i5V;~C@+ znT7!q=Hu1@W3YAGzA&jS_-ZNcA2vYvDez3>Gta(<3ISh70PvnGG)HUxev2J#pFrwU z|AsBQMY#0D`zPb;jfZe3xLVAtUJdWRF$ta8wG5|Ow(1W|es5NI+I;%)5oq4@nuw(` zrI`K2_W^hbaTs>j0C)~>3+^XiTsLt(VXeeKut!Y9h%g9yrl-%*%w?-}4N}I<#+LmX z(e3_saZ|Pvefo4pcD{mNT0y1v*}RL`x$^)zcWx!L&<~3Xi6|-=YlkI@wx*7< z#>0v@^C7}=_xyDjg_lbLc{mjr<>W`rn_YwA;xe4gy8w$MVad|<_~D0DShxQIEN%KC z=Dtsnl2$`d3P57wk@EP*D0uU3w5*?n7biS|goOC8q<_)k<(M_^o1g_M!MM@G(6d_y z#pn0)vbETM=r{o2&f9X(s@b)e^W~oc8d0{hRX51_|L{QoIGS{Vqe&-hJ+d9E-g^!2 zKXZFnC`gFd1Tf^}?wUq*aQyfgbn4tvY^Y8I@uqlMB~S;96TB0_qB_=&lmKPrm57gv zQF?<`Xq}Y2Rli%hp!1FQK17-@2F5(;|RNli^c;pGxdU9qNRrb6XK z4P=TM!J!mXMulaEg5HNd7@nZQ%(5JqqPlju0n>gxfz(Gogm!2d?d>o21})*f<0VXZ z^%cDS%qaZ(%O9|Q(~ba7<#gc138T=iO*2K#vw8V=Zt{n4d%OUE#~-{04u=B(MKUTt zWgm!S(WC(@F`Txp^bR$htH(h8K6l%cq| z6orK)C@3t#rGgS%EODdQZv#oJ21`mNsHYMm<1WGL@iW8}_?2Y}f6!-_UzXwb2hK*- z<8ZF{VjzBY72Dd`vc^eA}U(;#F6qM94aY*Ty`09NeO6vDX6O))LjVK>jJzUP@fl&eSu#9ko};t zU(MfHYygo!ELOm33xpfCIY8`A5JxN|XF5nsJfyS)klIO*;*%i7Cc$QRpjvR@4glWV z130?vJ-FOH$o{}675EK$?Dos>1qsXN3;6D;SFaXw^NzxjT)k>cZLsg`4cnmFvtOZj z=2)!TxD9vS)(28>q+kB~M!Y}c3wVOl;^13v#^@1uhTH%E1dwHl3#Bf^#3U#^Ve0c> z)Vys=RdwRDYI%HlN08pE9tsM}V6$0ZwOU}cNU&NhuvnzXDG^vK5+sX+qsMY#ZE-7z z)dovaIxI=){{>5zNJXt#^|5o`36zz&0wb0`GE#*I%IovP>ka+-keZqXU;arruIpI! zHl`8AKl$k|@#Uf^*!03QJb3RQ{IYy4R<7L?X8Ip{=pGEn=^nPV3oWcRZQBi3?G}h3 zk}jWWC3@jb&G?qps*qlYR?$ePvjq+W@a3O^!_fri^NV1&Sz)tVV6$0avsxkqryx3l zzxEx2HK&1+$rqJtW`x!X!)+FpU?eA2I|}0KV%xU;XxOkGygomC3^94Uet11Tc)UJ% zJYIM_K3Hvb$mjCZzJWyx7pl|tAsL@N7D+>2LEgblm@s_`d}oh@mESK+cm&OwToYW& z1TuL%Uaa|JD?VAY9EoE-Q(L-lb+)ScYO0R)#@EKII7?{8OsXbEE53lzG8cC3Isl7B zLhU*=VYgdhx7lE~TVb;WT&de^R@iJ7-$7(%Wudat3x7$e$u$&9&Dv=R2prdSMEVQg z!?klID%LH6RB#kOFI$Usf9`pgD#f3FZbo8aGJIYcGiT00YFaw{ei;%5OM5=d+k&aC(v)vIUX_topMWy=oO?M`gjvJG3eZin0D!I^>* zlqA-|$(@@ZRjZBIcDJZtQ3GxSI-HIQFRKmKluTGN>cLvQ4y2S!keGNy;8$IaDhSI; z3}z30q~&K!ehwx?V>X})y|w;KC29=G3V*|PNV;Pp@+Wr3g^L&AY}*$b*8hRn*jVHj z7Gvv{ooLjk0apLM2Jv^j4q~yX>%icsst32_fDmr&Y2UXSDl-onM#ZwIkEwK)(lbr8gQ5JwKthow35 z^L;9SWu;mx05j&vMjMf<3Rmzxw(DI;$ax4PCIQ6mguQWl#C5+11>1f_VQB>t293k^ zZ{NngefvOL<{+tY`^fhDXzD?$SYN={)tS~kA&BeqFjmc(1Q`U0cRz=7U%mnon}oEx zpMz`fdRS6xKuSzQ%0tuOFUSKm)G$=xx!F3yeEUgiD+!|Gz?di%ZX z7ezTlkv4JgQvr!Fkzh&5LPEdMu+_c}u-FjSa~Pb>d%*Aa!4;c^#5*SHz#{58nZ3VS zu)x6r;B4Ios8$D-jBLbq9s*mPCa~9Q3KE-yxE@1cNvi=+z}~1WVmb^^tF*ZGiViOp zH^N;*-?24_m`;MfR;q|xrnDqb1X|~#t+N&gL|f%zN~=UzO9Vb*6H&q-_+TGZvQWb&>qw+ki7Ztmor&HWA#p5rmVb3RHPS{GJb_MGT^^^D3Uudy56} zeMiE3Y$qs@ka*{$z(_?1;`@#a821rkqJ4?RJ3cQ_^Js)O%xFHlm4_w%~(sZOOMCQKVJ2fjX@Sma@J0@TTg%q`I&JBN)*U!wR0U z7M^+{Zz2jyC;XC4GHNV;p(#49iuEjs@*1ix(F_SF$}0$>s_Y-Vx)6i5Gt)-mp+TIU zaw8JaC`%hJYgPFLVls`udMXyDvxWjxQq|NiaMEBx0%yof3qC0la@ zY9^j?c^RLqtg45P&P=G_1E$=FO}W8=Ct)QlYiPGG5sVdKMvy2CgH_xILi6;3F<`>j~7uJZ>#%3 zjh8Sj3yZR$f(Vyav_JskqLi&;5Ej6AjAU%`Lt=^$nMOV)%1$hTJ%lPD4mT{bd85!3 zQT4Y-sK%Ef_|}LHtjLfk@Qwq4qc-92tA-`SfkNGW)VPk?_2J=&`ih-I8HK(;b)p=A zsWx6LECrraot~=u$I1@fNXgnj@5?-oN4(0HmT5v@&L(%p+9ayLWEJ8>`ZpUxkBY>oK>B>4VAquCn zif!&R=Vp!p+nMAxwM*|Cbu=rJ{4y^wJl87s8Rw1(t9%HJb%n&=C+wh(0zV4uba8|l+XFz?>*()?h!+?N+k%q zhxGp!2qZGhFTVfvb+o_rCB0bQGE!4Un-;*TuW!Z-v>P5v>S$>k7Jf>suoQ2;^d<>S z3;tgj{9aSmf2pnSzX^h)t1org+CymD5aF>f(qg#QmzAb^p|DhGk%_?fuKjS{d*Qp+ z=7%7}SXN&j|4XXJwmPKgs$p0Xf-*u{wA)ZDRZ2o1(nNXqvbsU=3m>vE1w{kW8i%DK z<#kdnu7`{N$A|m{>5;x6DgTqN`u``h{xgRvP2IGyT{&F&aKk`fR=VA|E6Z`$R3cq2 zgiS?pL}H7MLy52(X76BF(qaO`kZxSpgFTNPOZDE%pV^hel{e?RDoUx$&B1damo$4d zX^}2cB3&d!LSjNJF)>j@*i~FE7uChJl%1=jsLI8)Ivba2RL)gLP!ipO*e-pDOzqI% zc6H*DtB#WFEwn8=NvC)Zr;F;yA3Pa*^OT@<#K0ZJmZ(){j?w1$Mq(T)$0{5sy+;z& zrqgwIWlwE2r3ZJBkbj)s@ip{HiKKtOOm67hj)(|b_|a>aG9^$@P|Th^N7#KVk3Gc> zE+%xO$$*h4j;PSIIP0kR`Xk0hUf}Wjhmz4D4FI>t!yU6$QFiwqf|JpIN0EtC>Gp8r z)|XlE%4CEPIGs*5ZvK{~*_SxmVHC05`Zb72?y5>kv$xQ>_AIxwf-%GUazp2I|F9C* zG0O$5BPD0g=CNjDHXAM|lw^(|rt^)aPEwk^nGsd{`2AyJY1OK^3G1zQKH`&JFCuJ8 z5Qc3x_pqu{Kk#zhtfH0WU*De0D7w>&3{mgjbJdt1SMcMc^r zwdMcm#O(1%zW(Mr-uwDAKc)>M?#3b1Ub#T?ZjaXSlD_Bw&*x(hV|WM?qOwnzT(r{?R3m&0}}S`J4(NPT{Q%GSh8#r^H11`9P=nb zwd1L&q+UL~y(m8e+C%ZdRgI$uW7xl&%+@-JSTIT?pN z0!6X$_~bjd<4OU)pZ6O3suOuIt%fImJDL_PZq}(2QU-rSp^>obFNDQf=2zQfJ*EhP zB~AH*2lr-sk4_}S$NEK1A>iAr9JX)S$8RP+06=j;ISH*|Iax+fX8GhW^P@P@I&$>* zM|98ZNL`ha8@qNUt#vZ9|1_W9|8Xh_39%pr$t|1l{@*5Z>C!b?wQ6owW~4x)7+J7E z7^=wNYn=2?RY6!PEb_fad|V9L=iIU-o8t%0a@&ZTDJ(8U2!Y)mfs~RxMGis<^Ol0E zEk2Rm2gA7mt9}B;-7<_5q&jYv&<<_m>1(_I7<4=+;u=|1(foKYFBpECn!( zWigi3`#6P>)jQE?9LePAR)c&BNB@RjkM_4g3CHjFiN~mF>9gf00L@d(?j`MS{5a#IsbG_u`B;NY_3-r14jjtnVd12&sm&lN@+y}iAnMPiC6e1VW~6Z)YUmTcKj?yj-KM&xy!`FM$xxVCW8j{L{Ws_rY&T^ zg(75Ny%c5@5&Vt|eOW6kx68%JQx~{;wFsBXO-xJ_&6_8Z+PVdHdxXZx;jNe6HU$Yh ze}6w7+P0n8-nWFYhlOES^^XU5;*Q>=r?=9ZMtsBI#L4q~zvnP}_Z?&ZfnyvwdK#zG zrGH`}=-jC-i{}54fdjf*S;4{^WTXsQS^{-WCojFch$ZiTN?B=zUey2;n~k<@Q|R6; zgFd~wFmPaZ`uFWdWTYK{KD{%^SiOqNa#(0dFmrQ$NRBBR=X2oiccCZ>E|;5}L%HnS zb%1ZPbNKGNA1Ep=Yp_xr8ENN>O$+GXuWKU=j07?E>C&CUE@t8GZXfq0Dp%MIoa@8b$pdpy}ODAyn0p z8gawME7HO~Liz5Elzs7Ust;$IvLhlQc<_M-`1M_PabwS()Ya9ocHKJuHg_&nRaIf% z?7=<%rc0OhX8W1j!`{6|_l91imG^7u9@i)+`enV&DYElH2POib@vgUw-j(@FkYzojB; zgXP=kkdeWf)vM{+wW|(j=I?&T@ZrN5IeIizm6hh+rg^)iWtF-)&Ld&z(sj&vV<{Id z=7SK{)_5stm6F7)nNxUd>ODSFjn~{{nm08^+w^qSe*7^#di2nxJDpDEFId2fGiU1R zIWPZ2(dv0b_qx@j=qpAc%~M@TMfOH><5H5;yg6TP*+OP!CZ(mN)YR1I^sK&p`Y>Vq z_@IQ>&l{PU?fn9d%k5_3q*+XxF_(*ZR}n%G6%}Qvb_*f6e5H`5pM8U8pL@eEh^nfM zmMxkFZS$SC-==%_?tVIJYHHZMdpA{8RXj6e2KV20pQ)Y_lYn&9nFM;psH6%T*7tvCre@I{(JAm?RN9>%P-@0yD2R#<;^$W z)YU(5@SwFI1$1bi%1eKF(%-uZ3W|CAoqr>QVBmlO)X@d$KN&udwQl%bI@2Tw3Y!W zCARox*xPs0TM6pzWU7jyD70zQ#-Em+p6*+@;N+=OeD(F$=DJeSvPDzYeexFZaWVen ztzTqQTj%oQ965TF%a<=xU0rQqk-g z40`tL2|#jkGJ^&U;`on0>ZTr~q+TtF4Q?J_3K(kKp9V^M34)R;}Xp zJMW}z`}PbRJlH(Ev?77;%*(q(lP0WMwaV09RNs+$zW7eXO3^I+>|JoX47MoAORv1b2g{bxsZ%EwFJ8=? zIdh1Ojit7>mMM=t#?Bo(OkiV14`SE$|MB_$^u{;0+Z|X9HFcbIbzys0y;5FTS?!n0 zY&IJ!mc7Qr3FCBS4;?y0|A7Pf^s~?KcsxW#Mly8hP@vrodTKaVg=f6PJu65Vt7rgJ@k<5MdX;M>L z>LLt{>deujr|8{(f?u9$?9shz2ljloTqE;q;~wGov9mlm{WbRPJK88*TVhLEzOe~g zT%uVH)7!zkr>iJm&n%;CV!U%khF&zng~N>cD=Fxc1J#rc%3ddt8U@3m;V z=7KaSv>rD_3;rKfS)Yd;F3ByM@xc9~nf%C|bh)8j*ytRi5`FCW8E(F13Kdl~4G*;P zc$oFO$;|%CZw&MWkHo2|spI1{U-JI4&&l5XL&%q;rnIB!^9zY+-O+?2+I(_BA6)9g zsXexvf>$Sc3DT%Wip@rk?j0F9ygy^d3})bf9@uP(e-akLrzHD=QUeNey`?jNCwyu9 z_a9@zq*zZvoJ|7hQ_M;2<=N}%lFiXh*!-Qqr znYpZXm9tFK*LAsFfIwAkjmIJkKSRtEOO~$V)!2s-K|-b!Bd4{o)0eB2fRm$s@|OCJ zrOQL(X|b4uwG*?{rWw6OfNE1wZMJ|TLtEc~g%L~Rhtyg+q^7deE<&2;sj004)vlQe z^s=aG6^l^c%;joD<879PT-~FZn2klg5l4nJKU=><>vlDM1u28n!}8A9UbWK$ilTGx zX;)A+)NsFCB`7T|r%97|qwSN1hi`|AcMTS6+SoFUrOP@Bqsl2lPJxPLxQy?&$_0gm zrT*cjb&i^R=o+`ZE*ioxW&%USm>(=^LhI*5*IsZeO~`_#jFg6JBNmdZ11Bv)1p?QK z)^y>&Mj|~P#LafYOIo|}#@|1Rgu|OG zd4fNB$7oiRkaT_z-MV$Aw$_Eq<-y~rH}BSQ@ZgX7VJIzzrg0bqA;4&bxK>b1&Y@h~ zZjUY^=;+Z?eDURX7Cw9|v1BN}KZc?0OY?X){RxM|j!m^u zSy@H9^i-aEZXyWLU@RF*Y!v~8J>W?3P+Q|x5#`fcbaYduz4S~8?xp;*1;mb-Ov0`Yp|X%8yB8A?p$1XP8lvQiUr1pN%F^przE`f?jKdMf zj$Qk3x?ug6*~F?)@yv(V5?Wa4lKSvjN2h+o{_0U2-G*>J?=lq=UT5{1ul%8#fnS1$ zSnA3e>xD`Sheads8$y?0{P?l#-FFb1ErK;CDsdz<<6=SwoEJ`-<}1Z|*_A~0xEVZd znofI*h}IeW*Ny_eJ3dt8wAD3XBAW>kK^+W>FjzDa3n8d>#Ph|TTx8dwTq-UnZroI_ ziN`31g%np56}44Iq=YLy?q>et&jY?XW8}2ewL$F&7TIjXl3}o97%bTsEGfB^ca=4T z$rKEG99RB%nmq9)&Z`%QXp?E;i5gP3)!f?>llez>G-FSmqjRUW=(Z9FIbCSYl@<-v zr-=qA-wnoUgw`$KFaNzB(f=tNsvR}86SjmTB2qh9daIN`G_r*tjy_13o9^Y&H@~E! zqT0fbpb5;?MNu1sdCjjWUt>g*2Iq#AJ{%lN8iJMsY0?mpyH;J z?5R`dS+#sKO}}4B)sEH3+G^{!q2W=Z9fBemo(a#pq)fiVZjMrgS zHZ00wu}YfqgG6HsuL?HrA1jz}_gIP!>||)(7mV2bI__Poz~c@oY%5`c(=AUWz8Tv) zKFWR1{fpAl3e#k4HNom8bqx6y^};O&?PvwrIio}cyzu`$uSwQw2HQIWj+-2Jrs>hE}*wH6;| z{ftA{Be{Ib3`W0mocG>e@AnG|A=tKUZ@_TSXo2*4%6Rij%PQEj_lT)%X;}rc<}ByM z*H&@Is9}8Y(dW!x@)6UfJjmewH?nf=X1?F|1GAoeoam@X3UUuo^WA#0i8`1$3&XEf zx<7Bgz058cz^Lg<$jZ(^O3A+cM@_5X=`$C+b}rpVsEx4s8NN6zE2|(szfhN-5Fg7o z-|X?1J$p8fKfkepUN3HCS<(c~44uXkGhb)*r(2mhV+wcQK7w@{zvh2dtYgL#50lxs zJvoPe{qT6CF0|{!iF3GJ zZaQ^J*F`s5w_qJo$6h)vYf~JWH6c&{ROc;hZ{jidzrfgMJEf+85(=s^; zm&=XEBk{N;Znua2{d@A%mvuxAz7L1a?Bl(T>^+*bduli|XFmH59A@T>DU2F6keb>$ zX3w2ZRdo$h9{x4kvi5sJzH9-bgDPYYmyxLdsL1f!0L?AKUO{kGJAP{bRv zpCdjl7LRW=5}M~$!y5k@vmKW2NOYER>U2I)QFfvt?L z-VyB$;~^_&K0SJLqo&qLb#)z8)pb->){x*Tqa+MQWbe`JP3gd_4_0t$`zDfGCNckw zKa$k6357)^>?m{~Y`jP0<3AEg(5V&S_h>DKKA+N8B2Ha3dbm?*X$EkX>9oQ`6@j-h2NQE}uV- zJwhd~q>8$<9ys$(kkp8_?41Wv(|I6Qe9!I(GO|Ro(oAxK=ga2V5bS8l^+wR5apVdt_cU!t7-mB^0uy2GueZKzBrV~X8zNoReVb^En67uZ zYd4+MmJ7E9j#V8^rwe5^4#`wQgr|A4-bT=6sOQJk&g&u&*YW9ocr!t@2=NtRd?0y?b_Aa zRUIKOD-H*Z4GjPQ;3OqP6u*y+{}f2z?|pqug30#*%UM+2S;@}S+0DSw1R!W^XJ|qw zX=7k!qG)1Z?BOtK!UF(+gjy)8JFCn5dghtA!`{+k*A;Nf?-H!!j?aV9i0 zF|)AcCBEwDAttmi<|S5Rm0^&v7dA1sknnUgQSy{kHuAJG;xs1a=Og5C=lW(~W8!Q; z=x$?e>%`^GOZ+dsT;KJ7!1Tm~|3Y!L;wAnsrPO8Q35D$(O$b@(*l3Ly7+DC}Iq4W# z+1NSRX$YCV+w=?^^h^x244ho7%v=mig#X@%zoj`En{p|Ni2YmEcZ-+U+}YWli=N)i z&5h2DnaVL`tk|Mms-)HEI zEsVKL8QED(4cQH8*_lmEX<66|nP?5!7{7N0oXo78#_T369IXH0^S{xvh_bRV3W^Cb zG75heQC1-)c2*%#CNU094nYR(8`v6|{71IMx9oq@a{hm5xr7}}44my8 zmF?`T{}ToB=623@PUd#@gu=rA>UBa283Q8=+kb$R|8&%U*)3w?XyIyNEaqruL-;RG zb6NavT5z%%8gnok(XtqtGSjlK8Zgir8nQ9bvKn)6uyL}R7_l+35&xUs_}U}HC8Gc+}%W#u$wp=D%b=b+^@VdbDTHTVb2$!ToL$Usd0ts?zD!Sg?Y z=|7qw}-$UcO@!x~X#P)kcIerhFn&@;406_lRn}W*jYv(!;-l&65xm9Y3(sW(y zijYu5_hem=5@_=6fxuLQfrP4&#QH#JprXo=6mz1*5?5WtiCbPBzFJ=mUQnPCZ7_s4 zPt)FyPHh_(7nc*>$6Z%mcSmry3!HG~bd$x+fo$x8P8Q(e|8MyPb_}$=0XAZo0;treFZ)I8C($2VMdu!XPo-> zOWyIl=hO#ZkP(y|Ff` zT|p;PlR##6!Q>Q6O6qL}wEhAx@B0+tJ-;vvL?}=o>KYnRfC%`3BB28DBUQwh;O>#h zF^>M#Zn=ENFH0~3`i<~KkSS0-nOf;j8xvXy4$u~*gegD;uo9A1dhRe&}62UTR~ zsowxoZqAc~JZCpmPVUw6MXI)+M9HHP5lICTNuvV{(W<4CH8aV{XHnx+($vnLB!xzZ zAY}A~9-6~IZOHE60nORCftnSa@0(gJYVC#B-M@iqxq8i;c!r5b_OXL_#`BTW2ZSS~ z1V0y}8~6RNpFY5EnMtLR1Qc{a;PJScj>nQaQEXSLU!qz=Tfvaez*~G1B9XKA;1VLCh_CMg(>V zjfk{!d3Ahoczn6t&)=w0JGP3Z)~`Sh23QhTtTKM_dKt!R?gIcSEs%95HDxS3WIdNI z1`hf=`!^;!Ta&Wxk%bci#t)4JP9cFcD{`@S@R2U&+QEn*oWbQ#|nh5SQ! z1Wc(QB079&UtF>aczD-DIcvSfYe%k^W@(8AYII~ZK6kw^4llg2IpmJ9ITN8)fR&2I zDXseY6n;;vM+^&2G~<~pPXlE@R9EX}dp^6IQaK6ci?AMA)?61ft76wWSCxxVJdkzH%zz9Ti*B+dvH;BV$MM{rEj?zid6$ZF* zgqt5P)Y;kh1UR~tE&6kAPhi7BhVo=J#*cvzNIgFeY8p?${Qp?3UlSwOI2ONR$ePvIYw3g#6}!AaE^c-mTxcH zz|@k@(UA%Wx2-10LBL_gCJ*3DHF)6i=fw}d?hhD63&tK!>Q#oCLm(LCc0$zV0;6)& z>=@O2Yj?IKSSy#S33oM63`4BD+X<%!5g>TW)w{*cpa zbTQUV=d-;%FE1iS^(Te|OF6n!jW=Updc6%;#Dkc&a%&eNQ(^+orrqJNNIvK-QXEk6 zB%5&2#xYzkck;hS+#SV|GW>e~n91*n#qC5)HM^q6c@#RMtfA~89iqutw6IZed@um! zqoz!3l_E?mlUOv(-%#qo?nBKMUTlav6jnrD;VbCbG8igvC z9m4`&*zx4<spCo5OzD)4$Z;nAN!3_(dklmf8WZ(K)X zeHK`7<|D!Pv!;C9AC9QqvtCD_q9LO&Td^(JWno%%yg+Xr`b z(Lhe~V&$^9by6K4)jyeax4U<9AS{`LMgK+@sOBbdAxC2-XEQRw2#m&5UQtB7}3XSHk2&qvk3huRT+CGddH; z=A;k_Y~#_>SZ}=8?7mFya`=tz1P+w8l=KkrXA!Xf9O160PUz^6oFa+VX4k=HyH`S%CD7lj^Fq+Q^aq4S?@c2W zC=oDXP!8NDtcK#@FB+j=Nc4k~m4t~n&`ib+l}fDf`DTB)^dn_yf7(b{wfKP#GYLh~ z<^y8E$s<+njS6XQ3j$!YDe*@m!?2u#f}d}nV5e`KAbq+X8GI+G)>?UkFA&&I}M zAI=LrtnLvAWO>rFW=wh^W820Q2cHOo!hnNBA|8k3-bvINzitz0A?5QqTx*;LnJ)cV zH+@>R!OZM~AUa)5LJ|vw^!Ec1USbCd7=`)-E{YNF9Qm(GK8e17;g>&87dCrAGmB`=r%`JlB|?VhAdBrtZVXYS6#FTjix}NyWf~EV$yuD?k9hsQEUc%i{NqEVXHY^sqCF(e*w4T-Spg9fZACJBryi1xDzGrty^x?Cd5ZCI zmp~W)yg;1D-k9W)jn?31B!d?y@?zZ69Yo*VJq6S_v3wOp;fHV%5R)=g4klAt-OOLk z=N3*IO_%tRJs%35m*=a#7bf{KpJoeTw1~T4;o5#T zA^BbiR|*^)wF@#SyMqz?Z_q(VNG~r~vUGh@j@(Y7fo}E!4pO0tVquF!3Tg?Mrx zu?E2wK+O!&;}yi*44(R3vUO!>R=CFkyC}+ng$3hS!VciKWA!w&fe9}mA-cMk%Z72& zxevCfQ`6oZwlCDo82akK!dUUxOo&L0u*UUj??S}z8$Z`>C+9|;LXSbN4+C#%=s)oi z1aiJF^>vF&!(VsLEV{(W&=sJu@!XcL_#_0_+_RLF7(qcDO|Y;$uGgvejT4<&z*)T^ z7M`(2>dm#a3zLK8m3k}y+2vS*vC18ij>lqZ8x%a%fS|=&TLrwkNq1et0yA}S&|(=A zv8f3pWZb#T_fBFBkHaz6aZT~&EEXqUA;a6{%H@4yc;RHiCrDuhM@0=x4GxRPw`@<* zTwb@kL97`-x$%h>F=2)gdgVYH1&7sQDNo?7JP!ePcd1?OtlX2w>6sjcZl`l$y-?7u zI$TSp{DC7SF(PnSp&vdFlN*Ge*Q`)8817PQsz%`~Wv!@Y`APpMOksZxc;1G!e;&9Z z6jU;#H@vx%GHI!7){UleW&Dy{3K9B{{F!2xchzdG>%$HNks}v^Fse%5K0IZt+PH2H{drAV6)FCwQoiZ z02L!LRHC7=fqgqRN0wfL8|>QZe!5qNMQU7{ocvlyPDgoxhDeac5dd8CC#P$zUS*`4 z)+$sk11%NN=j;_Nnl!J>U4Ttye%6Uwn@<0mohC-Ixk*sabZkALDXnY-0H4ysp9ULK6+}s}y`)PVmqzuL& zjOt)69-yaY22m_TMr1%lN=l?QGWTmJX{ z=Zc=>DDZNfvEIIDLfxt^0I{3+2bJDS^Plw^OhxH{s$W4h zkqPEI`p(#KuK2%oW-thQG=a(EsME8h%{91Leuwl}O+UQL_lYy;{h^$|DKJ`cz$`WvvH(VM{*JRoKSbgN(Z&QH}fF#Q7 z3kBS&VHJcM1#NXpDhi%1yZOwT?hyvg$u9aV|8@6O=mmO=Z0yUN@_Obkq35n5%50to|Dtf}Ha2*JhbIr~|_xOhJ2L{A6i zQ$li_v1)7MKu1glI~0hl#LnJ&MwVESt4o7V&MlJ}(`BjS0Uv>I^j#gvg(zKGV9>7! zC88WAc|Jg>e+q;c$Xt8`9jYjH-$?Lb|p zVa7+`bB_(UpmBq7A~ps!VE}KmOU?9gIP&6e_kJzShA^a~MbW-wd%WT`2<%mzhFlPf zPNxI!%S5n#XZ{?SlH)1lmgfq%B_uAuLMgnJ=W4NUbT`UKxOu(?8YVh;M&_QQUFajP z_(2$<+f~|YSGHg!BmyVJQs88TA7c;>8JT_;rA?9*5g{!e=Rx4F7$-n5re6|66WpNW zAG9`&H1^9h{l+f6l}1d$KHckVWC}8pY@0*<Zx! z??dWIwy@(N*#neX`LPJs2~J_XjfyiA>D_2@j9vy*wAyS^bNvi0TLIvCjmDormMfdr!NEXL=w<0A* zni`XYD;ncVs(q-Qld8tkuz#&v1soWZO80?j-=@9a5Pc)0jwKeJ`1ZI5?D0I*+pzlb z@&k2}>YykpGptnr6|xe&)iLGpD~ft6*o03=5s~`_4a9Bv;$|@vn7aC&C6W>tbNv?x zq^>era1_YeuZ$j6$2CwRPbBjsYM=;n77h;C*|CegMvbod7JTVy0AXq|j5QpVcm=ZV zN<=!0v7wf7S`6CFO-tgh2IdBsYQ3l)M^-ZS7RWiwa#RG!>yx!&pJh6m*Qc|CT`aK7 zIHP(?9i1&uMxtsH7xd*ZRmGCMfuf{|iFc`(DSZa!=pATc$e(nHBZo}l;@o-!Zf*$d z>Dol_$Pfv58G|l)XguQ%+8)5 zT%Ne<>^CRnxwk)Q%<$SnpoEm^s-x5*k)|3)<9#pRW7bDKS`3lxHY6s-=td@|s=tUG zi$6woLC|T^@Ud1g{MTWNh2zPx-eb)e6@dlJJv`2jWICR{Tuxmb#avBQeX2x$+1ggi zS|(RURk)nh<^lW&2uho6v^?G#QSbZ!4nO?S?YUBX^pV;Kc{ZTut6#w3R6gwgP%{P6 z(OV@Qn3Hn2N3>XNG;f{8&Ld%8Y)A{`5hB@jZ`T@?2B7=;DD@Fmd*XH}tj=-<2p{;FH zf`WmLvY@SPt5HQU5PaJd?NY8i+vc=BgV@t-BedQW0||GhvIZ6jSBZ3IDDO5z9_a{) z&f9LaL+2=PT(x~-2n~q*(AwGY5S3nz`grTvN&J|fRgaC?ZSzXGfR_AaudQ4eOYBmX zR~|W@YKP0^%}2y|_8OCxw4R<<;)D@0fFf=)E)~o`R+iScQa5eA-HioL;t=AH2xE+4 z$}Zo-zLnMDxrh)b5ib!x)W}Y6Tw-|X5Z2-4>3V^Uhlj>x=$;!s0_kwxx2sG6k4911 z|LF777p|eDl{XefPt`V?|CBAt4 zwcv2<<@vfD_Iq5s6oF(#en$PgqNb?Wy?2F8Tqzek=FF_ZrjWHCbCsMzC09@!0yrG5 z1P1!**aRU5G|r8EaMamFkRPWnGbi;216h!Hp6H6uRuMJb&j9V)Y5q7oeup1Kj2c=R z9&y$2Jf{psBi)4QW@!Yz>P$9k+_+BC>S0@r1EJG-eI)Ss93j%hJ2#~Hh7(8JSBq0q z@eOi51|rir7mKnNTkg&Cr@!-Ddu*9WG1j;~Rw?Z5vv@W>#$cGu*7P)=hFKYb)I_z< ztMItvbUX09ZWmN!L^a?z1WvBqy`^BpqcDWg*zs10#Kh|Hw|rn6?;Iiy z9Jb-t7$Oud%zP6|87p~zJUf{jGkcmIlOftcmPPb=hPW^vG}w!;mHb1B1n2u<_44t z%by1$S!F*wW+6-vw5 z`Vyg@1(YEj<RfjfuD(OiU!A%>=sAX?)>wF9>Yy6y0jVv|qs{wr_9$_?QI! zJALY&-QVAzm6f&8*?GU946}>4(1Mua_C*_NoU)n=HW4(8!!`(Jx9S_ z!Xo*}lQ~$I*9@r<4nJgEa%pai!!v9z5edg}7=kerhqGKNM}Rv_fQ!Ozx4G8s^G5LY zG(0%O1gkXtw;vSf&wMeMN97jNkIie1TNJrEp7DiB)laIjTrcFD%cF(h1<4DI2Be@0 zsX6=OO~Ij|7@ShsY)g|MTwd4TdfVOC!@(kRkS|0<*o6~kOFkS@_fd?NBPw%ZL7mDf};u2D2)i zhDC7QAD}W0u%bVl4t_3- z#x52+GelJy`=g ztr>&J#1Ull7sKajB_VBm>kAqdVb59V^H$;WP6{eSjDbjr;s&r=_Le>kmZWcN?)IS>>e*zvhfQ4QS!iBaW9}xQ<<* zyjJ7q*5hC8-@)$<)t4tZ zXSqMLD2I?Sz`#S4xckd;9FmVYIAoQ^y<{+t3x`LPxR#JlK9IxXbndTNE<`WZ;FVIx z>sA*RWS7wV(kUunC>pC!wepPr=Jnw$41s`-y2DKDqRVYtrF_vEj}9bXSn?Mo{aDuG zaMmx`*0M8#Tl0@IO?6tC=dgH7wb+J=s+~LnM$3f}Boa&CZpT9@32CA;@7)j#nu3~~ zy@LZ%X#Vw*G}^qZn_GDzT39c=5G+)f4o{OWY5GYN<@%pP%dH$qPKf9VHfz?K?Jh5o zX!2wYY(qNGy69z`_TI~vg<37Yg=X{_58h-c&*q9_)&{ZE)kt7Mk0x?-ra2uP96%u8 zt=F4rz2P7spRfNQTqO{Eye@|EmSI>VUY_0*u)@eEYybRGGrMAs4-BBAQ+Bqvcs{pU zT8L)NG{E_I-;ZQ>0NCwW4Bqmzn_;A{=IOu-(dx&Ny|=1p(Pp` zi_MyT%-q|Rn1#7pGH?2D%34jv1o|MZAg|9+vB>{%KOb|pO#U;C!Fq*(kaV(%b3&mr zNy>7qz9PFBleZbFo~Sn4G+)fv#EgZExjS@cH?<>&2R2y1|QD;Vg|#yYubA zsGICxDodyCOEb~n_p{z4$3)gh%AwQC4{&rvBPj?jr9$31m^#^71ROr?V#P&c$rejb z*+Jks$IFej_G%@%G0C$JQ6cuI<~_R}8VG?t##gUZ!rz6*5Ck-fCo=H{*NY=4(Udv4 zj7CEj>n-^_4Ov;ax!dmaw8Mgjin_XOc2@)d(2aC^3>2h1dKn+FBxqF!Y(0Wp&u*Po z`}`N6>ROZWl$90rajy^|g}6f+>|a8Gjt?ts6!3%yWu;FzdC0+0if*TN!nd@I`7cOO zEcmS6&)ITPQc^p@%O-A%F4@9g??#Dx7^sNTlj+=i#J5;EGVQ~oeZtMV16vXi*5AM8^N5Cq*5P*97-J*9pd=^i*Yv8@YqmMeCX#T{?s|c)dmX0ADDUojJe7^I zw?7<%qek70qcb3YV}HAF*qLPoSy3%WlETPpxU~I70h}zq2~h)44=MOnCsxQxr9_qCnzDC#s<~_-Rb0O`%^vj& z{Ks#&zkx-4!^;=F0TOkCMZFTO9xRaUcGt(LiKN>@Iqspuo-p2BdY!E1nXq1B0>52dt|e@7CkS& z6FXKP?};Ykm(E43^9r_?vdh(A$Vq~M1T&rF|_YI*9pOZ%cdIvQWTAglk` zW3ydXcoa5+=zcv>XXtT#hrs_@R+a~F)eVw`*UfUXcX4U;KJjmGLX;+t2#`ZSf1^%C zG1uH6mFg_nnI5WbTv#Arv;MnWqo;3gFQJav*k#sz3*BhcV!auuJiW@U=^jo}gsKT* zKAHW2m{jZ}S^l=l%uV~~$B9_%uAw1E`{Nva8#6$)(m?kxW z_jO;sa2VlmsMt%9WFk7f?)#2iK0~zSCiWwo?$sI1(bpCPN!JKiLuTp9r*p*@ZBB0k7Cx`tX5u$XZ=WkXhR@Ou z+tSLZ-RyQ7{_=M|JqwFz-i3XuBQ|Q9;NQ7hwqj27aHLgAZS4#KOPcBca$b z-R>q3k4{@6Y4J7EelMpPm@IeY!)L(^|IV4gb{MAephjO1P}J%}s$BA;dX~xUQ?#>tM57D0|}zt1qH6Hg8(1*6DyAiC^HZREvp@dOxVyj^uswGCE!w*?#xxyDqps=oOPBjg5gxNg(u)U`CEsFSZ5e>svnCiDdy?v zUa7k6_tmAck!1i5hi!Zk*q#HYNYLRs?N#%PXy8%ZiE6p>+R?pB+SFfN26j@gWt~PY z6a>A7?e%zmvf06&gbo+P%iN&T;dFUTEm^-n5o3b+ObbMSe}FpA`zZBSKafaRz6o<~v034MGk%;Y3^ z?6x{J?y{VYr@C&AGHL((vD+|LKN0>BXehBdWe3fl9nr>pN6cAuECBp;#K!Utz&gbJX#Z2tvJ3U5)q5T=e6$z5ZKwZ2?;7G3o6W(Cz89JZ+Ps!zj)G7^!LMNN|Yy6 zslUut)=Z!+oz7@13iiNZM1N0F?A{_ara;_NB>jpV@Za31G#lP0CnTb^7}1k83MMd? zCGc%DKKV5*8bes_bH5ml5nOCisTvRva4lnLX=&*Fjt3FSn$N}~BPe*taQ~xa5a;jt z`>UTJ7)S6&7UbNz%H47EtzJ)wtsWXMLY2bwUbUbb@f4Bu4@Jsx2Iq$bfUB!jhXo>%Q=NLhDSS!kFrGf?qj$+Xt$~KCv0qu}yQJyCZ z?JbnJHfSh zs>_T0qs_0hv=l*H&%|PEiPy^=ervqatEG$^_{#w!3Zz>&406R}si;68Sesq5SLbTg zNndfUoLv{gP$TagDWkXf#@}yQ+_y z+r>B-P?yr{%Y}Qy*q69XC~UJQPzX(H2BW`TZf?Xw5&U#l5aP$sp9&h<+&IBq(H_?- zjVe2_H`w7S-NC#3Ym+(1in@rpxJ7Za4r^V_*1rlnwyX5?6 z@SU6ykz?4@3;lW9;Ph09K|phue~e|NesV0`-x$(_4|a9we^%Zdb^TUt0VRwo9_#({ zL$w!@5+FrC?dtI&TJ+P@3RZz63wJsO?|S{Qi^psIh?I?oeBiFo0DxMf-FDga#BU@r zcKa7wTYVBC7mAxU;ZXK{GJ4}(}f3QZVNSI$gI|%D}8#LDFiF259ki{J*h_|{U4jw`l*y62n zlChzsj#*B6-CU34#R!2;c6Z@~!sXJ?9evMjfH<4Z4`v6PrfHFPYjhm8Y=6#J(kRR$ zG$7*zxP+aeB~tQs^9ePFTgyADgTePYq*Zb!CjMgY;8)66H}__Uuh~p*7lsOtI39w> zV>_p0oK&M6KH$#*m4y{+q@a{^bFmobM-+aQz{Nr5c3Pgg661Yi8s0$Md4d$3V-r8~@aO3+9+LOTcOR%L ze1m|;g^{FM*bBb^x^&_C3%Is-d%Y>O%klMOnf?Ju^Q?d@sjL1F$O*IqB`}pfkKuO3 z>HB`rhO=yVnGg#aQ6LfIErGtY<+U&BU+64G){B#3qbkjhTk7a&oZTsjL7$B_IhJ;k zfd$Xo)wL!n{xgH4QLCjnM>l`3;DE^i0$o*G^x3^-&0jgrWbf@B&*x?@pxb9yS^2bA zI2@5t4#jYmL_l4P!Fqq_(A8Ct2Zx$2(z_8+JUCiU8%wzrlj!PG`Rh_H20+NpMs~Q6 z4&(KNE7O{tkeEI=i~1zsXTbUgK_s9G`wqN7Y?4vlRDJO({Hog8YIpafYV*$MX3RpU z_Mod#c?VIRX9EVCKySOY*1y|_t2rk2?~O7}#Dw(3Z*}NrM~9o6o-E-YaYXn*;iyPO zvuWM?w=1tJ4)m&D#3=)!dt=MowmD{@u-^MI7~f{V`o|VKorY6-94I0#0mIWarNt-- zr$^T4#6`)C{FIz*^<<@^?SU<7?%ODgj9;p@nu5CDE^2txT?zydgyNs>jL43L zN@XZdVqN^D4^2``8|YoA83qC70sD8k*lPK)NQ4%A0!#EKrh4DaHRxT1`qG$?@4ov^ z@6~u}4Y$jwcTDMU2n~;6Tadc}vPv3c+c3=K$qDD*6MSZ~SgY;)IQK~w#__kFp6Quv z?-D9TVNhbahk2~~wdje!q=Wn4=Yj9P^ zGPMqml1fnkA)nP#T?;gciX*FMRdjGZFyHIY|)vFIH4XcS0kHfzZgC$sLwkcCaCpGn)@DZvl zTkNeH*xEDP9~W&^FXG0He=Ke8oWBd2_wC6!ymLaTBrmU;J_n(__8u<3vh-f7SeA|G zYFypogHBF|uB*vN^Gm6-4sRK*m8r)pM zCvvls6b&pO#Ryv4JY$bD;b7o~5F>cBT@RcvCLfFV>qcm^fW&wIoU8Z+r1E30aoTEV{`-5U4O5oT2`U;=FK z^qY~Sal-_0)(2Z!YtJ3Lsx!t(l5n}Qu@Fgb-TR1!`~ll3=^lemHR~31GKuam?ZIqm zKW8-SSi=D=E}??a)zA_>8c+fu3_jD0lXx=&vp|zqQZevlMg9%6OrR|u=kvJo6fUrI z?d(5=A{&q3LNd8d@~HDQ9TJJyY{$aaI{P?tmTKBxS+vUhr8e& z#kLXFTmMPrk=WOzf>R~-Ha?^WWdE_e48w|%Sp=ShD&jbI*zbr^p-RH$1fLlXG)tO% zSX@j9;P$kn2AIa?XDmw1gM}fYpL||+T9k`ox4>s(uCawitThL*PVZMUZQiyFJwZJ} zd8L>+WhTrfMWwyVz748L6N*tG|FTExuZw=z+!Qd)eS_bas=GIZ9(gv~-CG4DHB7F< zu={v3fOQA>_-ZmPzE9E!rvoLfX>4zn$#9VJsvP$Gwz~*zIsN3>X&7vaFrAw%f|)k( zm&@SsOJ_G7(R#uE-Ct`KBA!N{T1cT{l0<@31 zA7NKMx^`0PJ^LUmyDWmZ+79tHN`<0wvp9b4{7T6`H=eWV8uol z3PNf}vEv*FK-&zAMscV zS_v~tz)V_Hm2>81dH4! zB<$jGHQqcq*{(9pY;KB@B??~8u&C(j;uGZN#HYEvKbJSM5OJG`7TX?_EdvziSdve^ zXQn{Yhr6-W3^NB65qxO7pA?yOT>cdO+kx;X~0~QI1(zB9jOg2-IRSTQhR2CYIE>%s0Eh(KjT1?`a&+UO3yWJKB3JOBp z>$KZ<-ig&}Zz3JVoo(}|crI=Oo~RhG;^1sCnFO~uf(XV*O&DatX)xY?3*B=a4r%s2 zHVPuq^XaYe$17a(m}u}vi6XBA$Li%|ezA#W(CmZ*x`ZPQkX~&?myw5T@gt(^wF9i} zI^F$5`We7DvZIr2GmSBJwhZ^2&1UWTq@I0m-!7Nijh4D2uQso-wygE{Plz*9Gjb;< zr%-Wyf3-M#JZ{(M`UV7$y!d=*qyxz*YNE78LVmf@Vy$3jAnlS`RLHh74MdgBa9CLZ zaA7Ah=8L~S;jvae#`sg!vF%lV7dKj}qC45sad=6DT7s-O|CE^&Wy~>|Wx z=7GW=MD$AL1;kd7taEX#>9sjx`CF$@3F6a*_3zsmWfebQ<{X|JUYww9)qLIUb>}y> zE`=h~3JPiGifgg~Ao8M(_6D<(@`u&bOIl@|J9xc(aXB3=6%vjT<+=syGWTSSC1h-b=4oW=P3t=E%j>8)opEeH`P0}FnqfQ_aSYl=%2N6Kiq%H}fmbZW;LlFCXvh)LNo zVBMR_jtdfO{2Nm$GnCB?^cu-A__T&@QzfgyVDpKoe?eVb>p zVq4ny#bO5>NyRnyC)|%a0lCMMZ|>8VR}M^(Cc)kT@x}~+6M6X)44GKruwKcL1_7#O zt}e;}jaqJ|if5GluEq~|@)4XBaLaKLO^4rW7oJM=Tmjmjb1?gNPPg0XcaN(LshsEu z5+EDJJTZ4zT*N=+PsvYJrp!mCk&;&uH`t2JvL9 zQ5aOXW?VF3x@K%>pG61>C46^x>{oC30RAg!M5jwYvYn9xKY4X|`wh;XTBM}tF3RN# z((B;)d|JNM(|@m%K(%HZ3J+RWD^3NK0`(CF-5c7bVr69?V6IV7KT1RJ@l~jcm=bWL za(mT7VDIL3zG46%x)DWOkhLH{$>g!Tuf)=L2@niWupy2m;CFhymUP<|p#07`nieV^ z3b#!&{xWv@zJk-IKKUg+w<&U~CfVl=@RGWp*$F6>?a3TZ>wUak2~($bUG88G&X(sz z;8cG#TnmI4K#eIW(&=>gdOiMD^L`hOA&Vp&tyD8Yr_~JEH-571ACjm{@vfM~d{+*p zqy|NVk4u_>o3 zi>yX9lJRyD!DY>a3jNjd`D!q^ruX@ImNzDNcyMrVc;>a+zj(E5{dbN?^Atxjg45>H zv?+Zrp>v&QO`cReC?EhpPIRR&B{(`J2`T95>j$T@lDYq2tg#d$BvakLZX@^psUtph zt`n3;i!WZ?ePrlD#Bp@A(>H(A!|O4^tklpDrJa=x;?3(%Wj}~)~s{9fH!R|gqH4r%4u?Rh6?Bs#?Lj}5!9DA zwfhMSfQ)KKhAWqn)jyllXn44`gU+{4KB2P4tv`sB_tv2NRG!)M{IhCQ99mIldmVbZ zD37&ro(S{CUY4N`NBqV#dp@hi#Kv>ZA|kB|B+)C=jAF6X4fSFji#}<+r{mS$Thw); z1`-?c`DkR0e3TDU6XtvAfVgjLOw4wztC5H?wS3xM&)(aL)RCs^4^P8No$2aZI^mP7 zb>&+$?L+0Sl0T{gL{T`$jBVxC8bCsboq|E}ii>~Qm5sKF<{UX?612ip3B3=ZCGCLo z1a3^phZAY`fK3gTmvj(`^?aUSq#4H|SyrZ}qMl9&BWR}BbXt#^oojx($jK@ZSDRKf zY%?B?a5h)T0{odz70Bs5rWt>iz;+)qMza#Bzv(ibrNW&U9;5N39Ybd>@9>ugBEe^I z`q}4}Z@fXkLZ-Ye(+SC9`*?A{UfFb`$(aoaCkkyfq&Ci*EARH6Qk|_%bt~wE@A8-w zIL*6f1YU(`rymZ+=6~khHDcs?X^pIeQ42UN+$2)600PcZX_f#@!+(LcYN|&dL=0rv zWUbPWckYkeu3;~>ang`8f@=MjguD8N5SY8KT=@eHjwX0o;@AgN3i!R>nFRU~8`C}B z-<*?%A=QR3d(2m54Udk^DZ|Rov$oc0W~PH-IsH7#5TE1>?!>r(Qw|bxl*TTzrGROB-DQE(lH)^ei zW(TB}>06Z22jB6^0WnCSdsyvACFQhA|K;7R^i^ zGHOy#;HTg}9p68(t@^mG@`;S%z@^|B5i|?)`pNp<3y2{y(NOptIr%R8$*~scGoeWr ze~A}@f59mKf%vRTbvLI3yiPk?Z!67~U>xmDS-4nx0PVbpm5#d8R8z&8lrP|JyR0)W z+O$7^{{i5SL=RaP#cfX{EIJ7uki9M5X7-c?XZQ6O~|> zNEGHNVi%(^?(fcTbv$gtdsJq!yYcMphs=T|Z+2ub9qtP0lehb`4)XBiL{M;eFV?wT z9dUZR&0RLbY-V!0=j`5*l8_}3$mtvBOW-)X>s?+Qyuw{$N-1MEIO;X{c0{0`uivHfOh;#FV?F02j^uO71dc#FqT-vN5Wk(_*K?=5b^kYHCf|acRg7mU^ zENa@e-h8;LU`sI2%;sb7v0r?xN^#<9it=u^YdK?#sEeRfm{q7oy4bm5>7kwWI-Q-aiN@F4ZV^;1E z^+wCDTRR$;ZG=+Z)f))z#K*$tol_-IGX zHI=;C2=oT^urU?5`|pe10!6oa4Vj2y_B>bGygNsOwjV~~2o`-i`D#F5J4Vl3IP{CX zy)rMqIHF~X#Vgir{AKqYg|hOaH&ZjRq5KFA@|*YJ=a;U!G%0; z#t091z&HO(tU=6)<&P0ge8ah;coc;K!xwqlXOc-yS6&Mab(QH|S zJFDtv9{;XL7q{!B65>=r;U2p)PT^g{{JQ+Mele_<=;phRr9wO2_w1Q}e%ZPS#XSFK zuz_M2hAURDT9KL(i<2I86E9JZ5Kagdl@@n>(x9iNz51@FgL2QWYx4_>B@)6(?J(!v zbGIT?}G-v27p&>@%p@&oX!a)qI6}I3#W|^i5Rdo-$(V$<@ogCFFsn- zt$W8xjc&};w|4A1Wch)&r`z7mUqM=$l#&q<9t_pWq*oVOgaU-ix1YVwFib^7rK8F| zD<}WRiSwd!l{K8(hp8Qe)dh7W#(&&ww04S$6O69hd^^c!^vh10vwqL>2=r|K`GRQx z*x_U(Mo6IG1*rcY`_@-hRBqn#82}k|%Uw!L>*fxci0ToZ#|I-^>UthA<#fr#i@zr) zryn}-9fAf_%XV>zAtAwtKm-df&&ysobwr?F`{joVuqB7Rzxds;OM7g_nnho4U$N|~ zq2p)Wh)J|uuzhr^Kew%MQmc}Z(_4p!WMt)zn?9dms>ay*&p!+c4ouI?h19~=+hg}% zM=P~eJ5rnD&vQBxk70Fn6XO0u;*)Gjmcg7o5qrm+eVf3>588WCZ_k@KcE(EpxBwuD zj0|yhay)+G0>@mhHQBPDrZA@;fB4zM(`C@$VH{KVWOwZopGUoA%P%T>`(eZ3^OV+c z8jIrX`t<3XpI@AikN~(ifRbXBl>p=&-TCMCt-E%ePc8%A;JLY;gT|vA!{n#IpOGP9 zxyxs%?bS=a(UtpK}MwDp%P{^<4I z&kk2Pb= z+xERI9s3{|wY(A%pR=d`?A~K4&nE#80zmSu6Bl;;#0A`pkIW{Oq)A+t&?!>t~mD)^zI>{>-p3fU_i77sh4H)Q(71el){~5q&=W zbRz({!uli1R8&at`Oo*LSrbGvC%UU%Wpf3C(~E5(4F zAL#pmy7w@JcL1lU;Bu3MhJ9DQ+gxVQDm^b6<&3I_GL`R10 zKXl@ic}r=!DsK0^H>bZg?fHb;>9m*?v~|nitvmj-AOjZom8+Mx3u*+{PoP65a+aATuFz!IGqhsl)QuPtWhEy;hT(>M><*3M=#)R#3KAvHGz7F4H?w>!iQ%W5!8 zE@pXql8OZY*g>2`LJFC0c)l9bcR^xFn!_@@RG}E&JL3IMH-XTnL5I1jz9W?GJ_sa= zrFnE_Jg|5l-~g!EK`6?U<`SMku4~R8nGiH?=$Lg|e}q^3Zqts1OTW5v*2nM8p84XK z_{20bMX?+o666;XpFHQ?6_#&1L`RGpIVd})z}e9ru_wTH+M^Ne%hAwkJ$nGE5gsUF z$pdLg28oE97f57?TrMjrE{TX58RX;Q=kDa=u5?hT6biXQNlGPBsg#f_WJ-Ib6pm<# zR3eiRB#D!R2rN`8m!fxayNU|HY%~e|$FOFT$!s*3&1St$udURYjPL_W_*YLEjVAb6 zahWl9I1uaJMZ0}qZC-1#g+ zqAa}pUCxLgG>>tDr;eZj>|qqJJYWR}gqXAl5tInjUr;y^QsCePoZLZcH{j?oQoX?h5F`=cSgOjh5{93{#l$6-q5fC3) z@uYj8_tzJTSH8f+?5)hp@^W{PkOX8r&>q?J+aGU#^u?X3Em=5g+Jun_Noi2sz<;GO zX>n08Fc>j{tSf{NZ+cn<5mL^TWT~T6aJXu9CL9w{A-p10ufkCU6o~!2v1=xEadG_(3_!pr+L~e?6JzRdb5$Q$#9`*ERhNt3nwI` zR7Ofs48uth6W@pg5n>aAw-AP%(BX^_Tg6&lh06kHh&nl6xpfSHa++dkim_w`wd4~P zbNWJ92)j+dhbpVk%jI&An=5?U7}J@c^V2YAFSjLo64$=nXTn?WOc*fh?YB$}`_7Wp z8@E=?#^E@=X8FPq&-6{YoleohKEM)!kP!Hl>$iaaFoY!eI$ZcT($rQwBM4*ALL0<8 zASgGtw5&{r6PU0&1C9zP5eicEYSAu$OH0WB&VDGxGr7t4IHalqCWW;9n1!K0FexMe zkqI^@UqvbJBbrtId%>y92^k7_nl~ANv0N0tNYyEP-7_MZ3bfr*aT|ZmNJy00sr3eZ z6&eJ3D7->jhM|QdkQB`jWSOIr3rN$-O7mDLB0mJ>o-_<#NB!q%;V;}TL}b?xmGF3wJ_&W<0?n}06H+bP4-DO!~ zfAe)&9X1*%4Y+(O3f+5+$Xh@E(DvPv=Fd;d$P)}IT96aM4mGs!3b_kJC6pQ2*+o)2 z6+p{qy%vQEi)~Z@rDeK1F~+5RALgeU=YIMW{8i;b?bgbF_x2y0oE#HVGQ8cK8Jfz^ z&c1T&$cf{pc3e!gpTAS-=55YO0vPrm0f$s>&PtXW%LqHCOP6n5zjmWX&u(f**n)(< zyb|gW$SNTwAlo2t%*920>D0xm85+r$A*`mXNmPJkBuWM7^vt^TKlK{-f>vO!W+-RO zl<)>3fFwzc){vK1cYl(R`MUE7tJ9FIv5NyM3#6rqmb&t23CU2}%wrUs;Tsv?Zmw zjo+>AXAm-o+Keq~gJ`}Y|^rN=jkO>PmC zF35J9{?W~e-)~s{#o#GZGcpSZf;5`Ukbk77WnR5{eZ+|2sp+}<_WqT2>t<9`6soTj zk|n9se6>@xk#~kF#%wev$6!iF`!NfYgI_62k3V?vIM7!LErXLlrIrLmxcLQ3oIQC% zr8)Ul{W-z#rWWTbFhZ6xn&}PeH^w*9;&yvIO|#`N=#-vmD=?mC^oI%TF#6h}h=kBYTFt^J44lmBqoKeS{ z4FWmi`6^`a^?;+vp#vHUxQPQMz0vdMR18L7Yx>{U4?u)-pr4R+gRWZn|LZ#=uMm*I z7gEY?qVjR>N1zWlT@yKEHSWwRyz}4zqnIMF<+gR*I$-j7@S8!rZrLATf1QFIp)~Qu z_b(hWiX4GCTUR!pz5AR+LGRDUH+%N%21hCLu{(pKc5Mcjlf%(rHCz%Aq zfF2)gaWUwsm46>zv53fulq}-VbNKy~0d(XD1B0MX7JRp-WW%Pn3o0+2+5%(?WKZXk zRs4DD68I3KK~?@S|9>B2Hj}nfUE?=cU0k@-wdqmoR)$Ae*O3hY~J$j@G?+A^7|)mfFlzJH)Jk{!^n+A zOrD8P`1i|CjC>*-rr!U4e1+WGH>eOZuTS=1YmowL-+$jgH)jFsOLkRLZpWy^gS9J_VP3IJ2SlAsaiex&gJY zK7C?f`p3x1&dAR7_tR_qov{IKdHnms#K{L5Q~&q(|DXRXBI3aQ<{L-`cjCZofrBqgWn|}O09GZy497IccSC`X*Wu)2`1AAsub&{-GJ*%@hsYs% zEJNuuS?I(%6SQH^$TSoj&-nlQXIRSq2W>SEkuV?Kr#cEo6UQhRO&p_OG;xfA(Zn$d yMia*<7)>0bU^H=zg3-h=3PuyhC>Xf_Aix0oWxbXDgxcQ#0000I6=(qUn2$%8lbiNG5AeyGvxTLwwygYrd_CR7 zfYu0vlQ0K|ySqEsod*new&LIt5)$IzncmKDezlu+6gf*OPo{9pomxY_VI=~zeO0r_W zr!Qa&8w+7eE&*Okr~nisz+-6%;^l{OgP{CePYXndhfl~t0LClG_m7?b4bLmb$Im4t zFUQ3tBgMrf$0yA#z$Y!oEiWh}D8)%5CJ8oH+vyB_fLf#qfK>M#u z3)}o}EQI)>7J@wHAYP~?4~Ul!!U=*x`ME)S7J`EOLIN;zelC9CfAALnBZL3$)F;VP zBu@Vj5{B>#nDav|p&&jXOI{Ecmw+Hh2*xJ}vV{B<3kg|Ra&ZDVo+xtsZJz(pO#g_U zI`r@HzoYSV`R{PS9G@o2`Dt_>Pdv^60BSiUSt(tQ`Te(;9=dY%6)hL-7R!p#`qH%6 z-qCt5tDoTrXVW^;awF$v1HqiTVS*aEvI+!*1k?xsEJjaj&ixstiuAJ&k|eQ+iN&3^ zTd-c`!Ji)pX{rQHp4P3FCR6{0mc#NAovrl8yDeSUFu&0Kl}kkQio4t00cs(kWCzcO z)kD?p#}DF|v9!;wrTy66kac1BT{l=?nJ(f=#bUiEE~G>80UmjMSon4;N)tm$P!C4- zR~u)~)3wv}k{$$*{MK)3uS4hzTyf1bhN_*@>wGBY~IJAY#N5PmC2TsYYOg0wt`Tva$f{x%GoBGv1$hm zFo%INt4=$I2yXSYL;FJ0&*ffl@m#Dno!@Y;t)`Y!$6 zh|!XGza95W(me_|Dy%s;KuI$DnauI1@%}V6SXs$!d%pd3A`+l|>EQK%1YvwO`B3&T zcXs>Cq|-Kmj`4iv`MLh>b0w?XC=E4jMp^5;E*WX*$RHCGVjNo5_Y1_bE64Bni+Z7@ zTq10{Y+wWM+v4F44<)1heAN;b^PeJX6S-5O1nhXIy`5wPL7%iS*YtYPrtfz7P!uP# z4V=wP0@ULgS57<1<$Puq-QS(plPEKJ{i#F8PYuUoov-q<9Z4k&41Jwi;wKDW+T%A- z+E3uNuogsXWn!aE`~Ha`uK?G}1iR#W*-Tg9ctxsiMSbb$qKMYA7(JL@3~4(LiF1JN z2L^y&S4#L^ec|_TzP%j|pzJOJ&KX!z5|Df1YxU}KCU;U-)z#Xz;hptQYtgzYv>Lwu13`nxfwa~2IC0C?r(X_pjC>O*8YDPj-03)m)S;FKDFfmbp4 zljFW>UrN#yMH01B_v>S4b$S15W4)Z{QD*LXup14GK_<2wLrq)y&ZG_>OeWVCQlWLFm@ zKik*QZ4xzL9f|HC}c20&im(q;PH;<&##S3_71%`)4@NB zqO=R}0ofGq8|nM~48B^7>{~GxSQZh=cCTY!I4Gw@(-cbwT-EfT7?Hgf)lUo3j$i#z z(Y^df{Hm|@jlpKmgAD0qhsznMY5T==%`Hz~kfoKUxRG~5^}`aX*BO1=`5P3AG<$;U zA-ny^Mm-jelh_={y^V-#+LX=q?CC<$m@${*@cSI|EhYYE9LU_hlZka{?RRdwdF$)A zS_3fV_vKO+dgv&`Vj$IKa%;NGqNy7Sw)Vljy4lID=XgX#MH1)pl&4mq6nRJ`EqmkS z?zrEx&L0Gd`2BclH13YR`lHUP0}Qe?KXR#%oS63ODaG{T*-X0)yg5HFx&j5bqDrA~ z?@T7VEPuS+6tI+tizai~HjrBCd<$38`-&E_@T0^-m6_>kgxo11lAW!ZaEAN~@_HMWIl1H*1%QeC+9u@LhfYj6I`Ev+ui_S; z#!dpt-qWtR+|$pZg3c%R=2l~OrzvYbscM8x=m4Q?9Kvg?m@SyiV>!l5G&?8?H%Enp zL(F$&xLWSCs|$gnR`)SnS?v@3uY^4n-{vJ5*%~$j;YX!jQDKorp+vnz{bms-(wmEp zI5*EOdKpx${qYV3TZ{d>28pmJYz<{)BDv2vzNlAY)X(whP`_=EkHY~BW_gR@%w6lp zy%vmF4}N>!8DpsBaRNvdB6~hWID)ITR|lq|k}mJB3`$6gbALGs1PvI%50XGXKmOEU=~4Kh zFi@sPiBG1J>w*7yD-1Y*-J68|c~=ZN#iI44L+ykHCr-1LwL6}0kPe6;R3y->v(~WZ zW}kgh?ZxEc=B+Y*r^>t)dP8Z89Hd0q$L>$(FC8mfVCrzLN1Ge%(MG3_FGu)ofz7|K znAGwBTobtQsaK)?{H9j$W+VX;NkUkkc^NA(`T@`@$k>?9bFnjq|B8=FrDk<7WI@L; zMavwAh!;Z0v~AF`aZC1su~{(vp|-?Csr$`xgJmu-KMshUSnfC4biDZaA|-8CcJQC!iVPecG)Z zrxLU2Z^k;=T(zA~>{LVr<%p5&IBAo@jzF9Q<%Gf4OgTuB9G?OHwhesxNr^NZtgN8~ zmX=JH+bIfMm;mD*ayVrmiL~elRG1n=vTge9qFMdgJ8M4MJgv%^5CC^9P_Oz9Ec$(i zJehRc9LH1Ur(ZkUqq1d-=7-aI{bTECMWvF~iOIUvl`ck}jWfl3#XNR~gU%gi{S0x} z*6m*fYil2wu~i}>!2HR($e-Q*q~1?_*Ex83$|?66D*kX8q5~#hu9gz4C?m42b>Y2|5s+hzO`gM*)z_SZ8-LN_Exk-tU%E7M?vbsf?7Z z=V{Y6-h6)RO(ZLc8&3pIE3Rm5^mvTPv%;f!CHij7-a$=GCC!ZN7ys|;IA#qAr^i|} z>{q595Im)XCB%rTGfCIg5Bj)v!#36{m(MCkjc@s;`Iw`!un?IEaY9a#W8VS~wtsev zMTg4c6tjv#FtoHEq6~weKo0h2TV_-x(n!0{bWA+K&D z*&q=(NFoPR#q_AOP(eeZbauH7e+zR;@<3%MkM=cT+@j3iClzOnAztLJE!Ricuz$E})`3R`%C>m@B=G|nvb6fR+9FvGP*czlN)3U#0snDP@2`8GpckKo{ zZ=HNKO-yGk$8iLM#r+0WzRk_eB}evs1G3wD+wOwJr%P8B{~MGX(pC zp4YBW()RWYuvQc|SC^GEkM4B((8(Fgi)@We1QsMP z5%XZB=#t6ExC$HRjci)mpZVMI86}qe`ow`?j@a!VU2c<;64Y}Q`m!BZn`DPXvqiJ4*sX;8zM&pSxo* z?+b%+{md-~{)Kkm+f2Vr@<%hWgb2$w{xvZ~ri0?a-1XCFJ*d?6GdE+OsBtq+W9q*H z2GgGnM%+=aG}zWPXIBx_x&0FGsug7&$v>BvE;4lwvd#9Oz%nqrjd+0_uPnzCAj5+? z0w{Sy_il4o=^39S(pbFj#*hGG!h~uzOgZuQct4GuE9dEw&uKHVfsILSVQYeMkg$C* zW|$Jcw=^JLTz5B6@2Xre9<)`;XXotVte!5&<+3@fA%4x^;j{kIN7L=j^2cxg-NC`U zDj3}Wq3#fAmcOXYgni}flV(RTuhy#xl~<8iR<*>zp$cdkleuziByErUQj9B3(LYP` zR8y|^KrU3Jn(SVW_npj)jEwXOQB)Fsq8HUoE}Lfb@Z2BHh$;u;gEn225?3Tbshh;q zLYEfS(`Qz#-fye=j$9oZ9Ix7|tE(knVv~Y#L?0VIi^sA92X^nk(J?6u#iURA~uIY??4hvrT0;O_je=O z?15j0IFH)#mZz=uYtecbP>O-*R^zL#)Ju4&NjagoDmRDuLo7Pl9FKJ2-g`cwNz zv=jK4gcP(dJh=bjAWjDamEYNyKQ5Fn)VHx3WqjYTby4e6 z0GQjuMnLKe0uC#iNNB%GtiM)SF$zZ`+RY5y`QkLbjuYm&m@oGk`-jE8w+QjEO|I@a zT=+yIv!}8<6kkJK{lfp`6Au2Bp!3=GLz{P+q$v#no}z~{{{C`&@~ql#4jpaO>H`T6 zWjvnYHAa;}vGb{1d~t(%d-BM2{y8k>9L5T)i&w2-1MtP6i@E-@P5IhBSVj~-`jPk<2d(S%-3me^ZHY!zPzVw z^18%2N%?uua*#y{&P;{TR)_a=iC!rF%L`Kxs;Hv@#f~poE z{OEnQKWE0Rv@R11=L#^z#nZ3#L%qm!r;iM=zvedg_?(hgpkMk_fv)DRDw3twzgC+9(Ft zs2?iN(EoH@nxygCU;*%ADq|-pBpCZ6YbnLNeudyltfcu*cTvkDRl4uSzf%!6!3*Z@ zXc#ZU>puq>>1(75cH7r~pP8ziPfm;>gz_dPCh|iMaiLOVKM3+Z`CQ1{e^CfdZO(!i zf|=83D%;H)@B1sCg`>v(Od%S}dd1Rdbu@c7p`LNGZC5$=DPkCPC3nD+^Tv3q7?`g( z()rM2V3s}<^P3~-TRs)`dpa4f_jW=QQkuZ6{O#Nr`u+@wx z$m%NS$8V`9T-(rh4?JZ#-vq)K=HWOKoFlOz(L>(mf+}JcBnX*tfKtI*)9jg}S#$G3 ziF2pRgFvTFqH9~v07sToE_v0<-1QT|myaKnFB-BEGMsOw#DnrTK9ZPftBP()Ei}MA zyuVfZdgB}Kq0m!Lcd0s^k)UxwZ*Kd-d9EW$rI6uYZ1p+Dt;H}JQj*39_g*QI`!U9? zU9H^sUeXwc;8Gv`khw%`|4=X)E+;^{aw+Dh*Nh$g)eJiykPu~!#O+qvE9PK&5$o~h z%}$G-At?0wC-OBewxc9FagQNpn5BAoT z-kQGP4Gq(^wJC3RmQJi}6}*Dr3}lED;8FcBzp6r7^mfCbMSd?2u=`qcr`<-P^l=Gs zlj>jQ;XK6V*0R2JFlo&jmqpg#v`Q7gJ8RlcO#YH_?Q0AFxzKdb(}@y%ARBwi~9@+M>Q zkOt9@f{zm!HP{=8ogRM0Jb|9%$H}7URfad0Mv-GyUfD2{28!HF?XWKunmxUKR=sie z9CKN>ejxM@9cJ_SsfOA|?7=lT)@wT^k<13mS?#R?t81X+vN&v9JR0+sEf7MnoT$m3oBWvd~OpD ziRyVNq(*r|t&)EQgEdBgNEStjEe{%-3%wI2-q`O@?-N}sTu7pQPkMI_ig*VYwSVXF z-h_^|tm*w(q)TsXCx~-{uU=PaxuFsKky`4vZ*{c5=m4lx4<+hS3QLE^NhY{Bp_w;) zT>FLdX2cr`lH;tmlFd7BdTDUEN@8#Vz7!yWY8{H^!n;K^ga3%X!}RW|%)x3{Ce&`0 zc%1Uov9=dP>Lr;Nuae6kp{rEJDEY{Q-#e^?A-DA?{Xs7KCsBp+(w}cJ`Esin@w>_2 zm}zY}(r(CYADkWm@7cdmf>>BFtXov*(tAc-X-P! z&B~o0WXSwPRl)f5Lj*{tmk(SisHvmr8ioit&1^E8Nv*(Q@#q(|8wB~Wk(p3#7N!*F zypAeHKtv61ax2Xx=#5DzS;hPNRq;PE##ST1kD5FJh2bkoaswkJdYhArUaR|aJEzdD zPCLY^TblP$>!o}o#Y_V{mt}UIn(7OrFL<3uHMxq zU!DysYB}OoTU|a_Ihly*bR$ID}#PA@6rOoqi}!cs7V=Vn}N;TyY-Jl#4wX zJuY->>l)d;+MTXR{4HI`e`I+7M}z50t=c-zn{wZSZQ*xazPZ~XUbRO>Sy6AB4QATB zXNtZ*JSQZ4g;lXk6~HpTvDV+TJn zbm8TjpH}E73B7s81<}$fNwVxn$;c2sKHgDm1p#! zlwESx`GxXzC>k3!?ef^_@o?AVEI0fIaf2gVP0dEI$^C^&ZFaYk!+QHcaNX-HBBJo3 ztoZHaI3p$d)ebX1!^!M;jVRpPZ-xp`YW71|(TJq#-As5kt`s)XK0t`DR(c!=&ue5Y zM5B|z_G~*8O7Y+BeCWPM$EjXmr>J`<5@UWloxrRX&?e(QY~P@CyW^a@_yh7lSDIKXI*bOTb+j28r=|b$`#Bo8 zH*+{!<6tH09LhFstjo&;{HY&X`P!S{xozoL-0}>AYn2=23%{|vTfCR2!TnnKNYHGc zyP*!k+jM07v`nx@IQqDSs^a|cNC~Tq zM-Ph5Na<#`2y^Cfu-M!|nJ^Q6gxi{1VT!?6u2F&d@DPsC$q?lxUSQNF=}w#o{}&)% zpC%I{hDW-Z2wI?YyoE(>cbD7l$m`d8hyGxy8hH8>PzbzH-{Ef~||A z$mTcb@6UUKDSu7Qcp|iJz8I`0Z)Nw7Fl|LR_MiXGNr(h%YlXZAQ$81@wnC@RB!83= zuc9fKHJB1jY0tp>kgbj7=J?i6pD1%d9C~7k>6~)s*reiY*gy zLC0l^UH0_6Qgl$8)O6cpX5M*7mtNapb5cI-b9kO8xr=WqF4B9y^IlJJk!4M{k_Tl_ z((IfWuXL!Mb}CN&hq#F-uNzWB2E{%H#^$BE>)YzEQ`2)QLF6KSvghznNk$H3Gm`Q& zZkTOHYfG;6)&`rNJ*PwWfgb62-q-o5eDBtcQ_Af*Ed8)*fu?;AfF6FiG3FO{h7KW0Evo=|(K0ZM*<5o>_YzgJ!J_Jn}t3011!t}Z4T!5gEDdK9m?I+JVd~L zyJ6TkQDHgv1FQQ9^L1L{a|_~L`4#(XWzV^57seo6AYT4eM7_o7)v=@)K)^`br=p@h zH6PcxJSk_EA>G-h!_PGfX*~qy?qzniGDUMKm|l^w%>FSdl16w_$!FmN_VIx1UDnme zLj5F0O7y@Ug?z_DbiEmJZZ(VJKt@q$>w>RM?{^+kw*)G5+4(*Y#;ej2#i0&l)uu(0 ztbVmvfj6K|#qgI~1=Vb<98x75Ce78*4a)%4SbjcXkb*#khxNpQOhXu&uc=6SR@OW$ zdgR~^a$ntY*i^H;a-76g*?!qq=IFk7ym_KVk~HRYOfV6Q8bq6$lyrB2DwppXBF{8+ zJy}21cTXRg*zx;cgW*60jf=Le@rNC)`It$+fz0Pjyf=dkzC0lcu>q46DE!?kE#Jer4m*yHPFSe` z=$QhL??nWp&uv#09X&bh%4&a>+2|3P>|vw5$PKr{#EJiSqUcwCo~(u%NiH$EMMs=1 z{bGVk-T#s;wDU*5lz!2Vi*RLku`G&E;sQT8K&?kfa@wNf3vc&|YFR@CVzD6;7LaQbjGhd^}m%6g-12uBteI*1&j4D^vxTjqA^mVi!pDkpqHZ44C zV00g}wIJ4$w$#*{Ut_KK^o*5*?h|*>Fx#Ruu`=1&>Gv?(O!6j6a&6A%jBhKhrf%L{ z+Ga4>VBm(M(XZ4YUK-a}52iA{Vh$!p#*!qys~jNkJb!!FXWYB4b6R4%4^CrgJ#GpynZI`MX^h=?z{PI3=7Tc*VWNEsQ;sHL`@s_o$aHKwL>icHS zUXX7L2AZZ`2A$m+sj)aWNgZ&?*=rM@VG`8OGle*J=_?QslgCK*=7(NCc6|7WL|Nj* zf-frF0|wd3jDj4bA!{PS_>KgBNHl!;+&9=8b%}3g@XFQu7ls9l8R%^Eb$4t@R68HW z3SB1)EwpZ&U|W9D4no=UK_arMl&BZC(X~9XIlvdT+qF_zL>&bZx-^$B*QW;~jNJ-Ibk4A7r>GThScWh8G;* + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Ivy + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.google.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 6 + LSRequiresIPhoneOS + + UILaunchStoryboardName + Launch + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + + diff --git a/example/ivy/ios/ivy/IvyController.h b/example/ivy/ios/ivy/IvyController.h new file mode 100644 index 0000000..3bca62a --- /dev/null +++ b/example/ivy/ios/ivy/IvyController.h @@ -0,0 +1,20 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#import +#import "Suggestion.h" + +// IvyController displays the main app view. +@interface IvyController + : UIViewController + +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomConstraint; + +// A text input field coupled to an output "tape", rendered with a UIWebView. +@property (strong, nonatomic) UITextField *input; +@property (strong, nonatomic) Suggestion *suggestionView; +@property (strong, nonatomic) UIWebView *tape; + +@end diff --git a/example/ivy/ios/ivy/IvyController.m b/example/ivy/ios/ivy/IvyController.m new file mode 100644 index 0000000..971a872 --- /dev/null +++ b/example/ivy/ios/ivy/IvyController.m @@ -0,0 +1,179 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#import "IvyController.h" +#import "mobile/Mobile.h" + +@interface IvyController () + +@end + +@implementation IvyController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.input = (UITextField *)[self.view viewWithTag:1]; + self.input.delegate = self; + self.input.autocorrectionType = UITextAutocorrectionTypeNo; + self.input.keyboardType = UIKeyboardTypeNumbersAndPunctuation; + + self.suggestionView = [[Suggestion alloc] init]; + self.suggestionView.delegate = self; + + self.tape = (UIWebView *)[self.view viewWithTag:2]; + self.tape.delegate = self; + + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(textDidChange:) + name:UITextFieldTextDidChangeNotification + object:self.input]; + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(keyboardWillShow:) + name:UIKeyboardWillShowNotification + object:nil]; + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(keyboardWillHide:) + name:UIKeyboardWillHideNotification + object:nil]; + + NSURL *bundleURL = + [[NSBundle mainBundle] URLForResource:@"tape" withExtension:@"html"]; + NSURLRequest *request = [NSURLRequest requestWithURL:bundleURL]; + [self.tape loadRequest:request]; + self.tape.delegate = self; + [self.input becomeFirstResponder]; +} + +- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField +{ + if ([textField isEqual:self.input]) { + textField.inputAccessoryView = self.suggestionView; + textField.autocorrectionType = UITextAutocorrectionTypeNo; + [textField reloadInputViews]; + } + return YES; +} + +- (BOOL)textFieldShouldEndEditing:(UITextField *)textField +{ + if ([textField isEqual:self.input]) { + textField.inputAccessoryView = nil; + [textField reloadInputViews]; + } + return YES; +} + +- (BOOL)textField:(UITextField *)textField + shouldChangeCharactersInRange:(NSRange)range + replacementString:(NSString *)str +{ + if ([str isEqualToString:@"\n"]) { + [self + appendTape:[NSString stringWithFormat:@"%@", [self.input text]]]; + NSString *expr = [self.input.text stringByAppendingString:@"\n"]; + NSString *result; + NSError *err = [NSError alloc]; + if (!GoMobileEval(expr, &result, &err)) { + result = err.description; + } + result = [result + stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]; + result = + [result stringByReplacingOccurrencesOfString:@"<" withString:@"<"]; + result = + [result stringByReplacingOccurrencesOfString:@">" withString:@">"]; + NSMutableArray *lines = + (NSMutableArray *)[result componentsSeparatedByString:@"\n"]; + for (NSMutableString *line in lines) { + [self appendTape:line]; + } + self.input.text = @""; + return NO; + } + + return YES; +} + +- (void)textDidChange:(NSNotification *)notif +{ + [self.suggestionView suggestFor:self.input.text]; +} + +- (void)suggestionReplace:(NSString *)text +{ + self.input.text = text; + [self.suggestionView suggestFor:text]; +} + +- (void)keyboardWillShow:(NSNotification *)aNotification +{ + // Move the input text field up, as the keyboard has taken some of the screen. + NSDictionary *info = [aNotification userInfo]; + CGRect kbFrame = + [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; + NSNumber *duration = + [info objectForKey:UIKeyboardAnimationDurationUserInfoKey]; + + UIViewAnimationCurve keyboardTransitionAnimationCurve; + [[info valueForKey:UIKeyboardAnimationCurveUserInfoKey] + getValue:&keyboardTransitionAnimationCurve]; + UIViewAnimationOptions options = + keyboardTransitionAnimationCurve | keyboardTransitionAnimationCurve << 16; + + [UIView animateWithDuration:duration.floatValue + delay:0 + options:options + animations:^{ + self.bottomConstraint.constant = kbFrame.size.height + 32; + [self.view layoutIfNeeded]; + } + completion:^(BOOL finished) { + [self scrollTapeToBottom]; + }]; +} + +- (void)keyboardWillHide:(NSNotification *)aNotification +{ + // Move the input text field back down. + NSDictionary *info = [aNotification userInfo]; + NSNumber *duration = + [info objectForKey:UIKeyboardAnimationDurationUserInfoKey]; + + UIViewAnimationCurve keyboardTransitionAnimationCurve; + [[info valueForKey:UIKeyboardAnimationCurveUserInfoKey] + getValue:&keyboardTransitionAnimationCurve]; + UIViewAnimationOptions options = + keyboardTransitionAnimationCurve | keyboardTransitionAnimationCurve << 16; + + [UIView animateWithDuration:duration.floatValue + delay:0 + options:options + animations:^{ + self.bottomConstraint.constant = 32; + [self.view layoutIfNeeded]; + } + completion:^(BOOL finished) { + [self scrollTapeToBottom]; + }]; +} + +- (void)scrollTapeToBottom +{ + NSString *scroll = @"window.scrollBy(0, document.body.offsetHeight);"; + [self.tape stringByEvaluatingJavaScriptFromString:scroll]; +} + +- (void)appendTape:(NSString *)text +{ + NSString *injectSrc = @"appendDiv('%@');"; + NSString *runToInject = [NSString stringWithFormat:injectSrc, text]; + [self.tape stringByEvaluatingJavaScriptFromString:runToInject]; +} + +@end diff --git a/example/ivy/ios/ivy/Launch.storyboard b/example/ivy/ios/ivy/Launch.storyboard new file mode 100644 index 0000000..10ce963 --- /dev/null +++ b/example/ivy/ios/ivy/Launch.storyboard @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ivy/ios/ivy/Suggestion.h b/example/ivy/ios/ivy/Suggestion.h new file mode 100644 index 0000000..fa1efab --- /dev/null +++ b/example/ivy/ios/ivy/Suggestion.h @@ -0,0 +1,21 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#import + +@protocol SuggestionDelegate + +@required +- (void)suggestionReplace:(NSString *)text; +@end + +@interface Suggestion : UIInputView + +- (instancetype)init; +- (instancetype)initWithFrame:(CGRect)frame; +- (void)suggestFor:(NSString *)text; + +@property (weak) id delegate; + +@end diff --git a/example/ivy/ios/ivy/Suggestion.m b/example/ivy/ios/ivy/Suggestion.m new file mode 100644 index 0000000..509d587 --- /dev/null +++ b/example/ivy/ios/ivy/Suggestion.m @@ -0,0 +1,198 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#import "Suggestion.h" + +#define maxSuggestions 4 + 3 + +@implementation Suggestion { + NSString *text; + NSRange range; + + NSMutableOrderedSet *options; + NSMutableArray *buttons; + NSArray *possibleSuggestions; + NSCharacterSet *breakingChars; +} + +- (instancetype)init +{ + CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width; + self = [self initWithFrame:CGRectMake(0.0f, 0.0f, screenWidth, 36.0f)]; + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame inputViewStyle:UIInputViewStyleKeyboard]; + if (self) { + possibleSuggestions = @[ + @")base ", + @")debug ", + @")format ", + @")maxdigits ", + @")op ", + @")origin ", + @")prec ", + @")prompt ", + @")seed ", + @"cos ", + @"iota ", + @"log ", + @"max ", + @"min ", + @"pi ", + @"rho ", + @"sin ", + @"sqrt ", + @"tan " + ]; + breakingChars = + [NSCharacterSet characterSetWithCharactersInString:@"/+-*,^|= "]; + options = [[NSMutableOrderedSet alloc] initWithCapacity:maxSuggestions]; + buttons = [[NSMutableArray alloc] init]; + self.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.05f]; + [self setSuggestions:nil]; + } + return self; +} + +- (void)suggestFor:(NSString *)t +{ + text = t; + range = + [text rangeOfCharacterFromSet:breakingChars options:NSBackwardsSearch]; + if (range.location == NSNotFound) { + range.location = 0; + range.length = text.length; + } else { + if (range.location > 0 && + [text characterAtIndex:range.location - 1] == ')') { + // Special case for suggestions that start with ") ". + range.location -= 1; + range.length++; + } else { + range.location += 1; + range.length -= 0; + } + } + range.length = text.length - range.location; + if (range.length == 0) { + [self setSuggestions:nil]; + } else { + NSString *prefix = [text substringWithRange:range]; + // TODO: make not so slow. + NSArray *suggestions = @[]; + for (NSString *suggestion in possibleSuggestions) { + if ([suggestion hasPrefix:prefix] && prefix.length < suggestion.length) { + suggestions = [suggestions arrayByAddingObject:suggestion]; + } + } + if (suggestions.count > 3) { + suggestions = nil; + } + [self setSuggestions:suggestions]; + } + [self setNeedsLayout]; +} + +- (void)setSuggestions:(NSArray *)suggestions +{ + [options removeAllObjects]; + + if ([suggestions respondsToSelector: + @selector(countByEnumeratingWithState:objects:count:)]) { + for (NSString *suggestion in suggestions) { + if (options.count < maxSuggestions) { + [options addObject:suggestion]; + } else { + break; + } + } + } +} + +- (void)layoutSubview:(NSString *)t at:(CGFloat)x width:(CGFloat)w +{ + UIButton *b = [[UIButton alloc] + initWithFrame:CGRectMake(x, 0.0f, w, self.bounds.size.height)]; + [b setTitle:t forState:UIControlStateNormal]; + b.titleLabel.adjustsFontSizeToFitWidth = YES; + b.titleLabel.textAlignment = NSTextAlignmentCenter; + [b setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [b addTarget:self + action:@selector(buttonTouched:) + forControlEvents:UIControlEventTouchUpInside]; + [self addSubview:b]; + + if (x > 0) { + UIView *line = [[UIView alloc] + initWithFrame:CGRectMake(0.0f, 0.0f, 0.5f, self.bounds.size.height)]; + line.backgroundColor = + [UIColor colorWithRed:0.984 green:0.977 blue:0.81 alpha:1.0]; + [b addSubview:line]; + } + + [buttons addObject:b]; +} + +- (void)layoutSubviews +{ + for (UIView *subview in buttons) { + [subview removeFromSuperview]; + } + [buttons removeAllObjects]; + + CGFloat symbolWidth = 40.0f; + [self layoutSubview:@"+" at:0 * symbolWidth width:symbolWidth]; + [self layoutSubview:@"-" at:1 * symbolWidth width:symbolWidth]; + [self layoutSubview:@"*" at:2 * symbolWidth width:symbolWidth]; + [self layoutSubview:@"/" at:3 * symbolWidth width:symbolWidth]; + + for (int i = 0; i < options.count; i++) { + NSString *suggestion = options[i]; + CGFloat width = + (self.bounds.size.width - (4 * symbolWidth)) / options.count; + CGFloat x = (4 * symbolWidth) + (i * width); + [self layoutSubview:suggestion at:x width:width]; + } +} + +- (void)buttonTouched:(UIButton *)button +{ + NSTimeInterval duration = 0.08f; + [UIView + animateWithDuration:duration + animations:^{ + [button setBackgroundColor:[UIColor whiteColor]]; + + if ([self.delegate + respondsToSelector:@selector(suggestionReplace:)]) { + NSString *t = text; + if (t == nil) { + t = @""; + } + if (button.currentTitle.length == 1) { + // Special case for +, -, *, /. + t = [t stringByAppendingString:button.currentTitle]; + } else { + t = [text stringByReplacingCharactersInRange: + range withString:button.currentTitle]; + } + [self performSelector:@selector(suggestionReplace:) + withObject:t + afterDelay:duration * 0.8f]; + } + [button performSelector:@selector(setBackgroundColor:) + withObject:[UIColor clearColor] + afterDelay:duration]; + }]; +} + +- (void)suggestionReplace:(NSString *)t +{ + [self.delegate performSelector:@selector(suggestionReplace:) withObject:t]; +} + +@end diff --git a/example/ivy/ios/ivy/main.m b/example/ivy/ios/ivy/main.m new file mode 100644 index 0000000..44798de --- /dev/null +++ b/example/ivy/ios/ivy/main.m @@ -0,0 +1,11 @@ +#import +#import "AppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool + { + return UIApplicationMain(argc, argv, nil, + NSStringFromClass([AppDelegate class])); + } +} diff --git a/example/ivy/ios/ivy/tape.html b/example/ivy/ios/ivy/tape.html new file mode 100644 index 0000000..67369b7 --- /dev/null +++ b/example/ivy/ios/ivy/tape.html @@ -0,0 +1,44 @@ + + + + + + + +