├── solar-logo.png
├── Solar.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── xcshareddata
│ └── xcschemes
│ │ ├── Solar watchOS.xcscheme
│ │ ├── Solar tvOS.xcscheme
│ │ ├── Solar macOS.xcscheme
│ │ └── Solar iOS.xcscheme
└── project.pbxproj
├── .travis.yml
├── Package.swift
├── SolarTests
├── Info.plist
├── City.swift
├── SolarTests.swift
└── CorrectResults.json
├── Solar.podspec
├── Solar-dev.podspec
├── Solar
├── Info.plist
└── Solar.swift
├── LICENSE
├── .gitignore
└── README.md
/solar-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ceeK/Solar/HEAD/solar-logo.png
--------------------------------------------------------------------------------
/Solar.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Solar.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: objective-c
2 |
3 | xcode_project: Solar.xcodeproj
4 | xcode_scheme: SolarTests
5 | xcode_sdk: iphonesimulator14.2
6 | osx_image: xcode12.2
7 |
8 | script:
9 | - xcodebuild $ACTION -project Solar.xcodeproj -scheme "$SCHEME" -destination "$DESTINATION"
10 |
11 | env:
12 | - SCHEME='Solar iOS' ACTION=test DESTINATION='platform=iOS Simulator,name=iPhone X,OS=11.4'
13 | - SCHEME='Solar macOS' ACTION=test DESTINATION='platform=OS X'
14 | - SCHEME='Solar tvOS' ACTION=test DESTINATION='platform=tvOS Simulator,name=Apple TV,OS=14.2'
15 | - SCHEME='Solar watchOS' ACTION=build DESTINATION='platform=watchOS Simulator,name=Apple Watch Series 6 - 44mm,OS=7.1'
16 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:5.3
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "Solar",
8 | platforms: [.iOS(.v9), .macOS(.v10_10), .watchOS(.v3), .tvOS(.v9)],
9 | products: [
10 | .library(name: "Solar", targets: ["Solar"]),
11 | ],
12 | dependencies: [],
13 | targets: [
14 | .target(name: "Solar", path: "Solar", exclude: ["Info.plist"]),
15 | .testTarget(name: "SolarTests", dependencies: ["Solar"], path: "SolarTests", exclude: ["Info.plist"], resources: [.copy("CorrectResults.json")]),
16 | ]
17 | )
18 |
--------------------------------------------------------------------------------
/SolarTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 3.0.1
19 | CFBundleVersion
20 | 4
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Solar.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 | s.name = "Solar"
3 | s.version = "3.0.1"
4 | s.summary = "A Swift library for generating Sunrise and Sunset times."
5 | s.description = "A Swift library for generating Sunrise and Sunset times. All calculations take place locally without the need for a network request."
6 | s.homepage = "http://github.com/ceek/solar"
7 | s.license = { :type => "MIT", :file => "LICENSE" }
8 | s.author = { "Chris Howell" => "chris.kevin.howell@gmail.com" }
9 | s.ios.deployment_target = '9.0'
10 | s.watchos.deployment_target = '3.0'
11 | s.tvos.deployment_target = '9.0'
12 | s.osx.deployment_target = '10.9'
13 | s.source = { :git => "https://github.com/ceek/Solar.git", :tag => "#{s.version}" }
14 | s.source_files = "Solar/*.{swift}"
15 | s.requires_arc = true
16 | s.swift_version = "5.0"
17 | end
18 |
--------------------------------------------------------------------------------
/Solar-dev.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 | s.name = "Solar-dev"
3 | s.module_name = "Solar"
4 | s.version = "3.0.1"
5 | s.summary = "A Swift library for generating Sunrise and Sunset times."
6 | s.description = "A Swift library for generating Sunrise and Sunset times. All calculations take place locally without the need for a network request."
7 | s.homepage = "http://github.com/ceek/solar"
8 | s.license = { :type => "MIT", :file => "LICENSE" }
9 | s.author = { "Chris Howell" => "chris.kevin.howell@gmail.com" }
10 | s.ios.deployment_target = '9.0'
11 | s.watchos.deployment_target = '3.0'
12 | s.tvos.deployment_target = '9.0'
13 | s.osx.deployment_target = '10.9'
14 | s.source = { :git => "https://github.com/ceek/Solar.git", :tag => "#{s.version}" }
15 | s.source_files = "Solar/*.{swift}"
16 | s.requires_arc = true
17 | s.swift_version = "5.0"
18 | end
19 |
--------------------------------------------------------------------------------
/Solar/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 3.0.1
19 | CFBundleVersion
20 | 4
21 | NSPrincipalClass
22 |
23 | NSHumanReadableCopyright
24 | Copyright © 2016–2021 Chris Howell. All rights reserved.
25 |
26 |
27 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016-2021 Chris Howell
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## Build generated
6 | build/
7 | DerivedData
8 |
9 | ## Various settings
10 | *.pbxuser
11 | !default.pbxuser
12 | *.mode1v3
13 | !default.mode1v3
14 | *.mode2v3
15 | !default.mode2v3
16 | *.perspectivev3
17 | !default.perspectivev3
18 | xcuserdata
19 |
20 | ## Other
21 | *.xccheckout
22 | *.moved-aside
23 | *.xcuserstate
24 | *.xcscmblueprint
25 |
26 | ## Obj-C/Swift specific
27 | *.hmap
28 | *.ipa
29 |
30 | # Swift Package Manager
31 | #
32 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
33 | # Packages/
34 | .build/
35 | .swiftpm/
36 |
37 | # CocoaPods
38 | #
39 | # We recommend against adding the Pods directory to your .gitignore. However
40 | # you should judge for yourself, the pros and cons are mentioned at:
41 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
42 | #
43 | # Pods/
44 |
45 | # Carthage
46 | #
47 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
48 | # Carthage/Checkouts
49 |
50 | Carthage/Build
51 |
52 | # fastlane
53 | #
54 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
55 | # screenshots whenever they are needed.
56 | # For more information about the recommended setup visit:
57 | # https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md
58 |
59 | fastlane/report.xml
60 | fastlane/screenshots
61 |
--------------------------------------------------------------------------------
/SolarTests/City.swift:
--------------------------------------------------------------------------------
1 | //
2 | // City.swift
3 | // Solar
4 | //
5 | // Created by Chris Howell on 13/02/2017.
6 | // Copyright © 2017 Chris Howell. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import CoreLocation
11 |
12 | extension DateFormatter {
13 |
14 | @nonobjc static var isoDateFormatter: DateFormatter = {
15 | var dateFormatter = DateFormatter()
16 | dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
17 | return dateFormatter
18 | }()
19 |
20 | }
21 |
22 | struct City {
23 | let name: String
24 | let coordinate: CLLocationCoordinate2D
25 | let sunrise: Date
26 | let sunset: Date
27 |
28 | init(json: [String: Any]) {
29 | guard
30 | let name = json["city"] as? String,
31 | let latitude = json["latitude"] as? Double,
32 | let longitude = json["longitude"] as? Double,
33 | let sunriseString = json["sunrise"] as? String,
34 | let sunsetString = json["sunset"] as? String,
35 | let sunrise = DateFormatter.isoDateFormatter.date(from: sunriseString),
36 | let sunset = DateFormatter.isoDateFormatter.date(from: sunsetString)
37 | else {
38 | fatalError("Could not instantiate a city from JSON: \(json)")
39 | }
40 | let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
41 | guard CLLocationCoordinate2DIsValid(coordinate) else {
42 | fatalError("City has invalid coordinates: \(coordinate)")
43 | }
44 |
45 | self.name = name
46 | self.coordinate = coordinate
47 | self.sunrise = sunrise
48 | self.sunset = sunset
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/Solar.xcodeproj/xcshareddata/xcschemes/Solar watchOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
52 |
53 |
59 |
60 |
66 |
67 |
68 |
69 |
71 |
72 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/Solar.xcodeproj/xcshareddata/xcschemes/Solar tvOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
53 |
54 |
60 |
61 |
62 |
63 |
69 |
70 |
76 |
77 |
78 |
79 |
81 |
82 |
85 |
86 |
87 |
--------------------------------------------------------------------------------
/Solar.xcodeproj/xcshareddata/xcschemes/Solar macOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
38 |
39 |
44 |
45 |
51 |
52 |
53 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
76 |
77 |
83 |
84 |
85 |
86 |
92 |
93 |
99 |
100 |
101 |
102 |
104 |
105 |
108 |
109 |
110 |
--------------------------------------------------------------------------------
/Solar.xcodeproj/xcshareddata/xcschemes/Solar iOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
38 |
39 |
45 |
46 |
52 |
53 |
54 |
55 |
57 |
63 |
64 |
65 |
66 |
67 |
77 |
78 |
84 |
85 |
86 |
87 |
93 |
94 |
100 |
101 |
102 |
103 |
105 |
106 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |

3 |
4 |
5 | # Solar
6 |
7 | [](http://cocoapods.org/pods/Solar) [](https://github.com/Carthage/Carthage) [](https://cocoapods.org) [](https://swift.org/package-manager/) [](https://travis-ci.org/ceeK/Solar)
8 | [](https://raw.githubusercontent.com/hyperium/hyper/master/LICENSE)
9 |
10 | A Swift helper for generating Sunrise and Sunset times.
11 |
12 | Solar performs its calculations locally using an algorithm from the [United States Naval Observatory](http://edwilliams.org/sunrise_sunset_algorithm.htm), and thus does not require the use of a network.
13 |
14 | ## Usage
15 |
16 | Solar simply needs a date and a location specified as a latitude and longitude:
17 |
18 | ```swift
19 | let solar = Solar(for: someDate, coordinate: CLLocationCoordinate2D(latitude: 51.528308, longitude: -0.1340267))
20 | let sunrise = solar?.sunrise
21 | let sunset = solar?.sunset
22 | ```
23 |
24 | We can also omit providing a date if we just need the sunrise and sunset for the current date and time:
25 |
26 | ```swift
27 | let solar = Solar(coordinate: CLLocationCoordinate2D(latitude: 51.528308, longitude: -0.1340267))
28 | let sunrise = solar?.sunrise
29 | let sunset = solar?.sunset
30 | ```
31 |
32 | Note that all dates are UTC. Don't forget to format your date into the appropriate timezone if required.
33 |
34 | ### Types of sunrise and sunset
35 |
36 | There are several types of sunrise and sunset that Solar generates. They differ by how many degrees the sun lies below the horizon:
37 |
38 | - **Official** (~0°)
39 |
40 | - **Civil** (6° below horizon)
41 |
42 | - **Nautical** (12° below horizon)
43 |
44 | - **Astronomical** (18° below horizon)
45 |
46 | For more information, see https://www.timeanddate.com/astronomy/different-types-twilight.html
47 |
48 | ## Convenience methods
49 |
50 | Solar also comes packaged with some convenience methods:
51 |
52 | ```swift
53 | // Whether the location specified by the `latitude` and `longitude` is in daytime on `date`
54 | let isDaytime = solar.isDaytime
55 |
56 | // Whether the location specified by the `latitude` and `longitude` is in nighttime on `date`
57 | let isNighttime = solar.isNighttime
58 | ```
59 |
60 | ## Installation
61 |
62 | Solar is available through CocoaPods, Carthage, and Swift Package Manager.
63 |
64 | ### CocoaPods
65 |
66 | To include Solar in an application, add the following [pod](https://guides.cocoapods.org/syntax/podfile.html#pod) to your Podfile, then run `pod install`:
67 |
68 | ```ruby
69 | pod "Solar-dev", "~> 3.0"
70 | ```
71 |
72 | To include Solar in another pod, add the following [dependency](https://guides.cocoapods.org/syntax/podspec.html#dependency) to your podspec:
73 |
74 | ```ruby
75 | s.dependency "Solar", "~> 3.0"
76 | ```
77 |
78 | ### Carthage
79 |
80 | Add the `ceek/Solar` project to your [Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile), then follow the rest of [Carthage’s XCFramework installation instructions](https://github.com/Carthage/Carthage#building-platform-independent-xcframeworks-xcode-12-and-above):
81 |
82 | ```ruby
83 | github "ceeK/Solar" ~> 3.0
84 | ```
85 |
86 | ### Swift Package Manager
87 |
88 | To include Solar in an application in Xcode:
89 |
90 | 1. Go to File ‣ Swift Packages ‣ Add Package Dependency.
91 | 1. Enter `https://github.com/ceeK/Solar.git` as the package repository and click Next.
92 | 1. Set Rules to Version, Up to Next Major, and enter `3.0.0` as the minimum version requirement. Click Next.
93 |
94 | To include Solar in another Swift package, add the following [dependency](https://developer.apple.com/documentation/swift_packages/package/dependency) to your Package.swift:
95 |
96 | ```swift
97 | .package(name: "Solar", url: "https://github.com/ceeK/Solar.git", from: "3.0.0")
98 | ```
99 |
100 | # License
101 |
102 | The MIT License (MIT)
103 |
104 | Copyright (c) 2016-2021 Chris Howell
105 |
106 | Permission is hereby granted, free of charge, to any person obtaining a copy
107 | of this software and associated documentation files (the "Software"), to deal
108 | in the Software without restriction, including without limitation the rights
109 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
110 | copies of the Software, and to permit persons to whom the Software is
111 | furnished to do so, subject to the following conditions:
112 |
113 | The above copyright notice and this permission notice shall be included in all
114 | copies or substantial portions of the Software.
115 |
116 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
117 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
118 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
119 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
120 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
121 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
122 | SOFTWARE.
123 |
--------------------------------------------------------------------------------
/SolarTests/SolarTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SolarTests.swift
3 | // SolarTests
4 | //
5 | // Created by Chris Howell on 08/02/2017.
6 | // Copyright © 2017 Chris Howell. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import CoreLocation
11 | @testable import Solar
12 |
13 | final class SolarTests: XCTestCase {
14 |
15 | private let testDate = Date(timeIntervalSince1970: 1486598400)
16 |
17 | /// How accurate, in minutes either side of the actual sunrise sunset, we want to be
18 | /// This is necessary as the algorithm uses assumptions during calculation
19 | private let testAccuracy: TimeInterval = 60 * 5
20 | private var cities: [City]!
21 |
22 | let bundle: Bundle = {
23 | #if SWIFT_PACKAGE
24 | return Bundle.module
25 | #else
26 | return Bundle(for: SolarTests.self)
27 | #endif
28 | }()
29 |
30 | override func setUpWithError() throws {
31 | try super.setUpWithError()
32 | let resultsURL = try XCTUnwrap(bundle.url(forResource: "CorrectResults", withExtension: "json"))
33 | let data = try Data(contentsOf: resultsURL)
34 | let cityDictionaries = try XCTUnwrap(try JSONSerialization.jsonObject(with: data, options: []) as? [[String : Any]])
35 | cities = cityDictionaries.map(City.init(json:))
36 | }
37 |
38 | func testSunrise() {
39 | for city in cities {
40 | let solar = Solar(for: testDate, coordinate: city.coordinate)
41 |
42 | guard
43 | let sunrise = solar?.sunrise
44 | else {
45 | XCTFail("Sunrise cannot be generated for city \(city.name)")
46 | return
47 | }
48 |
49 | XCTAssertEqual(sunrise.timeIntervalSince1970, city.sunrise.timeIntervalSince1970, accuracy: testAccuracy, "\(city.name): \(sunrise) not close to \(city.sunrise)")
50 | }
51 | }
52 |
53 | func testSunrise_isNil_whenNoSunriseOccurs() {
54 | let solar = Solar(for: testDate, coordinate: CLLocationCoordinate2D(latitude: 78.2186, longitude: 15.64007)) // Location: Longyearbyen
55 | XCTAssertNotNil(solar)
56 | XCTAssertNil(solar?.sunrise)
57 | }
58 |
59 | func testSunset() {
60 | for city in cities {
61 |
62 | let solar = Solar(for: testDate, coordinate: city.coordinate)
63 |
64 | guard
65 | let sunset = solar?.sunset
66 | else {
67 | XCTFail("Sunset cannot be generated for city \(city.name)")
68 | return
69 | }
70 |
71 | XCTAssertEqual(sunset.timeIntervalSince1970, city.sunset.timeIntervalSince1970, accuracy: testAccuracy, "\(city.name): \(sunset) not close to \(city.sunset)")
72 | }
73 | }
74 |
75 | func testSunset_isNil_whenNoSunsetOccurs() {
76 |
77 | let solar = Solar(for: testDate, coordinate: CLLocationCoordinate2D(latitude: 78.2186, longitude: 15.64007)) // Location: Longyearbyen
78 | XCTAssertNotNil(solar)
79 | XCTAssertNil(solar?.sunset)
80 | }
81 |
82 | func testIsDayTime_isTrue_betweenSunriseAndSunset() {
83 | let daytime = Date(timeIntervalSince1970: 1486641600) // noon
84 | let city = cities.first(where: { $0.name == "London" })!
85 |
86 | guard
87 | let solar = Solar(for: daytime, coordinate: city.coordinate)
88 | else {
89 | XCTFail("Cannot get solar")
90 | return
91 | }
92 |
93 | XCTAssertTrue(solar.isDaytime, "isDaytime is false for date: \(daytime) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)")
94 | XCTAssertFalse(solar.isNighttime, "isNighttime is true for date: \(daytime) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)")
95 | }
96 |
97 | func testIsDayTime_isTrue_exactlyAtSunrise() {
98 | let sunrise = Date(timeIntervalSince1970: 1486625181)
99 | let city = cities.first(where: { $0.name == "London" })!
100 |
101 | guard
102 | let solar = Solar(for: sunrise, coordinate: city.coordinate)
103 | else {
104 | XCTFail("Cannot get solar")
105 | return
106 | }
107 |
108 | XCTAssertTrue(solar.isDaytime, "isDaytime is false for date: \(sunrise) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)")
109 | XCTAssertFalse(solar.isNighttime, "isNighttime is true for date: \(sunrise) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)")
110 | }
111 |
112 | func testIsDayTime_isFalse_exactlyAtSunset() {
113 | let sunset = Date(timeIntervalSince1970: 1486659846)
114 | let city = cities.first(where: { $0.name == "London" })!
115 |
116 | guard
117 | let solar = Solar(for: sunset, coordinate: city.coordinate)
118 | else {
119 | XCTFail("Cannot get solar")
120 | return
121 | }
122 |
123 | XCTAssertFalse(solar.isDaytime, "isDaytime is false for date: \(sunset) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)")
124 | XCTAssertTrue(solar.isNighttime, "isNighttime is true for date: \(sunset) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)")
125 | }
126 |
127 | func testIsDayTime_isFalse_beforeSunrise() {
128 | let beforeSunrise = Date(timeIntervalSince1970: 1486624980)
129 | let city = cities.first(where: { $0.name == "London" })!
130 |
131 | guard
132 | let solar = Solar(for: beforeSunrise, coordinate: city.coordinate)
133 | else {
134 | XCTFail("Cannot get solar")
135 | return
136 | }
137 |
138 | XCTAssertFalse(solar.isDaytime, "isDaytime is true for date: \(beforeSunrise) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)")
139 | XCTAssertTrue(solar.isNighttime, "isNighttime is false for date: \(beforeSunrise) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)")
140 | }
141 |
142 | func testIsDayTime_isFalse_afterSunset() {
143 | let afterSunset = Date(timeIntervalSince1970: 1486659960)
144 | let city = cities.first(where: { $0.name == "London" })!
145 |
146 | guard
147 | let solar = Solar(for: afterSunset, coordinate: city.coordinate)
148 | else {
149 | XCTFail("Cannot get solar")
150 | return
151 | }
152 |
153 | XCTAssertFalse(solar.isDaytime, "isDaytime is true for date: \(afterSunset) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)")
154 | XCTAssertTrue(solar.isNighttime, "isNighttime is false for date: \(afterSunset) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)")
155 | }
156 |
157 | func testSolar_ShouldReturnNilOnInit_GivenInvalidcoordinate() {
158 |
159 | let invalidCoordinate1 = CLLocationCoordinate2D(latitude: -100, longitude: 0)
160 | XCTAssertFalse(CLLocationCoordinate2DIsValid(invalidCoordinate1))
161 | let solar1 = Solar(for: testDate, coordinate: invalidCoordinate1)
162 | XCTAssertNil(solar1)
163 |
164 | let invalidCoordinate2 = CLLocationCoordinate2D(latitude: 180, longitude: 190)
165 | XCTAssertFalse(CLLocationCoordinate2DIsValid(invalidCoordinate2))
166 | let solar2 = Solar(for: testDate, coordinate: invalidCoordinate2)
167 | XCTAssertNil(solar2)
168 | }
169 | }
170 |
--------------------------------------------------------------------------------
/Solar/Solar.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Solar.swift
3 | // SolarExample
4 | //
5 | // Created by Chris Howell on 16/01/2016.
6 | // Copyright © 2016 Chris Howell. All rights reserved.
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the “Software”), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 | //
26 |
27 | import Foundation
28 | import CoreLocation
29 |
30 | public struct Solar {
31 |
32 | /// The coordinate that is used for the calculation
33 | public let coordinate: CLLocationCoordinate2D
34 |
35 | /// The date to generate sunrise / sunset times for
36 | public fileprivate(set) var date: Date
37 |
38 | public fileprivate(set) var sunrise: Date?
39 | public fileprivate(set) var sunset: Date?
40 | public fileprivate(set) var civilSunrise: Date?
41 | public fileprivate(set) var civilSunset: Date?
42 | public fileprivate(set) var nauticalSunrise: Date?
43 | public fileprivate(set) var nauticalSunset: Date?
44 | public fileprivate(set) var astronomicalSunrise: Date?
45 | public fileprivate(set) var astronomicalSunset: Date?
46 |
47 | // MARK: Init
48 |
49 | public init?(for date: Date = Date(), coordinate: CLLocationCoordinate2D) {
50 | self.date = date
51 |
52 | guard CLLocationCoordinate2DIsValid(coordinate) else {
53 | return nil
54 | }
55 |
56 | self.coordinate = coordinate
57 |
58 | // Fill this Solar object with relevant data
59 | calculate()
60 | }
61 |
62 | // MARK: - Public functions
63 |
64 | /// Sets all of the Solar object's sunrise / sunset variables, if possible.
65 | /// - Note: Can return `nil` objects if sunrise / sunset does not occur on that day.
66 | public mutating func calculate() {
67 | sunrise = calculate(.sunrise, for: date, and: .official)
68 | sunset = calculate(.sunset, for: date, and: .official)
69 | civilSunrise = calculate(.sunrise, for: date, and: .civil)
70 | civilSunset = calculate(.sunset, for: date, and: .civil)
71 | nauticalSunrise = calculate(.sunrise, for: date, and: .nautical)
72 | nauticalSunset = calculate(.sunset, for: date, and: .nautical)
73 | astronomicalSunrise = calculate(.sunrise, for: date, and: .astronimical)
74 | astronomicalSunset = calculate(.sunset, for: date, and: .astronimical)
75 | }
76 |
77 | // MARK: - Private functions
78 |
79 | fileprivate enum SunriseSunset {
80 | case sunrise
81 | case sunset
82 | }
83 |
84 | /// Used for generating several of the possible sunrise / sunset times
85 | fileprivate enum Zenith: Double {
86 | case official = 90.83
87 | case civil = 96
88 | case nautical = 102
89 | case astronimical = 108
90 | }
91 |
92 | fileprivate func calculate(_ sunriseSunset: SunriseSunset, for date: Date, and zenith: Zenith) -> Date? {
93 | guard let utcTimezone = TimeZone(identifier: "UTC") else { return nil }
94 |
95 | // Get the day of the year
96 | var calendar = Calendar(identifier: .gregorian)
97 | calendar.timeZone = utcTimezone
98 | guard let dayInt = calendar.ordinality(of: .day, in: .year, for: date) else { return nil }
99 | let day = Double(dayInt)
100 |
101 | // Convert longitude to hour value and calculate an approx. time
102 | let lngHour = coordinate.longitude / 15
103 |
104 | let hourTime: Double = sunriseSunset == .sunrise ? 6 : 18
105 | let t = day + ((hourTime - lngHour) / 24)
106 |
107 | // Calculate the suns mean anomaly
108 | let M = (0.9856 * t) - 3.289
109 |
110 | // Calculate the sun's true longitude
111 | let subexpression1 = 1.916 * sin(M.degreesToRadians)
112 | let subexpression2 = 0.020 * sin(2 * M.degreesToRadians)
113 | var L = M + subexpression1 + subexpression2 + 282.634
114 |
115 | // Normalise L into [0, 360] range
116 | L = normalise(L, withMaximum: 360)
117 |
118 | // Calculate the Sun's right ascension
119 | var RA = atan(0.91764 * tan(L.degreesToRadians)).radiansToDegrees
120 |
121 | // Normalise RA into [0, 360] range
122 | RA = normalise(RA, withMaximum: 360)
123 |
124 | // Right ascension value needs to be in the same quadrant as L...
125 | let Lquadrant = floor(L / 90) * 90
126 | let RAquadrant = floor(RA / 90) * 90
127 | RA = RA + (Lquadrant - RAquadrant)
128 |
129 | // Convert RA into hours
130 | RA = RA / 15
131 |
132 | // Calculate Sun's declination
133 | let sinDec = 0.39782 * sin(L.degreesToRadians)
134 | let cosDec = cos(asin(sinDec))
135 |
136 | // Calculate the Sun's local hour angle
137 | let cosH = (cos(zenith.rawValue.degreesToRadians) - (sinDec * sin(coordinate.latitude.degreesToRadians))) / (cosDec * cos(coordinate.latitude.degreesToRadians))
138 |
139 | // No sunrise
140 | guard cosH < 1 else {
141 | return nil
142 | }
143 |
144 | // No sunset
145 | guard cosH > -1 else {
146 | return nil
147 | }
148 |
149 | // Finish calculating H and convert into hours
150 | let tempH = sunriseSunset == .sunrise ? 360 - acos(cosH).radiansToDegrees : acos(cosH).radiansToDegrees
151 | let H = tempH / 15.0
152 |
153 | // Calculate local mean time of rising
154 | let T = H + RA - (0.06571 * t) - 6.622
155 |
156 | // Adjust time back to UTC
157 | var UT = T - lngHour
158 |
159 | // Normalise UT into [0, 24] range
160 | UT = normalise(UT, withMaximum: 24)
161 |
162 | // Calculate all of the sunrise's / sunset's date components
163 | let hour = floor(UT)
164 | let minute = floor((UT - hour) * 60.0)
165 | let second = (((UT - hour) * 60) - minute) * 60.0
166 |
167 | let shouldBeYesterday = lngHour > 0 && UT > 12 && sunriseSunset == .sunrise
168 | let shouldBeTomorrow = lngHour < 0 && UT < 12 && sunriseSunset == .sunset
169 |
170 | let setDate: Date
171 | if shouldBeYesterday {
172 | setDate = Date(timeInterval: -(60 * 60 * 24), since: date)
173 | } else if shouldBeTomorrow {
174 | setDate = Date(timeInterval: (60 * 60 * 24), since: date)
175 | } else {
176 | setDate = date
177 | }
178 |
179 | var components = calendar.dateComponents([.day, .month, .year], from: setDate)
180 | components.hour = Int(hour)
181 | components.minute = Int(minute)
182 | components.second = Int(second)
183 |
184 | calendar.timeZone = utcTimezone
185 | return calendar.date(from: components)
186 | }
187 |
188 | /// Normalises a value between 0 and `maximum`, by adding or subtracting `maximum`
189 | fileprivate func normalise(_ value: Double, withMaximum maximum: Double) -> Double {
190 | var value = value
191 |
192 | if value < 0 {
193 | value += maximum
194 | }
195 |
196 | if value > maximum {
197 | value -= maximum
198 | }
199 |
200 | return value
201 | }
202 |
203 | }
204 |
205 | extension Solar {
206 |
207 | /// Whether the location specified by the `latitude` and `longitude` is in daytime on `date`
208 | /// - Complexity: O(1)
209 | public var isDaytime: Bool {
210 | guard
211 | let sunrise = sunrise,
212 | let sunset = sunset
213 | else {
214 | return false
215 | }
216 |
217 | let beginningOfDay = sunrise.timeIntervalSince1970
218 | let endOfDay = sunset.timeIntervalSince1970
219 | let currentTime = self.date.timeIntervalSince1970
220 |
221 | let isSunriseOrLater = currentTime >= beginningOfDay
222 | let isBeforeSunset = currentTime < endOfDay
223 |
224 | return isSunriseOrLater && isBeforeSunset
225 | }
226 |
227 | /// Whether the location specified by the `latitude` and `longitude` is in nighttime on `date`
228 | /// - Complexity: O(1)
229 | public var isNighttime: Bool {
230 | return !isDaytime
231 | }
232 |
233 | }
234 |
235 | // MARK: - Helper extensions
236 |
237 | private extension Double {
238 | var degreesToRadians: Double {
239 | return Double(self) * (Double.pi / 180.0)
240 | }
241 |
242 | var radiansToDegrees: Double {
243 | return (Double(self) * 180.0) / Double.pi
244 | }
245 | }
246 |
--------------------------------------------------------------------------------
/Solar.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1410E9C81EF12C1E001829A5 /* Solar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FC5B651D469B4E00C4D3EB /* Solar.swift */; };
11 | 14381E7A1EF96100008E9826 /* Solar.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F7FC5B5A1D469B2700C4D3EB /* Solar.framework */; };
12 | 14456B851EF96AC000D76A4D /* City.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B831EF96ABA00D76A4D /* City.swift */; };
13 | 14456B881EF96ACD00D76A4D /* SolarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B861EF96ACA00D76A4D /* SolarTests.swift */; };
14 | 4CABE4EA2161610E009BAAB8 /* Solar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FC5B651D469B4E00C4D3EB /* Solar.swift */; };
15 | 4CABE50A21616FFB009BAAB8 /* Solar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FC5B651D469B4E00C4D3EB /* Solar.swift */; };
16 | DA3AAFF525DCBAB400FB1D88 /* CorrectResults.json in Resources */ = {isa = PBXBuildFile; fileRef = 14456B891EF96AD900D76A4D /* CorrectResults.json */; };
17 | DA85D68225DCADA8008A2AD4 /* Solar.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CABE4E2216160CF009BAAB8 /* Solar.framework */; };
18 | DA85D6B225DCAECC008A2AD4 /* City.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B831EF96ABA00D76A4D /* City.swift */; };
19 | DA85D6B925DCAED0008A2AD4 /* CorrectResults.json in Resources */ = {isa = PBXBuildFile; fileRef = 14456B891EF96AD900D76A4D /* CorrectResults.json */; };
20 | DA85D6D525DCB095008A2AD4 /* Solar.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CABE500216169DE009BAAB8 /* Solar.framework */; };
21 | DA85D6FE25DCB0DA008A2AD4 /* City.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B831EF96ABA00D76A4D /* City.swift */; };
22 | DA85D70625DCB0DD008A2AD4 /* CorrectResults.json in Resources */ = {isa = PBXBuildFile; fileRef = 14456B891EF96AD900D76A4D /* CorrectResults.json */; };
23 | DA85D70E25DCB0ED008A2AD4 /* SolarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B861EF96ACA00D76A4D /* SolarTests.swift */; };
24 | DA85D71625DCB0FD008A2AD4 /* SolarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B861EF96ACA00D76A4D /* SolarTests.swift */; };
25 | F7FC5B661D469B4E00C4D3EB /* Solar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FC5B651D469B4E00C4D3EB /* Solar.swift */; };
26 | /* End PBXBuildFile section */
27 |
28 | /* Begin PBXContainerItemProxy section */
29 | 97837EB11E4BB1DE000FEF64 /* PBXContainerItemProxy */ = {
30 | isa = PBXContainerItemProxy;
31 | containerPortal = F7FC5B511D469B2700C4D3EB /* Project object */;
32 | proxyType = 1;
33 | remoteGlobalIDString = F7FC5B591D469B2700C4D3EB;
34 | remoteInfo = Solar;
35 | };
36 | DA85D68325DCADA8008A2AD4 /* PBXContainerItemProxy */ = {
37 | isa = PBXContainerItemProxy;
38 | containerPortal = F7FC5B511D469B2700C4D3EB /* Project object */;
39 | proxyType = 1;
40 | remoteGlobalIDString = 4CABE4E1216160CF009BAAB8;
41 | remoteInfo = "Solar macOS";
42 | };
43 | DA85D6D625DCB095008A2AD4 /* PBXContainerItemProxy */ = {
44 | isa = PBXContainerItemProxy;
45 | containerPortal = F7FC5B511D469B2700C4D3EB /* Project object */;
46 | proxyType = 1;
47 | remoteGlobalIDString = 4CABE4FF216169DE009BAAB8;
48 | remoteInfo = "Solar tvOS";
49 | };
50 | /* End PBXContainerItemProxy section */
51 |
52 | /* Begin PBXFileReference section */
53 | 1410E9B71EF12AD4001829A5 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
54 | 1410E9C01EF12B5A001829A5 /* Solar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Solar.framework; sourceTree = BUILT_PRODUCTS_DIR; };
55 | 14456B831EF96ABA00D76A4D /* City.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = City.swift; sourceTree = ""; };
56 | 14456B861EF96ACA00D76A4D /* SolarTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SolarTests.swift; sourceTree = ""; };
57 | 14456B891EF96AD900D76A4D /* CorrectResults.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = CorrectResults.json; sourceTree = ""; };
58 | 14456B8A1EF96AD900D76A4D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
59 | 4CABE4E2216160CF009BAAB8 /* Solar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Solar.framework; sourceTree = BUILT_PRODUCTS_DIR; };
60 | 4CABE500216169DE009BAAB8 /* Solar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Solar.framework; sourceTree = BUILT_PRODUCTS_DIR; };
61 | 97837EAB1E4BB1DE000FEF64 /* SolarTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SolarTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
62 | DA85D67D25DCADA8008A2AD4 /* SolarTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SolarTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
63 | DA85D6D025DCB095008A2AD4 /* SolarTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SolarTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
64 | F7FC5B5A1D469B2700C4D3EB /* Solar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Solar.framework; sourceTree = BUILT_PRODUCTS_DIR; };
65 | F7FC5B651D469B4E00C4D3EB /* Solar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Solar.swift; sourceTree = ""; };
66 | /* End PBXFileReference section */
67 |
68 | /* Begin PBXFrameworksBuildPhase section */
69 | 1410E9BC1EF12B5A001829A5 /* Frameworks */ = {
70 | isa = PBXFrameworksBuildPhase;
71 | buildActionMask = 2147483647;
72 | files = (
73 | );
74 | runOnlyForDeploymentPostprocessing = 0;
75 | };
76 | 4CABE4DF216160CF009BAAB8 /* Frameworks */ = {
77 | isa = PBXFrameworksBuildPhase;
78 | buildActionMask = 2147483647;
79 | files = (
80 | );
81 | runOnlyForDeploymentPostprocessing = 0;
82 | };
83 | 4CABE4FD216169DE009BAAB8 /* Frameworks */ = {
84 | isa = PBXFrameworksBuildPhase;
85 | buildActionMask = 2147483647;
86 | files = (
87 | );
88 | runOnlyForDeploymentPostprocessing = 0;
89 | };
90 | 97837EA81E4BB1DE000FEF64 /* Frameworks */ = {
91 | isa = PBXFrameworksBuildPhase;
92 | buildActionMask = 2147483647;
93 | files = (
94 | 14381E7A1EF96100008E9826 /* Solar.framework in Frameworks */,
95 | );
96 | runOnlyForDeploymentPostprocessing = 0;
97 | };
98 | DA85D67A25DCADA8008A2AD4 /* Frameworks */ = {
99 | isa = PBXFrameworksBuildPhase;
100 | buildActionMask = 2147483647;
101 | files = (
102 | DA85D68225DCADA8008A2AD4 /* Solar.framework in Frameworks */,
103 | );
104 | runOnlyForDeploymentPostprocessing = 0;
105 | };
106 | DA85D6CD25DCB095008A2AD4 /* Frameworks */ = {
107 | isa = PBXFrameworksBuildPhase;
108 | buildActionMask = 2147483647;
109 | files = (
110 | DA85D6D525DCB095008A2AD4 /* Solar.framework in Frameworks */,
111 | );
112 | runOnlyForDeploymentPostprocessing = 0;
113 | };
114 | F7FC5B561D469B2700C4D3EB /* Frameworks */ = {
115 | isa = PBXFrameworksBuildPhase;
116 | buildActionMask = 2147483647;
117 | files = (
118 | );
119 | runOnlyForDeploymentPostprocessing = 0;
120 | };
121 | /* End PBXFrameworksBuildPhase section */
122 |
123 | /* Begin PBXGroup section */
124 | 14456B801EF96A8F00D76A4D /* SolarTests */ = {
125 | isa = PBXGroup;
126 | children = (
127 | 14456B861EF96ACA00D76A4D /* SolarTests.swift */,
128 | 14456B811EF96A9E00D76A4D /* Helpers */,
129 | 14456B821EF96AA500D76A4D /* Resources */,
130 | );
131 | path = SolarTests;
132 | sourceTree = "";
133 | };
134 | 14456B811EF96A9E00D76A4D /* Helpers */ = {
135 | isa = PBXGroup;
136 | children = (
137 | 14456B831EF96ABA00D76A4D /* City.swift */,
138 | );
139 | name = Helpers;
140 | sourceTree = "";
141 | };
142 | 14456B821EF96AA500D76A4D /* Resources */ = {
143 | isa = PBXGroup;
144 | children = (
145 | 14456B8A1EF96AD900D76A4D /* Info.plist */,
146 | 14456B891EF96AD900D76A4D /* CorrectResults.json */,
147 | );
148 | name = Resources;
149 | sourceTree = "";
150 | };
151 | F7FC5B501D469B2700C4D3EB = {
152 | isa = PBXGroup;
153 | children = (
154 | F7FC5B5C1D469B2700C4D3EB /* Solar */,
155 | 14456B801EF96A8F00D76A4D /* SolarTests */,
156 | F7FC5B5B1D469B2700C4D3EB /* Products */,
157 | );
158 | sourceTree = "";
159 | };
160 | F7FC5B5B1D469B2700C4D3EB /* Products */ = {
161 | isa = PBXGroup;
162 | children = (
163 | F7FC5B5A1D469B2700C4D3EB /* Solar.framework */,
164 | 97837EAB1E4BB1DE000FEF64 /* SolarTests.xctest */,
165 | 1410E9C01EF12B5A001829A5 /* Solar.framework */,
166 | 4CABE4E2216160CF009BAAB8 /* Solar.framework */,
167 | 4CABE500216169DE009BAAB8 /* Solar.framework */,
168 | DA85D67D25DCADA8008A2AD4 /* SolarTests.xctest */,
169 | DA85D6D025DCB095008A2AD4 /* SolarTests.xctest */,
170 | );
171 | name = Products;
172 | sourceTree = "";
173 | };
174 | F7FC5B5C1D469B2700C4D3EB /* Solar */ = {
175 | isa = PBXGroup;
176 | children = (
177 | F7FC5B651D469B4E00C4D3EB /* Solar.swift */,
178 | 1410E9B71EF12AD4001829A5 /* Info.plist */,
179 | );
180 | path = Solar;
181 | sourceTree = "";
182 | };
183 | /* End PBXGroup section */
184 |
185 | /* Begin PBXHeadersBuildPhase section */
186 | 1410E9BD1EF12B5A001829A5 /* Headers */ = {
187 | isa = PBXHeadersBuildPhase;
188 | buildActionMask = 2147483647;
189 | files = (
190 | );
191 | runOnlyForDeploymentPostprocessing = 0;
192 | };
193 | 4CABE4DD216160CF009BAAB8 /* Headers */ = {
194 | isa = PBXHeadersBuildPhase;
195 | buildActionMask = 2147483647;
196 | files = (
197 | );
198 | runOnlyForDeploymentPostprocessing = 0;
199 | };
200 | 4CABE4FB216169DE009BAAB8 /* Headers */ = {
201 | isa = PBXHeadersBuildPhase;
202 | buildActionMask = 2147483647;
203 | files = (
204 | );
205 | runOnlyForDeploymentPostprocessing = 0;
206 | };
207 | F7FC5B571D469B2700C4D3EB /* Headers */ = {
208 | isa = PBXHeadersBuildPhase;
209 | buildActionMask = 2147483647;
210 | files = (
211 | );
212 | runOnlyForDeploymentPostprocessing = 0;
213 | };
214 | /* End PBXHeadersBuildPhase section */
215 |
216 | /* Begin PBXNativeTarget section */
217 | 1410E9BF1EF12B5A001829A5 /* Solar watchOS */ = {
218 | isa = PBXNativeTarget;
219 | buildConfigurationList = 1410E9C51EF12B5A001829A5 /* Build configuration list for PBXNativeTarget "Solar watchOS" */;
220 | buildPhases = (
221 | 1410E9BB1EF12B5A001829A5 /* Sources */,
222 | 1410E9BC1EF12B5A001829A5 /* Frameworks */,
223 | 1410E9BD1EF12B5A001829A5 /* Headers */,
224 | 1410E9BE1EF12B5A001829A5 /* Resources */,
225 | );
226 | buildRules = (
227 | );
228 | dependencies = (
229 | );
230 | name = "Solar watchOS";
231 | productName = Solar;
232 | productReference = 1410E9C01EF12B5A001829A5 /* Solar.framework */;
233 | productType = "com.apple.product-type.framework";
234 | };
235 | 4CABE4E1216160CF009BAAB8 /* Solar macOS */ = {
236 | isa = PBXNativeTarget;
237 | buildConfigurationList = 4CABE4E7216160CF009BAAB8 /* Build configuration list for PBXNativeTarget "Solar macOS" */;
238 | buildPhases = (
239 | 4CABE4DD216160CF009BAAB8 /* Headers */,
240 | 4CABE4DE216160CF009BAAB8 /* Sources */,
241 | 4CABE4DF216160CF009BAAB8 /* Frameworks */,
242 | 4CABE4E0216160CF009BAAB8 /* Resources */,
243 | );
244 | buildRules = (
245 | );
246 | dependencies = (
247 | );
248 | name = "Solar macOS";
249 | productName = Solar_macOS;
250 | productReference = 4CABE4E2216160CF009BAAB8 /* Solar.framework */;
251 | productType = "com.apple.product-type.framework";
252 | };
253 | 4CABE4FF216169DE009BAAB8 /* Solar tvOS */ = {
254 | isa = PBXNativeTarget;
255 | buildConfigurationList = 4CABE505216169DF009BAAB8 /* Build configuration list for PBXNativeTarget "Solar tvOS" */;
256 | buildPhases = (
257 | 4CABE4FB216169DE009BAAB8 /* Headers */,
258 | 4CABE4FC216169DE009BAAB8 /* Sources */,
259 | 4CABE4FD216169DE009BAAB8 /* Frameworks */,
260 | 4CABE4FE216169DE009BAAB8 /* Resources */,
261 | );
262 | buildRules = (
263 | );
264 | dependencies = (
265 | );
266 | name = "Solar tvOS";
267 | productName = Solar_tvOS;
268 | productReference = 4CABE500216169DE009BAAB8 /* Solar.framework */;
269 | productType = "com.apple.product-type.framework";
270 | };
271 | 97837EAA1E4BB1DE000FEF64 /* SolarTests iOS */ = {
272 | isa = PBXNativeTarget;
273 | buildConfigurationList = 97837EB51E4BB1DE000FEF64 /* Build configuration list for PBXNativeTarget "SolarTests iOS" */;
274 | buildPhases = (
275 | 97837EA71E4BB1DE000FEF64 /* Sources */,
276 | 97837EA81E4BB1DE000FEF64 /* Frameworks */,
277 | 97837EA91E4BB1DE000FEF64 /* Resources */,
278 | );
279 | buildRules = (
280 | );
281 | dependencies = (
282 | 97837EB21E4BB1DE000FEF64 /* PBXTargetDependency */,
283 | );
284 | name = "SolarTests iOS";
285 | productName = SolarTests;
286 | productReference = 97837EAB1E4BB1DE000FEF64 /* SolarTests.xctest */;
287 | productType = "com.apple.product-type.bundle.unit-test";
288 | };
289 | DA85D67C25DCADA8008A2AD4 /* SolarTests macOS */ = {
290 | isa = PBXNativeTarget;
291 | buildConfigurationList = DA85D68525DCADA8008A2AD4 /* Build configuration list for PBXNativeTarget "SolarTests macOS" */;
292 | buildPhases = (
293 | DA85D67925DCADA8008A2AD4 /* Sources */,
294 | DA85D67A25DCADA8008A2AD4 /* Frameworks */,
295 | DA85D67B25DCADA8008A2AD4 /* Resources */,
296 | );
297 | buildRules = (
298 | );
299 | dependencies = (
300 | DA85D68425DCADA8008A2AD4 /* PBXTargetDependency */,
301 | );
302 | name = "SolarTests macOS";
303 | productName = SolarTests;
304 | productReference = DA85D67D25DCADA8008A2AD4 /* SolarTests.xctest */;
305 | productType = "com.apple.product-type.bundle.unit-test";
306 | };
307 | DA85D6CF25DCB095008A2AD4 /* SolarTests tvOS */ = {
308 | isa = PBXNativeTarget;
309 | buildConfigurationList = DA85D6DA25DCB095008A2AD4 /* Build configuration list for PBXNativeTarget "SolarTests tvOS" */;
310 | buildPhases = (
311 | DA85D6CC25DCB095008A2AD4 /* Sources */,
312 | DA85D6CD25DCB095008A2AD4 /* Frameworks */,
313 | DA85D6CE25DCB095008A2AD4 /* Resources */,
314 | );
315 | buildRules = (
316 | );
317 | dependencies = (
318 | DA85D6D725DCB095008A2AD4 /* PBXTargetDependency */,
319 | );
320 | name = "SolarTests tvOS";
321 | productName = SolarTests;
322 | productReference = DA85D6D025DCB095008A2AD4 /* SolarTests.xctest */;
323 | productType = "com.apple.product-type.bundle.unit-test";
324 | };
325 | F7FC5B591D469B2700C4D3EB /* Solar iOS */ = {
326 | isa = PBXNativeTarget;
327 | buildConfigurationList = F7FC5B621D469B2700C4D3EB /* Build configuration list for PBXNativeTarget "Solar iOS" */;
328 | buildPhases = (
329 | F7FC5B551D469B2700C4D3EB /* Sources */,
330 | F7FC5B561D469B2700C4D3EB /* Frameworks */,
331 | F7FC5B571D469B2700C4D3EB /* Headers */,
332 | F7FC5B581D469B2700C4D3EB /* Resources */,
333 | );
334 | buildRules = (
335 | );
336 | dependencies = (
337 | );
338 | name = "Solar iOS";
339 | productName = Solar;
340 | productReference = F7FC5B5A1D469B2700C4D3EB /* Solar.framework */;
341 | productType = "com.apple.product-type.framework";
342 | };
343 | /* End PBXNativeTarget section */
344 |
345 | /* Begin PBXProject section */
346 | F7FC5B511D469B2700C4D3EB /* Project object */ = {
347 | isa = PBXProject;
348 | attributes = {
349 | LastSwiftUpdateCheck = 1240;
350 | LastUpgradeCheck = 1250;
351 | ORGANIZATIONNAME = "Chris Howell";
352 | TargetAttributes = {
353 | 1410E9BF1EF12B5A001829A5 = {
354 | CreatedOnToolsVersion = 8.3.3;
355 | ProvisioningStyle = Manual;
356 | };
357 | 4CABE4E1216160CF009BAAB8 = {
358 | CreatedOnToolsVersion = 10.1;
359 | ProvisioningStyle = Manual;
360 | };
361 | 4CABE4FF216169DE009BAAB8 = {
362 | CreatedOnToolsVersion = 10.1;
363 | ProvisioningStyle = Automatic;
364 | };
365 | 97837EAA1E4BB1DE000FEF64 = {
366 | CreatedOnToolsVersion = 8.2.1;
367 | LastSwiftMigration = 1100;
368 | ProvisioningStyle = Automatic;
369 | };
370 | DA85D67C25DCADA8008A2AD4 = {
371 | CreatedOnToolsVersion = 12.4;
372 | ProvisioningStyle = Automatic;
373 | };
374 | DA85D6CF25DCB095008A2AD4 = {
375 | CreatedOnToolsVersion = 12.4;
376 | ProvisioningStyle = Automatic;
377 | };
378 | F7FC5B591D469B2700C4D3EB = {
379 | CreatedOnToolsVersion = 7.3.1;
380 | LastSwiftMigration = 1100;
381 | };
382 | };
383 | };
384 | buildConfigurationList = F7FC5B541D469B2700C4D3EB /* Build configuration list for PBXProject "Solar" */;
385 | compatibilityVersion = "Xcode 3.2";
386 | developmentRegion = en;
387 | hasScannedForEncodings = 0;
388 | knownRegions = (
389 | en,
390 | Base,
391 | );
392 | mainGroup = F7FC5B501D469B2700C4D3EB;
393 | productRefGroup = F7FC5B5B1D469B2700C4D3EB /* Products */;
394 | projectDirPath = "";
395 | projectRoot = "";
396 | targets = (
397 | F7FC5B591D469B2700C4D3EB /* Solar iOS */,
398 | 97837EAA1E4BB1DE000FEF64 /* SolarTests iOS */,
399 | 4CABE4E1216160CF009BAAB8 /* Solar macOS */,
400 | DA85D67C25DCADA8008A2AD4 /* SolarTests macOS */,
401 | 4CABE4FF216169DE009BAAB8 /* Solar tvOS */,
402 | DA85D6CF25DCB095008A2AD4 /* SolarTests tvOS */,
403 | 1410E9BF1EF12B5A001829A5 /* Solar watchOS */,
404 | );
405 | };
406 | /* End PBXProject section */
407 |
408 | /* Begin PBXResourcesBuildPhase section */
409 | 1410E9BE1EF12B5A001829A5 /* Resources */ = {
410 | isa = PBXResourcesBuildPhase;
411 | buildActionMask = 2147483647;
412 | files = (
413 | );
414 | runOnlyForDeploymentPostprocessing = 0;
415 | };
416 | 4CABE4E0216160CF009BAAB8 /* Resources */ = {
417 | isa = PBXResourcesBuildPhase;
418 | buildActionMask = 2147483647;
419 | files = (
420 | );
421 | runOnlyForDeploymentPostprocessing = 0;
422 | };
423 | 4CABE4FE216169DE009BAAB8 /* Resources */ = {
424 | isa = PBXResourcesBuildPhase;
425 | buildActionMask = 2147483647;
426 | files = (
427 | );
428 | runOnlyForDeploymentPostprocessing = 0;
429 | };
430 | 97837EA91E4BB1DE000FEF64 /* Resources */ = {
431 | isa = PBXResourcesBuildPhase;
432 | buildActionMask = 2147483647;
433 | files = (
434 | DA3AAFF525DCBAB400FB1D88 /* CorrectResults.json in Resources */,
435 | );
436 | runOnlyForDeploymentPostprocessing = 0;
437 | };
438 | DA85D67B25DCADA8008A2AD4 /* Resources */ = {
439 | isa = PBXResourcesBuildPhase;
440 | buildActionMask = 2147483647;
441 | files = (
442 | DA85D6B925DCAED0008A2AD4 /* CorrectResults.json in Resources */,
443 | );
444 | runOnlyForDeploymentPostprocessing = 0;
445 | };
446 | DA85D6CE25DCB095008A2AD4 /* Resources */ = {
447 | isa = PBXResourcesBuildPhase;
448 | buildActionMask = 2147483647;
449 | files = (
450 | DA85D70625DCB0DD008A2AD4 /* CorrectResults.json in Resources */,
451 | );
452 | runOnlyForDeploymentPostprocessing = 0;
453 | };
454 | F7FC5B581D469B2700C4D3EB /* Resources */ = {
455 | isa = PBXResourcesBuildPhase;
456 | buildActionMask = 2147483647;
457 | files = (
458 | );
459 | runOnlyForDeploymentPostprocessing = 0;
460 | };
461 | /* End PBXResourcesBuildPhase section */
462 |
463 | /* Begin PBXSourcesBuildPhase section */
464 | 1410E9BB1EF12B5A001829A5 /* Sources */ = {
465 | isa = PBXSourcesBuildPhase;
466 | buildActionMask = 2147483647;
467 | files = (
468 | 1410E9C81EF12C1E001829A5 /* Solar.swift in Sources */,
469 | );
470 | runOnlyForDeploymentPostprocessing = 0;
471 | };
472 | 4CABE4DE216160CF009BAAB8 /* Sources */ = {
473 | isa = PBXSourcesBuildPhase;
474 | buildActionMask = 2147483647;
475 | files = (
476 | 4CABE4EA2161610E009BAAB8 /* Solar.swift in Sources */,
477 | );
478 | runOnlyForDeploymentPostprocessing = 0;
479 | };
480 | 4CABE4FC216169DE009BAAB8 /* Sources */ = {
481 | isa = PBXSourcesBuildPhase;
482 | buildActionMask = 2147483647;
483 | files = (
484 | 4CABE50A21616FFB009BAAB8 /* Solar.swift in Sources */,
485 | );
486 | runOnlyForDeploymentPostprocessing = 0;
487 | };
488 | 97837EA71E4BB1DE000FEF64 /* Sources */ = {
489 | isa = PBXSourcesBuildPhase;
490 | buildActionMask = 2147483647;
491 | files = (
492 | 14456B851EF96AC000D76A4D /* City.swift in Sources */,
493 | 14456B881EF96ACD00D76A4D /* SolarTests.swift in Sources */,
494 | );
495 | runOnlyForDeploymentPostprocessing = 0;
496 | };
497 | DA85D67925DCADA8008A2AD4 /* Sources */ = {
498 | isa = PBXSourcesBuildPhase;
499 | buildActionMask = 2147483647;
500 | files = (
501 | DA85D6B225DCAECC008A2AD4 /* City.swift in Sources */,
502 | DA85D70E25DCB0ED008A2AD4 /* SolarTests.swift in Sources */,
503 | );
504 | runOnlyForDeploymentPostprocessing = 0;
505 | };
506 | DA85D6CC25DCB095008A2AD4 /* Sources */ = {
507 | isa = PBXSourcesBuildPhase;
508 | buildActionMask = 2147483647;
509 | files = (
510 | DA85D6FE25DCB0DA008A2AD4 /* City.swift in Sources */,
511 | DA85D71625DCB0FD008A2AD4 /* SolarTests.swift in Sources */,
512 | );
513 | runOnlyForDeploymentPostprocessing = 0;
514 | };
515 | F7FC5B551D469B2700C4D3EB /* Sources */ = {
516 | isa = PBXSourcesBuildPhase;
517 | buildActionMask = 2147483647;
518 | files = (
519 | F7FC5B661D469B4E00C4D3EB /* Solar.swift in Sources */,
520 | );
521 | runOnlyForDeploymentPostprocessing = 0;
522 | };
523 | /* End PBXSourcesBuildPhase section */
524 |
525 | /* Begin PBXTargetDependency section */
526 | 97837EB21E4BB1DE000FEF64 /* PBXTargetDependency */ = {
527 | isa = PBXTargetDependency;
528 | target = F7FC5B591D469B2700C4D3EB /* Solar iOS */;
529 | targetProxy = 97837EB11E4BB1DE000FEF64 /* PBXContainerItemProxy */;
530 | };
531 | DA85D68425DCADA8008A2AD4 /* PBXTargetDependency */ = {
532 | isa = PBXTargetDependency;
533 | target = 4CABE4E1216160CF009BAAB8 /* Solar macOS */;
534 | targetProxy = DA85D68325DCADA8008A2AD4 /* PBXContainerItemProxy */;
535 | };
536 | DA85D6D725DCB095008A2AD4 /* PBXTargetDependency */ = {
537 | isa = PBXTargetDependency;
538 | target = 4CABE4FF216169DE009BAAB8 /* Solar tvOS */;
539 | targetProxy = DA85D6D625DCB095008A2AD4 /* PBXContainerItemProxy */;
540 | };
541 | /* End PBXTargetDependency section */
542 |
543 | /* Begin XCBuildConfiguration section */
544 | 1410E9C61EF12B5A001829A5 /* Debug */ = {
545 | isa = XCBuildConfiguration;
546 | buildSettings = {
547 | APPLICATION_EXTENSION_API_ONLY = YES;
548 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
549 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
550 | CODE_SIGN_IDENTITY = "";
551 | DEFINES_MODULE = YES;
552 | DEVELOPMENT_TEAM = "";
553 | DYLIB_COMPATIBILITY_VERSION = 1;
554 | DYLIB_CURRENT_VERSION = 4;
555 | DYLIB_INSTALL_NAME_BASE = "@rpath";
556 | INFOPLIST_FILE = Solar/Info.plist;
557 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
558 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
559 | MARKETING_VERSION = 2.2.0;
560 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar;
561 | PRODUCT_NAME = Solar;
562 | PROVISIONING_PROFILE_SPECIFIER = "";
563 | SDKROOT = watchos;
564 | SKIP_INSTALL = YES;
565 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
566 | TARGETED_DEVICE_FAMILY = 4;
567 | };
568 | name = Debug;
569 | };
570 | 1410E9C71EF12B5A001829A5 /* Release */ = {
571 | isa = XCBuildConfiguration;
572 | buildSettings = {
573 | APPLICATION_EXTENSION_API_ONLY = YES;
574 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
575 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
576 | CODE_SIGN_IDENTITY = "";
577 | DEFINES_MODULE = YES;
578 | DEVELOPMENT_TEAM = "";
579 | DYLIB_COMPATIBILITY_VERSION = 1;
580 | DYLIB_CURRENT_VERSION = 4;
581 | DYLIB_INSTALL_NAME_BASE = "@rpath";
582 | INFOPLIST_FILE = Solar/Info.plist;
583 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
584 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
585 | MARKETING_VERSION = 2.2.0;
586 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar;
587 | PRODUCT_NAME = Solar;
588 | PROVISIONING_PROFILE_SPECIFIER = "";
589 | SDKROOT = watchos;
590 | SKIP_INSTALL = YES;
591 | TARGETED_DEVICE_FAMILY = 4;
592 | };
593 | name = Release;
594 | };
595 | 4CABE4E8216160CF009BAAB8 /* Debug */ = {
596 | isa = XCBuildConfiguration;
597 | buildSettings = {
598 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
599 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
600 | CLANG_ENABLE_OBJC_WEAK = YES;
601 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
602 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
603 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
604 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
605 | CODE_SIGN_IDENTITY = "-";
606 | CODE_SIGN_STYLE = Manual;
607 | COMBINE_HIDPI_IMAGES = YES;
608 | DEFINES_MODULE = YES;
609 | DEVELOPMENT_TEAM = "";
610 | DYLIB_COMPATIBILITY_VERSION = 1;
611 | DYLIB_CURRENT_VERSION = 4;
612 | DYLIB_INSTALL_NAME_BASE = "@rpath";
613 | FRAMEWORK_VERSION = A;
614 | GCC_C_LANGUAGE_STANDARD = gnu11;
615 | INFOPLIST_FILE = Solar/Info.plist;
616 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
617 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
618 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
619 | MTL_FAST_MATH = YES;
620 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar;
621 | PRODUCT_NAME = Solar;
622 | PROVISIONING_PROFILE_SPECIFIER = "";
623 | SDKROOT = macosx;
624 | SKIP_INSTALL = YES;
625 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
626 | };
627 | name = Debug;
628 | };
629 | 4CABE4E9216160CF009BAAB8 /* Release */ = {
630 | isa = XCBuildConfiguration;
631 | buildSettings = {
632 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
633 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
634 | CLANG_ENABLE_OBJC_WEAK = YES;
635 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
636 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
637 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
638 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
639 | CODE_SIGN_IDENTITY = "-";
640 | CODE_SIGN_STYLE = Manual;
641 | COMBINE_HIDPI_IMAGES = YES;
642 | DEFINES_MODULE = YES;
643 | DEVELOPMENT_TEAM = "";
644 | DYLIB_COMPATIBILITY_VERSION = 1;
645 | DYLIB_CURRENT_VERSION = 4;
646 | DYLIB_INSTALL_NAME_BASE = "@rpath";
647 | FRAMEWORK_VERSION = A;
648 | GCC_C_LANGUAGE_STANDARD = gnu11;
649 | INFOPLIST_FILE = Solar/Info.plist;
650 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
651 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
652 | MTL_FAST_MATH = YES;
653 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar;
654 | PRODUCT_NAME = Solar;
655 | PROVISIONING_PROFILE_SPECIFIER = "";
656 | SDKROOT = macosx;
657 | SKIP_INSTALL = YES;
658 | };
659 | name = Release;
660 | };
661 | 4CABE506216169DF009BAAB8 /* Debug */ = {
662 | isa = XCBuildConfiguration;
663 | buildSettings = {
664 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
665 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
666 | CLANG_ENABLE_OBJC_WEAK = YES;
667 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
668 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
669 | CODE_SIGN_IDENTITY = "";
670 | CODE_SIGN_STYLE = Automatic;
671 | DEFINES_MODULE = YES;
672 | DYLIB_COMPATIBILITY_VERSION = 1;
673 | DYLIB_CURRENT_VERSION = 4;
674 | DYLIB_INSTALL_NAME_BASE = "@rpath";
675 | GCC_C_LANGUAGE_STANDARD = gnu11;
676 | INFOPLIST_FILE = Solar/Info.plist;
677 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
678 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
679 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
680 | MTL_FAST_MATH = YES;
681 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar;
682 | PRODUCT_NAME = Solar;
683 | SDKROOT = appletvos;
684 | SKIP_INSTALL = YES;
685 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
686 | TARGETED_DEVICE_FAMILY = 3;
687 | };
688 | name = Debug;
689 | };
690 | 4CABE507216169DF009BAAB8 /* Release */ = {
691 | isa = XCBuildConfiguration;
692 | buildSettings = {
693 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
694 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
695 | CLANG_ENABLE_OBJC_WEAK = YES;
696 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
697 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
698 | CODE_SIGN_IDENTITY = "";
699 | CODE_SIGN_STYLE = Automatic;
700 | DEFINES_MODULE = YES;
701 | DYLIB_COMPATIBILITY_VERSION = 1;
702 | DYLIB_CURRENT_VERSION = 4;
703 | DYLIB_INSTALL_NAME_BASE = "@rpath";
704 | GCC_C_LANGUAGE_STANDARD = gnu11;
705 | INFOPLIST_FILE = Solar/Info.plist;
706 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
707 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
708 | MTL_FAST_MATH = YES;
709 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar;
710 | PRODUCT_NAME = Solar;
711 | SDKROOT = appletvos;
712 | SKIP_INSTALL = YES;
713 | TARGETED_DEVICE_FAMILY = 3;
714 | };
715 | name = Release;
716 | };
717 | 97837EB31E4BB1DE000FEF64 /* Debug */ = {
718 | isa = XCBuildConfiguration;
719 | buildSettings = {
720 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
721 | CODE_SIGN_IDENTITY = "Apple Development";
722 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
723 | CODE_SIGN_STYLE = Automatic;
724 | DEVELOPMENT_TEAM = "";
725 | INFOPLIST_FILE = SolarTests/Info.plist;
726 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
727 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests;
728 | PRODUCT_NAME = SolarTests;
729 | PROVISIONING_PROFILE_SPECIFIER = "";
730 | "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "";
731 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
732 | SWIFT_SWIFT3_OBJC_INFERENCE = Default;
733 | };
734 | name = Debug;
735 | };
736 | 97837EB41E4BB1DE000FEF64 /* Release */ = {
737 | isa = XCBuildConfiguration;
738 | buildSettings = {
739 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
740 | CODE_SIGN_IDENTITY = "Apple Development";
741 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
742 | CODE_SIGN_STYLE = Automatic;
743 | DEVELOPMENT_TEAM = "";
744 | INFOPLIST_FILE = SolarTests/Info.plist;
745 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
746 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests;
747 | PRODUCT_NAME = SolarTests;
748 | PROVISIONING_PROFILE_SPECIFIER = "";
749 | "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "";
750 | SWIFT_SWIFT3_OBJC_INFERENCE = Default;
751 | };
752 | name = Release;
753 | };
754 | DA85D68625DCADA8008A2AD4 /* Debug */ = {
755 | isa = XCBuildConfiguration;
756 | buildSettings = {
757 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
758 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
759 | CLANG_ENABLE_OBJC_WEAK = YES;
760 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
761 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
762 | CODE_SIGN_STYLE = Automatic;
763 | COMBINE_HIDPI_IMAGES = YES;
764 | GCC_C_LANGUAGE_STANDARD = gnu11;
765 | INFOPLIST_FILE = SolarTests/Info.plist;
766 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
767 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
768 | MTL_FAST_MATH = YES;
769 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests;
770 | PRODUCT_NAME = SolarTests;
771 | SDKROOT = macosx;
772 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
773 | };
774 | name = Debug;
775 | };
776 | DA85D68725DCADA8008A2AD4 /* Release */ = {
777 | isa = XCBuildConfiguration;
778 | buildSettings = {
779 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
780 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
781 | CLANG_ENABLE_OBJC_WEAK = YES;
782 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
783 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
784 | CODE_SIGN_STYLE = Automatic;
785 | COMBINE_HIDPI_IMAGES = YES;
786 | GCC_C_LANGUAGE_STANDARD = gnu11;
787 | INFOPLIST_FILE = SolarTests/Info.plist;
788 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
789 | MTL_FAST_MATH = YES;
790 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests;
791 | PRODUCT_NAME = SolarTests;
792 | SDKROOT = macosx;
793 | };
794 | name = Release;
795 | };
796 | DA85D6D825DCB095008A2AD4 /* Debug */ = {
797 | isa = XCBuildConfiguration;
798 | buildSettings = {
799 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
800 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
801 | CLANG_ENABLE_OBJC_WEAK = YES;
802 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
803 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
804 | CODE_SIGN_STYLE = Automatic;
805 | GCC_C_LANGUAGE_STANDARD = gnu11;
806 | INFOPLIST_FILE = SolarTests/Info.plist;
807 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
808 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
809 | MTL_FAST_MATH = YES;
810 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests;
811 | PRODUCT_NAME = SolarTests;
812 | SDKROOT = appletvos;
813 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
814 | SWIFT_VERSION = 5.0;
815 | TARGETED_DEVICE_FAMILY = 3;
816 | };
817 | name = Debug;
818 | };
819 | DA85D6D925DCB095008A2AD4 /* Release */ = {
820 | isa = XCBuildConfiguration;
821 | buildSettings = {
822 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
823 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
824 | CLANG_ENABLE_OBJC_WEAK = YES;
825 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
826 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
827 | CODE_SIGN_STYLE = Automatic;
828 | GCC_C_LANGUAGE_STANDARD = gnu11;
829 | INFOPLIST_FILE = SolarTests/Info.plist;
830 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
831 | MTL_FAST_MATH = YES;
832 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests;
833 | PRODUCT_NAME = SolarTests;
834 | SDKROOT = appletvos;
835 | SWIFT_VERSION = 5.0;
836 | TARGETED_DEVICE_FAMILY = 3;
837 | };
838 | name = Release;
839 | };
840 | F7FC5B601D469B2700C4D3EB /* Debug */ = {
841 | isa = XCBuildConfiguration;
842 | buildSettings = {
843 | ALWAYS_SEARCH_USER_PATHS = NO;
844 | CLANG_ANALYZER_NONNULL = YES;
845 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
846 | CLANG_CXX_LIBRARY = "libc++";
847 | CLANG_ENABLE_MODULES = YES;
848 | CLANG_ENABLE_OBJC_ARC = YES;
849 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
850 | CLANG_WARN_BOOL_CONVERSION = YES;
851 | CLANG_WARN_COMMA = YES;
852 | CLANG_WARN_CONSTANT_CONVERSION = YES;
853 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
854 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
855 | CLANG_WARN_EMPTY_BODY = YES;
856 | CLANG_WARN_ENUM_CONVERSION = YES;
857 | CLANG_WARN_INFINITE_RECURSION = YES;
858 | CLANG_WARN_INT_CONVERSION = YES;
859 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
860 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
861 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
862 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
863 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
864 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
865 | CLANG_WARN_STRICT_PROTOTYPES = YES;
866 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
867 | CLANG_WARN_UNREACHABLE_CODE = YES;
868 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
869 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
870 | COPY_PHASE_STRIP = NO;
871 | CURRENT_PROJECT_VERSION = 4;
872 | DEBUG_INFORMATION_FORMAT = dwarf;
873 | ENABLE_HARDENED_RUNTIME = NO;
874 | ENABLE_STRICT_OBJC_MSGSEND = YES;
875 | ENABLE_TESTABILITY = YES;
876 | GCC_C_LANGUAGE_STANDARD = gnu99;
877 | GCC_DYNAMIC_NO_PIC = NO;
878 | GCC_NO_COMMON_BLOCKS = YES;
879 | GCC_OPTIMIZATION_LEVEL = 0;
880 | GCC_PREPROCESSOR_DEFINITIONS = (
881 | "DEBUG=1",
882 | "$(inherited)",
883 | );
884 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
885 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
886 | GCC_WARN_UNDECLARED_SELECTOR = YES;
887 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
888 | GCC_WARN_UNUSED_FUNCTION = YES;
889 | GCC_WARN_UNUSED_VARIABLE = YES;
890 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
891 | MACOSX_DEPLOYMENT_TARGET = 10.9;
892 | MTL_ENABLE_DEBUG_INFO = YES;
893 | ONLY_ACTIVE_ARCH = YES;
894 | SDKROOT = iphoneos;
895 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
896 | SWIFT_VERSION = 5.0;
897 | TARGETED_DEVICE_FAMILY = "1,2";
898 | TVOS_DEPLOYMENT_TARGET = 9.0;
899 | VERSIONING_SYSTEM = "apple-generic";
900 | VERSION_INFO_PREFIX = "";
901 | WATCHOS_DEPLOYMENT_TARGET = 3.0;
902 | };
903 | name = Debug;
904 | };
905 | F7FC5B611D469B2700C4D3EB /* Release */ = {
906 | isa = XCBuildConfiguration;
907 | buildSettings = {
908 | ALWAYS_SEARCH_USER_PATHS = NO;
909 | CLANG_ANALYZER_NONNULL = YES;
910 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
911 | CLANG_CXX_LIBRARY = "libc++";
912 | CLANG_ENABLE_MODULES = YES;
913 | CLANG_ENABLE_OBJC_ARC = YES;
914 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
915 | CLANG_WARN_BOOL_CONVERSION = YES;
916 | CLANG_WARN_COMMA = YES;
917 | CLANG_WARN_CONSTANT_CONVERSION = YES;
918 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
919 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
920 | CLANG_WARN_EMPTY_BODY = YES;
921 | CLANG_WARN_ENUM_CONVERSION = YES;
922 | CLANG_WARN_INFINITE_RECURSION = YES;
923 | CLANG_WARN_INT_CONVERSION = YES;
924 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
925 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
926 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
927 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
928 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
929 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
930 | CLANG_WARN_STRICT_PROTOTYPES = YES;
931 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
932 | CLANG_WARN_UNREACHABLE_CODE = YES;
933 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
934 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
935 | COPY_PHASE_STRIP = NO;
936 | CURRENT_PROJECT_VERSION = 4;
937 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
938 | ENABLE_HARDENED_RUNTIME = NO;
939 | ENABLE_NS_ASSERTIONS = NO;
940 | ENABLE_STRICT_OBJC_MSGSEND = YES;
941 | GCC_C_LANGUAGE_STANDARD = gnu99;
942 | GCC_NO_COMMON_BLOCKS = YES;
943 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
944 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
945 | GCC_WARN_UNDECLARED_SELECTOR = YES;
946 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
947 | GCC_WARN_UNUSED_FUNCTION = YES;
948 | GCC_WARN_UNUSED_VARIABLE = YES;
949 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
950 | MACOSX_DEPLOYMENT_TARGET = 10.9;
951 | MTL_ENABLE_DEBUG_INFO = NO;
952 | SDKROOT = iphoneos;
953 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
954 | SWIFT_VERSION = 5.0;
955 | TARGETED_DEVICE_FAMILY = "1,2";
956 | TVOS_DEPLOYMENT_TARGET = 9.0;
957 | VALIDATE_PRODUCT = YES;
958 | VERSIONING_SYSTEM = "apple-generic";
959 | VERSION_INFO_PREFIX = "";
960 | WATCHOS_DEPLOYMENT_TARGET = 3.0;
961 | };
962 | name = Release;
963 | };
964 | F7FC5B631D469B2700C4D3EB /* Debug */ = {
965 | isa = XCBuildConfiguration;
966 | buildSettings = {
967 | APPLICATION_EXTENSION_API_ONLY = YES;
968 | CLANG_ENABLE_MODULES = YES;
969 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
970 | DEFINES_MODULE = YES;
971 | DYLIB_COMPATIBILITY_VERSION = 1;
972 | DYLIB_CURRENT_VERSION = 4;
973 | DYLIB_INSTALL_NAME_BASE = "@rpath";
974 | INFOPLIST_FILE = Solar/Info.plist;
975 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
976 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
977 | MARKETING_VERSION = 2.2.0;
978 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar;
979 | PRODUCT_NAME = Solar;
980 | SDKROOT = iphoneos;
981 | SKIP_INSTALL = YES;
982 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
983 | SWIFT_SWIFT3_OBJC_INFERENCE = Default;
984 | };
985 | name = Debug;
986 | };
987 | F7FC5B641D469B2700C4D3EB /* Release */ = {
988 | isa = XCBuildConfiguration;
989 | buildSettings = {
990 | APPLICATION_EXTENSION_API_ONLY = YES;
991 | CLANG_ENABLE_MODULES = YES;
992 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
993 | DEFINES_MODULE = YES;
994 | DYLIB_COMPATIBILITY_VERSION = 1;
995 | DYLIB_CURRENT_VERSION = 4;
996 | DYLIB_INSTALL_NAME_BASE = "@rpath";
997 | INFOPLIST_FILE = Solar/Info.plist;
998 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
999 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1000 | MARKETING_VERSION = 2.2.0;
1001 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar;
1002 | PRODUCT_NAME = Solar;
1003 | SDKROOT = iphoneos;
1004 | SKIP_INSTALL = YES;
1005 | SWIFT_SWIFT3_OBJC_INFERENCE = Default;
1006 | };
1007 | name = Release;
1008 | };
1009 | /* End XCBuildConfiguration section */
1010 |
1011 | /* Begin XCConfigurationList section */
1012 | 1410E9C51EF12B5A001829A5 /* Build configuration list for PBXNativeTarget "Solar watchOS" */ = {
1013 | isa = XCConfigurationList;
1014 | buildConfigurations = (
1015 | 1410E9C61EF12B5A001829A5 /* Debug */,
1016 | 1410E9C71EF12B5A001829A5 /* Release */,
1017 | );
1018 | defaultConfigurationIsVisible = 0;
1019 | defaultConfigurationName = Release;
1020 | };
1021 | 4CABE4E7216160CF009BAAB8 /* Build configuration list for PBXNativeTarget "Solar macOS" */ = {
1022 | isa = XCConfigurationList;
1023 | buildConfigurations = (
1024 | 4CABE4E8216160CF009BAAB8 /* Debug */,
1025 | 4CABE4E9216160CF009BAAB8 /* Release */,
1026 | );
1027 | defaultConfigurationIsVisible = 0;
1028 | defaultConfigurationName = Release;
1029 | };
1030 | 4CABE505216169DF009BAAB8 /* Build configuration list for PBXNativeTarget "Solar tvOS" */ = {
1031 | isa = XCConfigurationList;
1032 | buildConfigurations = (
1033 | 4CABE506216169DF009BAAB8 /* Debug */,
1034 | 4CABE507216169DF009BAAB8 /* Release */,
1035 | );
1036 | defaultConfigurationIsVisible = 0;
1037 | defaultConfigurationName = Release;
1038 | };
1039 | 97837EB51E4BB1DE000FEF64 /* Build configuration list for PBXNativeTarget "SolarTests iOS" */ = {
1040 | isa = XCConfigurationList;
1041 | buildConfigurations = (
1042 | 97837EB31E4BB1DE000FEF64 /* Debug */,
1043 | 97837EB41E4BB1DE000FEF64 /* Release */,
1044 | );
1045 | defaultConfigurationIsVisible = 0;
1046 | defaultConfigurationName = Release;
1047 | };
1048 | DA85D68525DCADA8008A2AD4 /* Build configuration list for PBXNativeTarget "SolarTests macOS" */ = {
1049 | isa = XCConfigurationList;
1050 | buildConfigurations = (
1051 | DA85D68625DCADA8008A2AD4 /* Debug */,
1052 | DA85D68725DCADA8008A2AD4 /* Release */,
1053 | );
1054 | defaultConfigurationIsVisible = 0;
1055 | defaultConfigurationName = Release;
1056 | };
1057 | DA85D6DA25DCB095008A2AD4 /* Build configuration list for PBXNativeTarget "SolarTests tvOS" */ = {
1058 | isa = XCConfigurationList;
1059 | buildConfigurations = (
1060 | DA85D6D825DCB095008A2AD4 /* Debug */,
1061 | DA85D6D925DCB095008A2AD4 /* Release */,
1062 | );
1063 | defaultConfigurationIsVisible = 0;
1064 | defaultConfigurationName = Release;
1065 | };
1066 | F7FC5B541D469B2700C4D3EB /* Build configuration list for PBXProject "Solar" */ = {
1067 | isa = XCConfigurationList;
1068 | buildConfigurations = (
1069 | F7FC5B601D469B2700C4D3EB /* Debug */,
1070 | F7FC5B611D469B2700C4D3EB /* Release */,
1071 | );
1072 | defaultConfigurationIsVisible = 0;
1073 | defaultConfigurationName = Release;
1074 | };
1075 | F7FC5B621D469B2700C4D3EB /* Build configuration list for PBXNativeTarget "Solar iOS" */ = {
1076 | isa = XCConfigurationList;
1077 | buildConfigurations = (
1078 | F7FC5B631D469B2700C4D3EB /* Debug */,
1079 | F7FC5B641D469B2700C4D3EB /* Release */,
1080 | );
1081 | defaultConfigurationIsVisible = 0;
1082 | defaultConfigurationName = Release;
1083 | };
1084 | /* End XCConfigurationList section */
1085 | };
1086 | rootObject = F7FC5B511D469B2700C4D3EB /* Project object */;
1087 | }
1088 |
--------------------------------------------------------------------------------
/SolarTests/CorrectResults.json:
--------------------------------------------------------------------------------
1 | [{
2 | "city": "Abu Dhabi",
3 | "latitude": 24.46667,
4 | "longitude": 54.36667,
5 | "sunrise": "2017-02-09T02:59:40+00:00",
6 | "sunset": "2017-02-09T14:13:47+00:00"
7 | }, {
8 | "city": "Abuja",
9 | "latitude": 9.05735,
10 | "longitude": 7.48976,
11 | "sunrise": "2017-02-09T05:50:01+00:00",
12 | "sunset": "2017-02-09T17:38:27+00:00"
13 | }, {
14 | "city": "Accra",
15 | "latitude": 5.55602,
16 | "longitude": -0.1969,
17 | "sunrise": "2017-02-09T06:17:09+00:00",
18 | "sunset": "2017-02-09T18:12:49+00:00"
19 | }, {
20 | "city": "Adamstown",
21 | "latitude": -25.06597,
22 | "longitude": -130.10147,
23 | "sunrise": "2017-02-09T14:23:26+00:00",
24 | "sunset": "2017-02-10T03:25:47+00:00"
25 | }, {
26 | "city": "Addis Ababa",
27 | "latitude": 9.02497,
28 | "longitude": 38.74689,
29 | "sunrise": "2017-02-09T03:44:59+00:00",
30 | "sunset": "2017-02-09T15:33:26+00:00"
31 | }, {
32 | "city": "Algiers",
33 | "latitude": 36.7525,
34 | "longitude": 3.04197,
35 | "sunrise": "2017-02-09T06:41:38+00:00",
36 | "sunset": "2017-02-09T17:22:25+00:00"
37 | }, {
38 | "city": "Alofi",
39 | "latitude": -19.05952,
40 | "longitude": -169.91867,
41 | "sunrise": "2017-02-09T17:10:04+00:00",
42 | "sunset": "2017-02-10T05:57:41+00:00"
43 | }, {
44 | "city": "Amman",
45 | "latitude": 31.95522,
46 | "longitude": 35.94503,
47 | "sunrise": "2017-02-09T04:23:02+00:00",
48 | "sunset": "2017-02-09T15:17:47+00:00"
49 | }, {
50 | "city": "Amsterdam",
51 | "latitude": 52.37403,
52 | "longitude": 4.88969,
53 | "sunrise": "2017-02-09T07:06:08+00:00",
54 | "sunset": "2017-02-09T16:43:09+00:00"
55 | }, {
56 | "city": "Andorra la Vella",
57 | "latitude": 42.50779,
58 | "longitude": 1.52109,
59 | "sunrise": "2017-02-09T06:57:28+00:00",
60 | "sunset": "2017-02-09T17:18:45+00:00"
61 | }, {
62 | "city": "Ankara",
63 | "latitude": 39.91987,
64 | "longitude": 32.85427,
65 | "sunrise": "2017-02-09T04:47:39+00:00",
66 | "sunset": "2017-02-09T15:17:54+00:00"
67 | }, {
68 | "city": "Antananarivo",
69 | "latitude": -18.91433,
70 | "longitude": 47.53098,
71 | "sunrise": "2017-02-09T02:40:08+00:00",
72 | "sunset": "2017-02-09T15:28:00+00:00"
73 | }, {
74 | "city": "Apia",
75 | "latitude": -13.83333,
76 | "longitude": -171.76666,
77 | "sunrise": "2017-02-09T17:23:21+00:00",
78 | "sunset": "2017-02-10T05:59:12+00:00"
79 | }, {
80 | "city": "Ashgabat",
81 | "latitude": 37.95,
82 | "longitude": 58.38333,
83 | "sunrise": "2017-02-09T03:02:20+00:00",
84 | "sunset": "2017-02-09T13:38:59+00:00"
85 | }, {
86 | "city": "Asmara",
87 | "latitude": 15.33333,
88 | "longitude": 38.93333,
89 | "sunrise": "2017-02-09T03:50:56+00:00",
90 | "sunset": "2017-02-09T15:25:59+00:00"
91 | }, {
92 | "city": "Astana",
93 | "latitude": 51.1801,
94 | "longitude": 71.44598,
95 | "sunrise": "2017-02-09T02:37:03+00:00",
96 | "sunset": "2017-02-09T12:19:47+00:00"
97 | }, {
98 | "city": "Asunci??n",
99 | "latitude": -25.30066,
100 | "longitude": -57.63591,
101 | "sunrise": "2017-02-09T09:33:08+00:00",
102 | "sunset": "2017-02-09T22:36:22+00:00"
103 | }, {
104 | "city": "Athens",
105 | "latitude": 37.97945,
106 | "longitude": 23.71622,
107 | "sunrise": "2017-02-09T05:20:57+00:00",
108 | "sunset": "2017-02-09T15:57:43+00:00"
109 | }, {
110 | "city": "Avarua",
111 | "latitude": -21.20778,
112 | "longitude": -159.775,
113 | "sunrise": "2017-02-09T16:26:57+00:00",
114 | "sunset": "2017-02-10T05:19:39+00:00"
115 | }, {
116 | "city": "Baghdad",
117 | "latitude": 33.34058,
118 | "longitude": 44.40088,
119 | "sunrise": "2017-02-09T03:51:12+00:00",
120 | "sunset": "2017-02-09T14:41:59+00:00"
121 | }, {
122 | "city": "Baku",
123 | "latitude": 40.37767,
124 | "longitude": 49.89201,
125 | "sunrise": "2017-02-09T03:40:20+00:00",
126 | "sunset": "2017-02-09T14:08:55+00:00"
127 | }, {
128 | "city": "Bamako",
129 | "latitude": 12.65,
130 | "longitude": -8,
131 | "sunrise": "2017-02-09T06:55:45+00:00",
132 | "sunset": "2017-02-09T18:36:39+00:00"
133 | }, {
134 | "city": "Bandar Seri Begawan",
135 | "latitude": 4.94029,
136 | "longitude": 114.94806,
137 | "sunrise": "2017-02-08T22:35:58+00:00",
138 | "sunset": "2017-02-09T10:32:50+00:00"
139 | }, {
140 | "city": "Bangkok",
141 | "latitude": 13.75,
142 | "longitude": 100.51667,
143 | "sunrise": "2017-02-08T23:42:57+00:00",
144 | "sunset": "2017-02-09T11:21:18+00:00"
145 | }, {
146 | "city": "Bangui",
147 | "latitude": 4.36122,
148 | "longitude": 18.55496,
149 | "sunrise": "2017-02-09T05:00:55+00:00",
150 | "sunset": "2017-02-09T16:59:02+00:00"
151 | }, {
152 | "city": "Banjul",
153 | "latitude": 13.45274,
154 | "longitude": -16.57803,
155 | "sunrise": "2017-02-09T07:30:54+00:00",
156 | "sunset": "2017-02-09T19:10:07+00:00"
157 | }, {
158 | "city": "Basseterre",
159 | "latitude": 17.29484,
160 | "longitude": -62.7261,
161 | "sunrise": "2017-02-09T10:39:37+00:00",
162 | "sunset": "2017-02-09T22:10:36+00:00"
163 | }, {
164 | "city": "Basse-Terre",
165 | "latitude": 15.99854,
166 | "longitude": -61.72548,
167 | "sunrise": "2017-02-09T10:34:11+00:00",
168 | "sunset": "2017-02-09T22:08:01+00:00"
169 | }, {
170 | "city": "Beijing",
171 | "latitude": 39.9075,
172 | "longitude": 116.39723,
173 | "sunrise": "2017-02-08T23:13:43+00:00",
174 | "sunset": "2017-02-09T09:43:29+00:00"
175 | }, {
176 | "city": "Beirut",
177 | "latitude": 33.88894,
178 | "longitude": 35.49442,
179 | "sunrise": "2017-02-09T04:27:36+00:00",
180 | "sunset": "2017-02-09T15:16:50+00:00"
181 | }, {
182 | "city": "Belgrade",
183 | "latitude": 44.80401,
184 | "longitude": 20.46513,
185 | "sunrise": "2017-02-09T05:46:11+00:00",
186 | "sunset": "2017-02-09T15:58:29+00:00"
187 | }, {
188 | "city": "Belmopan",
189 | "latitude": 17.25,
190 | "longitude": -88.76667,
191 | "sunrise": "2017-02-09T12:23:42+00:00",
192 | "sunset": "2017-02-09T23:54:50+00:00"
193 | }, {
194 | "city": "Berlin",
195 | "latitude": 52.52437,
196 | "longitude": 13.41053,
197 | "sunrise": "2017-02-09T06:32:30+00:00",
198 | "sunset": "2017-02-09T16:08:36+00:00"
199 | }, {
200 | "city": "Bern",
201 | "latitude": 46.94809,
202 | "longitude": 7.44744,
203 | "sunrise": "2017-02-09T06:42:41+00:00",
204 | "sunset": "2017-02-09T16:46:08+00:00"
205 | }, {
206 | "city": "Bishkek",
207 | "latitude": 42.87306,
208 | "longitude": 74.60028,
209 | "sunrise": "2017-02-09T02:06:06+00:00",
210 | "sunset": "2017-02-09T12:25:29+00:00"
211 | }, {
212 | "city": "Bissau",
213 | "latitude": 11.85,
214 | "longitude": -15.58333,
215 | "sunrise": "2017-02-09T07:25:13+00:00",
216 | "sunset": "2017-02-09T19:07:50+00:00"
217 | }, {
218 | "city": "Bogot?�",
219 | "latitude": 4.60971,
220 | "longitude": -74.08175,
221 | "sunrise": "2017-02-09T11:11:42+00:00",
222 | "sunset": "2017-02-09T23:09:21+00:00"
223 | }, {
224 | "city": "Bras??lia",
225 | "latitude": -15.77972,
226 | "longitude": -47.92972,
227 | "sunrise": "2017-02-09T09:05:42+00:00",
228 | "sunset": "2017-02-09T21:46:08+00:00"
229 | }, {
230 | "city": "Bratislava",
231 | "latitude": 48.14816,
232 | "longitude": 17.10674,
233 | "sunrise": "2017-02-09T06:06:45+00:00",
234 | "sunset": "2017-02-09T16:04:47+00:00"
235 | }, {
236 | "city": "Brazzaville",
237 | "latitude": -4.2669,
238 | "longitude": 15.28327,
239 | "sunrise": "2017-02-09T05:05:09+00:00",
240 | "sunset": "2017-02-09T17:20:59+00:00"
241 | }, {
242 | "city": "Bridgetown",
243 | "latitude": 13.1,
244 | "longitude": -59.61667,
245 | "sunrise": "2017-02-09T10:22:39+00:00",
246 | "sunset": "2017-02-09T22:02:41+00:00"
247 | }, {
248 | "city": "Brussels",
249 | "latitude": 50.85045,
250 | "longitude": 4.34878,
251 | "sunrise": "2017-02-09T07:04:15+00:00",
252 | "sunset": "2017-02-09T16:49:21+00:00"
253 | }, {
254 | "city": "Bucure�?ti",
255 | "latitude": 44.43225,
256 | "longitude": 26.10626,
257 | "sunrise": "2017-02-09T05:22:54+00:00",
258 | "sunset": "2017-02-09T15:36:38+00:00"
259 | }, {
260 | "city": "Budapest",
261 | "latitude": 47.49801,
262 | "longitude": 19.03991,
263 | "sunrise": "2017-02-09T05:57:34+00:00",
264 | "sunset": "2017-02-09T15:58:30+00:00"
265 | }, {
266 | "city": "Buenos Aires",
267 | "latitude": -34.61315,
268 | "longitude": -58.37723,
269 | "sunrise": "2017-02-09T09:22:49+00:00",
270 | "sunset": "2017-02-09T22:52:36+00:00"
271 | }, {
272 | "city": "Bujumbura",
273 | "latitude": -3.37611,
274 | "longitude": 29.36,
275 | "sunrise": "2017-02-09T04:09:45+00:00",
276 | "sunset": "2017-02-09T16:23:45+00:00"
277 | }, {
278 | "city": "Cairo",
279 | "latitude": 30.06263,
280 | "longitude": 31.24967,
281 | "sunrise": "2017-02-09T04:39:14+00:00",
282 | "sunset": "2017-02-09T15:39:10+00:00"
283 | }, {
284 | "city": "Canberra",
285 | "latitude": -35.28346,
286 | "longitude": 149.12807,
287 | "sunrise": "2017-02-08T19:31:08+00:00",
288 | "sunset": "2017-02-09T09:04:13+00:00"
289 | }, {
290 | "city": "Caracas",
291 | "latitude": 10.5,
292 | "longitude": -66.91667,
293 | "sunrise": "2017-02-09T10:49:06+00:00",
294 | "sunset": "2017-02-09T22:34:37+00:00"
295 | }, {
296 | "city": "Castries",
297 | "latitude": 13.9957,
298 | "longitude": -61.00614,
299 | "sunrise": "2017-02-09T10:29:09+00:00",
300 | "sunset": "2017-02-09T22:07:17+00:00"
301 | }, {
302 | "city": "Cayenne",
303 | "latitude": 4.93333,
304 | "longitude": -52.33333,
305 | "sunrise": "2017-02-09T09:45:02+00:00",
306 | "sunset": "2017-02-09T21:42:01+00:00"
307 | }, {
308 | "city": "Charlotte Amalie",
309 | "latitude": 18.3419,
310 | "longitude": -64.9307,
311 | "sunrise": "2017-02-09T10:49:35+00:00",
312 | "sunset": "2017-02-09T22:18:16+00:00"
313 | }, {
314 | "city": "Chi�?in��u",
315 | "latitude": 47.00556,
316 | "longitude": 28.8575,
317 | "sunrise": "2017-02-09T05:17:15+00:00",
318 | "sunset": "2017-02-09T15:20:16+00:00"
319 | }, {
320 | "city": "Cockburn Town",
321 | "latitude": 21.46122,
322 | "longitude": -71.14188,
323 | "sunrise": "2017-02-09T11:17:57+00:00",
324 | "sunset": "2017-02-09T22:39:35+00:00"
325 | }, {
326 | "city": "Colombo",
327 | "latitude": 6.93194,
328 | "longitude": 79.84778,
329 | "sunrise": "2017-02-09T00:58:25+00:00",
330 | "sunset": "2017-02-09T12:51:11+00:00"
331 | }, {
332 | "city": "Conakry",
333 | "latitude": 9.53795,
334 | "longitude": -13.67729,
335 | "sunrise": "2017-02-09T07:15:11+00:00",
336 | "sunset": "2017-02-09T19:02:38+00:00"
337 | }, {
338 | "city": "Copenhagen",
339 | "latitude": 55.67594,
340 | "longitude": 12.56553,
341 | "sunrise": "2017-02-09T06:45:21+00:00",
342 | "sunset": "2017-02-09T16:02:31+00:00"
343 | }, {
344 | "city": "Dakar",
345 | "latitude": 14.6937,
346 | "longitude": -17.44406,
347 | "sunrise": "2017-02-09T07:35:42+00:00",
348 | "sunset": "2017-02-09T19:12:15+00:00"
349 | }, {
350 | "city": "Damascus",
351 | "latitude": 33.5102,
352 | "longitude": 36.29128,
353 | "sunrise": "2017-02-09T04:23:52+00:00",
354 | "sunset": "2017-02-09T15:14:12+00:00"
355 | }, {
356 | "city": "Dhaka",
357 | "latitude": 23.7104,
358 | "longitude": 90.40744,
359 | "sunrise": "2017-02-09T00:34:39+00:00",
360 | "sunset": "2017-02-09T11:50:28+00:00"
361 | }, {
362 | "city": "Dili",
363 | "latitude": -8.55861,
364 | "longitude": 125.57361,
365 | "sunrise": "2017-02-08T21:39:25+00:00",
366 | "sunset": "2017-02-09T10:04:22+00:00"
367 | }, {
368 | "city": "Djibouti",
369 | "latitude": 11.58767,
370 | "longitude": 43.14468,
371 | "sunrise": "2017-02-09T03:30:05+00:00",
372 | "sunset": "2017-02-09T15:13:09+00:00"
373 | }, {
374 | "city": "Dodoma",
375 | "latitude": -6.17486,
376 | "longitude": 35.73792,
377 | "sunrise": "2017-02-09T03:41:20+00:00",
378 | "sunset": "2017-02-09T16:01:09+00:00"
379 | }, {
380 | "city": "Doha",
381 | "latitude": 25.27932,
382 | "longitude": 51.52245,
383 | "sunrise": "2017-02-09T03:12:02+00:00",
384 | "sunset": "2017-02-09T14:24:10+00:00"
385 | }, {
386 | "city": "Douglas",
387 | "latitude": 54.15,
388 | "longitude": -4.48333,
389 | "sunrise": "2017-02-09T07:48:40+00:00",
390 | "sunset": "2017-02-09T17:15:35+00:00"
391 | }, {
392 | "city": "Dublin",
393 | "latitude": 53.34399,
394 | "longitude": -6.26719,
395 | "sunrise": "2017-02-09T07:53:26+00:00",
396 | "sunset": "2017-02-09T17:25:06+00:00"
397 | }, {
398 | "city": "Dushanbe",
399 | "latitude": 38.53575,
400 | "longitude": 68.77905,
401 | "sunrise": "2017-02-09T02:21:44+00:00",
402 | "sunset": "2017-02-09T12:56:25+00:00"
403 | }, {
404 | "city": "Flying Fish Cove",
405 | "latitude": -10.42172,
406 | "longitude": 105.67912,
407 | "sunrise": "2017-02-08T22:57:01+00:00",
408 | "sunset": "2017-02-09T11:25:56+00:00"
409 | }, {
410 | "city": "Fort-de-France",
411 | "latitude": 14.60892,
412 | "longitude": -61.07334,
413 | "sunrise": "2017-02-09T10:30:05+00:00",
414 | "sunset": "2017-02-09T22:06:54+00:00"
415 | }, {
416 | "city": "Freetown",
417 | "latitude": 8.484,
418 | "longitude": -13.22994,
419 | "sunrise": "2017-02-09T07:12:18+00:00",
420 | "sunset": "2017-02-09T19:01:56+00:00"
421 | }, {
422 | "city": "Funafuti",
423 | "latitude": -8.52425,
424 | "longitude": 179.19417,
425 | "sunrise": "2017-02-08T18:04:57+00:00",
426 | "sunset": "2017-02-09T06:29:53+00:00"
427 | }, {
428 | "city": "Gaborone",
429 | "latitude": -24.65451,
430 | "longitude": 25.90859,
431 | "sunrise": "2017-02-09T03:59:37+00:00",
432 | "sunset": "2017-02-09T17:01:30+00:00"
433 | }, {
434 | "city": "George Town",
435 | "latitude": 19.28692,
436 | "longitude": -81.36706,
437 | "sunrise": "2017-02-09T11:56:22+00:00",
438 | "sunset": "2017-02-09T23:22:58+00:00"
439 | }, {
440 | "city": "Georgetown",
441 | "latitude": 6.80448,
442 | "longitude": -58.15527,
443 | "sunrise": "2017-02-09T10:10:15+00:00",
444 | "sunset": "2017-02-09T22:03:24+00:00"
445 | }, {
446 | "city": "Gibraltar",
447 | "latitude": 36.14474,
448 | "longitude": -5.35257,
449 | "sunrise": "2017-02-09T07:14:15+00:00",
450 | "sunset": "2017-02-09T17:56:58+00:00"
451 | }, {
452 | "city": "Grytviken",
453 | "latitude": -54.28111,
454 | "longitude": -36.5092,
455 | "sunrise": "2017-02-09T07:10:34+00:00",
456 | "sunset": "2017-02-09T22:09:54+00:00"
457 | }, {
458 | "city": "Guatemala City",
459 | "latitude": 14.64072,
460 | "longitude": -90.51327,
461 | "sunrise": "2017-02-09T12:27:51+00:00",
462 | "sunset": "2017-02-10T00:04:39+00:00"
463 | }, {
464 | "city": "Gustavia",
465 | "latitude": 17.89618,
466 | "longitude": -62.84978,
467 | "sunrise": "2017-02-09T10:40:46+00:00",
468 | "sunset": "2017-02-09T22:10:26+00:00"
469 | }, {
470 | "city": "H?� N��?i",
471 | "latitude": 21.0245,
472 | "longitude": 105.84117,
473 | "sunrise": "2017-02-08T23:29:46+00:00",
474 | "sunset": "2017-02-09T10:51:53+00:00"
475 | }, {
476 | "city": "Hag?�t?�a",
477 | "latitude": 13.47417,
478 | "longitude": 144.74778,
479 | "sunrise": "2017-02-08T20:45:46+00:00",
480 | "sunset": "2017-02-09T08:24:38+00:00"
481 | }, {
482 | "city": "Hamilton",
483 | "latitude": 32.29149,
484 | "longitude": -64.77797,
485 | "sunrise": "2017-02-09T11:06:10+00:00",
486 | "sunset": "2017-02-09T22:00:27+00:00"
487 | }, {
488 | "city": "Harare",
489 | "latitude": -17.82935,
490 | "longitude": 31.05389,
491 | "sunrise": "2017-02-09T03:47:20+00:00",
492 | "sunset": "2017-02-09T16:32:37+00:00"
493 | }, {
494 | "city": "Havana",
495 | "latitude": 23.13302,
496 | "longitude": -82.38304,
497 | "sunrise": "2017-02-09T12:04:51+00:00",
498 | "sunset": "2017-02-09T23:22:37+00:00"
499 | }, {
500 | "city": "Helsinki",
501 | "latitude": 60.16952,
502 | "longitude": 24.93545,
503 | "sunrise": "2017-02-09T06:12:49+00:00",
504 | "sunset": "2017-02-09T14:56:06+00:00"
505 | }, {
506 | "city": "Hong Kong",
507 | "latitude": 22.28552,
508 | "longitude": 114.15769,
509 | "sunrise": "2017-02-08T22:58:00+00:00",
510 | "sunset": "2017-02-09T10:17:08+00:00"
511 | }, {
512 | "city": "Honiara",
513 | "latitude": -9.43333,
514 | "longitude": 159.95,
515 | "sunrise": "2017-02-08T19:20:58+00:00",
516 | "sunset": "2017-02-09T07:47:49+00:00"
517 | }, {
518 | "city": "Isl��m��b��d",
519 | "latitude": 33.72148,
520 | "longitude": 73.04329,
521 | "sunrise": "2017-02-09T01:57:15+00:00",
522 | "sunset": "2017-02-09T12:46:47+00:00"
523 | }, {
524 | "city": "Jakarta",
525 | "latitude": -6.21462,
526 | "longitude": 106.84513,
527 | "sunrise": "2017-02-08T22:56:50+00:00",
528 | "sunset": "2017-02-09T11:16:47+00:00"
529 | }, {
530 | "city": "Jamestown",
531 | "latitude": -15.93872,
532 | "longitude": -5.71675,
533 | "sunrise": "2017-02-09T06:16:38+00:00",
534 | "sunset": "2017-02-09T18:57:30+00:00"
535 | }, {
536 | "city": "Kabul",
537 | "latitude": 34.52813,
538 | "longitude": 69.17233,
539 | "sunrise": "2017-02-09T02:13:55+00:00",
540 | "sunset": "2017-02-09T13:01:06+00:00"
541 | }, {
542 | "city": "Kampala",
543 | "latitude": 0.31628,
544 | "longitude": 32.58219,
545 | "sunrise": "2017-02-09T04:00:40+00:00",
546 | "sunset": "2017-02-09T16:07:04+00:00"
547 | }, {
548 | "city": "Kathmandu",
549 | "latitude": 27.70169,
550 | "longitude": 85.3206,
551 | "sunrise": "2017-02-09T00:59:57+00:00",
552 | "sunset": "2017-02-09T12:05:52+00:00"
553 | }, {
554 | "city": "Khartoum",
555 | "latitude": 15.54665,
556 | "longitude": 32.53361,
557 | "sunrise": "2017-02-09T04:16:46+00:00",
558 | "sunset": "2017-02-09T15:51:22+00:00"
559 | }, {
560 | "city": "Kiev",
561 | "latitude": 50.45466,
562 | "longitude": 30.5238,
563 | "sunrise": "2017-02-09T05:18:40+00:00",
564 | "sunset": "2017-02-09T15:05:32+00:00"
565 | }, {
566 | "city": "Kigali",
567 | "latitude": -1.94995,
568 | "longitude": 30.05885,
569 | "sunrise": "2017-02-09T04:08:26+00:00",
570 | "sunset": "2017-02-09T16:19:29+00:00"
571 | }, {
572 | "city": "Kingston",
573 | "latitude": -29.05459,
574 | "longitude": 167.96628,
575 | "sunrise": "2017-02-08T18:25:11+00:00",
576 | "sunset": "2017-02-09T07:39:28+00:00"
577 | }, {
578 | "city": "Kingston",
579 | "latitude": 17.99702,
580 | "longitude": -76.79358,
581 | "sunrise": "2017-02-09T11:36:38+00:00",
582 | "sunset": "2017-02-09T23:06:07+00:00"
583 | }, {
584 | "city": "Kingstown",
585 | "latitude": 13.15872,
586 | "longitude": -61.22475,
587 | "sunrise": "2017-02-09T10:29:08+00:00",
588 | "sunset": "2017-02-09T22:09:03+00:00"
589 | }, {
590 | "city": "Kinshasa",
591 | "latitude": -4.32459,
592 | "longitude": 15.32146,
593 | "sunrise": "2017-02-09T05:04:56+00:00",
594 | "sunset": "2017-02-09T17:20:53+00:00"
595 | }, {
596 | "city": "Kuala Lumpur",
597 | "latitude": 3.1412,
598 | "longitude": 101.68653,
599 | "sunrise": "2017-02-08T23:27:09+00:00",
600 | "sunset": "2017-02-09T11:27:44+00:00"
601 | }, {
602 | "city": "Kuwait",
603 | "latitude": 29.36972,
604 | "longitude": 47.97833,
605 | "sunrise": "2017-02-09T03:31:26+00:00",
606 | "sunset": "2017-02-09T14:33:08+00:00"
607 | }, {
608 | "city": "La Paz",
609 | "latitude": -16.5,
610 | "longitude": -68.15,
611 | "sunrise": "2017-02-09T10:25:48+00:00",
612 | "sunset": "2017-02-09T23:07:48+00:00"
613 | }, {
614 | "city": "Libreville",
615 | "latitude": 0.38333,
616 | "longitude": 9.45,
617 | "sunrise": "2017-02-09T05:33:16+00:00",
618 | "sunset": "2017-02-09T17:39:32+00:00"
619 | }, {
620 | "city": "Lilongwe",
621 | "latitude": -13.98333,
622 | "longitude": 33.78333,
623 | "sunrise": "2017-02-09T03:40:46+00:00",
624 | "sunset": "2017-02-09T16:17:21+00:00"
625 | }, {
626 | "city": "Lima",
627 | "latitude": -12.04318,
628 | "longitude": -77.02824,
629 | "sunrise": "2017-02-09T11:06:15+00:00",
630 | "sunset": "2017-02-09T23:38:23+00:00"
631 | }, {
632 | "city": "Lisbon",
633 | "latitude": 38.71667,
634 | "longitude": -9.13333,
635 | "sunrise": "2017-02-09T07:33:27+00:00",
636 | "sunset": "2017-02-09T18:08:01+00:00"
637 | }, {
638 | "city": "Ljubljana",
639 | "latitude": 46.05108,
640 | "longitude": 14.50513,
641 | "sunrise": "2017-02-09T06:12:34+00:00",
642 | "sunset": "2017-02-09T16:19:47+00:00"
643 | }, {
644 | "city": "Lom??",
645 | "latitude": 6.13748,
646 | "longitude": 1.21227,
647 | "sunrise": "2017-02-09T06:12:07+00:00",
648 | "sunset": "2017-02-09T18:06:35+00:00"
649 | }, {
650 | "city": "London",
651 | "latitude": 51.50853,
652 | "longitude": -0.12574,
653 | "sunrise": "2017-02-09T07:23:50+00:00",
654 | "sunset": "2017-02-09T17:05:34+00:00"
655 | }, {
656 | "city": "Luanda",
657 | "latitude": -8.83833,
658 | "longitude": 13.23444,
659 | "sunrise": "2017-02-09T05:08:33+00:00",
660 | "sunset": "2017-02-09T17:33:57+00:00"
661 | }, {
662 | "city": "Lusaka",
663 | "latitude": -15.40809,
664 | "longitude": 28.28636,
665 | "sunrise": "2017-02-09T04:01:10+00:00",
666 | "sunset": "2017-02-09T16:40:55+00:00"
667 | }, {
668 | "city": "Luxembourg",
669 | "latitude": 49.61167,
670 | "longitude": 6.13,
671 | "sunrise": "2017-02-09T06:54:03+00:00",
672 | "sunset": "2017-02-09T16:45:18+00:00"
673 | }, {
674 | "city": "Macau",
675 | "latitude": 22.20056,
676 | "longitude": 113.54611,
677 | "sunrise": "2017-02-08T23:00:20+00:00",
678 | "sunset": "2017-02-09T10:19:40+00:00"
679 | }, {
680 | "city": "Madrid",
681 | "latitude": 40.4165,
682 | "longitude": -3.70256,
683 | "sunrise": "2017-02-09T07:14:37+00:00",
684 | "sunset": "2017-02-09T17:43:24+00:00"
685 | }, {
686 | "city": "Majuro",
687 | "latitude": 7.08971,
688 | "longitude": 171.38027,
689 | "sunrise": "2017-02-08T18:52:29+00:00",
690 | "sunset": "2017-02-09T06:44:51+00:00"
691 | }, {
692 | "city": "Malabo",
693 | "latitude": 3.75,
694 | "longitude": 8.78333,
695 | "sunrise": "2017-02-09T05:39:23+00:00",
696 | "sunset": "2017-02-09T17:38:45+00:00"
697 | }, {
698 | "city": "Male",
699 | "latitude": 4.1748,
700 | "longitude": 73.50888,
701 | "sunrise": "2017-02-09T01:20:55+00:00",
702 | "sunset": "2017-02-09T13:19:23+00:00"
703 | }, {
704 | "city": "Mamoudzou",
705 | "latitude": -12.77944,
706 | "longitude": 45.22722,
707 | "sunrise": "2017-02-09T02:56:19+00:00",
708 | "sunset": "2017-02-09T15:30:15+00:00"
709 | }, {
710 | "city": "Managua",
711 | "latitude": 12.13282,
712 | "longitude": -86.2504,
713 | "sunrise": "2017-02-09T12:08:08+00:00",
714 | "sunset": "2017-02-09T23:50:16+00:00"
715 | }, {
716 | "city": "Manama",
717 | "latitude": 26.21536,
718 | "longitude": 50.5832,
719 | "sunrise": "2017-02-09T03:16:57+00:00",
720 | "sunset": "2017-02-09T14:26:46+00:00"
721 | }, {
722 | "city": "Manila",
723 | "latitude": 14.6042,
724 | "longitude": 120.9822,
725 | "sunrise": "2017-02-08T22:22:02+00:00",
726 | "sunset": "2017-02-09T09:58:30+00:00"
727 | }, {
728 | "city": "Maputo",
729 | "latitude": -25.96528,
730 | "longitude": 32.58917,
731 | "sunrise": "2017-02-09T03:31:11+00:00",
732 | "sunset": "2017-02-09T16:36:29+00:00"
733 | }, {
734 | "city": "Mariehamn",
735 | "latitude": 60.09726,
736 | "longitude": 19.93481,
737 | "sunrise": "2017-02-09T06:32:28+00:00",
738 | "sunset": "2017-02-09T15:16:27+00:00"
739 | }, {
740 | "city": "Marigot",
741 | "latitude": 18.06667,
742 | "longitude": -63.08333,
743 | "sunrise": "2017-02-09T10:41:53+00:00",
744 | "sunset": "2017-02-09T22:11:10+00:00"
745 | }, {
746 | "city": "Maseru",
747 | "latitude": -29.31667,
748 | "longitude": 27.48333,
749 | "sunrise": "2017-02-09T03:47:04+00:00",
750 | "sunset": "2017-02-09T17:01:28+00:00"
751 | }, {
752 | "city": "Mat?�'utu",
753 | "latitude": -13.28163,
754 | "longitude": -176.17453,
755 | "sunrise": "2017-02-09T17:41:35+00:00",
756 | "sunset": "2017-02-10T06:16:13+00:00"
757 | }, {
758 | "city": "Mbabane",
759 | "latitude": -26.31667,
760 | "longitude": 31.13333,
761 | "sunrise": "2017-02-09T03:36:33+00:00",
762 | "sunset": "2017-02-09T16:42:47+00:00"
763 | }, {
764 | "city": "Mexico City",
765 | "latitude": 19.42847,
766 | "longitude": -99.12766,
767 | "sunrise": "2017-02-09T13:07:33+00:00",
768 | "sunset": "2017-02-10T00:33:53+00:00"
769 | }, {
770 | "city": "Minsk",
771 | "latitude": 53.9,
772 | "longitude": 27.56667,
773 | "sunrise": "2017-02-09T05:39:54+00:00",
774 | "sunset": "2017-02-09T15:07:57+00:00"
775 | }, {
776 | "city": "Mogadishu",
777 | "latitude": 2.03711,
778 | "longitude": 45.34375,
779 | "sunrise": "2017-02-09T03:11:23+00:00",
780 | "sunset": "2017-02-09T15:14:15+00:00"
781 | }, {
782 | "city": "Monaco",
783 | "latitude": 43.73333,
784 | "longitude": 7.41667,
785 | "sunrise": "2017-02-09T06:36:14+00:00",
786 | "sunset": "2017-02-09T16:52:50+00:00"
787 | }, {
788 | "city": "Monrovia",
789 | "latitude": 6.30054,
790 | "longitude": -10.7969,
791 | "sunrise": "2017-02-09T07:00:19+00:00",
792 | "sunset": "2017-02-09T18:54:27+00:00"
793 | }, {
794 | "city": "Montevideo",
795 | "latitude": -34.83346,
796 | "longitude": -56.16735,
797 | "sunrise": "2017-02-09T09:13:37+00:00",
798 | "sunset": "2017-02-09T22:44:07+00:00"
799 | }, {
800 | "city": "Moroni",
801 | "latitude": -11.70216,
802 | "longitude": 43.25506,
803 | "sunrise": "2017-02-09T03:05:23+00:00",
804 | "sunset": "2017-02-09T15:36:58+00:00"
805 | }, {
806 | "city": "Moscow",
807 | "latitude": 55.75222,
808 | "longitude": 37.61556,
809 | "sunrise": "2017-02-09T05:05:33+00:00",
810 | "sunset": "2017-02-09T14:21:55+00:00"
811 | }, {
812 | "city": "Muscat",
813 | "latitude": 23.61333,
814 | "longitude": 58.59333,
815 | "sunrise": "2017-02-09T02:41:45+00:00",
816 | "sunset": "2017-02-09T13:57:54+00:00"
817 | }, {
818 | "city": "Nairobi",
819 | "latitude": -1.28333,
820 | "longitude": 36.81667,
821 | "sunrise": "2017-02-09T03:42:05+00:00",
822 | "sunset": "2017-02-09T15:51:46+00:00"
823 | }, {
824 | "city": "Nassau",
825 | "latitude": 25.05823,
826 | "longitude": -77.34306,
827 | "sunrise": "2017-02-09T11:47:00+00:00",
828 | "sunset": "2017-02-09T23:00:08+00:00"
829 | }, {
830 | "city": "Nay Pyi Taw",
831 | "latitude": 19.745,
832 | "longitude": 96.12972,
833 | "sunrise": "2017-02-09T00:07:08+00:00",
834 | "sunset": "2017-02-09T11:32:13+00:00"
835 | }, {
836 | "city": "N'Djamena",
837 | "latitude": 12.11058,
838 | "longitude": 15.03479,
839 | "sunrise": "2017-02-09T05:23:03+00:00",
840 | "sunset": "2017-02-09T17:05:04+00:00"
841 | }, {
842 | "city": "New Delhi",
843 | "latitude": 28.63576,
844 | "longitude": 77.22445,
845 | "sunrise": "2017-02-09T01:33:32+00:00",
846 | "sunset": "2017-02-09T12:37:03+00:00"
847 | }, {
848 | "city": "Ngerulmud",
849 | "latitude": 7.50043,
850 | "longitude": 134.62355,
851 | "sunrise": "2017-02-08T21:19:56+00:00",
852 | "sunset": "2017-02-09T09:11:28+00:00"
853 | }, {
854 | "city": "Niamey",
855 | "latitude": 13.5125,
856 | "longitude": 2.11178,
857 | "sunrise": "2017-02-09T06:16:13+00:00",
858 | "sunset": "2017-02-09T17:55:16+00:00"
859 | }, {
860 | "city": "Nicosia",
861 | "latitude": 35.16667,
862 | "longitude": 33.36667,
863 | "sunrise": "2017-02-09T04:38:00+00:00",
864 | "sunset": "2017-02-09T15:23:28+00:00"
865 | }, {
866 | "city": "Nouakchott",
867 | "latitude": 18.10033,
868 | "longitude": -15.94975,
869 | "sunrise": "2017-02-09T07:33:27+00:00",
870 | "sunset": "2017-02-09T19:02:32+00:00"
871 | }, {
872 | "city": "Noum??a",
873 | "latitude": -22.27631,
874 | "longitude": 166.4572,
875 | "sunrise": "2017-02-08T18:40:11+00:00",
876 | "sunset": "2017-02-09T07:36:32+00:00"
877 | }, {
878 | "city": "Nuku`alofa",
879 | "latitude": -21.13333,
880 | "longitude": -175.2,
881 | "sunrise": "2017-02-09T17:28:46+00:00",
882 | "sunset": "2017-02-10T06:21:15+00:00"
883 | }, {
884 | "city": "Nuuk",
885 | "latitude": 64.18347,
886 | "longitude": -51.72157,
887 | "sunrise": "2017-02-09T11:38:57+00:00",
888 | "sunset": "2017-02-09T19:43:13+00:00"
889 | }, {
890 | "city": "Oranjestad",
891 | "latitude": 12.52398,
892 | "longitude": -70.02703,
893 | "sunrise": "2017-02-09T11:03:40+00:00",
894 | "sunset": "2017-02-09T22:44:57+00:00"
895 | }, {
896 | "city": "Oslo",
897 | "latitude": 59.91273,
898 | "longitude": 10.74609,
899 | "sunrise": "2017-02-09T07:08:22+00:00",
900 | "sunset": "2017-02-09T15:54:03+00:00"
901 | }, {
902 | "city": "Ottawa",
903 | "latitude": 45.41117,
904 | "longitude": -75.69812,
905 | "sunrise": "2017-02-09T12:11:42+00:00",
906 | "sunset": "2017-02-09T22:22:17+00:00"
907 | }, {
908 | "city": "Ouagadougou",
909 | "latitude": 12.36423,
910 | "longitude": -1.53834,
911 | "sunrise": "2017-02-09T06:29:36+00:00",
912 | "sunset": "2017-02-09T18:11:06+00:00"
913 | }, {
914 | "city": "Pago Pago",
915 | "latitude": -14.27806,
916 | "longitude": -170.7025,
917 | "sunrise": "2017-02-09T17:18:36+00:00",
918 | "sunset": "2017-02-10T05:55:25+00:00"
919 | }, {
920 | "city": "Palikir - National Government Center",
921 | "latitude": 6.92477,
922 | "longitude": 158.16109,
923 | "sunrise": "2017-02-08T19:45:11+00:00",
924 | "sunset": "2017-02-09T07:37:54+00:00"
925 | }, {
926 | "city": "Panam?�",
927 | "latitude": 8.9936,
928 | "longitude": -79.51973,
929 | "sunrise": "2017-02-09T11:37:57+00:00",
930 | "sunset": "2017-02-09T23:26:37+00:00"
931 | }, {
932 | "city": "Papeete",
933 | "latitude": -17.53333,
934 | "longitude": -149.56667,
935 | "sunrise": "2017-02-09T15:50:24+00:00",
936 | "sunset": "2017-02-10T04:34:33+00:00"
937 | }, {
938 | "city": "Paramaribo",
939 | "latitude": 5.86638,
940 | "longitude": -55.16682,
941 | "sunrise": "2017-02-09T09:57:20+00:00",
942 | "sunset": "2017-02-09T21:52:24+00:00"
943 | }, {
944 | "city": "Paris",
945 | "latitude": 48.85341,
946 | "longitude": 2.3488,
947 | "sunrise": "2017-02-09T07:07:21+00:00",
948 | "sunset": "2017-02-09T17:02:15+00:00"
949 | }, {
950 | "city": "Philipsburg",
951 | "latitude": 18.026,
952 | "longitude": -63.04582,
953 | "sunrise": "2017-02-09T10:41:42+00:00",
954 | "sunset": "2017-02-09T22:11:04+00:00"
955 | }, {
956 | "city": "Phnom Penh",
957 | "latitude": 11.56245,
958 | "longitude": 104.91601,
959 | "sunrise": "2017-02-08T23:23:01+00:00",
960 | "sunset": "2017-02-09T11:06:03+00:00"
961 | }, {
962 | "city": "Plymouth",
963 | "latitude": 16.70555,
964 | "longitude": -62.21292,
965 | "sunrise": "2017-02-09T10:36:55+00:00",
966 | "sunset": "2017-02-09T22:09:11+00:00"
967 | }, {
968 | "city": "Podgorica",
969 | "latitude": 42.44111,
970 | "longitude": 19.26361,
971 | "sunrise": "2017-02-09T05:46:27+00:00",
972 | "sunset": "2017-02-09T16:07:50+00:00"
973 | }, {
974 | "city": "Port Louis",
975 | "latitude": -20.16194,
976 | "longitude": 57.49889,
977 | "sunrise": "2017-02-09T01:58:46+00:00",
978 | "sunset": "2017-02-09T14:49:37+00:00"
979 | }, {
980 | "city": "Port Moresby",
981 | "latitude": -9.44314,
982 | "longitude": 147.17972,
983 | "sunrise": "2017-02-08T20:12:02+00:00",
984 | "sunset": "2017-02-09T08:38:54+00:00"
985 | }, {
986 | "city": "Port-au-Prince",
987 | "latitude": 18.53917,
988 | "longitude": -72.335,
989 | "sunrise": "2017-02-09T11:19:25+00:00",
990 | "sunset": "2017-02-09T22:47:40+00:00"
991 | }, {
992 | "city": "Port-aux-Fran??ais",
993 | "latitude": -49.35,
994 | "longitude": 70.21667,
995 | "sunrise": "2017-02-09T00:17:56+00:00",
996 | "sunset": "2017-02-09T14:48:43+00:00"
997 | }, {
998 | "city": "Port-of-Spain",
999 | "latitude": 10.66617,
1000 | "longitude": -61.51657,
1001 | "sunrise": "2017-02-09T10:27:41+00:00",
1002 | "sunset": "2017-02-09T22:12:51+00:00"
1003 | }, {
1004 | "city": "Porto-Novo",
1005 | "latitude": 6.49646,
1006 | "longitude": 2.60359,
1007 | "sunrise": "2017-02-09T06:06:55+00:00",
1008 | "sunset": "2017-02-09T18:00:39+00:00"
1009 | }, {
1010 | "city": "Port-Vila",
1011 | "latitude": -17.73381,
1012 | "longitude": 168.32188,
1013 | "sunrise": "2017-02-08T18:38:12+00:00",
1014 | "sunset": "2017-02-09T07:23:36+00:00"
1015 | }, {
1016 | "city": "Praha",
1017 | "latitude": 50.08804,
1018 | "longitude": 14.42076,
1019 | "sunrise": "2017-02-09T06:22:06+00:00",
1020 | "sunset": "2017-02-09T16:10:56+00:00"
1021 | }, {
1022 | "city": "Praia",
1023 | "latitude": 14.92148,
1024 | "longitude": -23.50868,
1025 | "sunrise": "2017-02-09T08:00:12+00:00",
1026 | "sunset": "2017-02-09T19:36:16+00:00"
1027 | }, {
1028 | "city": "Pretoria",
1029 | "latitude": -25.74486,
1030 | "longitude": 28.18783,
1031 | "sunrise": "2017-02-09T03:49:05+00:00",
1032 | "sunset": "2017-02-09T16:53:48+00:00"
1033 | }, {
1034 | "city": "Pristina",
1035 | "latitude": 42.67272,
1036 | "longitude": 21.16688,
1037 | "sunrise": "2017-02-09T05:39:16+00:00",
1038 | "sunset": "2017-02-09T15:59:47+00:00"
1039 | }, {
1040 | "city": "Pyongyang",
1041 | "latitude": 39.03385,
1042 | "longitude": 125.75432,
1043 | "sunrise": "2017-02-08T22:34:50+00:00",
1044 | "sunset": "2017-02-09T09:07:30+00:00"
1045 | }, {
1046 | "city": "Quito",
1047 | "latitude": -0.22985,
1048 | "longitude": -78.52495,
1049 | "sunrise": "2017-02-09T11:24:32+00:00",
1050 | "sunset": "2017-02-09T23:32:03+00:00"
1051 | }, {
1052 | "city": "Rabat",
1053 | "latitude": 34.01325,
1054 | "longitude": -6.83255,
1055 | "sunrise": "2017-02-09T07:16:59+00:00",
1056 | "sunset": "2017-02-09T18:06:04+00:00"
1057 | }, {
1058 | "city": "Reykjav??k",
1059 | "latitude": 64.13548,
1060 | "longitude": -21.89541,
1061 | "sunrise": "2017-02-09T09:39:38+00:00",
1062 | "sunset": "2017-02-09T17:43:56+00:00"
1063 | }, {
1064 | "city": "Riga",
1065 | "latitude": 56.946,
1066 | "longitude": 24.10589,
1067 | "sunrise": "2017-02-09T06:03:34+00:00",
1068 | "sunset": "2017-02-09T15:11:58+00:00"
1069 | }, {
1070 | "city": "Riyadh",
1071 | "latitude": 24.68773,
1072 | "longitude": 46.72185,
1073 | "sunrise": "2017-02-09T03:30:31+00:00",
1074 | "sunset": "2017-02-09T14:44:06+00:00"
1075 | }, {
1076 | "city": "Road Town",
1077 | "latitude": 18.41667,
1078 | "longitude": -64.61667,
1079 | "sunrise": "2017-02-09T10:48:25+00:00",
1080 | "sunset": "2017-02-09T22:16:55+00:00"
1081 | }, {
1082 | "city": "Roma",
1083 | "latitude": 41.89474,
1084 | "longitude": 12.4839,
1085 | "sunrise": "2017-02-09T06:12:32+00:00",
1086 | "sunset": "2017-02-09T16:35:59+00:00"
1087 | }, {
1088 | "city": "Roseau",
1089 | "latitude": 15.30174,
1090 | "longitude": -61.38808,
1091 | "sunrise": "2017-02-09T10:32:05+00:00",
1092 | "sunset": "2017-02-09T22:07:25+00:00"
1093 | }, {
1094 | "city": "S?�o Tom??",
1095 | "latitude": 0.33654,
1096 | "longitude": 6.72732,
1097 | "sunrise": "2017-02-09T05:44:06+00:00",
1098 | "sunset": "2017-02-09T17:50:28+00:00"
1099 | }, {
1100 | "city": "Saint George's",
1101 | "latitude": 12.05644,
1102 | "longitude": -61.74849,
1103 | "sunrise": "2017-02-09T10:30:04+00:00",
1104 | "sunset": "2017-02-09T22:12:19+00:00"
1105 | }, {
1106 | "city": "Saint Helier",
1107 | "latitude": 49.18333,
1108 | "longitude": -2.1,
1109 | "sunrise": "2017-02-09T07:25:54+00:00",
1110 | "sunset": "2017-02-09T17:19:17+00:00"
1111 | }, {
1112 | "city": "Saint John�??s",
1113 | "latitude": 17.11667,
1114 | "longitude": -61.85,
1115 | "sunrise": "2017-02-09T10:35:55+00:00",
1116 | "sunset": "2017-02-09T22:07:17+00:00"
1117 | }, {
1118 | "city": "Saint Peter Port",
1119 | "latitude": 49.45981,
1120 | "longitude": -2.53527,
1121 | "sunrise": "2017-02-09T07:28:18+00:00",
1122 | "sunset": "2017-02-09T17:20:22+00:00"
1123 | }, {
1124 | "city": "Saint-Denis",
1125 | "latitude": -20.88231,
1126 | "longitude": 55.4504,
1127 | "sunrise": "2017-02-09T02:06:06+00:00",
1128 | "sunset": "2017-02-09T14:58:41+00:00"
1129 | }, {
1130 | "city": "Saint-Pierre",
1131 | "latitude": 46.76544,
1132 | "longitude": -56.16949,
1133 | "sunrise": "2017-02-09T10:56:29+00:00",
1134 | "sunset": "2017-02-09T21:01:16+00:00"
1135 | }, {
1136 | "city": "San Jos??",
1137 | "latitude": 9.93333,
1138 | "longitude": -84.08333,
1139 | "sunrise": "2017-02-09T11:57:10+00:00",
1140 | "sunset": "2017-02-09T23:43:54+00:00"
1141 | }, {
1142 | "city": "San Juan",
1143 | "latitude": 18.46633,
1144 | "longitude": -66.10572,
1145 | "sunrise": "2017-02-09T10:54:25+00:00",
1146 | "sunset": "2017-02-09T22:22:49+00:00"
1147 | }, {
1148 | "city": "San Marino",
1149 | "latitude": 43.93333,
1150 | "longitude": 12.45,
1151 | "sunrise": "2017-02-09T06:16:30+00:00",
1152 | "sunset": "2017-02-09T16:32:17+00:00"
1153 | }, {
1154 | "city": "San Salvador",
1155 | "latitude": 13.68935,
1156 | "longitude": -89.18718,
1157 | "sunrise": "2017-02-09T12:21:32+00:00",
1158 | "sunset": "2017-02-10T00:00:22+00:00"
1159 | }, {
1160 | "city": "Sanaa",
1161 | "latitude": 15.35472,
1162 | "longitude": 44.20667,
1163 | "sunrise": "2017-02-09T03:29:52+00:00",
1164 | "sunset": "2017-02-09T15:04:52+00:00"
1165 | }, {
1166 | "city": "Santiago",
1167 | "latitude": -33.42628,
1168 | "longitude": -70.56656,
1169 | "sunrise": "2017-02-09T10:13:28+00:00",
1170 | "sunset": "2017-02-09T23:39:28+00:00"
1171 | }, {
1172 | "city": "Santo Domingo",
1173 | "latitude": 18.50012,
1174 | "longitude": -69.98857,
1175 | "sunrise": "2017-02-09T11:09:59+00:00",
1176 | "sunset": "2017-02-09T22:38:19+00:00"
1177 | }, {
1178 | "city": "Sarajevo",
1179 | "latitude": 43.84864,
1180 | "longitude": 18.35644,
1181 | "sunrise": "2017-02-09T05:52:44+00:00",
1182 | "sunset": "2017-02-09T16:08:48+00:00"
1183 | }, {
1184 | "city": "Seoul",
1185 | "latitude": 37.56826,
1186 | "longitude": 126.97783,
1187 | "sunrise": "2017-02-08T22:27:33+00:00",
1188 | "sunset": "2017-02-09T09:05:01+00:00"
1189 | }, {
1190 | "city": "Singapore",
1191 | "latitude": 1.28967,
1192 | "longitude": 103.85007,
1193 | "sunrise": "2017-02-08T23:16:36+00:00",
1194 | "sunset": "2017-02-09T11:20:59+00:00"
1195 | }, {
1196 | "city": "Skopje",
1197 | "latitude": 42,
1198 | "longitude": 21.43333,
1199 | "sunrise": "2017-02-09T05:36:58+00:00",
1200 | "sunset": "2017-02-09T15:59:58+00:00"
1201 | }, {
1202 | "city": "Sofia",
1203 | "latitude": 42.69751,
1204 | "longitude": 23.32415,
1205 | "sunrise": "2017-02-09T05:30:42+00:00",
1206 | "sunset": "2017-02-09T15:51:06+00:00"
1207 | }, {
1208 | "city": "Stanley",
1209 | "latitude": -51.7,
1210 | "longitude": -57.85,
1211 | "sunrise": "2017-02-09T08:44:14+00:00",
1212 | "sunset": "2017-02-09T23:26:58+00:00"
1213 | }, {
1214 | "city": "Stockholm",
1215 | "latitude": 59.33258,
1216 | "longitude": 18.0649,
1217 | "sunrise": "2017-02-09T06:36:44+00:00",
1218 | "sunset": "2017-02-09T15:27:09+00:00"
1219 | }, {
1220 | "city": "Sucre",
1221 | "latitude": -19.03332,
1222 | "longitude": -65.26274,
1223 | "sunrise": "2017-02-09T10:11:20+00:00",
1224 | "sunset": "2017-02-09T22:59:10+00:00"
1225 | }, {
1226 | "city": "Suva",
1227 | "latitude": -18.14161,
1228 | "longitude": 178.44149,
1229 | "sunrise": "2017-02-08T17:57:14+00:00",
1230 | "sunset": "2017-02-09T06:43:37+00:00"
1231 | }, {
1232 | "city": "T??rshavn",
1233 | "latitude": 62.00973,
1234 | "longitude": -6.77164,
1235 | "sunrise": "2017-02-09T08:27:53+00:00",
1236 | "sunset": "2017-02-09T16:54:41+00:00"
1237 | }, {
1238 | "city": "Taipei",
1239 | "latitude": 25.04776,
1240 | "longitude": 121.53185,
1241 | "sunrise": "2017-02-08T22:31:50+00:00",
1242 | "sunset": "2017-02-09T09:44:17+00:00"
1243 | }, {
1244 | "city": "Tallinn",
1245 | "latitude": 59.43696,
1246 | "longitude": 24.75353,
1247 | "sunrise": "2017-02-09T06:10:27+00:00",
1248 | "sunset": "2017-02-09T14:59:55+00:00"
1249 | }, {
1250 | "city": "Tarawa",
1251 | "latitude": 1.3278,
1252 | "longitude": 172.97696,
1253 | "sunrise": "2017-02-08T18:40:08+00:00",
1254 | "sunset": "2017-02-09T06:44:26+00:00"
1255 | }, {
1256 | "city": "Tashkent",
1257 | "latitude": 41.26465,
1258 | "longitude": 69.21627,
1259 | "sunrise": "2017-02-09T02:24:40+00:00",
1260 | "sunset": "2017-02-09T12:49:59+00:00"
1261 | }, {
1262 | "city": "Tbilisi",
1263 | "latitude": 41.69411,
1264 | "longitude": 44.83368,
1265 | "sunrise": "2017-02-09T04:02:53+00:00",
1266 | "sunset": "2017-02-09T14:26:50+00:00"
1267 | }, {
1268 | "city": "Tegucigalpa",
1269 | "latitude": 14.0818,
1270 | "longitude": -87.20681,
1271 | "sunrise": "2017-02-09T12:14:02+00:00",
1272 | "sunset": "2017-02-09T23:52:02+00:00"
1273 | }, {
1274 | "city": "Tehr��n",
1275 | "latitude": 35.69439,
1276 | "longitude": 51.42151,
1277 | "sunrise": "2017-02-09T03:26:37+00:00",
1278 | "sunset": "2017-02-09T14:10:24+00:00"
1279 | }, {
1280 | "city": "The Valley",
1281 | "latitude": 18.21704,
1282 | "longitude": -63.05783,
1283 | "sunrise": "2017-02-09T10:41:57+00:00",
1284 | "sunset": "2017-02-09T22:10:54+00:00"
1285 | }, {
1286 | "city": "Thimphu",
1287 | "latitude": 27.46609,
1288 | "longitude": 89.64191,
1289 | "sunrise": "2017-02-09T00:42:23+00:00",
1290 | "sunset": "2017-02-09T11:48:52+00:00"
1291 | }, {
1292 | "city": "Tirana",
1293 | "latitude": 41.3275,
1294 | "longitude": 19.81889,
1295 | "sunrise": "2017-02-09T05:42:12+00:00",
1296 | "sunset": "2017-02-09T16:07:38+00:00"
1297 | }, {
1298 | "city": "Tokyo",
1299 | "latitude": 35.61488,
1300 | "longitude": 139.5813,
1301 | "sunrise": "2017-02-08T21:34:06+00:00",
1302 | "sunset": "2017-02-09T08:17:38+00:00"
1303 | }, {
1304 | "city": "Tripoli",
1305 | "latitude": 32.87519,
1306 | "longitude": 13.18746,
1307 | "sunrise": "2017-02-09T05:55:19+00:00",
1308 | "sunset": "2017-02-09T16:47:35+00:00"
1309 | }, {
1310 | "city": "Tunis",
1311 | "latitude": 36.81897,
1312 | "longitude": 10.16579,
1313 | "sunrise": "2017-02-09T06:13:16+00:00",
1314 | "sunset": "2017-02-09T16:53:48+00:00"
1315 | }, {
1316 | "city": "Ulaanbaatar",
1317 | "latitude": 47.90771,
1318 | "longitude": 106.88324,
1319 | "sunrise": "2017-02-09T00:07:30+00:00",
1320 | "sunset": "2017-02-09T10:05:49+00:00"
1321 | }, {
1322 | "city": "Vaduz",
1323 | "latitude": 47.14151,
1324 | "longitude": 9.52154,
1325 | "sunrise": "2017-02-09T06:34:49+00:00",
1326 | "sunset": "2017-02-09T16:37:24+00:00"
1327 | }, {
1328 | "city": "Valletta",
1329 | "latitude": 35.89972,
1330 | "longitude": 14.51472,
1331 | "sunrise": "2017-02-09T05:54:28+00:00",
1332 | "sunset": "2017-02-09T16:37:49+00:00"
1333 | }, {
1334 | "city": "Vatican City",
1335 | "latitude": 41.90236,
1336 | "longitude": 12.45332,
1337 | "sunrise": "2017-02-09T06:12:40+00:00",
1338 | "sunset": "2017-02-09T16:36:05+00:00"
1339 | }, {
1340 | "city": "Victoria",
1341 | "latitude": -4.61667,
1342 | "longitude": 55.45,
1343 | "sunrise": "2017-02-09T02:24:06+00:00",
1344 | "sunset": "2017-02-09T14:40:41+00:00"
1345 | }, {
1346 | "city": "Vienna",
1347 | "latitude": 48.20849,
1348 | "longitude": 16.37208,
1349 | "sunrise": "2017-02-09T06:09:50+00:00",
1350 | "sunset": "2017-02-09T16:07:35+00:00"
1351 | }, {
1352 | "city": "Vientiane",
1353 | "latitude": 17.96667,
1354 | "longitude": 102.6,
1355 | "sunrise": "2017-02-08T23:39:15+00:00",
1356 | "sunset": "2017-02-09T11:08:20+00:00"
1357 | }, {
1358 | "city": "Vilnius",
1359 | "latitude": 54.68916,
1360 | "longitude": 25.2798,
1361 | "sunrise": "2017-02-09T05:51:26+00:00",
1362 | "sunset": "2017-02-09T15:14:43+00:00"
1363 | }, {
1364 | "city": "Warsaw",
1365 | "latitude": 52.22977,
1366 | "longitude": 21.01178,
1367 | "sunrise": "2017-02-09T06:01:20+00:00",
1368 | "sunset": "2017-02-09T15:38:58+00:00"
1369 | }, {
1370 | "city": "Washington, D. C.",
1371 | "latitude": 38.89511,
1372 | "longitude": -77.03637,
1373 | "sunrise": "2017-02-09T12:05:09+00:00",
1374 | "sunset": "2017-02-09T22:39:33+00:00"
1375 | }, {
1376 | "city": "Wellington",
1377 | "latitude": -41.28664,
1378 | "longitude": 174.77557,
1379 | "sunrise": "2017-02-08T17:37:42+00:00",
1380 | "sunset": "2017-02-09T07:32:28+00:00"
1381 | }, {
1382 | "city": "West Island",
1383 | "latitude": -12.15681,
1384 | "longitude": 96.82251,
1385 | "sunrise": "2017-02-08T23:30:34+00:00",
1386 | "sunset": "2017-02-09T12:03:14+00:00"
1387 | }, {
1388 | "city": "Willemstad",
1389 | "latitude": 12.1084,
1390 | "longitude": -68.93354,
1391 | "sunrise": "2017-02-09T10:58:51+00:00",
1392 | "sunset": "2017-02-09T22:41:00+00:00"
1393 | }, {
1394 | "city": "Windhoek",
1395 | "latitude": -22.55941,
1396 | "longitude": 17.08323,
1397 | "sunrise": "2017-02-09T04:37:35+00:00",
1398 | "sunset": "2017-02-09T17:34:09+00:00"
1399 | }, {
1400 | "city": "Yamoussoukro",
1401 | "latitude": 6.81667,
1402 | "longitude": -5.28333,
1403 | "sunrise": "2017-02-09T06:38:47+00:00",
1404 | "sunset": "2017-02-09T18:31:52+00:00"
1405 | }, {
1406 | "city": "Yaound??",
1407 | "latitude": 3.86667,
1408 | "longitude": 11.51667,
1409 | "sunrise": "2017-02-09T05:28:34+00:00",
1410 | "sunset": "2017-02-09T17:27:42+00:00"
1411 | }, {
1412 | "city": "Yerevan",
1413 | "latitude": 40.18111,
1414 | "longitude": 44.51361,
1415 | "sunrise": "2017-02-09T04:01:30+00:00",
1416 | "sunset": "2017-02-09T14:30:47+00:00"
1417 | }, {
1418 | "city": "Zagreb",
1419 | "latitude": 45.81444,
1420 | "longitude": 15.97798,
1421 | "sunrise": "2017-02-09T06:06:11+00:00",
1422 | "sunset": "2017-02-09T16:14:23+00:00"
1423 | }]
1424 |
--------------------------------------------------------------------------------