├── .bundle
└── config
├── Gemfile
├── Screenshot
└── Screenshot.png
├── Resources
└── AppleReserver.sketch
├── Podfile
├── AppleReserver
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ ├── mac-16x16@1x.png
│ │ ├── mac-16x16@2x.png
│ │ ├── mac-32x32@1x.png
│ │ ├── mac-32x32@2x.png
│ │ ├── mac-128x128@1x.png
│ │ ├── mac-128x128@2x.png
│ │ ├── mac-256x256@1x.png
│ │ ├── mac-256x256@2x.png
│ │ ├── mac-512x512@1x.png
│ │ ├── mac-512x512@2x.png
│ │ └── Contents.json
├── Device.swift
├── Constant.swift
├── MainWindowController.swift
├── Availability.swift
├── Store.swift
├── AppDelegate.swift
├── Product.swift
├── Info.plist
├── MainViewController.swift
├── Products.json
└── Base.lproj
│ └── Main.storyboard
├── AppleReserver.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
└── project.pbxproj
├── Podfile.lock
├── .travis.yml
├── README.md
├── LICENSE
├── Gemfile.lock
└── .gitignore
/.bundle/config:
--------------------------------------------------------------------------------
1 | ---
2 | BUNDLE_PATH: "Gems"
3 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | source 'https://rubygems.org'
4 |
5 | gem 'cocoapods'
6 |
--------------------------------------------------------------------------------
/Screenshot/Screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/Screenshot/Screenshot.png
--------------------------------------------------------------------------------
/Resources/AppleReserver.sketch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/Resources/AppleReserver.sketch
--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
1 | platform :osx, '10.11'
2 |
3 | target 'AppleReserver' do
4 | use_frameworks!
5 | pod 'Alamofire'
6 | end
7 |
--------------------------------------------------------------------------------
/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-16x16@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-16x16@1x.png
--------------------------------------------------------------------------------
/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-16x16@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-16x16@2x.png
--------------------------------------------------------------------------------
/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-32x32@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-32x32@1x.png
--------------------------------------------------------------------------------
/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-32x32@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-32x32@2x.png
--------------------------------------------------------------------------------
/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-128x128@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-128x128@1x.png
--------------------------------------------------------------------------------
/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-128x128@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-128x128@2x.png
--------------------------------------------------------------------------------
/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-256x256@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-256x256@1x.png
--------------------------------------------------------------------------------
/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-256x256@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-256x256@2x.png
--------------------------------------------------------------------------------
/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-512x512@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-512x512@1x.png
--------------------------------------------------------------------------------
/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-512x512@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-512x512@2x.png
--------------------------------------------------------------------------------
/AppleReserver.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/AppleReserver/Device.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Device.swift
3 | // AppleReserver
4 | //
5 | // Created by Sunnyyoung on 2017/9/19.
6 | // Copyright © 2017年 Sunnyyoung. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct Device: Codable {
12 | let partNumber: String
13 | let description: String
14 | }
15 |
--------------------------------------------------------------------------------
/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Alamofire (4.9.1)
3 |
4 | DEPENDENCIES:
5 | - Alamofire
6 |
7 | SPEC REPOS:
8 | trunk:
9 | - Alamofire
10 |
11 | SPEC CHECKSUMS:
12 | Alamofire: 85e8a02c69d6020a0d734f6054870d7ecb75cf18
13 |
14 | PODFILE CHECKSUM: 14519dd0495351e3d80bfac4f73f2029dd98fb96
15 |
16 | COCOAPODS: 1.10.0
17 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: swift
2 | osx_image: xcode9
3 | xcode_workspace: AppleReserver.xcworkspace
4 | xcode_scheme: AppleReserver
5 | before_install:
6 | - gem install cocoapods
7 | - pod repo update --silent
8 | script: xcodebuild -workspace AppleReserver.xcworkspace -scheme AppleReserver CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
9 |
--------------------------------------------------------------------------------
/AppleReserver/Constant.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Constant.swift
3 | // AppleReserver
4 | //
5 | // Created by Sunnyyoung on 2017/9/19.
6 | // Copyright © 2017年 Sunnyyoung. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public struct AppleURL {
12 | static let stores = URL(string: "https://reserve-prime.apple.com/CN/zh_CN/reserve/A/stores.json")!
13 | static let availability = URL(string: "https://reserve-prime.apple.com/CN/zh_CN/reserve/A/availability.json")!
14 | }
15 |
--------------------------------------------------------------------------------
/AppleReserver/MainWindowController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainWindowController.swift
3 | // AppleReserver
4 | //
5 | // Created by Sunnyyoung on 2017/9/19.
6 | // Copyright © 2017年 Sunnyyoung. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | class MainWindowController: NSWindowController {
12 |
13 | override func windowDidLoad() {
14 | super.windowDidLoad()
15 | self.window?.titleVisibility = .hidden
16 | self.window?.titlebarAppearsTransparent = true
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AppleReserver
2 |
3 | 
4 | 
5 | [](https://travis-ci.org/Sunnyyoung/AppleReserver)
6 |
7 | Apple官方预约监控助手,支持 iPhone 13 系列
8 |
9 | ## Screenshot
10 |
11 | 
12 |
13 | ## Dependency
14 |
15 | - [Alamofire](https://github.com/Alamofire/Alamofire)
16 |
17 | ## License
18 |
19 | The [MIT License](LICENSE).
20 |
--------------------------------------------------------------------------------
/AppleReserver/Availability.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Availability.swift
3 | // AppleReserver
4 | //
5 | // Created by Sunnyyoung on 2017/9/19.
6 | // Copyright © 2017年 Sunnyyoung. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct Availability: Codable {
12 | let partNumber: String
13 | let contract: Bool
14 | let unlocked: Bool
15 |
16 | init(key: String, value: [String: [String: Bool]]) {
17 | self.partNumber = key
18 | self.contract = value["availability"]?["contract"] ?? false
19 | self.unlocked = value["availability"]?["unlocked"] ?? false
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/AppleReserver/Store.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Store.swift
3 | // AppleReserver
4 | //
5 | // Created by Sunnyyoung on 2017/9/19.
6 | // Copyright © 2017年 Sunnyyoung. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | /**
12 | {
13 | "storeNumber": "R320",
14 | "city": "北京",
15 | "latitude": "39.933456",
16 | "storeName": "三里屯",
17 | "enabled": true,
18 | "longitude": "116.447967"
19 | }
20 | */
21 | struct Store: Codable {
22 | let storeNumber: String?
23 | let storeName: String?
24 | let city: String?
25 | let latitude: String?
26 | let longitude: String?
27 | let enabled: Bool
28 | }
29 |
--------------------------------------------------------------------------------
/AppleReserver/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // AppleReserver
4 | //
5 | // Created by Sunnyyoung on 2017/9/19.
6 | // Copyright © 2017年 Sunnyyoung. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | @NSApplicationMain
12 | class AppDelegate: NSObject, NSApplicationDelegate {
13 |
14 | func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
15 | let window = sender.windows.first
16 | if flag {
17 | window?.orderFront(sender)
18 | } else {
19 | window?.makeKeyAndOrderFront(sender)
20 | }
21 | return true
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/AppleReserver/Product.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Product.swift
3 | // AppleReserver
4 | //
5 | // Created by Sunnyyoung on 2017/9/19.
6 | // Copyright © 2017年 Sunnyyoung. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | /**
12 | https://www.apple.com.cn/shop/product-locator-meta?family=iphone13
13 |
14 | {
15 | "productTitle": "iPhone 13 256GB 粉色",
16 | "basePartNumber": "MLE23",
17 | "image": "iphone-13-pink-select-2021",
18 | "dimensionCapacity": "256gb",
19 | "dimensionScreensize": "6_1inch",
20 | "price": "6799_00_unlocked",
21 | "partNumber": "MLE23CH/A",
22 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE23CH/A",
23 | "dimensionColor": "pink"
24 | }
25 | */
26 | struct Product: Codable {
27 | let productTitle: String
28 | let basePartNumber: String
29 | let image: String
30 | let dimensionCapacity: String
31 | let dimensionScreensize: String
32 | let price: String
33 | let partNumber: String
34 | let productLink: String
35 | let dimensionColor: String
36 | }
37 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2016 Sunnyyoung
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 |
--------------------------------------------------------------------------------
/AppleReserver/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 4.0
21 | CFBundleVersion
22 | 10
23 | LSApplicationCategoryType
24 | public.app-category.utilities
25 | LSMinimumSystemVersion
26 | $(MACOSX_DEPLOYMENT_TARGET)
27 | NSHumanReadableCopyright
28 | Copyright © 2017年 Sunnyyoung. All rights reserved.
29 | NSMainStoryboardFile
30 | Main
31 | NSPrincipalClass
32 | NSApplication
33 |
34 |
35 |
--------------------------------------------------------------------------------
/AppleReserver/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "16x16",
5 | "idiom" : "mac",
6 | "filename" : "mac-16x16@1x.png",
7 | "scale" : "1x"
8 | },
9 | {
10 | "size" : "16x16",
11 | "idiom" : "mac",
12 | "filename" : "mac-16x16@2x.png",
13 | "scale" : "2x"
14 | },
15 | {
16 | "size" : "32x32",
17 | "idiom" : "mac",
18 | "filename" : "mac-32x32@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "32x32",
23 | "idiom" : "mac",
24 | "filename" : "mac-32x32@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "128x128",
29 | "idiom" : "mac",
30 | "filename" : "mac-128x128@1x.png",
31 | "scale" : "1x"
32 | },
33 | {
34 | "size" : "128x128",
35 | "idiom" : "mac",
36 | "filename" : "mac-128x128@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "256x256",
41 | "idiom" : "mac",
42 | "filename" : "mac-256x256@1x.png",
43 | "scale" : "1x"
44 | },
45 | {
46 | "size" : "256x256",
47 | "idiom" : "mac",
48 | "filename" : "mac-256x256@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "512x512",
53 | "idiom" : "mac",
54 | "filename" : "mac-512x512@1x.png",
55 | "scale" : "1x"
56 | },
57 | {
58 | "size" : "512x512",
59 | "idiom" : "mac",
60 | "filename" : "mac-512x512@2x.png",
61 | "scale" : "2x"
62 | }
63 | ],
64 | "info" : {
65 | "version" : 1,
66 | "author" : "xcode"
67 | }
68 | }
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | CFPropertyList (3.0.2)
5 | activesupport (5.2.4.4)
6 | concurrent-ruby (~> 1.0, >= 1.0.2)
7 | i18n (>= 0.7, < 2)
8 | minitest (~> 5.1)
9 | tzinfo (~> 1.1)
10 | addressable (2.8.0)
11 | public_suffix (>= 2.0.2, < 5.0)
12 | algoliasearch (1.27.4)
13 | httpclient (~> 2.8, >= 2.8.3)
14 | json (>= 1.5.1)
15 | atomos (0.1.3)
16 | claide (1.0.3)
17 | cocoapods (1.10.0)
18 | addressable (~> 2.6)
19 | claide (>= 1.0.2, < 2.0)
20 | cocoapods-core (= 1.10.0)
21 | cocoapods-deintegrate (>= 1.0.3, < 2.0)
22 | cocoapods-downloader (>= 1.4.0, < 2.0)
23 | cocoapods-plugins (>= 1.0.0, < 2.0)
24 | cocoapods-search (>= 1.0.0, < 2.0)
25 | cocoapods-trunk (>= 1.4.0, < 2.0)
26 | cocoapods-try (>= 1.1.0, < 2.0)
27 | colored2 (~> 3.1)
28 | escape (~> 0.0.4)
29 | fourflusher (>= 2.3.0, < 3.0)
30 | gh_inspector (~> 1.0)
31 | molinillo (~> 0.6.6)
32 | nap (~> 1.0)
33 | ruby-macho (~> 1.4)
34 | xcodeproj (>= 1.19.0, < 2.0)
35 | cocoapods-core (1.10.0)
36 | activesupport (> 5.0, < 6)
37 | addressable (~> 2.6)
38 | algoliasearch (~> 1.0)
39 | concurrent-ruby (~> 1.1)
40 | fuzzy_match (~> 2.0.4)
41 | nap (~> 1.0)
42 | netrc (~> 0.11)
43 | public_suffix
44 | typhoeus (~> 1.0)
45 | cocoapods-deintegrate (1.0.4)
46 | cocoapods-downloader (1.4.0)
47 | cocoapods-plugins (1.0.0)
48 | nap
49 | cocoapods-search (1.0.0)
50 | cocoapods-trunk (1.5.0)
51 | nap (>= 0.8, < 2.0)
52 | netrc (~> 0.11)
53 | cocoapods-try (1.2.0)
54 | colored2 (3.1.2)
55 | concurrent-ruby (1.1.7)
56 | escape (0.0.4)
57 | ethon (0.12.0)
58 | ffi (>= 1.3.0)
59 | ffi (1.13.1)
60 | fourflusher (2.3.1)
61 | fuzzy_match (2.0.4)
62 | gh_inspector (1.1.3)
63 | httpclient (2.8.3)
64 | i18n (1.8.5)
65 | concurrent-ruby (~> 1.0)
66 | json (2.3.1)
67 | minitest (5.14.2)
68 | molinillo (0.6.6)
69 | nanaimo (0.3.0)
70 | nap (1.1.0)
71 | netrc (0.11.0)
72 | public_suffix (4.0.6)
73 | ruby-macho (1.4.0)
74 | thread_safe (0.3.6)
75 | typhoeus (1.4.0)
76 | ethon (>= 0.9.0)
77 | tzinfo (1.2.7)
78 | thread_safe (~> 0.1)
79 | xcodeproj (1.19.0)
80 | CFPropertyList (>= 2.3.3, < 4.0)
81 | atomos (~> 0.1.3)
82 | claide (>= 1.0.2, < 2.0)
83 | colored2 (~> 3.1)
84 | nanaimo (~> 0.3.0)
85 |
86 | PLATFORMS
87 | ruby
88 |
89 | DEPENDENCIES
90 | cocoapods
91 |
92 | BUNDLED WITH
93 | 2.1.4
94 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by https://www.gitignore.io/api/swift,macos,windows
2 | # Edit at https://www.gitignore.io/?templates=swift,macos,windows
3 |
4 | ### Windows ###
5 | # Windows thumbnail cache files
6 | Thumbs.db
7 | Thumbs.db:encryptable
8 | ehthumbs.db
9 | ehthumbs_vista.db
10 |
11 | # Dump file
12 | *.stackdump
13 |
14 | # Folder config file
15 | [Dd]esktop.ini
16 |
17 | # Recycle Bin used on file shares
18 | $RECYCLE.BIN/
19 |
20 | # Windows Installer files
21 | *.cab
22 | *.msi
23 | *.msix
24 | *.msm
25 | *.msp
26 |
27 | # Windows shortcuts
28 | *.lnk
29 |
30 | ### macOS ###
31 | # General
32 | .DS_Store
33 | .AppleDouble
34 | .LSOverride
35 |
36 | # Icon must end with two \r
37 | Icon
38 |
39 | # Thumbnails
40 | ._*
41 |
42 | # Files that might appear in the root of a volume
43 | .DocumentRevisions-V100
44 | .fseventsd
45 | .Spotlight-V100
46 | .TemporaryItems
47 | .Trashes
48 | .VolumeIcon.icns
49 | .com.apple.timemachine.donotpresent
50 |
51 | # Directories potentially created on remote AFP share
52 | .AppleDB
53 | .AppleDesktop
54 | Network Trash Folder
55 | Temporary Items
56 | .apdisk
57 |
58 | ### Swift ###
59 | # Xcode
60 | #
61 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
62 |
63 | ## Build generated
64 | build/
65 | DerivedData/
66 |
67 | ## Various settings
68 | *.pbxuser
69 | !default.pbxuser
70 | *.mode1v3
71 | !default.mode1v3
72 | *.mode2v3
73 | !default.mode2v3
74 | *.perspectivev3
75 | !default.perspectivev3
76 | xcuserdata/
77 |
78 | ## Other
79 | *.moved-aside
80 | *.xccheckout
81 | *.xcscmblueprint
82 |
83 | ## Obj-C/Swift specific
84 | *.hmap
85 | *.ipa
86 | *.dSYM.zip
87 | *.dSYM
88 |
89 | ## Playgrounds
90 | timeline.xctimeline
91 | playground.xcworkspace
92 |
93 | # Swift Package Manager
94 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
95 | # Packages/
96 | # Package.pins
97 | # Package.resolved
98 | .build/
99 | # Add this line if you want to avoid checking in Xcode SPM integration.
100 | # .swiftpm/xcode
101 |
102 | # CocoaPods
103 | # We recommend against adding the Pods directory to your .gitignore. However
104 | # you should judge for yourself, the pros and cons are mentioned at:
105 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
106 | Pods/
107 | # Add this line if you want to avoid checking in source code from the Xcode workspace
108 | *.xcworkspace
109 |
110 | # Carthage
111 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
112 | # Carthage/Checkouts
113 |
114 | Carthage/Build
115 |
116 | # Accio dependency management
117 | Dependencies/
118 | .accio/
119 |
120 | # fastlane
121 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
122 | # screenshots whenever they are needed.
123 | # For more information about the recommended setup visit:
124 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
125 |
126 | fastlane/report.xml
127 | fastlane/Preview.html
128 | fastlane/screenshots/**/*.png
129 | fastlane/test_output
130 |
131 | # Code Injection
132 | # After new code Injection tools there's a generated folder /iOSInjectionProject
133 | # https://github.com/johnno1962/injectionforxcode
134 |
135 | iOSInjectionProject/
136 |
137 | ### Ruby ###
138 | Gems/
139 |
140 | # End of https://www.gitignore.io/api/swift,macos,windows
141 |
--------------------------------------------------------------------------------
/AppleReserver/MainViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainViewController.swift
3 | // AppleReserver
4 | //
5 | // Created by Sunnyyoung on 2017/9/19.
6 | // Copyright © 2017年 Sunnyyoung. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 | import Alamofire
11 |
12 | class MainViewController: NSViewController {
13 | @IBOutlet weak var storeTableView: NSTableView!
14 | @IBOutlet weak var availabilityTableView: NSTableView!
15 | @IBOutlet weak var notificationButton: NSButton!
16 | @IBOutlet weak var timerIntervalButton: NSPopUpButton!
17 | @IBOutlet weak var fireButton: NSButton!
18 | @IBOutlet weak var indicator: NSProgressIndicator!
19 |
20 | fileprivate var products: [Product]?
21 | fileprivate var stores: [Store]?
22 | fileprivate var availabilities: [Availability]? {
23 | didSet {
24 | guard let availabilities = self.availabilities, self.notificationButton.state == .on else {
25 | return
26 | }
27 | for selectedPartNumber in self.selectedPartNumbers {
28 | guard let availability = availabilities.first(where: { $0.partNumber == selectedPartNumber }),
29 | availability.contract || availability.unlocked else {
30 | return
31 | }
32 | let notification = NSUserNotification()
33 | notification.informativeText = "\(availability.partNumber) 有货啦!!!"
34 | notification.soundName = NSUserNotificationDefaultSoundName
35 | NSUserNotificationCenter.default.deliver(notification)
36 | }
37 | }
38 | }
39 |
40 | fileprivate var selectedStore: Store?
41 | fileprivate var selectedPartNumbers: Set = []
42 |
43 | fileprivate var pollingTimer: Timer?
44 | fileprivate var reserveURL: URL?
45 |
46 | override func viewDidLoad() {
47 | super.viewDidLoad()
48 | self.loadProducts()
49 | self.loadStores()
50 | }
51 |
52 | // MARK: Load method
53 | func loadProducts() {
54 | guard let fileURL = Bundle.main.url(forResource: "Products", withExtension: "json") else {
55 | return
56 | }
57 | do {
58 | let fileData = try Data.init(contentsOf: fileURL)
59 | self.products = try JSONDecoder().decode([Product].self, from: fileData)
60 | } catch {
61 | NSAlert(error: error).runModal()
62 | }
63 | }
64 |
65 | func loadStores() {
66 | Alamofire.request(AppleURL.stores).responseJSON { (response) in
67 | do {
68 | if let error = response.error {
69 | throw error
70 | } else {
71 | guard let values = (response.value as? [String: Any])?["stores"] else {
72 | return
73 | }
74 | let data = try JSONSerialization.data(withJSONObject: values, options: [])
75 | self.stores = try JSONDecoder().decode([Store].self, from: data)
76 | self.storeTableView.reloadData()
77 | }
78 | } catch {
79 | NSAlert(error: error).runModal()
80 | }
81 | }
82 | }
83 |
84 | @objc private func reloadAvailability() {
85 | Alamofire.request(AppleURL.availability).responseJSON { (response) in
86 | do {
87 | if let error = response.error {
88 | throw error
89 | } else {
90 | guard
91 | let storeNumber = self.selectedStore?.storeNumber,
92 | let values = ((response.value as? [String: Any])?["stores"] as? [String: Any])?[storeNumber] as? [String: [String: [String: Bool]]]
93 | else {
94 | return
95 | }
96 | self.availabilities = values.compactMap({ Availability(key: $0.key, value: $0.value) })
97 | self.availabilityTableView.reloadData()
98 | }
99 | } catch {
100 | NSAlert(error: error).runModal()
101 | }
102 | }
103 | }
104 |
105 | // MARK: Event method
106 | @IBAction func fireAction(_ sender: NSButton) {
107 | let interval = Double(self.timerIntervalButton.titleOfSelectedItem ?? "3") ?? 3.0
108 | if self.pollingTimer?.isValid == true {
109 | sender.title = "开始"
110 | self.storeTableView.isEnabled = true
111 | self.timerIntervalButton.isEnabled = true
112 | self.indicator.stopAnimation(sender)
113 | self.pollingTimer = {
114 | self.pollingTimer?.invalidate()
115 | return nil
116 | }()
117 | } else {
118 | sender.title = "停止"
119 | self.storeTableView.isEnabled = false
120 | self.timerIntervalButton.isEnabled = false
121 | self.indicator.startAnimation(sender)
122 | self.pollingTimer = {
123 | let timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(reloadAvailability), userInfo: nil, repeats: true)
124 | timer.fire()
125 | return timer
126 | }()
127 | }
128 | }
129 |
130 | @IBAction func reserveAction(_ sender: NSTableView) {
131 | guard let url = self.reserveURL, sender.selectedRow >= 0 else {
132 | return
133 | }
134 | NSWorkspace.shared.open(url)
135 | }
136 | }
137 |
138 | extension MainViewController: NSTableViewDataSource, NSTableViewDelegate {
139 | func numberOfRows(in tableView: NSTableView) -> Int {
140 | if tableView == self.storeTableView {
141 | return self.stores?.count ?? 0
142 | } else if tableView == self.availabilityTableView {
143 | return self.availabilities?.count ?? 0
144 | } else {
145 | return 0
146 | }
147 | }
148 |
149 | func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
150 | if tableView == self.storeTableView {
151 | return self.stores?[row].storeName
152 | } else if tableView == self.availabilityTableView {
153 | guard let identifier = tableColumn?.identifier.rawValue,
154 | let availability = self.availabilities?[row],
155 | let product = self.products?.first(where: { $0.partNumber == availability.partNumber }) else {
156 | return nil
157 | }
158 | switch identifier {
159 | case "Monitoring":
160 | return self.selectedPartNumbers.contains(availability.partNumber)
161 | case "PartNumber":
162 | return availability.partNumber
163 | case "Description":
164 | return product.productTitle
165 | case "Capacity":
166 | return product.dimensionCapacity.uppercased()
167 | case "Status":
168 | return (availability.contract || availability.unlocked) ? "有货" : "无货"
169 | default:
170 | return nil
171 | }
172 | } else {
173 | return nil
174 | }
175 | }
176 |
177 | func tableView(_ tableView: NSTableView, setObjectValue object: Any?, for tableColumn: NSTableColumn?, row: Int) {
178 | guard let partNumber = self.availabilities?[row].partNumber, let selected = object as? Bool else {
179 | return
180 | }
181 | if selected {
182 | self.selectedPartNumbers.insert(partNumber)
183 | } else {
184 | self.selectedPartNumbers.remove(partNumber)
185 | }
186 | }
187 |
188 | func tableViewSelectionDidChange(_ notification: Notification) {
189 | guard let tableView = notification.object as? NSTableView, tableView.selectedRow >= 0 else {
190 | return
191 | }
192 | if tableView == self.storeTableView {
193 | self.selectedStore = self.stores?[tableView.selectedRow]
194 | self.selectedPartNumbers.removeAll()
195 | self.availabilityTableView.deselectAll(nil)
196 | self.reloadAvailability()
197 | } else if tableView == self.availabilityTableView {
198 | guard let storeNumber = self.selectedStore?.storeNumber,
199 | let partNumber = self.availabilities?[tableView.selectedRow].partNumber else {
200 | return
201 | }
202 | self.reserveURL = URL(string: "https://reserve-prime.apple.com/CN/zh_CN/reserve/A/availability?path=/cn/shop/buy-iphone/iphone-11-pro\(storeNumber)&partNumber=\(partNumber)")
203 | }
204 | }
205 | }
206 |
--------------------------------------------------------------------------------
/AppleReserver.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 7D11BD8D1F7154C100C8CAAA /* Product.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D11BD8C1F7154C100C8CAAA /* Product.swift */; };
11 | 7DF748221F70F3D000949D8E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF748211F70F3D000949D8E /* AppDelegate.swift */; };
12 | 7DF748261F70F3D000949D8E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7DF748251F70F3D000949D8E /* Assets.xcassets */; };
13 | 7DF748291F70F3D000949D8E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7DF748271F70F3D000949D8E /* Main.storyboard */; };
14 | 7DF748361F70F66800949D8E /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF748351F70F66800949D8E /* MainViewController.swift */; };
15 | 7DF748381F70F7CC00949D8E /* Store.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF748371F70F7CC00949D8E /* Store.swift */; };
16 | 7DF7483B1F70FB6D00949D8E /* Constant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF7483A1F70FB6D00949D8E /* Constant.swift */; };
17 | 7DF7483D1F70FCC400949D8E /* MainWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF7483C1F70FCC400949D8E /* MainWindowController.swift */; };
18 | 7DF748421F71240C00949D8E /* Availability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF748411F71240C00949D8E /* Availability.swift */; };
19 | 7DF748441F71289600949D8E /* Products.json in Resources */ = {isa = PBXBuildFile; fileRef = 7DF748431F71289600949D8E /* Products.json */; };
20 | 7DF748461F7128B700949D8E /* Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF748451F7128B700949D8E /* Device.swift */; };
21 | B97DFD65E4E74ACA1B3DE986 /* Pods_AppleReserver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 597DDD580CC45B36A2687C55 /* Pods_AppleReserver.framework */; };
22 | /* End PBXBuildFile section */
23 |
24 | /* Begin PBXFileReference section */
25 | 0A22BD26D8A0614EE0AB6B2F /* Pods-AppleReserver.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppleReserver.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AppleReserver/Pods-AppleReserver.debug.xcconfig"; sourceTree = ""; };
26 | 49A7ABB83FFA27EE2FCEA332 /* Pods-AppleReserver.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppleReserver.release.xcconfig"; path = "Pods/Target Support Files/Pods-AppleReserver/Pods-AppleReserver.release.xcconfig"; sourceTree = ""; };
27 | 597DDD580CC45B36A2687C55 /* Pods_AppleReserver.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AppleReserver.framework; sourceTree = BUILT_PRODUCTS_DIR; };
28 | 7D11BD8C1F7154C100C8CAAA /* Product.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Product.swift; sourceTree = ""; };
29 | 7DF7481E1F70F3D000949D8E /* AppleReserver.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AppleReserver.app; sourceTree = BUILT_PRODUCTS_DIR; };
30 | 7DF748211F70F3D000949D8E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
31 | 7DF748251F70F3D000949D8E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
32 | 7DF748281F70F3D000949D8E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
33 | 7DF7482A1F70F3D000949D8E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
34 | 7DF748351F70F66800949D8E /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; };
35 | 7DF748371F70F7CC00949D8E /* Store.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Store.swift; sourceTree = ""; };
36 | 7DF7483A1F70FB6D00949D8E /* Constant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constant.swift; sourceTree = ""; };
37 | 7DF7483C1F70FCC400949D8E /* MainWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainWindowController.swift; sourceTree = ""; };
38 | 7DF748411F71240C00949D8E /* Availability.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Availability.swift; sourceTree = ""; };
39 | 7DF748431F71289600949D8E /* Products.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Products.json; sourceTree = ""; };
40 | 7DF748451F7128B700949D8E /* Device.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Device.swift; sourceTree = ""; };
41 | /* End PBXFileReference section */
42 |
43 | /* Begin PBXFrameworksBuildPhase section */
44 | 7DF7481B1F70F3D000949D8E /* Frameworks */ = {
45 | isa = PBXFrameworksBuildPhase;
46 | buildActionMask = 2147483647;
47 | files = (
48 | B97DFD65E4E74ACA1B3DE986 /* Pods_AppleReserver.framework in Frameworks */,
49 | );
50 | runOnlyForDeploymentPostprocessing = 0;
51 | };
52 | /* End PBXFrameworksBuildPhase section */
53 |
54 | /* Begin PBXGroup section */
55 | 15C17FC1510552A5897398D0 /* Pods */ = {
56 | isa = PBXGroup;
57 | children = (
58 | 0A22BD26D8A0614EE0AB6B2F /* Pods-AppleReserver.debug.xcconfig */,
59 | 49A7ABB83FFA27EE2FCEA332 /* Pods-AppleReserver.release.xcconfig */,
60 | );
61 | name = Pods;
62 | sourceTree = "";
63 | };
64 | 7DF748151F70F3D000949D8E = {
65 | isa = PBXGroup;
66 | children = (
67 | 7DF748201F70F3D000949D8E /* AppleReserver */,
68 | 7DF7481F1F70F3D000949D8E /* Products */,
69 | 15C17FC1510552A5897398D0 /* Pods */,
70 | 86149565ADBBC8E56751FBD8 /* Frameworks */,
71 | );
72 | sourceTree = "";
73 | };
74 | 7DF7481F1F70F3D000949D8E /* Products */ = {
75 | isa = PBXGroup;
76 | children = (
77 | 7DF7481E1F70F3D000949D8E /* AppleReserver.app */,
78 | );
79 | name = Products;
80 | sourceTree = "";
81 | };
82 | 7DF748201F70F3D000949D8E /* AppleReserver */ = {
83 | isa = PBXGroup;
84 | children = (
85 | 7DF748211F70F3D000949D8E /* AppDelegate.swift */,
86 | 7DF748271F70F3D000949D8E /* Main.storyboard */,
87 | 7DF748251F70F3D000949D8E /* Assets.xcassets */,
88 | 7DF748321F70F63900949D8E /* Module */,
89 | 7DF748301F70F4ED00949D8E /* Supporting Files */,
90 | );
91 | path = AppleReserver;
92 | sourceTree = "";
93 | };
94 | 7DF748301F70F4ED00949D8E /* Supporting Files */ = {
95 | isa = PBXGroup;
96 | children = (
97 | 7DF748431F71289600949D8E /* Products.json */,
98 | 7DF7482A1F70F3D000949D8E /* Info.plist */,
99 | );
100 | name = "Supporting Files";
101 | sourceTree = "";
102 | };
103 | 7DF748311F70F63100949D8E /* Controller */ = {
104 | isa = PBXGroup;
105 | children = (
106 | 7DF7483C1F70FCC400949D8E /* MainWindowController.swift */,
107 | 7DF748351F70F66800949D8E /* MainViewController.swift */,
108 | );
109 | name = Controller;
110 | sourceTree = "";
111 | };
112 | 7DF748321F70F63900949D8E /* Module */ = {
113 | isa = PBXGroup;
114 | children = (
115 | 7DF748391F70FB5B00949D8E /* Constant */,
116 | 7DF748331F70F64800949D8E /* Model */,
117 | 7DF748311F70F63100949D8E /* Controller */,
118 | );
119 | name = Module;
120 | sourceTree = "";
121 | };
122 | 7DF748331F70F64800949D8E /* Model */ = {
123 | isa = PBXGroup;
124 | children = (
125 | 7DF748371F70F7CC00949D8E /* Store.swift */,
126 | 7DF748411F71240C00949D8E /* Availability.swift */,
127 | 7DF748451F7128B700949D8E /* Device.swift */,
128 | 7D11BD8C1F7154C100C8CAAA /* Product.swift */,
129 | );
130 | name = Model;
131 | sourceTree = "";
132 | };
133 | 7DF748391F70FB5B00949D8E /* Constant */ = {
134 | isa = PBXGroup;
135 | children = (
136 | 7DF7483A1F70FB6D00949D8E /* Constant.swift */,
137 | );
138 | name = Constant;
139 | sourceTree = "";
140 | };
141 | 86149565ADBBC8E56751FBD8 /* Frameworks */ = {
142 | isa = PBXGroup;
143 | children = (
144 | 597DDD580CC45B36A2687C55 /* Pods_AppleReserver.framework */,
145 | );
146 | name = Frameworks;
147 | sourceTree = "";
148 | };
149 | /* End PBXGroup section */
150 |
151 | /* Begin PBXNativeTarget section */
152 | 7DF7481D1F70F3D000949D8E /* AppleReserver */ = {
153 | isa = PBXNativeTarget;
154 | buildConfigurationList = 7DF7482D1F70F3D000949D8E /* Build configuration list for PBXNativeTarget "AppleReserver" */;
155 | buildPhases = (
156 | BEC73449C094493EE65914CD /* [CP] Check Pods Manifest.lock */,
157 | 7DF7481A1F70F3D000949D8E /* Sources */,
158 | 7DF7481B1F70F3D000949D8E /* Frameworks */,
159 | 7DF7481C1F70F3D000949D8E /* Resources */,
160 | 283B069508CC4032A00F1335 /* [CP] Embed Pods Frameworks */,
161 | );
162 | buildRules = (
163 | );
164 | dependencies = (
165 | );
166 | name = AppleReserver;
167 | productName = AppleReserver;
168 | productReference = 7DF7481E1F70F3D000949D8E /* AppleReserver.app */;
169 | productType = "com.apple.product-type.application";
170 | };
171 | /* End PBXNativeTarget section */
172 |
173 | /* Begin PBXProject section */
174 | 7DF748161F70F3D000949D8E /* Project object */ = {
175 | isa = PBXProject;
176 | attributes = {
177 | LastSwiftUpdateCheck = 0830;
178 | LastUpgradeCheck = 1200;
179 | ORGANIZATIONNAME = Sunnyyoung;
180 | TargetAttributes = {
181 | 7DF7481D1F70F3D000949D8E = {
182 | CreatedOnToolsVersion = 8.3.3;
183 | ProvisioningStyle = Automatic;
184 | };
185 | };
186 | };
187 | buildConfigurationList = 7DF748191F70F3D000949D8E /* Build configuration list for PBXProject "AppleReserver" */;
188 | compatibilityVersion = "Xcode 3.2";
189 | developmentRegion = en;
190 | hasScannedForEncodings = 0;
191 | knownRegions = (
192 | en,
193 | Base,
194 | );
195 | mainGroup = 7DF748151F70F3D000949D8E;
196 | productRefGroup = 7DF7481F1F70F3D000949D8E /* Products */;
197 | projectDirPath = "";
198 | projectRoot = "";
199 | targets = (
200 | 7DF7481D1F70F3D000949D8E /* AppleReserver */,
201 | );
202 | };
203 | /* End PBXProject section */
204 |
205 | /* Begin PBXResourcesBuildPhase section */
206 | 7DF7481C1F70F3D000949D8E /* Resources */ = {
207 | isa = PBXResourcesBuildPhase;
208 | buildActionMask = 2147483647;
209 | files = (
210 | 7DF748261F70F3D000949D8E /* Assets.xcassets in Resources */,
211 | 7DF748441F71289600949D8E /* Products.json in Resources */,
212 | 7DF748291F70F3D000949D8E /* Main.storyboard in Resources */,
213 | );
214 | runOnlyForDeploymentPostprocessing = 0;
215 | };
216 | /* End PBXResourcesBuildPhase section */
217 |
218 | /* Begin PBXShellScriptBuildPhase section */
219 | 283B069508CC4032A00F1335 /* [CP] Embed Pods Frameworks */ = {
220 | isa = PBXShellScriptBuildPhase;
221 | buildActionMask = 2147483647;
222 | files = (
223 | );
224 | inputPaths = (
225 | "${PODS_ROOT}/Target Support Files/Pods-AppleReserver/Pods-AppleReserver-frameworks.sh",
226 | "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework",
227 | );
228 | name = "[CP] Embed Pods Frameworks";
229 | outputPaths = (
230 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework",
231 | );
232 | runOnlyForDeploymentPostprocessing = 0;
233 | shellPath = /bin/sh;
234 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AppleReserver/Pods-AppleReserver-frameworks.sh\"\n";
235 | showEnvVarsInLog = 0;
236 | };
237 | BEC73449C094493EE65914CD /* [CP] Check Pods Manifest.lock */ = {
238 | isa = PBXShellScriptBuildPhase;
239 | buildActionMask = 2147483647;
240 | files = (
241 | );
242 | inputPaths = (
243 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
244 | "${PODS_ROOT}/Manifest.lock",
245 | );
246 | name = "[CP] Check Pods Manifest.lock";
247 | outputPaths = (
248 | "$(DERIVED_FILE_DIR)/Pods-AppleReserver-checkManifestLockResult.txt",
249 | );
250 | runOnlyForDeploymentPostprocessing = 0;
251 | shellPath = /bin/sh;
252 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
253 | showEnvVarsInLog = 0;
254 | };
255 | /* End PBXShellScriptBuildPhase section */
256 |
257 | /* Begin PBXSourcesBuildPhase section */
258 | 7DF7481A1F70F3D000949D8E /* Sources */ = {
259 | isa = PBXSourcesBuildPhase;
260 | buildActionMask = 2147483647;
261 | files = (
262 | 7DF748421F71240C00949D8E /* Availability.swift in Sources */,
263 | 7D11BD8D1F7154C100C8CAAA /* Product.swift in Sources */,
264 | 7DF748381F70F7CC00949D8E /* Store.swift in Sources */,
265 | 7DF748221F70F3D000949D8E /* AppDelegate.swift in Sources */,
266 | 7DF748361F70F66800949D8E /* MainViewController.swift in Sources */,
267 | 7DF7483B1F70FB6D00949D8E /* Constant.swift in Sources */,
268 | 7DF748461F7128B700949D8E /* Device.swift in Sources */,
269 | 7DF7483D1F70FCC400949D8E /* MainWindowController.swift in Sources */,
270 | );
271 | runOnlyForDeploymentPostprocessing = 0;
272 | };
273 | /* End PBXSourcesBuildPhase section */
274 |
275 | /* Begin PBXVariantGroup section */
276 | 7DF748271F70F3D000949D8E /* Main.storyboard */ = {
277 | isa = PBXVariantGroup;
278 | children = (
279 | 7DF748281F70F3D000949D8E /* Base */,
280 | );
281 | name = Main.storyboard;
282 | sourceTree = "";
283 | };
284 | /* End PBXVariantGroup section */
285 |
286 | /* Begin XCBuildConfiguration section */
287 | 7DF7482B1F70F3D000949D8E /* Debug */ = {
288 | isa = XCBuildConfiguration;
289 | buildSettings = {
290 | ALWAYS_SEARCH_USER_PATHS = NO;
291 | CLANG_ANALYZER_NONNULL = YES;
292 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
293 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
294 | CLANG_CXX_LIBRARY = "libc++";
295 | CLANG_ENABLE_MODULES = YES;
296 | CLANG_ENABLE_OBJC_ARC = YES;
297 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
298 | CLANG_WARN_BOOL_CONVERSION = YES;
299 | CLANG_WARN_COMMA = YES;
300 | CLANG_WARN_CONSTANT_CONVERSION = YES;
301 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
302 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
303 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
304 | CLANG_WARN_EMPTY_BODY = YES;
305 | CLANG_WARN_ENUM_CONVERSION = YES;
306 | CLANG_WARN_INFINITE_RECURSION = YES;
307 | CLANG_WARN_INT_CONVERSION = YES;
308 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
309 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
310 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
311 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
312 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
313 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
314 | CLANG_WARN_STRICT_PROTOTYPES = YES;
315 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
316 | CLANG_WARN_UNREACHABLE_CODE = YES;
317 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
318 | CODE_SIGN_IDENTITY = "-";
319 | COPY_PHASE_STRIP = NO;
320 | CURRENT_PROJECT_VERSION = 10;
321 | DEBUG_INFORMATION_FORMAT = dwarf;
322 | ENABLE_STRICT_OBJC_MSGSEND = YES;
323 | ENABLE_TESTABILITY = YES;
324 | GCC_C_LANGUAGE_STANDARD = gnu99;
325 | GCC_DYNAMIC_NO_PIC = NO;
326 | GCC_NO_COMMON_BLOCKS = YES;
327 | GCC_OPTIMIZATION_LEVEL = 0;
328 | GCC_PREPROCESSOR_DEFINITIONS = (
329 | "DEBUG=1",
330 | "$(inherited)",
331 | );
332 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
333 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
334 | GCC_WARN_UNDECLARED_SELECTOR = YES;
335 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
336 | GCC_WARN_UNUSED_FUNCTION = YES;
337 | GCC_WARN_UNUSED_VARIABLE = YES;
338 | MACOSX_DEPLOYMENT_TARGET = 10.13;
339 | MTL_ENABLE_DEBUG_INFO = YES;
340 | ONLY_ACTIVE_ARCH = YES;
341 | SDKROOT = macosx;
342 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
343 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
344 | VERSIONING_SYSTEM = "apple-generic";
345 | };
346 | name = Debug;
347 | };
348 | 7DF7482C1F70F3D000949D8E /* Release */ = {
349 | isa = XCBuildConfiguration;
350 | buildSettings = {
351 | ALWAYS_SEARCH_USER_PATHS = NO;
352 | CLANG_ANALYZER_NONNULL = YES;
353 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
354 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
355 | CLANG_CXX_LIBRARY = "libc++";
356 | CLANG_ENABLE_MODULES = YES;
357 | CLANG_ENABLE_OBJC_ARC = YES;
358 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
359 | CLANG_WARN_BOOL_CONVERSION = YES;
360 | CLANG_WARN_COMMA = YES;
361 | CLANG_WARN_CONSTANT_CONVERSION = YES;
362 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
363 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
364 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
365 | CLANG_WARN_EMPTY_BODY = YES;
366 | CLANG_WARN_ENUM_CONVERSION = YES;
367 | CLANG_WARN_INFINITE_RECURSION = YES;
368 | CLANG_WARN_INT_CONVERSION = YES;
369 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
370 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
371 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
372 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
373 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
374 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
375 | CLANG_WARN_STRICT_PROTOTYPES = YES;
376 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
377 | CLANG_WARN_UNREACHABLE_CODE = YES;
378 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
379 | CODE_SIGN_IDENTITY = "-";
380 | COPY_PHASE_STRIP = NO;
381 | CURRENT_PROJECT_VERSION = 10;
382 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
383 | ENABLE_NS_ASSERTIONS = NO;
384 | ENABLE_STRICT_OBJC_MSGSEND = YES;
385 | GCC_C_LANGUAGE_STANDARD = gnu99;
386 | GCC_NO_COMMON_BLOCKS = YES;
387 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
388 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
389 | GCC_WARN_UNDECLARED_SELECTOR = YES;
390 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
391 | GCC_WARN_UNUSED_FUNCTION = YES;
392 | GCC_WARN_UNUSED_VARIABLE = YES;
393 | MACOSX_DEPLOYMENT_TARGET = 10.13;
394 | MTL_ENABLE_DEBUG_INFO = NO;
395 | SDKROOT = macosx;
396 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
397 | VERSIONING_SYSTEM = "apple-generic";
398 | };
399 | name = Release;
400 | };
401 | 7DF7482E1F70F3D000949D8E /* Debug */ = {
402 | isa = XCBuildConfiguration;
403 | baseConfigurationReference = 0A22BD26D8A0614EE0AB6B2F /* Pods-AppleReserver.debug.xcconfig */;
404 | buildSettings = {
405 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
406 | CODE_SIGN_IDENTITY = "-";
407 | COMBINE_HIDPI_IMAGES = YES;
408 | DEVELOPMENT_TEAM = "";
409 | INFOPLIST_FILE = AppleReserver/Info.plist;
410 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
411 | MACOSX_DEPLOYMENT_TARGET = 10.11;
412 | PRODUCT_BUNDLE_IDENTIFIER = net.sunnyyoung.AppleReserver;
413 | PRODUCT_NAME = "$(TARGET_NAME)";
414 | SWIFT_VERSION = 5.0;
415 | };
416 | name = Debug;
417 | };
418 | 7DF7482F1F70F3D000949D8E /* Release */ = {
419 | isa = XCBuildConfiguration;
420 | baseConfigurationReference = 49A7ABB83FFA27EE2FCEA332 /* Pods-AppleReserver.release.xcconfig */;
421 | buildSettings = {
422 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
423 | CODE_SIGN_IDENTITY = "-";
424 | COMBINE_HIDPI_IMAGES = YES;
425 | DEVELOPMENT_TEAM = "";
426 | INFOPLIST_FILE = AppleReserver/Info.plist;
427 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
428 | MACOSX_DEPLOYMENT_TARGET = 10.11;
429 | PRODUCT_BUNDLE_IDENTIFIER = net.sunnyyoung.AppleReserver;
430 | PRODUCT_NAME = "$(TARGET_NAME)";
431 | SWIFT_VERSION = 5.0;
432 | };
433 | name = Release;
434 | };
435 | /* End XCBuildConfiguration section */
436 |
437 | /* Begin XCConfigurationList section */
438 | 7DF748191F70F3D000949D8E /* Build configuration list for PBXProject "AppleReserver" */ = {
439 | isa = XCConfigurationList;
440 | buildConfigurations = (
441 | 7DF7482B1F70F3D000949D8E /* Debug */,
442 | 7DF7482C1F70F3D000949D8E /* Release */,
443 | );
444 | defaultConfigurationIsVisible = 0;
445 | defaultConfigurationName = Release;
446 | };
447 | 7DF7482D1F70F3D000949D8E /* Build configuration list for PBXNativeTarget "AppleReserver" */ = {
448 | isa = XCConfigurationList;
449 | buildConfigurations = (
450 | 7DF7482E1F70F3D000949D8E /* Debug */,
451 | 7DF7482F1F70F3D000949D8E /* Release */,
452 | );
453 | defaultConfigurationIsVisible = 0;
454 | defaultConfigurationName = Release;
455 | };
456 | /* End XCConfigurationList section */
457 | };
458 | rootObject = 7DF748161F70F3D000949D8E /* Project object */;
459 | }
460 |
--------------------------------------------------------------------------------
/AppleReserver/Products.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "productTitle": "iPhone 13 Pro 512GB 远峰蓝色",
4 | "basePartNumber": "MLTJ3",
5 | "image": "iphone-13-pro-blue-select",
6 | "dimensionCapacity": "512gb",
7 | "dimensionScreensize": "6_1inch",
8 | "price": "10399_00_unlocked",
9 | "partNumber": "MLTJ3CH/A",
10 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTJ3CH/A",
11 | "dimensionColor": "sierrablue"
12 | },
13 | {
14 | "productTitle": "iPhone 13 Pro 256GB 金色",
15 | "basePartNumber": "MLTD3",
16 | "image": "iphone-13-pro-gold-select",
17 | "dimensionCapacity": "256gb",
18 | "dimensionScreensize": "6_1inch",
19 | "price": "8799_00_unlocked",
20 | "partNumber": "MLTD3CH/A",
21 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTD3CH/A",
22 | "dimensionColor": "gold"
23 | },
24 | {
25 | "productTitle": "iPhone 13 Pro 1TB 银色",
26 | "basePartNumber": "MLTL3",
27 | "image": "iphone-13-pro-silver-select",
28 | "dimensionCapacity": "1tb",
29 | "dimensionScreensize": "6_1inch",
30 | "price": "11999_00_unlocked",
31 | "partNumber": "MLTL3CH/A",
32 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTL3CH/A",
33 | "dimensionColor": "silver"
34 | },
35 | {
36 | "productTitle": "iPhone 13 Pro 128GB 远峰蓝色",
37 | "basePartNumber": "MLT83",
38 | "image": "iphone-13-pro-blue-select",
39 | "dimensionCapacity": "128gb",
40 | "dimensionScreensize": "6_1inch",
41 | "price": "7999_00_unlocked",
42 | "partNumber": "MLT83CH/A",
43 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLT83CH/A",
44 | "dimensionColor": "sierrablue"
45 | },
46 | {
47 | "productTitle": "iPhone 13 Pro 128GB 银色",
48 | "basePartNumber": "MLT63",
49 | "image": "iphone-13-pro-silver-select",
50 | "dimensionCapacity": "128gb",
51 | "dimensionScreensize": "6_1inch",
52 | "price": "7999_00_unlocked",
53 | "partNumber": "MLT63CH/A",
54 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLT63CH/A",
55 | "dimensionColor": "silver"
56 | },
57 | {
58 | "productTitle": "iPhone 13 Pro 512GB 石墨色",
59 | "basePartNumber": "MLTF3",
60 | "image": "iphone-13-pro-graphite-select",
61 | "dimensionCapacity": "512gb",
62 | "dimensionScreensize": "6_1inch",
63 | "price": "10399_00_unlocked",
64 | "partNumber": "MLTF3CH/A",
65 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTF3CH/A",
66 | "dimensionColor": "graphite"
67 | },
68 | {
69 | "productTitle": "iPhone 13 Pro 256GB 石墨色",
70 | "basePartNumber": "MLT93",
71 | "image": "iphone-13-pro-graphite-select",
72 | "dimensionCapacity": "256gb",
73 | "dimensionScreensize": "6_1inch",
74 | "price": "8799_00_unlocked",
75 | "partNumber": "MLT93CH/A",
76 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLT93CH/A",
77 | "dimensionColor": "graphite"
78 | },
79 | {
80 | "productTitle": "iPhone 13 Pro 256GB 远峰蓝色",
81 | "basePartNumber": "MLTE3",
82 | "image": "iphone-13-pro-blue-select",
83 | "dimensionCapacity": "256gb",
84 | "dimensionScreensize": "6_1inch",
85 | "price": "8799_00_unlocked",
86 | "partNumber": "MLTE3CH/A",
87 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTE3CH/A",
88 | "dimensionColor": "sierrablue"
89 | },
90 | {
91 | "productTitle": "iPhone 13 Pro 128GB 金色",
92 | "basePartNumber": "MLT73",
93 | "image": "iphone-13-pro-gold-select",
94 | "dimensionCapacity": "128gb",
95 | "dimensionScreensize": "6_1inch",
96 | "price": "7999_00_unlocked",
97 | "partNumber": "MLT73CH/A",
98 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLT73CH/A",
99 | "dimensionColor": "gold"
100 | },
101 | {
102 | "productTitle": "iPhone 13 Pro 128GB 石墨色",
103 | "basePartNumber": "MLT53",
104 | "image": "iphone-13-pro-graphite-select",
105 | "dimensionCapacity": "128gb",
106 | "dimensionScreensize": "6_1inch",
107 | "price": "7999_00_unlocked",
108 | "partNumber": "MLT53CH/A",
109 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLT53CH/A",
110 | "dimensionColor": "graphite"
111 | },
112 | {
113 | "productTitle": "iPhone 13 Pro 1TB 金色",
114 | "basePartNumber": "MLTM3",
115 | "image": "iphone-13-pro-gold-select",
116 | "dimensionCapacity": "1tb",
117 | "dimensionScreensize": "6_1inch",
118 | "price": "11999_00_unlocked",
119 | "partNumber": "MLTM3CH/A",
120 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTM3CH/A",
121 | "dimensionColor": "gold"
122 | },
123 | {
124 | "productTitle": "iPhone 13 Pro 512GB 银色",
125 | "basePartNumber": "MLTG3",
126 | "image": "iphone-13-pro-silver-select",
127 | "dimensionCapacity": "512gb",
128 | "dimensionScreensize": "6_1inch",
129 | "price": "10399_00_unlocked",
130 | "partNumber": "MLTG3CH/A",
131 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTG3CH/A",
132 | "dimensionColor": "silver"
133 | },
134 | {
135 | "productTitle": "iPhone 13 Pro 1TB 远峰蓝色",
136 | "basePartNumber": "MLTN3",
137 | "image": "iphone-13-pro-blue-select",
138 | "dimensionCapacity": "1tb",
139 | "dimensionScreensize": "6_1inch",
140 | "price": "11999_00_unlocked",
141 | "partNumber": "MLTN3CH/A",
142 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTN3CH/A",
143 | "dimensionColor": "sierrablue"
144 | },
145 | {
146 | "productTitle": "iPhone 13 Pro 1TB 石墨色",
147 | "basePartNumber": "MLTK3",
148 | "image": "iphone-13-pro-graphite-select",
149 | "dimensionCapacity": "1tb",
150 | "dimensionScreensize": "6_1inch",
151 | "price": "11999_00_unlocked",
152 | "partNumber": "MLTK3CH/A",
153 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTK3CH/A",
154 | "dimensionColor": "graphite"
155 | },
156 | {
157 | "productTitle": "iPhone 13 Pro 512GB 金色",
158 | "basePartNumber": "MLTH3",
159 | "image": "iphone-13-pro-gold-select",
160 | "dimensionCapacity": "512gb",
161 | "dimensionScreensize": "6_1inch",
162 | "price": "10399_00_unlocked",
163 | "partNumber": "MLTH3CH/A",
164 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTH3CH/A",
165 | "dimensionColor": "gold"
166 | },
167 | {
168 | "productTitle": "iPhone 13 Pro 256GB 银色",
169 | "basePartNumber": "MLTC3",
170 | "image": "iphone-13-pro-silver-select",
171 | "dimensionCapacity": "256gb",
172 | "dimensionScreensize": "6_1inch",
173 | "price": "8799_00_unlocked",
174 | "partNumber": "MLTC3CH/A",
175 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTC3CH/A",
176 | "dimensionColor": "silver"
177 | },
178 | {
179 | "productTitle": "iPhone 13 Pro Max 1TB 金色",
180 | "basePartNumber": "MLHK3",
181 | "image": "iphone-13-pro-max-gold-select",
182 | "dimensionCapacity": "1tb",
183 | "dimensionScreensize": "6_7inch",
184 | "price": "12999_00_unlocked",
185 | "partNumber": "MLHK3CH/A",
186 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHK3CH/A",
187 | "dimensionColor": "gold"
188 | },
189 | {
190 | "productTitle": "iPhone 13 Pro Max 128GB 金色",
191 | "basePartNumber": "MLH63",
192 | "image": "iphone-13-pro-max-gold-select",
193 | "dimensionCapacity": "128gb",
194 | "dimensionScreensize": "6_7inch",
195 | "price": "8999_00_unlocked",
196 | "partNumber": "MLH63CH/A",
197 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH63CH/A",
198 | "dimensionColor": "gold"
199 | },
200 | {
201 | "productTitle": "iPhone 13 Pro Max 128GB 远峰蓝色",
202 | "basePartNumber": "MLH73",
203 | "image": "iphone-13-pro-max-blue-select",
204 | "dimensionCapacity": "128gb",
205 | "dimensionScreensize": "6_7inch",
206 | "price": "8999_00_unlocked",
207 | "partNumber": "MLH73CH/A",
208 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH73CH/A",
209 | "dimensionColor": "sierrablue"
210 | },
211 | {
212 | "productTitle": "iPhone 13 Pro Max 128GB 银色",
213 | "basePartNumber": "MLH53",
214 | "image": "iphone-13-pro-max-silver-select",
215 | "dimensionCapacity": "128gb",
216 | "dimensionScreensize": "6_7inch",
217 | "price": "8999_00_unlocked",
218 | "partNumber": "MLH53CH/A",
219 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH53CH/A",
220 | "dimensionColor": "silver"
221 | },
222 | {
223 | "productTitle": "iPhone 13 Pro Max 512GB 金色",
224 | "basePartNumber": "MLHF3",
225 | "image": "iphone-13-pro-max-gold-select",
226 | "dimensionCapacity": "512gb",
227 | "dimensionScreensize": "6_7inch",
228 | "price": "11399_00_unlocked",
229 | "partNumber": "MLHF3CH/A",
230 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHF3CH/A",
231 | "dimensionColor": "gold"
232 | },
233 | {
234 | "productTitle": "iPhone 13 Pro Max 512GB 远峰蓝色",
235 | "basePartNumber": "MLHG3",
236 | "image": "iphone-13-pro-max-blue-select",
237 | "dimensionCapacity": "512gb",
238 | "dimensionScreensize": "6_7inch",
239 | "price": "11399_00_unlocked",
240 | "partNumber": "MLHG3CH/A",
241 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHG3CH/A",
242 | "dimensionColor": "sierrablue"
243 | },
244 | {
245 | "productTitle": "iPhone 13 Pro Max 1TB 石墨色",
246 | "basePartNumber": "MLHH3",
247 | "image": "iphone-13-pro-max-graphite-select",
248 | "dimensionCapacity": "1tb",
249 | "dimensionScreensize": "6_7inch",
250 | "price": "12999_00_unlocked",
251 | "partNumber": "MLHH3CH/A",
252 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHH3CH/A",
253 | "dimensionColor": "graphite"
254 | },
255 | {
256 | "productTitle": "iPhone 13 Pro Max 512GB 银色",
257 | "basePartNumber": "MLHE3",
258 | "image": "iphone-13-pro-max-silver-select",
259 | "dimensionCapacity": "512gb",
260 | "dimensionScreensize": "6_7inch",
261 | "price": "11399_00_unlocked",
262 | "partNumber": "MLHE3CH/A",
263 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHE3CH/A",
264 | "dimensionColor": "silver"
265 | },
266 | {
267 | "productTitle": "iPhone 13 Pro Max 1TB 远峰蓝色",
268 | "basePartNumber": "MLHL3",
269 | "image": "iphone-13-pro-max-blue-select",
270 | "dimensionCapacity": "1tb",
271 | "dimensionScreensize": "6_7inch",
272 | "price": "12999_00_unlocked",
273 | "partNumber": "MLHL3CH/A",
274 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHL3CH/A",
275 | "dimensionColor": "sierrablue"
276 | },
277 | {
278 | "productTitle": "iPhone 13 Pro Max 256GB 银色",
279 | "basePartNumber": "MLH93",
280 | "image": "iphone-13-pro-max-silver-select",
281 | "dimensionCapacity": "256gb",
282 | "dimensionScreensize": "6_7inch",
283 | "price": "9799_00_unlocked",
284 | "partNumber": "MLH93CH/A",
285 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH93CH/A",
286 | "dimensionColor": "silver"
287 | },
288 | {
289 | "productTitle": "iPhone 13 Pro Max 1TB 银色",
290 | "basePartNumber": "MLHJ3",
291 | "image": "iphone-13-pro-max-silver-select",
292 | "dimensionCapacity": "1tb",
293 | "dimensionScreensize": "6_7inch",
294 | "price": "12999_00_unlocked",
295 | "partNumber": "MLHJ3CH/A",
296 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHJ3CH/A",
297 | "dimensionColor": "silver"
298 | },
299 | {
300 | "productTitle": "iPhone 13 Pro Max 256GB 远峰蓝色",
301 | "basePartNumber": "MLHC3",
302 | "image": "iphone-13-pro-max-blue-select",
303 | "dimensionCapacity": "256gb",
304 | "dimensionScreensize": "6_7inch",
305 | "price": "9799_00_unlocked",
306 | "partNumber": "MLHC3CH/A",
307 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHC3CH/A",
308 | "dimensionColor": "sierrablue"
309 | },
310 | {
311 | "productTitle": "iPhone 13 Pro Max 256GB 石墨色",
312 | "basePartNumber": "MLH83",
313 | "image": "iphone-13-pro-max-graphite-select",
314 | "dimensionCapacity": "256gb",
315 | "dimensionScreensize": "6_7inch",
316 | "price": "9799_00_unlocked",
317 | "partNumber": "MLH83CH/A",
318 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH83CH/A",
319 | "dimensionColor": "graphite"
320 | },
321 | {
322 | "productTitle": "iPhone 13 Pro Max 128GB 石墨色",
323 | "basePartNumber": "MLH43",
324 | "image": "iphone-13-pro-max-graphite-select",
325 | "dimensionCapacity": "128gb",
326 | "dimensionScreensize": "6_7inch",
327 | "price": "8999_00_unlocked",
328 | "partNumber": "MLH43CH/A",
329 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH43CH/A",
330 | "dimensionColor": "graphite"
331 | },
332 | {
333 | "productTitle": "iPhone 13 Pro Max 256GB 金色",
334 | "basePartNumber": "MLHA3",
335 | "image": "iphone-13-pro-max-gold-select",
336 | "dimensionCapacity": "256gb",
337 | "dimensionScreensize": "6_7inch",
338 | "price": "9799_00_unlocked",
339 | "partNumber": "MLHA3CH/A",
340 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHA3CH/A",
341 | "dimensionColor": "gold"
342 | },
343 | {
344 | "productTitle": "iPhone 13 Pro Max 512GB 石墨色",
345 | "basePartNumber": "MLHD3",
346 | "image": "iphone-13-pro-max-graphite-select",
347 | "dimensionCapacity": "512gb",
348 | "dimensionScreensize": "6_7inch",
349 | "price": "11399_00_unlocked",
350 | "partNumber": "MLHD3CH/A",
351 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHD3CH/A",
352 | "dimensionColor": "graphite"
353 | },{
354 | "productTitle": "iPhone 13 mini 128GB 蓝色",
355 | "basePartNumber": "MLDG3",
356 | "image": "iphone-13-mini-blue-select-2021",
357 | "dimensionCapacity": "128gb",
358 | "dimensionScreensize": "5_4inch",
359 | "price": "5199_00_unlocked",
360 | "partNumber": "MLDG3CH/A",
361 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDG3CH/A",
362 | "dimensionColor": "blue"
363 | },
364 | {
365 | "productTitle": "iPhone 13 mini 512GB 红色",
366 | "basePartNumber": "MLDR3",
367 | "image": "iphone-13-mini-product-red-select-2021",
368 | "dimensionCapacity": "512gb",
369 | "dimensionScreensize": "5_4inch",
370 | "price": "7599_00_unlocked",
371 | "partNumber": "MLDR3CH/A",
372 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDR3CH/A",
373 | "dimensionColor": "product_red"
374 | },
375 | {
376 | "productTitle": "iPhone 13 mini 512GB 午夜色",
377 | "basePartNumber": "MLDN3",
378 | "image": "iphone-13-mini-midnight-select-2021",
379 | "dimensionCapacity": "512gb",
380 | "dimensionScreensize": "5_4inch",
381 | "price": "7599_00_unlocked",
382 | "partNumber": "MLDN3CH/A",
383 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDN3CH/A",
384 | "dimensionColor": "midnight"
385 | },
386 | {
387 | "productTitle": "iPhone 13 mini 512GB 蓝色",
388 | "basePartNumber": "MLDT3",
389 | "image": "iphone-13-mini-blue-select-2021",
390 | "dimensionCapacity": "512gb",
391 | "dimensionScreensize": "5_4inch",
392 | "price": "7599_00_unlocked",
393 | "partNumber": "MLDT3CH/A",
394 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDT3CH/A",
395 | "dimensionColor": "blue"
396 | },
397 | {
398 | "productTitle": "iPhone 13 mini 256GB 红色",
399 | "basePartNumber": "MLDL3",
400 | "image": "iphone-13-mini-product-red-select-2021",
401 | "dimensionCapacity": "256gb",
402 | "dimensionScreensize": "5_4inch",
403 | "price": "5999_00_unlocked",
404 | "partNumber": "MLDL3CH/A",
405 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDL3CH/A",
406 | "dimensionColor": "product_red"
407 | },
408 | {
409 | "productTitle": "iPhone 13 mini 256GB 蓝色",
410 | "basePartNumber": "MLDM3",
411 | "image": "iphone-13-mini-blue-select-2021",
412 | "dimensionCapacity": "256gb",
413 | "dimensionScreensize": "5_4inch",
414 | "price": "5999_00_unlocked",
415 | "partNumber": "MLDM3CH/A",
416 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDM3CH/A",
417 | "dimensionColor": "blue"
418 | },
419 | {
420 | "productTitle": "iPhone 13 mini 512GB 星光色",
421 | "basePartNumber": "MLDP3",
422 | "image": "iphone-13-mini-starlight-select-2021",
423 | "dimensionCapacity": "512gb",
424 | "dimensionScreensize": "5_4inch",
425 | "price": "7599_00_unlocked",
426 | "partNumber": "MLDP3CH/A",
427 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDP3CH/A",
428 | "dimensionColor": "starlight"
429 | },
430 | {
431 | "productTitle": "iPhone 13 mini 512GB 粉色",
432 | "basePartNumber": "MLDQ3",
433 | "image": "iphone-13-mini-pink-select-2021",
434 | "dimensionCapacity": "512gb",
435 | "dimensionScreensize": "5_4inch",
436 | "price": "7599_00_unlocked",
437 | "partNumber": "MLDQ3CH/A",
438 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDQ3CH/A",
439 | "dimensionColor": "pink"
440 | },
441 | {
442 | "productTitle": "iPhone 13 mini 128GB 午夜色",
443 | "basePartNumber": "MLDC3",
444 | "image": "iphone-13-mini-midnight-select-2021",
445 | "dimensionCapacity": "128gb",
446 | "dimensionScreensize": "5_4inch",
447 | "price": "5199_00_unlocked",
448 | "partNumber": "MLDC3CH/A",
449 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDC3CH/A",
450 | "dimensionColor": "midnight"
451 | },
452 | {
453 | "productTitle": "iPhone 13 mini 256GB 星光色",
454 | "basePartNumber": "MLDJ3",
455 | "image": "iphone-13-mini-starlight-select-2021",
456 | "dimensionCapacity": "256gb",
457 | "dimensionScreensize": "5_4inch",
458 | "price": "5999_00_unlocked",
459 | "partNumber": "MLDJ3CH/A",
460 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDJ3CH/A",
461 | "dimensionColor": "starlight"
462 | },
463 | {
464 | "productTitle": "iPhone 13 mini 256GB 午夜色",
465 | "basePartNumber": "MLDH3",
466 | "image": "iphone-13-mini-midnight-select-2021",
467 | "dimensionCapacity": "256gb",
468 | "dimensionScreensize": "5_4inch",
469 | "price": "5999_00_unlocked",
470 | "partNumber": "MLDH3CH/A",
471 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDH3CH/A",
472 | "dimensionColor": "midnight"
473 | },
474 | {
475 | "productTitle": "iPhone 13 mini 128GB 红色",
476 | "basePartNumber": "MLDF3",
477 | "image": "iphone-13-mini-product-red-select-2021",
478 | "dimensionCapacity": "128gb",
479 | "dimensionScreensize": "5_4inch",
480 | "price": "5199_00_unlocked",
481 | "partNumber": "MLDF3CH/A",
482 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDF3CH/A",
483 | "dimensionColor": "product_red"
484 | },
485 | {
486 | "productTitle": "iPhone 13 mini 128GB 星光色",
487 | "basePartNumber": "MLDD3",
488 | "image": "iphone-13-mini-starlight-select-2021",
489 | "dimensionCapacity": "128gb",
490 | "dimensionScreensize": "5_4inch",
491 | "price": "5199_00_unlocked",
492 | "partNumber": "MLDD3CH/A",
493 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDD3CH/A",
494 | "dimensionColor": "starlight"
495 | },
496 | {
497 | "productTitle": "iPhone 13 mini 128GB 粉色",
498 | "basePartNumber": "MLDE3",
499 | "image": "iphone-13-mini-pink-select-2021",
500 | "dimensionCapacity": "128gb",
501 | "dimensionScreensize": "5_4inch",
502 | "price": "5199_00_unlocked",
503 | "partNumber": "MLDE3CH/A",
504 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDE3CH/A",
505 | "dimensionColor": "pink"
506 | },
507 | {
508 | "productTitle": "iPhone 13 mini 256GB 粉色",
509 | "basePartNumber": "MLDK3",
510 | "image": "iphone-13-mini-pink-select-2021",
511 | "dimensionCapacity": "256gb",
512 | "dimensionScreensize": "5_4inch",
513 | "price": "5999_00_unlocked",
514 | "partNumber": "MLDK3CH/A",
515 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDK3CH/A",
516 | "dimensionColor": "pink"
517 | },
518 | {
519 | "productTitle": "iPhone 13 128GB 粉色",
520 | "basePartNumber": "MLDW3",
521 | "image": "iphone-13-pink-select-2021",
522 | "dimensionCapacity": "128gb",
523 | "dimensionScreensize": "6_1inch",
524 | "price": "5999_00_unlocked",
525 | "partNumber": "MLDW3CH/A",
526 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDW3CH/A",
527 | "dimensionColor": "pink"
528 | },
529 | {
530 | "productTitle": "iPhone 13 512GB 星光色",
531 | "basePartNumber": "MLE73",
532 | "image": "iphone-13-starlight-select-2021",
533 | "dimensionCapacity": "512gb",
534 | "dimensionScreensize": "6_1inch",
535 | "price": "8399_00_unlocked",
536 | "partNumber": "MLE73CH/A",
537 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE73CH/A",
538 | "dimensionColor": "starlight"
539 | },
540 | {
541 | "productTitle": "iPhone 13 128GB 红色",
542 | "basePartNumber": "MLDX3",
543 | "image": "iphone-13-product-red-select-2021",
544 | "dimensionCapacity": "128gb",
545 | "dimensionScreensize": "6_1inch",
546 | "price": "5999_00_unlocked",
547 | "partNumber": "MLDX3CH/A",
548 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDX3CH/A",
549 | "dimensionColor": "product_red"
550 | },
551 | {
552 | "productTitle": "iPhone 13 512GB 午夜色",
553 | "basePartNumber": "MLE63",
554 | "image": "iphone-13-midnight-select-2021",
555 | "dimensionCapacity": "512gb",
556 | "dimensionScreensize": "6_1inch",
557 | "price": "8399_00_unlocked",
558 | "partNumber": "MLE63CH/A",
559 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE63CH/A",
560 | "dimensionColor": "midnight"
561 | },
562 | {
563 | "productTitle": "iPhone 13 256GB 红色",
564 | "basePartNumber": "MLE33",
565 | "image": "iphone-13-product-red-select-2021",
566 | "dimensionCapacity": "256gb",
567 | "dimensionScreensize": "6_1inch",
568 | "price": "6799_00_unlocked",
569 | "partNumber": "MLE33CH/A",
570 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE33CH/A",
571 | "dimensionColor": "product_red"
572 | },
573 | {
574 | "productTitle": "iPhone 13 512GB 红色",
575 | "basePartNumber": "MLEA3",
576 | "image": "iphone-13-product-red-select-2021",
577 | "dimensionCapacity": "512gb",
578 | "dimensionScreensize": "6_1inch",
579 | "price": "8399_00_unlocked",
580 | "partNumber": "MLEA3CH/A",
581 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLEA3CH/A",
582 | "dimensionColor": "product_red"
583 | },
584 | {
585 | "productTitle": "iPhone 13 256GB 星光色",
586 | "basePartNumber": "MLE13",
587 | "image": "iphone-13-starlight-select-2021",
588 | "dimensionCapacity": "256gb",
589 | "dimensionScreensize": "6_1inch",
590 | "price": "6799_00_unlocked",
591 | "partNumber": "MLE13CH/A",
592 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE13CH/A",
593 | "dimensionColor": "starlight"
594 | },
595 | {
596 | "productTitle": "iPhone 13 512GB 粉色",
597 | "basePartNumber": "MLE93",
598 | "image": "iphone-13-pink-select-2021",
599 | "dimensionCapacity": "512gb",
600 | "dimensionScreensize": "6_1inch",
601 | "price": "8399_00_unlocked",
602 | "partNumber": "MLE93CH/A",
603 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE93CH/A",
604 | "dimensionColor": "pink"
605 | },
606 | {
607 | "productTitle": "iPhone 13 128GB 午夜色",
608 | "basePartNumber": "MLDU3",
609 | "image": "iphone-13-midnight-select-2021",
610 | "dimensionCapacity": "128gb",
611 | "dimensionScreensize": "6_1inch",
612 | "price": "5999_00_unlocked",
613 | "partNumber": "MLDU3CH/A",
614 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDU3CH/A",
615 | "dimensionColor": "midnight"
616 | },
617 | {
618 | "productTitle": "iPhone 13 128GB 星光色",
619 | "basePartNumber": "MLDV3",
620 | "image": "iphone-13-starlight-select-2021",
621 | "dimensionCapacity": "128gb",
622 | "dimensionScreensize": "6_1inch",
623 | "price": "5999_00_unlocked",
624 | "partNumber": "MLDV3CH/A",
625 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDV3CH/A",
626 | "dimensionColor": "starlight"
627 | },
628 | {
629 | "productTitle": "iPhone 13 256GB 午夜色",
630 | "basePartNumber": "MLE03",
631 | "image": "iphone-13-midnight-select-2021",
632 | "dimensionCapacity": "256gb",
633 | "dimensionScreensize": "6_1inch",
634 | "price": "6799_00_unlocked",
635 | "partNumber": "MLE03CH/A",
636 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE03CH/A",
637 | "dimensionColor": "midnight"
638 | },
639 | {
640 | "productTitle": "iPhone 13 128GB 蓝色",
641 | "basePartNumber": "MLDY3",
642 | "image": "iphone-13-blue-select-2021",
643 | "dimensionCapacity": "128gb",
644 | "dimensionScreensize": "6_1inch",
645 | "price": "5999_00_unlocked",
646 | "partNumber": "MLDY3CH/A",
647 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDY3CH/A",
648 | "dimensionColor": "blue"
649 | },
650 | {
651 | "productTitle": "iPhone 13 256GB 蓝色",
652 | "basePartNumber": "MLE43",
653 | "image": "iphone-13-blue-select-2021",
654 | "dimensionCapacity": "256gb",
655 | "dimensionScreensize": "6_1inch",
656 | "price": "6799_00_unlocked",
657 | "partNumber": "MLE43CH/A",
658 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE43CH/A",
659 | "dimensionColor": "blue"
660 | },
661 | {
662 | "productTitle": "iPhone 13 512GB 蓝色",
663 | "basePartNumber": "MLEC3",
664 | "image": "iphone-13-blue-select-2021",
665 | "dimensionCapacity": "512gb",
666 | "dimensionScreensize": "6_1inch",
667 | "price": "8399_00_unlocked",
668 | "partNumber": "MLEC3CH/A",
669 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLEC3CH/A",
670 | "dimensionColor": "blue"
671 | },
672 | {
673 | "productTitle": "iPhone 13 256GB 粉色",
674 | "basePartNumber": "MLE23",
675 | "image": "iphone-13-pink-select-2021",
676 | "dimensionCapacity": "256gb",
677 | "dimensionScreensize": "6_1inch",
678 | "price": "6799_00_unlocked",
679 | "partNumber": "MLE23CH/A",
680 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE23CH/A",
681 | "dimensionColor": "pink"
682 | }
683 | ]
684 |
--------------------------------------------------------------------------------
/AppleReserver/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
655 |
656 |
657 |
658 |
659 |
660 |
661 |
662 |
663 |
664 |
665 |
666 |
667 |
668 |
669 |
670 |
671 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
685 |
686 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
709 |
710 |
711 |
712 |
713 |
714 |
715 |
716 |
717 |
718 |
719 |
720 |
721 |
722 |
723 |
724 |
725 |
726 |
727 |
728 |
729 |
730 |
743 |
744 |
745 |
746 |
747 |
748 |
749 |
750 |
751 |
752 |
753 |
754 |
755 |
756 |
757 |
758 |
759 |
760 |
761 |
762 |
763 |
764 |
765 |
766 |
767 |
768 |
769 |
770 |
771 |
772 |
773 |
774 |
775 |
776 |
777 |
778 |
779 |
780 |
781 |
782 |
783 |
784 |
785 |
786 |
787 |
788 |
789 |
790 |
791 |
792 |
793 |
794 |
795 |
796 |
797 |
798 |
799 |
800 |
801 |
802 |
803 |
804 |
805 |
806 |
807 |
808 |
809 |
810 |
811 |
812 |
813 |
814 |
815 |
816 |
817 |
818 |
819 |
820 |
821 |
822 |
823 |
824 |
825 |
826 |
827 |
828 |
829 |
830 |
831 |
832 |
833 |
834 |
835 |
836 |
837 |
838 |
839 |
840 |
841 |
842 |
843 |
844 |
845 |
846 |
847 |
848 |
849 |
850 |
851 |
852 |
853 |
854 |
855 |
856 |
857 |
858 |
859 |
860 |
861 |
862 |
863 |
864 |
865 |
866 |
867 |
868 |
869 |
870 |
871 |
872 |
873 |
874 |
875 |
876 |
877 |
878 |
879 |
880 |
881 |
882 |
883 |
884 |
885 |
886 |
887 |
888 |
889 |
890 |
891 |
892 |
893 |
894 |
895 |
896 |
897 |
898 |
899 |
900 |
901 |
902 |
903 |
904 |
905 |
906 |
907 |
908 |
909 |
910 |
911 |
912 |
913 |
914 |
915 |
916 |
917 |
918 |
919 |
920 |
921 |
922 |
923 |
924 |
925 |
926 |
927 |
928 |
929 |
930 |
931 |
932 |
933 |
934 |
935 |
936 |
937 |
938 |
939 |
940 |
941 |
942 |
943 |
944 |
945 |
946 |
947 |
948 |
949 |
950 |
951 |
952 |
953 |
954 |
955 |
956 |
957 |
958 |
959 |
960 |
961 |
962 |
963 |
964 |
965 |
966 |
967 |
968 |
969 |
970 |
971 |
972 |
973 |
974 |
975 |
976 |
977 |
978 |
979 |
980 |
981 |
982 |
983 |
984 |
985 |
986 |
987 |
--------------------------------------------------------------------------------