From be6b1e5e74b9c2c303d95895d56ae9ad41f6a868 Mon Sep 17 00:00:00 2001 From: ZeroJianP Date: Fri, 19 Feb 2016 18:30:31 +0800 Subject: [PATCH] first commit --- FirstView.xib | 66 + Podfile | 5 + Podfile.lock | 10 + Pods/Manifest.lock | 10 + Pods/Pods.xcodeproj/project.pbxproj | 502 ++++ .../xcschemes/Pods.xcscheme | 60 + .../xcschemes/SwiftyJSON.xcscheme | 60 + .../xcschemes/xcschememanagement.plist | 32 + Pods/SwiftyJSON/LICENSE | 21 + Pods/SwiftyJSON/README.md | 376 +++ Pods/SwiftyJSON/Source/SwiftyJSON.swift | 1376 +++++++++ Pods/Target Support Files/Pods/Info.plist | 26 + .../Pods/Pods-acknowledgements.markdown | 28 + .../Pods/Pods-acknowledgements.plist | 58 + Pods/Target Support Files/Pods/Pods-dummy.m | 5 + .../Pods/Pods-frameworks.sh | 91 + .../Pods/Pods-resources.sh | 95 + .../Target Support Files/Pods/Pods-umbrella.h | 6 + .../Pods/Pods.debug.xcconfig | 8 + Pods/Target Support Files/Pods/Pods.modulemap | 6 + .../Pods/Pods.release.xcconfig | 8 + .../SwiftyJSON/Info.plist | 26 + .../SwiftyJSON/SwiftyJSON-dummy.m | 5 + .../SwiftyJSON/SwiftyJSON-prefix.pch | 4 + .../SwiftyJSON/SwiftyJSON-umbrella.h | 6 + .../SwiftyJSON/SwiftyJSON.modulemap | 6 + .../SwiftyJSON/SwiftyJSON.xcconfig | 5 + README.md | 27 + UmbrellaWeather.xcodeproj/project.pbxproj | 550 ++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 11450 bytes .../xcschemes/Background Fetch.xcscheme | 92 + .../xcschemes/UmbrellaWeather.xcscheme | 91 + .../xcschemes/xcschememanagement.plist | 27 + .../contents.xcworkspacedata | 10 + .../UserInterfaceState.xcuserstate | Bin 0 -> 181962 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../DimmingPresentationController.swift | 21 + UmbrellaWeather/Animated/GradientView.swift | 23 + .../Animated/InteractiveAnimation.swift | 68 + UmbrellaWeather/AppDelegate.swift | 63 + .../AppIcon.appiconset/Contents.json | 44 + .../AppIcon.appiconset/Icon-120.png | Bin 0 -> 12451 bytes .../AppIcon.appiconset/Icon-121.png | Bin 0 -> 12451 bytes .../AppIcon.appiconset/Icon-180.png | Bin 0 -> 25602 bytes .../AppIcon.appiconset/Icon-58.png | Bin 0 -> 3757 bytes .../AppIcon.appiconset/Icon-80.png | Bin 0 -> 6234 bytes .../AppIcon.appiconset/Icon-87.png | Bin 0 -> 7006 bytes .../Arrows.imageset/Arrows.pdf | Bin 0 -> 7084 bytes .../Arrows.imageset/Contents.json | 12 + .../Brand Assets.launchimage/Contents.json | 43 + .../Brand Assets.launchimage/IPhone 6PLus.png | Bin 0 -> 1838708 bytes .../Brand Assets.launchimage/IPhone4.png | Bin 0 -> 452057 bytes .../Brand Assets.launchimage/IPhone5.png | Bin 0 -> 535847 bytes .../Brand Assets.launchimage/IPhone6.png | Bin 0 -> 655775 bytes UmbrellaWeather/Assets.xcassets/Contents.json | 6 + .../Detail.imageset/Contents.json | 12 + .../Detail.imageset/Detail.pdf | Bin 0 -> 8170 bytes .../DetailColor.imageset/Contents.json | 12 + .../DetailColor.imageset/DetailColor.pdf | Bin 0 -> 7982 bytes .../Launch.imageset/Contents.json | 22 + .../Launch.imageset/IPhone 6PLus-1.png | Bin 0 -> 1889129 bytes .../Launch.imageset/IPhone6-1.png | Bin 0 -> 721206 bytes .../Launch4.imageset/Contents.json | 21 + .../Launch4.imageset/IPhone4-1.png | Bin 0 -> 444161 bytes .../Launch5.imageset/Contents.json | 21 + .../Launch5.imageset/IPhone5-1.png | Bin 0 -> 512162 bytes .../Line.imageset/Contents.json | 22 + .../Assets.xcassets/Line.imageset/Line@2x.png | Bin 0 -> 251 bytes .../Assets.xcassets/Line.imageset/Line@3x.png | Bin 0 -> 377 bytes .../Loading.imageset/Contents.json | 22 + .../Loading.imageset/Loading@2x.png | Bin 0 -> 2391 bytes .../Loading.imageset/Loading@3x.png | Bin 0 -> 3997 bytes .../Location.imageset/Contents.json | 22 + .../Location.imageset/Location@2x.png | Bin 0 -> 1724 bytes .../Location.imageset/Location@3x.png | Bin 0 -> 2769 bytes .../Logo.imageset/Contents.json | 12 + .../Assets.xcassets/Logo.imageset/Logo.pdf | Bin 0 -> 15362 bytes .../Shape.imageset/Contents.json | 22 + .../Shape.imageset/Shape@2x.png | Bin 0 -> 609 bytes .../Shape.imageset/Shape@3x.png | Bin 0 -> 1038 bytes .../WeatherImage/Cloudy.imageset/Cloudy.pdf | Bin 0 -> 4759 bytes .../Cloudy.imageset/Contents.json | 12 + .../WeatherImage/Contents.json | 6 + .../WeatherImage/Fog.imageset/Contents.json | 22 + .../WeatherImage/Fog.imageset/Fog@2x.png | Bin 0 -> 2254 bytes .../WeatherImage/Fog.imageset/Fog@3x.png | Bin 0 -> 3735 bytes .../WeatherImage/Rain.imageset/Contents.json | 12 + .../WeatherImage/Rain.imageset/Rain.pdf | Bin 0 -> 5095 bytes .../WeatherImage/Snow.imageset/Contents.json | 12 + .../WeatherImage/Snow.imageset/Snow.pdf | Bin 0 -> 4889 bytes .../WeatherImage/Sun.imageset/Contents.json | 12 + .../WeatherImage/Sun.imageset/Sun9.pdf | Bin 0 -> 5230 bytes UmbrellaWeather/Base.lproj/Main.storyboard | 891 ++++++ UmbrellaWeather/CityListCell.swift | 19 + UmbrellaWeather/CityListCell.xib | 61 + UmbrellaWeather/CityListViewController.swift | 172 ++ UmbrellaWeather/DINNextLTPro-Light.otf | Bin 0 -> 98404 bytes UmbrellaWeather/DataModel/City.swift | 28 + UmbrellaWeather/DataModel/Citys.xml | 2569 +++++++++++++++++ UmbrellaWeather/DataModel/DataModel.swift | 138 + UmbrellaWeather/DataModel/ParserXML.swift | 41 + UmbrellaWeather/FirstView.swift | 33 + UmbrellaWeather/HomeViewController.swift | 412 +++ UmbrellaWeather/Info.plist | 59 + UmbrellaWeather/MainView.swift | 87 + UmbrellaWeather/PullView.swift | 45 + UmbrellaWeather/Server/DailyResult.swift | 43 + UmbrellaWeather/Server/LocationService.swift | 113 + UmbrellaWeather/Server/ServiceResult.swift | 185 ++ .../Server/UIImageView+WeatherImage.swift | 41 + UmbrellaWeather/Server/WeatherResult.swift | 20 + .../SupportTableViewController.swift | 192 ++ .../TimePickerViewController.swift | 50 + UmbrellaWeather/WaterSound.wav | Bin 0 -> 191964 bytes UmbrellaWeather/WeekWeatherCell.swift | 34 + UmbrellaWeather/WeekWeatherCell.xib | 129 + .../WeekWeatherCollectionView.swift | 20 + UmbrellaWeather/zh-Hans.lproj/Main.strings | 66 + 119 files changed, 9702 insertions(+) create mode 100644 FirstView.xib create mode 100644 Podfile create mode 100644 Podfile.lock create mode 100644 Pods/Manifest.lock create mode 100644 Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/Pods.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/SwiftyJSON.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Pods/SwiftyJSON/LICENSE create mode 100644 Pods/SwiftyJSON/README.md create mode 100644 Pods/SwiftyJSON/Source/SwiftyJSON.swift create mode 100644 Pods/Target Support Files/Pods/Info.plist create mode 100644 Pods/Target Support Files/Pods/Pods-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods/Pods-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods/Pods-dummy.m create mode 100755 Pods/Target Support Files/Pods/Pods-frameworks.sh create mode 100755 Pods/Target Support Files/Pods/Pods-resources.sh create mode 100644 Pods/Target Support Files/Pods/Pods-umbrella.h create mode 100644 Pods/Target Support Files/Pods/Pods.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods/Pods.modulemap create mode 100644 Pods/Target Support Files/Pods/Pods.release.xcconfig create mode 100644 Pods/Target Support Files/SwiftyJSON/Info.plist create mode 100644 Pods/Target Support Files/SwiftyJSON/SwiftyJSON-dummy.m create mode 100644 Pods/Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch create mode 100644 Pods/Target Support Files/SwiftyJSON/SwiftyJSON-umbrella.h create mode 100644 Pods/Target Support Files/SwiftyJSON/SwiftyJSON.modulemap create mode 100644 Pods/Target Support Files/SwiftyJSON/SwiftyJSON.xcconfig create mode 100644 README.md create mode 100644 UmbrellaWeather.xcodeproj/project.pbxproj create mode 100644 UmbrellaWeather.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 UmbrellaWeather.xcodeproj/project.xcworkspace/xcuserdata/ZeroJian.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/Background Fetch.xcscheme create mode 100644 UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/UmbrellaWeather.xcscheme create mode 100644 UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 UmbrellaWeather.xcworkspace/contents.xcworkspacedata create mode 100644 UmbrellaWeather.xcworkspace/xcuserdata/ZeroJian.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 UmbrellaWeather.xcworkspace/xcuserdata/ZeroJian.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 UmbrellaWeather/Animated/DimmingPresentationController.swift create mode 100644 UmbrellaWeather/Animated/GradientView.swift create mode 100644 UmbrellaWeather/Animated/InteractiveAnimation.swift create mode 100644 UmbrellaWeather/AppDelegate.swift create mode 100644 UmbrellaWeather/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/AppIcon.appiconset/Icon-120.png create mode 100644 UmbrellaWeather/Assets.xcassets/AppIcon.appiconset/Icon-121.png create mode 100644 UmbrellaWeather/Assets.xcassets/AppIcon.appiconset/Icon-180.png create mode 100644 UmbrellaWeather/Assets.xcassets/AppIcon.appiconset/Icon-58.png create mode 100644 UmbrellaWeather/Assets.xcassets/AppIcon.appiconset/Icon-80.png create mode 100644 UmbrellaWeather/Assets.xcassets/AppIcon.appiconset/Icon-87.png create mode 100644 UmbrellaWeather/Assets.xcassets/Arrows.imageset/Arrows.pdf create mode 100644 UmbrellaWeather/Assets.xcassets/Arrows.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Brand Assets.launchimage/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Brand Assets.launchimage/IPhone 6PLus.png create mode 100644 UmbrellaWeather/Assets.xcassets/Brand Assets.launchimage/IPhone4.png create mode 100644 UmbrellaWeather/Assets.xcassets/Brand Assets.launchimage/IPhone5.png create mode 100644 UmbrellaWeather/Assets.xcassets/Brand Assets.launchimage/IPhone6.png create mode 100644 UmbrellaWeather/Assets.xcassets/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Detail.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Detail.imageset/Detail.pdf create mode 100644 UmbrellaWeather/Assets.xcassets/DetailColor.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/DetailColor.imageset/DetailColor.pdf create mode 100644 UmbrellaWeather/Assets.xcassets/Launch.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Launch.imageset/IPhone 6PLus-1.png create mode 100644 UmbrellaWeather/Assets.xcassets/Launch.imageset/IPhone6-1.png create mode 100644 UmbrellaWeather/Assets.xcassets/Launch4.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Launch4.imageset/IPhone4-1.png create mode 100644 UmbrellaWeather/Assets.xcassets/Launch5.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Launch5.imageset/IPhone5-1.png create mode 100644 UmbrellaWeather/Assets.xcassets/Line.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Line.imageset/Line@2x.png create mode 100644 UmbrellaWeather/Assets.xcassets/Line.imageset/Line@3x.png create mode 100644 UmbrellaWeather/Assets.xcassets/Loading.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Loading.imageset/Loading@2x.png create mode 100644 UmbrellaWeather/Assets.xcassets/Loading.imageset/Loading@3x.png create mode 100644 UmbrellaWeather/Assets.xcassets/Location.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Location.imageset/Location@2x.png create mode 100644 UmbrellaWeather/Assets.xcassets/Location.imageset/Location@3x.png create mode 100644 UmbrellaWeather/Assets.xcassets/Logo.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Logo.imageset/Logo.pdf create mode 100644 UmbrellaWeather/Assets.xcassets/Shape.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/Shape.imageset/Shape@2x.png create mode 100644 UmbrellaWeather/Assets.xcassets/Shape.imageset/Shape@3x.png create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Cloudy.imageset/Cloudy.pdf create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Cloudy.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Fog.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Fog.imageset/Fog@2x.png create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Fog.imageset/Fog@3x.png create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Rain.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Rain.imageset/Rain.pdf create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Snow.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Snow.imageset/Snow.pdf create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Sun.imageset/Contents.json create mode 100644 UmbrellaWeather/Assets.xcassets/WeatherImage/Sun.imageset/Sun9.pdf create mode 100644 UmbrellaWeather/Base.lproj/Main.storyboard create mode 100644 UmbrellaWeather/CityListCell.swift create mode 100644 UmbrellaWeather/CityListCell.xib create mode 100644 UmbrellaWeather/CityListViewController.swift create mode 100755 UmbrellaWeather/DINNextLTPro-Light.otf create mode 100644 UmbrellaWeather/DataModel/City.swift create mode 100644 UmbrellaWeather/DataModel/Citys.xml create mode 100644 UmbrellaWeather/DataModel/DataModel.swift create mode 100644 UmbrellaWeather/DataModel/ParserXML.swift create mode 100644 UmbrellaWeather/FirstView.swift create mode 100644 UmbrellaWeather/HomeViewController.swift create mode 100644 UmbrellaWeather/Info.plist create mode 100644 UmbrellaWeather/MainView.swift create mode 100644 UmbrellaWeather/PullView.swift create mode 100644 UmbrellaWeather/Server/DailyResult.swift create mode 100644 UmbrellaWeather/Server/LocationService.swift create mode 100644 UmbrellaWeather/Server/ServiceResult.swift create mode 100644 UmbrellaWeather/Server/UIImageView+WeatherImage.swift create mode 100644 UmbrellaWeather/Server/WeatherResult.swift create mode 100644 UmbrellaWeather/SupportTableViewController.swift create mode 100644 UmbrellaWeather/TimePickerViewController.swift create mode 100644 UmbrellaWeather/WaterSound.wav create mode 100644 UmbrellaWeather/WeekWeatherCell.swift create mode 100644 UmbrellaWeather/WeekWeatherCell.xib create mode 100644 UmbrellaWeather/WeekWeatherCollectionView.swift create mode 100644 UmbrellaWeather/zh-Hans.lproj/Main.strings diff --git a/FirstView.xib b/FirstView.xib new file mode 100644 index 0000000..fbb961c --- /dev/null +++ b/FirstView.xib @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..9b971bc --- /dev/null +++ b/Podfile @@ -0,0 +1,5 @@ +platform :ios, '8.0' + +pod 'SwiftyJSON', '~> 2.3.2' +use_frameworks! + diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..54df8e6 --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,10 @@ +PODS: + - SwiftyJSON (2.3.2) + +DEPENDENCIES: + - SwiftyJSON (~> 2.3.2) + +SPEC CHECKSUMS: + SwiftyJSON: 04ccea08915aa0109039157c7974cf0298da292a + +COCOAPODS: 0.39.0 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock new file mode 100644 index 0000000..54df8e6 --- /dev/null +++ b/Pods/Manifest.lock @@ -0,0 +1,10 @@ +PODS: + - SwiftyJSON (2.3.2) + +DEPENDENCIES: + - SwiftyJSON (~> 2.3.2) + +SPEC CHECKSUMS: + SwiftyJSON: 04ccea08915aa0109039157c7974cf0298da292a + +COCOAPODS: 0.39.0 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..71e5ca1 --- /dev/null +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,502 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 44C4F64A26E04DB2A5E41745E111B2B4 /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 894E5DA93A9F359521A89826BE6DA777 /* Pods-dummy.m */; }; + 58D67DC97D9F4E0F057A87223A15E8FB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E4E89230EF59BC255123B67864ACF77 /* Foundation.framework */; }; + 691886E3537DED119660000DC865BCC9 /* SwiftyJSON-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 05CA09B061E193906653AC21FD3A94F1 /* SwiftyJSON-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 832B19BD04D972B79C25420D469F68F7 /* Pods-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BCC458FDD5F692BBB2BFC64BB5701FC /* Pods-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CE9A434FAFE8158B3A66D6FCB4F507ED /* SwiftyJSON-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 32B9BBA8F5B33E56C38F5546432F66B7 /* SwiftyJSON-dummy.m */; }; + D18A87B789253DF5E376C49857A964CA /* SwiftyJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDE506ECE97701EBA44FDBFF401C1A04 /* SwiftyJSON.swift */; }; + F7B9462ED43D98E27777C1C566CAEC0A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E4E89230EF59BC255123B67864ACF77 /* Foundation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + DED02675A046C8DF39C3792995788A89 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A2BFFC9999EB12DBCF06F86A19A1D5E4; + remoteInfo = SwiftyJSON; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 05CA09B061E193906653AC21FD3A94F1 /* SwiftyJSON-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftyJSON-umbrella.h"; sourceTree = ""; }; + 2BCC458FDD5F692BBB2BFC64BB5701FC /* Pods-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-umbrella.h"; sourceTree = ""; }; + 2E7F7C62EE34D2D271E6E1234A2002B2 /* SwiftyJSON.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftyJSON.xcconfig; sourceTree = ""; }; + 32B9BBA8F5B33E56C38F5546432F66B7 /* SwiftyJSON-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftyJSON-dummy.m"; sourceTree = ""; }; + 3E4E89230EF59BC255123B67864ACF77 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 4BF91E2E9C3BEBFD7F8F2C550EBC91BB /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 79A9DEDC89FE8336BF5FEDAAF75BF7FC /* Pods.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Pods.modulemap; sourceTree = ""; }; + 87B213035BAC5F75386F62D3C75D2342 /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-acknowledgements.plist"; sourceTree = ""; }; + 894E5DA93A9F359521A89826BE6DA777 /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-dummy.m"; sourceTree = ""; }; + 977577C045EDA9D9D1F46E2598D19FC7 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.debug.xcconfig; sourceTree = ""; }; + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + BBF610E40BDF6E542FA21FF7E5491205 /* SwiftyJSON-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftyJSON-prefix.pch"; sourceTree = ""; }; + BDE506ECE97701EBA44FDBFF401C1A04 /* SwiftyJSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftyJSON.swift; path = Source/SwiftyJSON.swift; sourceTree = ""; }; + C4A9A658C966F6BB111BEDBDEA1F874A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CBC0F7C552B739C909B650A0F42F7F38 /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-resources.sh"; sourceTree = ""; }; + D032A29E584B77AE187E586922267CF5 /* SwiftyJSON.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SwiftyJSON.modulemap; sourceTree = ""; }; + D0405803033A2A777B8E4DFA0C1800ED /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-acknowledgements.markdown"; sourceTree = ""; }; + DA312349A49333542E6F4B36B329960E /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.release.xcconfig; sourceTree = ""; }; + E7E2E816A2F4822B9C40407757AC32FC /* SwiftyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E7F21354943D9F42A70697D5A5EF72E9 /* Pods-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-frameworks.sh"; sourceTree = ""; }; + E8446514FBAD26C0E18F24A5715AEF67 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5C07BF63857AF434CC4D1987C7E0A35C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F7B9462ED43D98E27777C1C566CAEC0A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE8BDF3F4F4FB025B6184D78EBD0236A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 58D67DC97D9F4E0F057A87223A15E8FB /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 70A8E4D3C62B6C203D238581DA091C21 /* SwiftyJSON */ = { + isa = PBXGroup; + children = ( + BDE506ECE97701EBA44FDBFF401C1A04 /* SwiftyJSON.swift */, + 8EC39E1DC11846207722B71AAFE40F98 /* Support Files */, + ); + path = SwiftyJSON; + sourceTree = ""; + }; + 75D98FF52E597A11900E131B6C4E1ADA /* Pods */ = { + isa = PBXGroup; + children = ( + E8446514FBAD26C0E18F24A5715AEF67 /* Info.plist */, + 79A9DEDC89FE8336BF5FEDAAF75BF7FC /* Pods.modulemap */, + D0405803033A2A777B8E4DFA0C1800ED /* Pods-acknowledgements.markdown */, + 87B213035BAC5F75386F62D3C75D2342 /* Pods-acknowledgements.plist */, + 894E5DA93A9F359521A89826BE6DA777 /* Pods-dummy.m */, + E7F21354943D9F42A70697D5A5EF72E9 /* Pods-frameworks.sh */, + CBC0F7C552B739C909B650A0F42F7F38 /* Pods-resources.sh */, + 2BCC458FDD5F692BBB2BFC64BB5701FC /* Pods-umbrella.h */, + 977577C045EDA9D9D1F46E2598D19FC7 /* Pods.debug.xcconfig */, + DA312349A49333542E6F4B36B329960E /* Pods.release.xcconfig */, + ); + name = Pods; + path = "Target Support Files/Pods"; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */, + BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, + BD1E3C710F12F4B4C092FC8E2AD22110 /* Pods */, + D90755D1F4FB9E07B7AB8EC8656D2CB2 /* Products */, + B7B80995527643776607AFFA75B91E24 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 8EC39E1DC11846207722B71AAFE40F98 /* Support Files */ = { + isa = PBXGroup; + children = ( + C4A9A658C966F6BB111BEDBDEA1F874A /* Info.plist */, + D032A29E584B77AE187E586922267CF5 /* SwiftyJSON.modulemap */, + 2E7F7C62EE34D2D271E6E1234A2002B2 /* SwiftyJSON.xcconfig */, + 32B9BBA8F5B33E56C38F5546432F66B7 /* SwiftyJSON-dummy.m */, + BBF610E40BDF6E542FA21FF7E5491205 /* SwiftyJSON-prefix.pch */, + 05CA09B061E193906653AC21FD3A94F1 /* SwiftyJSON-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/SwiftyJSON"; + sourceTree = ""; + }; + B7B80995527643776607AFFA75B91E24 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 75D98FF52E597A11900E131B6C4E1ADA /* Pods */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { + isa = PBXGroup; + children = ( + BF6342C8B29F4CEEA088EFF7AB4DE362 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + BD1E3C710F12F4B4C092FC8E2AD22110 /* Pods */ = { + isa = PBXGroup; + children = ( + 70A8E4D3C62B6C203D238581DA091C21 /* SwiftyJSON */, + ); + name = Pods; + sourceTree = ""; + }; + BF6342C8B29F4CEEA088EFF7AB4DE362 /* iOS */ = { + isa = PBXGroup; + children = ( + 3E4E89230EF59BC255123B67864ACF77 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + D90755D1F4FB9E07B7AB8EC8656D2CB2 /* Products */ = { + isa = PBXGroup; + children = ( + 4BF91E2E9C3BEBFD7F8F2C550EBC91BB /* Pods.framework */, + E7E2E816A2F4822B9C40407757AC32FC /* SwiftyJSON.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 6ABB360E8394F11C736FE13C2F536B02 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 691886E3537DED119660000DC865BCC9 /* SwiftyJSON-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 715876937915782C81EF25AA9F36FA29 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 832B19BD04D972B79C25420D469F68F7 /* Pods-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 9BD196C3DED20BF11A665D7D92FCF62F /* Pods */ = { + isa = PBXNativeTarget; + buildConfigurationList = 17C9FB0AF1871D3CD0FC142E1B11F8A2 /* Build configuration list for PBXNativeTarget "Pods" */; + buildPhases = ( + A89D2DC68AA6BA0747B6BE468C884F81 /* Sources */, + EE8BDF3F4F4FB025B6184D78EBD0236A /* Frameworks */, + 715876937915782C81EF25AA9F36FA29 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + B7611EE004F3F6735B42A562A6ED4A44 /* PBXTargetDependency */, + ); + name = Pods; + productName = Pods; + productReference = 4BF91E2E9C3BEBFD7F8F2C550EBC91BB /* Pods.framework */; + productType = "com.apple.product-type.framework"; + }; + A2BFFC9999EB12DBCF06F86A19A1D5E4 /* SwiftyJSON */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2875175DCCB624F6634D9D136CA3FD29 /* Build configuration list for PBXNativeTarget "SwiftyJSON" */; + buildPhases = ( + E4E2BA9FAE9985A76A2433B1DD1ED9FA /* Sources */, + 5C07BF63857AF434CC4D1987C7E0A35C /* Frameworks */, + 6ABB360E8394F11C736FE13C2F536B02 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SwiftyJSON; + productName = SwiftyJSON; + productReference = E7E2E816A2F4822B9C40407757AC32FC /* SwiftyJSON.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = D90755D1F4FB9E07B7AB8EC8656D2CB2 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 9BD196C3DED20BF11A665D7D92FCF62F /* Pods */, + A2BFFC9999EB12DBCF06F86A19A1D5E4 /* SwiftyJSON */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + A89D2DC68AA6BA0747B6BE468C884F81 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 44C4F64A26E04DB2A5E41745E111B2B4 /* Pods-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E4E2BA9FAE9985A76A2433B1DD1ED9FA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CE9A434FAFE8158B3A66D6FCB4F507ED /* SwiftyJSON-dummy.m in Sources */, + D18A87B789253DF5E376C49857A964CA /* SwiftyJSON.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + B7611EE004F3F6735B42A562A6ED4A44 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SwiftyJSON; + target = A2BFFC9999EB12DBCF06F86A19A1D5E4 /* SwiftyJSON */; + targetProxy = DED02675A046C8DF39C3792995788A89 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 32A42E82E2F1BC57F2F4F2041EFCF509 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DA312349A49333542E6F4B36B329960E /* Pods.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods/Pods.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 97CFFDC80E52D464D3897018EB8A49B2 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2E7F7C62EE34D2D271E6E1234A2002B2 /* SwiftyJSON.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SwiftyJSON/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SwiftyJSON/SwiftyJSON.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = SwiftyJSON; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + A70CDAD61F90AC503C7D04CC22DA2923 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + 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; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + CE014A0FB6009D69CD58B065F7528C66 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 977577C045EDA9D9D1F46E2598D19FC7 /* Pods.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods/Pods.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + D1A45F25A023953C2544B61B84AF31FF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2E7F7C62EE34D2D271E6E1234A2002B2 /* SwiftyJSON.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SwiftyJSON/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SwiftyJSON/SwiftyJSON.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = SwiftyJSON; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + FB45FFD90572718D82AB9092B750F0CA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 17C9FB0AF1871D3CD0FC142E1B11F8A2 /* Build configuration list for PBXNativeTarget "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CE014A0FB6009D69CD58B065F7528C66 /* Debug */, + 32A42E82E2F1BC57F2F4F2041EFCF509 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2875175DCCB624F6634D9D136CA3FD29 /* Build configuration list for PBXNativeTarget "SwiftyJSON" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97CFFDC80E52D464D3897018EB8A49B2 /* Debug */, + D1A45F25A023953C2544B61B84AF31FF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A70CDAD61F90AC503C7D04CC22DA2923 /* Debug */, + FB45FFD90572718D82AB9092B750F0CA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/Pods.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/Pods.xcscheme new file mode 100644 index 0000000..b094004 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/Pods.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/SwiftyJSON.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/SwiftyJSON.xcscheme new file mode 100644 index 0000000..509184f --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/SwiftyJSON.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..cbc528a --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,32 @@ + + + + + SchemeUserState + + Pods.xcscheme + + isShown + + + SwiftyJSON.xcscheme + + isShown + + + + SuppressBuildableAutocreation + + 9BD196C3DED20BF11A665D7D92FCF62F + + primary + + + A2BFFC9999EB12DBCF06F86A19A1D5E4 + + primary + + + + + diff --git a/Pods/SwiftyJSON/LICENSE b/Pods/SwiftyJSON/LICENSE new file mode 100644 index 0000000..a7af196 --- /dev/null +++ b/Pods/SwiftyJSON/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Ruoyu Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Pods/SwiftyJSON/README.md b/Pods/SwiftyJSON/README.md new file mode 100644 index 0000000..c0846f9 --- /dev/null +++ b/Pods/SwiftyJSON/README.md @@ -0,0 +1,376 @@ +#SwiftyJSON [中文介绍](http://tangplin.github.io/swiftyjson/) + +[![Travis CI](https://travis-ci.org/SwiftyJSON/SwiftyJSON.svg?branch=master)](https://travis-ci.org/SwiftyJSON/SwiftyJSON) + +SwiftyJSON makes it easy to deal with JSON data in Swift. + +1. [Why is the typical JSON handling in Swift NOT good](#why-is-the-typical-json-handling-in-swift-not-good) +1. [Requirements](#requirements) +1. [Integration](#integration) +1. [Usage](#usage) + - [Initialization](#initialization) + - [Subscript](#subscript) + - [Loop](#loop) + - [Error](#error) + - [Optional getter](#optional-getter) + - [Non-optional getter](#non-optional-getter) + - [Setter](#setter) + - [Raw object](#raw-object) + - [Literal convertibles](#literal-convertibles) +1. [Work with Alamofire](#work-with-alamofire) + +##Why is the typical JSON handling in Swift NOT good? +Swift is very strict about types. But although explicit typing is good for saving us from mistakes, it becomes painful when dealing with JSON and other areas that are, by nature, implicit about types. + +Take the Twitter API for example. Say we want to retrieve a user's "name" value of some tweet in Swift (according to Twitter's API https://dev.twitter.com/docs/api/1.1/get/statuses/home_timeline). + +The code would look like this: + +```swift + +if let statusesArray = try? NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) as? [[String: AnyObject]], + let user = statusesArray[0]["user"] as? [String: AnyObject], + let username = user["name"] as? String { + // Finally we got the username +} + +``` + +It's not good. + +Even if we use optional chaining, it would be messy: + +```swift + +if let JSONObject = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) as? [[String: AnyObject]], + let username = (JSONObject[0]["user"] as? [String: AnyObject])?["name"] as? String { + // There's our username +} + +``` +An unreadable mess--for something that should really be simple! + +With SwiftyJSON all you have to do is: + +```swift + +let json = JSON(data: dataFromNetworking) +if let userName = json[0]["user"]["name"].string { + //Now you got your value +} + +``` + +And don't worry about the Optional Wrapping thing. It's done for you automatically. + +```swift + +let json = JSON(data: dataFromNetworking) +if let userName = json[999999]["wrong_key"]["wrong_name"].string { + //Calm down, take it easy, the ".string" property still produces the correct Optional String type with safety +} else { + //Print the error + print(json[999999]["wrong_key"]["wrong_name"]) +} + +``` + +## Requirements + +- iOS 7.0+ / Mac OS X 10.9+ +- Xcode 7 + +##Integration + +####CocoaPods (iOS 8+, OS X 10.9+) +You can use [Cocoapods](http://cocoapods.org/) to install `SwiftyJSON`by adding it to your `Podfile`: +```ruby +platform :ios, '8.0' +use_frameworks! + +target 'MyApp' do + pod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git' +end +``` +Note that this requires CocoaPods version 36, and your iOS deployment target to be at least 8.0: + +####Carthage (iOS 8+, OS X 10.9+) +You can use [Carthage](https://github.com/Carthage/Carthage) to install `SwiftyJSON` by adding it to your `Cartfile`: +``` +github "SwiftyJSON/SwiftyJSON" +``` + +####Manually (iOS 7+, OS X 10.9+) + +To use this library in your project manually you may: + +1. for Projects, just drag SwiftyJSON.swift to the project tree +2. for Workspaces, include the whole SwiftyJSON.xcodeproj + +## Usage + +####Initialization +```swift +import SwiftyJSON +``` +```swift +let json = JSON(data: dataFromNetworking) +``` +```swift +let json = JSON(jsonObject) +``` +```swift +if let dataFromString = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) { + let json = JSON(data: dataFromString) +} +``` + +####Subscript +```swift +//Getting a double from a JSON Array +let name = json[0].double +``` +```swift +//Getting a string from a JSON Dictionary +let name = json["name"].stringValue +``` +```swift +//Getting a string using a path to the element +let path = [1,"list",2,"name"] +let name = json[path].string +//Just the same +let name = json[1]["list"][2]["name"].string +//Alternatively +let name = json[1,"list",2,"name"].string +``` +```swift +//With a hard way +let name = json[].string +``` +```swift +//With a custom way +let keys:[SubscriptType] = [1,"list",2,"name"] +let name = json[keys].string +``` +####Loop +```swift +//If json is .Dictionary +for (key,subJson):(String, JSON) in json { + //Do something you want +} +``` +*The first element is always a String, even if the JSON is an Array* +```swift +//If json is .Array +//The `index` is 0.. = json["list"].arrayValue +``` +```swift +//If not a Dictionary or nil, return [:] +let user: Dictionary = json["user"].dictionaryValue +``` + +####Setter +```swift +json["name"] = JSON("new-name") +json[0] = JSON(1) +``` +```swift +json["id"].int = 1234567890 +json["coordinate"].double = 8766.766 +json["name"].string = "Jack" +json.arrayObject = [1,2,3,4] +json.dictionary = ["name":"Jack", "age":25] +``` + +####Raw object +```swift +let jsonObject: AnyObject = json.object +``` +```swift +if let jsonObject: AnyObject = json.rawValue +``` +```swift +//convert the JSON to raw NSData +if let data = json.rawData() { + //Do something you want +} +``` +```swift +//convert the JSON to a raw String +if let string = json.rawString() { + //Do something you want +} +``` +####Existance +```swift +//shows you whether value specified in JSON or not +if json["name"].isExists() +``` + +####Literal convertibles +For more info about literal convertibles: [Swift Literal Convertibles](http://nshipster.com/swift-literal-convertible/) +```swift +//StringLiteralConvertible +let json: JSON = "I'm a json" +``` +```swift +//IntegerLiteralConvertible +let json: JSON = 12345 +``` +```swift +//BooleanLiteralConvertible +let json: JSON = true +``` +```swift +//FloatLiteralConvertible +let json: JSON = 2.8765 +``` +```swift +//DictionaryLiteralConvertible +let json: JSON = ["I":"am", "a":"json"] +``` +```swift +//ArrayLiteralConvertible +let json: JSON = ["I", "am", "a", "json"] +``` +```swift +//NilLiteralConvertible +let json: JSON = nil +``` +```swift +//With subscript in array +var json: JSON = [1,2,3] +json[0] = 100 +json[1] = 200 +json[2] = 300 +json[999] = 300 //Don't worry, nothing will happen +``` +```swift +//With subscript in dictionary +var json: JSON = ["name": "Jack", "age": 25] +json["name"] = "Mike" +json["age"] = "25" //It's OK to set String +json["address"] = "L.A." // Add the "address": "L.A." in json +``` +```swift +//Array & Dictionary +var json: JSON = ["name": "Jack", "age": 25, "list": ["a", "b", "c", ["what": "this"]]] +json["list"][3]["what"] = "that" +json["list",3,"what"] = "that" +let path = ["list",3,"what"] +json[path] = "that" +``` +##Work with Alamofire + +SwiftyJSON nicely wraps the result of the Alamofire JSON response handler: +```swift +Alamofire.request(.GET, url).validate().responseJSON { response in + switch response.result { + case .Success: + if let value = response.result.value { + let json = JSON(value) + print("JSON: \(json)") + } + case .Failure(let error): + print(error) + } +} +``` diff --git a/Pods/SwiftyJSON/Source/SwiftyJSON.swift b/Pods/SwiftyJSON/Source/SwiftyJSON.swift new file mode 100644 index 0000000..fa8635e --- /dev/null +++ b/Pods/SwiftyJSON/Source/SwiftyJSON.swift @@ -0,0 +1,1376 @@ +// SwiftyJSON.swift +// +// Copyright (c) 2014 Ruoyu Fu, Pinglin Tang +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import Foundation + +// MARK: - Error + +///Error domain +public let ErrorDomain: String = "SwiftyJSONErrorDomain" + +///Error code +public let ErrorUnsupportedType: Int = 999 +public let ErrorIndexOutOfBounds: Int = 900 +public let ErrorWrongType: Int = 901 +public let ErrorNotExist: Int = 500 +public let ErrorInvalidJSON: Int = 490 + +// MARK: - JSON Type + +/** +JSON's type definitions. + +See http://www.json.org +*/ +public enum Type :Int{ + + case Number + case String + case Bool + case Array + case Dictionary + case Null + case Unknown +} + +// MARK: - JSON Base + +public struct JSON { + + /** + Creates a JSON using the data. + + - parameter data: The NSData used to convert to json.Top level object in data is an NSArray or NSDictionary + - parameter opt: The JSON serialization reading options. `.AllowFragments` by default. + - parameter error: error The NSErrorPointer used to return the error. `nil` by default. + + - returns: The created JSON + */ + public init(data:NSData, options opt: NSJSONReadingOptions = .AllowFragments, error: NSErrorPointer = nil) { + do { + let object: AnyObject = try NSJSONSerialization.JSONObjectWithData(data, options: opt) + self.init(object) + } catch let aError as NSError { + if error != nil { + error.memory = aError + } + self.init(NSNull()) + } + } + + /** + Create a JSON from JSON string + - parameter string: Normal json string like '{"a":"b"}' + + - returns: The created JSON + */ + public static func parse(string:String) -> JSON { + return string.dataUsingEncoding(NSUTF8StringEncoding) + .flatMap({JSON(data: $0)}) ?? JSON(NSNull()) + } + + /** + Creates a JSON using the object. + + - parameter object: The object must have the following properties: All objects are NSString/String, NSNumber/Int/Float/Double/Bool, NSArray/Array, NSDictionary/Dictionary, or NSNull; All dictionary keys are NSStrings/String; NSNumbers are not NaN or infinity. + + - returns: The created JSON + */ + public init(_ object: AnyObject) { + self.object = object + } + + /** + Creates a JSON from a [JSON] + + - parameter jsonArray: A Swift array of JSON objects + + - returns: The created JSON + */ + public init(_ jsonArray:[JSON]) { + self.init(jsonArray.map { $0.object }) + } + + /** + Creates a JSON from a [String: JSON] + + - parameter jsonDictionary: A Swift dictionary of JSON objects + + - returns: The created JSON + */ + public init(_ jsonDictionary:[String: JSON]) { + var dictionary = [String: AnyObject]() + for (key, json) in jsonDictionary { + dictionary[key] = json.object + } + self.init(dictionary) + } + + /// Private object + private var rawArray: [AnyObject] = [] + private var rawDictionary: [String : AnyObject] = [:] + private var rawString: String = "" + private var rawNumber: NSNumber = 0 + private var rawNull: NSNull = NSNull() + /// Private type + private var _type: Type = .Null + /// prviate error + private var _error: NSError? = nil + + /// Object in JSON + public var object: AnyObject { + get { + switch self.type { + case .Array: + return self.rawArray + case .Dictionary: + return self.rawDictionary + case .String: + return self.rawString + case .Number: + return self.rawNumber + case .Bool: + return self.rawNumber + default: + return self.rawNull + } + } + set { + _error = nil + switch newValue { + case let number as NSNumber: + if number.isBool { + _type = .Bool + } else { + _type = .Number + } + self.rawNumber = number + case let string as String: + _type = .String + self.rawString = string + case _ as NSNull: + _type = .Null + case let array as [AnyObject]: + _type = .Array + self.rawArray = array + case let dictionary as [String : AnyObject]: + _type = .Dictionary + self.rawDictionary = dictionary + default: + _type = .Unknown + _error = NSError(domain: ErrorDomain, code: ErrorUnsupportedType, userInfo: [NSLocalizedDescriptionKey: "It is a unsupported type"]) + } + } + } + + /// json type + public var type: Type { get { return _type } } + + /// Error in JSON + public var error: NSError? { get { return self._error } } + + /// The static null json + @available(*, unavailable, renamed="null") + public static var nullJSON: JSON { get { return null } } + public static var null: JSON { get { return JSON(NSNull()) } } +} + +// MARK: - CollectionType, SequenceType, Indexable +extension JSON : Swift.CollectionType, Swift.SequenceType, Swift.Indexable { + + public typealias Generator = JSONGenerator + + public typealias Index = JSONIndex + + public var startIndex: JSON.Index { + switch self.type { + case .Array: + return JSONIndex(arrayIndex: self.rawArray.startIndex) + case .Dictionary: + return JSONIndex(dictionaryIndex: self.rawDictionary.startIndex) + default: + return JSONIndex() + } + } + + public var endIndex: JSON.Index { + switch self.type { + case .Array: + return JSONIndex(arrayIndex: self.rawArray.endIndex) + case .Dictionary: + return JSONIndex(dictionaryIndex: self.rawDictionary.endIndex) + default: + return JSONIndex() + } + } + + public subscript (position: JSON.Index) -> JSON.Generator.Element { + switch self.type { + case .Array: + return (String(position.arrayIndex), JSON(self.rawArray[position.arrayIndex!])) + case .Dictionary: + let (key, value) = self.rawDictionary[position.dictionaryIndex!] + return (key, JSON(value)) + default: + return ("", JSON.null) + } + } + + /// If `type` is `.Array` or `.Dictionary`, return `array.empty` or `dictonary.empty` otherwise return `true`. + public var isEmpty: Bool { + get { + switch self.type { + case .Array: + return self.rawArray.isEmpty + case .Dictionary: + return self.rawDictionary.isEmpty + default: + return true + } + } + } + + /// If `type` is `.Array` or `.Dictionary`, return `array.count` or `dictonary.count` otherwise return `0`. + public var count: Int { + switch self.type { + case .Array: + return self.rawArray.count + case .Dictionary: + return self.rawDictionary.count + default: + return 0 + } + } + + public func underestimateCount() -> Int { + switch self.type { + case .Array: + return self.rawArray.underestimateCount() + case .Dictionary: + return self.rawDictionary.underestimateCount() + default: + return 0 + } + } + + /** + If `type` is `.Array` or `.Dictionary`, return a generator over the elements like `Array` or `Dictionary`, otherwise return a generator over empty. + + - returns: Return a *generator* over the elements of JSON. + */ + public func generate() -> JSON.Generator { + return JSON.Generator(self) + } +} + +public struct JSONIndex: ForwardIndexType, _Incrementable, Equatable, Comparable { + + let arrayIndex: Int? + let dictionaryIndex: DictionaryIndex? + + let type: Type + + init(){ + self.arrayIndex = nil + self.dictionaryIndex = nil + self.type = .Unknown + } + + init(arrayIndex: Int) { + self.arrayIndex = arrayIndex + self.dictionaryIndex = nil + self.type = .Array + } + + init(dictionaryIndex: DictionaryIndex) { + self.arrayIndex = nil + self.dictionaryIndex = dictionaryIndex + self.type = .Dictionary + } + + public func successor() -> JSONIndex { + switch self.type { + case .Array: + return JSONIndex(arrayIndex: self.arrayIndex!.successor()) + case .Dictionary: + return JSONIndex(dictionaryIndex: self.dictionaryIndex!.successor()) + default: + return JSONIndex() + } + } +} + +public func ==(lhs: JSONIndex, rhs: JSONIndex) -> Bool { + switch (lhs.type, rhs.type) { + case (.Array, .Array): + return lhs.arrayIndex == rhs.arrayIndex + case (.Dictionary, .Dictionary): + return lhs.dictionaryIndex == rhs.dictionaryIndex + default: + return false + } +} + +public func <(lhs: JSONIndex, rhs: JSONIndex) -> Bool { + switch (lhs.type, rhs.type) { + case (.Array, .Array): + return lhs.arrayIndex < rhs.arrayIndex + case (.Dictionary, .Dictionary): + return lhs.dictionaryIndex < rhs.dictionaryIndex + default: + return false + } +} + +public func <=(lhs: JSONIndex, rhs: JSONIndex) -> Bool { + switch (lhs.type, rhs.type) { + case (.Array, .Array): + return lhs.arrayIndex <= rhs.arrayIndex + case (.Dictionary, .Dictionary): + return lhs.dictionaryIndex <= rhs.dictionaryIndex + default: + return false + } +} + +public func >=(lhs: JSONIndex, rhs: JSONIndex) -> Bool { + switch (lhs.type, rhs.type) { + case (.Array, .Array): + return lhs.arrayIndex >= rhs.arrayIndex + case (.Dictionary, .Dictionary): + return lhs.dictionaryIndex >= rhs.dictionaryIndex + default: + return false + } +} + +public func >(lhs: JSONIndex, rhs: JSONIndex) -> Bool { + switch (lhs.type, rhs.type) { + case (.Array, .Array): + return lhs.arrayIndex > rhs.arrayIndex + case (.Dictionary, .Dictionary): + return lhs.dictionaryIndex > rhs.dictionaryIndex + default: + return false + } +} + +public struct JSONGenerator : GeneratorType { + + public typealias Element = (String, JSON) + + private let type: Type + private var dictionayGenerate: DictionaryGenerator? + private var arrayGenerate: IndexingGenerator<[AnyObject]>? + private var arrayIndex: Int = 0 + + init(_ json: JSON) { + self.type = json.type + if type == .Array { + self.arrayGenerate = json.rawArray.generate() + }else { + self.dictionayGenerate = json.rawDictionary.generate() + } + } + + public mutating func next() -> JSONGenerator.Element? { + switch self.type { + case .Array: + if let o = self.arrayGenerate?.next() { + return (String(self.arrayIndex++), JSON(o)) + } else { + return nil + } + case .Dictionary: + if let (k, v): (String, AnyObject) = self.dictionayGenerate?.next() { + return (k, JSON(v)) + } else { + return nil + } + default: + return nil + } + } +} + +// MARK: - Subscript + +/** +* To mark both String and Int can be used in subscript. +*/ +public enum JSONKey { + case Index(Int) + case Key(String) +} + +public protocol JSONSubscriptType { + var jsonKey:JSONKey { get } +} + +extension Int: JSONSubscriptType { + public var jsonKey:JSONKey { + return JSONKey.Index(self) + } +} + +extension String: JSONSubscriptType { + public var jsonKey:JSONKey { + return JSONKey.Key(self) + } +} + +extension JSON { + + /// If `type` is `.Array`, return json which's object is `array[index]`, otherwise return null json with error. + private subscript(index index: Int) -> JSON { + get { + if self.type != .Array { + var r = JSON.null + r._error = self._error ?? NSError(domain: ErrorDomain, code: ErrorWrongType, userInfo: [NSLocalizedDescriptionKey: "Array[\(index)] failure, It is not an array"]) + return r + } else if index >= 0 && index < self.rawArray.count { + return JSON(self.rawArray[index]) + } else { + var r = JSON.null + r._error = NSError(domain: ErrorDomain, code:ErrorIndexOutOfBounds , userInfo: [NSLocalizedDescriptionKey: "Array[\(index)] is out of bounds"]) + return r + } + } + set { + if self.type == .Array { + if self.rawArray.count > index && newValue.error == nil { + self.rawArray[index] = newValue.object + } + } + } + } + + /// If `type` is `.Dictionary`, return json which's object is `dictionary[key]` , otherwise return null json with error. + private subscript(key key: String) -> JSON { + get { + var r = JSON.null + if self.type == .Dictionary { + if let o = self.rawDictionary[key] { + r = JSON(o) + } else { + r._error = NSError(domain: ErrorDomain, code: ErrorNotExist, userInfo: [NSLocalizedDescriptionKey: "Dictionary[\"\(key)\"] does not exist"]) + } + } else { + r._error = self._error ?? NSError(domain: ErrorDomain, code: ErrorWrongType, userInfo: [NSLocalizedDescriptionKey: "Dictionary[\"\(key)\"] failure, It is not an dictionary"]) + } + return r + } + set { + if self.type == .Dictionary && newValue.error == nil { + self.rawDictionary[key] = newValue.object + } + } + } + + /// If `sub` is `Int`, return `subscript(index:)`; If `sub` is `String`, return `subscript(key:)`. + private subscript(sub sub: JSONSubscriptType) -> JSON { + get { + switch sub.jsonKey { + case .Index(let index): return self[index: index] + case .Key(let key): return self[key: key] + } + } + set { + switch sub.jsonKey { + case .Index(let index): self[index: index] = newValue + case .Key(let key): self[key: key] = newValue + } + } + } + + /** + Find a json in the complex data structuresby using the Int/String's array. + + - parameter path: The target json's path. Example: + + let json = JSON[data] + let path = [9,"list","person","name"] + let name = json[path] + + The same as: let name = json[9]["list"]["person"]["name"] + + - returns: Return a json found by the path or a null json with error + */ + public subscript(path: [JSONSubscriptType]) -> JSON { + get { + return path.reduce(self) { $0[sub: $1] } + } + set { + switch path.count { + case 0: + return + case 1: + self[sub:path[0]].object = newValue.object + default: + var aPath = path; aPath.removeAtIndex(0) + var nextJSON = self[sub: path[0]] + nextJSON[aPath] = newValue + self[sub: path[0]] = nextJSON + } + } + } + + /** + Find a json in the complex data structuresby using the Int/String's array. + + - parameter path: The target json's path. Example: + + let name = json[9,"list","person","name"] + + The same as: let name = json[9]["list"]["person"]["name"] + + - returns: Return a json found by the path or a null json with error + */ + public subscript(path: JSONSubscriptType...) -> JSON { + get { + return self[path] + } + set { + self[path] = newValue + } + } +} + +// MARK: - LiteralConvertible + +extension JSON: Swift.StringLiteralConvertible { + + public init(stringLiteral value: StringLiteralType) { + self.init(value) + } + + public init(extendedGraphemeClusterLiteral value: StringLiteralType) { + self.init(value) + } + + public init(unicodeScalarLiteral value: StringLiteralType) { + self.init(value) + } +} + +extension JSON: Swift.IntegerLiteralConvertible { + + public init(integerLiteral value: IntegerLiteralType) { + self.init(value) + } +} + +extension JSON: Swift.BooleanLiteralConvertible { + + public init(booleanLiteral value: BooleanLiteralType) { + self.init(value) + } +} + +extension JSON: Swift.FloatLiteralConvertible { + + public init(floatLiteral value: FloatLiteralType) { + self.init(value) + } +} + +extension JSON: Swift.DictionaryLiteralConvertible { + + public init(dictionaryLiteral elements: (String, AnyObject)...) { + self.init(elements.reduce([String : AnyObject]()){(dictionary: [String : AnyObject], element:(String, AnyObject)) -> [String : AnyObject] in + var d = dictionary + d[element.0] = element.1 + return d + }) + } +} + +extension JSON: Swift.ArrayLiteralConvertible { + + public init(arrayLiteral elements: AnyObject...) { + self.init(elements) + } +} + +extension JSON: Swift.NilLiteralConvertible { + + public init(nilLiteral: ()) { + self.init(NSNull()) + } +} + +// MARK: - Raw + +extension JSON: Swift.RawRepresentable { + + public init?(rawValue: AnyObject) { + if JSON(rawValue).type == .Unknown { + return nil + } else { + self.init(rawValue) + } + } + + public var rawValue: AnyObject { + return self.object + } + + public func rawData(options opt: NSJSONWritingOptions = NSJSONWritingOptions(rawValue: 0)) throws -> NSData { + guard NSJSONSerialization.isValidJSONObject(self.object) else { + throw NSError(domain: ErrorDomain, code: ErrorInvalidJSON, userInfo: [NSLocalizedDescriptionKey: "JSON is invalid"]) + } + + return try NSJSONSerialization.dataWithJSONObject(self.object, options: opt) + } + + public func rawString(encoding: UInt = NSUTF8StringEncoding, options opt: NSJSONWritingOptions = .PrettyPrinted) -> String? { + switch self.type { + case .Array, .Dictionary: + do { + let data = try self.rawData(options: opt) + return NSString(data: data, encoding: encoding) as? String + } catch _ { + return nil + } + case .String: + return self.rawString + case .Number: + return self.rawNumber.stringValue + case .Bool: + return self.rawNumber.boolValue.description + case .Null: + return "null" + default: + return nil + } + } +} + +// MARK: - Printable, DebugPrintable + +extension JSON: Swift.Printable, Swift.DebugPrintable { + + public var description: String { + if let string = self.rawString(options:.PrettyPrinted) { + return string + } else { + return "unknown" + } + } + + public var debugDescription: String { + return description + } +} + +// MARK: - Array + +extension JSON { + + //Optional [JSON] + public var array: [JSON]? { + get { + if self.type == .Array { + return self.rawArray.map{ JSON($0) } + } else { + return nil + } + } + } + + //Non-optional [JSON] + public var arrayValue: [JSON] { + get { + return self.array ?? [] + } + } + + //Optional [AnyObject] + public var arrayObject: [AnyObject]? { + get { + switch self.type { + case .Array: + return self.rawArray + default: + return nil + } + } + set { + if let array = newValue { + self.object = array + } else { + self.object = NSNull() + } + } + } +} + +// MARK: - Dictionary + +extension JSON { + + //Optional [String : JSON] + public var dictionary: [String : JSON]? { + if self.type == .Dictionary { + return self.rawDictionary.reduce([String : JSON]()) { (dictionary: [String : JSON], element: (String, AnyObject)) -> [String : JSON] in + var d = dictionary + d[element.0] = JSON(element.1) + return d + } + } else { + return nil + } + } + + //Non-optional [String : JSON] + public var dictionaryValue: [String : JSON] { + return self.dictionary ?? [:] + } + + //Optional [String : AnyObject] + public var dictionaryObject: [String : AnyObject]? { + get { + switch self.type { + case .Dictionary: + return self.rawDictionary + default: + return nil + } + } + set { + if let v = newValue { + self.object = v + } else { + self.object = NSNull() + } + } + } +} + +// MARK: - Bool + +extension JSON: Swift.BooleanType { + + //Optional bool + public var bool: Bool? { + get { + switch self.type { + case .Bool: + return self.rawNumber.boolValue + default: + return nil + } + } + set { + if let newValue = newValue { + self.object = NSNumber(bool: newValue) + } else { + self.object = NSNull() + } + } + } + + //Non-optional bool + public var boolValue: Bool { + get { + switch self.type { + case .Bool, .Number, .String: + return self.object.boolValue + default: + return false + } + } + set { + self.object = NSNumber(bool: newValue) + } + } +} + +// MARK: - String + +extension JSON { + + //Optional string + public var string: String? { + get { + switch self.type { + case .String: + return self.object as? String + default: + return nil + } + } + set { + if let newValue = newValue { + self.object = NSString(string:newValue) + } else { + self.object = NSNull() + } + } + } + + //Non-optional string + public var stringValue: String { + get { + switch self.type { + case .String: + return self.object as? String ?? "" + case .Number: + return self.object.stringValue + case .Bool: + return (self.object as? Bool).map { String($0) } ?? "" + default: + return "" + } + } + set { + self.object = NSString(string:newValue) + } + } +} + +// MARK: - Number +extension JSON { + + //Optional number + public var number: NSNumber? { + get { + switch self.type { + case .Number, .Bool: + return self.rawNumber + default: + return nil + } + } + set { + self.object = newValue ?? NSNull() + } + } + + //Non-optional number + public var numberValue: NSNumber { + get { + switch self.type { + case .String: + let decimal = NSDecimalNumber(string: self.object as? String) + if decimal == NSDecimalNumber.notANumber() { // indicates parse error + return NSDecimalNumber.zero() + } + return decimal + case .Number, .Bool: + return self.object as? NSNumber ?? NSNumber(int: 0) + default: + return NSNumber(double: 0.0) + } + } + set { + self.object = newValue + } + } +} + +//MARK: - Null +extension JSON { + + public var null: NSNull? { + get { + switch self.type { + case .Null: + return self.rawNull + default: + return nil + } + } + set { + self.object = NSNull() + } + } + public func isExists() -> Bool{ + if let errorValue = error where errorValue.code == ErrorNotExist{ + return false + } + return true + } +} + +//MARK: - URL +extension JSON { + + //Optional URL + public var URL: NSURL? { + get { + switch self.type { + case .String: + if let encodedString_ = self.rawString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) { + return NSURL(string: encodedString_) + } else { + return nil + } + default: + return nil + } + } + set { + self.object = newValue?.absoluteString ?? NSNull() + } + } +} + +// MARK: - Int, Double, Float, Int8, Int16, Int32, Int64 + +extension JSON { + + public var double: Double? { + get { + return self.number?.doubleValue + } + set { + if let newValue = newValue { + self.object = NSNumber(double: newValue) + } else { + self.object = NSNull() + } + } + } + + public var doubleValue: Double { + get { + return self.numberValue.doubleValue + } + set { + self.object = NSNumber(double: newValue) + } + } + + public var float: Float? { + get { + return self.number?.floatValue + } + set { + if let newValue = newValue { + self.object = NSNumber(float: newValue) + } else { + self.object = NSNull() + } + } + } + + public var floatValue: Float { + get { + return self.numberValue.floatValue + } + set { + self.object = NSNumber(float: newValue) + } + } + + public var int: Int? { + get { + return self.number?.longValue + } + set { + if let newValue = newValue { + self.object = NSNumber(integer: newValue) + } else { + self.object = NSNull() + } + } + } + + public var intValue: Int { + get { + return self.numberValue.integerValue + } + set { + self.object = NSNumber(integer: newValue) + } + } + + public var uInt: UInt? { + get { + return self.number?.unsignedLongValue + } + set { + if let newValue = newValue { + self.object = NSNumber(unsignedLong: newValue) + } else { + self.object = NSNull() + } + } + } + + public var uIntValue: UInt { + get { + return self.numberValue.unsignedLongValue + } + set { + self.object = NSNumber(unsignedLong: newValue) + } + } + + public var int8: Int8? { + get { + return self.number?.charValue + } + set { + if let newValue = newValue { + self.object = NSNumber(char: newValue) + } else { + self.object = NSNull() + } + } + } + + public var int8Value: Int8 { + get { + return self.numberValue.charValue + } + set { + self.object = NSNumber(char: newValue) + } + } + + public var uInt8: UInt8? { + get { + return self.number?.unsignedCharValue + } + set { + if let newValue = newValue { + self.object = NSNumber(unsignedChar: newValue) + } else { + self.object = NSNull() + } + } + } + + public var uInt8Value: UInt8 { + get { + return self.numberValue.unsignedCharValue + } + set { + self.object = NSNumber(unsignedChar: newValue) + } + } + + public var int16: Int16? { + get { + return self.number?.shortValue + } + set { + if let newValue = newValue { + self.object = NSNumber(short: newValue) + } else { + self.object = NSNull() + } + } + } + + public var int16Value: Int16 { + get { + return self.numberValue.shortValue + } + set { + self.object = NSNumber(short: newValue) + } + } + + public var uInt16: UInt16? { + get { + return self.number?.unsignedShortValue + } + set { + if let newValue = newValue { + self.object = NSNumber(unsignedShort: newValue) + } else { + self.object = NSNull() + } + } + } + + public var uInt16Value: UInt16 { + get { + return self.numberValue.unsignedShortValue + } + set { + self.object = NSNumber(unsignedShort: newValue) + } + } + + public var int32: Int32? { + get { + return self.number?.intValue + } + set { + if let newValue = newValue { + self.object = NSNumber(int: newValue) + } else { + self.object = NSNull() + } + } + } + + public var int32Value: Int32 { + get { + return self.numberValue.intValue + } + set { + self.object = NSNumber(int: newValue) + } + } + + public var uInt32: UInt32? { + get { + return self.number?.unsignedIntValue + } + set { + if let newValue = newValue { + self.object = NSNumber(unsignedInt: newValue) + } else { + self.object = NSNull() + } + } + } + + public var uInt32Value: UInt32 { + get { + return self.numberValue.unsignedIntValue + } + set { + self.object = NSNumber(unsignedInt: newValue) + } + } + + public var int64: Int64? { + get { + return self.number?.longLongValue + } + set { + if let newValue = newValue { + self.object = NSNumber(longLong: newValue) + } else { + self.object = NSNull() + } + } + } + + public var int64Value: Int64 { + get { + return self.numberValue.longLongValue + } + set { + self.object = NSNumber(longLong: newValue) + } + } + + public var uInt64: UInt64? { + get { + return self.number?.unsignedLongLongValue + } + set { + if let newValue = newValue { + self.object = NSNumber(unsignedLongLong: newValue) + } else { + self.object = NSNull() + } + } + } + + public var uInt64Value: UInt64 { + get { + return self.numberValue.unsignedLongLongValue + } + set { + self.object = NSNumber(unsignedLongLong: newValue) + } + } +} + +//MARK: - Comparable +extension JSON : Swift.Comparable {} + +public func ==(lhs: JSON, rhs: JSON) -> Bool { + + switch (lhs.type, rhs.type) { + case (.Number, .Number): + return lhs.rawNumber == rhs.rawNumber + case (.String, .String): + return lhs.rawString == rhs.rawString + case (.Bool, .Bool): + return lhs.rawNumber.boolValue == rhs.rawNumber.boolValue + case (.Array, .Array): + return lhs.rawArray as NSArray == rhs.rawArray as NSArray + case (.Dictionary, .Dictionary): + return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary + case (.Null, .Null): + return true + default: + return false + } +} + +public func <=(lhs: JSON, rhs: JSON) -> Bool { + + switch (lhs.type, rhs.type) { + case (.Number, .Number): + return lhs.rawNumber <= rhs.rawNumber + case (.String, .String): + return lhs.rawString <= rhs.rawString + case (.Bool, .Bool): + return lhs.rawNumber.boolValue == rhs.rawNumber.boolValue + case (.Array, .Array): + return lhs.rawArray as NSArray == rhs.rawArray as NSArray + case (.Dictionary, .Dictionary): + return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary + case (.Null, .Null): + return true + default: + return false + } +} + +public func >=(lhs: JSON, rhs: JSON) -> Bool { + + switch (lhs.type, rhs.type) { + case (.Number, .Number): + return lhs.rawNumber >= rhs.rawNumber + case (.String, .String): + return lhs.rawString >= rhs.rawString + case (.Bool, .Bool): + return lhs.rawNumber.boolValue == rhs.rawNumber.boolValue + case (.Array, .Array): + return lhs.rawArray as NSArray == rhs.rawArray as NSArray + case (.Dictionary, .Dictionary): + return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary + case (.Null, .Null): + return true + default: + return false + } +} + +public func >(lhs: JSON, rhs: JSON) -> Bool { + + switch (lhs.type, rhs.type) { + case (.Number, .Number): + return lhs.rawNumber > rhs.rawNumber + case (.String, .String): + return lhs.rawString > rhs.rawString + default: + return false + } +} + +public func <(lhs: JSON, rhs: JSON) -> Bool { + + switch (lhs.type, rhs.type) { + case (.Number, .Number): + return lhs.rawNumber < rhs.rawNumber + case (.String, .String): + return lhs.rawString < rhs.rawString + default: + return false + } +} + +private let trueNumber = NSNumber(bool: true) +private let falseNumber = NSNumber(bool: false) +private let trueObjCType = String.fromCString(trueNumber.objCType) +private let falseObjCType = String.fromCString(falseNumber.objCType) + +// MARK: - NSNumber: Comparable + +extension NSNumber { + var isBool:Bool { + get { + let objCType = String.fromCString(self.objCType) + if (self.compare(trueNumber) == NSComparisonResult.OrderedSame && objCType == trueObjCType) + || (self.compare(falseNumber) == NSComparisonResult.OrderedSame && objCType == falseObjCType){ + return true + } else { + return false + } + } + } +} + +func ==(lhs: NSNumber, rhs: NSNumber) -> Bool { + switch (lhs.isBool, rhs.isBool) { + case (false, true): + return false + case (true, false): + return false + default: + return lhs.compare(rhs) == NSComparisonResult.OrderedSame + } +} + +func !=(lhs: NSNumber, rhs: NSNumber) -> Bool { + return !(lhs == rhs) +} + +func <(lhs: NSNumber, rhs: NSNumber) -> Bool { + + switch (lhs.isBool, rhs.isBool) { + case (false, true): + return false + case (true, false): + return false + default: + return lhs.compare(rhs) == NSComparisonResult.OrderedAscending + } +} + +func >(lhs: NSNumber, rhs: NSNumber) -> Bool { + + switch (lhs.isBool, rhs.isBool) { + case (false, true): + return false + case (true, false): + return false + default: + return lhs.compare(rhs) == NSComparisonResult.OrderedDescending + } +} + +func <=(lhs: NSNumber, rhs: NSNumber) -> Bool { + + switch (lhs.isBool, rhs.isBool) { + case (false, true): + return false + case (true, false): + return false + default: + return lhs.compare(rhs) != NSComparisonResult.OrderedDescending + } +} + +func >=(lhs: NSNumber, rhs: NSNumber) -> Bool { + + switch (lhs.isBool, rhs.isBool) { + case (false, true): + return false + case (true, false): + return false + default: + return lhs.compare(rhs) != NSComparisonResult.OrderedAscending + } +} diff --git a/Pods/Target Support Files/Pods/Info.plist b/Pods/Target Support Files/Pods/Info.plist new file mode 100644 index 0000000..6974542 --- /dev/null +++ b/Pods/Target Support Files/Pods/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown b/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown new file mode 100644 index 0000000..e94f7c4 --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown @@ -0,0 +1,28 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## SwiftyJSON + +The MIT License (MIT) + +Copyright (c) 2014 Ruoyu Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Generated by CocoaPods - http://cocoapods.org diff --git a/Pods/Target Support Files/Pods/Pods-acknowledgements.plist b/Pods/Target Support Files/Pods/Pods-acknowledgements.plist new file mode 100644 index 0000000..b9eceab --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods-acknowledgements.plist @@ -0,0 +1,58 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2014 Ruoyu Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + SwiftyJSON + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods/Pods-dummy.m b/Pods/Target Support Files/Pods/Pods-dummy.m new file mode 100644 index 0000000..ade64bd --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods : NSObject +@end +@implementation PodsDummy_Pods +@end diff --git a/Pods/Target Support Files/Pods/Pods-frameworks.sh b/Pods/Target Support Files/Pods/Pods-frameworks.sh new file mode 100755 index 0000000..d385bd1 --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods-frameworks.sh @@ -0,0 +1,91 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "Pods/SwiftyJSON.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "Pods/SwiftyJSON.framework" +fi diff --git a/Pods/Target Support Files/Pods/Pods-resources.sh b/Pods/Target Support Files/Pods/Pods-resources.sh new file mode 100755 index 0000000..16774fb --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods-resources.sh @@ -0,0 +1,95 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Pods/Target Support Files/Pods/Pods-umbrella.h b/Pods/Target Support Files/Pods/Pods-umbrella.h new file mode 100644 index 0000000..21dcfd2 --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double PodsVersionNumber; +FOUNDATION_EXPORT const unsigned char PodsVersionString[]; + diff --git a/Pods/Target Support Files/Pods/Pods.debug.xcconfig b/Pods/Target Support Files/Pods/Pods.debug.xcconfig new file mode 100644 index 0000000..217d667 --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods.debug.xcconfig @@ -0,0 +1,8 @@ +EMBEDDED_CONTENT_CONTAINS_SWIFT = YES +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/SwiftyJSON.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "SwiftyJSON" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Target Support Files/Pods/Pods.modulemap b/Pods/Target Support Files/Pods/Pods.modulemap new file mode 100644 index 0000000..8413413 --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods.modulemap @@ -0,0 +1,6 @@ +framework module Pods { + umbrella header "Pods-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods/Pods.release.xcconfig b/Pods/Target Support Files/Pods/Pods.release.xcconfig new file mode 100644 index 0000000..217d667 --- /dev/null +++ b/Pods/Target Support Files/Pods/Pods.release.xcconfig @@ -0,0 +1,8 @@ +EMBEDDED_CONTENT_CONTAINS_SWIFT = YES +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/SwiftyJSON.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "SwiftyJSON" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Target Support Files/SwiftyJSON/Info.plist b/Pods/Target Support Files/SwiftyJSON/Info.plist new file mode 100644 index 0000000..23e7588 --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.3.2 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-dummy.m b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-dummy.m new file mode 100644 index 0000000..3159bec --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_SwiftyJSON : NSObject +@end +@implementation PodsDummy_SwiftyJSON +@end diff --git a/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-umbrella.h b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-umbrella.h new file mode 100644 index 0000000..ce00ad0 --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double SwiftyJSONVersionNumber; +FOUNDATION_EXPORT const unsigned char SwiftyJSONVersionString[]; + diff --git a/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.modulemap b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.modulemap new file mode 100644 index 0000000..6f41751 --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.modulemap @@ -0,0 +1,6 @@ +framework module SwiftyJSON { + umbrella header "SwiftyJSON-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.xcconfig b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.xcconfig new file mode 100644 index 0000000..6fb4cff --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.xcconfig @@ -0,0 +1,5 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SwiftyJSON" "${PODS_ROOT}/Headers/Public" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ea36495 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +
+![UmbrellaWeather](https://github.com/ZeroJian/ZeroJian.github.io/blob/master/img/SupportLogo.png?raw=true) +
+##UmbrellaWeather +###使用 Swift 编写的一款天气应用,现已上架 [AppStore](https://itunes.apple.com/cn/app/umbrellaweather-xia-yu-tong/id1079751819?mt=8) + +![launch](https://github.com/ZeroJian/ZeroJian.github.io/blob/master/img/launch.gif?raw=true) +![addCity](https://github.com/ZeroJian/ZeroJian.github.io/blob/master/img/cityView.gif?raw=true) +![support](https://github.com/ZeroJian/ZeroJian.github.io/blob/master/img/supportView.gif?raw=true) +###项目特点 +- 使用自带 API NSURLSession CoreLocation 网络请求和定位 +- 使用纯 storyboard 布局 +- 7点本地通知提醒 +- 加入了后台刷新更新数据功能 +- NSKeyedArchiver 持久化储蓄 +- UIView 和 layout 动画 +- 加入了内购和跳转到商店功能 + +###使用的第三方库和资源 +JSON 解析: [swiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON) + +天气 Icons 使用的免费资源,自己使用 Skench 增加了颜色 [免费 Icons 网址](http://sm-artists.com/?page_id=925) + +###注意事项 +使用的和风天气免费 API 服务,每天访问次数 3000 + +如果访问超出限制可自行前往注册 [和风天气官网](http://www.heweather.com) diff --git a/UmbrellaWeather.xcodeproj/project.pbxproj b/UmbrellaWeather.xcodeproj/project.pbxproj new file mode 100644 index 0000000..7bb9314 --- /dev/null +++ b/UmbrellaWeather.xcodeproj/project.pbxproj @@ -0,0 +1,550 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 320A8F191C74EC600024F518 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 320A8F1B1C74EC600024F518 /* Main.storyboard */; }; + 3215992B1C3E35CC00F68FA4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3215992A1C3E35CC00F68FA4 /* AppDelegate.swift */; }; + 3215994C1C3E371300F68FA4 /* ServiceResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3215994B1C3E371300F68FA4 /* ServiceResult.swift */; }; + 3215994E1C3E371900F68FA4 /* WeatherResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3215994D1C3E371900F68FA4 /* WeatherResult.swift */; }; + 321599501C3E371E00F68FA4 /* DailyResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3215994F1C3E371E00F68FA4 /* DailyResult.swift */; }; + 321599541C3E372800F68FA4 /* LocationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 321599531C3E372800F68FA4 /* LocationService.swift */; }; + 321599581C3E376C00F68FA4 /* DimmingPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 321599571C3E376C00F68FA4 /* DimmingPresentationController.swift */; }; + 3215995A1C3E377200F68FA4 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 321599591C3E377200F68FA4 /* GradientView.swift */; }; + 3215995E1C3E378F00F68FA4 /* City.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3215995D1C3E378F00F68FA4 /* City.swift */; }; + 321599601C3E379400F68FA4 /* ParserXML.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3215995F1C3E379400F68FA4 /* ParserXML.swift */; }; + 321599621C3E379900F68FA4 /* Citys.xml in Resources */ = {isa = PBXBuildFile; fileRef = 321599611C3E379900F68FA4 /* Citys.xml */; }; + 321599681C3E3B8E00F68FA4 /* DataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 321599671C3E3B8E00F68FA4 /* DataModel.swift */; }; + 3215996E1C3E3C1300F68FA4 /* TimePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3215996D1C3E3C1300F68FA4 /* TimePickerViewController.swift */; }; + 321599701C3E3CA500F68FA4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3215996F1C3E3CA500F68FA4 /* Assets.xcassets */; }; + 322172481C5B7C03008EBA1D /* CityListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 322172471C5B7C03008EBA1D /* CityListCell.swift */; }; + 3221724A1C5B8194008EBA1D /* CityListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 322172491C5B8194008EBA1D /* CityListCell.xib */; }; + 326730E31C5A1CC100340338 /* FirstView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 326730E21C5A1CC100340338 /* FirstView.xib */; }; + 326730E51C5A1CE700340338 /* FirstView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 326730E41C5A1CE700340338 /* FirstView.swift */; }; + 326730E71C5A649F00340338 /* WaterSound.wav in Resources */ = {isa = PBXBuildFile; fileRef = 326730E61C5A649E00340338 /* WaterSound.wav */; }; + 32B94B481C55E0DD006EE4BB /* UIImageView+WeatherImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B94B471C55E0DD006EE4BB /* UIImageView+WeatherImage.swift */; }; + 32D152F41C48B0EE000A4959 /* DINNextLTPro-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 32D152F31C48ACEB000A4959 /* DINNextLTPro-Light.otf */; }; + 32D153711C50BFED000A4959 /* WeekWeatherCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32D153701C50BFED000A4959 /* WeekWeatherCell.xib */; }; + 32D153791C50DD5D000A4959 /* WeekWeatherCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32D153781C50DD5D000A4959 /* WeekWeatherCell.swift */; }; + 32D1539D1C50FB05000A4959 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32D1539C1C50FB05000A4959 /* HomeViewController.swift */; }; + 32D153A31C52B4E5000A4959 /* WeekWeatherCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32D153A21C52B4E5000A4959 /* WeekWeatherCollectionView.swift */; }; + 32D153A61C52B8AB000A4959 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32D153A51C52B8AB000A4959 /* MainView.swift */; }; + 32F211B81C5358DE00B80498 /* CityListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F211B71C5358DE00B80498 /* CityListViewController.swift */; }; + 32F211BC1C5361E600B80498 /* SupportTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F211BB1C5361E600B80498 /* SupportTableViewController.swift */; }; + 32F211BE1C53EA6000B80498 /* PullView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F211BD1C53EA6000B80498 /* PullView.swift */; }; + 32F211C01C53EFC900B80498 /* InteractiveAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F211BF1C53EFC900B80498 /* InteractiveAnimation.swift */; }; + A70F355714621E5F27718690 /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC37378A4ED40604FEEFD272 /* Pods.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 320A8F1A1C74EC600024F518 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 320A8F1C1C74ECBA0024F518 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = ""; }; + 321599271C3E35CC00F68FA4 /* UmbrellaWeather.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = UmbrellaWeather.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 3215992A1C3E35CC00F68FA4 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = AppDelegate.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 321599361C3E35CC00F68FA4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = ../Info.plist; sourceTree = ""; }; + 3215994B1C3E371300F68FA4 /* ServiceResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ServiceResult.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 3215994D1C3E371900F68FA4 /* WeatherResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WeatherResult.swift; path = ../Server/WeatherResult.swift; sourceTree = ""; }; + 3215994F1C3E371E00F68FA4 /* DailyResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DailyResult.swift; path = ../Server/DailyResult.swift; sourceTree = ""; }; + 321599531C3E372800F68FA4 /* LocationService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = LocationService.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 321599571C3E376C00F68FA4 /* DimmingPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DimmingPresentationController.swift; sourceTree = ""; }; + 321599591C3E377200F68FA4 /* GradientView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = ""; }; + 3215995D1C3E378F00F68FA4 /* City.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = City.swift; sourceTree = ""; }; + 3215995F1C3E379400F68FA4 /* ParserXML.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParserXML.swift; sourceTree = ""; }; + 321599611C3E379900F68FA4 /* Citys.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Citys.xml; sourceTree = ""; }; + 321599671C3E3B8E00F68FA4 /* DataModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataModel.swift; sourceTree = ""; }; + 3215996D1C3E3C1300F68FA4 /* TimePickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimePickerViewController.swift; sourceTree = ""; }; + 3215996F1C3E3CA500F68FA4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = ../Assets.xcassets; sourceTree = ""; }; + 322172471C5B7C03008EBA1D /* CityListCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CityListCell.swift; path = ../CityListCell.swift; sourceTree = ""; }; + 322172491C5B8194008EBA1D /* CityListCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CityListCell.xib; path = ../CityListCell.xib; sourceTree = ""; }; + 326730E21C5A1CC100340338 /* FirstView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FirstView.xib; path = ../../FirstView.xib; sourceTree = ""; }; + 326730E41C5A1CE700340338 /* FirstView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FirstView.swift; path = ../FirstView.swift; sourceTree = ""; }; + 326730E61C5A649E00340338 /* WaterSound.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = WaterSound.wav; path = ../WaterSound.wav; sourceTree = ""; }; + 32B94B471C55E0DD006EE4BB /* UIImageView+WeatherImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImageView+WeatherImage.swift"; sourceTree = ""; }; + 32D152F31C48ACEB000A4959 /* DINNextLTPro-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DINNextLTPro-Light.otf"; path = "../DINNextLTPro-Light.otf"; sourceTree = ""; }; + 32D153701C50BFED000A4959 /* WeekWeatherCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = WeekWeatherCell.xib; path = ../WeekWeatherCell.xib; sourceTree = ""; }; + 32D153781C50DD5D000A4959 /* WeekWeatherCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WeekWeatherCell.swift; path = ../WeekWeatherCell.swift; sourceTree = ""; }; + 32D1539C1C50FB05000A4959 /* HomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = HomeViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 32D153A21C52B4E5000A4959 /* WeekWeatherCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WeekWeatherCollectionView.swift; path = ../WeekWeatherCollectionView.swift; sourceTree = ""; }; + 32D153A51C52B8AB000A4959 /* MainView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MainView.swift; path = ../MainView.swift; sourceTree = ""; }; + 32F211B71C5358DE00B80498 /* CityListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CityListViewController.swift; sourceTree = ""; }; + 32F211BB1C5361E600B80498 /* SupportTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SupportTableViewController.swift; sourceTree = ""; }; + 32F211BD1C53EA6000B80498 /* PullView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = PullView.swift; path = ../PullView.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 32F211BF1C53EFC900B80498 /* InteractiveAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InteractiveAnimation.swift; sourceTree = ""; }; + E76A1C10B9FEC9B6E129190B /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + EC37378A4ED40604FEEFD272 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FF206AD08664F268F593CBC0 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 321599241C3E35CC00F68FA4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A70F355714621E5F27718690 /* Pods.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3215991E1C3E35CC00F68FA4 = { + isa = PBXGroup; + children = ( + 321599291C3E35CC00F68FA4 /* UmbrellaWeather */, + 321599281C3E35CC00F68FA4 /* Products */, + 7EE8AE5283A59FF782005F6F /* Pods */, + E3678054E28D90CF25381A9E /* Frameworks */, + ); + sourceTree = ""; + }; + 321599281C3E35CC00F68FA4 /* Products */ = { + isa = PBXGroup; + children = ( + 321599271C3E35CC00F68FA4 /* UmbrellaWeather.app */, + ); + name = Products; + sourceTree = ""; + }; + 321599291C3E35CC00F68FA4 /* UmbrellaWeather */ = { + isa = PBXGroup; + children = ( + 3215992A1C3E35CC00F68FA4 /* AppDelegate.swift */, + 32D1539C1C50FB05000A4959 /* HomeViewController.swift */, + 3215996D1C3E3C1300F68FA4 /* TimePickerViewController.swift */, + 32F211BB1C5361E600B80498 /* SupportTableViewController.swift */, + 32F211B71C5358DE00B80498 /* CityListViewController.swift */, + 3221724B1C5B8854008EBA1D /* View */, + 321599421C3E36BD00F68FA4 /* Animated */, + 321599411C3E36A700F68FA4 /* Service */, + 321599401C3E368C00F68FA4 /* DataModel */, + 3221724D1C5B89D4008EBA1D /* Interface */, + 3221724C1C5B8960008EBA1D /* Sources */, + ); + path = UmbrellaWeather; + sourceTree = ""; + }; + 321599401C3E368C00F68FA4 /* DataModel */ = { + isa = PBXGroup; + children = ( + 321599671C3E3B8E00F68FA4 /* DataModel.swift */, + 3215994D1C3E371900F68FA4 /* WeatherResult.swift */, + 3215994F1C3E371E00F68FA4 /* DailyResult.swift */, + 3215995D1C3E378F00F68FA4 /* City.swift */, + 3215995F1C3E379400F68FA4 /* ParserXML.swift */, + 321599611C3E379900F68FA4 /* Citys.xml */, + ); + path = DataModel; + sourceTree = ""; + }; + 321599411C3E36A700F68FA4 /* Service */ = { + isa = PBXGroup; + children = ( + 3215994B1C3E371300F68FA4 /* ServiceResult.swift */, + 321599531C3E372800F68FA4 /* LocationService.swift */, + 32B94B471C55E0DD006EE4BB /* UIImageView+WeatherImage.swift */, + ); + name = Service; + path = Server; + sourceTree = ""; + }; + 321599421C3E36BD00F68FA4 /* Animated */ = { + isa = PBXGroup; + children = ( + 321599571C3E376C00F68FA4 /* DimmingPresentationController.swift */, + 321599591C3E377200F68FA4 /* GradientView.swift */, + 32F211BF1C53EFC900B80498 /* InteractiveAnimation.swift */, + ); + path = Animated; + sourceTree = ""; + }; + 3221724B1C5B8854008EBA1D /* View */ = { + isa = PBXGroup; + children = ( + 32F211BD1C53EA6000B80498 /* PullView.swift */, + 32D153A51C52B8AB000A4959 /* MainView.swift */, + 32D153A21C52B4E5000A4959 /* WeekWeatherCollectionView.swift */, + 32D153781C50DD5D000A4959 /* WeekWeatherCell.swift */, + 322172471C5B7C03008EBA1D /* CityListCell.swift */, + 326730E41C5A1CE700340338 /* FirstView.swift */, + ); + path = View; + sourceTree = ""; + }; + 3221724C1C5B8960008EBA1D /* Sources */ = { + isa = PBXGroup; + children = ( + 32D152F31C48ACEB000A4959 /* DINNextLTPro-Light.otf */, + 326730E61C5A649E00340338 /* WaterSound.wav */, + 3215996F1C3E3CA500F68FA4 /* Assets.xcassets */, + 321599361C3E35CC00F68FA4 /* Info.plist */, + ); + path = Sources; + sourceTree = ""; + }; + 3221724D1C5B89D4008EBA1D /* Interface */ = { + isa = PBXGroup; + children = ( + 320A8F1B1C74EC600024F518 /* Main.storyboard */, + 32D153701C50BFED000A4959 /* WeekWeatherCell.xib */, + 322172491C5B8194008EBA1D /* CityListCell.xib */, + 326730E21C5A1CC100340338 /* FirstView.xib */, + ); + path = Interface; + sourceTree = ""; + }; + 7EE8AE5283A59FF782005F6F /* Pods */ = { + isa = PBXGroup; + children = ( + FF206AD08664F268F593CBC0 /* Pods.debug.xcconfig */, + E76A1C10B9FEC9B6E129190B /* Pods.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + E3678054E28D90CF25381A9E /* Frameworks */ = { + isa = PBXGroup; + children = ( + EC37378A4ED40604FEEFD272 /* Pods.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 321599261C3E35CC00F68FA4 /* UmbrellaWeather */ = { + isa = PBXNativeTarget; + buildConfigurationList = 321599391C3E35CC00F68FA4 /* Build configuration list for PBXNativeTarget "UmbrellaWeather" */; + buildPhases = ( + 78B24D53E7F9E0A23C8E8425 /* Check Pods Manifest.lock */, + 321599231C3E35CC00F68FA4 /* Sources */, + 321599241C3E35CC00F68FA4 /* Frameworks */, + 321599251C3E35CC00F68FA4 /* Resources */, + EA3A16AFAEF3D099302BE743 /* Embed Pods Frameworks */, + 4139B63036010023A30CB969 /* Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = UmbrellaWeather; + productName = UmbrellaWeather; + productReference = 321599271C3E35CC00F68FA4 /* UmbrellaWeather.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 3215991F1C3E35CC00F68FA4 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0720; + ORGANIZATIONNAME = ZeroJian; + TargetAttributes = { + 321599261C3E35CC00F68FA4 = { + CreatedOnToolsVersion = 7.2; + DevelopmentTeam = MAXTGUJN5L; + SystemCapabilities = { + com.apple.BackgroundModes = { + enabled = 1; + }; + com.apple.InterAppAudio = { + enabled = 0; + }; + com.apple.Push = { + enabled = 0; + }; + }; + }; + }; + }; + buildConfigurationList = 321599221C3E35CC00F68FA4 /* Build configuration list for PBXProject "UmbrellaWeather" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 3215991E1C3E35CC00F68FA4; + productRefGroup = 321599281C3E35CC00F68FA4 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 321599261C3E35CC00F68FA4 /* UmbrellaWeather */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 321599251C3E35CC00F68FA4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 32D152F41C48B0EE000A4959 /* DINNextLTPro-Light.otf in Resources */, + 320A8F191C74EC600024F518 /* Main.storyboard in Resources */, + 321599621C3E379900F68FA4 /* Citys.xml in Resources */, + 3221724A1C5B8194008EBA1D /* CityListCell.xib in Resources */, + 321599701C3E3CA500F68FA4 /* Assets.xcassets in Resources */, + 326730E71C5A649F00340338 /* WaterSound.wav in Resources */, + 326730E31C5A1CC100340338 /* FirstView.xib in Resources */, + 32D153711C50BFED000A4959 /* WeekWeatherCell.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 4139B63036010023A30CB969 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 78B24D53E7F9E0A23C8E8425 /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + EA3A16AFAEF3D099302BE743 /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 321599231C3E35CC00F68FA4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3215992B1C3E35CC00F68FA4 /* AppDelegate.swift in Sources */, + 321599541C3E372800F68FA4 /* LocationService.swift in Sources */, + 32D153791C50DD5D000A4959 /* WeekWeatherCell.swift in Sources */, + 3215994C1C3E371300F68FA4 /* ServiceResult.swift in Sources */, + 32F211B81C5358DE00B80498 /* CityListViewController.swift in Sources */, + 32F211C01C53EFC900B80498 /* InteractiveAnimation.swift in Sources */, + 322172481C5B7C03008EBA1D /* CityListCell.swift in Sources */, + 32F211BC1C5361E600B80498 /* SupportTableViewController.swift in Sources */, + 32D1539D1C50FB05000A4959 /* HomeViewController.swift in Sources */, + 32F211BE1C53EA6000B80498 /* PullView.swift in Sources */, + 32D153A61C52B8AB000A4959 /* MainView.swift in Sources */, + 32D153A31C52B4E5000A4959 /* WeekWeatherCollectionView.swift in Sources */, + 32B94B481C55E0DD006EE4BB /* UIImageView+WeatherImage.swift in Sources */, + 321599601C3E379400F68FA4 /* ParserXML.swift in Sources */, + 3215994E1C3E371900F68FA4 /* WeatherResult.swift in Sources */, + 321599501C3E371E00F68FA4 /* DailyResult.swift in Sources */, + 3215995E1C3E378F00F68FA4 /* City.swift in Sources */, + 3215996E1C3E3C1300F68FA4 /* TimePickerViewController.swift in Sources */, + 3215995A1C3E377200F68FA4 /* GradientView.swift in Sources */, + 326730E51C5A1CE700340338 /* FirstView.swift in Sources */, + 321599581C3E376C00F68FA4 /* DimmingPresentationController.swift in Sources */, + 321599681C3E3B8E00F68FA4 /* DataModel.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 320A8F1B1C74EC600024F518 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 320A8F1A1C74EC600024F518 /* Base */, + 320A8F1C1C74ECBA0024F518 /* zh-Hans */, + ); + name = Main.storyboard; + path = ..; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 321599371C3E35CC00F68FA4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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 = 9.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 321599381C3E35CC00F68FA4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + 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 = 9.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 3215993A1C3E35CC00F68FA4 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FF206AD08664F268F593CBC0 /* Pods.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Brand Assets"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution: Jian Zhang (MAXTGUJN5L)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Jian Zhang (MAXTGUJN5L)"; + INFOPLIST_FILE = UmbrellaWeather/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/lib", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.zerojian.UmbWeather; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 3215993B1C3E35CC00F68FA4 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E76A1C10B9FEC9B6E129190B /* Pods.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Brand Assets"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution: Jian Zhang (MAXTGUJN5L)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Jian Zhang (MAXTGUJN5L)"; + INFOPLIST_FILE = UmbrellaWeather/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/lib", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.zerojian.UmbWeather; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = ""; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 321599221C3E35CC00F68FA4 /* Build configuration list for PBXProject "UmbrellaWeather" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 321599371C3E35CC00F68FA4 /* Debug */, + 321599381C3E35CC00F68FA4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 321599391C3E35CC00F68FA4 /* Build configuration list for PBXNativeTarget "UmbrellaWeather" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3215993A1C3E35CC00F68FA4 /* Debug */, + 3215993B1C3E35CC00F68FA4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 3215991F1C3E35CC00F68FA4 /* Project object */; +} diff --git a/UmbrellaWeather.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/UmbrellaWeather.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..9e1e774 --- /dev/null +++ b/UmbrellaWeather.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/UmbrellaWeather.xcodeproj/project.xcworkspace/xcuserdata/ZeroJian.xcuserdatad/UserInterfaceState.xcuserstate b/UmbrellaWeather.xcodeproj/project.xcworkspace/xcuserdata/ZeroJian.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..fa3606002cc461e1111854f50f8a0bbfad8c78d3 GIT binary patch literal 11450 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 literal 0 HcmV?d00001 diff --git a/UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/Background Fetch.xcscheme b/UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/Background Fetch.xcscheme new file mode 100644 index 0000000..f36d3a6 --- /dev/null +++ b/UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/Background Fetch.xcscheme @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/UmbrellaWeather.xcscheme b/UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/UmbrellaWeather.xcscheme new file mode 100644 index 0000000..fda95e5 --- /dev/null +++ b/UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/UmbrellaWeather.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/xcschememanagement.plist b/UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..69b3e2d --- /dev/null +++ b/UmbrellaWeather.xcodeproj/xcuserdata/ZeroJian.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + Background Fetch.xcscheme + + orderHint + 1 + + UmbrellaWeather.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 321599261C3E35CC00F68FA4 + + primary + + + + + diff --git a/UmbrellaWeather.xcworkspace/contents.xcworkspacedata b/UmbrellaWeather.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c9c50c0 --- /dev/null +++ b/UmbrellaWeather.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/UmbrellaWeather.xcworkspace/xcuserdata/ZeroJian.xcuserdatad/UserInterfaceState.xcuserstate b/UmbrellaWeather.xcworkspace/xcuserdata/ZeroJian.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..6a98ca0a8472a8377b1d25da53d525e7a27f4167 GIT binary patch literal 181962 zcmeEv2Ygf2_xQVS`mD#q-|OXT{JBl$#o#Z4Jylp zh~NMfH@H}CMTQ#(ptumlt&IPD@3kduQXsXZe)<3We59Et=bU@?IrrYe>hdywt<}08 z0~n4G7>QAsD1CZ*%^2ehUyZ-4s&b66s&J~WsMbH$=&dQ5Qifh0VXUpHj>W*jdpE~O z>o6J;tk>*;$31Nv7h*m_=q@2d`2814iiU-Z-^g=W5mzI3F3F+58@xn5kr;?Rq73n8y$ywxVaz1$#c{OC&{PC=g8;D7s;2%9pp~(HS%@xZSoy*FS(EW zfc%jBlsrg&Ngg7Tus7_R8%0^{TPAZ4$N_C^Iqm~TTdCWrJE&FEYU&>9UTPin0JV{N zh}uMLrnXQ|QqNM)Q7=$0QroE=)T`8M)LYcs)O*xk>V4`1>J#cy>I>>i>MQDN>O1Ot z>Nxci^(*xo^%wOwb(%UOB1EJ}EMi1*QIsfFq!6h@38EB{TBH}Hip-)k(dD8}BCE(I za)_LwE~2iYD@0d{@q6F`}`eiK0oOLQ#>ZR5V3YE~*es7uASn zh-QlBisp#|A}G2}v{1A}v{ZDn=oZm((e0v@qE({1MfZsA7p)U*5N#AaD%vD^LbOHn zjOba>Hqi^BS47)IyG5^x-W0th+9P^TbU^gJ=ws0*qR&NNh>nQ95`8QBPV}Sbxab$r zucALie~C_sPSZF|&@?TkWwe}*p<`(!t)i3Z6k12?X%lUxFQYG~GifVrryaDL?n3vV zub}hje7Y~)j~+x1riar7^k{kvJ%OG`d+9>DlCGkw>FIP0?Wb$$I(h~@hh9iuPcNbu z(@W^3^bPcl^h$aay_$ZI-av1pAEFTlCxXJM_Es z9{N-IApIHrIsHBT1AUDCkv>lUME^{mpik3h#F!X}<>DxDw3rpgh-1YHahzBu){9fc z8RAT_RcsSyiL=Fa@s;A9;#_f_IA7dL+*{m7Tp%7H9x3*U3&lm^VzEzLA}$qA5!Z_A z#52S*#k0h-#dE|9#n+1$i5H7+7vCYiQ@ldFPW*s)z4$@#7V(qfr^K&_w~Kd(-xco> zzbD=+-Y4EKJ|KQyd`Ns)d_??}_-FA6@h{?E8H@o8&JYaAP>hJ783hx^#4~y(l`$|z z#>AMJG{(Z%83*HJau^rmX1Xw4nLbQkrXMqs8O4ldikM=?$CNOo%oL`Knaa#yW-_yw z*~}bfE;El=!YpNOU~Xh?Vs2)ZF?TX6n3c=}%zEZQW&^X4d5C$Kd4zeEd5(FW+0DGl zyvFQj4lrLbhnU06apouHXXXTRnmHrEBtU{o2ni`+B{7m%iAJK8=p=ecXGw-6Q(~2L zlXRE#kX#|TQqohBD;X>qA{i=~AektcB=Jb5Ny;S^l1j-O$y~`i$s);O$r8y@$(@oF zl9iHGlJ$}YB^x9gB~MA7mOLYQR z(kaq1=~U@7=}hS?>1^p7>0IeN>3r!`(k0TR(i@~VN>@r(NmonPNH<6~N*|IwEPY1$ ztn@kQF6nORtJ2q``=tk@?@K?B9+n=FekJ``dP4e(^jGO`(%+?j$OsuJqht!1Ql^q6 z$P#5HnOT-5v&if+hs-IWW!|zGLLMs%quID70HTaK3R#ZM&_5*%IaiL zcD3vp*|oA;WVgz0lP#0oBfD32pX^cDCfR1$R@pY$3$hnwZ^+)1y(N2F_L1yk*(b82 zvTtPH%6^mmF8f3Fr<{~ia*;e%u8_ycb#lEtRc?@H%B^ynJWJj~euex>c~AKu`C$1F z`B3=;`9%37xko-tUM{bYSIXze=gQ~F=gSw%m&ljOZ;-E$uavKnua`e4-yq*8e@gze z{2BQU`A+#R`Frxc@_q9C@-O6H$`8qZlpmM>B>!1{N`6{?CQ2G5i;_o0MI}WgN2Nqr zqSB)-i@H22C(0G&j_MWFJE~7q->4B$Bcnz|jgBgcDvt6+O^>RH@<-K11)^Zo)lt_( zT^n^>)WWFiqn1T2kGehTj;OU!_eZUZdLZiYs3)SfM7FPK-81o1@dBEz$O9N3=6KH##pm zKYD2Nu;}5@lcGJ*lcT-S715Q^RngVa^P=ZRUlqL|dTI0x(Kkll6ul~Xb@ZC(4bdB; zABuiB`kClwqo0f36}>z9)#!cE`=bv;zaM=l`f&7-=&z!Gjy@6nOZ2ZS#sU^+qu6Mc zWm8x+t6{b5J7VY{;3*zRmUwm&<79nFqm$Fk$t61J3`!q&2N>X>U{u8p}a=GK_oVwT0+6LW9OeKC*5Y>L?&vo&U0 z%nLCu#=H^pX3SeLZ^wKT^Kr~4F-K#*iTO6>x0v5!{)qWAmW-uhMX_|OA~r5IK2{%_ z8f%C(##&=-v01S_Vy}q3GIn6>pxD8&Lt@9rPKcctJ1KT*?6lbO*oxTMv2$YQ#?Fgf z6uUTfN$k?tJ7ZVGu8dt3yFT{8*bT8y#y%DMbnG*+J7Ran?uy+VyEk@U?EcsTv0ug> ziai{AB=)D+pJPwNo{l}Ez!WltToI*6QD_x9gY+^M)D7GthD0V9LDBe@-ReYxST=9kCOT{t8kBZ}ppA;t*rxd5-ByrL>SzJO~Vq8*O za$H)RB`!VgvN&g4PMj+)Kdx6?@3=m31#u(dM#hbbD~v0OD~|KUO^>UI^T#cS3&g>= ztK)8pyE*QbxLf1yin}}Rp16DC9*KK2Zd2UmxUF&9;$Db*G474HH{;%l`!MdKxR2w$ zjyoFnP29I}zs3C?_eb2H@nk#|FN&w*74dQL@$t&|)ObU@G2Rq!i_ePBj;(v<&IsQca>G(5BObL{7 zWt1{n$tqKnYNbZ0RbH;_r0lHBPy=BDH!HU&pHV)m+@^d%`HFJ8a<}qT<(ta4lzWu#DGw;$SAMMgMESY$ z3*`~zSITdd-zk4o9#{UN{8jm<@-O8nJe zU9QShWvlEehpMM4SCyyASM^f$R`pR0Pz_N{R83NORFhR+RiUaxRjQhwW?XF zd8+xU#i}K$rK%fLH>z$@-KM%jwNCYbYQ5?~)dtl@)uXCSs%KTtsh(GDRlTIzp?X)f zNA;d+uWFxazv@HPr>gH%->ZI59aH_NIP!Nb01~JKCLumSnV?EYNJvab zO3)-|6ATHq1V@51;mU;kguV$Q5=JJBO_-Q4Euk`DR>Hi5K*9|PHzwSga8JVh3F{Iz zB|MSvbi($89SN@{yqWM(!p8}pBz&51FyXU=LkWiyjwSqOe7PjL{TE0 zC{AP&<%uzg+C)R5F)<@CE76&lo0yl_CviaH*u;s6lM<&SmM2yx&P$x12otYMT$Z>z z@%F?!67Ni0k+>%DuEYluHzaOMd?;~K;uDE4Ccc#Ta^fqA+Y@&rzMA-E;zx-G6F*D* zCh>>FpAt_do=O5qRFWb|oup4PCE1d)lAK97NnMlrB@Id%oHQnBLek`<@}!ES=}C1- z*Cbt=bY0TIr0bIwCEbv8W73^TE0R_wtxCE(X>HP`q|Hf>B|V<>MADX|XOgxiy`Ho$ z>4T(Cl8z>Qlk`K-$)l6UB#%uVmpneXFu5qXIN6t6k~}qeR`TrR1<5xi z-;{iF@-4}CCa*|dnY=1_b@DyQk0x(Qej<5G@^i_%l6NP+o%~MnyUBZ!-%CD_d^q`N z^0DNXNk~aaQKuMEj49R>TS`_+c8Wd4k>XD2lF}n(V9KDB zf)sB`VMwI%Q$X^(i-|tV~&za(Bwwlnp75q&%APc*;vD zJ5qM0yq5BM%G)XLr0h-Em-0c%hbfNK@Qovyx2eYv`m+N!px9cs6_i@K}&3Ux1aZ}kB6K=mN?5cN>?2z80NR6Rvq zrk<*vrY=`kscY1J^-T4A^;PPt)z_%6SFcpBQm;mg zKdpXVy;c2^`aSht^*;4}^#S$!>JQYPs6SPIq5e{RNd2|?2lX-a&*~HE-!)UaX zv`=cE(mtnsQTvkiW$kY5tJ*iUd$jLq_i8`XexyC9J)}LXJ)-?i`=j<3?XTM3wEt*N z>M$Lp6X|H3ToQuS}okpkC8FUt1y6!TaRcF&VbX{~^b=`Eiy5710x`Dbux&qy3 z-2~l4-6UPHZi=o#SE;Mg)#+yIuF@^g1#}B_OLRBuZqePUyHmGXcdza~-CErS-6Oik zbx-KF=w8z8(CyT{rh8rYw(cF>Ufn+3m%2l`!@487uXJDQj_Qu-e$@S<`$uScOXuhgsbTD?xM*Qe?YdW*i3zKg!AzMHpfAi~dRdQ~Ia%&*-1kKc|0Q|Dt}oez*Q@{X6=1^?UU1=?~~X(jU}+sXwIuM*pq; zNB!^mKlFd<|I+`Ril-8(>8Y2cUY^=1wR37lYG$f6)s~u-nw@G-b)-5|b5dQY?$j=+ zSElw%?UOnvwIFqDswdT#IxTg2>de&nsn?_~PQ5wx_SDs>_oY6Nx-oTA>gLqPQlC%V znz}9Zh16G4cct!2-Jg0O_5IWjQa?=nDE0HyFH*lsJ(l`o>haW{Qh!eUEA{Wx(+0vo z8YqL@5M_uqC=7`PwLxP@HP{Uy5V>Z!<14 zE;p_*t~Wkt++f^je8~8)@e$+G#%GMr8lN-nFzz(&GVV6+F}`QqZ#-iB%J{YMsKIai z#`uHrxbY|B&&CtR-%W&xHi=D1resr!No~@Yv?iTNZ%Q?pO+8Fkn65PSH07G|O!=l> zrrxGLroN_rrXi-Grje$Jrb(s}Q>kgb=_=C#Q@{jGSDUUeU2D3|w9s^i=}yxM(@N7S z(`wTi(_NA2}P)1Ri(rZZ;REH+EctU2DCXjYqbX0tiXe7U)kIoF(L&Nufm_cr%2 z_cix3_csqP4>S)k7nnWf$!4#)&|G9LHCLId&C|^_=9%XC=Ede4&CATo&9|FZm{*!t znb(^iGCyYCVt&&6vU#WZ4fC7kcg*ja_n7yY-#33`{?`1R`FryZ=40j`&3~K!F`qP_ zGM`Q()2K928l5IiW6~sP$~0A4LRw;4QkpJJpJqxkr#aJd(p+iov@U5~(|V@mru9!7 zkTx)FOxoDAacSezCZtuSRi#y@O;4*y^QYCO%}bk~wm5A`+S0UTX{*!Lq}`Qvf7-^h z&1p}iZB5&jwmofk+TOH%Y5UU-q`jZ^LE6EzFVl{ueV_Jo+8=3WESLpY7>mRrwJ0oc zmUxTWqOoW#I*ZeiV{uvBmM)gAmTs2rmL8TXEPX7)EaNQ`EJcy|exZ(826ylr{M@~&l% z55C)$*t1q~%mPNXOHObUIy}9+w`Uu1r^@C!`zGP3h+Jv~){) zMtXL7*Ys}b-P3!e_fGGVJ}7-~`tbBI=@Zj^=_To<=~d~~BaM}H<>mV@29sb?Ool~c zv7-kUWK8qT_K!n<>+9sBj78;Mzke+z$D#swfLM#MSWJL~l5EJxJ#1XR{9dE0YNq+C zy+ywKs-n6IUuCU_HTH7ba$K(7uFh_|+uqrp-8;XtyLT^l=bU_})#2{tvf8qo4L_~K zw3uZBros}iL@WtQ#!@gfrU_61QGgDJ157{?kOpKMFde4HQZWNvkOOAE+Rip?B` z%-4|l6-wk#k_jbNh?@{rxivoTwCbv|%36QVqS~?<-dbO=hfT`&m3ZsQYkL)!)mGIM z)S_4Yy{l?Q4j<^Bz<vPy3)>K%AkbrS%+YrGY{g0eZj zdKezoI?(H{&8w=YF884y9LlvE{I!T70@z%y-&f27E~}kA+*e&ygE$r4z_ih2mBm#v z{T?=9xUUF(M?kXST@FX4fnnKLPt5WtX2%?u6U)I|m>cVYb;Y`2-LW3n71))5=l~mt z3B(2zfw(|?Kp9X45(0^Vq(JhcST2@_3FV+w1j}5>EVuP^3ffOh*K+$E8 z?g{BFkbVZzuR?JK6wig?-yriaWHv+QbDq8CF-29yz6`YV1IlVMnj)G}P*qn`Rq@2S=6pX6E|}>q<*~H4S7o|4P5gT3<~G60O|2vhreIP4gcc(=XS<<}~@0^L?cN zE&c4mDsK%E2v<>6MTWN;EmuZyZN{K7e-V#RA8%c$&p)zXMz2a=P3dg@sjyyW@w5v+ z+CV@UM(|%7*c@ywHV>PRU4<>c0vN=u#;(Dx#je8^V%KAfu*KLC zY$>tV~=2uVw`Ck?>}l*7>{;wN?0IY}whem$dl7pH zdl`EL+m7wPc4E7*-Po(xYuM}98`zuJTiDy!JJ`F}9_&4AFSZZcj~&3?$3DP5#6H44 z#y-J5#SUVhVV`4PU|(W~u*299>?`bR>?rmP_AT}u_C59kb`1LwJC6N?{fwQ!e!+gl ze#3sp{=ojk{=)vo{=rUSr?Au58Gr!*a6kYOP(TD|AO;MO04b0GIfw$$fCVui7AQa* zhzClb0tp}yB!Og*0@OeQv_J>+AQc#Z5tx7(qyY;^2bY1%K_}1|WPnUy1vZccvVk2q zfD_~Z7jT0vpeyJGx`Q6z3UDRp335Rm$OpYZZ_o$y1^qyOFaQh$gTP=g1Plekz;I9i zMu3rE6c`Q0fU#g47!M|Zi2-#$7f1~l1LlAwa9N;JAR}N6WCiR2XTTNc66hA_5x6pt z8^{mz4)hK54-5nusyIdusiTt;Eljrfp-FX0(%4d1Mdeu4165; zH1JvAi@>44k-*o1Zvx*1ehB;+_$hEA@N3}rz@LG?11AHgA;2KOAs`_TK_G@e0)Y&I zCoKrj!2s~`wKa5V(iLa-2mMG!23;06e8g5VYiZi8Ss z1b0BN0)kZ#tbyQe2=0YoEd=WzSP#Jl2p)pq5ePOx@E8P7K=334Pebr51kXdT4T2XT zco~B25bT6tHw3Ri@CF2LLGTU)dmz{g!F~wdhu}j9K8D~^2tI@03kVKDa0G&{A@~M@ z?;!XAf*&FH34#+4{0hPE5c~RH;55WBh~p3^AufWr7~&F$%OD;FaTemS5RZen z65c9*z6U+j$ z!5lCb%meemRbT-K0K_hE4Y(Fu2Nr_s!6L92ECEZw4d6y_6Sx`N0&WGjfn{JhxE4>$=-ekI-$&&Bibe7qOl z8}Ebn#rxs?@d5Zid=NeuAA%3XhvCEV0(=BM5+8++#>e1e@p1Tgd;&fZ;wca}Lp%fG zHi)|+-W}q-Al?t+!yrBqavzus@luFaLA(ayb07{OejUUYL;OaF-vaSv5MK@Pdmw&4 z#2<$ECWt=`@fRWf3dDCp{4I#@gZM#+e+BVxApSkXk3sw=i2n-le;|Gu5;!D8kdQ-y zg+v@A5+IQb2`wZHkVu2X<&emLgbfmINOXh56_Ch-L?1{DfW%-(42Q%hNQ{F-AtXv5 zF%=S(keCjMI!Mfh#5_n`1Br!@SPF@oA#ocd?tsKfNZbdB2OzN#5|2XSF-UBI#50iC z3W*mX@d_k%LE<$?ya|bSA+Zkyb_Z6kn9V|0gxO5$pT1@ zg5+38PJrZONESnK3M9)RSp`WyBxgW!HYDdm5<>DiNG^ipQb^tm$z_nd6OyYSc{e2Q zgX9B{+z81>Ah{WmPeAf1NInnA7a_SFlDi=JIwaqQ}j0LhOac@UCcLh>s}ehbMT zAbA{;Cm{JdB>#rwDM(?EA|WM)loV3Ykcx#=JfspKrG}IqQYJ{HL#i{RtdO!p$_1%z zkh&65d64Q2seX_e45?v|8VRW}kQxsu52T79RSKzTkg9@|A5t?RH3w2xLF#HqT?eT} zkh%dM*2^Lh5@+9f#BjNc{$>zaVuAiZCc5pooSdDHKIRkpha8P?QKoYADj7 z9AO_m8I$5(ybv$Ki@B__5amAO(ccjc_EiJW%y^7mDC1fQ_Evx@UU0S>O6~!<2x6Z`BC2Pt0*j= zjri-Y^%hO@lyDjA73JQ#%AzR+K0h}QH{4g!J*ULw@MRa4WLs@kGyh3Gwe9QmPw8%R zWIOH7Y^U4daJ!v$x65j^2YsgT>sdwFZg+__7^m4hPADB;7YT>jWRY9sBA*?4xsrgd zC(l{Lf>3T=#bchh_m6iSyWWw%yKs2<~2M{=^plQyK|FQ zCr){|2QC+M5l{H#9(HCVgtuPNdR3IwqN+o9J-d-drn4soWHl&SMOASfZ^L?5 z)m0Yrm7R%X6$hOfM;8kw@8$d;B=)l~R1%Z5&=s`L#h$f&M=Dd&gMcyqzMn%URqMb#I7ra)K56f`?Yf62!-MuvxPJ3s*y3)C<%J0f(BF?w*jLh_~Ya&_I_B9UY zHnDf|7~9a&4-HxRk^Q&=(8zws9M<^!Q@FLNsVcwN>t9e-QHR#Qs^&am(D=FYOM^gI zs30^aHH=938?XtHjIwN(^Q>T?w}ZXL8lKJB9`>hp7mRkZb3?0&{h1?pH85pa>&tEE zQE#N+{!IQ|?w^ceuKbxXtEi}|vZSmum<#vuTyV730~HoI+}YluoG>29mTh-CbFytN zhr^MbZL?-u-60+becfd*bh*4uRCYa&Qw~yqQ6UO2tj=3gJ14KI#+Q-Tv)+Q{p|I-` zP=O%QLiL~tu@Nc3ESJ+0Y#*Dc!NWYW-5&O<|6Mg`F$z1kp?!=ey{m_PDH788c>in$ zkT2v57dMJ&jAufln5TH6x_ek(Bt)GziW%+mP0On)FGp2<6v>8PUyu^bSu`pAHKEoY`5nVpI{R(<@h(4 z(6)5^AM#8d;9)sp74<#c77x) zb>48CPwo5oP(q)X$BoUQY`>tosKq6puxV&|vi=Y+96L6*~)k-jFi8-R^R`99Eah>a^M&?i_1YPDqUd zwLBb7Z$^fj=+ZZn0-gWLNH(o(5EReii5~X$c9-+! zMzQ(xv*|_HxP*}KsCqmsD$iYboASI?qB$C<;-Bv;_m!fSL5PwN(L4@bB#~o6B(fps z=90ql!Bw?oCH0MiOF%ALj=V#tZAKmepl%$|eJkQdw)+47_(_OLy0 zv~*c6S5Z@cV&QR`=3!SwVnJHv)SFwC=FcxAE+RVf_*S%bSzR_4S2Xa3E-PA8mkY_Z z+ii1l>yG{nm3~`}v$)7+YcfVaWbr6fwRTzmz4W{6?vi3x6Y0<4ahmR7DGK{6b@f*_cmWY=>~s66G+qKho@&=*hFP&cnVL$!d0Z{cvQz zeidlAfD@0)>+?MRh0qwHH&5V94|_`_1h$J6>RndjZ$Y95@L10FurngTGIFK5fT0s& zD38lr4_nu+xb&^6;MeaQc_A^9M`gZ;eKrzQI!-#zne!3jcxo1S*s4gViFlFEjf96s z0(#h+BSE5F^kI;3vx;Ye~_#(E1AHj^jHcwDcGaGo>bRSm}D+)YoS zlE>)!paRcDnX9Vv*JPHL6>|U2$*3(X4r-qeejcU8t&Oc(4rH8JS#}#5)6B}wadK6U z9Cx^pj+`76n-*D{#4)pYl$N3(Vt7ap(U4sBM#D^K7i3XQSv4xfU+h4l9SXxOXO>M# z4HH^icxAX*(PKW(=o>xkiFQ}!c5BXF=u{ILxAviN?{ITX#ML|>ZoZ_N)E880C$8ry zzxCopH;u)u(0K3$9+zbv_Ur#$X>1|AZJ3YX7KIz~Z(e36Zslpe{r~D|^&`C_`?YO7 zt?6_OaR<-tJ3Z|Bb{Dng64Cs5y`Elp+O(R-eWi!JtHW_`h-bNE?_9~ky*$dR+dFS* zh+5Bu$^$$qcX`-AB;1QQCKR@Dpbat?w6%kHh{x(4r2gGnjCd~j*%iK`6gtG;a&&X9 ziEUyt&(ix4OAA9-%1s0}nB`DsEEC*~{a!*~89_#DKIu-YTfBDXT2a%q_1AzgLp@fJf+Y4|^yQgj!W)ZMT|7 z3pvEOMz@JidAhfF*x8ZL9q~e3XiD%UkIqvUtK!bbmLXa9*E|x>beO_8yd_q5VUr!z z#P>W-&mn6WI_uRWtP2U^F1CAWlWuAgl3Ew3M%-EbiD&WFj$3x06YX(yH?fny@i@JJ zmOXUXydi2XC_>wJ%Q;cL*h_s;>)mI`Y|AL*Z=S&~dDz<`v45?y`_0XB^XKQBtUJTw z`HF|Vr^E5&hS7(j1N?+z2hLGdAxR$T9sh-W^Y!(#hMZn_8d7j286M+ZNZ&%Y4L9nW zkGqZQEZvv3)-@xx4Rw!<;+g$wYYi@U4h%Y<6*UTjhO@%Vz~$KO)^OvCj^g61;;h0Z zfhnoraeCduz8s03bzEj!FW1~3)In%r2LYMDQ}w2Yef@ufs>tf3q?#x1?N$qt)0*S( zxtvAk7NndkG+ftYSg`&;A#M(~FuSP9{zEdA$LZbH;?!~j-F9JzA~=g3b{iW03~K6= zX*^EvdDtxtV$iO02Io1vg^Tfm_H%`a@_Of@(~N6oqXS*4Go}O+(upTzUu&7m4L%n- zyjka6@N7qpJ-(Bm&lPuIa+##4CBq zK0)F#E<{{{EQD|z0y@AP9WsXwy}AU1Cy2OE^Vf{rwiKmaJi`zE7bg81CqFV9ABEbJ z{ye^)d)RLx5&c$WX&245UbuP;;i>-;smEm@>d}yt4D=TIF8TpRZBptHCm7>2RVgj?)M&cZ6u=CDtFMlNZ0&%V}#uB zfIsk~j63fm)Qwf}cpv*0g6i;E?arKY=c(ujT&FD?9dOAVquZN1MYldrb@}Jc9x1B)G@eKdP!;Xo>f}GcR1)bL&T&{rpul?3qz5my>AV*1Yw$It5 zp-3*|ary&^TyBWoHwKj*y;Z+W#H?l4bRomU5sTJRp0R(mcCoqIl+RZfX0v&d)6H|N z4piR@W8_gW(p8e}E^K1tZ{czJ2QBuMEiZOQWDpm%gV<6&(Q*`W?#UYRcAl-LTD#Q$ zTCbfphu4h`#SOMKt9YEwprsByK(j%wQJbK;suCTNeF^yPmbJT)%82~*d6xVhj=d0o z_MTk2@an)i0VARVrO;Va;&3#P!i@q_6cWRhN7o0J6<*Q;i0Ere(c2{Oltw%a9R>+H z_&KlVK=15JLbrp63XRO`$!tpwZxJ}m{LdWDdI4MV$!7(kq)2SedHBX~-}E|kf9S>5 z$TkV_8gryjF)0{OPgod1Ie%=|bQ1&lg1}3;hrPN@^M(uDt=hSfJb#A2NkeqIfLL@} z?*ZVphqsW_yej-;Ok3}xzffKj*Hu)^&Zr2EeclpKQgoOr%yHU_ZH^`*eB^rqQt?Rt zLYtvM4Iussr}~SI{wI|%h?Yh<4Z4g4T~Jj|U8^*)SxNtWfvYOS)h;0^O%Nu73-Y|> zK6KU1MUQpc#IOZX5{{=0w6z6CKM^>Z*w(Yx=Q?IIv_$%afJL&0UC^c$wt3w)^e%$4 z70pnrz7nufd)Q@>VAU=a=Y~=Gu!ozF-wBv%JIn;4OTvmva+>C(#|5PH9d(+BqtI$E zvNx@N{VL#O@UY*u`;uO?p7Mq7b0hx}=r9N{k3RvGnnvjE|Pb1GJ#EfZ;X=yvPIYzYko2pv8DC7b*; zBQT7npFas~8hTPHfw#8yJ{_liw7W05Z?VOzSEv*LnQRYxFcMw*ZwYa8V{#tF)eAH` zkZ}Ls#g?@ZU2NG*l+6Msxoh%T?iLjATR?Izeg<_>n?sFMhA|PX4F;&o1^&7be?zxz zHgscxX7Dd|-hWX!97N~8;&IcO9Ay=F+||Q=e(6}i;6Ogybrh6Cpt}42%toa-Q#$uW zS0QDTSJzZc&E(Ex%JA26p`t%HChH=Qb%lpLcIhl;V{Cjur#?|v2t4TNVap@oLB!#4 z%jdgL`2q@g9(H>qD0JLjgZfx0czb8K1NEqW0%5&ScGgfejOZE{beO-_YO`70p(A*1 zyUU4AGj%!8$)>^YHrxVGWX-bM(F|#@xDOW4>4W@3_~WS1<)hV8%8L9Md3}18l$2Ha z`0+yS9_>rORd5@?8VL+7Z-$Wkue?UH$frQye82XtGdAjeeO}zNuC{7~Z&vtI#i=m@ zRs&G=E)uf$k=O}(s69uHW8}C{k6+^r8eZGr+#oa}XUj!1{QV0tL&JOXg zTO(QSjx)384NFP|iiWlK1+(aY?{gmVO_d9X6nNOFk+3#mO*-pDXO$HOoA&7f0wX)D z5TBFna%Wka%mGp}1f?nkV(mpV!|se?cZ_u7LMgWP(C_sKMnd;nL0j z+rd-otts`@cK6m)1Yg_UEOQD7TpfRr3Ryyo*1{15)O7+f6aNeM91N`!&eI8L1X4=` zEImOJLP2S*KXXh`Rk1I_TV0*Wc~rDj+Mk*4o8c?3sz%pg4=wlBa-o|)vux-TbZ=?I z-s?OY>RTR#6p9-`PCj^egt}QE%6my2es%$)QPgsQ@S^rUfw(?9IoCmK)Jg#tA2M+* zm*N_Y)xD-`FJEMbc(58$gN8M1{1f={C&J(mr z$c{$0xRnV`YhDr1sq?VcwCSRqYf9|wmfCZv^=<*PnaIG0&N&Co(G4!>Ra0~Er&=z? zI3Q107}I_J7I(AE;7x&-v(FifG+yX;Ne3g1REFVetNVg`1pdzTuqz_bqP9|MbkY0F zvXa`_{R@T+&MZLl1x3D~S3naM-eO=|=rXKQJ0V{N&U;7r#8%y~O56=3f zP?h;nKn=3o3NxSJ6 z0jb6R0;xi`%jfn6_qRe%+|0?cxwEpvoRq@dI$czPZe0$JDE<_XTIyksMXJI-4Z_qTvEkn?3BH3m3uuL+kugI+qP8=v4`Jf8X zXyG>=|DPFVZkWzIPrphuK_F~Pgsq{-^|!c~L+O0zcm;Hx@~}rPd@cEkOrEJ{Pg5_4 z$!#;`=JOA%CKq~uf#Dtlt`e^` z%UT>9G7DjKmcxmeUquLD1J-USE#e-Xt+!CLr}XlIoT(GU<>b zXWH34v~MHmrt_vm=NeDr6ZH`GJSbrDUiJ@ckxOwb=B2XHMQaT#39!A4S@lld)RFa z47i92*~)>3P;CruYrHFv^kv8STdyrAC%b7#w_iZ&u!nuAfzKCW$vaMM&W>gb_15@( zHDd-13{{_x1ggG5P9pR^o(3loMh-7&PZ5URwsRMs2^>G#)`!nFuVn@A5ei-R!vYrH zw)cDx=aA580w{kEA3J^{;PHKXhxr#$)juZSa?Hbi6^Vxb$6X03=c5g|4O{+%oH|q< zP6)IgZ|@yS+-U~k)GNfT{UIRqbI17rx5Hav^EJu2P6|l<;$e43A|V~;10v{=(?B5Z zHxK)DB*gu<#s2~ujI>A~{tplP(WOKD*%LdOs~0U5=>5yXRz^bad8-G_z0g2!U1iY} zegY!I=+LZy#6SP7%b8n_mgsl^;ZtpW5kzyYHI9)CtnwD4?UKUta2IXTNdih|JnYPi zu#ip51)(dd<*~uRf8oB;W=uWj-c#BrAWon-xaEn-(Y`{C0he^_TTf#|@$R|Dap-h` zw^Vx%Z`Ah-&J*g;83Hke#^*<8w|KeUT2OH;#9z1s{J5)?{_l9#p!!N%>PdHj z$8rz*NhC7x-wwdeRlK8f1&X8Fd!J{E(iFmcjjy4N2LpDN2(9-6$ zw@tiECo38^cCNLP&W274o-ZE7J+#i>iF?aJ z^pBt1xARuf7>;O%)i!_3T)W%O(ceJKP4u!BiCIqHE-Ypy#I22siI_SrXW^1peifLC zrq>#Qt)cJZfZavkP2WS`3-K(7XG7c$amPA(Eqy-%_5j445YOR(xjL3JB?E??lod^w zYqL7Ck#N{^+=x3_cJ%lxcQ(^cw#c2Q=%*1u&qBNl#JlnYbwdOp?u_~Mv5aArXSp*L z{e(R$80?Gm4i4-~^vm=s^md5%fcO;xaT?p)}5YL5p9uGFZWBKG)J-hqH z8RO<=*=(J3=wNM*OF8afa^9ogZ;?wM&>tdlK8AR2i1*>i=__z){N&zcL*5a%WX7xkhw-6r;@gY3ap&iSl($4=Z zI3*uH*Wq$;hQ^uAafy3;mY!eeKRJ5BD#u^+--w=*5FZZl0-l}`0+&h#6yTp{^6G2P zwudlDjEiXmR7{9TF(np3d=$h-LwpRx$F38L#SA@7EQRz!iPUu)BjXbg2x_R>0 zx!Fh=+)nF!q!`W|#4cxp0TIWGlUiDHak4lC@d&w=Nf7t&08N|Ig555tv7Lv z{1zL;7LGMWu}N$eBOC37cp=1#AYQyqoG!jhfaQaDNh7QdbW`JJq>oypthX82?nZ_< z#9cTdoZ=j@OYDaD6o{8Wd@97JtrK?@cSGxoYzN{=1y4j}$FA?79PMqlnCgjea^}>Q z6Kqb!eZ_;gURj-3;JyWJJ+6~txY zN{*tb;%VY?F+S`GM;WeN^^3~z?tO?GM?fk;+tFK%`M_v z5!_`EUkLH*dAN%NxWk{XS<@+i7>z)oauYg8^n)tsD>5HP2$bMGTsF7n;VxA33=@w`)`_gKMyn~ z$JNNrr^Q=2SYd70Ht`DrtXm;|TQIEgGYnrpcWbCE*(rXV1GY=NTl}i{HHa^V`0WtC z1LAkC6TcyT6H)s%#8*IkB@b*>$7)ReQAO`B4huxs98RPzSzO?1vp4eQ1M#Qa;)OLP z2gRQua=w808i?P;lXJJQc+=PFlJj(eF>&!u+8*qr#b1lR=YWO_I>bMSk0GGPA&w&3 z`*@&8I(YeA^5H;x*Ku>RQT$@dvUA8H4ezAOI_r#n6aUTe{&(>o;y=ZIL3|y=Q7F6~ z;t#G9|06z$;GTx~28eIu;Xc%{y!ZD#ctihdxyYEO$m-y%RhG?#OjjdCjF^#goC+7t zFi}jjAexUr{865w23MW8;`Neog4J*|iaDcXk`XLM#UwC^OcKO5L;Nv_KMwIH)-frJ znx4jJA-)CTPx7#y>R9ef)%EG}89>}|a}2RrQTW1f#~K{GGU-ePN6}@>R)}xoDSDw}DH?Ovq+9)Wj+<-ak{`Dt2idgjtl%t>>BjWr z7CW4-F}X~hu-Gp_{N>=q_Uj(se#Jpyv2Bemg6Yo;;b4VJpP8Y|Fag$fi0=r7HLmPY zU&>=VEQDo)4PeGF6FD}IWyUe%85G^_g7|KTqvYweb<8BjgV>CszSklC1`q4aj%D+e zjzPWm{XK4Oj)MyUvK_oXLXXet)HJ4=Bd46HU@Dm^h$DOa4#eMu_?~slbf!jN&3h2v z+sK*@i~uHGA1}S>szy^xe_KjBIFRHze;%|mDQ_pT~0MirhGD@M&rK^Ig%y3mTzUQEi|!raQ-Hg<49 z{jF#a|JcKBoGa0x|B7_oxj#A!|BQcF|Bvu~!z<X%RFq2i4^lF^F)hQ zXAASBpjux;{Ai~Yx|V-*P{ksu<%uDwJmkqJbcg!rjOA~-dh(P?kx_aSR9QAiS6S~y9fB#E9T zNrCtoNMIZ=0tmbwr#g7T`Uzq$a?xn}FqeTigEJ6GswAzY6_i*c=?LoOkRTvI@=z%O zs&Ctn$K83nInNO^$jQaqjV3{2lQp3e$_&*MFdZn`d(3$~D=xU;!n%h7cCCQEz>Eb^Zac~Im( zk@G~J6Zy{%*GWnwr3h>pB;p~V7UJN4NjsZRgzi+ zIBXIksgukQXitO$ionmB34i9R)`Pow+OvbCVZP+*7LmM0axFq~AtX{Dq2`g))Fb)O zGshR~5n!R@h^r3;N6nHOB)4)54QC1^w@H>EptnOp2MIk7G__uEU+#R(j9rMK+1ygw z930{H>|nzqSuMG@MY#7#)*`s;AYp`riHB=$fSWbryVtmdLU42V?f^PVHz-__JS5rN zA`c#uJdVI_frJGT={(rW>UprJywl>Fc^=pu+4E7>Xyr=AND%6+x#T&?iyXG$a!|=j zl9z>L>I4atR-9d?k}=zU($-rTyZtP%S0!&DVByWx+md$#V409;(%%_Bqf7rCCnumR zz{S}Br}Zqn1CoysJjwf#47BD;T-92Yp$1rlAGvU~cBjUhE>$?uYX zI9TEGB*{t1DFIe@Nc0GXHGO^Gk9&Cpt#C9(EK*X+aInJVNm7YaN>7u@A#o)ndh(pk zt(Pv(a$Vf+33Kg;SVXZM1uaM&Q2!~2VyQyPd!2AtN)x5X>qwE}=0l8&8 zFlzGnxwb40GCJydK6-4maS_*9ag(M>IoA``#7HetH;ouS@lpY0RY?E@nC#+$R=1A*(&p=2F3g&CcfI)A}s1uy7)z+9aO0SUSw+O74 zv^T;LAvgpQsHKFQ?l1wzl3oKAD^H;sC9kbk7gwWnH8HQ!!O{Yb_He~I=?Lja1a~wf z3Lr6phdZ)$ZvZRbQG$Aus_W}MP;>2w5FS|P2JR!OTNF&+{VATbdV zlh#RVq<#dq4iX+nOy=RDWV$2Oc?4zL^+?%7RC&qfO1d@|^2MkxY0a_)n`P+&>9sAc z?{(6Jh^9r5D1t;WPm@pJm2dsj_oMtsakAaW+}luAhCth0oPWw{^!U=7qGRT;5Uj8nq4Z_xD+s|Ikf?!#pGUA(KrnxM?aqzwAV`|G4TOZw|lE&&SL_mI9T-Gdw!MNv&U2GS3u z2RW!=wed6Q=K}3>Ac49pXK5cl!&3HJT1cEO{aVVEg{4QO-$=ieeg}#9khlsG3m_3# zC;dT+%EBmfAs{4Bv{nzS1HE4EefC+Ie+fi5&KAq0e@agwBEmW+>1pX1frx7%aa|)3 zDD?HKwrbXF9n0GgH!@E3;vf^rWaljN$mFspdYX)tq4@WDNT7}k65GX)Sb~O6k-ucNwt#_L;_n@b0>nl!0o=`yaA99EEJnKD#L=49^{NZcB{Y~yFBsyCK}2(m0k z){T>aaIvMVyQ~Mo5JeQrAhDds@OA;ilA?#qG4}C@cCH`bLJf{k(f7jp75}V0Hes&Q!8dmus2w_PuG7tp%Vaqk6{b{H&T&4R>yTB*DiKM@{jPN!84uckE+`2GdYx=Zi$IskZa_e9g2Y3Rc$f$JNCUP*PyalMn-oG?!6A!` zat^|^(bUV9%T~6yuB&9L1tHl4iOn2XesmBi$mo0DVaFX1gaozM8acXF_8^C2IG6eV zxO)!xCadk!Hu**%&1jpwN0}+zgCTT6*-~aJgpL$yOItgbDjWxb1GnI&lnR0a6>$r0 z+zPn&-g_X<|GD=|(j@&_#(Svm|NK3LAgH^gCa2(81t0_3*pLtUP$=B&sVza$WUKg3~ashg8?BvtpEa$!&6-|YV$Azo~+?EilM4+LPlA#P7Nu!_Y) z(kH*ubM1cK{~H2Ktjyg1+y37ny+1(Q!w~lfrT0;R-m#k>Qn0^OtjH#vW$7f*Ko}XZ zqxV15|Ic1Y{!1YduzVciu>2EFa@?!WBQW$hP)eazMFp$C{Y!i^R45dR^e6*B5=hz2^51BLlCYP;$DC_tO%jzU{Q#`U1BO4T7NRa%_8wc zAOMW?kQEtm{$Ozw96(=farcEqj zRm@UgrcHsFwl^W}EeaNk6$If{@1fo9-^y|2Ac}dJBx1ucXyMq-SCCAbX!o3=R)Lu| z1!mgbg}C=9*!KmnGo5J_CoDv4Nq~*<6u~x~ydk6yO$w4{6K#-Iv@0;rrdSGbA41$m z6f71U2(}e(49Y6G7z4p0hym!ToccrE6!42T}^?$)~67MwFhMH z=K|#Mx8$$=_7PzTWMM5I1J_74T%fpw;45ZG6_+Y56V}3)5cd^<8nnvgxi<~ot?9Y2 zu2zs-n`lI-=ulv;O|co`zJa)JDT-J}AjFrwe%-hy+fTywNkVU0W;TgckrNTRwM{|N zZQ^X*p}=$-S+Zzbehf!*u4DBT{egF3 z0-lq{4tQzcsRGfNG+mvR8=h5Ge6Ki2po(oCieD6mD3VesNM+$jRxGxTeQ8aAmEHZ0 z@sfBM0uxomcqX1@>*INlvLNLsioAeg`6)}k7&Zef6OK|vlCyBBqxNK_hi{ni%J{@y zAt%La1vLACw7YzPdO7>YxHmpb?jiAbOT4o;PR6_9-H2u~NaI0Ds|Zq+fabK}i$-nV zhpsc4wzLdPnqitN!qtx-8lTo1E92ASGXxwpAjMKb_d>+l(x9_Td$MwP{AdIw>O;qm ziO)wI3qhI$Qd&lk2FeJtI+&mO~3X>FO8p!a7BZh_$l#I5$-gQ z8bC^`2vUOUBllufT3bnE+=F3Zgj zwiL8~Gz*nYBiNu>h+h+b0pYutn-RY*{z4?`Vvr66sh1L!BCu+S>BE&5euKb;tX3em zj-Ffieigqy{u&|$v2Zi~+W6}b^hS`Tf;5eSP8UGeuB-pp9Vf&lsr0x(D(XpSdyT&# zemepcSL~bOZx-|<6Qo%LXmGoledT1YC7I-JiHX3}VTk;l@%JD&(Zp8#z47-Ujt_t| z2c%fbK&zN1;8^(R_|v9pNV<^p@M5}<BpLi$RJ- z1!U$}0di6Qd4`;akeTVEX(K%weJW&T7O6jXFTFpMu>`VMN1ZZGDHRw{3exf6448fO zLDeVcR$%suIBTih{=c%HQbqVFwihbZN)21DOa$pfkWQkAP8JZIc3a&DyMxLm2P-w` z_(fPSrBO-pKce2R(yqk(j}nQV3epoP&}jlt|7OrWcNGOn;vNDtoN(nJWv}@k5Oo~D;5uEpC4@Q=-ywIIZBfM5mh7QC?)29(4&yf0x7K{1lLZ*;>^xY++TZ^ z1C_@V0dT?g zXRnyENLV{~^ohtNJv>FCJVm* z#M2?z7b-6!u*K}L@^a-Bg18oew2{CLiobUDEtzWrt=OsECP{g%l9nvQ&VedBl~}S+ z-T=~Oke)&jZ3!UyZalkAkbN%Ac4kCGILe!pq+}sZ{q0JjWFc(>X?r+^6~60t-Sh=j zD4ePvqV`@TDOrds=N=`NEQqo%0V$Rgx~V;7{g_!m3vtB=Q}nr=@3*7&(uWxkKBJ%C7PtTv4xAm8=?oa0h|( zB9LB8;a(!Zt=L}i$mlIpmvX2Hp?wJ5K!>R^dnG+fm5o4iL3$ZTFQ-7S5P&W*Eh&z@ z8l#V(BL1aY`BfFF`3PCm zFsmw6RRWgRgA^0|-3zp!BTIL}GKytZPRPis>Qs#gOLQTrnpDk*WeZ3*fwYri8OX2C z`h5S4=iU<*dlqrw@D>g{DBTTpsp_;|X+K@H5}^V}(ade3Py@;J6Kz8q9{7?-h-AMp z%%N#}oY)$!Q0J)5Cy>QXgs3i1trKY922z?~51QiE%YIq8emliCFFlkfR9&vR3So&W z=hdof1XwqN^p_O0ndC>MqsY0~7~pwOjQVtvRBDbv+(2 zN3A$O&zNV@W9C_1s>fANphTWjJq6NTAiayqo>9H|Op?RH-Z^?oE;6I5`cCyTfhu;?L3L2| zi=Y^ffE4Qk-AjL7+=7Dx+yWE2lXJO%thfT_NVoo8!EYF~&sNm(eD zbUlW46!lOw$smcdB3+FcBy|=@_knajg^SCFXu+%vo!jrZ7GrsA{3V-y7Mf^$OD?3052b`yZbIPI_R{qCO40yl(JG&!(D0hcr`f^ zB$_i;PgUcQAaxl?UkB+M6!4n@;Ic1<-1yZ6R2g#Uj-3%PWI;VgJ&#~3Dm$NgJ_4-* z>DwTEhXQ?90NQHb;C_EZK*Iz#AVO{n)r)#%L8H0}ft~`=_d)sr1^S@?v|@hVD<^8P z5P|BDmWs^9#9wN7*sNZnJ{7@=Zn5gq)TblZRUrKsq@Pf*p9)~7zO}!u<7pIBj*zdS zyG&|?+oE2rJ`Vwl?hNYl)fWiM>~oNQK>!DLnTk~--Z=F>$^`883vLYR%haTJE1ES> zU!@j`x6-db`gJ(0xjFqF|8U389vW?$3) z^*_|K#TglyhsD+)xE*RzycLbR)w|SKyj9-=(jP$jBW2%D0{i?A&e_v>C&?P;5xL-A zO$P;x$UD z+%g_y@^HduZ&<%BGRCYTW(9h}U>DgNby+!g~EoYd@Ktf#isV4>HL7ry;yuGY|+typ`brbB}@TcTDeAR9)&26u^q zjt35GOQ&ju(PuY~H)?Jn>=cXVHMeSZAda_#EDdCs?MHTI2spOy`+fIYMYxjaW`<>Y zqE~p?csTKQYiP|@%xG#J)L_k4^AO0gK$cAb=Lmr34(u#Aw~`dyNZJ9rhlsvLm?zB> znrC{I|FfFs5bg^g%LCbP3U`D6ciQ^vA2@3s@se^8$-F$$6Bpgot9e;N&gF^5x0*LK zcrH)#4#-A<>;wvVv;eu_JpIy@*l~$Enx2tM62dr62>r;AsrpFsIl)(K=8xtJ&6k3- z@cq=-TOiF3jz~Y(?gnH1z<%WD<&ugftBZNUOK$6heb(< zNni+OV$og#o4^Uc#)52IIIxPv7WQD!)^$gF3Ce_|K08bkvfxT&1!k~n~0>`I-Y-%{iF@y5J zeFFn4w>tr!kd~0$n=T~eB;+Eqhl6Yy$jT_Irwi&@F1!2gS%$eQun5 zdSR_h31bq9d)17Rgs}piGeI^h9M6iy&bvkk76z9?hteqn|Ol@AmOBhN&-wQ50g-pP>n?UL3R?z=2D`u_CO-0*4EYI<}Ve1 zrPApn8F=J1%vdGVCy=B3qLw=0lmtA=pU?)f`5>#LV6pN*1F?_N&D(cUe*z_*M?=z# z?1-L_gyjh<5wPg4ovTZys)M)8Jwm5)p;uZWGZ(tOWnof?D z<g1mB>Moojl^I{bZvoJ(prcrYjw?3}L?w5fC+B8FpOij-(hbP%Xwiz(5W=t8I- zkX-<>b(E182E>!o@2Oqi3*=%w2Q7U>9FaIAF|}8^(-PAKx-SM9mL9rwsA92UXWgfP zjXI3(yu=d_m}vZ+I683*VpssO%Roj853)evVfHoko%Yp4A!)(^>m(@ZjJ!zN$0bf8 zkj3Jt#L0C-utFxry@- zDw@)3K!(K!^eL|kaCEM&=7HLIIEEl2mz-0?Ubu|YFxQ!Z|Iif`)TzYUMA9rI>Zc_( zBrXzoyAfm^;k+%_P{qzTmkNx`0Sh=(iEW9?2&$qgwLEbJqIw$0IzhIXqS_TuDP}o; zlazGR*Ez;cf%jtsvV$;bKLBZdOCr{c-jjY}LUEIU<}%5XM@0 zc+8f#Bayc2i*k8aB4&IN?*Z8zAlpd+-x=icsCRrHp{s%#fRIrih}VvZ>4<$Gad#rk z`G|S3iH{{>&WBi-yFhj~fgQBg6^l*v{1rV{+OvuKh&qTxLy7wn4+y~S1=)S!z}ojq z?>bdz3CTgvFsNE@B)*HVMAM{+?hYZxb=+lZZJV46PofU>^~{&hC&%E+0>|pNv<)y+4wPhZ1|u`6T|8 zggKui%=tV9vd1aVCj_7s%l2Ot$jxNZlrDAzg_(gQE{P<3L@`Z@Pr`&xk{V=Bg6t^@ z^yvVmkNuDngNNA>LEMz^ge}SQ;gFbc9wh0K%m`U@0$GwJ$%>HeAbS>M&r!&jl_!dN zvVGP^w+cHH+AFfGvI&<%W-BQtCV3I+Fp#|nvV9aP=Hv;~isf%yWW6br zEv8!mF$&#avyz4*SkWyoX++XUL8o2<*~-~*0j)-L26Uo)K@0e_6m4G(n17$GRWQq*?Sc5`vJiAyDjH^f)YY} zv+2nsTAb;I+MLu**dVrNCoN7|f>4)%442nO6zazU)M?qjrk?*8T?C}_2p3r<+7&Wq zJFsMvRwkWAkQMV(lg>_BjbPV+>{F0^M!|kAfc1CnJMSYhkByv@&BKlk(tCu6cVoLQ z=~4n#EV-0)S<>YQc0I_x1ld;yJ<%4=U zH|_GW7aAx}!-@|{_ar??@De*!l(ai(4^sRv$bJUdK}s>E)-uN4U5?e+AiZ6fWlD=@Olv>qsmj-D+$|r2pj(dSwv2L_D}hr4q^jKv^!Co^idK?_=p4hB1uU2FfqWy5*&kk zte8LMsXb>>K8BrDO8Oy*@E0mA{qQ_yk&bgTFGwO^XCdx=hOK~`d1mK#wW z)T*^wg0h$u)#|i*glhz*KQIakH$EVuH4Bp~cMH5sqeY4Ah|%s^yOuQch+~_q#fBd3 zAYfF$(7ZgO31B;D$F7G@rcBMji4xe%l$jCkNNI;@Nk@;UC#lWSVn+|kok;{HDO^+q z8*1*o_gX>a(e)23MeQhU0m2epirPYLkpN2v3})uL#Xc!Zzwed_6jnxeYDYUkJGECH zo~WIM)J_Km*+_HpOduy;vF4uB*Rugwv=N&ebL>X2T4=HZO!Ah8RziwG<+L#b`lHVLpCz&OK+^>5zNwD%zjD@@0=i?!&2Z_+N& zE(OL7O!6k}a_tIW1_Cn(#Ta&zvvw7|ii5!}eP{3r`Wk;#`vUJ`yhp8d_^@F)wYk}; zwKX-FRkh(aZEDXJemJ0yA68aZ;^DYzKVH);TpXcYqg^W*xN#%FA@Irh+6$sSxk%d~ z8F;HorM*~tiS|-k{y0-KxD&yG^@Ydz1EN?Je3{ zwL7%80W$#@KQN~Pa|tjv0&@p2_W|=5FmC|!5is8XD+5*utR7e=u(?sZ+$FGNs84m- zKYp#rEWf`VuX1f$=x-_XH#DRyt*Z(b`+WkcDL&ObM}z7=cTehJ=-DIClj>8wel+wP z(~UBJ+a>eCt5L-S_?SR&x=-al8iEgdLsRs1In(`1+oF|6xX_--^r_xDns@)ZnSB@q z6K=d`vVE$#M?>>r`Q4X{g$wPOT%W4>zxvK-86Spp;RbqU`0>62uBfgBZ!n^FgGE^@ z;YN05q)&D6(JQ!sYDD7@um_(Y)}V zGvj@6Pq^KkDZpz#kA|54ij;fhuyE}>s8`BZJk6@f5YL@a^G)~6G$L1)JMREv%)Dm`>na9MRyogB;ZI+>2qu{uu212Ykr zNx)17W(qJhO{`;kS4lY;E0w_7-|K ztWTvDAmcr;Q(KxA<85*HytcHUu(EM+Wosm$edHQDola-y(CLAh225Fb+N=rQCAHql zhGKd#oX)JX%$i)5-_laKY?IC$TOV-PbvB(#GO$x;*Ew`fU}gX_6PQ_@I=9ZFO9o~( zFmr&xvNKYuD=nDP-qujp*n^71(gM5&uRandByM75YukjzrX`JGznfK8)3z}9@}W9! zWVE15)nU6YjVN4WPM$9z|C?3gudQrvXbb)*TQ>p&D_xE*SC^+74$NF&<^kgaX8vZ~ zNZlyi2|5fFDuJm2rW%+U#J#+{scBIO-o4kShw%J5e`HSEie;L-yAKvjCWdz|;YAa+hwFZnkcYZiWt3t{#|0z_jAW zz_k6_bg!C_TLTOx1HyGLNclot1JSZN-N`y6qY;=UV46F1i*$`d%T58N*b|j4lW)0PXwL1FpSAT&R(j+1CZe%xNf};n-scq8+2FduF_qty9SukfH@tQmB6e5 z2D)_D>8?k6c8zWmFi7E9)Sdw_SQ7qs*|Tkg-0i@eNp$LzMFrjy8@-ceGzBTYRd)x` zsU5o8bhiU@HZZG!Ij2*%Q+FrPsWrf?J&rnczYbgXBG|r1_fXU)kLsQzy7ZXtaorQT zy}+CY%=y4v0L(g~OHb>b(LGCb=|W&G0_Ni5s7sjGCG(@nTw6htUJ7Gvke{#VUXLQ+ zE!_u1lit?7qkC8Pp6-2ME(PW?U@iyd3SicE=|0qbgqrle?o(hk0CN@9r1ij%gwVfg zXZ)6s`yDV>5>3i2n&GXS;a%K5JxKXaxhe%2k-{Q}I@z~Gv>wo~`3?l+=I*8y|= z@zW%ItUfN1?RrL!Y3Fd=(#!Qq)FgdBeSf_|9}i3iFt~U-f!U0jq*v=T`UI*;UBKJ` z3>M3e+m<&ENBL$`tCW`--0SovWUt-~%of7lS>v0%6Vtq@Gg<=d)!X&hJrY5WTR*r@ z6Qv)bA4*J=ei$&@fVnAXqHaaXr~>QL$tyE}LGvK8-{^Dn=p*#74f>J#QADCQ19OWY z(IATXddy5mpjfQOUh;@fO7)X_U(Wie`V;l&c%k310~pLa-j1lE38(WPvbtF{GYs$G z%ggl@QLmb($FA@`7M|X(uO$mlk50l)VD1bqJS^Y`_|u>>U`Dkp_=+Yyc7*rPaDAJ; zo$zB9Fn2}rW0^j9Zs0df84(%&e?k8S$xgde+s z*%Qf+TlHA@i_nHU^gE+Ixl4b4AN+Vwzgv$$Q9m9A<`G~XrTT$wF@zsvFt(uAkA~qL z_*T0~D5tzq;c>);RWS#`(sV@C~{Q;dq|DygCV4emB zw;A*wp8|#yP zUg*?+rvIFX3CZ4f91Zh#`tPII{*xZN{vrf%NKcwV^uOwV)Bmpj1DFHAyade4z`TNn z*&s2*7-Ff+Uj^nhU`VgQ@rp&Td`WH_PRj^5iw1cZYXkf=#2auQ2`9jyG3d!k>oxc_ z7z{>SX}rM#%$vZxO*ILFU+hH?ERDgA?=d)ld5eg!hnHsX7zUA*78PF_1{;PD5xxTq zN}t4+K@^7>uq!YE#S8;hAR|7>F^nXZSUdtWoM0Gj7(=;^4$B9?d`P$+2+;7TB3);O zqA;w3uO4S8je5~U!?Zr_kfF>lo!DW+EMPtc2HhZBXXpTZ5#mlcc@KVw>MNq)2A`o? z#10v141U6$&w%+nk~?*VlcP{vWWXr_5!^Y&fZsj$w^qt>Ih)I=J5ggMQZc!2AHrk6nff z4C{0X!+C~_f%yrTgOoo%0`mvH^xtHM3|A6z(SQ9}T#2tUU=K;B;d;YH1MVs4BOU_g z*G@yHVKWiaZ@~P1{Opiny8(N{BiMecA!;`=++nyIWp3DMxYMx9a2GIt0`nKJ5@2J9 z9lFbYN?>DwjRRInR>X12iO_aby2l5D4FlQJg3Jx-(q2QEs|jVJ77d&Ug`Q(Vt;>2l!)*HAY1RM#k8` zPg|t-8{>&BGOCHc#i|0fh)uwk2B9Vz(c1TL1C0iwk+47wtR{j5MynCWe}%Ka=rp>b zK1nu`mcU+O6QkFdVnin%RWA|PBw+FAC9(kTE=H#(3j+y(1;z|yfiV+UEfL+M=~KKl z6TBy9O$*|kYs`y!>qsLy?0tAZ#zJEe@qmnDfi(bYqTF~2SZh#QjN{2GCje_Cugo2v z?=6|&El*z@eB~4)9?9w9dKjl0XAoAIfyE6mY~M1@F_uT6IM+BY>XS+%Y4q#GTQDv( z))`Nxtg-=X2iAe8V((A}Y4lDF@ToBj=^&;pM)d6?gtXXrDl*5o#JJSB%(&dR0$3NY zZeTsYBJKmajHek-*C~vvi~#IFUGj2CxXp3tj3)pO6$pO#fWtPdUT&PIoJ_c%Zj61_v8|3HR z#(Sa&xZn8j;f&6s)aYRFfkr1UXmmy*DM6@D8J`m~I?o$lAW|9*?1;#fbinvh6c(=< zUyJ(WP2+og7@ZG{9~!Z}2N^pG*b{&qgV@Z&c4;Bj%FGR!ozDmpJ_mL*(XSr9tMO|i z_K`;j^n2s4l7U-{KNx>B{$%{wc+mKZ@er^Dz!m{p0_-?o#{)YN*vVUrzZriw{$c#n z_?JmyiUD>iuyw#L2KG!~QKPQ~b{pYQ?0iYT*viZQ?j z!%3BOjd)vZQ_HfdrplI@a5Vb~XcqfauN`+Z|F+hgKIl~m^p5qZ_8bkp|6EPJpt9AU z($L(}bn>u1$Vw8(D)p)E{NEs}4_b@@EfajIl}AI%QCHK$I6JYjy|H>>S#^uw-`hg5 z30O_?sTz(eR(&wWEub*Pr&@AcQ4qM{Nl)#`5TVF!8eqaoZJx#T z25cFy(}A7QWlGU0OsS?c6Yh^QsXsCs*g3#fppop`B{|v>x~sIHEM(YvEzI{-Xg3YV zZNoGISd9A1%3J5Od-Iogb8G5*cQXQ8p=pc>z19v>KCtB-xcLQ~lf%}@O=C@1IPNly zGnJagnE8Cryz+@-3%u1cz0(`=$`_5B;;nA=rY$ZGa&&=d zVdNHVsyCfNT$T-__-Seils{LJ+9!+NHFW9y=&)R4YBw#Wd1=he0G=@iY-1;yb|l&n zeD`t_y4fA1_;^l8n!)c@nJ_utMQVShGsCKX>>{B6NF=t#wAOU433DbWu0~*+fNcgA zk76Shy@+NmayBP}au$zMMltqc!q`hpmzpj!T@LIiz_tL}3Tzu;?BTc>#`z!t*O;)1 z9Pay=HkxiAB%Me)6-=80y$TCSqXN5x^eULPkWK~DHq&-smj)UY*yX^IBKeUqR?v`J z$?Dnx>@tG+#6^p}Col4rG>;1+w$rqWaJ?QI2zqe+UK5#*+e`J{^pNRc6K39#-KPS3 z8n9;|V)O8D1{pN!&CEl_3cj)F3Bt;~rYB8LnVtsrbYNEki|PYWtPE4vZp92!*C59G zO#7o)`LgNFzFGMeW#zl3_khLvd@JesV9y42HDW9<>BBH41>f_j2@@8*aOP{%4}Eav zC)3X+OwJ)^&H;7}uxs%>WO^PMB#85eLyY;2Fy?7w%af+Pgdc<}$eYuVF##mZvF516 zg_$vv#D$qPb7tNwH}?bfJYdfU_5xtn0efMWS)o&y`^(|;kbmjHViBJpoC z{bmF5-E0IF6Pjh^<^C*hc9l21Eh9+1)oe!*m@$CAG^CtJL#TzQmqsYF$BYHh&E{nD z0P{feAYgF?UjgiTU^if(XdY_znp3EFt_1cfV6Q>W^lH}s!=9#jE4&%h#Ne%gLAjf= z3Dr5kUQMV@O&jlRX!bVEoD`&bgn4A7f}2O1aXJbqU}E2ZxiHWqzGSHNx+k zOU>hhMi^_ym~7G|5ftw@l9W;1SP;a1q(X2!}a$?aff$GkL<+Yu5wXm z^A+axl;3FMZv&PT%ID&kVzRAeq^5^-?&>fEg6z279F<`)cbdD%f@Xv*cOkT} zXw|%3@PP01sZI!)O!7m{+0#Hymd|FOjL`%xv8aXbc5j2`&(PFy>FVoc2rJn zk0Vd!Tgbvs;U})ZcX?Z zG4nG5zz2>2U~YC=YGnrA2^|6OMFHUMV*prLUG1-~uBpw70Qj;1@S$S@Sd~|uS6h=C zJl$q~&HQ?lsNXWb9rek3=J%sM`N;fn)F+>rqY4S;ugtg`cbUI7e`EgE{GIuGU~xNr z3fO0WeGb?cy39YCe=`4UK4|_0*nPl$2J9i=9su?wU|$CI6<}Wl_O&e*i^XcOS?m^v z#c6Q?`#P|10s9WH?*fb7{3pPEii;S7>{fpRHkkWsO56O4!cGlTv^KT3RQt)N*oLmE z@wZjhHQ>pBz>$Hut6)pd;vyp=8fN_;?g+}lvs+7|do*?@6jlEyFr2DZst~?3+H7CS};frpg+Gno>vU_qXkfT@bs_l5WX3X>!@5_O{BZ z27j5qtrI`VjIEzBxeWgzK*}bN&^3I!H%LB}rL>^5u&}bNvY}}~FyGKkQIN$WEu$js zre%zUWJ@ghz`oyMDFpTd$~dKeX>%oBmMt)@s8v8?tY!Qr%Q#CZupa{Z5wIVhm@+SA zSm4Ag6{pdFTF!2Z->Spn?NeTZeHWqgMPt0E|rk9%SH zS(dY-Ua-b;5n=gSWchiP^DP%x)>$wj{FSo&H(-AU_77nH1op2jmWwTyST40(X1UyQ zg=IZ(65wKiivvyyoD4V)I2_IJceC8GQPNNEw``i%)PiSr{58T!5{%(@0v97_;bu#h zPnB3Sb9!KDO%a~NMYY*-gRsVW`CgFW)}xc*O_rOZSiHk>JCWgSz%d<`JAfl2s(mW) zrFGZgWq7~kfv6YkvFs%>d z@{HwK%X60Jfl~vQ09+DqTHtiR8G*wQ4u7`{$$2WvtHiXu2AqbPHYG8V3!1tuBz@*B z^32=7C5k?Cq>JnW%ZE|?`^54Y5zwc=={qc+183+%KwlqTKtEW1jC#RA%U?u5zo3AA zwftuJ-SUU!Pv9(6Kvv*vz}bOw0O#Cdl~`k}vDP@N)GD(wz`20)05<@*fxry{ZYXfx ze?~x7B{JWt0?tjDZ%i3h(1JUIJ>W+O;T+x2=&G?MlE+c8k`MRz5sJ-fw3;HhYPDKP z{>O^k8{A<uE%Bdw#XCs;=VHww67;7$Z?HgG=RYJpn>963%F z=F?k?sJF%8_=O!uQ#bnOYM!NywM{9_#0d%~qf{URhbk;M8ZwT$E-3!?$->)ltirWN z^Y-IX&yT9_r;tOcZ4LfK_}|uWj+F^G<5-0MM{_r(wzn=6&erx+k=X*lIFsSPaTn6x z*3BTUk8=f5aqh!EKXsumkyHtI;&h1Pdmg+84nnEg>bKTmzmm1qy1=>+xD$Xwt2w4q z@3+=l8>kbP4_pzo>(rDfB7#YLslr%dye6;CWKoL)L*vTs819G|M^1I4qa z=1(pQJz(zvVPvU9ZphmA&p7jIo`U9u6lLh4Rhmsyw33x#R) zh#>bxQRzb>0t>uEHea3&&8~-^*rFPE>PxEnP-%eYsqksNKKJ{ab2~)u(G+b zs;&VKVEZvT4kIpy+>M@v^TC7?p7kQjuukj6)=R9H0yhb`$-qqs@$QNM?}!6uz0$fQ z@IvG!{p4Em$#uX@MgC$b77xugH%~{$qLn0x%ly^tEp=_n0s*6SlNF1ioz_n4W@{I4 z(|{`jZaPtxt=1cwScjyRG+F?*(oSaOJ>N5K3 z;gbS|L8&}reSwhjto1o7Mildbs|2o!kh0IZpOR7yod3v3=_$5jTf(mqoL>hH69a)I z{FbOxP>pdiaJN+6vwlQKdEfeh^+Vtm0EafIj*#++6_1->NO>}F^+!g^e_1NoWOQO? zPF_$d-w+DF1+F1P;SZ5g`Pup_A?2X;7waM58i8v9u9=YXyA_X4At|Q-*Lq~6{FkI+ zi$k1km@H@s;%s9@q>@AC>}KKJxxuw!>t|CUDYpJLg$?7_cHkBRw**PCscqOokEARG zZu#F!ik^^S01opqf`Zx1Vx*A!3$yT6#1JWVTN<6uXLHz`HkZw9^VpJY18f6rgKUFs zLu^BBUR#Q7m@O5!Q-M1jINT}D01o$u)xfO*?p)x`2W}m37Xfz(aF+ph1#laHy9(#? z+0tzpwoF@=E!&o3%eCd%hTBHiM%qT%POy!(jj`cAdJS-!f!hWg+N)i_-3Q!5z~Rb% z2Dp8|y#m~uz`Y0D$H097+_%WkFlW_PA~*`C`Bc?MFs;Z7EG{5hRrhB%SS3Ej${M4y#Gg z+^lTGbVQp!nxj79_2>9h7aq;)k4vQ3yUNuFSgt+Ze)%-)J%1!IeH$>yZ=dDL!gLet4C#FM~HZ|2x#e)0fb}~C}PFvj~ypOzcQFBF2050B34%{Z-I)KA;N9W(; z>EV3%$zyfvt8Z6HXnw`E&9)tL5#dNj)7@#i$#yfzxAggxPnCc*zv$lvf>ztDw%Z7+ z(G%|Ku-y*a4M)W4U4+$l0k)YBx}FzB|_E#;BM=%y$l@bW<31*AScyrZvb~k6j|@s-VKm-CvX@=qQd`A``E~? z)?pW1J#&4KT_4##>DGczfx8RYMYC?UF9=J%1n%xAmV9gbF2E8@O5HnCKihsG=pO{`{tg@FFdjG}Y5ze;`x7|KqJ=B5J=Pu@tI9&Ls)5kZjA00nX zDUM<1@74ndkS#R9T9b8o|+wN$2edqg1Q`gZh*QMfqQ{c_x~>L zK^E4|zJ1Y8&j(pJ%04=@%fQzJ9ZKEtZ6D~4+YtMbo6>il zIWvfTv%Q62e>ri#?N|VOKZN~ag8dTUaKKfBY*yG$4PgHfa350ak4xN#s7@~V;p4sY zgQ$Z2OoA$PU+rfB_eluVa|o)KD#m(61ghuTF9@LeIdGp*RFA*q?2a3ef{Hczy}t!V zzSu9ZU)D_lvi!>s1sezjR|1FgvLYzB)_z@pf^UHPno{sj#GQnawOjA#dN?SHPJ0)j zgnFg+8-T;R%>qh)BcTNI?cYaHa*O@e03|;H_XDNme==@GRLvh{B-t1I2po8Anwrrr!JRXNEOZ~alaksWLqz97Y;OWfB01A9Zj%(JTm#=7z*Kw z{eb;-Ja%M%$^Nqa75l69*MR#AcnR<^z{dg~*JXdh{-*sc``h++fR_R<16~ch26&+X z*E^f&Rt6SP$YgvnIlrl8Y74eyG_|)zd{~GF5U@LApvdzn-EH?Nt=O;EMrIHAR6|7` z4T7Ft*|NYNcwGRp*yF)#7^1T)h{zBT=)Q>0NW+vs5Vq&{@=eg7d}{w3ZL9q=;F%8l z7r+ax(`roYlo5i+B?$EJhTt%MV_mYz{;mBx;5p#qv7;mi=12QMiDr}iC;QL9^T5kD z*?+Mg0=^&c{ef4^MR47RLhxh&{+&RcRJowBuC2Ys?^8LtSsC%-?w`5F_{Y%E3p9(x zE^|mWvCBd?KR99?vPcXZjDrPU3A_q1nCcpHs*3&^&xZ&s36}(=&Y{5F#1RjC0@+O* zY9Y_(&^Qw84?B|P2q#?dEG6(sz$XHC5O^aR=(b-H-nlGzVBDd1U^KSLVQ?6M*8;EG zh9%WQ@pm%{$svT|z=3^`oGL2S|PDiq107>5U{aBybJI5f$ z;K){8hu4vTtId((80JWIq&d=oN3yKI+km$N@91)5ITnbS@21rE zvYZ@aaXC50IZA=|06(~UIXNaerl2xACOIYppA7tfO^&IK6M-KH{Gk8da+*ljgCvOh zY)3`ZJ5O@V1%3$dLxlx&_MXEnAaZSnqXu{!R2Q~@7C06<>KwRcP-oJBPsL^P|8(aj z?wV_edU5bZ7)PVy6k-jU9L>OI0H3+Z(c)+YJ`4D4RE&TXm?>ByQNx6%SfVUMP+ZF$ zE238D>5i3ApPb=17f(ev&UBpRINPz>agJk+V=eH*fgb_~Se**BMfgiKQah~IR z#|4gcjtd@DpxyY;kOL-00Zm*zUN=akJwV$F0Cm1b!0mXhWs|KOOiPz|RDJ z7VxvFEcF@bX<2!AJA7JUMsY?~VPR@&Np@~YKDPJ=zseT*Dl;u3uOK@kH6uGUEj2Yg zBR?axumG=$4S6O#1Y1;x$2^YfLWHvS2?)_>6t}Y z8O1pzdBv&u=^2H&#kra3SqQK=KO;XaJHI5qxFn+}H7^h6FBBB#WM=qO$@PNC?tvOk z_`18ES8#3J=eR#=CGB?XiTdOb$D@Hy1n1!i%dpLky^bdxPdT0jek$;2ucrZz z6T$FEYEofS^D=t@c0M)u?bG~%uY1}-{;sLh3CtTSE4?7-SI}$CvQ9634Ah> z^jGHwyXhPsI6flV*@wWFcQ`%WkG!m+vGAH9?ot%?* z%ANh3{hbPDyi@5^In_>$Gr^hY#ElKNJU{TYz%KxPA@Fs;pA39G@D0E(0v;X4Cg5=g zI0g6?;L-lK5x6?1-f3_eohGN*X>nSeHmBX`a5|kXr`zdqCOZcJ-wyl|;Fkiw4EW{1 zuK@m3;7W2 z478Mzd*qOy{Pvo=qfolbo)%6Qd?HX$)VIl+fg^|YqWSqaUp=}{*UeN4~aE?NY z??mr#aR<&3jK!PlJr$*`p)EZ4T!FKw$8*8&#yQ9L`rTwFDbGa05B_etb7rsKl{-)B z^}G4bs$RdVbuR4ny9Q@tuiv#e+j{+OsdIU+-<|GU)$4a>Ial}k-MP;5d;RVr=Ow*< zcZG99=sSshl>)^TWal-`>q1`zMH&2Vle06h<5Ta&c>_jn&Mm;N4UgQM+nn2-H<8Hg zeBjRm{#+Wl9oOnnSelQN0k&`bxN1QV=i8ijN(Oe4V9L2u2&aI*pwqd_d6)BU;MW0v zA@CQ`9nel!LPn3hJ=E9L`}W^6;1U@0AYssM;K`)CAVLp2u?Z;rJhSt0=QEfjaX#VP z>wMDrloK7nOM$-(_{)L60{Hb^&S#y^IiGjF;CvDI4ZvRs{3hT#fhWVWeJZi2qp#rV z?+uswNJ$=Hk|f0SK&056rwnrRb?2KzW#0h)st)H{z+X-I(u=?8d=LFi=ljkNfWHR# zj&6U``LXje^!=QlI6npcTHvqSEWWh0eB4kFlq8{%EIIF^l#2M{YgVWb}q)nN9HA*Rmw&1e4>{0J`xrSga#pQN+T*dW*BO3Ntg(N^* zW>I0DH#a{u+nbk>R$N$Ekda@IkrxgqUjT%I2BR>_&ML~r*QR;X^U?~uh+nQZFEuA0 zXCoJ<=jG+6W#r^!gaZ;zHSu@#0EBaDb8?Du)4iE#xrN@$0{l~MadEykwXm=#yD&es zxG=XQ9FTBGiNB`@pn|lLw1RY`rKBW18vzyPdJAyWtG6IEudpONqbMsoCxS=9StB0j z2u72ZQBagqoKfN}Da_9FW~P@Ec=IzeGrg(l>4m9<891vrEiD`);p7mH^8=#*<)-DP z<>hClc?u{ays*kN=+gu}E=-sP?p;Po2 zaCJ*vbK9Ic96_~oYGoTnuaB*gaKPUI{3H8ar?^@q{amfCHdi~|;EgA}gO5%0H!f(y zut^p6+04p@cE2h{6$|{Mv|8a>;#yh}_P{0=)@#B)5T07$I#p<*#(^|FiW#ocT&I&_ z25GVu`M%F8hHI7UjBX}jl>7uTmu}~-)r3js0KZq1N%=1HCImj*3H+0U4;LXHE_Pi) z_@E3Ui3G2zIN+ZmG`lXxhpup~$D7GhYVeD~*f^|3J}pprrR%D>p;PVTXPvGqU027} z&zxLF{uY$$wXW;CQO4cs*$~Q|1m(@Z5PCaY z>kDEDR>2qE;o2Ex>F#o2k3okE&Ds7A7h1Ffhfzs^qr^dSp@W1M28y8fm<#Qnz|oh1 zf2GHg$v%>`7Z5|6>q$b>t09`6L7GV6H$>C(t``XfNcHO-F0{9A91#UC6AE4d9xnzI zpr;ZvC&0hk;ra}C()1K=M!ptI?R(KP zT^s#vB;j}Td)Ifa@1rF8lMAb}9j>2&|FFaL3-BKiF9;VD$;aZI0a)+qeJB3I%}6v` zU4Od%a!cGX?pSx6Tk4hpkMy8-h4g$5Jo;9c^!p0bCY41QPgA08&!9sIFld=3v7CkdPVY5R%Gs)EjZM3SNUj zl3AL%=7mj-{?@uh?G2UK9gvrTqjyfIS=?4bhc|emz8+qfQIJ}gQ&8Yd&o05ux*$En zTToDfI~qw(XQUTpWEQ1Pugl2Io>@1Q0G=cKCu?Y0U@f|>?qu{a+&1%0x5MppyUcgF zJ;47&=I`kw|@7jmi=v5^d+Ex*Y@Y}Zf+0E zHtU|mE4bh8Qujm*rrhJ*6F@EjdCVsFB==;H$ATR9TE&bdbv11ZXD;-U!_TfUYlT3} zHRhZR^iRRnG{Zf+2as|K1kIPiHD>jmh{xx-E2AE-a#w?#1v$Dy`1m^dv;=>*BjR@p z-Sttwn?!zxxRT!mk!g0f9>G&f-7AjZsa5VXdpy-mSn!Q&+?Y}7bgy-v>pl~eKAggnMQ|)7d9^<@yj?_74G%!4el%5SAkpuas$XMAa{V= z-5tTZuXT42|%lI6*V2C3a7&#NO*x>b}{1n;22IyYF!C1i2C9 zCXkbv*sd`GK*@>r88n9#6zRS02gLyFcJFaN1ad3LZ6LQ(079>mWZLjP(0RiBv8NX+RYsH9?HQ7mnKQ%Ph*ohwFYni15kDKJ@KRS~ zrn{PS+~K6&{5Jfcs=dwMx+->6|5b5w%Gz;Ex*vz-?pJH%30ebjwCnxLTFddjfwyi- zOj;#fCEKLauVPm5tNNjPU4r9=@yWubhNhMS7OPEecQ{@6d0E|ZKfblLq@i*_EB>8$ zL#{E&0`Jud)hc!shw7X{$~^wEWvy5zn^8)D6*M)}>`NXna8S8`Y9sz|w(v(k0YskJ zG;lD&7KWwnAL^B-3`<2EW)UX^DWkZQHCI;q3sNPjxK(llm!1(sa#Q+X{Cie5K3G&o zt75nUH)W9zbFs{>3FAzSz_U%m2aA4AgB7e)kkQG4EM6RS!t|D=rnXfv5>BF)7$q)= zSCTHtkrYcNNTx|DBvq0o$tjXnNxNjFWVK|S$9Q8hV@Af5#!QTv95Xd$M$Fup`7!>OmYDXK zJ@e;7n9g|qJ^J$+d-I(>(E2tze| zXh7eP$U|jq%ZNLBm?x*>5n=k|KKEyme(ulRUl5fh2Zu4ew#4k7viuH^51|31`z!a? zs9OZ~Cihpd^-U_JWID>KMp7wRCb8qc+a&hM{mRBkvLwSLnUWmU=jCO@@me;%Y|3Q8 z`r-tm4oUo~I5f1v2M4W7wn=uzq)QG+zLVT9Srn5WWA;cSU$5E=F^@tF2QdY!UR^aD zV%~?C4Iod0n32Rt$A+$X^f1(|l%r?-zki>g;Cy&^59S`Xc;udbp8g(%C*GsNgFFZ1xggI2`S2|sjVHmAD2ey^%BpU64EN9z$d5$7^kJGUEh7t4N;&C8nC>dfN%iJtXJ>nJ zit_RcGqbaEGIO!HW@tD7;q~1wn9*2wO1rUw|NG726+a1hIod0yq*-#Fi)x{4df?)d^E_%fIJ`M1t2d3c@fBqL0$s# zvD<8$a0|}zWP5Tvxt=`y^9T>>>n0S1d>qJ2K|U4w$)R5oe$Y=3{e&sRT698j(rRU6 zpews|V&$@?cB~4kkgT$WO-m+MF0NZZyn+h+03|iCvdZ6p)fz&zsElT`k(qwW$Rzeq zFS7tH1d4nYC8Y=*D8jIFL1P4jlSl|teiWPXzfikRv|RK|TZIGeJHJ&x=Y#wLkUs$O=Ry7|^pjAcO+pbJnTJL3l#skqF!zY- zQfR48>G5sZvPD%*s1rirvFG;%m2K4vOK|yM7ByH$3&HLkY-ww2JE`oOdqIk7gHP2P z&eL)HMDIAE=g=O=mpFTYUw~R#-`rG3#_9%CAYIJZnAYdd~Bl??Dz;fczwo z&jtBBko!PB{|2_+a}isQ|Gw0N*PgjRUP&7X@DEiWucdq@)BBL8Atn?wwV~#c`Cx6h z!=cL}Y{lV^1nkW;bS}FeB6cbKA=-#ju#5t5MSX|A#Ni&%uSp2qz)(Zx2-nu3AB*Xx zYU~TdrYO9aA>!li0i>Dfc%58!Xhx^!I_r{7&-I>-o(_;#gS-aheq0-~nuP-~0D`hp*@o$ZKRyAlIMK{ia09~F`) z!QUzXHikX3h}b{Wq(;Fv76%Zxu0()~FL8$f2$*|x3@8L`6&le5dGvfN z*zVejBWFpk9f@*#K1B>wDE10O7(!ehdUg^qXkk8X=!+0WK{Ge4X-O%m8WB52ypo9Qhrx##PHhz4`YtwH0m z&+{pk&$fC#!#HeOW#a;WAvRl~AWx^^Vus7L;?41>Gk^;O zPD@Tt&PdKo&Pv8WV;#sbQFjr@F9!J~Aioskmx289|D)}$$cPHMW3_o|zSemhH%t9A`jfeK%e`@3xB);X9PjftcSv