Commit 7273edbfdf0b9044d791ccf08e2b5e619bde4432

Authored by Cao yang
1 parent c7483c8b
Exists in parentassistant

优化页面布局,添加alamofireImage

Showing 79 changed files with 6426 additions and 3058 deletions   Show diff stats
ParentAssistant/ParentAssistant.xcodeproj/project.pbxproj
@@ -80,6 +80,7 @@ @@ -80,6 +80,7 @@
80 ADC9AB88207C940700348EF1 /* ProgramViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC9AB87207C940700348EF1 /* ProgramViewController.swift */; }; 80 ADC9AB88207C940700348EF1 /* ProgramViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC9AB87207C940700348EF1 /* ProgramViewController.swift */; };
81 ADE33B312062202300BEA6E6 /* Macro.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE33B302062202300BEA6E6 /* Macro.swift */; }; 81 ADE33B312062202300BEA6E6 /* Macro.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE33B302062202300BEA6E6 /* Macro.swift */; };
82 ADF159612069E00000A9485D /* CalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADF159602069E00000A9485D /* CalendarView.swift */; }; 82 ADF159612069E00000A9485D /* CalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADF159602069E00000A9485D /* CalendarView.swift */; };
  83 + ADF15E7620883D1B00381EE1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ADF15E7520883D1B00381EE1 /* Assets.xcassets */; };
83 BF388469205A4DE900A240EF /* StudentClassInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF388468205A4DE900A240EF /* StudentClassInfo.swift */; }; 84 BF388469205A4DE900A240EF /* StudentClassInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF388468205A4DE900A240EF /* StudentClassInfo.swift */; };
84 BF38846C205A58F800A240EF /* YXMessageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF38846B205A58F800A240EF /* YXMessageManager.swift */; }; 85 BF38846C205A58F800A240EF /* YXMessageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF38846B205A58F800A240EF /* YXMessageManager.swift */; };
85 BF38846E205A5A0000A240EF /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF38846D205A59FE00A240EF /* MobileCoreServices.framework */; }; 86 BF38846E205A5A0000A240EF /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF38846D205A59FE00A240EF /* MobileCoreServices.framework */; };
@@ -125,7 +126,6 @@ @@ -125,7 +126,6 @@
125 BF7A4C36204CD55300460463 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C35204CD55300460463 /* ViewController.swift */; }; 126 BF7A4C36204CD55300460463 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C35204CD55300460463 /* ViewController.swift */; };
126 BF7A4C3C204CD55300460463 /* ParentAssistant.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C3A204CD55300460463 /* ParentAssistant.xcdatamodeld */; }; 127 BF7A4C3C204CD55300460463 /* ParentAssistant.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C3A204CD55300460463 /* ParentAssistant.xcdatamodeld */; };
127 BF7A4C4C204CD55500460463 /* ParentAssistantUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C4B204CD55500460463 /* ParentAssistantUITests.swift */; }; 128 BF7A4C4C204CD55500460463 /* ParentAssistantUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C4B204CD55500460463 /* ParentAssistantUITests.swift */; };
128 - BF7A4C84204E338500460463 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BF7A4C7E204E338400460463 /* Assets.xcassets */; };  
129 BF7A4C85204E338500460463 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF7A4C7F204E338400460463 /* LaunchScreen.storyboard */; }; 129 BF7A4C85204E338500460463 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF7A4C7F204E338400460463 /* LaunchScreen.storyboard */; };
130 BF7A4C86204E338500460463 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF7A4C81204E338400460463 /* Main.storyboard */; }; 130 BF7A4C86204E338500460463 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF7A4C81204E338400460463 /* Main.storyboard */; };
131 BFA7443A207DB6EE00845D30 /* ActivationSchoolCardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA74439207DB6EE00845D30 /* ActivationSchoolCardViewController.swift */; }; 131 BFA7443A207DB6EE00845D30 /* ActivationSchoolCardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA74439207DB6EE00845D30 /* ActivationSchoolCardViewController.swift */; };
@@ -258,6 +258,7 @@ @@ -258,6 +258,7 @@
258 ADC9AB87207C940700348EF1 /* ProgramViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgramViewController.swift; sourceTree = "<group>"; }; 258 ADC9AB87207C940700348EF1 /* ProgramViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgramViewController.swift; sourceTree = "<group>"; };
259 ADE33B302062202300BEA6E6 /* Macro.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Macro.swift; sourceTree = "<group>"; }; 259 ADE33B302062202300BEA6E6 /* Macro.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Macro.swift; sourceTree = "<group>"; };
260 ADF159602069E00000A9485D /* CalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarView.swift; sourceTree = "<group>"; }; 260 ADF159602069E00000A9485D /* CalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarView.swift; sourceTree = "<group>"; };
  261 + ADF15E7520883D1B00381EE1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
261 BF388468205A4DE900A240EF /* StudentClassInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudentClassInfo.swift; sourceTree = "<group>"; }; 262 BF388468205A4DE900A240EF /* StudentClassInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudentClassInfo.swift; sourceTree = "<group>"; };
262 BF38846B205A58F800A240EF /* YXMessageManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YXMessageManager.swift; sourceTree = "<group>"; }; 263 BF38846B205A58F800A240EF /* YXMessageManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YXMessageManager.swift; sourceTree = "<group>"; };
263 BF38846D205A59FE00A240EF /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; 264 BF38846D205A59FE00A240EF /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
@@ -308,7 +309,6 @@ @@ -308,7 +309,6 @@
308 BF7A4C4B204CD55500460463 /* ParentAssistantUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParentAssistantUITests.swift; sourceTree = "<group>"; }; 309 BF7A4C4B204CD55500460463 /* ParentAssistantUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParentAssistantUITests.swift; sourceTree = "<group>"; };
309 BF7A4C4D204CD55500460463 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 310 BF7A4C4D204CD55500460463 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
310 BF7A4C56204CE7F600460463 /* ParentAssistant-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ParentAssistant-Bridging-Header.h"; sourceTree = "<group>"; }; 311 BF7A4C56204CE7F600460463 /* ParentAssistant-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ParentAssistant-Bridging-Header.h"; sourceTree = "<group>"; };
311 - BF7A4C7E204E338400460463 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };  
312 BF7A4C80204E338400460463 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 312 BF7A4C80204E338400460463 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
313 BF7A4C82204E338400460463 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 313 BF7A4C82204E338400460463 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
314 BF7A4C83204E338400460463 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 314 BF7A4C83204E338400460463 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -753,9 +753,9 @@ @@ -753,9 +753,9 @@
753 isa = PBXGroup; 753 isa = PBXGroup;
754 children = ( 754 children = (
755 BFEAAADB20525F1F0072FAAF /* PrefixHeader.pch */, 755 BFEAAADB20525F1F0072FAAF /* PrefixHeader.pch */,
756 - BF7A4C7E204E338400460463 /* Assets.xcassets */,  
757 BF7A4C7F204E338400460463 /* LaunchScreen.storyboard */, 756 BF7A4C7F204E338400460463 /* LaunchScreen.storyboard */,
758 BF7A4C81204E338400460463 /* Main.storyboard */, 757 BF7A4C81204E338400460463 /* Main.storyboard */,
  758 + ADF15E7520883D1B00381EE1 /* Assets.xcassets */,
759 BF7A4C83204E338400460463 /* Info.plist */, 759 BF7A4C83204E338400460463 /* Info.plist */,
760 ); 760 );
761 path = "Supporting Files"; 761 path = "Supporting Files";
@@ -980,6 +980,7 @@ @@ -980,6 +980,7 @@
980 599364FC204E742000C8B371 /* ChannelSelectViewCollectionViewCell.xib in Resources */, 980 599364FC204E742000C8B371 /* ChannelSelectViewCollectionViewCell.xib in Resources */,
981 ADC9AB78207C65FC00348EF1 /* GrowSubjectCell.xib in Resources */, 981 ADC9AB78207C65FC00348EF1 /* GrowSubjectCell.xib in Resources */,
982 ADC9AB80207C672800348EF1 /* SceneTopCell.xib in Resources */, 982 ADC9AB80207C672800348EF1 /* SceneTopCell.xib in Resources */,
  983 + ADF15E7620883D1B00381EE1 /* Assets.xcassets in Resources */,
983 599365252050D03900C8B371 /* Evaluation.storyboard in Resources */, 984 599365252050D03900C8B371 /* Evaluation.storyboard in Resources */,
984 5980BF672061048A00F4A35E /* Address.plist in Resources */, 985 5980BF672061048A00F4A35E /* Address.plist in Resources */,
985 BF38847C205CDE1B00A240EF /* JS.storyboard in Resources */, 986 BF38847C205CDE1B00A240EF /* JS.storyboard in Resources */,
@@ -1004,7 +1005,6 @@ @@ -1004,7 +1005,6 @@
1004 BF67F3BC20590A2F002FDC61 /* Info-iOS.plist in Resources */, 1005 BF67F3BC20590A2F002FDC61 /* Info-iOS.plist in Resources */,
1005 AD4BA4AD20819CAD00F83F13 /* ReportHeaderCollectionViewCell.xib in Resources */, 1006 AD4BA4AD20819CAD00F83F13 /* ReportHeaderCollectionViewCell.xib in Resources */,
1006 AD64A2C5207F28EB00B25E80 /* ProgramVacateBodyTableViewCell.xib in Resources */, 1007 AD64A2C5207F28EB00B25E80 /* ProgramVacateBodyTableViewCell.xib in Resources */,
1007 - BF7A4C84204E338500460463 /* Assets.xcassets in Resources */,  
1008 BF7A4C85204E338500460463 /* LaunchScreen.storyboard in Resources */, 1008 BF7A4C85204E338500460463 /* LaunchScreen.storyboard in Resources */,
1009 AD122AC6208442BC00C7D0AD /* ProgramVacateImageCell.xib in Resources */, 1009 AD122AC6208442BC00C7D0AD /* ProgramVacateImageCell.xib in Resources */,
1010 ADC9AB82207C673300348EF1 /* SceneMiddleCell.xib in Resources */, 1010 ADC9AB82207C673300348EF1 /* SceneMiddleCell.xib in Resources */,
@@ -1044,6 +1044,7 @@ @@ -1044,6 +1044,7 @@
1044 inputPaths = ( 1044 inputPaths = (
1045 "${SRCROOT}/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-frameworks.sh", 1045 "${SRCROOT}/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-frameworks.sh",
1046 "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", 1046 "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework",
  1047 + "${BUILT_PRODUCTS_DIR}/AlamofireImage/AlamofireImage.framework",
1047 "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework", 1048 "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework",
1048 "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework", 1049 "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework",
1049 "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", 1050 "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework",
@@ -1056,6 +1057,7 @@ @@ -1056,6 +1057,7 @@
1056 name = "[CP] Embed Pods Frameworks"; 1057 name = "[CP] Embed Pods Frameworks";
1057 outputPaths = ( 1058 outputPaths = (
1058 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", 1059 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework",
  1060 + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AlamofireImage.framework",
1059 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DZNEmptyDataSet.framework", 1061 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DZNEmptyDataSet.framework",
1060 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HandyJSON.framework", 1062 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HandyJSON.framework",
1061 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", 1063 "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework",
ParentAssistant/ParentAssistant.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 <key>ParentAssistant.xcscheme</key> 7 <key>ParentAssistant.xcscheme</key>
8 <dict> 8 <dict>
9 <key>orderHint</key> 9 <key>orderHint</key>
10 - <integer>10</integer> 10 + <integer>11</integer>
11 </dict> 11 </dict>
12 </dict> 12 </dict>
13 </dict> 13 </dict>
ParentAssistant/ParentAssistant.xcworkspace/xcuserdata/caoyang.xcuserdatad/UserInterfaceState.xcuserstate
No preview for this file type
ParentAssistant/ParentAssistant/Classes/controllers/Grow/GrowViewController.swift
@@ -10,12 +10,11 @@ import UIKit @@ -10,12 +10,11 @@ import UIKit
10 10
11 class GrowViewController: UIViewController,UIScrollViewDelegate { 11 class GrowViewController: UIViewController,UIScrollViewDelegate {
12 12
13 - var ZJBNavH = 44.0  
14 //MARK: - 标题数据 13 //MARK: - 标题数据
15 //标题 14 //标题
16 lazy var titleView = {() -> UIView in 15 lazy var titleView = {() -> UIView in
17 let title = UIScrollView() 16 let title = UIScrollView()
18 - title.frame = CGRect(x:0,y:0,width:getScreenWidth(),height:44) 17 + title.frame = CGRect(x:0,y:0,width:200,height:44)
19 title.backgroundColor = Theme.topBarColor() 18 title.backgroundColor = Theme.topBarColor()
20 return title 19 return title
21 }() 20 }()
@@ -51,7 +50,9 @@ class GrowViewController: UIViewController,UIScrollViewDelegate { @@ -51,7 +50,9 @@ class GrowViewController: UIViewController,UIScrollViewDelegate {
51 super.viewDidLoad() 50 super.viewDidLoad()
52 titleArr = ["应用","报告"] 51 titleArr = ["应用","报告"]
53 //设置导航栏标题 52 //设置导航栏标题
54 - self.navigationItem.titleView = titleView 53 + self.navigationItem.titleView = self.titleView
  54 + self.navigationItem.titleView?.center.x = screenWidth/2
  55 + print(self.navigationItem.titleView!.frame)
55 self.view.addSubview(contentScrollView) 56 self.view.addSubview(contentScrollView)
56 57
57 self.title = "成长" 58 self.title = "成长"
@@ -153,10 +154,10 @@ class GrowViewController: UIViewController,UIScrollViewDelegate { @@ -153,10 +154,10 @@ class GrowViewController: UIViewController,UIScrollViewDelegate {
153 btn.setTitleColor(UIColor.white, for: .normal) 154 btn.setTitleColor(UIColor.white, for: .normal)
154 btn.tag = i 155 btn.tag = i
155 btn.addTarget(self, action: #selector(clickTitleAction(btn:)), for:UIControlEvents.touchUpInside) 156 btn.addTarget(self, action: #selector(clickTitleAction(btn:)), for:UIControlEvents.touchUpInside)
156 - btn.frame.size = CGSize.init(width: 40, height: ZJBNavH) 157 + btn.frame.size = CGSize.init(width: 40, height: navigationBarHeight!)
157 158
158 - let widht = getScreenWidth()  
159 - btn.center = CGPoint.init(x: widht/4*(1+CGFloat(i))-26, y: CGFloat(ZJBNavH/2)) 159 + let centerX = titleView.frame.size.width/4
  160 + btn.center = CGPoint.init(x: centerX+centerX*2*CGFloat(i), y: CGFloat(navigationBarHeight!/2))
160 btnWidthArr.append(btn.frame.size.width) 161 btnWidthArr.append(btn.frame.size.width)
161 162
162 titleBtnArr.append(btn) 163 titleBtnArr.append(btn)
ParentAssistant/ParentAssistant/Classes/controllers/Grow/Program/ProgramCheckViewController.swift
@@ -22,12 +22,22 @@ class ProgramCheckViewController: UIViewController,UITableViewDelegate,UITableVi @@ -22,12 +22,22 @@ class ProgramCheckViewController: UIViewController,UITableViewDelegate,UITableVi
22 return table 22 return table
23 }() 23 }()
24 24
  25 + var studentName:String?
  26 + lazy var formatter = {()->DateFormatter in
  27 + let matter = DateFormatter.init()
  28 + matter.dateFormat = "yyyy-MM-dd"
  29 + return matter
  30 + }()
25 var viewData = Array<StudentCardModel>() 31 var viewData = Array<StudentCardModel>()
26 32
27 33
28 override func viewDidLoad() { 34 override func viewDidLoad() {
29 super.viewDidLoad() 35 super.viewDidLoad()
  36 +
  37 + self.studentName = AccountManager.shared.rawUserInfo?.contentData()["studentClass"][0]["studentName"].string
  38 +
30 self.view.addSubview(self.tableView) 39 self.view.addSubview(self.tableView)
  40 +
31 // Do any additional setup after loading the view. 41 // Do any additional setup after loading the view.
32 downLoadDataFromNet() 42 downLoadDataFromNet()
33 } 43 }
@@ -40,7 +50,7 @@ class ProgramCheckViewController: UIViewController,UITableViewDelegate,UITableVi @@ -40,7 +50,7 @@ class ProgramCheckViewController: UIViewController,UITableViewDelegate,UITableVi
40 SVProgressHUD.dismiss() 50 SVProgressHUD.dismiss()
41 if error == nil && JSON.fromString(backData)!["status"].intValue == 1 { 51 if error == nil && JSON.fromString(backData)!["status"].intValue == 1 {
42 let data = JSON.fromString(backData)!["data"].arrayValue 52 let data = JSON.fromString(backData)!["data"].arrayValue
43 - 53 + print(backData!)
44 for i in 0..<data.count { 54 for i in 0..<data.count {
45 let dic = data[i].dictionary 55 let dic = data[i].dictionary
46 if let model = StudentCardModel.deserialize(from: dic){ 56 if let model = StudentCardModel.deserialize(from: dic){
@@ -71,9 +81,15 @@ class ProgramCheckViewController: UIViewController,UITableViewDelegate,UITableVi @@ -71,9 +81,15 @@ class ProgramCheckViewController: UIViewController,UITableViewDelegate,UITableVi
71 81
72 if indexPath.row == 0 { 82 if indexPath.row == 0 {
73 let cell = tableView.dequeueReusableCell(withIdentifier: "GrowCheckUpTableViewCell", for: indexPath) as! GrowCheckUpTableViewCell 83 let cell = tableView.dequeueReusableCell(withIdentifier: "GrowCheckUpTableViewCell", for: indexPath) as! GrowCheckUpTableViewCell
  84 + cell.checkCount.text = "\(self.viewData.count)"
  85 + cell.checkDate.text = self.formatter.string(from: Date())
  86 + cell.checkName.text = studentName
74 return cell 87 return cell
75 }else{ 88 }else{
76 let cell = tableView.dequeueReusableCell(withIdentifier: "GrowCheckDownTableViewCell", for: indexPath) as! GrowCheckDownTableViewCell 89 let cell = tableView.dequeueReusableCell(withIdentifier: "GrowCheckDownTableViewCell", for: indexPath) as! GrowCheckDownTableViewCell
  90 + let model = self.viewData[indexPath.row-1]
  91 + cell.studentParents.text = "尊敬的\(studentName!)家长"
  92 + cell.setCellData(model: model)
77 return cell 93 return cell
78 } 94 }
79 } 95 }
ParentAssistant/ParentAssistant/Classes/controllers/Grow/Program/ProgramViewController.swift
@@ -26,8 +26,14 @@ class ProgramViewController: UIViewController,UITableViewDelegate,UITableViewDat @@ -26,8 +26,14 @@ class ProgramViewController: UIViewController,UITableViewDelegate,UITableViewDat
26 super.viewDidLoad() 26 super.viewDidLoad()
27 self.view.backgroundColor = backGroundColor 27 self.view.backgroundColor = backGroundColor
28 28
29 - let isCheck = true  
30 - 29 + var isCheck = true
  30 + if AccountManager.shared.isOnline() {
  31 + if AccountManager.shared.rawUserInfo!.contentData()["studentClass"].arrayValue.count == 0 {
  32 + isCheck = false
  33 + }else{
  34 + isCheck = true
  35 + }
  36 + }
31 if isCheck { 37 if isCheck {
32 self.view.addSubview(self.tableView) 38 self.view.addSubview(self.tableView)
33 }else{ 39 }else{
ParentAssistant/ParentAssistant/Classes/controllers/Grow/Report/MoralViewController.swift
@@ -13,7 +13,7 @@ class MoralViewController: UIViewController,UITableViewDelegate,UITableViewDataS @@ -13,7 +13,7 @@ class MoralViewController: UIViewController,UITableViewDelegate,UITableViewDataS
13 lazy var tableView = {()->UITableView in 13 lazy var tableView = {()->UITableView in
14 14
15 let table = UITableView.init(frame: CGRect.init(x: 0, y: 0, width: screenWidth, height: screenHeight-navigationBarHeight!-statusBarHeight-10)) 15 let table = UITableView.init(frame: CGRect.init(x: 0, y: 0, width: screenWidth, height: screenHeight-navigationBarHeight!-statusBarHeight-10))
16 - table.backgroundColor = UIColor.init(red: 235/255, green: 235/255, blue: 241/255, alpha: 1) 16 + table.backgroundColor = backGroundColor
17 table.delegate = self 17 table.delegate = self
18 table.dataSource = self 18 table.dataSource = self
19 table.separatorStyle = UITableViewCellSeparatorStyle.none 19 table.separatorStyle = UITableViewCellSeparatorStyle.none
@@ -69,7 +69,7 @@ class MoralViewController: UIViewController,UITableViewDelegate,UITableViewDataS @@ -69,7 +69,7 @@ class MoralViewController: UIViewController,UITableViewDelegate,UITableViewDataS
69 case 0: 69 case 0:
70 return 240 70 return 240
71 case 1: 71 case 1:
72 - return 240 72 + return 280
73 case 2: 73 case 2:
74 return 70 74 return 70
75 default: 75 default:
ParentAssistant/ParentAssistant/Classes/controllers/Grow/Report/SceneDetailViewController.swift
@@ -45,7 +45,7 @@ class SceneDetailViewController: UIViewController,UITableViewDataSource,UITableV @@ -45,7 +45,7 @@ class SceneDetailViewController: UIViewController,UITableViewDataSource,UITableV
45 case 0: 45 case 0:
46 return 240 46 return 240
47 case 1: 47 case 1:
48 - return 250 48 + return 300
49 case 2: 49 case 2:
50 return 70 50 return 70
51 default: 51 default:
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.swift
@@ -18,6 +18,13 @@ class GrowCheckDownTableViewCell: UITableViewCell { @@ -18,6 +18,13 @@ class GrowCheckDownTableViewCell: UITableViewCell {
18 // Initialization code 18 // Initialization code
19 self.backgroundColor = backgroundColor 19 self.backgroundColor = backgroundColor
20 } 20 }
  21 +
  22 + func setCellData(model:StudentCardModel){
  23 +
  24 + self.studentMessage.text = model.situation
  25 + self.studentImage.setImageWithUrl(urlStr: model.head_image, placeholder: "program_loadfail")
  26 + }
  27 +
21 28
22 override func setSelected(_ selected: Bool, animated: Bool) { 29 override func setSelected(_ selected: Bool, animated: Bool) {
23 super.setSelected(selected, animated: animated) 30 super.setSelected(selected, animated: animated)
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.xib
@@ -13,18 +13,18 @@ @@ -13,18 +13,18 @@
13 <objects> 13 <objects>
14 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> 14 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
15 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> 15 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
16 - <tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="GrowCheckDownTableViewCell" rowHeight="148" id="KGk-i7-Jjw" customClass="GrowCheckDownTableViewCell" customModule="ParentAssistant" customModuleProvider="target">  
17 - <rect key="frame" x="0.0" y="0.0" width="320" height="148"/> 16 + <tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="GrowCheckDownTableViewCell" rowHeight="179" id="KGk-i7-Jjw" customClass="GrowCheckDownTableViewCell" customModule="ParentAssistant" customModuleProvider="target">
  17 + <rect key="frame" x="0.0" y="0.0" width="320" height="179"/>
18 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 18 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
19 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM"> 19 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
20 - <rect key="frame" x="0.0" y="0.0" width="320" height="147.5"/> 20 + <rect key="frame" x="0.0" y="0.0" width="320" height="178.5"/>
21 <autoresizingMask key="autoresizingMask"/> 21 <autoresizingMask key="autoresizingMask"/>
22 <subviews> 22 <subviews>
23 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="M2G-AT-SGp"> 23 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="M2G-AT-SGp">
24 - <rect key="frame" x="10" y="0.0" width="300" height="147.5"/> 24 + <rect key="frame" x="10" y="0.0" width="300" height="178.5"/>
25 <subviews> 25 <subviews>
26 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="down" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Jwf-rl-f67"> 26 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="down" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Jwf-rl-f67">
27 - <rect key="frame" x="9.5" y="30" width="1" height="117.5"/> 27 + <rect key="frame" x="9.5" y="30" width="1" height="148.5"/>
28 <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/> 28 <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
29 <constraints> 29 <constraints>
30 <constraint firstAttribute="width" constant="1" id="oLs-xY-7rY"/> 30 <constraint firstAttribute="width" constant="1" id="oLs-xY-7rY"/>
@@ -59,10 +59,10 @@ @@ -59,10 +59,10 @@
59 <nil key="highlightedColor"/> 59 <nil key="highlightedColor"/>
60 </label> 60 </label>
61 <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="report_teacher" translatesAutoresizingMaskIntoConstraints="NO" id="SPG-e7-fgN"> 61 <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="report_teacher" translatesAutoresizingMaskIntoConstraints="NO" id="SPG-e7-fgN">
62 - <rect key="frame" x="25" y="76.5" width="100" height="60"/> 62 + <rect key="frame" x="25" y="76.5" width="120" height="78"/>
63 <constraints> 63 <constraints>
64 - <constraint firstAttribute="width" constant="100" id="VO7-To-XAp"/>  
65 - <constraint firstAttribute="height" constant="60" id="i62-A6-AJc"/> 64 + <constraint firstAttribute="width" constant="120" id="VO7-To-XAp"/>
  65 + <constraint firstAttribute="height" constant="78" id="i62-A6-AJc"/>
66 </constraints> 66 </constraints>
67 </imageView> 67 </imageView>
68 </subviews> 68 </subviews>
@@ -98,7 +98,7 @@ @@ -98,7 +98,7 @@
98 <outlet property="studentMessage" destination="Poh-Qh-ybX" id="I4b-qR-mT8"/> 98 <outlet property="studentMessage" destination="Poh-Qh-ybX" id="I4b-qR-mT8"/>
99 <outlet property="studentParents" destination="CSJ-Ct-dJH" id="pU9-Ds-VC7"/> 99 <outlet property="studentParents" destination="CSJ-Ct-dJH" id="pU9-Ds-VC7"/>
100 </connections> 100 </connections>
101 - <point key="canvasLocation" x="25" y="-62"/> 101 + <point key="canvasLocation" x="25" y="-46.5"/>
102 </tableViewCell> 102 </tableViewCell>
103 </objects> 103 </objects>
104 <resources> 104 <resources>
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckUpTableViewCell.swift
@@ -15,11 +15,11 @@ class GrowCheckUpTableViewCell: UITableViewCell { @@ -15,11 +15,11 @@ class GrowCheckUpTableViewCell: UITableViewCell {
15 @IBOutlet weak var checkCount: UILabel! 15 @IBOutlet weak var checkCount: UILabel!
16 override func awakeFromNib() { 16 override func awakeFromNib() {
17 super.awakeFromNib() 17 super.awakeFromNib()
18 - self.backgroundColor = backgroundColor 18 + self.backgroundColor = backGroundColor
19 19
20 // Initialization code 20 // Initialization code
21 } 21 }
22 - 22 +
23 override func setSelected(_ selected: Bool, animated: Bool) { 23 override func setSelected(_ selected: Bool, animated: Bool) {
24 super.setSelected(selected, animated: animated) 24 super.setSelected(selected, animated: animated)
25 25
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.swift
@@ -9,8 +9,6 @@ @@ -9,8 +9,6 @@
9 import UIKit 9 import UIKit
10 10
11 class EducationDetailCell: UITableViewCell { 11 class EducationDetailCell: UITableViewCell {
12 -  
13 - @IBOutlet weak var lineChartView: UIView!  
14 12
15 var customLineChart = LineChartView() 13 var customLineChart = LineChartView()
16 14
@@ -18,9 +16,10 @@ class EducationDetailCell: UITableViewCell { @@ -18,9 +16,10 @@ class EducationDetailCell: UITableViewCell {
18 super.awakeFromNib() 16 super.awakeFromNib()
19 self.backgroundColor = backgroundColor 17 self.backgroundColor = backgroundColor
20 18
21 - let rect = self.lineChartView.bounds  
22 - print(rect) 19 + let rect = CGRect.init(x: 10, y: 60, width: screenWidth-20, height: self.bounds.size.height-60)
23 customLineChart = LineChartView.init(frame: rect) 20 customLineChart = LineChartView.init(frame: rect)
  21 +
  22 + print("linechart frame = \(customLineChart.frame)")
24 customLineChart.drawUI(xLableArr: nil) 23 customLineChart.drawUI(xLableArr: nil)
25 let arr1 = [4,4,2,1,3] 24 let arr1 = [4,4,2,1,3]
26 let arr2 = [2,1,4,4,5] 25 let arr2 = [2,1,4,4,5]
@@ -29,8 +28,7 @@ class EducationDetailCell: UITableViewCell { @@ -29,8 +28,7 @@ class EducationDetailCell: UITableViewCell {
29 customLineChart.drawLine(point: arr2, color: UIColorWithRGB(R: 220, G: 0, B: 16)) 28 customLineChart.drawLine(point: arr2, color: UIColorWithRGB(R: 220, G: 0, B: 16))
30 29
31 30
32 -  
33 - self.lineChartView.addSubview(customLineChart) 31 + self.addSubview(customLineChart)
34 32
35 33
36 // Initialization code 34 // Initialization code
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.xib
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 <objects> 12 <objects>
13 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> 13 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
14 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> 14 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
15 - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="educationDetail" rowHeight="280" id="kpS-dg-IFL" customClass="EducationDetailCell" customModule="ParentAssistant" customModuleProvider="target"> 15 + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="educationDetail" id="kpS-dg-IFL" customClass="EducationDetailCell" customModule="ParentAssistant" customModuleProvider="target">
16 <rect key="frame" x="0.0" y="0.0" width="375" height="280"/> 16 <rect key="frame" x="0.0" y="0.0" width="375" height="280"/>
17 <autoresizingMask key="autoresizingMask"/> 17 <autoresizingMask key="autoresizingMask"/>
18 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="kpS-dg-IFL" id="pme-x3-3eS"> 18 <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="kpS-dg-IFL" id="pme-x3-3eS">
@@ -56,9 +56,6 @@ @@ -56,9 +56,6 @@
56 </userDefinedRuntimeAttribute> 56 </userDefinedRuntimeAttribute>
57 </userDefinedRuntimeAttributes> 57 </userDefinedRuntimeAttributes>
58 </view> 58 </view>
59 - <view contentMode="scaleToFill" restorationIdentifier="moralLineChart" translatesAutoresizingMaskIntoConstraints="NO" id="RJ2-NP-DNZ">  
60 - <rect key="frame" x="0.0" y="38" width="355" height="231"/>  
61 - </view>  
62 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="今日" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qaG-rY-RUN"> 59 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="今日" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qaG-rY-RUN">
63 <rect key="frame" x="96.5" y="10" width="31" height="18"/> 60 <rect key="frame" x="96.5" y="10" width="31" height="18"/>
64 <fontDescription key="fontDescription" type="system" pointSize="15"/> 61 <fontDescription key="fontDescription" type="system" pointSize="15"/>
@@ -70,15 +67,11 @@ @@ -70,15 +67,11 @@
70 <constraints> 67 <constraints>
71 <constraint firstItem="qaG-rY-RUN" firstAttribute="leading" secondItem="I73-88-oNc" secondAttribute="trailing" constant="10" id="0VJ-ew-dod"/> 68 <constraint firstItem="qaG-rY-RUN" firstAttribute="leading" secondItem="I73-88-oNc" secondAttribute="trailing" constant="10" id="0VJ-ew-dod"/>
72 <constraint firstItem="I73-88-oNc" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="3ah-ko-qBu"/> 69 <constraint firstItem="I73-88-oNc" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="3ah-ko-qBu"/>
73 - <constraint firstItem="RJ2-NP-DNZ" firstAttribute="leading" secondItem="8hE-eE-nri" secondAttribute="leading" id="6wR-aq-VMa"/>  
74 <constraint firstItem="2Pj-Ux-aqd" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="7b1-G7-LVt"/> 70 <constraint firstItem="2Pj-Ux-aqd" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="7b1-G7-LVt"/>
75 <constraint firstItem="2Pj-Ux-aqd" firstAttribute="leading" secondItem="VqB-il-dfx" secondAttribute="trailing" constant="10" id="GZJ-vN-dbK"/> 71 <constraint firstItem="2Pj-Ux-aqd" firstAttribute="leading" secondItem="VqB-il-dfx" secondAttribute="trailing" constant="10" id="GZJ-vN-dbK"/>
76 <constraint firstItem="qaG-rY-RUN" firstAttribute="trailing" secondItem="8hE-eE-nri" secondAttribute="centerX" constant="-50" id="LRa-1p-yGT"/> 72 <constraint firstItem="qaG-rY-RUN" firstAttribute="trailing" secondItem="8hE-eE-nri" secondAttribute="centerX" constant="-50" id="LRa-1p-yGT"/>
77 - <constraint firstItem="RJ2-NP-DNZ" firstAttribute="top" secondItem="qaG-rY-RUN" secondAttribute="bottom" constant="10" id="S9B-Er-RCb"/>  
78 <constraint firstItem="qaG-rY-RUN" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="SWr-TX-5hh"/> 73 <constraint firstItem="qaG-rY-RUN" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="SWr-TX-5hh"/>
79 <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="2Pj-Ux-aqd" secondAttribute="trailing" constant="20" symbolic="YES" id="k19-Pj-S17"/> 74 <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="2Pj-Ux-aqd" secondAttribute="trailing" constant="20" symbolic="YES" id="k19-Pj-S17"/>
80 - <constraint firstAttribute="trailing" secondItem="RJ2-NP-DNZ" secondAttribute="trailing" id="kt1-Cj-ldP"/>  
81 - <constraint firstAttribute="bottom" secondItem="RJ2-NP-DNZ" secondAttribute="bottom" id="oGz-vP-Jcg"/>  
82 <constraint firstItem="VqB-il-dfx" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="vBE-rf-4b9"/> 75 <constraint firstItem="VqB-il-dfx" firstAttribute="top" secondItem="8hE-eE-nri" secondAttribute="top" constant="10" id="vBE-rf-4b9"/>
83 <constraint firstItem="2Pj-Ux-aqd" firstAttribute="leading" secondItem="8hE-eE-nri" secondAttribute="centerX" constant="50" id="w8g-zR-VZj"/> 76 <constraint firstItem="2Pj-Ux-aqd" firstAttribute="leading" secondItem="8hE-eE-nri" secondAttribute="centerX" constant="50" id="w8g-zR-VZj"/>
84 </constraints> 77 </constraints>
@@ -97,9 +90,6 @@ @@ -97,9 +90,6 @@
97 <constraint firstAttribute="bottom" secondItem="8hE-eE-nri" secondAttribute="bottom" id="jpA-IM-rG5"/> 90 <constraint firstAttribute="bottom" secondItem="8hE-eE-nri" secondAttribute="bottom" id="jpA-IM-rG5"/>
98 </constraints> 91 </constraints>
99 </tableViewCellContentView> 92 </tableViewCellContentView>
100 - <connections>  
101 - <outlet property="lineChartView" destination="RJ2-NP-DNZ" id="8HI-zl-yxp"/>  
102 - </connections>  
103 </tableViewCell> 93 </tableViewCell>
104 </objects> 94 </objects>
105 </document> 95 </document>
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/LineChartView.swift
@@ -18,6 +18,8 @@ class LineChartView: UIView { @@ -18,6 +18,8 @@ class LineChartView: UIView {
18 private let xCount = 5 18 private let xCount = 5
19 //最大绩点分数 19 //最大绩点分数
20 private let GPA = 5 20 private let GPA = 5
  21 + //横坐标间隔高度
  22 + private var yCellHeight : CGFloat = 0
21 //储存横纵坐标,画线用 23 //储存横纵坐标,画线用
22 private var xCenterArr = Array<CGFloat>() 24 private var xCenterArr = Array<CGFloat>()
23 private var yCenterArr = Array<CGFloat>() 25 private var yCenterArr = Array<CGFloat>()
@@ -33,11 +35,12 @@ class LineChartView: UIView { @@ -33,11 +35,12 @@ class LineChartView: UIView {
33 private var dateArr = Array<Array<Int>>() 35 private var dateArr = Array<Array<Int>>()
34 //显示的数字 36 //显示的数字
35 var yLabArray = Array<UILabel>() 37 var yLabArray = Array<UILabel>()
36 - 38 +
37 override init(frame: CGRect) { 39 override init(frame: CGRect) {
38 super.init(frame: frame) 40 super.init(frame: frame)
39 - print("frame==\(frame)")  
40 - 41 + if !frame.isEmpty {
  42 + self.yCellHeight = self.bounds.size.height/(CGFloat(yCount)+1)
  43 + }
41 } 44 }
42 func drawUI(xLableArr:Array<String>?){ 45 func drawUI(xLableArr:Array<String>?){
43 46
@@ -50,33 +53,33 @@ class LineChartView: UIView { @@ -50,33 +53,33 @@ class LineChartView: UIView {
50 //设置纵坐标 53 //设置纵坐标
51 private func drawY() { 54 private func drawY() {
52 55
53 - let yHeight = (self.bounds.height-60)/CGFloat(yCount) 56 + let yHeight = yCellHeight
54 for index in 0..<yCount{ 57 for index in 0..<yCount{
55 - let yLab = UILabel.init(frame: CGRect.init(x: 10, y: CGFloat(index)*yHeight, width: 20, height: 20)) 58 + let yLab = UILabel.init(frame: CGRect.init(x: 20, y: CGFloat(index)*yHeight, width: 20, height: 20))
56 yLab.text = "\(GPA-index)" 59 yLab.text = "\(GPA-index)"
57 yLab.textColor = UIColorWithRGB(R: 119, G: 119, B: 119) 60 yLab.textColor = UIColorWithRGB(R: 119, G: 119, B: 119)
58 yLab.font = UIFont.systemFont(ofSize: 14) 61 yLab.font = UIFont.systemFont(ofSize: 14)
59 self.addSubview(yLab) 62 self.addSubview(yLab)
60 63
61 - let lineLab = UILabel.init(frame: CGRect.init(x: 30, y: yLab.center.y, width: screenWidth-60, height: 0.4)) 64 + let lineLab = UILabel.init(frame: CGRect.init(x: 40, y: yLab.center.y, width: self.bounds.size.width-80, height: 0.4))
62 lineLab.backgroundColor = UIColorWithRGB(R: 190, G: 190, B: 190) 65 lineLab.backgroundColor = UIColorWithRGB(R: 190, G: 190, B: 190)
63 self.addSubview(lineLab) 66 self.addSubview(lineLab)
64 67
65 yMoveLaArr.append(yLab) 68 yMoveLaArr.append(yLab)
66 - yCenterArr.append(yLab.frame.origin.y+10) 69 + yCenterArr.append(lineLab.frame.origin.y)
67 } 70 }
68 } 71 }
69 //设置横坐标 72 //设置横坐标
70 private func drawX() { 73 private func drawX() {
71 - let xWidth = (screenWidth-20)/CGFloat(yCount) 74 + let xWidth = (self.bounds.size.width)/CGFloat(yCount)
72 for index in 0..<xCount { 75 for index in 0..<xCount {
73 - let nameBtn = UIButton.init(frame: CGRect.init(x: xWidth+CGFloat(index)*xWidth, y: self.bounds.height-70, width: 40, height: 25)) 76 + let nameBtn = UIButton.init(frame: CGRect.init(x: xWidth+CGFloat(index)*xWidth, y: yCellHeight*6-10, width: 40, height: 30))
74 nameBtn.setTitle(xLabArr[index], for: UIControlState.normal) 77 nameBtn.setTitle(xLabArr[index], for: UIControlState.normal)
75 nameBtn.setTitleColor(UIColorWithRGB(R: 119, G: 119, B: 119), for: UIControlState.normal) 78 nameBtn.setTitleColor(UIColorWithRGB(R: 119, G: 119, B: 119), for: UIControlState.normal)
76 nameBtn.titleLabel!.textAlignment = .center 79 nameBtn.titleLabel!.textAlignment = .center
77 nameBtn.titleLabel!.font = UIFont.systemFont(ofSize: 13) 80 nameBtn.titleLabel!.font = UIFont.systemFont(ofSize: 13)
78 -// nameBtn.backgroundColor = UIColor.orange  
79 nameBtn.tag = index 81 nameBtn.tag = index
  82 +// nameBtn.backgroundColor = UIColor.orange
80 self.addSubview(nameBtn) 83 self.addSubview(nameBtn)
81 84
82 nameBtn.addTarget(self, action: #selector(touchXAction(tap:)), for: UIControlEvents.touchUpInside) 85 nameBtn.addTarget(self, action: #selector(touchXAction(tap:)), for: UIControlEvents.touchUpInside)
@@ -89,12 +92,11 @@ class LineChartView: UIView { @@ -89,12 +92,11 @@ class LineChartView: UIView {
89 func drawLine(point:Array<Int>,color:UIColor){ 92 func drawLine(point:Array<Int>,color:UIColor){
90 93
91 let pointArr = swichPoint(arr: point) 94 let pointArr = swichPoint(arr: point)
92 -  
93 let drawLayer = DrawLayer() 95 let drawLayer = DrawLayer()
94 drawLayer.xPointArr = xCenterArr 96 drawLayer.xPointArr = xCenterArr
95 drawLayer.yPointArr = [yCenterArr[pointArr[0]],yCenterArr[pointArr[1]],yCenterArr[pointArr[2]],yCenterArr[pointArr[3]],yCenterArr[pointArr[4]]] 97 drawLayer.yPointArr = [yCenterArr[pointArr[0]],yCenterArr[pointArr[1]],yCenterArr[pointArr[2]],yCenterArr[pointArr[3]],yCenterArr[pointArr[4]]]
96 drawLayer.bounds = self.bounds 98 drawLayer.bounds = self.bounds
97 - drawLayer.position = self.center 99 + drawLayer.position = CGPoint.init(x: self.bounds.size.width/2, y: self.bounds.size.height/2)
98 drawLayer.lineColor = color 100 drawLayer.lineColor = color
99 self.layer.addSublayer(drawLayer) 101 self.layer.addSublayer(drawLayer)
100 drawLayer.setNeedsDisplay() 102 drawLayer.setNeedsDisplay()
@@ -121,15 +123,15 @@ class LineChartView: UIView { @@ -121,15 +123,15 @@ class LineChartView: UIView {
121 //X轴下划线 123 //X轴下划线
122 let movePath = CGMutablePath() 124 let movePath = CGMutablePath()
123 movePath.move(to: CGPoint.init(x: xCenterArr[index], y: yCenterArr[0])) 125 movePath.move(to: CGPoint.init(x: xCenterArr[index], y: yCenterArr[0]))
124 - movePath.addLine(to: CGPoint.init(x: xCenterArr[index], y: 10+5*(self.bounds.height-60)/CGFloat(yCount))) 126 + movePath.addLine(to: CGPoint.init(x: xCenterArr[index], y: 10+5*(self.bounds.height/(CGFloat(yCount)+1))))
125 lineLayer.path = movePath 127 lineLayer.path = movePath
126 128
127 xMoveLayer.strokeColor = UIColorWithRGB(R: 92, G: 145, B: 230).cgColor 129 xMoveLayer.strokeColor = UIColorWithRGB(R: 92, G: 145, B: 230).cgColor
128 xMoveLayer.lineWidth = 2 130 xMoveLayer.lineWidth = 2
129 self.layer.addSublayer(xMoveLayer) 131 self.layer.addSublayer(xMoveLayer)
130 let movePath2 = CGMutablePath() 132 let movePath2 = CGMutablePath()
131 - movePath2.move(to: CGPoint.init(x: xCenterArr[index]-15, y: self.bounds.height-45))  
132 - movePath2.addLine(to: CGPoint.init(x: xCenterArr[index]+15, y: self.bounds.height-45)) 133 + movePath2.move(to: CGPoint.init(x: xCenterArr[index]-15, y: yCellHeight*6+20))
  134 + movePath2.addLine(to: CGPoint.init(x: xCenterArr[index]+15, y: yCellHeight*6+20))
133 xMoveLayer.path = movePath2 135 xMoveLayer.path = movePath2
134 136
135 if yLabArray.count == dateArr.count { 137 if yLabArray.count == dateArr.count {
@@ -200,7 +202,6 @@ class DrawLayer: CALayer { @@ -200,7 +202,6 @@ class DrawLayer: CALayer {
200 202
201 for i in 0..<xPointArr.count { 203 for i in 0..<xPointArr.count {
202 context.fillEllipse(in: CGRect.init(x: xPointArr[i]-5, y: yPointArr[i]-5, width: 10, height: 10)) 204 context.fillEllipse(in: CGRect.init(x: xPointArr[i]-5, y: yPointArr[i]-5, width: 10, height: 10))
203 -  
204 } 205 }
205 //折线 206 //折线
206 context.setStrokeColor(lineColor.cgColor) 207 context.setStrokeColor(lineColor.cgColor)
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/MoralDetailCell.xib
@@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
6 <dependencies> 6 <dependencies>
7 <deployment identifier="iOS"/> 7 <deployment identifier="iOS"/>
8 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/> 8 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
  9 + <capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
9 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> 10 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
10 </dependencies> 11 </dependencies>
11 <objects> 12 <objects>
@@ -19,55 +20,55 @@ @@ -19,55 +20,55 @@
19 <autoresizingMask key="autoresizingMask"/> 20 <autoresizingMask key="autoresizingMask"/>
20 <subviews> 21 <subviews>
21 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UBb-dh-88b"> 22 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UBb-dh-88b">
22 - <rect key="frame" x="10" y="10" width="355" height="260.5"/> 23 + <rect key="frame" x="10" y="10" width="355" height="261"/>
23 <subviews> 24 <subviews>
24 <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="moral_bg" translatesAutoresizingMaskIntoConstraints="NO" id="1gV-1s-gHe"> 25 <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="moral_bg" translatesAutoresizingMaskIntoConstraints="NO" id="1gV-1s-gHe">
25 - <rect key="frame" x="0.0" y="0.0" width="355" height="260.5"/> 26 + <rect key="frame" x="0.0" y="0.0" width="355" height="261"/>
26 </imageView> 27 </imageView>
27 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="德育得分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pNK-6b-MsE"> 28 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="德育得分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pNK-6b-MsE">
28 - <rect key="frame" x="40" y="15" width="61.5" height="18"/> 29 + <rect key="frame" x="0.0" y="15" width="177" height="18"/>
29 <fontDescription key="fontDescription" type="system" pointSize="15"/> 30 <fontDescription key="fontDescription" type="system" pointSize="15"/>
30 <color key="textColor" red="0.050980392159999999" green="0.1647058824" blue="0.45882352939999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 31 <color key="textColor" red="0.050980392159999999" green="0.1647058824" blue="0.45882352939999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
31 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 32 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
32 </label> 33 </label>
33 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="4.3分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9pn-Mt-3mm"> 34 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="4.3分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9pn-Mt-3mm">
34 - <rect key="frame" x="34" y="48" width="75" height="36"/> 35 + <rect key="frame" x="51.5" y="48" width="75" height="36"/>
35 <fontDescription key="fontDescription" type="system" pointSize="30"/> 36 <fontDescription key="fontDescription" type="system" pointSize="30"/>
36 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> 37 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
37 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 38 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
38 </label> 39 </label>
39 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="第三名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DIr-ge-gbf"> 40 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="第三名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DIr-ge-gbf">
40 - <rect key="frame" x="227" y="50" width="91" height="36"/> 41 + <rect key="frame" x="220.5" y="50" width="91" height="36"/>
41 <fontDescription key="fontDescription" type="system" pointSize="30"/> 42 <fontDescription key="fontDescription" type="system" pointSize="30"/>
42 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> 43 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
43 <nil key="highlightedColor"/> 44 <nil key="highlightedColor"/>
44 </label> 45 </label>
45 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="同期上升1.1分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="J9G-OC-0Wu"> 46 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="同期上升1.1分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="J9G-OC-0Wu">
46 - <rect key="frame" x="24.5" y="104" width="93.5" height="18"/> 47 + <rect key="frame" x="42.5" y="104" width="94" height="18"/>
47 <fontDescription key="fontDescription" type="system" pointSize="15"/> 48 <fontDescription key="fontDescription" type="system" pointSize="15"/>
48 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> 49 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
49 <nil key="highlightedColor"/> 50 <nil key="highlightedColor"/>
50 </label> 51 </label>
51 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="同期上升5名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oaU-aV-pPx"> 52 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="同期上升5名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oaU-aV-pPx">
52 - <rect key="frame" x="229.5" y="106" width="86" height="18"/> 53 + <rect key="frame" x="223.5" y="106" width="86" height="18"/>
53 <fontDescription key="fontDescription" type="system" pointSize="15"/> 54 <fontDescription key="fontDescription" type="system" pointSize="15"/>
54 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> 55 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
55 <nil key="highlightedColor"/> 56 <nil key="highlightedColor"/>
56 </label> 57 </label>
57 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2018年03月03号" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mz0-Fx-X1P"> 58 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2018年03月03号" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mz0-Fx-X1P">
58 - <rect key="frame" x="210" y="15" width="125" height="20"/> 59 + <rect key="frame" x="177" y="15" width="178" height="20"/>
59 <fontDescription key="fontDescription" type="system" pointSize="16"/> 60 <fontDescription key="fontDescription" type="system" pointSize="16"/>
60 <color key="textColor" red="0.08235294118" green="0.39607843139999999" blue="0.75294117650000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 61 <color key="textColor" red="0.08235294118" green="0.39607843139999999" blue="0.75294117650000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
61 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 62 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
62 </label> 63 </label>
63 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="高于平均分1.1分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="anx-4P-Hux"> 64 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="高于平均分1.1分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="anx-4P-Hux">
64 - <rect key="frame" x="16.5" y="132" width="109" height="18"/> 65 + <rect key="frame" x="34.5" y="132" width="109" height="18"/>
65 <fontDescription key="fontDescription" type="system" pointSize="15"/> 66 <fontDescription key="fontDescription" type="system" pointSize="15"/>
66 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> 67 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
67 <nil key="highlightedColor"/> 68 <nil key="highlightedColor"/>
68 </label> 69 </label>
69 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="高于平均排名1.1名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CeX-B7-f6o"> 70 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="高于平均排名1.1名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CeX-B7-f6o">
70 - <rect key="frame" x="210.5" y="134" width="124" height="18"/> 71 + <rect key="frame" x="204.5" y="134" width="124" height="18"/>
71 <fontDescription key="fontDescription" type="system" pointSize="15"/> 72 <fontDescription key="fontDescription" type="system" pointSize="15"/>
72 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> 73 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
73 <nil key="highlightedColor"/> 74 <nil key="highlightedColor"/>
@@ -81,32 +82,44 @@ @@ -81,32 +82,44 @@
81 <color key="textColor" red="0.08235294118" green="0.39607843139999999" blue="0.75294117650000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 82 <color key="textColor" red="0.08235294118" green="0.39607843139999999" blue="0.75294117650000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
82 <nil key="highlightedColor"/> 83 <nil key="highlightedColor"/>
83 </label> 84 </label>
  85 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lbQ-AR-MQY">
  86 + <rect key="frame" x="177" y="-1" width="1" height="1"/>
  87 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  88 + <constraints>
  89 + <constraint firstAttribute="height" constant="1" id="Xna-pd-OOn"/>
  90 + <constraint firstAttribute="width" constant="1" id="dFb-JU-J4K"/>
  91 + </constraints>
  92 + </view>
84 </subviews> 93 </subviews>
85 <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 94 <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
86 <constraints> 95 <constraints>
87 <constraint firstItem="1gV-1s-gHe" firstAttribute="leading" secondItem="UBb-dh-88b" secondAttribute="leading" id="7Hd-yK-MLm"/> 96 <constraint firstItem="1gV-1s-gHe" firstAttribute="leading" secondItem="UBb-dh-88b" secondAttribute="leading" id="7Hd-yK-MLm"/>
88 <constraint firstItem="anx-4P-Hux" firstAttribute="top" secondItem="J9G-OC-0Wu" secondAttribute="bottom" constant="10" id="9FD-EM-rTI"/> 97 <constraint firstItem="anx-4P-Hux" firstAttribute="top" secondItem="J9G-OC-0Wu" secondAttribute="bottom" constant="10" id="9FD-EM-rTI"/>
89 <constraint firstItem="9pn-Mt-3mm" firstAttribute="centerX" secondItem="pNK-6b-MsE" secondAttribute="centerX" id="AnT-t2-Vaz"/> 98 <constraint firstItem="9pn-Mt-3mm" firstAttribute="centerX" secondItem="pNK-6b-MsE" secondAttribute="centerX" id="AnT-t2-Vaz"/>
90 - <constraint firstItem="Mz0-Fx-X1P" firstAttribute="trailing" secondItem="UBb-dh-88b" secondAttribute="trailing" constant="-20" id="DUF-fk-aMY"/>  
91 <constraint firstItem="Wkw-bn-xrx" firstAttribute="top" secondItem="anx-4P-Hux" secondAttribute="bottom" constant="20" id="Gcq-Dr-wY8"/> 99 <constraint firstItem="Wkw-bn-xrx" firstAttribute="top" secondItem="anx-4P-Hux" secondAttribute="bottom" constant="20" id="Gcq-Dr-wY8"/>
92 <constraint firstItem="oaU-aV-pPx" firstAttribute="top" secondItem="DIr-ge-gbf" secondAttribute="bottom" constant="20" id="I4a-rl-CwG"/> 100 <constraint firstItem="oaU-aV-pPx" firstAttribute="top" secondItem="DIr-ge-gbf" secondAttribute="bottom" constant="20" id="I4a-rl-CwG"/>
93 <constraint firstItem="J9G-OC-0Wu" firstAttribute="centerX" secondItem="9pn-Mt-3mm" secondAttribute="centerX" id="ILE-XR-PgX"/> 101 <constraint firstItem="J9G-OC-0Wu" firstAttribute="centerX" secondItem="9pn-Mt-3mm" secondAttribute="centerX" id="ILE-XR-PgX"/>
94 <constraint firstItem="9pn-Mt-3mm" firstAttribute="top" secondItem="pNK-6b-MsE" secondAttribute="bottom" constant="15" id="JcF-eO-1Tf"/> 102 <constraint firstItem="9pn-Mt-3mm" firstAttribute="top" secondItem="pNK-6b-MsE" secondAttribute="bottom" constant="15" id="JcF-eO-1Tf"/>
  103 + <constraint firstItem="Mz0-Fx-X1P" firstAttribute="leading" secondItem="lbQ-AR-MQY" secondAttribute="leading" id="MS0-9w-Uvm"/>
95 <constraint firstItem="anx-4P-Hux" firstAttribute="centerX" secondItem="9pn-Mt-3mm" secondAttribute="centerX" id="N8e-Tq-OFC"/> 104 <constraint firstItem="anx-4P-Hux" firstAttribute="centerX" secondItem="9pn-Mt-3mm" secondAttribute="centerX" id="N8e-Tq-OFC"/>
96 <constraint firstItem="DIr-ge-gbf" firstAttribute="centerX" secondItem="Mz0-Fx-X1P" secondAttribute="centerX" id="PeQ-3p-wPu"/> 105 <constraint firstItem="DIr-ge-gbf" firstAttribute="centerX" secondItem="Mz0-Fx-X1P" secondAttribute="centerX" id="PeQ-3p-wPu"/>
97 <constraint firstItem="DIr-ge-gbf" firstAttribute="top" secondItem="Mz0-Fx-X1P" secondAttribute="bottom" constant="15" id="QlN-Um-QRE"/> 106 <constraint firstItem="DIr-ge-gbf" firstAttribute="top" secondItem="Mz0-Fx-X1P" secondAttribute="bottom" constant="15" id="QlN-Um-QRE"/>
98 <constraint firstItem="CeX-B7-f6o" firstAttribute="centerX" secondItem="DIr-ge-gbf" secondAttribute="centerX" id="S5f-mc-kLf"/> 107 <constraint firstItem="CeX-B7-f6o" firstAttribute="centerX" secondItem="DIr-ge-gbf" secondAttribute="centerX" id="S5f-mc-kLf"/>
  108 + <constraint firstItem="lbQ-AR-MQY" firstAttribute="centerX" secondItem="pNK-6b-MsE" secondAttribute="trailing" id="Vg2-k6-E6F"/>
  109 + <constraint firstItem="pNK-6b-MsE" firstAttribute="leading" secondItem="UBb-dh-88b" secondAttribute="leading" id="VkM-DG-kJc"/>
99 <constraint firstAttribute="bottom" secondItem="1gV-1s-gHe" secondAttribute="bottom" id="WmH-Yr-1VA"/> 110 <constraint firstAttribute="bottom" secondItem="1gV-1s-gHe" secondAttribute="bottom" id="WmH-Yr-1VA"/>
100 <constraint firstAttribute="trailing" secondItem="1gV-1s-gHe" secondAttribute="trailing" id="Yrr-Y6-K8b"/> 111 <constraint firstAttribute="trailing" secondItem="1gV-1s-gHe" secondAttribute="trailing" id="Yrr-Y6-K8b"/>
101 <constraint firstItem="CeX-B7-f6o" firstAttribute="top" secondItem="oaU-aV-pPx" secondAttribute="bottom" constant="10" id="bAv-aS-0Ml"/> 112 <constraint firstItem="CeX-B7-f6o" firstAttribute="top" secondItem="oaU-aV-pPx" secondAttribute="bottom" constant="10" id="bAv-aS-0Ml"/>
  113 + <constraint firstItem="lbQ-AR-MQY" firstAttribute="bottom" secondItem="UBb-dh-88b" secondAttribute="top" id="cTo-iD-BdK"/>
102 <constraint firstItem="oaU-aV-pPx" firstAttribute="centerX" secondItem="DIr-ge-gbf" secondAttribute="centerX" id="dQ5-qu-b7Z"/> 114 <constraint firstItem="oaU-aV-pPx" firstAttribute="centerX" secondItem="DIr-ge-gbf" secondAttribute="centerX" id="dQ5-qu-b7Z"/>
103 <constraint firstItem="pNK-6b-MsE" firstAttribute="top" secondItem="UBb-dh-88b" secondAttribute="top" constant="15" id="fIQ-aq-1Q2"/> 115 <constraint firstItem="pNK-6b-MsE" firstAttribute="top" secondItem="UBb-dh-88b" secondAttribute="top" constant="15" id="fIQ-aq-1Q2"/>
104 <constraint firstAttribute="trailing" secondItem="Wkw-bn-xrx" secondAttribute="trailing" constant="20" id="ikn-5j-7Yc"/> 116 <constraint firstAttribute="trailing" secondItem="Wkw-bn-xrx" secondAttribute="trailing" constant="20" id="ikn-5j-7Yc"/>
105 - <constraint firstItem="pNK-6b-MsE" firstAttribute="leading" secondItem="UBb-dh-88b" secondAttribute="leading" constant="40" id="ipG-Xz-pen"/>  
106 <constraint firstItem="J9G-OC-0Wu" firstAttribute="top" secondItem="9pn-Mt-3mm" secondAttribute="bottom" constant="20" id="n4e-bY-kc9"/> 117 <constraint firstItem="J9G-OC-0Wu" firstAttribute="top" secondItem="9pn-Mt-3mm" secondAttribute="bottom" constant="20" id="n4e-bY-kc9"/>
107 <constraint firstItem="Wkw-bn-xrx" firstAttribute="leading" secondItem="UBb-dh-88b" secondAttribute="leading" constant="20" id="njK-jj-BrM"/> 118 <constraint firstItem="Wkw-bn-xrx" firstAttribute="leading" secondItem="UBb-dh-88b" secondAttribute="leading" constant="20" id="njK-jj-BrM"/>
  119 + <constraint firstItem="lbQ-AR-MQY" firstAttribute="centerX" secondItem="UBb-dh-88b" secondAttribute="centerX" id="pud-lO-4OH"/>
108 <constraint firstItem="1gV-1s-gHe" firstAttribute="top" secondItem="UBb-dh-88b" secondAttribute="top" id="r0a-Sd-FcU"/> 120 <constraint firstItem="1gV-1s-gHe" firstAttribute="top" secondItem="UBb-dh-88b" secondAttribute="top" id="r0a-Sd-FcU"/>
109 <constraint firstItem="Mz0-Fx-X1P" firstAttribute="top" secondItem="UBb-dh-88b" secondAttribute="top" constant="15" id="s6T-Ua-Fvo"/> 121 <constraint firstItem="Mz0-Fx-X1P" firstAttribute="top" secondItem="UBb-dh-88b" secondAttribute="top" constant="15" id="s6T-Ua-Fvo"/>
  122 + <constraint firstAttribute="trailing" secondItem="Mz0-Fx-X1P" secondAttribute="trailing" id="z8n-O1-c5F"/>
110 </constraints> 123 </constraints>
111 <userDefinedRuntimeAttributes> 124 <userDefinedRuntimeAttributes>
112 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/> 125 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/MoralTableViewCell.xib
@@ -6,7 +6,6 @@ @@ -6,7 +6,6 @@
6 <dependencies> 6 <dependencies>
7 <deployment identifier="iOS"/> 7 <deployment identifier="iOS"/>
8 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/> 8 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
9 - <capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>  
10 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> 9 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
11 </dependencies> 10 </dependencies>
12 <objects> 11 <objects>
@@ -36,25 +35,25 @@ @@ -36,25 +35,25 @@
36 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 35 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
37 </label> 36 </label>
38 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="4.3分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="j0A-jN-fqh"> 37 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="4.3分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="j0A-jN-fqh">
39 - <rect key="frame" x="42.5" y="60" width="75" height="36"/> 38 + <rect key="frame" x="0.0" y="60" width="177" height="36"/>
40 <fontDescription key="fontDescription" type="system" pointSize="30"/> 39 <fontDescription key="fontDescription" type="system" pointSize="30"/>
41 <color key="textColor" red="0.19058823590000001" green="0.6052491069" blue="0.92507088179999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 40 <color key="textColor" red="0.19058823590000001" green="0.6052491069" blue="0.92507088179999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
42 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 41 <color key="highlightedColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
43 </label> 42 </label>
44 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="第三名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8d1-dG-Pi6"> 43 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="第三名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8d1-dG-Pi6">
45 - <rect key="frame" x="229.5" y="60" width="91" height="36"/> 44 + <rect key="frame" x="177" y="60" width="178" height="36"/>
46 <fontDescription key="fontDescription" type="system" pointSize="30"/> 45 <fontDescription key="fontDescription" type="system" pointSize="30"/>
47 <color key="textColor" red="0.1980733871" green="0.57266002890000001" blue="0.92558294529999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 46 <color key="textColor" red="0.1980733871" green="0.57266002890000001" blue="0.92558294529999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
48 <nil key="highlightedColor"/> 47 <nil key="highlightedColor"/>
49 </label> 48 </label>
50 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="获得 A- 评分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2GV-uC-noJ"> 49 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="获得 A- 评分" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2GV-uC-noJ">
51 - <rect key="frame" x="29" y="136" width="102.5" height="21.5"/> 50 + <rect key="frame" x="38" y="136" width="102.5" height="21.5"/>
52 <fontDescription key="fontDescription" type="system" pointSize="18"/> 51 <fontDescription key="fontDescription" type="system" pointSize="18"/>
53 <color key="textColor" red="0.1980733871" green="0.57266002890000001" blue="0.92558294529999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 52 <color key="textColor" red="0.1980733871" green="0.57266002890000001" blue="0.92558294529999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
54 <nil key="highlightedColor"/> 53 <nil key="highlightedColor"/>
55 </label> 54 </label>
56 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="名次上升1名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="L60-yA-m2f"> 55 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="名次上升1名" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="L60-yA-m2f">
57 - <rect key="frame" x="225" y="136" width="100" height="21.5"/> 56 + <rect key="frame" x="216" y="136" width="100" height="21.5"/>
58 <fontDescription key="fontDescription" type="system" pointSize="18"/> 57 <fontDescription key="fontDescription" type="system" pointSize="18"/>
59 <color key="textColor" red="0.1980733871" green="0.57266002890000001" blue="0.92558294529999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 58 <color key="textColor" red="0.1980733871" green="0.57266002890000001" blue="0.92558294529999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
60 <nil key="highlightedColor"/> 59 <nil key="highlightedColor"/>
@@ -68,26 +67,39 @@ @@ -68,26 +67,39 @@
68 <color key="textColor" red="0.091986544429999997" green="0.17189717290000001" blue="0.63014686109999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 67 <color key="textColor" red="0.091986544429999997" green="0.17189717290000001" blue="0.63014686109999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
69 <nil key="highlightedColor"/> 68 <nil key="highlightedColor"/>
70 </label> 69 </label>
  70 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cJw-CI-3DA">
  71 + <rect key="frame" x="177" y="134.5" width="1" height="1"/>
  72 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  73 + <constraints>
  74 + <constraint firstAttribute="height" constant="1" id="Xjs-Yt-RTC"/>
  75 + <constraint firstAttribute="width" constant="1" id="ur8-61-C3p"/>
  76 + </constraints>
  77 + </view>
71 </subviews> 78 </subviews>
72 <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 79 <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
73 <constraints> 80 <constraints>
  81 + <constraint firstItem="cJw-CI-3DA" firstAttribute="centerY" secondItem="Vef-nQ-dGv" secondAttribute="centerY" id="3Pr-4U-nTn"/>
74 <constraint firstItem="cKf-6S-lhj" firstAttribute="centerY" secondItem="aWL-Tx-0UW" secondAttribute="centerY" id="5mN-fH-D4I"/> 82 <constraint firstItem="cKf-6S-lhj" firstAttribute="centerY" secondItem="aWL-Tx-0UW" secondAttribute="centerY" id="5mN-fH-D4I"/>
75 <constraint firstItem="j0A-jN-fqh" firstAttribute="top" secondItem="Vef-nQ-dGv" secondAttribute="top" constant="60" id="96O-AW-As9"/> 83 <constraint firstItem="j0A-jN-fqh" firstAttribute="top" secondItem="Vef-nQ-dGv" secondAttribute="top" constant="60" id="96O-AW-As9"/>
76 <constraint firstItem="aWL-Tx-0UW" firstAttribute="leading" secondItem="Vef-nQ-dGv" secondAttribute="leading" id="BYt-px-Cjn"/> 84 <constraint firstItem="aWL-Tx-0UW" firstAttribute="leading" secondItem="Vef-nQ-dGv" secondAttribute="leading" id="BYt-px-Cjn"/>
77 - <constraint firstItem="8d1-dG-Pi6" firstAttribute="centerX" secondItem="Vef-nQ-dGv" secondAttribute="trailing" constant="-80" id="DUf-vl-R8M"/> 85 + <constraint firstItem="j0A-jN-fqh" firstAttribute="leading" secondItem="Vef-nQ-dGv" secondAttribute="leading" id="CSz-vX-K1Y"/>
  86 + <constraint firstItem="cJw-CI-3DA" firstAttribute="centerX" secondItem="Vef-nQ-dGv" secondAttribute="centerX" id="Igi-Zf-6RJ"/>
78 <constraint firstItem="2GV-uC-noJ" firstAttribute="centerX" secondItem="j0A-jN-fqh" secondAttribute="centerX" id="LGc-Jp-07j"/> 87 <constraint firstItem="2GV-uC-noJ" firstAttribute="centerX" secondItem="j0A-jN-fqh" secondAttribute="centerX" id="LGc-Jp-07j"/>
79 <constraint firstItem="L60-yA-m2f" firstAttribute="top" secondItem="8d1-dG-Pi6" secondAttribute="bottom" constant="40" id="MaK-uL-fPP"/> 88 <constraint firstItem="L60-yA-m2f" firstAttribute="top" secondItem="8d1-dG-Pi6" secondAttribute="bottom" constant="40" id="MaK-uL-fPP"/>
80 <constraint firstItem="2GV-uC-noJ" firstAttribute="top" secondItem="j0A-jN-fqh" secondAttribute="bottom" constant="40" id="Ryr-Gh-VGZ"/> 89 <constraint firstItem="2GV-uC-noJ" firstAttribute="top" secondItem="j0A-jN-fqh" secondAttribute="bottom" constant="40" id="Ryr-Gh-VGZ"/>
81 <constraint firstItem="8d1-dG-Pi6" firstAttribute="top" secondItem="Vef-nQ-dGv" secondAttribute="top" constant="60" id="SsE-55-O6O"/> 90 <constraint firstItem="8d1-dG-Pi6" firstAttribute="top" secondItem="Vef-nQ-dGv" secondAttribute="top" constant="60" id="SsE-55-O6O"/>
82 - <constraint firstItem="j0A-jN-fqh" firstAttribute="centerX" secondItem="Vef-nQ-dGv" secondAttribute="leading" constant="80" id="WBT-bt-FLd"/> 91 + <constraint firstItem="8d1-dG-Pi6" firstAttribute="leading" secondItem="cJw-CI-3DA" secondAttribute="trailing" constant="-1" id="TLG-Jg-bYT"/>
  92 + <constraint firstItem="j0A-jN-fqh" firstAttribute="trailing" secondItem="cJw-CI-3DA" secondAttribute="leading" id="WBT-bt-FLd"/>
83 <constraint firstAttribute="bottom" secondItem="9Ae-se-wQu" secondAttribute="bottom" constant="30" id="YNw-rs-gHW"/> 93 <constraint firstAttribute="bottom" secondItem="9Ae-se-wQu" secondAttribute="bottom" constant="30" id="YNw-rs-gHW"/>
84 <constraint firstItem="L60-yA-m2f" firstAttribute="centerX" secondItem="8d1-dG-Pi6" secondAttribute="centerX" id="a47-3Y-yeG"/> 94 <constraint firstItem="L60-yA-m2f" firstAttribute="centerX" secondItem="8d1-dG-Pi6" secondAttribute="centerX" id="a47-3Y-yeG"/>
85 <constraint firstAttribute="trailing" secondItem="9Ae-se-wQu" secondAttribute="trailing" constant="20" id="a9O-Jn-TPZ"/> 95 <constraint firstAttribute="trailing" secondItem="9Ae-se-wQu" secondAttribute="trailing" constant="20" id="a9O-Jn-TPZ"/>
86 <constraint firstItem="aWL-Tx-0UW" firstAttribute="top" secondItem="Vef-nQ-dGv" secondAttribute="top" id="aiN-4Q-1yb"/> 96 <constraint firstItem="aWL-Tx-0UW" firstAttribute="top" secondItem="Vef-nQ-dGv" secondAttribute="top" id="aiN-4Q-1yb"/>
87 <constraint firstAttribute="trailing" secondItem="aWL-Tx-0UW" secondAttribute="trailing" id="avu-SY-2Fa"/> 97 <constraint firstAttribute="trailing" secondItem="aWL-Tx-0UW" secondAttribute="trailing" id="avu-SY-2Fa"/>
  98 + <constraint firstItem="8d1-dG-Pi6" firstAttribute="leading" secondItem="j0A-jN-fqh" secondAttribute="trailing" id="dvm-xj-rjO"/>
88 <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="cKf-6S-lhj" secondAttribute="trailing" constant="20" symbolic="YES" id="g1h-6M-v2g"/> 99 <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="cKf-6S-lhj" secondAttribute="trailing" constant="20" symbolic="YES" id="g1h-6M-v2g"/>
89 <constraint firstItem="9Ae-se-wQu" firstAttribute="leading" secondItem="Vef-nQ-dGv" secondAttribute="leading" constant="20" id="jZW-7n-dLT"/> 100 <constraint firstItem="9Ae-se-wQu" firstAttribute="leading" secondItem="Vef-nQ-dGv" secondAttribute="leading" constant="20" id="jZW-7n-dLT"/>
90 <constraint firstItem="cKf-6S-lhj" firstAttribute="leading" secondItem="Vef-nQ-dGv" secondAttribute="leading" constant="15" id="ube-1E-bnY"/> 101 <constraint firstItem="cKf-6S-lhj" firstAttribute="leading" secondItem="Vef-nQ-dGv" secondAttribute="leading" constant="15" id="ube-1E-bnY"/>
  102 + <constraint firstAttribute="trailing" secondItem="8d1-dG-Pi6" secondAttribute="trailing" id="xNb-PU-QRm"/>
91 </constraints> 103 </constraints>
92 <userDefinedRuntimeAttributes> 104 <userDefinedRuntimeAttributes>
93 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/> 105 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.swift
@@ -9,8 +9,6 @@ @@ -9,8 +9,6 @@
9 import UIKit 9 import UIKit
10 10
11 class SceneMiddleCell: UITableViewCell { 11 class SceneMiddleCell: UITableViewCell {
12 -  
13 - @IBOutlet weak var lineChartView: UIView!  
14 12
15 var customLineChart = LineChartView() 13 var customLineChart = LineChartView()
16 override func awakeFromNib() { 14 override func awakeFromNib() {
@@ -18,7 +16,7 @@ class SceneMiddleCell: UITableViewCell { @@ -18,7 +16,7 @@ class SceneMiddleCell: UITableViewCell {
18 self.backgroundColor = backgroundColor 16 self.backgroundColor = backgroundColor
19 17
20 // Initialization code 18 // Initialization code
21 - let rect = self.lineChartView.bounds 19 + let rect = CGRect.init(x: 0, y: 60, width: screenWidth-20, height: self.bounds.size.height-60)
22 customLineChart = LineChartView.init(frame: rect) 20 customLineChart = LineChartView.init(frame: rect)
23 let customXLabArr = ["03/12","03/13","03/14","03/15","03/16"] 21 let customXLabArr = ["03/12","03/13","03/14","03/15","03/16"]
24 22
@@ -33,7 +31,7 @@ class SceneMiddleCell: UITableViewCell { @@ -33,7 +31,7 @@ class SceneMiddleCell: UITableViewCell {
33 customLineChart.drawLine(point: arr2, color: UIColorWithRGB(R: 92, G: 145, B: 230)) 31 customLineChart.drawLine(point: arr2, color: UIColorWithRGB(R: 92, G: 145, B: 230))
34 customLineChart.drawLine(point: arr3, color: UIColorWithRGB(R: 255, G: 213, B: 79)) 32 customLineChart.drawLine(point: arr3, color: UIColorWithRGB(R: 255, G: 213, B: 79))
35 33
36 - self.lineChartView.addSubview(customLineChart) 34 + self.addSubview(customLineChart)
37 35
38 } 36 }
39 37
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.xib
@@ -22,10 +22,6 @@ @@ -22,10 +22,6 @@
22 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UP8-EA-Pvf"> 22 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UP8-EA-Pvf">
23 <rect key="frame" x="10" y="10" width="355" height="290"/> 23 <rect key="frame" x="10" y="10" width="355" height="290"/>
24 <subviews> 24 <subviews>
25 - <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="EX8-hi-C7V">  
26 - <rect key="frame" x="0.0" y="50" width="355" height="230"/>  
27 - <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  
28 - </view>  
29 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Euo-rc-pzV"> 25 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Euo-rc-pzV">
30 <rect key="frame" x="0.0" y="5" width="355" height="40"/> 26 <rect key="frame" x="0.0" y="5" width="355" height="40"/>
31 <subviews> 27 <subviews>
@@ -112,11 +108,7 @@ @@ -112,11 +108,7 @@
112 <constraints> 108 <constraints>
113 <constraint firstItem="Euo-rc-pzV" firstAttribute="top" secondItem="UP8-EA-Pvf" secondAttribute="top" constant="5" id="2B8-aB-sus"/> 109 <constraint firstItem="Euo-rc-pzV" firstAttribute="top" secondItem="UP8-EA-Pvf" secondAttribute="top" constant="5" id="2B8-aB-sus"/>
114 <constraint firstAttribute="trailing" secondItem="Euo-rc-pzV" secondAttribute="trailing" id="2xB-Rs-xQX"/> 110 <constraint firstAttribute="trailing" secondItem="Euo-rc-pzV" secondAttribute="trailing" id="2xB-Rs-xQX"/>
115 - <constraint firstItem="EX8-hi-C7V" firstAttribute="top" secondItem="Euo-rc-pzV" secondAttribute="bottom" constant="5" id="7BK-xg-bOp"/>  
116 <constraint firstItem="Euo-rc-pzV" firstAttribute="leading" secondItem="UP8-EA-Pvf" secondAttribute="leading" id="8rG-CN-KBe"/> 111 <constraint firstItem="Euo-rc-pzV" firstAttribute="leading" secondItem="UP8-EA-Pvf" secondAttribute="leading" id="8rG-CN-KBe"/>
117 - <constraint firstAttribute="trailing" secondItem="EX8-hi-C7V" secondAttribute="trailing" id="GO7-C2-oIL"/>  
118 - <constraint firstAttribute="bottom" secondItem="EX8-hi-C7V" secondAttribute="bottom" constant="10" id="IQA-zR-tk4"/>  
119 - <constraint firstItem="EX8-hi-C7V" firstAttribute="leading" secondItem="UP8-EA-Pvf" secondAttribute="leading" id="nGt-3M-965"/>  
120 </constraints> 112 </constraints>
121 <userDefinedRuntimeAttributes> 113 <userDefinedRuntimeAttributes>
122 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/> 114 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
@@ -133,9 +125,6 @@ @@ -133,9 +125,6 @@
133 <constraint firstAttribute="bottom" secondItem="UP8-EA-Pvf" secondAttribute="bottom" id="hhO-9X-73m"/> 125 <constraint firstAttribute="bottom" secondItem="UP8-EA-Pvf" secondAttribute="bottom" id="hhO-9X-73m"/>
134 </constraints> 126 </constraints>
135 </tableViewCellContentView> 127 </tableViewCellContentView>
136 - <connections>  
137 - <outlet property="lineChartView" destination="EX8-hi-C7V" id="vtG-wv-efK"/>  
138 - </connections>  
139 </tableViewCell> 128 </tableViewCell>
140 </objects> 129 </objects>
141 </document> 130 </document>
ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneTopCell.xib
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 <dependencies> 6 <dependencies>
7 <deployment identifier="iOS"/> 7 <deployment identifier="iOS"/>
8 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/> 8 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
9 - <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> 9 + <capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
10 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> 10 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
11 </dependencies> 11 </dependencies>
12 <objects> 12 <objects>
@@ -23,45 +23,40 @@ @@ -23,45 +23,40 @@
23 <rect key="frame" x="10" y="10" width="355" height="240"/> 23 <rect key="frame" x="10" y="10" width="355" height="240"/>
24 <subviews> 24 <subviews>
25 <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="report_teacher" translatesAutoresizingMaskIntoConstraints="NO" id="0kV-Bn-EIO"> 25 <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="report_teacher" translatesAutoresizingMaskIntoConstraints="NO" id="0kV-Bn-EIO">
26 - <rect key="frame" x="20" y="20" width="127" height="192"/>  
27 - <constraints>  
28 - <constraint firstAttribute="width" secondItem="0kV-Bn-EIO" secondAttribute="height" multiplier="127:192" id="CuM-VD-Mgs"/>  
29 - <constraint firstAttribute="width" constant="127" id="LeU-PR-uoB"/>  
30 - <constraint firstAttribute="height" constant="192" id="iMM-Kj-jq5"/>  
31 - </constraints> 26 + <rect key="frame" x="20" y="20" width="137.5" height="200"/>
32 </imageView> 27 </imageView>
33 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="文明礼仪" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fRm-iU-0FL"> 28 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="文明礼仪" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fRm-iU-0FL">
34 - <rect key="frame" x="167" y="15" width="73.5" height="21.5"/> 29 + <rect key="frame" x="177.5" y="20" width="73.5" height="21.5"/>
35 <fontDescription key="fontDescription" type="system" pointSize="18"/> 30 <fontDescription key="fontDescription" type="system" pointSize="18"/>
36 <color key="textColor" red="0.08235294118" green="0.39607843139999999" blue="0.75294117650000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 31 <color key="textColor" red="0.08235294118" green="0.39607843139999999" blue="0.75294117650000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
37 <nil key="highlightedColor"/> 32 <nil key="highlightedColor"/>
38 </label> 33 </label>
39 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="得分: 85 分" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YFd-xW-bAd"> 34 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="得分: 85 分" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YFd-xW-bAd">
40 - <rect key="frame" x="167" y="45" width="91.5" height="21.5"/> 35 + <rect key="frame" x="177.5" y="51.5" width="91.5" height="21.5"/>
41 <fontDescription key="fontDescription" type="system" pointSize="18"/> 36 <fontDescription key="fontDescription" type="system" pointSize="18"/>
42 <color key="textColor" red="0.45098039220000002" green="0.70980392160000005" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 37 <color key="textColor" red="0.45098039220000002" green="0.70980392160000005" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
43 <nil key="highlightedColor"/> 38 <nil key="highlightedColor"/>
44 </label> 39 </label>
45 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="绩点: 4.3 分" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mdz-WW-0e2"> 40 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="绩点: 4.3 分" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mdz-WW-0e2">
46 - <rect key="frame" x="167" y="76.5" width="95.5" height="21.5"/> 41 + <rect key="frame" x="177.5" y="83" width="95.5" height="21.5"/>
47 <fontDescription key="fontDescription" type="system" pointSize="18"/> 42 <fontDescription key="fontDescription" type="system" pointSize="18"/>
48 <color key="textColor" red="0.45098039220000002" green="0.70980392160000005" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 43 <color key="textColor" red="0.45098039220000002" green="0.70980392160000005" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
49 <nil key="highlightedColor"/> 44 <nil key="highlightedColor"/>
50 </label> 45 </label>
51 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="等级: A-" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Q56-f5-Ki6"> 46 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="等级: A-" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Q56-f5-Ki6">
52 - <rect key="frame" x="167" y="108" width="66" height="21.5"/> 47 + <rect key="frame" x="177.5" y="114.5" width="66" height="21.5"/>
53 <fontDescription key="fontDescription" type="system" pointSize="18"/> 48 <fontDescription key="fontDescription" type="system" pointSize="18"/>
54 <color key="textColor" red="0.45098039220000002" green="0.70980392160000005" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 49 <color key="textColor" red="0.45098039220000002" green="0.70980392160000005" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
55 <nil key="highlightedColor"/> 50 <nil key="highlightedColor"/>
56 </label> 51 </label>
57 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="指导意见:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GHz-Xc-z3v"> 52 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="指导意见:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GHz-Xc-z3v">
58 - <rect key="frame" x="167" y="149.5" width="65.5" height="18"/> 53 + <rect key="frame" x="177.5" y="146" width="65.5" height="18"/>
59 <fontDescription key="fontDescription" type="system" pointSize="15"/> 54 <fontDescription key="fontDescription" type="system" pointSize="15"/>
60 <color key="textColor" red="0.08235294118" green="0.30980392159999998" blue="0.70196078429999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 55 <color key="textColor" red="0.08235294118" green="0.30980392159999998" blue="0.70196078429999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
61 <nil key="highlightedColor"/> 56 <nil key="highlightedColor"/>
62 </label> 57 </label>
63 <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" text="与上次相比有进步,保持文明礼仪,注意行为规范" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="DW2-7f-liU"> 58 <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" text="与上次相比有进步,保持文明礼仪,注意行为规范" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="DW2-7f-liU">
64 - <rect key="frame" x="162" y="167.5" width="183" height="62.5"/> 59 + <rect key="frame" x="177.5" y="169" width="167.5" height="61"/>
65 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> 60 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
66 <color key="textColor" red="0.08235294118" green="0.30980392159999998" blue="0.70196078429999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 61 <color key="textColor" red="0.08235294118" green="0.30980392159999998" blue="0.70196078429999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
67 <fontDescription key="fontDescription" type="system" pointSize="12"/> 62 <fontDescription key="fontDescription" type="system" pointSize="12"/>
@@ -70,27 +65,24 @@ @@ -70,27 +65,24 @@
70 </subviews> 65 </subviews>
71 <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 66 <color key="backgroundColor" red="0.99999600649999998" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
72 <constraints> 67 <constraints>
73 - <constraint firstItem="Mdz-WW-0e2" firstAttribute="top" secondItem="YFd-xW-bAd" secondAttribute="bottom" constant="10" id="1aS-1q-3rl"/>  
74 - <constraint firstItem="YFd-xW-bAd" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="Btj-Lq-PNu"/>  
75 - <constraint firstItem="GHz-Xc-z3v" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="DPe-Lj-kLt"/>  
76 - <constraint firstItem="0kV-Bn-EIO" firstAttribute="leading" secondItem="Qt1-rh-kBe" secondAttribute="leading" constant="20" id="ENN-nr-sIL"/>  
77 - <constraint firstItem="YFd-xW-bAd" firstAttribute="top" secondItem="fRm-iU-0FL" secondAttribute="top" constant="30" id="HWr-gR-6xL"/>  
78 - <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Mdz-WW-0e2" secondAttribute="trailing" constant="20" symbolic="YES" id="QVc-T2-fp7"/>  
79 - <constraint firstAttribute="bottom" secondItem="DW2-7f-liU" secondAttribute="bottom" constant="10" id="R8u-sF-q0I"/>  
80 - <constraint firstItem="0kV-Bn-EIO" firstAttribute="top" secondItem="Qt1-rh-kBe" secondAttribute="top" constant="20" id="T56-gW-qDD"/>  
81 - <constraint firstAttribute="trailing" secondItem="DW2-7f-liU" secondAttribute="trailing" constant="10" id="UX4-8h-gEJ"/>  
82 - <constraint firstItem="fRm-iU-0FL" firstAttribute="top" secondItem="Qt1-rh-kBe" secondAttribute="top" constant="15" id="V6B-9A-Zqc"/>  
83 - <constraint firstItem="DW2-7f-liU" firstAttribute="leading" secondItem="0kV-Bn-EIO" secondAttribute="trailing" constant="15" id="Yjl-oR-nri"/>  
84 - <constraint firstItem="fRm-iU-0FL" firstAttribute="leading" secondItem="0kV-Bn-EIO" secondAttribute="trailing" constant="20" id="ZSm-YT-5GG"/>  
85 - <constraint firstItem="Q56-f5-Ki6" firstAttribute="top" secondItem="Mdz-WW-0e2" secondAttribute="bottom" constant="10" id="cjY-7W-lco"/>  
86 - <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="fRm-iU-0FL" secondAttribute="trailing" constant="20" symbolic="YES" id="doC-AH-F5v"/>  
87 - <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Q56-f5-Ki6" secondAttribute="trailing" constant="20" symbolic="YES" id="hze-Hn-z46"/>  
88 - <constraint firstItem="Mdz-WW-0e2" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="j5J-0f-iTJ"/>  
89 - <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="GHz-Xc-z3v" secondAttribute="trailing" constant="20" symbolic="YES" id="law-iT-HfB"/>  
90 - <constraint firstItem="GHz-Xc-z3v" firstAttribute="top" secondItem="Q56-f5-Ki6" secondAttribute="bottom" constant="20" id="mce-jv-MW6"/>  
91 - <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="YFd-xW-bAd" secondAttribute="trailing" constant="20" symbolic="YES" id="q17-sT-ycf"/>  
92 - <constraint firstItem="Q56-f5-Ki6" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="rwH-Co-iSg"/>  
93 - <constraint firstItem="DW2-7f-liU" firstAttribute="top" secondItem="GHz-Xc-z3v" secondAttribute="bottom" id="uwQ-WS-I1G"/> 68 + <constraint firstItem="0kV-Bn-EIO" firstAttribute="leading" secondItem="Qt1-rh-kBe" secondAttribute="leading" constant="20" id="22f-sW-e0K"/>
  69 + <constraint firstItem="Q56-f5-Ki6" firstAttribute="top" secondItem="Mdz-WW-0e2" secondAttribute="bottom" constant="10" id="3M2-xb-Loy"/>
  70 + <constraint firstItem="GHz-Xc-z3v" firstAttribute="top" secondItem="Q56-f5-Ki6" secondAttribute="bottom" constant="10" id="Ajv-61-BoL"/>
  71 + <constraint firstItem="fRm-iU-0FL" firstAttribute="leading" secondItem="0kV-Bn-EIO" secondAttribute="trailing" constant="20" id="DR0-Dn-3Dn"/>
  72 + <constraint firstItem="YFd-xW-bAd" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="IB9-1Z-rbV"/>
  73 + <constraint firstItem="fRm-iU-0FL" firstAttribute="leading" secondItem="Qt1-rh-kBe" secondAttribute="centerX" id="K3a-RL-ADv"/>
  74 + <constraint firstItem="DW2-7f-liU" firstAttribute="top" secondItem="GHz-Xc-z3v" secondAttribute="bottom" constant="5" id="MI2-Ub-TBa"/>
  75 + <constraint firstItem="DW2-7f-liU" firstAttribute="leading" secondItem="Qt1-rh-kBe" secondAttribute="centerX" id="Q7d-LV-UEw"/>
  76 + <constraint firstItem="0kV-Bn-EIO" firstAttribute="top" secondItem="Qt1-rh-kBe" secondAttribute="top" constant="20" id="RFG-LA-ndp"/>
  77 + <constraint firstAttribute="bottom" secondItem="0kV-Bn-EIO" secondAttribute="bottom" constant="20" id="SlH-Q8-nOa"/>
  78 + <constraint firstItem="Q56-f5-Ki6" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="WBz-0O-usS"/>
  79 + <constraint firstItem="GHz-Xc-z3v" firstAttribute="leading" secondItem="Q56-f5-Ki6" secondAttribute="leading" id="bNc-fr-ElR"/>
  80 + <constraint firstItem="Mdz-WW-0e2" firstAttribute="leading" secondItem="fRm-iU-0FL" secondAttribute="leading" id="bkd-Lm-GcY"/>
  81 + <constraint firstAttribute="bottom" secondItem="DW2-7f-liU" secondAttribute="bottom" constant="10" id="fE7-Ju-xC8"/>
  82 + <constraint firstAttribute="trailing" secondItem="DW2-7f-liU" secondAttribute="trailing" constant="10" id="hSd-Fa-Cjl"/>
  83 + <constraint firstItem="YFd-xW-bAd" firstAttribute="top" secondItem="fRm-iU-0FL" secondAttribute="bottom" constant="10" id="i0b-MY-9qe"/>
  84 + <constraint firstItem="Mdz-WW-0e2" firstAttribute="top" secondItem="YFd-xW-bAd" secondAttribute="bottom" constant="10" id="qEY-Em-PTV"/>
  85 + <constraint firstItem="fRm-iU-0FL" firstAttribute="top" secondItem="Qt1-rh-kBe" secondAttribute="top" constant="20" id="sU8-eu-rZ2"/>
94 </constraints> 86 </constraints>
95 <userDefinedRuntimeAttributes> 87 <userDefinedRuntimeAttributes>
96 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/> 88 <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
ParentAssistant/ParentAssistant/Classes/controllers/my/My.storyboard
@@ -701,7 +701,7 @@ @@ -701,7 +701,7 @@
701 <nil key="highlightedColor"/> 701 <nil key="highlightedColor"/>
702 </label> 702 </label>
703 <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入密码:6-16个字符" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="gCl-Eo-o16"> 703 <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入密码:6-16个字符" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="gCl-Eo-o16">
704 - <rect key="frame" x="8" y="15.5" width="359" height="19"/> 704 + <rect key="frame" x="8" y="15.5" width="325" height="19"/>
705 <nil key="textColor"/> 705 <nil key="textColor"/>
706 <fontDescription key="fontDescription" type="system" pointSize="14"/> 706 <fontDescription key="fontDescription" type="system" pointSize="14"/>
707 <textInputTraits key="textInputTraits" keyboardType="numbersAndPunctuation" returnKeyType="done" secureTextEntry="YES"/> 707 <textInputTraits key="textInputTraits" keyboardType="numbersAndPunctuation" returnKeyType="done" secureTextEntry="YES"/>
@@ -736,7 +736,7 @@ @@ -736,7 +736,7 @@
736 <constraint firstItem="hJh-bv-QHJ" firstAttribute="leading" secondItem="ZzP-2M-6De" secondAttribute="leading" constant="8" id="7yX-1H-WJI"/> 736 <constraint firstItem="hJh-bv-QHJ" firstAttribute="leading" secondItem="ZzP-2M-6De" secondAttribute="leading" constant="8" id="7yX-1H-WJI"/>
737 <constraint firstItem="gCl-Eo-o16" firstAttribute="leading" secondItem="ZzP-2M-6De" secondAttribute="leading" constant="8" id="VJU-f4-B9i"/> 737 <constraint firstItem="gCl-Eo-o16" firstAttribute="leading" secondItem="ZzP-2M-6De" secondAttribute="leading" constant="8" id="VJU-f4-B9i"/>
738 <constraint firstItem="gCl-Eo-o16" firstAttribute="centerY" secondItem="ZzP-2M-6De" secondAttribute="centerY" id="fOp-xR-BIv"/> 738 <constraint firstItem="gCl-Eo-o16" firstAttribute="centerY" secondItem="ZzP-2M-6De" secondAttribute="centerY" id="fOp-xR-BIv"/>
739 - <constraint firstItem="gCl-Eo-o16" firstAttribute="centerX" secondItem="ZzP-2M-6De" secondAttribute="centerX" id="lLM-KQ-8r7"/> 739 + <constraint firstItem="LZQ-J0-sNe" firstAttribute="leading" secondItem="gCl-Eo-o16" secondAttribute="trailing" constant="5" id="oe6-Yk-iHm"/>
740 <constraint firstAttribute="trailing" secondItem="LZQ-J0-sNe" secondAttribute="trailing" constant="10" id="ylc-el-X0w"/> 740 <constraint firstAttribute="trailing" secondItem="LZQ-J0-sNe" secondAttribute="trailing" constant="10" id="ylc-el-X0w"/>
741 </constraints> 741 </constraints>
742 </tableViewCellContentView> 742 </tableViewCellContentView>
ParentAssistant/ParentAssistant/Classes/util/network.swift
@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 8
9 import Foundation 9 import Foundation
10 import Alamofire 10 import Alamofire
  11 +import AlamofireImage
11 //http工具 12 //http工具
12 final class KHttp{ 13 final class KHttp{
13 private static func http(method:HTTPMethod,url:String,parameters: [String: AnyObject]? = nil,encoding: ParameterEncoding = URLEncoding.default,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> ()){ 14 private static func http(method:HTTPMethod,url:String,parameters: [String: AnyObject]? = nil,encoding: ParameterEncoding = URLEncoding.default,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> ()){
@@ -287,3 +288,28 @@ func httpJsonResule(jsonString:String?,error:NSError?,successHandler:(JSON)-&gt;Voi @@ -287,3 +288,28 @@ func httpJsonResule(jsonString:String?,error:NSError?,successHandler:(JSON)-&gt;Voi
287 } 288 }
288 } 289 }
289 } 290 }
  291 +
  292 +// MARK: - 对UIImageView的网络加载图片扩展
  293 +extension UIImageView {
  294 +
  295 + /// 网络加载图片
  296 + ///
  297 + /// - Parameters:
  298 + /// - urlStr: 图片网络地址字符串
  299 + /// - placeholder: 默认替代图片
  300 + func setImageWithUrl(urlStr:String,placeholder:String?) {
  301 + if !(urlStr.isEmpty){
  302 + let imageUrl = URL.init(string: urlStr)
  303 + if placeholder == nil {
  304 + self.af_setImage(withURL: imageUrl!)
  305 + }else{
  306 + self.af_setImage(withURL: imageUrl!, placeholderImage: UIImage.init(named: placeholder!))
  307 + }
  308 + }else{
  309 + if let image = placeholder {
  310 + self.image = UIImage.init(named: image)
  311 + }
  312 + }
  313 + }
  314 +}
  315 +
ParentAssistant/ParentAssistant/Classes/util/utils.swift
@@ -9,6 +9,7 @@ @@ -9,6 +9,7 @@
9 import UIKit 9 import UIKit
10 import QuickLook 10 import QuickLook
11 import Photos 11 import Photos
  12 +
12 //MARK: - 服务器和log打印设置 13 //MARK: - 服务器和log打印设置
13 class Debug{ 14 class Debug{
14 static let enable=false//是否打印log 15 static let enable=false//是否打印log
@@ -589,6 +590,7 @@ extension UIViewController{ @@ -589,6 +590,7 @@ extension UIViewController{
589 } 590 }
590 } 591 }
591 592
  593 +
592 func getPercentEncodingString(str:String) -> String { 594 func getPercentEncodingString(str:String) -> String {
593 return String(describing: str.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!) 595 return String(describing: str.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)
594 } 596 }
ParentAssistant/ParentAssistant/Supporting Files/Assets.xcassets/report/program_loadfail.imageset/Contents.json 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "idiom" : "universal",
  9 + "filename" : "program_loadfail@2x.png",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 \ No newline at end of file 22 \ No newline at end of file
ParentAssistant/ParentAssistant/Supporting Files/Assets.xcassets/report/program_loadfail.imageset/program_loadfail@2x.png 0 → 100644

74.5 KB

ParentAssistant/Podfile
@@ -5,7 +5,8 @@ inhibit_all_warnings! @@ -5,7 +5,8 @@ inhibit_all_warnings!
5 target 'ParentAssistant' do 5 target 'ParentAssistant' do
6 6
7 pod 'HandyJSON', '~> 4.1.1' 7 pod 'HandyJSON', '~> 4.1.1'
8 - pod 'Alamofire','~>4.0.1' 8 + pod 'Alamofire','~>4.7.2'
  9 + pod 'AlamofireImage','~> 3.3.1'
9 pod 'SDWebImage','~>3.8.2' 10 pod 'SDWebImage','~>3.8.2'
10 pod 'Toast','~>3.1.0' 11 pod 'Toast','~>3.1.0'
11 pod 'XRCarouselView','~>2.5.6' 12 pod 'XRCarouselView','~>2.5.6'
@@ -18,5 +19,4 @@ target &#39;ParentAssistant&#39; do @@ -18,5 +19,4 @@ target &#39;ParentAssistant&#39; do
18 pod 'SVProgressHUD','~>2.2.5' 19 pod 'SVProgressHUD','~>2.2.5'
19 pod 'NIMSDK_LITE','~>4.9.0' 20 pod 'NIMSDK_LITE','~>4.9.0'
20 pod 'SwiftHash','~>2.0.1' 21 pod 'SwiftHash','~>2.0.1'
21 -  
22 end 22 end
ParentAssistant/Podfile.lock
1 PODS: 1 PODS:
2 - - Alamofire (4.0.1) 2 + - Alamofire (4.7.2)
  3 + - AlamofireImage (3.3.1):
  4 + - Alamofire (~> 4.5)
3 - DZNEmptyDataSet (1.8.1) 5 - DZNEmptyDataSet (1.8.1)
4 - HandyJSON (4.1.1) 6 - HandyJSON (4.1.1)
5 - NIMSDK_LITE (4.9.0) 7 - NIMSDK_LITE (4.9.0)
@@ -19,7 +21,8 @@ PODS: @@ -19,7 +21,8 @@ PODS:
19 - XRCarouselView (2.5.6) 21 - XRCarouselView (2.5.6)
20 22
21 DEPENDENCIES: 23 DEPENDENCIES:
22 - - Alamofire (~> 4.0.1) 24 + - Alamofire (~> 4.7.2)
  25 + - AlamofireImage (~> 3.3.1)
23 - DZNEmptyDataSet (~> 1.8.1) 26 - DZNEmptyDataSet (~> 1.8.1)
24 - HandyJSON (~> 4.1.1) 27 - HandyJSON (~> 4.1.1)
25 - NIMSDK_LITE (~> 4.9.0) 28 - NIMSDK_LITE (~> 4.9.0)
@@ -35,7 +38,8 @@ DEPENDENCIES: @@ -35,7 +38,8 @@ DEPENDENCIES:
35 - XRCarouselView (~> 2.5.6) 38 - XRCarouselView (~> 2.5.6)
36 39
37 SPEC CHECKSUMS: 40 SPEC CHECKSUMS:
38 - Alamofire: 7682d43245de14874acd142ec137b144aa1dd335 41 + Alamofire: e4fa87002c137ba2d8d634d2c51fabcda0d5c223
  42 + AlamofireImage: 3b35b586853abaf94ca1250f4e94cff3c21a4c0d
39 DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7 43 DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7
40 HandyJSON: 3a3de917c4118767ffe41c29b5acba23409649f4 44 HandyJSON: 3a3de917c4118767ffe41c29b5acba23409649f4
41 NIMSDK_LITE: a69a019544299a1b597db6ebf98927f5e12fa17c 45 NIMSDK_LITE: a69a019544299a1b597db6ebf98927f5e12fa17c
@@ -50,6 +54,6 @@ SPEC CHECKSUMS: @@ -50,6 +54,6 @@ SPEC CHECKSUMS:
50 UMCSecurityPlugins: 0831a08f3988f3cea9f1d3a7626cd9bee4fef150 54 UMCSecurityPlugins: 0831a08f3988f3cea9f1d3a7626cd9bee4fef150
51 XRCarouselView: 52529f924d26ee4787f9bd958150800b73e60922 55 XRCarouselView: 52529f924d26ee4787f9bd958150800b73e60922
52 56
53 -PODFILE CHECKSUM: ef5a2eedc2a762110d9f7458ad01512ced09aba0 57 +PODFILE CHECKSUM: fb172574c836b57e7c792807c655a091aff17050
54 58
55 COCOAPODS: 1.4.0 59 COCOAPODS: 1.4.0
ParentAssistant/Pods/Alamofire/LICENSE
1 -Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 1 +Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
2 2
3 Permission is hereby granted, free of charge, to any person obtaining a copy 3 Permission is hereby granted, free of charge, to any person obtaining a copy
4 of this software and associated documentation files (the "Software"), to deal 4 of this software and associated documentation files (the "Software"), to deal
ParentAssistant/Pods/Alamofire/README.md
1 -![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/assets/alamofire.png) 1 +![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/master/alamofire.png)
2 2
3 [![Build Status](https://travis-ci.org/Alamofire/Alamofire.svg?branch=master)](https://travis-ci.org/Alamofire/Alamofire) 3 [![Build Status](https://travis-ci.org/Alamofire/Alamofire.svg?branch=master)](https://travis-ci.org/Alamofire/Alamofire)
4 [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Alamofire.svg)](https://img.shields.io/cocoapods/v/Alamofire.svg) 4 [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Alamofire.svg)](https://img.shields.io/cocoapods/v/Alamofire.svg)
5 [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 5 [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
6 -[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](http://cocoadocs.org/docsets/Alamofire) 6 +[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](https://alamofire.github.io/Alamofire)
7 [![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF) 7 [![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF)
  8 +[![Gitter](https://badges.gitter.im/Alamofire/Alamofire.svg)](https://gitter.im/Alamofire/Alamofire?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
8 9
9 Alamofire is an HTTP networking library written in Swift. 10 Alamofire is an HTTP networking library written in Swift.
10 11
@@ -14,16 +15,16 @@ Alamofire is an HTTP networking library written in Swift. @@ -14,16 +15,16 @@ Alamofire is an HTTP networking library written in Swift.
14 - [Migration Guides](#migration-guides) 15 - [Migration Guides](#migration-guides)
15 - [Communication](#communication) 16 - [Communication](#communication)
16 - [Installation](#installation) 17 - [Installation](#installation)
17 -- [Usage](#usage)  
18 - - **Intro -** [Making a Request](#making-a-request), [Response Handling](#response-handling), [Response Validation](#response-validation), [Response Caching](#response-caching)  
19 - - **HTTP -** [HTTP Methods](#http-methods), [Parameter Encoding](#parameter-encoding), [HTTP Headers](#http-headers), [Authentication](#authentication)  
20 - - **Large Data -** [Downloading Data to a File](#downloading-data-to-a-file), [Uploading Data to a Server](#uploading-data-to-a-server)  
21 - - **Tools -** [Statistical Metrics](#statistical-metrics), [cURL Command Output](#curl-command-output)  
22 -- [Advanced Usage](#advanced-usage)  
23 - - **URL Session -** [Session Manager](#session-manager), [Session Delegate](#session-delegate), [Request](#request)  
24 - - **Routing -** [Routing Requests](#routing-requests), [Adapting and Retrying Requests](#adapting-and-retrying-requests)  
25 - - **Model Objects -** [Custom Response Serialization](#custom-response-serialization)  
26 - - **Connection -** [Security](#security), [Network Reachability](#network-reachability) 18 +- [Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md)
  19 + - **Intro -** [Making a Request](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#making-a-request), [Response Handling](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-handling), [Response Validation](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-validation), [Response Caching](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-caching)
  20 + - **HTTP -** [HTTP Methods](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-methods), [Parameter Encoding](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#parameter-encoding), [HTTP Headers](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-headers), [Authentication](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#authentication)
  21 + - **Large Data -** [Downloading Data to a File](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#downloading-data-to-a-file), [Uploading Data to a Server](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#uploading-data-to-a-server)
  22 + - **Tools -** [Statistical Metrics](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#statistical-metrics), [cURL Command Output](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#curl-command-output)
  23 +- [Advanced Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md)
  24 + - **URL Session -** [Session Manager](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#session-manager), [Session Delegate](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#session-delegate), [Request](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#request)
  25 + - **Routing -** [Routing Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#routing-requests), [Adapting and Retrying Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#adapting-and-retrying-requests)
  26 + - **Model Objects -** [Custom Response Serialization](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#custom-response-serialization)
  27 + - **Connection -** [Security](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#security), [Network Reachability](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#network-reachability)
27 - [Open Radars](#open-radars) 28 - [Open Radars](#open-radars)
28 - [FAQ](#faq) 29 - [FAQ](#faq)
29 - [Credits](#credits) 30 - [Credits](#credits)
@@ -44,7 +45,7 @@ Alamofire is an HTTP networking library written in Swift. @@ -44,7 +45,7 @@ Alamofire is an HTTP networking library written in Swift.
44 - [x] TLS Certificate and Public Key Pinning 45 - [x] TLS Certificate and Public Key Pinning
45 - [x] Network Reachability 46 - [x] Network Reachability
46 - [x] Comprehensive Unit and Integration Test Coverage 47 - [x] Comprehensive Unit and Integration Test Coverage
47 -- [x] [Complete Documentation](http://cocoadocs.org/docsets/Alamofire) 48 +- [x] [Complete Documentation](https://alamofire.github.io/Alamofire)
48 49
49 ## Component Libraries 50 ## Component Libraries
50 51
@@ -55,9 +56,9 @@ In order to keep Alamofire focused specifically on core networking implementatio @@ -55,9 +56,9 @@ In order to keep Alamofire focused specifically on core networking implementatio
55 56
56 ## Requirements 57 ## Requirements
57 58
58 -- iOS 9.0+ / macOS 10.11+ / tvOS 9.0+ / watchOS 2.0+  
59 -- Xcode 8.0+  
60 -- Swift 3.0+ 59 +- iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+
  60 +- Xcode 8.3+
  61 +- Swift 3.1+
61 62
62 ## Migration Guides 63 ## Migration Guides
63 64
@@ -83,7 +84,7 @@ In order to keep Alamofire focused specifically on core networking implementatio @@ -83,7 +84,7 @@ In order to keep Alamofire focused specifically on core networking implementatio
83 $ gem install cocoapods 84 $ gem install cocoapods
84 ``` 85 ```
85 86
86 -> CocoaPods 1.1.0+ is required to build Alamofire 4.0.0+. 87 +> CocoaPods 1.1+ is required to build Alamofire 4.0+.
87 88
88 To integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`: 89 To integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`:
89 90
@@ -93,7 +94,7 @@ platform :ios, &#39;10.0&#39; @@ -93,7 +94,7 @@ platform :ios, &#39;10.0&#39;
93 use_frameworks! 94 use_frameworks!
94 95
95 target '<Your Target Name>' do 96 target '<Your Target Name>' do
96 - pod 'Alamofire', '~> 4.0' 97 + pod 'Alamofire', '~> 4.7'
97 end 98 end
98 ``` 99 ```
99 100
@@ -117,1591 +118,85 @@ $ brew install carthage @@ -117,1591 +118,85 @@ $ brew install carthage
117 To integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`: 118 To integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`:
118 119
119 ```ogdl 120 ```ogdl
120 -github "Alamofire/Alamofire" ~> 4.0 121 +github "Alamofire/Alamofire" ~> 4.7
121 ``` 122 ```
122 123
123 Run `carthage update` to build the framework and drag the built `Alamofire.framework` into your Xcode project. 124 Run `carthage update` to build the framework and drag the built `Alamofire.framework` into your Xcode project.
124 125
125 -### Manually  
126 -  
127 -If you prefer not to use either of the aforementioned dependency managers, you can integrate Alamofire into your project manually.  
128 -  
129 -#### Embedded Framework  
130 -  
131 -- Open up Terminal, `cd` into your top-level project directory, and run the following command "if" your project is not initialized as a git repository:  
132 -  
133 -```bash  
134 -$ git init  
135 -```  
136 -  
137 -- Add Alamofire as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command:  
138 -  
139 -```bash  
140 -$ git submodule add https://github.com/Alamofire/Alamofire.git  
141 -```  
142 -  
143 -- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project.  
144 -  
145 - > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.  
146 -  
147 -- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target.  
148 -- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the "Targets" heading in the sidebar.  
149 -- In the tab bar at the top of that window, open the "General" panel.  
150 -- Click on the `+` button under the "Embedded Binaries" section.  
151 -- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder.  
152 -  
153 - > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`.  
154 -  
155 -- Select the top `Alamofire.framework` for iOS and the bottom one for OS X.  
156 -  
157 - > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as either `Alamofire iOS`, `Alamofire macOS`, `Alamofire tvOS` or `Alamofire watchOS`.  
158 -  
159 -- And that's it!  
160 -  
161 -> The `Alamofire.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.  
162 -  
163 ----  
164 -  
165 -## Usage  
166 -  
167 -### Making a Request  
168 -  
169 -```swift  
170 -import Alamofire  
171 -  
172 -Alamofire.request("https://httpbin.org/get")  
173 -```  
174 -  
175 -### Response Handling  
176 -  
177 -Handling the `Response` of a `Request` made in Alamofire involves chaining a response handler onto the `Request`.  
178 -  
179 -```swift  
180 -Alamofire.request("https://httpbin.org/get").responseJSON { response in  
181 - print(response.request) // original URL request  
182 - print(response.response) // HTTP URL response  
183 - print(response.data) // server data  
184 - print(response.result) // result of response serialization  
185 -  
186 - if let JSON = response.result.value {  
187 - print("JSON: \(JSON)")  
188 - }  
189 -}  
190 -```  
191 -  
192 -In the above example, the `responseJSON` handler is appended to the `Request` to be executed once the `Request` is complete. Rather than blocking execution to wait for a response from the server, a [callback](http://en.wikipedia.org/wiki/Callback_%28computer_programming%29) in the form of a closure is specified to handle the response once it's received. The result of a request is only available inside the scope of a response closure. Any execution contingent on the response or data received from the server must be done within a response closure.  
193 -  
194 -> Networking in Alamofire is done _asynchronously_. Asynchronous programming may be a source of frustration to programmers unfamiliar with the concept, but there are [very good reasons](https://developer.apple.com/library/ios/qa/qa1693/_index.html) for doing it this way.  
195 -  
196 -Alamofire contains five different response handlers by default including:  
197 -  
198 -```swift  
199 -// Response Handler - Unserialized Response  
200 -func response(  
201 - queue: DispatchQueue?,  
202 - completionHandler: @escaping (DefaultDownloadResponse) -> Void)  
203 - -> Self  
204 -  
205 -// Response Data Handler - Serialized into Data  
206 -func responseData(  
207 - queue: DispatchQueue?,  
208 - completionHandler: @escaping (DataResponse<Data>) -> Void)  
209 - -> Self  
210 -  
211 -// Response String Handler - Serialized into String  
212 -func responseString(  
213 - queue: DispatchQueue?,  
214 - encoding: String.Encoding?,  
215 - completionHandler: @escaping (DataResponse<String>) -> Void)  
216 - -> Self  
217 -  
218 -// Response JSON Handler - Serialized into Any  
219 -func responseJSON(  
220 - queue: DispatchQueue?,  
221 - completionHandler: @escaping (DataResponse<Any>) -> Void)  
222 - -> Self  
223 -  
224 -// Response PropertyList (plist) Handler - Serialized into Any  
225 -func responsePropertyList(  
226 - queue: DispatchQueue?,  
227 - completionHandler: @escaping (DataResponse<Any>) -> Void))  
228 - -> Self  
229 -```  
230 -  
231 -None of the response handlers perform any validation of the `HTTPURLResponse` it gets back from the server.  
232 -  
233 -> For example, response status codes in the `400..<499` and `500..<599` ranges do NOT automatically trigger an `Error`. Alamofire uses [Response Validation](#response-validation) method chaining to achieve this.  
234 -  
235 -#### Response Handler  
236 -  
237 -The `response` handler does NOT evaluate any of the response data. It merely forwards on all information directly from the URL session delegate. It is the Alamofire equivalent of using `cURL` to execute a `Request`.  
238 -  
239 -```swift  
240 -Alamofire.request("https://httpbin.org/get").response { response in  
241 - print("Request: \(response.request)")  
242 - print("Response: \(response.response)")  
243 - print("Error: \(response.data)")  
244 -  
245 - if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {  
246 - print("Data: \(utf8Text)")  
247 - }  
248 -}  
249 -```  
250 -  
251 -> We strongly encourage you to leverage the other response serializers taking advantage of `Response` and `Result` types.  
252 -  
253 -#### Response Data Handler  
254 -  
255 -The `responseData` handler uses the `responseDataSerializer` (the object that serializes the server data into some other type) to extract the `Data` returned by the server. If no errors occur and `Data` is returned, the response `Result` will be a `.success` and the `value` will be of type `Data`.  
256 -  
257 -```swift  
258 -Alamofire.request("https://httpbin.org/get").responseData { response in  
259 - debugPrint("All Response Info: \(response)")  
260 -  
261 - if let data = response.result.value, let utf8Text = String(data: data, encoding: .utf8) {  
262 - print("Data: \(utf8Text)")  
263 - }  
264 -}  
265 -```  
266 -  
267 -#### Response String Handler  
268 -  
269 -The `responseString` handler uses the `responseStringSerializer` to convert the `Data` returned by the server into a `String` with the specified encoding. If no errors occur and the server data is successfully serialized into a `String`, the response `Result` will be a `.success` and the `value` will be of type `String`.  
270 -  
271 -```swift  
272 -Alamofire.request("https://httpbin.org/get").responseString { response in  
273 - print("Success: \(response.result.isSuccess)")  
274 - print("Response String: \(response.result.value)")  
275 -}  
276 -```  
277 -  
278 -> If no encoding is specified, Alamofire will use the text encoding specified in the `HTTPURLResponse` from the server. If the text encoding cannot be determined by the server response, it defaults to `.isoLatin1`.  
279 -  
280 -#### Response JSON Handler  
281 -  
282 -The `responseJSON` handler uses the `responseJSONSerializer` to convert the `Data` returned by the server into an `Any` type using the specified `JSONSerialization.ReadingOptions`. If no errors occur and the server data is successfully serialized into a JSON object, the response `Result` will be a `.success` and the `value` will be of type `Any`.  
283 -  
284 -```swift  
285 -Alamofire.request("https://httpbin.org/get").responseJSON { response in  
286 - debugPrint(response)  
287 -  
288 - if let json = response.result.value {  
289 - print("JSON: \(json)")  
290 - }  
291 -}  
292 -```  
293 -  
294 -> All JSON serialization is handled by the `JSONSerialization` API in the `Foundation` framework.  
295 -  
296 -#### Chained Response Handlers  
297 -  
298 -Response handlers can even be chained:  
299 -  
300 -```swift  
301 -Alamofire.request("https://httpbin.org/get")  
302 - .responseString { response in  
303 - print("Response String: \(response.result.value)")  
304 - }  
305 - .responseJSON { response in  
306 - print("Response JSON: \(response.result.value)")  
307 - }  
308 -```  
309 -  
310 -> It is important to note that using multiple response handlers on the same `Request` requires the server data to be serialized multiple times. Once for each response handler.  
311 -  
312 -#### Response Handler Queue  
313 -  
314 -Response handlers by default are executed on the main dispatch queue. However, a custom dispatch queue can be provided instead.  
315 -  
316 -```swift  
317 -let utilityQueue = DispatchQueue.global(qos: .utility)  
318 -  
319 -Alamofire.request("https://httpbin.org/get").responseJSON(queue: utilityQueue) { response in  
320 - print("Executing response handler on utility queue")  
321 -}  
322 -```  
323 -  
324 -### Response Validation  
325 -  
326 -By default, Alamofire treats any completed request to be successful, regardless of the content of the response. Calling `validate` before a response handler causes an error to be generated if the response had an unacceptable status code or MIME type.  
327 -  
328 -#### Manual Validation  
329 -  
330 -```swift  
331 -Alamofire.request("https://httpbin.org/get")  
332 - .validate(statusCode: 200..<300)  
333 - .validate(contentType: ["application/json"])  
334 - .response { response in  
335 - switch response.result {  
336 - case .success:  
337 - print("Validation Successful")  
338 - case .failure(let error):  
339 - print(error)  
340 - }  
341 - }  
342 -```  
343 -  
344 -#### Automatic Validation  
345 -  
346 -Automatically validates status code within `200...299` range, and that the `Content-Type` header of the response matches the `Accept` header of the request, if one is provided.  
347 -  
348 -```swift  
349 -Alamofire.request("https://httpbin.org/get").validate().responseJSON { response in  
350 - switch response.result {  
351 - case .success:  
352 - print("Validation Successful")  
353 - case .failure(let error):  
354 - print(error)  
355 - }  
356 -}  
357 -```  
358 -  
359 -### Response Caching  
360 -  
361 -Response Caching is handled on the system framework level by [`URLCache`](https://developer.apple.com/reference/foundation/urlcache). It provides a composite in-memory and on-disk cache and lets you manipulate the sizes of both the in-memory and on-disk portions.  
362 -  
363 -> By default, Alamofire leverages the shared `URLCache`. In order to customize it, see the [Session Manager Configurations](#session-manager-configurations) section.  
364 -  
365 -### HTTP Methods  
366 -  
367 -The `HTTPMethod` enumeration lists the HTTP methods defined in [RFC 7231 §4.3](http://tools.ietf.org/html/rfc7231#section-4.3):  
368 -  
369 -```swift  
370 -public enum HTTPMethod: String {  
371 - case options = "OPTIONS"  
372 - case get = "GET"  
373 - case head = "HEAD"  
374 - case post = "POST"  
375 - case put = "PUT"  
376 - case patch = "PATCH"  
377 - case delete = "DELETE"  
378 - case trace = "TRACE"  
379 - case connect = "CONNECT"  
380 -}  
381 -```  
382 -  
383 -These values can be passed as the `method` argument to the `Alamofire.request` API:  
384 -  
385 -```swift  
386 -Alamofire.request("https://httpbin.org/get") // method defaults to `.get`  
387 -  
388 -Alamofire.request("https://httpbin.org/post", method: .post)  
389 -Alamofire.request("https://httpbin.org/put", method: .put)  
390 -Alamofire.request("https://httpbin.org/delete", method: .delete)  
391 -```  
392 -  
393 -> The `Alamofire.request` method parameter defaults to `.get`.  
394 -  
395 -### Parameter Encoding  
396 -  
397 -Alamofire supports three types of parameter encoding including: `URL`, `JSON` and `PropertyList`. It can also support any custom encoding that conforms to the `ParameterEncoding` protocol.  
398 -  
399 -#### URL Encoding  
400 -  
401 -The `URLEncoding` type creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP body of the URL request. Whether the query string is set or appended to any existing URL query string or set as the HTTP body depends on the `Destination` of the encoding. The `Destination` enumeration has three cases:  
402 -  
403 -- `.methodDependent` - Applies encoded query string result to existing query string for `GET`, `HEAD` and `DELETE` requests and sets as the HTTP body for requests with any other HTTP method.  
404 -- `.queryString` - Sets or appends encoded query string result to existing query string.  
405 -- `.httpBody` - Sets encoded query string result as the HTTP body of the URL request.  
406 -  
407 -The `Content-Type` HTTP header field of an encoded request with HTTP body is set to `application/x-www-form-urlencoded; charset=utf-8`. Since there is no published specification for how to encode collection types, the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`).  
408 -  
409 -##### GET Request With URL-Encoded Parameters  
410 -  
411 -```swift  
412 -let parameters: Parameters = ["foo": "bar"]  
413 -  
414 -// All three of these calls are equivalent  
415 -Alamofire.request("https://httpbin.org/get", parameters: parameters) // encoding defaults to `URLEncoding.default`  
416 -Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding.default)  
417 -Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding(destination: .methodDependent))  
418 -  
419 -// https://httpbin.org/get?foo=bar  
420 -```  
421 -  
422 -##### POST Request With URL-Encoded Parameters  
423 -  
424 -```swift  
425 -let parameters: Parameters = [  
426 - "foo": "bar",  
427 - "baz": ["a", 1],  
428 - "qux": [  
429 - "x": 1,  
430 - "y": 2,  
431 - "z": 3  
432 - ]  
433 -]  
434 -  
435 -// All three of these calls are equivalent  
436 -Alamofire.request("https://httpbin.org/post", parameters: parameters)  
437 -Alamofire.request("https://httpbin.org/post", parameters: parameters, encoding: URLEncoding.default)  
438 -Alamofire.request("https://httpbin.org/post", parameters: parameters, encoding: URLEncoding.httpBody)  
439 -  
440 -// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3  
441 -```  
442 -  
443 -#### JSON Encoding  
444 -  
445 -The `JSONEncoding` type creates a JSON representation of the parameters object, which is set as the HTTP body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`.  
446 -  
447 -##### POST Request with JSON-Encoded Parameters  
448 -  
449 -```swift  
450 -let parameters: Parameters = [  
451 - "foo": [1,2,3],  
452 - "bar": [  
453 - "baz": "qux"  
454 - ]  
455 -]  
456 -  
457 -// Both calls are equivalent  
458 -Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding.default)  
459 -Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding(options: []))  
460 -  
461 -// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}}  
462 -```  
463 -  
464 -#### Property List Encoding  
465 -  
466 -The `PropertyListEncoding` uses `PropertyListSerialization` to create a plist representation of the parameters object, according to the associated format and write options values, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/x-plist`.  
467 -  
468 -#### Custom Encoding  
469 -  
470 -In the event that the provided `ParameterEncoding` types do not meet your needs, you can create your own custom encoding. Here's a quick example of how you could build a custom `JSONStringArrayEncoding` type to encode a JSON string array onto a `Request`.  
471 -  
472 -```swift  
473 -struct JSONStringArrayEncoding: ParameterEncoding {  
474 - private let array: [String]  
475 -  
476 - init(array: [String]) {  
477 - self.array = array  
478 - }  
479 -  
480 - func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {  
481 - var urlRequest = urlRequest.urlRequest  
482 -  
483 - let data = try JSONSerialization.data(withJSONObject: array, options: [])  
484 -  
485 - if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {  
486 - urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")  
487 - }  
488 -  
489 - urlRequest.httpBody = data  
490 -  
491 - return urlRequest  
492 - }  
493 -}  
494 -```  
495 -  
496 -#### Manual Parameter Encoding of a URLRequest  
497 -  
498 -The `ParameterEncoding` APIs can be used outside of making network requests.  
499 -  
500 -```swift  
501 -let url = URL(string: "https://httpbin.org/get")!  
502 -var urlRequest = URLRequest(url: url)  
503 -  
504 -let parameters: Parameters = ["foo": "bar"]  
505 -let encodedURLRequest = try URLEncoding.queryString.encode(urlRequest, with: parameters)  
506 -```  
507 -  
508 -### HTTP Headers  
509 -  
510 -Adding a custom HTTP header to a `Request` is supported directly in the global `request` method. This makes it easy to attach HTTP headers to a `Request` that can be constantly changing.  
511 -  
512 -```swift  
513 -let headers: HTTPHeaders = [  
514 - "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",  
515 - "Accept": "application/json"  
516 -]  
517 -  
518 -Alamofire.request("https://httpbin.org/headers", headers: headers).responseJSON { response in  
519 - debugPrint(response)  
520 -}  
521 -```  
522 -  
523 -> For HTTP headers that do not change, it is recommended to set them on the `URLSessionConfiguration` so they are automatically applied to any `URLSessionTask` created by the underlying `URLSession`. For more information, see the [Session Manager Configurations](#session-manager-configurations) section.  
524 -  
525 -The default Alamofire `SessionManager` provides a default set of headers for every `Request`. These include:  
526 -  
527 -- `Accept-Encoding`, which defaults to `gzip;q=1.0, compress;q=0.5`, per [RFC 7230 §4.2.3](https://tools.ietf.org/html/rfc7230#section-4.2.3).  
528 -- `Accept-Language`, which defaults to up to the top 6 preferred languages on the system, formatted like `en;q=1.0`, per [RFC 7231 §5.3.5](https://tools.ietf.org/html/rfc7231#section-5.3.5).  
529 -- `User-Agent`, which contains versioning information about the current app. For example: `iOS Example/1.0 (com.alamofire.iOS-Example; build:1; iOS 10.0.0) Alamofire/4.0.0`, per [RFC 7231 §5.5.3](https://tools.ietf.org/html/rfc7231#section-5.5.3).  
530 -  
531 -If you need to customize these headers, a custom `URLSessionManagerConfiguration` should be created, the `defaultHTTPHeaders` property updated and the configuration applied to a new `SessionManager` instance.  
532 -  
533 -### Authentication  
534 -  
535 -Authentication is handled on the system framework level by [`URLCredential`](https://developer.apple.com/reference/foundation/nsurlcredential) and [`URLAuthenticationChallenge`](https://developer.apple.com/reference/foundation/urlauthenticationchallenge).  
536 -  
537 -**Supported Authentication Schemes**  
538 -  
539 -- [HTTP Basic](http://en.wikipedia.org/wiki/Basic_access_authentication)  
540 -- [HTTP Digest](http://en.wikipedia.org/wiki/Digest_access_authentication)  
541 -- [Kerberos](http://en.wikipedia.org/wiki/Kerberos_%28protocol%29)  
542 -- [NTLM](http://en.wikipedia.org/wiki/NT_LAN_Manager)  
543 -  
544 -#### HTTP Basic Authentication  
545 -  
546 -The `authenticate` method on a `Request` will automatically provide a `URLCredential` to a `URLAuthenticationChallenge` when appropriate:  
547 -  
548 -```swift  
549 -let user = "user"  
550 -let password = "password"  
551 -  
552 -Alamofire.request("https://httpbin.org/basic-auth/\(user)/\(password)")  
553 - .authenticate(user: user, password: password)  
554 - .responseJSON { response in  
555 - debugPrint(response)  
556 - }  
557 -```  
558 -  
559 -Depending upon your server implementation, an `Authorization` header may also be appropriate:  
560 -  
561 -```swift  
562 -let user = "user"  
563 -let password = "password"  
564 -  
565 -var headers: HTTPHeaders = [:]  
566 -  
567 -if let authorizationHeader = Request.authorizationHeader(user: user, password: password) {  
568 - headers[authorizationHeader.key] = authorizationHeader.value  
569 -}  
570 -  
571 -Alamofire.request("https://httpbin.org/basic-auth/user/password", headers: headers)  
572 - .responseJSON { response in  
573 - debugPrint(response)  
574 - }  
575 -```  
576 -  
577 -#### Authentication with URLCredential  
578 -  
579 -```swift  
580 -let user = "user"  
581 -let password = "password"  
582 -  
583 -let credential = URLCredential(user: user, password: password, persistence: .forSession)  
584 -  
585 -Alamofire.request("https://httpbin.org/basic-auth/\(user)/\(password)")  
586 - .authenticate(usingCredential: credential)  
587 - .responseJSON { response in  
588 - debugPrint(response)  
589 - }  
590 -```  
591 -  
592 -> It is important to note that when using a `URLCredential` for authentication, the underlying `URLSession` will actually end up making two requests if a challenge is issued by the server. The first request will not include the credential which "may" trigger a challenge from the server. The challenge is then received by Alamofire, the credential is appended and the request is retried by the underlying `URLSession`.  
593 -  
594 -### Downloading Data to a File  
595 -  
596 -Requests made in Alamofire that fetch data from a server can download the data in-memory or on-disk. The `Alamofire.request` APIs used in all the examples so far always downloads the server data in-memory. This is great for smaller payloads because it's more efficient, but really bad for larger payloads because the download could run your entire application out-of-memory. Because of this, you can also use the `Alamofire.download` APIs to download the server data to a temporary file on-disk.  
597 -  
598 -```swift  
599 -Alamofire.download("https://httpbin.org/image/png").responseData { response in  
600 - if let data = response.result.value {  
601 - let image = UIImage(data: data)  
602 - }  
603 -}  
604 -```  
605 -  
606 -> The `Alamofire.download` APIs should also be used if you need to download data while your app is in the background. For more information, please see the [Session Manager Configurations](#session-manager-configurations) section.  
607 -  
608 -#### Download File Destination  
609 -  
610 -You can also provide a `DownloadFileDestination` closure to move the file from the temporary directory to a final destination. Before the temporary file is actually moved to the `destinationURL`, the `DownloadOptions` specified in the closure will be executed. The two currently supported `DownloadOptions` are:  
611 -  
612 -- `.createIntermediateDirectories` - Creates intermediate directories for the destination URL if specified.  
613 -- `.removePreviousFile` - Removes a previous file from the destination URL if specified.  
614 -  
615 -```swift  
616 -let destination: DownloadRequest.DownloadFileDestination = { _, _ in  
617 - let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]  
618 - let fileURL = documentsURL.appendPathComponent("pig.png")  
619 -  
620 - return (fileURL, [.removePreviousFile, .createIntermediateDirectories])  
621 -}  
622 -  
623 -Alamofire.download(urlString, to: destination).response { response in  
624 - print(response)  
625 -  
626 - if response.result.isSuccess, let imagePath = response.destinationURL?.path {  
627 - let image = UIImage(contentsOfFile: imagePath)  
628 - }  
629 -}  
630 -```  
631 -  
632 -You can also use the suggested download destination API.  
633 -  
634 -```swift  
635 -let destination = DownloadRequest.suggestedDownloadDestination(directory: .documentDirectory)  
636 -Alamofire.download("https://httpbin.org/image/png", to: destination)  
637 -```  
638 -  
639 -#### Download Progress  
640 -  
641 -Many times it can be helpful to report download progress to the user. Any `DownloadRequest` can report download progress using the `downloadProgress` API.  
642 -  
643 -```swift  
644 -Alamofire.download("https://httpbin.org/image/png")  
645 - .downloadProgress { progress in  
646 - print("Download Progress: \(progress.fractionCompleted)")  
647 - }  
648 - .responseData { response in  
649 - if let data = response.result.value {  
650 - let image = UIImage(data: data)  
651 - }  
652 - }  
653 -```  
654 -  
655 -The `downloadProgress` API also takes a `queue` parameter which defines which `DispatchQueue` the download progress closure should be called on.  
656 -  
657 -```swift  
658 -let utilityQueue = DispatchQueue.global(qos: .utility)  
659 -  
660 -Alamofire.download("https://httpbin.org/image/png")  
661 - .downloadProgress(queue: utilityQueue) { progress in  
662 - print("Download Progress: \(progress.fractionCompleted)")  
663 - }  
664 - .responseData { response in  
665 - if let data = response.result.value {  
666 - let image = UIImage(data: data)  
667 - }  
668 - }  
669 -```  
670 -  
671 -#### Resuming a Download  
672 -  
673 -If a `DownloadRequest` is cancelled or interrupted, the underlying URL session may generate resume data for the active `DownloadRequest`. If this happens, the resume data can be re-used to restart the `DownloadRequest` where it left off. The resume data can be accessed through the download response, then reused when trying to restart the request.  
674 -  
675 -```swift  
676 -class ImageRequestor {  
677 - private var resumeData: Data?  
678 - private var image: UIImage?  
679 -  
680 - func fetchImage(completion: (UIImage?) -> Void) {  
681 - guard image == nil else { completion(image) ; return }  
682 -  
683 - let destination: DownloadRequest.DownloadFileDestination = { _, _ in  
684 - let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]  
685 - let fileURL = documentsURL.appendPathComponent("pig.png")  
686 -  
687 - return (fileURL, [.removePreviousFile, .createIntermediateDirectories])  
688 - }  
689 -  
690 - let request: DownloadRequest  
691 -  
692 - if let resumeData = resumeData {  
693 - request = Alamofire.download(resumingWith: resumeData)  
694 - } else {  
695 - request = Alamofire.download("https://httpbin.org/image/png")  
696 - }  
697 -  
698 - request.responseData { response in  
699 - switch response.result {  
700 - case .success(let data):  
701 - self.image = UIImage(data: data)  
702 - case .failure:  
703 - self.resumeData = response.resumeData  
704 - }  
705 - }  
706 - }  
707 -}  
708 -```  
709 -  
710 -### Uploading Data to a Server  
711 -  
712 -When sending relatively small amounts of data to a server using JSON or URL encoded parameters, the `Alamofire.request` APIs are usually sufficient. If you need to send much larger amounts of data from a file URL or an `InputStream`, then the `Alamofire.upload` APIs are what you want to use.  
713 -  
714 -> The `Alamofire.upload` APIs should also be used if you need to upload data while your app is in the background. For more information, please see the [Session Manager Configurations](#session-manager-configurations) section.  
715 -  
716 -#### Uploading Data  
717 -  
718 -```swift  
719 -let imageData = UIPNGRepresentation(image)!  
720 -  
721 -Alamofire.upload(imageData, to: "https://httpbin.org/post").responseJSON { response in  
722 - debugPrint(response)  
723 -}  
724 -```  
725 -  
726 -#### Uploading a File  
727 -  
728 -```swift  
729 -let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov")  
730 -  
731 -Alamofire.upload(fileURL, to: "https://httpbin.org/post").responseJSON { response in  
732 - debugPrint(response)  
733 -}  
734 -```  
735 -  
736 -#### Uploading Multipart Form Data  
737 -  
738 -```swift  
739 -Alamofire.upload(  
740 - multipartFormData: { multipartFormData in  
741 - multipartFormData.append(unicornImageURL, withName: "unicorn")  
742 - multipartFormData.append(rainbowImageURL, withName: "rainbow")  
743 - },  
744 - to: "https://httpbin.org/post",  
745 - encodingCompletion: { encodingResult in  
746 - switch encodingResult {  
747 - case .success(let upload, _, _):  
748 - upload.responseJSON { response in  
749 - debugPrint(response)  
750 - }  
751 - case .failure(let encodingError):  
752 - print(encodingError)  
753 - }  
754 - }  
755 -)  
756 -```  
757 -  
758 -#### Upload Progress  
759 -  
760 -While your user is waiting for their upload to complete, sometimes it can be handy to show the progress of the upload to the user. Any `UploadRequest` can report both upload progress and download progress of the response data using the `uploadProgress` and `downloadProgress` APIs.  
761 -  
762 -```swift  
763 -let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov")  
764 -  
765 -Alamofire.upload(fileURL, to: "https://httpbin.org/post")  
766 - .uploadProgress { progress in // main queue by default  
767 - print("Upload Progress: \(progress.fractionCompleted)")  
768 - }  
769 - .downloadProgress { progress in // main queue by default  
770 - print("Download Progress: \(progress.fractionCompleted)")  
771 - }  
772 - .responseJSON { response in  
773 - debugPrint(response)  
774 - }  
775 -```  
776 -  
777 -### Statistical Metrics  
778 -  
779 -#### Timeline  
780 -  
781 -Alamofire collects timings throughout the lifecycle of a `Request` and creates a `Timeline` object exposed as a property on all response types.  
782 -  
783 -```swift  
784 -Alamofire.request("https://httpbin.org/get").responseJSON { response in  
785 - print(response.timeline)  
786 -}  
787 -```  
788 -  
789 -The above reports the following `Timeline` info:  
790 -  
791 -- `Latency`: 0.428 seconds  
792 -- `Request Duration`: 0.428 seconds  
793 -- `Serialization Duration`: 0.001 seconds  
794 -- `Total Duration`: 0.429 seconds  
795 -  
796 -#### URL Session Task Metrics  
797 -  
798 -In iOS and tvOS 10 and macOS 10.12, Apple introduced the new [URLSessionTaskMetrics](https://developer.apple.com/reference/foundation/urlsessiontaskmetrics) APIs. The task metrics encapsulate some fantastic statistical information about the request and response execution. The API is very similar to the `Timeline`, but provides many more statistics that Alamofire doesn't have access to compute. The metrics can be accessed through any response type.  
799 -  
800 -```swift  
801 -Alamofire.request("https://httpbin.org/get").responseJSON { response in  
802 - print(response.metrics)  
803 -}  
804 -```  
805 -  
806 -It's important to note that these APIs are only available on iOS and tvOS 10 and macOS 10.12. Therefore, depending on your deployment target, you may need to use these inside availability checks:  
807 -  
808 -```swift  
809 -Alamofire.request("https://httpbin.org/get").responseJSON { response in  
810 - if #available(iOS 10.0. *) {  
811 - print(response.metrics)  
812 - }  
813 -}  
814 -```  
815 -  
816 -### cURL Command Output  
817 -  
818 -Debugging platform issues can be frustrating. Thankfully, Alamofire `Request` objects conform to both the `CustomStringConvertible` and `CustomDebugStringConvertible` protocols to provide some VERY helpful debugging tools.  
819 -  
820 -#### CustomStringConvertible  
821 -  
822 -```swift  
823 -let request = Alamofire.request("https://httpbin.org/ip")  
824 -  
825 -print(request)  
826 -// GET https://httpbin.org/ip (200)  
827 -```  
828 -  
829 -#### CustomDebugStringConvertible  
830 -  
831 -```swift  
832 -let request = Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"])  
833 -debugPrint(request)  
834 -```  
835 -  
836 -Outputs:  
837 -  
838 -```bash  
839 -$ curl -i \  
840 - -H "User-Agent: Alamofire/4.0.0" \  
841 - -H "Accept-Encoding: gzip;q=1.0, compress;q=0.5" \  
842 - -H "Accept-Language: en;q=1.0,fr;q=0.9,de;q=0.8,zh-Hans;q=0.7,zh-Hant;q=0.6,ja;q=0.5" \  
843 - "https://httpbin.org/get?foo=bar"  
844 -```  
845 -  
846 ----  
847 -  
848 -## Advanced Usage  
849 -  
850 -Alamofire is built on `URLSession` and the Foundation URL Loading System. To make the most of this framework, it is recommended that you be familiar with the concepts and capabilities of the underlying networking stack.  
851 -  
852 -**Recommended Reading**  
853 -  
854 -- [URL Loading System Programming Guide](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html)  
855 -- [URLSession Class Reference](https://developer.apple.com/reference/foundation/nsurlsession)  
856 -- [URLCache Class Reference](https://developer.apple.com/reference/foundation/urlcache)  
857 -- [URLAuthenticationChallenge Class Reference](https://developer.apple.com/reference/foundation/urlauthenticationchallenge)  
858 -  
859 -### Session Manager  
860 -  
861 -Top-level convenience methods like `Alamofire.request` use a default instance of `Alamofire.SessionManager`, which is configured with the default `URLSessionConfiguration`.  
862 -  
863 -As such, the following two statements are equivalent:  
864 -  
865 -```swift  
866 -Alamofire.request("https://httpbin.org/get")  
867 -```  
868 -  
869 -```swift  
870 -let sessionManager = Alamofire.SessionManager.default  
871 -sessionManager.request("https://httpbin.org/get")  
872 -```  
873 -  
874 -Applications can create session managers for background and ephemeral sessions, as well as new managers that customize the default session configuration, such as for default headers (`httpAdditionalHeaders`) or timeout interval (`timeoutIntervalForRequest`).  
875 -  
876 -#### Creating a Session Manager with Default Configuration  
877 -  
878 -```swift  
879 -let configuration = URLSessionConfiguration.default  
880 -let sessionManager = Alamofire.SessionManager(configuration: configuration)  
881 -```  
882 -  
883 -#### Creating a Session Manager with Background Configuration  
884 -  
885 -```swift  
886 -let configuration = URLSessionConfiguration.background(withIdentifier: "com.example.app.background")  
887 -let sessionManager = Alamofire.SessionManager(configuration: configuration)  
888 -```  
889 -  
890 -#### Creating a Session Manager with Ephemeral Configuration  
891 -  
892 -```swift  
893 -let configuration = URLSessionConfiguration.ephemeral  
894 -let sessionManager = Alamofire.SessionManager(configuration: configuration)  
895 -```  
896 -  
897 -#### Modifying the Session Configuration  
898 -  
899 -```swift  
900 -var defaultHeaders = Alamofire.SessionManager.default.defaultHTTPHeaders  
901 -defaultHeaders["DNT"] = "1 (Do Not Track Enabled)"  
902 -  
903 -let configuration = URLSessionConfiguration.default  
904 -configuration.httpAdditionalHeaders = defaultHeaders  
905 -  
906 -let sessionManager = Alamofire.SessionManager(configuration: configuration)  
907 -```  
908 -  
909 -> This is **not** recommended for `Authorization` or `Content-Type` headers. Instead, use the `headers` parameter in the top-level `Alamofire.request` APIs, `URLRequestConvertible` and `ParameterEncoding`, respectively.  
910 -  
911 -### Session Delegate  
912 -  
913 -By default, an Alamofire `SessionManager` instance creates a `SessionDelegate` object to handle all the various types of delegate callbacks that are generated by the underlying `URLSession`. The implementations of each delegate method handle the most common use cases for these types of calls abstracting the complexity away from the top-level APIs. However, advanced users may find the need to override the default functionality for various reasons.  
914 -  
915 -#### Override Closures  
916 -  
917 -The first way to customize the `SessionDelegate` behavior is through the use of the override closures. Each closure gives you the ability to override the implementation of the matching `SessionDelegate` API, yet still use the default implementation for all other APIs. This makes it easy to customize subsets of the delegate functionality. Here are a few examples of some of the override closures available:  
918 -  
919 -```swift  
920 -/// Overrides default behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)`.  
921 -open var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))?  
922 -  
923 -/// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`.  
924 -open var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)?  
925 -  
926 -/// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)`.  
927 -open var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> URLRequest?)?  
928 -  
929 -/// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)`.  
930 -open var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)?  
931 -```  
932 -  
933 -The following is a short example of how to use the `taskWillPerformHTTPRedirection` to avoid following redirects to any `apple.com` domains.  
934 -  
935 -```swift  
936 -let sessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.default)  
937 -let delegate: Alamofire.SessionDelegate = sessionManager.delegate  
938 -  
939 -delegate.taskWillPerformHTTPRedirection = { session, task, response, request in  
940 - var finalRequest = request  
941 -  
942 - if  
943 - let originalRequest = task.originalRequest,  
944 - let urlString = originalRequest.url?.urlString,  
945 - urlString.contains("apple.com")  
946 - {  
947 - finalRequest = originalRequest  
948 - }  
949 -  
950 - return finalRequest  
951 -}  
952 -```  
953 -  
954 -#### Subclassing  
955 -  
956 -Another way to override the default implementation of the `SessionDelegate` is to subclass it. Subclassing allows you completely customize the behavior of the API or to create a proxy for the API and still use the default implementation. Creating a proxy allows you to log events, emit notifications, provide pre and post hook implementations, etc. Here's a quick example of subclassing the `SessionDelegate` and logging a message when a redirect occurs.  
957 -  
958 -```swift  
959 -class LoggingSessionDelegate: SessionDelegate {  
960 - override func urlSession(  
961 - _ session: URLSession,  
962 - task: URLSessionTask,  
963 - willPerformHTTPRedirection response: HTTPURLResponse,  
964 - newRequest request: URLRequest,  
965 - completionHandler: @escaping (URLRequest?) -> Void)  
966 - {  
967 - print("URLSession will perform HTTP redirection to request: \(request)")  
968 -  
969 - super.urlSession(  
970 - session,  
971 - task: task,  
972 - willPerformHTTPRedirection: response,  
973 - newRequest: request,  
974 - completionHandler: completionHandler  
975 - )  
976 - }  
977 -}  
978 -```  
979 -  
980 -Generally speaking, either the default implementation or the override closures should provide the necessary functionality required. Subclassing should only be used as a last resort.  
981 -  
982 -> It is important to keep in mind that the `subdelegates` are initialized and destroyed in the default implementation. Be careful when subclassing to not introduce memory leaks.  
983 -  
984 -### Request  
985 -  
986 -The result of a `request`, `download`, `upload` or `stream` methods are a `DataRequest`, `DownloadRequest`, `UploadRequest` and `StreamRequest` which all inherit from `Request`. All `Request` instances are always created by an owning session manager, and never initialized directly.  
987 -  
988 -Each subclass has specialized methods such as `authenticate`, `validate`, `responseJSON` and `uploadProgress` that each return the caller instance in order to facilitate method chaining.  
989 -  
990 -Requests can be suspended, resumed and cancelled:  
991 -  
992 -- `suspend()`: Suspends the underlying task and dispatch queue.  
993 -- `resume()`: Resumes the underlying task and dispatch queue. If the owning manager does not have `startRequestsImmediately` set to `true`, the request must call `resume()` in order to start.  
994 -- `cancel()`: Cancels the underlying task, producing an error that is passed to any registered response handlers.  
995 -  
996 -### Routing Requests  
997 -  
998 -As apps grow in size, it's important to adopt common patterns as you build out your network stack. An important part of that design is how to route your requests. The Alamofire `URLConvertible` and `URLRequestConvertible` protocols along with the `Router` design pattern are here to help.  
999 -  
1000 -#### URLConvertible  
1001 -  
1002 -Types adopting the `URLConvertible` protocol can be used to construct URLs, which are then used to construct URL requests internally. `String`, `URL`, and `URLComponents` conform to `URLConvertible` by default, allowing any of them to be passed as `url` parameters to the `request`, `upload`, and `download` methods:  
1003 -  
1004 -```swift  
1005 -let urlString = "https://httpbin.org/post"  
1006 -Alamofire.request(urlString, method: .post)  
1007 -  
1008 -let url = URL(string: urlString)!  
1009 -Alamofire.request(url, method: .post)  
1010 -  
1011 -let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true)  
1012 -Alamofire.request(.post, URLComponents)  
1013 -```  
1014 -  
1015 -Applications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLConvertible` as a convenient way to map domain-specific models to server resources.  
1016 -  
1017 -##### Type-Safe Routing  
1018 -  
1019 -```swift  
1020 -extension User: URLConvertible {  
1021 - static let baseURLString = "https://example.com"  
1022 -  
1023 - func asURL() throws -> URL {  
1024 - let urlString = User.baseURLString + "/users/\(username)/"  
1025 - return try urlString.asURL()  
1026 - }  
1027 -}  
1028 -```  
1029 -  
1030 -```swift  
1031 -let user = User(username: "mattt")  
1032 -Alamofire.request(user) // https://example.com/users/mattt  
1033 -```  
1034 -  
1035 -#### URLRequestConvertible  
1036 -  
1037 -Types adopting the `URLRequestConvertible` protocol can be used to construct URL requests. `URLRequest` conforms to `URLRequestConvertible` by default, allowing it to be passed into `request`, `upload`, and `download` methods directly (this is the recommended way to specify custom HTTP body for individual requests):  
1038 -  
1039 -```swift  
1040 -let url = URL(string: "https://httpbin.org/post")!  
1041 -var urlRequest = URLRequest(url: url)  
1042 -urlRequest.httpMethod = "POST"  
1043 -  
1044 -let parameters = ["foo": "bar"]  
1045 -  
1046 -do {  
1047 - urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])  
1048 -} catch {  
1049 - // No-op  
1050 -}  
1051 -  
1052 -urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")  
1053 -  
1054 -Alamofire.request(urlRequest)  
1055 -```  
1056 -  
1057 -Applications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLRequestConvertible` as a way to ensure consistency of requested endpoints. Such an approach can be used to abstract away server-side inconsistencies and provide type-safe routing, as well as manage authentication credentials and other state.  
1058 -  
1059 -##### API Parameter Abstraction  
1060 -  
1061 -```swift  
1062 -enum Router: URLRequestConvertible {  
1063 - case search(query: String, page: Int)  
1064 -  
1065 - static let baseURLString = "https://example.com"  
1066 - static let perPage = 50  
1067 -  
1068 - // MARK: URLRequestConvertible  
1069 -  
1070 - func asURLRequest() throws -> URLRequest {  
1071 - let result: (path: String, parameters: Parameters) = {  
1072 - switch self {  
1073 - case let .search(query, page) where page > 0:  
1074 - return ("/search", ["q": query, "offset": Router.perPage * page])  
1075 - case let .search(query, _):  
1076 - return ("/search", ["q": query])  
1077 - }  
1078 - }()  
1079 -  
1080 - let url = try Router.baseURLString.asURL()  
1081 - let urlRequest = URLRequest(url: url.appendingPathComponent(result.path))  
1082 -  
1083 - return try URLEncoding.default.encode(urlRequest, with: result.parameters)  
1084 - }  
1085 -}  
1086 -```  
1087 -  
1088 -```swift  
1089 -Alamofire.request(Router.search(query: "foo bar", page: 1)) // ?q=foo%20bar&offset=50  
1090 -```  
1091 -  
1092 -##### CRUD & Authorization  
1093 -  
1094 -```swift  
1095 -import Alamofire  
1096 -  
1097 -enum Router: URLRequestConvertible {  
1098 - case createUser(parameters: Parameters)  
1099 - case readUser(username: String)  
1100 - case updateUser(username: String, parameters: Parameters)  
1101 - case destroyUser(username: String)  
1102 -  
1103 - static let baseURLString = "https://example.com"  
1104 -  
1105 - var method: HTTPMethod {  
1106 - switch self {  
1107 - case .createUser:  
1108 - return .post  
1109 - case .readUser:  
1110 - return .get  
1111 - case .updateUser:  
1112 - return .put  
1113 - case .destroyUser:  
1114 - return .delete  
1115 - }  
1116 - }  
1117 -  
1118 - var path: String {  
1119 - switch self {  
1120 - case .createUser:  
1121 - return "/users"  
1122 - case .readUser(let username):  
1123 - return "/users/\(username)"  
1124 - case .updateUser(let username, _):  
1125 - return "/users/\(username)"  
1126 - case .destroyUser(let username):  
1127 - return "/users/\(username)"  
1128 - }  
1129 - }  
1130 -  
1131 - // MARK: URLRequestConvertible  
1132 -  
1133 - func asURLRequest() throws -> URLRequest {  
1134 - let url = try Router.baseURLString.asURL()  
1135 -  
1136 - var urlRequest = URLRequest(url: url.appendingPathComponent(path))  
1137 - urlRequest.httpMethod = method.rawValue  
1138 -  
1139 - switch self {  
1140 - case .createUser(let parameters):  
1141 - urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters)  
1142 - case .updateUser(_, let parameters):  
1143 - urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters)  
1144 - default:  
1145 - break  
1146 - }  
1147 -  
1148 - return urlRequest  
1149 - }  
1150 -}  
1151 -```  
1152 -  
1153 -```swift  
1154 -Alamofire.request(Router.readUser("mattt")) // GET /users/mattt  
1155 -```  
1156 -  
1157 -### Adapting and Retrying Requests  
1158 -  
1159 -Most web services these days are behind some sort of authentication system. One of the more common ones today is OAuth. This generally involves generating an access token authorizing your application or user to call the various supported web services. While creating these initial access tokens can be laborsome, it can be even more complicated when your access token expires and you need to fetch a new one. There are many thread-safety issues that need to be considered.  
1160 -  
1161 -The `RequestAdapter` and `RequestRetrier` protocols were created to make it much easier to create a thread-safe authentication system for a specific set of web services.  
1162 -  
1163 -#### RequestAdapter  
1164 -  
1165 -The `RequestAdapter` protocol allows each `Request` made on a `SessionManager` to be inspected and adapted before being created. One very specific way to use an adapter is to append an `Authorization` header to requests behind a certain type of authentication.  
1166 -  
1167 -```swift  
1168 -class AccessTokenAdapter: RequestAdapter {  
1169 - private let accessToken: String  
1170 -  
1171 - init(accessToken: String) {  
1172 - self.accessToken = accessToken  
1173 - }  
1174 -  
1175 - func adapt(_ urlRequest: URLRequest) throws -> URLRequest {  
1176 - var urlRequest = urlRequest  
1177 -  
1178 - if urlRequest.urlString.hasPrefix("https://httpbin.org") {  
1179 - urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")  
1180 - }  
1181 -  
1182 - return urlRequest  
1183 - }  
1184 -}  
1185 -```  
1186 -  
1187 -```swift  
1188 -let sessionManager = SessionManager()  
1189 -sessionManager.adapter = AccessTokenAdapter(accessToken: "1234")  
1190 -  
1191 -sessionManager.request("https://httpbin.org/get")  
1192 -``` 126 +### Swift Package Manager
1193 127
1194 -#### RequestRetrier 128 +The [Swift Package Manager](https://swift.org/package-manager/) is a tool for automating the distribution of Swift code and is integrated into the `swift` compiler. It is in early development, but Alamofire does support its use on supported platforms.
1195 129
1196 -The `RequestRetrier` protocol allows a `Request` that encountered an `Error` while being executed to be retried. When using both the `RequestAdapter` and `RequestRetrier` protocols together, you can create credential refresh systems for OAuth1, OAuth2, Basic Auth and even exponential backoff retry policies. The possibilities are endless. Here's an example of how you could implement a refresh flow for OAuth2 access tokens. 130 +Once you have your Swift package set up, adding Alamofire as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`.
1197 131
1198 -> **DISCLAIMER:** This is **NOT** a global `OAuth2` solution. It is merely an example demonstrating how one could use the `RequestAdapter` in conjunction with the `RequestRetrier` to create a thread-safe refresh system.  
1199 -  
1200 -> To reiterate, **do NOT copy** this sample code and drop it into a production application. This is merely an example. Each authentication system must be tailored to a particular platform and authentication type.  
1201 -  
1202 -```swift  
1203 -class OAuth2Handler: RequestAdapter, RequestRetrier {  
1204 - private typealias RefreshCompletion = (_ succeeded: Bool, _ accessToken: String?, _ refreshToken: String?) -> Void  
1205 -  
1206 - private let sessionManager: SessionManager = {  
1207 - let configuration = URLSessionConfiguration.default  
1208 - configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders  
1209 -  
1210 - return SessionManager(configuration: configuration)  
1211 - }()  
1212 -  
1213 - private let lock = NSLock()  
1214 -  
1215 - private var clientID: String  
1216 - private var baseURLString: String  
1217 - private var accessToken: String  
1218 - private var refreshToken: String  
1219 -  
1220 - private var isRefreshing = false  
1221 - private var requestsToRetry: [RequestRetryCompletion] = []  
1222 -  
1223 - // MARK: - Initialization  
1224 -  
1225 - public init(clientID: String, baseURLString: String, accessToken: String, refreshToken: String) {  
1226 - self.clientID = clientID  
1227 - self.baseURLString = baseURLString  
1228 - self.accessToken = accessToken  
1229 - self.refreshToken = refreshToken  
1230 - }  
1231 -  
1232 - // MARK: - RequestAdapter  
1233 -  
1234 - func adapt(_ urlRequest: URLRequest) throws -> URLRequest {  
1235 - if let url = urlRequest.url, url.urlString.hasPrefix(baseURLString) {  
1236 - var urlRequest = urlRequest  
1237 - urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")  
1238 - return urlRequest  
1239 - }  
1240 -  
1241 - return urlRequest  
1242 - }  
1243 -  
1244 - // MARK: - RequestRetrier  
1245 -  
1246 - func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {  
1247 - lock.lock() ; defer { lock.unlock() }  
1248 -  
1249 - if let response = request.task.response as? HTTPURLResponse, response.statusCode == 401 {  
1250 - requestsToRetry.append(completion)  
1251 -  
1252 - if !isRefreshing {  
1253 - refreshTokens { [weak self] succeeded, accessToken, refreshToken in  
1254 - guard let strongSelf = self else { return }  
1255 -  
1256 - strongSelf.lock.lock() ; defer { strongSelf.lock.unlock() }  
1257 -  
1258 - if let accessToken = accessToken, let refreshToken = refreshToken {  
1259 - strongSelf.accessToken = accessToken  
1260 - strongSelf.refreshToken = refreshToken  
1261 - }  
1262 -  
1263 - strongSelf.requestsToRetry.forEach { $0(succeeded, 0.0) }  
1264 - strongSelf.requestsToRetry.removeAll()  
1265 - }  
1266 - }  
1267 - } else {  
1268 - completion(false, 0.0)  
1269 - }  
1270 - }  
1271 -  
1272 - // MARK: - Private - Refresh Tokens  
1273 -  
1274 - private func refreshTokens(completion: @escaping RefreshCompletion) {  
1275 - guard !isRefreshing else { return }  
1276 -  
1277 - isRefreshing = true  
1278 -  
1279 - let urlString = "\(baseURLString)/oauth2/token"  
1280 -  
1281 - let parameters: [String: Any] = [  
1282 - "access_token": accessToken,  
1283 - "refresh_token": refreshToken,  
1284 - "client_id": clientID,  
1285 - "grant_type": "refresh_token"  
1286 - ]  
1287 -  
1288 - sessionManager.request(urlString, method: .post, parameters: parameters, encoding: JSONEncoding.default)  
1289 - .responseJSON { [weak self] response in  
1290 - guard let strongSelf = self else { return }  
1291 -  
1292 - if let json = response.result.value as? [String: String] {  
1293 - completion(true, json["access_token"], json["refresh_token"])  
1294 - } else {  
1295 - completion(false, nil, nil)  
1296 - }  
1297 -  
1298 - strongSelf.isRefreshing = false  
1299 - }  
1300 - }  
1301 -}  
1302 -```  
1303 -  
1304 -```swift  
1305 -let baseURLString = "https://some.domain-behind-oauth2.com"  
1306 -  
1307 -let oauthHandler = OAuth2Handler(  
1308 - clientID: "12345678",  
1309 - baseURLString: baseURLString,  
1310 - accessToken: "abcd1234",  
1311 - refreshToken: "ef56789a"  
1312 -)  
1313 -  
1314 -let sessionManager = SessionManager()  
1315 -sessionManager.adapter = oauthHandler  
1316 -sessionManager.retrier = oauthHandler  
1317 -  
1318 -let urlString = "\(baseURLString)/some/endpoint"  
1319 -  
1320 -sessionManager.request(urlString).validate().responseJSON { response in  
1321 - debugPrint(response)  
1322 -}  
1323 -```  
1324 -  
1325 -Once the `OAuth2Handler` is applied as both the `adapter` and `retrier` for the `SessionManager`, it will handle an invalid access token error by automatically refreshing the access token and retrying all failed requests in the same order they failed.  
1326 -  
1327 -> If you needed them to execute in the same order they were created, you could sort them by their task identifiers.  
1328 -  
1329 -The example above only checks for a `401` response code which is not nearly robust enough, but does demonstrate how one could check for an invalid access token error. In a production application, one would want to check the `realm` and most likely the `www-authenticate` header response although it depends on the OAuth2 implementation.  
1330 -  
1331 -Another important note is that this authentication system could be shared between multiple session managers. For example, you may need to use both a `default` and `ephemeral` session configuration for the same set of web services. The example above allows the same `oauthHandler` instance to be shared across multiple session managers to manage the single refresh flow.  
1332 -  
1333 -### Custom Response Serialization  
1334 -  
1335 -#### Handling Errors  
1336 -  
1337 -Before implementing custom response serializers or object serialization methods, it's important to consider how to handle any errors that may occur. There are two basic options: passing existing errors along unmodified, to be dealt with at response time; or, wrapping all errors in an `Error` type specific to your app.  
1338 -  
1339 -For example, here's a simple `BackendError` enum which will be used in later examples:  
1340 -  
1341 -```swift  
1342 -enum BackendError: Error {  
1343 - case network(error: Error) // Capture any underlying Error from the URLSession API  
1344 - case dataSerialization(error: Error)  
1345 - case jsonSerialization(error: Error)  
1346 - case xmlSerialization(error: Error)  
1347 - case objectSerialization(reason: String)  
1348 -}  
1349 -```  
1350 -  
1351 -#### Creating a Custom Response Serializer  
1352 -  
1353 -Alamofire provides built-in response serialization for strings, JSON, and property lists, but others can be added in extensions on `Alamofire.DataRequest` and / or `Alamofire.DownloadRequest`.  
1354 -  
1355 -For example, here's how a response handler using [Ono](https://github.com/mattt/Ono) might be implemented:  
1356 -  
1357 -```swift  
1358 -extension DataRequest {  
1359 - static func xmlResponseSerializer() -> DataResponseSerializer<ONOXMLDocument> {  
1360 - return DataResponseSerializer { request, response, data, error in  
1361 - // Pass through any underlying URLSession error to the .network case.  
1362 - guard error == nil else { return .failure(BackendError.network(error: error!)) }  
1363 -  
1364 - // Use Alamofire's existing data serializer to extract the data, passing the error as nil, as it has  
1365 - // already been handled.  
1366 - let result = Request.serializeResponseData(response: response, data: data, error: nil)  
1367 -  
1368 - guard case let .success(validData) = result else {  
1369 - return .failure(BackendError.dataSerialization(error: result.error! as! AFError))  
1370 - }  
1371 -  
1372 - do {  
1373 - let xml = try ONOXMLDocument(data: validData)  
1374 - return .success(xml)  
1375 - } catch {  
1376 - return .failure(BackendError.xmlSerialization(error: error))  
1377 - }  
1378 - }  
1379 - }  
1380 -  
1381 - @discardableResult  
1382 - func responseXMLDocument(  
1383 - queue: DispatchQueue? = nil,  
1384 - completionHandler: @escaping (DataResponse<ONOXMLDocument>) -> Void)  
1385 - -> Self  
1386 - {  
1387 - return response(  
1388 - queue: queue,  
1389 - responseSerializer: DataRequest.xmlResponseSerializer(),  
1390 - completionHandler: completionHandler  
1391 - )  
1392 - }  
1393 -}  
1394 -```  
1395 -  
1396 -#### Generic Response Object Serialization  
1397 -  
1398 -Generics can be used to provide automatic, type-safe response object serialization.  
1399 -  
1400 -```swift  
1401 -protocol ResponseObjectSerializable {  
1402 - init?(response: HTTPURLResponse, representation: Any)  
1403 -}  
1404 -  
1405 -extension DataRequest {  
1406 - func responseObject<T: ResponseObjectSerializable>(  
1407 - queue: DispatchQueue? = nil,  
1408 - completionHandler: @escaping (DataResponse<T>) -> Void)  
1409 - -> Self  
1410 - {  
1411 - let responseSerializer = DataResponseSerializer<T> { request, response, data, error in  
1412 - guard error == nil else { return .failure(BackendError.network(error: error!)) }  
1413 -  
1414 - let jsonResponseSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)  
1415 - let result = jsonResponseSerializer.serializeResponse(request, response, data, nil)  
1416 -  
1417 - guard case let .success(jsonObject) = result else {  
1418 - return .failure(BackendError.jsonSerialization(error: result.error!))  
1419 - }  
1420 -  
1421 - guard let response = response, let responseObject = T(response: response, representation: jsonObject) else {  
1422 - return .failure(BackendError.objectSerialization(reason: "JSON could not be serialized: \(jsonObject)"))  
1423 - }  
1424 -  
1425 - return .success(responseObject)  
1426 - }  
1427 -  
1428 - return response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler)  
1429 - }  
1430 -}  
1431 -```  
1432 -  
1433 -```swift  
1434 -struct User: ResponseObjectSerializable, CustomStringConvertible {  
1435 - let username: String  
1436 - let name: String  
1437 -  
1438 - var description: String {  
1439 - return "User: { username: \(username), name: \(name) }"  
1440 - }  
1441 -  
1442 - init?(response: HTTPURLResponse, representation: Any) {  
1443 - guard  
1444 - let username = response.url?.lastPathComponent,  
1445 - let representation = representation as? [String: Any],  
1446 - let name = representation["name"] as? String  
1447 - else { return nil }  
1448 -  
1449 - self.username = username  
1450 - self.name = name  
1451 - }  
1452 -}  
1453 -```  
1454 -  
1455 -```swift  
1456 -Alamofire.request("https://example.com/users/mattt").responseObject { (response: DataResponse<User>) in  
1457 - debugPrint(response)  
1458 -  
1459 - if let user = response.result.value {  
1460 - print("User: { username: \(user.username), name: \(user.name) }")  
1461 - }  
1462 -}  
1463 -```  
1464 -  
1465 -The same approach can also be used to handle endpoints that return a representation of a collection of objects:  
1466 -  
1467 -```swift  
1468 -protocol ResponseCollectionSerializable {  
1469 - static func collection(from response: HTTPURLResponse, withRepresentation representation: Any) -> [Self]  
1470 -}  
1471 -  
1472 -extension ResponseCollectionSerializable where Self: ResponseObjectSerializable {  
1473 - static func collection(from response: HTTPURLResponse, withRepresentation representation: Any) -> [Self] {  
1474 - var collection: [Self] = []  
1475 -  
1476 - if let representation = representation as? [[String: Any]] {  
1477 - for itemRepresentation in representation {  
1478 - if let item = Self(response: response, representation: itemRepresentation) {  
1479 - collection.append(item)  
1480 - }  
1481 - }  
1482 - }  
1483 -  
1484 - return collection  
1485 - }  
1486 -}  
1487 -```  
1488 -  
1489 -```swift  
1490 -extension DataRequest {  
1491 - @discardableResult  
1492 - func responseCollection<T: ResponseCollectionSerializable>(  
1493 - queue: DispatchQueue? = nil,  
1494 - completionHandler: @escaping (DataResponse<[T]>) -> Void) -> Self  
1495 - {  
1496 - let responseSerializer = DataResponseSerializer<[T]> { request, response, data, error in  
1497 - guard error == nil else { return .failure(BackendError.network(error: error!)) }  
1498 -  
1499 - let jsonSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)  
1500 - let result = jsonSerializer.serializeResponse(request, response, data, nil)  
1501 -  
1502 - guard case let .success(jsonObject) = result else {  
1503 - return .failure(BackendError.jsonSerialization(error: result.error!))  
1504 - }  
1505 -  
1506 - guard let response = response else {  
1507 - let reason = "Response collection could not be serialized due to nil response."  
1508 - return .failure(BackendError.objectSerialization(reason: reason))  
1509 - }  
1510 -  
1511 - return .success(T.collection(from: response, withRepresentation: jsonObject))  
1512 - }  
1513 -  
1514 - return response(responseSerializer: responseSerializer, completionHandler: completionHandler)  
1515 - }  
1516 -}  
1517 -```  
1518 -  
1519 -```swift  
1520 -struct User: ResponseObjectSerializable, ResponseCollectionSerializable, CustomStringConvertible {  
1521 - let username: String  
1522 - let name: String  
1523 -  
1524 - var description: String {  
1525 - return "User: { username: \(username), name: \(name) }"  
1526 - }  
1527 -  
1528 - init?(response: HTTPURLResponse, representation: Any) {  
1529 - guard  
1530 - let username = response.url?.lastPathComponent,  
1531 - let representation = representation as? [String: Any],  
1532 - let name = representation["name"] as? String  
1533 - else { return nil }  
1534 -  
1535 - self.username = username  
1536 - self.name = name  
1537 - }  
1538 -}  
1539 -```  
1540 -  
1541 -```swift  
1542 -Alamofire.request("https://example.com/users").responseCollection { (response: DataResponse<[User]>) in  
1543 - debugPrint(response)  
1544 -  
1545 - if let users = response.result.value {  
1546 - users.forEach { print("- \($0)") }  
1547 - }  
1548 -}  
1549 -```  
1550 -  
1551 -### Security  
1552 -  
1553 -Using a secure HTTPS connection when communicating with servers and web services is an important step in securing sensitive data. By default, Alamofire will evaluate the certificate chain provided by the server using Apple's built in validation provided by the Security framework. While this guarantees the certificate chain is valid, it does not prevent man-in-the-middle (MITM) attacks or other potential vulnerabilities. In order to mitigate MITM attacks, applications dealing with sensitive customer data or financial information should use certificate or public key pinning provided by the `ServerTrustPolicy`.  
1554 -  
1555 -#### ServerTrustPolicy  
1556 -  
1557 -The `ServerTrustPolicy` enumeration evaluates the server trust generally provided by an `URLAuthenticationChallenge` when connecting to a server over a secure HTTPS connection.  
1558 -  
1559 -```swift  
1560 -let serverTrustPolicy = ServerTrustPolicy.pinCertificates(  
1561 - certificates: ServerTrustPolicy.certificatesInBundle(),  
1562 - validateCertificateChain: true,  
1563 - validateHost: true  
1564 -)  
1565 -```  
1566 -  
1567 -There are many different cases of server trust evaluation giving you complete control over the validation process:  
1568 -  
1569 -* `performDefaultEvaluation`: Uses the default server trust evaluation while allowing you to control whether to validate the host provided by the challenge.  
1570 -* `pinCertificates`: Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned certificates match one of the server certificates.  
1571 -* `pinPublicKeys`: Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned public keys match one of the server certificate public keys.  
1572 -* `disableEvaluation`: Disables all evaluation which in turn will always consider any server trust as valid.  
1573 -* `customEvaluation`: Uses the associated closure to evaluate the validity of the server trust thus giving you complete control over the validation process. Use with caution.  
1574 -  
1575 -#### Server Trust Policy Manager  
1576 -  
1577 -The `ServerTrustPolicyManager` is responsible for storing an internal mapping of server trust policies to a particular host. This allows Alamofire to evaluate each host against a different server trust policy. 132 +#### Swift 3
1578 133
1579 ```swift 134 ```swift
1580 -let serverTrustPolicies: [String: ServerTrustPolicy] = [  
1581 - "test.example.com": .pinCertificates(  
1582 - certificates: ServerTrustPolicy.certificatesInBundle(),  
1583 - validateCertificateChain: true,  
1584 - validateHost: true  
1585 - ),  
1586 - "insecure.expired-apis.com": .disableEvaluation 135 +dependencies: [
  136 + .Package(url: "https://github.com/Alamofire/Alamofire.git", majorVersion: 4)
1587 ] 137 ]
1588 -  
1589 -let sessionManager = SessionManager(  
1590 - serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)  
1591 -)  
1592 ``` 138 ```
1593 139
1594 -> Make sure to keep a reference to the new `SessionManager` instance, otherwise your requests will all get cancelled when your `sessionManager` is deallocated.  
1595 -  
1596 -These server trust policies will result in the following behavior:  
1597 -  
1598 -- `test.example.com` will always use certificate pinning with certificate chain and host validation enabled thus requiring the following criteria to be met to allow the TLS handshake to succeed:  
1599 - - Certificate chain MUST be valid.  
1600 - - Certificate chain MUST include one of the pinned certificates.  
1601 - - Challenge host MUST match the host in the certificate chain's leaf certificate.  
1602 -- `insecure.expired-apis.com` will never evaluate the certificate chain and will always allow the TLS handshake to succeed.  
1603 -- All other hosts will use the default evaluation provided by Apple.  
1604 -  
1605 -##### Subclassing Server Trust Policy Manager  
1606 -  
1607 -If you find yourself needing more flexible server trust policy matching behavior (i.e. wildcarded domains), then subclass the `ServerTrustPolicyManager` and override the `serverTrustPolicyForHost` method with your own custom implementation. 140 +#### Swift 4
1608 141
1609 ```swift 142 ```swift
1610 -class CustomServerTrustPolicyManager: ServerTrustPolicyManager {  
1611 - override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {  
1612 - var policy: ServerTrustPolicy?  
1613 -  
1614 - // Implement your custom domain matching behavior...  
1615 -  
1616 - return policy  
1617 - }  
1618 -} 143 +dependencies: [
  144 + .package(url: "https://github.com/Alamofire/Alamofire.git", from: "4.0.0")
  145 +]
1619 ``` 146 ```
1620 147
1621 -#### Validating the Host  
1622 -  
1623 -The `.performDefaultEvaluation`, `.pinCertificates` and `.pinPublicKeys` server trust policies all take a `validateHost` parameter. Setting the value to `true` will cause the server trust evaluation to verify that hostname in the certificate matches the hostname of the challenge. If they do not match, evaluation will fail. A `validateHost` value of `false` will still evaluate the full certificate chain, but will not validate the hostname of the leaf certificate.  
1624 -  
1625 -> It is recommended that `validateHost` always be set to `true` in production environments.  
1626 -  
1627 -#### Validating the Certificate Chain  
1628 -  
1629 -Pinning certificates and public keys both have the option of validating the certificate chain using the `validateCertificateChain` parameter. By setting this value to `true`, the full certificate chain will be evaluated in addition to performing a byte equality check against the pinned certificates or public keys. A value of `false` will skip the certificate chain validation, but will still perform the byte equality check.  
1630 -  
1631 -There are several cases where it may make sense to disable certificate chain validation. The most common use cases for disabling validation are self-signed and expired certificates. The evaluation would always fail in both of these cases, but the byte equality check will still ensure you are receiving the certificate you expect from the server.  
1632 -  
1633 -> It is recommended that `validateCertificateChain` always be set to `true` in production environments.  
1634 -  
1635 -#### App Transport Security  
1636 -  
1637 -With the addition of App Transport Security (ATS) in iOS 9, it is possible that using a custom `ServerTrustPolicyManager` with several `ServerTrustPolicy` objects will have no effect. If you continuously see `CFNetwork SSLHandshake failed (-9806)` errors, you have probably run into this problem. Apple's ATS system overrides the entire challenge system unless you configure the ATS settings in your app's plist to disable enough of it to allow your app to evaluate the server trust. 148 +### Manually
1638 149
1639 -If you run into this problem (high probability with self-signed certificates), you can work around this issue by adding the following to your `Info.plist`. 150 +If you prefer not to use any of the aforementioned dependency managers, you can integrate Alamofire into your project manually.
1640 151
1641 -```xml  
1642 -<dict>  
1643 - <key>NSAppTransportSecurity</key>  
1644 - <dict>  
1645 - <key>NSExceptionDomains</key>  
1646 - <dict>  
1647 - <key>example.com</key>  
1648 - <dict>  
1649 - <key>NSExceptionAllowsInsecureHTTPLoads</key>  
1650 - <true/>  
1651 - <key>NSExceptionRequiresForwardSecrecy</key>  
1652 - <false/>  
1653 - <key>NSIncludesSubdomains</key>  
1654 - <true/>  
1655 - <!-- Optional: Specify minimum TLS version -->  
1656 - <key>NSTemporaryExceptionMinimumTLSVersion</key>  
1657 - <string>TLSv1.2</string>  
1658 - </dict>  
1659 - </dict>  
1660 - </dict>  
1661 -</dict>  
1662 -``` 152 +#### Embedded Framework
1663 153
1664 -Whether you need to set the `NSExceptionRequiresForwardSecrecy` to `NO` depends on whether your TLS connection is using an allowed cipher suite. In certain cases, it will need to be set to `NO`. The `NSExceptionAllowsInsecureHTTPLoads` MUST be set to `YES` in order to allow the `SessionDelegate` to receive challenge callbacks. Once the challenge callbacks are being called, the `ServerTrustPolicyManager` will take over the server trust evaluation. You may also need to specify the `NSTemporaryExceptionMinimumTLSVersion` if you're trying to connect to a host that only supports TLS versions less than `1.2`. 154 +- Open up Terminal, `cd` into your top-level project directory, and run the following command "if" your project is not initialized as a git repository:
1665 155
1666 -> It is recommended to always use valid certificates in production environments. 156 + ```bash
  157 + $ git init
  158 + ```
1667 159
1668 -### Network Reachability 160 +- Add Alamofire as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command:
1669 161
1670 -The `NetworkReachabilityManager` listens for reachability changes of hosts and addresses for both WWAN and WiFi network interfaces. 162 + ```bash
  163 + $ git submodule add https://github.com/Alamofire/Alamofire.git
  164 + ```
1671 165
1672 -```swift  
1673 -let manager = NetworkReachabilityManager(host: "www.apple.com") 166 +- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project.
1674 167
1675 -manager?.listener = { status in  
1676 - print("Network Status Changed: \(status)")  
1677 -} 168 + > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.
1678 169
1679 -manager?.startListening()  
1680 -``` 170 +- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target.
  171 +- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the "Targets" heading in the sidebar.
  172 +- In the tab bar at the top of that window, open the "General" panel.
  173 +- Click on the `+` button under the "Embedded Binaries" section.
  174 +- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder.
1681 175
1682 -> Make sure to remember to retain the `manager` in the above example, or no status changes will be reported. 176 + > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`.
1683 177
1684 -There are some important things to remember when using network reachability to determine what to do next. 178 +- Select the top `Alamofire.framework` for iOS and the bottom one for OS X.
1685 179
1686 -- **Do NOT** use Reachability to determine if a network request should be sent.  
1687 - - You should **ALWAYS** send it.  
1688 -- When Reachability is restored, use the event to retry failed network requests.  
1689 - - Even though the network requests may still fail, this is a good moment to retry them.  
1690 -- The network reachability status can be useful for determining why a network request may have failed.  
1691 - - If a network request fails, it is more useful to tell the user that the network request failed due to being offline rather than a more technical error, such as "request timed out." 180 + > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as either `Alamofire iOS`, `Alamofire macOS`, `Alamofire tvOS` or `Alamofire watchOS`.
1692 181
1693 -> It is recommended to check out [WWDC 2012 Session 706, "Networking Best Practices"](https://developer.apple.com/videos/play/wwdc2012-706/) for more info. 182 +- And that's it!
1694 183
1695 ---- 184 + > The `Alamofire.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.
1696 185
1697 ## Open Radars 186 ## Open Radars
1698 187
1699 The following radars have some effect on the current implementation of Alamofire. 188 The following radars have some effect on the current implementation of Alamofire.
1700 189
1701 - [`rdar://21349340`](http://www.openradar.me/radar?id=5517037090635776) - Compiler throwing warning due to toll-free bridging issue in test case 190 - [`rdar://21349340`](http://www.openradar.me/radar?id=5517037090635776) - Compiler throwing warning due to toll-free bridging issue in test case
1702 -- [`rdar://26761490`](http://www.openradar.me/radar?id=5010235949318144) - Swift string interpolation causing memory leak with common usage  
1703 - `rdar://26870455` - Background URL Session Configurations do not work in the simulator 191 - `rdar://26870455` - Background URL Session Configurations do not work in the simulator
1704 - `rdar://26849668` - Some URLProtocol APIs do not properly handle `URLRequest` 192 - `rdar://26849668` - Some URLProtocol APIs do not properly handle `URLRequest`
  193 +- [`rdar://36082113`](http://openradar.appspot.com/radar?id=4942308441063424) - `URLSessionTaskMetrics` failing to link on watchOS 3.0+
  194 +
  195 +## Resolved Radars
  196 +
  197 +The following radars have been resolved over time after being filed against the Alamofire project.
  198 +
  199 +- [`rdar://26761490`](http://www.openradar.me/radar?id=5010235949318144) - Swift string interpolation causing memory leak with common usage (Resolved on 9/1/17 in Xcode 9 beta 6).
1705 200
1706 ## FAQ 201 ## FAQ
1707 202
@@ -1715,8 +210,6 @@ Simple, static data such as paths, parameters and common headers belong in the ` @@ -1715,8 +210,6 @@ Simple, static data such as paths, parameters and common headers belong in the `
1715 210
1716 The reason the dynamic data MUST be placed into the `RequestAdapter` is to support retry operations. When a `Request` is retried, the original request is not rebuilt meaning the `Router` will not be called again. The `RequestAdapter` is called again allowing the dynamic data to be updated on the original request before retrying the `Request`. 211 The reason the dynamic data MUST be placed into the `RequestAdapter` is to support retry operations. When a `Request` is retried, the original request is not rebuilt meaning the `Router` will not be called again. The `RequestAdapter` is called again allowing the dynamic data to be updated on the original request before retrying the `Request`.
1717 212
1718 ----  
1719 -  
1720 ## Credits 213 ## Credits
1721 214
1722 Alamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases. 215 Alamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases.
@@ -1727,18 +220,23 @@ If you believe you have identified a security vulnerability with Alamofire, you @@ -1727,18 +220,23 @@ If you believe you have identified a security vulnerability with Alamofire, you
1727 220
1728 ## Donations 221 ## Donations
1729 222
1730 -The [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially register as a federal non-profit organization. Registering will allow us members to gain some legal protections and also allow us to put donations to use, tax free. Donating to the ASF will enable us to: 223 +The [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially stay registered as a federal non-profit organization.
  224 +Registering will allow us members to gain some legal protections and also allow us to put donations to use, tax free.
  225 +Donating to the ASF will enable us to:
1731 226
1732 -- Pay our legal fees to register as a federal non-profit organization  
1733 - Pay our yearly legal fees to keep the non-profit in good status 227 - Pay our yearly legal fees to keep the non-profit in good status
1734 - Pay for our mail servers to help us stay on top of all questions and security issues 228 - Pay for our mail servers to help us stay on top of all questions and security issues
1735 - Potentially fund test servers to make it easier for us to test the edge cases 229 - Potentially fund test servers to make it easier for us to test the edge cases
1736 - Potentially fund developers to work on one of our projects full-time 230 - Potentially fund developers to work on one of our projects full-time
1737 231
1738 -The community adoption of the ASF libraries has been amazing. We are greatly humbled by your enthusiasm around the projects, and want to continue to do everything we can to move the needle forward. With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members. If you use any of our libraries for work, see if your employers would be interested in donating. Our initial goal is to raise $1000 to get all our legal ducks in a row and kickstart this campaign. Any amount you can donate today to help us reach our goal would be greatly appreciated. 232 +The community adoption of the ASF libraries has been amazing.
  233 +We are greatly humbled by your enthusiasm around the projects, and want to continue to do everything we can to move the needle forward.
  234 +With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members.
  235 +If you use any of our libraries for work, see if your employers would be interested in donating.
  236 +Any amount you can donate today to help us reach our goal would be greatly appreciated.
1739 237
1740 -<a href='https://pledgie.com/campaigns/31474'><img alt='Click here to lend your support to: Alamofire Software Foundation and make a donation at pledgie.com !' src='https://pledgie.com/campaigns/31474.png?skin_name=chrome' border='0' ></a> 238 +[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W34WPEE74APJQ)
1741 239
1742 ## License 240 ## License
1743 241
1744 -Alamofire is released under the MIT license. See LICENSE for details. 242 +Alamofire is released under the MIT license. [See LICENSE](https://github.com/Alamofire/Alamofire/blob/master/LICENSE) for details.
ParentAssistant/Pods/Alamofire/Source/AFError.swift
1 // 1 //
2 // AFError.swift 2 // AFError.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -132,6 +132,16 @@ public enum AFError: Error { @@ -132,6 +132,16 @@ public enum AFError: Error {
132 case responseSerializationFailed(reason: ResponseSerializationFailureReason) 132 case responseSerializationFailed(reason: ResponseSerializationFailureReason)
133 } 133 }
134 134
  135 +// MARK: - Adapt Error
  136 +
  137 +struct AdaptError: Error {
  138 + let error: Error
  139 +}
  140 +
  141 +extension Error {
  142 + var underlyingAdaptError: Error? { return (self as? AdaptError)?.error }
  143 +}
  144 +
135 // MARK: - Error Booleans 145 // MARK: - Error Booleans
136 146
137 extension AFError { 147 extension AFError {
ParentAssistant/Pods/Alamofire/Source/Alamofire.swift
1 // 1 //
2 // Alamofire.swift 2 // Alamofire.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -53,7 +53,7 @@ extension URL: URLConvertible { @@ -53,7 +53,7 @@ extension URL: URLConvertible {
53 } 53 }
54 54
55 extension URLComponents: URLConvertible { 55 extension URLComponents: URLConvertible {
56 - /// Returns a URL if `url` is not nil, otherise throws an `Error`. 56 + /// Returns a URL if `url` is not nil, otherwise throws an `Error`.
57 /// 57 ///
58 /// - throws: An `AFError.invalidURL` if `url` is `nil`. 58 /// - throws: An `AFError.invalidURL` if `url` is `nil`.
59 /// 59 ///
@@ -222,6 +222,13 @@ public func download( @@ -222,6 +222,13 @@ public func download(
222 /// If `destination` is not specified, the contents will remain in the temporary location determined by the 222 /// If `destination` is not specified, the contents will remain in the temporary location determined by the
223 /// underlying URL session. 223 /// underlying URL session.
224 /// 224 ///
  225 +/// On the latest release of all the Apple platforms (iOS 10, macOS 10.12, tvOS 10, watchOS 3), `resumeData` is broken
  226 +/// on background URL session configurations. There's an underlying bug in the `resumeData` generation logic where the
  227 +/// data is written incorrectly and will always fail to resume the download. For more information about the bug and
  228 +/// possible workarounds, please refer to the following Stack Overflow post:
  229 +///
  230 +/// - http://stackoverflow.com/a/39347461/1342462
  231 +///
225 /// - parameter resumeData: The resume data. This is an opaque data blob produced by `URLSessionDownloadTask` 232 /// - parameter resumeData: The resume data. This is an opaque data blob produced by `URLSessionDownloadTask`
226 /// when a task is cancelled. See `URLSession -downloadTask(withResumeData:)` for additional 233 /// when a task is cancelled. See `URLSession -downloadTask(withResumeData:)` for additional
227 /// information. 234 /// information.
@@ -435,6 +442,7 @@ public func upload( @@ -435,6 +442,7 @@ public func upload(
435 /// 442 ///
436 /// - returns: The created `StreamRequest`. 443 /// - returns: The created `StreamRequest`.
437 @discardableResult 444 @discardableResult
  445 +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
438 public func stream(withHostName hostName: String, port: Int) -> StreamRequest { 446 public func stream(withHostName hostName: String, port: Int) -> StreamRequest {
439 return SessionManager.default.stream(withHostName: hostName, port: port) 447 return SessionManager.default.stream(withHostName: hostName, port: port)
440 } 448 }
@@ -449,6 +457,7 @@ public func stream(withHostName hostName: String, port: Int) -&gt; StreamRequest { @@ -449,6 +457,7 @@ public func stream(withHostName hostName: String, port: Int) -&gt; StreamRequest {
449 /// 457 ///
450 /// - returns: The created `StreamRequest`. 458 /// - returns: The created `StreamRequest`.
451 @discardableResult 459 @discardableResult
  460 +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
452 public func stream(with netService: NetService) -> StreamRequest { 461 public func stream(with netService: NetService) -> StreamRequest {
453 return SessionManager.default.stream(with: netService) 462 return SessionManager.default.stream(with: netService)
454 } 463 }
ParentAssistant/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift
1 // 1 //
2 // DispatchQueue+Alamofire.swift 2 // DispatchQueue+Alamofire.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -34,10 +34,4 @@ extension DispatchQueue { @@ -34,10 +34,4 @@ extension DispatchQueue {
34 func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) { 34 func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) {
35 asyncAfter(deadline: .now() + delay, execute: closure) 35 asyncAfter(deadline: .now() + delay, execute: closure)
36 } 36 }
37 -  
38 - func syncResult<T>(_ closure: () -> T) -> T {  
39 - var result: T!  
40 - sync { result = closure() }  
41 - return result  
42 - }  
43 } 37 }
ParentAssistant/Pods/Alamofire/Source/MultipartFormData.swift
1 // 1 //
2 // MultipartFormData.swift 2 // MultipartFormData.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -92,7 +92,7 @@ open class MultipartFormData { @@ -92,7 +92,7 @@ open class MultipartFormData {
92 // MARK: - Properties 92 // MARK: - Properties
93 93
94 /// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`. 94 /// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`.
95 - open var contentType: String { return "multipart/form-data; boundary=\(boundary)" } 95 + open lazy var contentType: String = "multipart/form-data; boundary=\(self.boundary)"
96 96
97 /// The content length of all body parts used to generate the `multipart/form-data` not including the boundaries. 97 /// The content length of all body parts used to generate the `multipart/form-data` not including the boundaries.
98 public var contentLength: UInt64 { return bodyParts.reduce(0) { $0 + $1.bodyContentLength } } 98 public var contentLength: UInt64 { return bodyParts.reduce(0) { $0 + $1.bodyContentLength } }
@@ -257,8 +257,7 @@ open class MultipartFormData { @@ -257,8 +257,7 @@ open class MultipartFormData {
257 var isDirectory: ObjCBool = false 257 var isDirectory: ObjCBool = false
258 let path = fileURL.path 258 let path = fileURL.path
259 259
260 - guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else  
261 - { 260 + guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else {
262 setBodyPartError(withReason: .bodyPartFileIsDirectory(at: fileURL)) 261 setBodyPartError(withReason: .bodyPartFileIsDirectory(at: fileURL))
263 return 262 return
264 } 263 }
ParentAssistant/Pods/Alamofire/Source/NetworkReachabilityManager.swift
1 // 1 //
2 // NetworkReachabilityManager.swift 2 // NetworkReachabilityManager.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -34,16 +34,6 @@ import SystemConfiguration @@ -34,16 +34,6 @@ import SystemConfiguration
34 /// network requests when a connection is established. It should not be used to prevent a user from initiating a network 34 /// network requests when a connection is established. It should not be used to prevent a user from initiating a network
35 /// request, as it's possible that an initial request may be required to establish reachability. 35 /// request, as it's possible that an initial request may be required to establish reachability.
36 open class NetworkReachabilityManager { 36 open class NetworkReachabilityManager {
37 - /**  
38 - Defines the various states of network reachability.  
39 -  
40 - - Unknown: It is unknown whether the network is reachable.  
41 - - NotReachable: The network is not reachable.  
42 - - ReachableOnWWAN: The network is reachable over the WWAN connection.  
43 - - ReachableOnWiFi: The network is reachable over the WiFi connection.  
44 - */  
45 -  
46 -  
47 /// Defines the various states of network reachability. 37 /// Defines the various states of network reachability.
48 /// 38 ///
49 /// - unknown: It is unknown whether the network is reachable. 39 /// - unknown: It is unknown whether the network is reachable.
@@ -91,7 +81,7 @@ open class NetworkReachabilityManager { @@ -91,7 +81,7 @@ open class NetworkReachabilityManager {
91 /// A closure executed when the network reachability status changes. 81 /// A closure executed when the network reachability status changes.
92 open var listener: Listener? 82 open var listener: Listener?
93 83
94 - private var flags: SCNetworkReachabilityFlags? { 84 + open var flags: SCNetworkReachabilityFlags? {
95 var flags = SCNetworkReachabilityFlags() 85 var flags = SCNetworkReachabilityFlags()
96 86
97 if SCNetworkReachabilityGetFlags(reachability, &flags) { 87 if SCNetworkReachabilityGetFlags(reachability, &flags) {
@@ -102,7 +92,7 @@ open class NetworkReachabilityManager { @@ -102,7 +92,7 @@ open class NetworkReachabilityManager {
102 } 92 }
103 93
104 private let reachability: SCNetworkReachability 94 private let reachability: SCNetworkReachability
105 - private var previousFlags: SCNetworkReachabilityFlags 95 + open var previousFlags: SCNetworkReachabilityFlags
106 96
107 // MARK: - Initialization 97 // MARK: - Initialization
108 98
@@ -192,21 +182,24 @@ open class NetworkReachabilityManager { @@ -192,21 +182,24 @@ open class NetworkReachabilityManager {
192 // MARK: - Internal - Network Reachability Status 182 // MARK: - Internal - Network Reachability Status
193 183
194 func networkReachabilityStatusForFlags(_ flags: SCNetworkReachabilityFlags) -> NetworkReachabilityStatus { 184 func networkReachabilityStatusForFlags(_ flags: SCNetworkReachabilityFlags) -> NetworkReachabilityStatus {
195 - guard flags.contains(.reachable) else { return .notReachable } 185 + guard isNetworkReachable(with: flags) else { return .notReachable }
196 186
197 - var networkStatus: NetworkReachabilityStatus = .notReachable 187 + var networkStatus: NetworkReachabilityStatus = .reachable(.ethernetOrWiFi)
198 188
199 - if !flags.contains(.connectionRequired) { networkStatus = .reachable(.ethernetOrWiFi) } 189 + #if os(iOS)
  190 + if flags.contains(.isWWAN) { networkStatus = .reachable(.wwan) }
  191 + #endif
200 192
201 - if flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic) {  
202 - if !flags.contains(.interventionRequired) { networkStatus = .reachable(.ethernetOrWiFi) }  
203 - } 193 + return networkStatus
  194 + }
204 195
205 - #if os(iOS)  
206 - if flags.contains(.isWWAN) { networkStatus = .reachable(.wwan) }  
207 - #endif 196 + func isNetworkReachable(with flags: SCNetworkReachabilityFlags) -> Bool {
  197 + let isReachable = flags.contains(.reachable)
  198 + let needsConnection = flags.contains(.connectionRequired)
  199 + let canConnectAutomatically = flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic)
  200 + let canConnectWithoutUserInteraction = canConnectAutomatically && !flags.contains(.interventionRequired)
208 201
209 - return networkStatus 202 + return isReachable && (!needsConnection || canConnectWithoutUserInteraction)
210 } 203 }
211 } 204 }
212 205
ParentAssistant/Pods/Alamofire/Source/Notifications.swift
1 // 1 //
2 // Notifications.swift 2 // Notifications.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -48,5 +48,8 @@ extension Notification { @@ -48,5 +48,8 @@ extension Notification {
48 public struct Key { 48 public struct Key {
49 /// User info dictionary key representing the `URLSessionTask` associated with the notification. 49 /// User info dictionary key representing the `URLSessionTask` associated with the notification.
50 public static let Task = "org.alamofire.notification.key.task" 50 public static let Task = "org.alamofire.notification.key.task"
  51 +
  52 + /// User info dictionary key representing the responseData associated with the notification.
  53 + public static let ResponseData = "org.alamofire.notification.key.responseData"
51 } 54 }
52 } 55 }
ParentAssistant/Pods/Alamofire/Source/ParameterEncoding.swift
1 // 1 //
2 // ParameterEncoding.swift 2 // ParameterEncoding.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -64,9 +64,15 @@ public protocol ParameterEncoding { @@ -64,9 +64,15 @@ public protocol ParameterEncoding {
64 /// the HTTP body depends on the destination of the encoding. 64 /// the HTTP body depends on the destination of the encoding.
65 /// 65 ///
66 /// The `Content-Type` HTTP header field of an encoded request with HTTP body is set to 66 /// The `Content-Type` HTTP header field of an encoded request with HTTP body is set to
67 -/// `application/x-www-form-urlencoded; charset=utf-8`. Since there is no published specification for how to encode  
68 -/// collection types, the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending  
69 -/// the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`). 67 +/// `application/x-www-form-urlencoded; charset=utf-8`.
  68 +///
  69 +/// There is no published specification for how to encode collection types. By default the convention of appending
  70 +/// `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for
  71 +/// nested dictionary values (`foo[bar]=baz`) is used. Optionally, `ArrayEncoding` can be used to omit the
  72 +/// square brackets appended to array keys.
  73 +///
  74 +/// `BoolEncoding` can be used to configure how boolean values are encoded. The default behavior is to encode
  75 +/// `true` as 1 and `false` as 0.
70 public struct URLEncoding: ParameterEncoding { 76 public struct URLEncoding: ParameterEncoding {
71 77
72 // MARK: Helper Types 78 // MARK: Helper Types
@@ -82,6 +88,41 @@ public struct URLEncoding: ParameterEncoding { @@ -82,6 +88,41 @@ public struct URLEncoding: ParameterEncoding {
82 case methodDependent, queryString, httpBody 88 case methodDependent, queryString, httpBody
83 } 89 }
84 90
  91 + /// Configures how `Array` parameters are encoded.
  92 + ///
  93 + /// - brackets: An empty set of square brackets is appended to the key for every value.
  94 + /// This is the default behavior.
  95 + /// - noBrackets: No brackets are appended. The key is encoded as is.
  96 + public enum ArrayEncoding {
  97 + case brackets, noBrackets
  98 +
  99 + func encode(key: String) -> String {
  100 + switch self {
  101 + case .brackets:
  102 + return "\(key)[]"
  103 + case .noBrackets:
  104 + return key
  105 + }
  106 + }
  107 + }
  108 +
  109 + /// Configures how `Bool` parameters are encoded.
  110 + ///
  111 + /// - numeric: Encode `true` as `1` and `false` as `0`. This is the default behavior.
  112 + /// - literal: Encode `true` and `false` as string literals.
  113 + public enum BoolEncoding {
  114 + case numeric, literal
  115 +
  116 + func encode(value: Bool) -> String {
  117 + switch self {
  118 + case .numeric:
  119 + return value ? "1" : "0"
  120 + case .literal:
  121 + return value ? "true" : "false"
  122 + }
  123 + }
  124 + }
  125 +
85 // MARK: Properties 126 // MARK: Properties
86 127
87 /// Returns a default `URLEncoding` instance. 128 /// Returns a default `URLEncoding` instance.
@@ -99,15 +140,25 @@ public struct URLEncoding: ParameterEncoding { @@ -99,15 +140,25 @@ public struct URLEncoding: ParameterEncoding {
99 /// The destination defining where the encoded query string is to be applied to the URL request. 140 /// The destination defining where the encoded query string is to be applied to the URL request.
100 public let destination: Destination 141 public let destination: Destination
101 142
  143 + /// The encoding to use for `Array` parameters.
  144 + public let arrayEncoding: ArrayEncoding
  145 +
  146 + /// The encoding to use for `Bool` parameters.
  147 + public let boolEncoding: BoolEncoding
  148 +
102 // MARK: Initialization 149 // MARK: Initialization
103 150
104 /// Creates a `URLEncoding` instance using the specified destination. 151 /// Creates a `URLEncoding` instance using the specified destination.
105 /// 152 ///
106 /// - parameter destination: The destination defining where the encoded query string is to be applied. 153 /// - parameter destination: The destination defining where the encoded query string is to be applied.
  154 + /// - parameter arrayEncoding: The encoding to use for `Array` parameters.
  155 + /// - parameter boolEncoding: The encoding to use for `Bool` parameters.
107 /// 156 ///
108 /// - returns: The new `URLEncoding` instance. 157 /// - returns: The new `URLEncoding` instance.
109 - public init(destination: Destination = .methodDependent) { 158 + public init(destination: Destination = .methodDependent, arrayEncoding: ArrayEncoding = .brackets, boolEncoding: BoolEncoding = .numeric) {
110 self.destination = destination 159 self.destination = destination
  160 + self.arrayEncoding = arrayEncoding
  161 + self.boolEncoding = boolEncoding
111 } 162 }
112 163
113 // MARK: Encoding 164 // MARK: Encoding
@@ -161,16 +212,16 @@ public struct URLEncoding: ParameterEncoding { @@ -161,16 +212,16 @@ public struct URLEncoding: ParameterEncoding {
161 } 212 }
162 } else if let array = value as? [Any] { 213 } else if let array = value as? [Any] {
163 for value in array { 214 for value in array {
164 - components += queryComponents(fromKey: "\(key)[]", value: value) 215 + components += queryComponents(fromKey: arrayEncoding.encode(key: key), value: value)
165 } 216 }
166 } else if let value = value as? NSNumber { 217 } else if let value = value as? NSNumber {
167 if value.isBool { 218 if value.isBool {
168 - components.append((escape(key), escape((value.boolValue ? "1" : "0")))) 219 + components.append((escape(key), escape(boolEncoding.encode(value: value.boolValue))))
169 } else { 220 } else {
170 components.append((escape(key), escape("\(value)"))) 221 components.append((escape(key), escape("\(value)")))
171 } 222 }
172 } else if let bool = value as? Bool { 223 } else if let bool = value as? Bool {
173 - components.append((escape(key), escape((bool ? "1" : "0")))) 224 + components.append((escape(key), escape(boolEncoding.encode(value: bool))))
174 } else { 225 } else {
175 components.append((escape(key), escape("\(value)"))) 226 components.append((escape(key), escape("\(value)")))
176 } 227 }
@@ -199,7 +250,39 @@ public struct URLEncoding: ParameterEncoding { @@ -199,7 +250,39 @@ public struct URLEncoding: ParameterEncoding {
199 var allowedCharacterSet = CharacterSet.urlQueryAllowed 250 var allowedCharacterSet = CharacterSet.urlQueryAllowed
200 allowedCharacterSet.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)") 251 allowedCharacterSet.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")
201 252
202 - return string.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? string 253 + var escaped = ""
  254 +
  255 + //==========================================================================================================
  256 + //
  257 + // Batching is required for escaping due to an internal bug in iOS 8.1 and 8.2. Encoding more than a few
  258 + // hundred Chinese characters causes various malloc error crashes. To avoid this issue until iOS 8 is no
  259 + // longer supported, batching MUST be used for encoding. This introduces roughly a 20% overhead. For more
  260 + // info, please refer to:
  261 + //
  262 + // - https://github.com/Alamofire/Alamofire/issues/206
  263 + //
  264 + //==========================================================================================================
  265 +
  266 + if #available(iOS 8.3, *) {
  267 + escaped = string.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? string
  268 + } else {
  269 + let batchSize = 50
  270 + var index = string.startIndex
  271 +
  272 + while index != string.endIndex {
  273 + let startIndex = index
  274 + let endIndex = string.index(index, offsetBy: batchSize, limitedBy: string.endIndex) ?? string.endIndex
  275 + let range = startIndex..<endIndex
  276 +
  277 + let substring = string[range]
  278 +
  279 + escaped += substring.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? String(substring)
  280 +
  281 + index = endIndex
  282 + }
  283 + }
  284 +
  285 + return escaped
203 } 286 }
204 287
205 private func query(_ parameters: [String: Any]) -> String { 288 private func query(_ parameters: [String: Any]) -> String {
@@ -209,7 +292,6 @@ public struct URLEncoding: ParameterEncoding { @@ -209,7 +292,6 @@ public struct URLEncoding: ParameterEncoding {
209 let value = parameters[key]! 292 let value = parameters[key]!
210 components += queryComponents(fromKey: key, value: value) 293 components += queryComponents(fromKey: key, value: value)
211 } 294 }
212 -  
213 return components.map { "\($0)=\($1)" }.joined(separator: "&") 295 return components.map { "\($0)=\($1)" }.joined(separator: "&")
214 } 296 }
215 297
@@ -289,6 +371,34 @@ public struct JSONEncoding: ParameterEncoding { @@ -289,6 +371,34 @@ public struct JSONEncoding: ParameterEncoding {
289 371
290 return urlRequest 372 return urlRequest
291 } 373 }
  374 +
  375 + /// Creates a URL request by encoding the JSON object and setting the resulting data on the HTTP body.
  376 + ///
  377 + /// - parameter urlRequest: The request to apply the JSON object to.
  378 + /// - parameter jsonObject: The JSON object to apply to the request.
  379 + ///
  380 + /// - throws: An `Error` if the encoding process encounters an error.
  381 + ///
  382 + /// - returns: The encoded request.
  383 + public func encode(_ urlRequest: URLRequestConvertible, withJSONObject jsonObject: Any? = nil) throws -> URLRequest {
  384 + var urlRequest = try urlRequest.asURLRequest()
  385 +
  386 + guard let jsonObject = jsonObject else { return urlRequest }
  387 +
  388 + do {
  389 + let data = try JSONSerialization.data(withJSONObject: jsonObject, options: options)
  390 +
  391 + if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {
  392 + urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
  393 + }
  394 +
  395 + urlRequest.httpBody = data
  396 + } catch {
  397 + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))
  398 + }
  399 +
  400 + return urlRequest
  401 + }
292 } 402 }
293 403
294 // MARK: - 404 // MARK: -
ParentAssistant/Pods/Alamofire/Source/Request.swift
1 // 1 //
2 // Request.swift 2 // Request.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -46,7 +46,7 @@ public typealias RequestRetryCompletion = (_ shouldRetry: Bool, _ timeDelay: Tim @@ -46,7 +46,7 @@ public typealias RequestRetryCompletion = (_ shouldRetry: Bool, _ timeDelay: Tim
46 public protocol RequestRetrier { 46 public protocol RequestRetrier {
47 /// Determines whether the `Request` should be retried by calling the `completion` closure. 47 /// Determines whether the `Request` should be retried by calling the `completion` closure.
48 /// 48 ///
49 - /// This operation is fully asychronous. Any amount of time can be taken to determine whether the request needs 49 + /// This operation is fully asynchronous. Any amount of time can be taken to determine whether the request needs
50 /// to be retried. The one requirement is that the completion closure is called to ensure the request is properly 50 /// to be retried. The one requirement is that the completion closure is called to ensure the request is properly
51 /// cleaned up after. 51 /// cleaned up after.
52 /// 52 ///
@@ -110,6 +110,9 @@ open class Request { @@ -110,6 +110,9 @@ open class Request {
110 /// The response received from the server, if any. 110 /// The response received from the server, if any.
111 open var response: HTTPURLResponse? { return task?.response as? HTTPURLResponse } 111 open var response: HTTPURLResponse? { return task?.response as? HTTPURLResponse }
112 112
  113 + /// The number of times the request has been retried.
  114 + open internal(set) var retryCount: UInt = 0
  115 +
113 let originalTask: TaskConvertible? 116 let originalTask: TaskConvertible?
114 117
115 var startTime: CFAbsoluteTime? 118 var startTime: CFAbsoluteTime?
@@ -266,7 +269,7 @@ extension Request: CustomDebugStringConvertible { @@ -266,7 +269,7 @@ extension Request: CustomDebugStringConvertible {
266 } 269 }
267 270
268 func cURLRepresentation() -> String { 271 func cURLRepresentation() -> String {
269 - var components = ["$ curl -i"] 272 + var components = ["$ curl -v"]
270 273
271 guard let request = self.request, 274 guard let request = self.request,
272 let url = request.url, 275 let url = request.url,
@@ -290,11 +293,12 @@ extension Request: CustomDebugStringConvertible { @@ -290,11 +293,12 @@ extension Request: CustomDebugStringConvertible {
290 293
291 if let credentials = credentialStorage.credentials(for: protectionSpace)?.values { 294 if let credentials = credentialStorage.credentials(for: protectionSpace)?.values {
292 for credential in credentials { 295 for credential in credentials {
293 - components.append("-u \(credential.user!):\(credential.password!)") 296 + guard let user = credential.user, let password = credential.password else { continue }
  297 + components.append("-u \(user):\(password)")
294 } 298 }
295 } else { 299 } else {
296 - if let credential = delegate.credential {  
297 - components.append("-u \(credential.user!):\(credential.password!)") 300 + if let credential = delegate.credential, let user = credential.user, let password = credential.password {
  301 + components.append("-u \(user):\(password)")
298 } 302 }
299 } 303 }
300 } 304 }
@@ -305,7 +309,12 @@ extension Request: CustomDebugStringConvertible { @@ -305,7 +309,12 @@ extension Request: CustomDebugStringConvertible {
305 let cookies = cookieStorage.cookies(for: url), !cookies.isEmpty 309 let cookies = cookieStorage.cookies(for: url), !cookies.isEmpty
306 { 310 {
307 let string = cookies.reduce("") { $0 + "\($1.name)=\($1.value);" } 311 let string = cookies.reduce("") { $0 + "\($1.name)=\($1.value);" }
  312 +
  313 + #if swift(>=3.2)
  314 + components.append("-b \"\(string[..<string.index(before: string.endIndex)])\"")
  315 + #else
308 components.append("-b \"\(string.substring(to: string.characters.index(before: string.endIndex)))\"") 316 components.append("-b \"\(string.substring(to: string.characters.index(before: string.endIndex)))\"")
  317 + #endif
309 } 318 }
310 } 319 }
311 320
@@ -324,7 +333,8 @@ extension Request: CustomDebugStringConvertible { @@ -324,7 +333,8 @@ extension Request: CustomDebugStringConvertible {
324 } 333 }
325 334
326 for (field, value) in headers { 335 for (field, value) in headers {
327 - components.append("-H \"\(field): \(value)\"") 336 + let escapedValue = String(describing: value).replacingOccurrences(of: "\"", with: "\\\"")
  337 + components.append("-H \"\(field): \(escapedValue)\"")
328 } 338 }
329 339
330 if let httpBodyData = request.httpBody, let httpBody = String(data: httpBodyData, encoding: .utf8) { 340 if let httpBodyData = request.httpBody, let httpBody = String(data: httpBodyData, encoding: .utf8) {
@@ -351,13 +361,25 @@ open class DataRequest: Request { @@ -351,13 +361,25 @@ open class DataRequest: Request {
351 let urlRequest: URLRequest 361 let urlRequest: URLRequest
352 362
353 func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask { 363 func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {
354 - let urlRequest = try self.urlRequest.adapt(using: adapter)  
355 - return queue.syncResult { session.dataTask(with: urlRequest) } 364 + do {
  365 + let urlRequest = try self.urlRequest.adapt(using: adapter)
  366 + return queue.sync { session.dataTask(with: urlRequest) }
  367 + } catch {
  368 + throw AdaptError(error: error)
  369 + }
356 } 370 }
357 } 371 }
358 372
359 // MARK: Properties 373 // MARK: Properties
360 374
  375 + /// The request sent or to be sent to the server.
  376 + open override var request: URLRequest? {
  377 + if let request = super.request { return request }
  378 + if let requestable = originalTask as? Requestable { return requestable.urlRequest }
  379 +
  380 + return nil
  381 + }
  382 +
361 /// The progress of fetching the response data from the server for the request. 383 /// The progress of fetching the response data from the server for the request.
362 open var progress: Progress { return dataDelegate.progress } 384 open var progress: Progress { return dataDelegate.progress }
363 385
@@ -438,22 +460,37 @@ open class DownloadRequest: Request { @@ -438,22 +460,37 @@ open class DownloadRequest: Request {
438 case resumeData(Data) 460 case resumeData(Data)
439 461
440 func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask { 462 func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {
441 - let task: URLSessionTask 463 + do {
  464 + let task: URLSessionTask
  465 +
  466 + switch self {
  467 + case let .request(urlRequest):
  468 + let urlRequest = try urlRequest.adapt(using: adapter)
  469 + task = queue.sync { session.downloadTask(with: urlRequest) }
  470 + case let .resumeData(resumeData):
  471 + task = queue.sync { session.downloadTask(withResumeData: resumeData) }
  472 + }
442 473
443 - switch self {  
444 - case let .request(urlRequest):  
445 - let urlRequest = try urlRequest.adapt(using: adapter)  
446 - task = queue.syncResult { session.downloadTask(with: urlRequest) }  
447 - case let .resumeData(resumeData):  
448 - task = queue.syncResult { session.downloadTask(withResumeData: resumeData) } 474 + return task
  475 + } catch {
  476 + throw AdaptError(error: error)
449 } 477 }
450 -  
451 - return task  
452 } 478 }
453 } 479 }
454 480
455 // MARK: Properties 481 // MARK: Properties
456 482
  483 + /// The request sent or to be sent to the server.
  484 + open override var request: URLRequest? {
  485 + if let request = super.request { return request }
  486 +
  487 + if let downloadable = originalTask as? Downloadable, case let .request(urlRequest) = downloadable {
  488 + return urlRequest
  489 + }
  490 +
  491 + return nil
  492 + }
  493 +
457 /// The resume data of the underlying download task if available after a failure. 494 /// The resume data of the underlying download task if available after a failure.
458 open var resumeData: Data? { return downloadDelegate.resumeData } 495 open var resumeData: Data? { return downloadDelegate.resumeData }
459 496
@@ -471,7 +508,7 @@ open class DownloadRequest: Request { @@ -471,7 +508,7 @@ open class DownloadRequest: Request {
471 NotificationCenter.default.post( 508 NotificationCenter.default.post(
472 name: Notification.Name.Task.DidCancel, 509 name: Notification.Name.Task.DidCancel,
473 object: self, 510 object: self,
474 - userInfo: [Notification.Key.Task: task] 511 + userInfo: [Notification.Key.Task: task as Any]
475 ) 512 )
476 } 513 }
477 514
@@ -528,26 +565,42 @@ open class UploadRequest: DataRequest { @@ -528,26 +565,42 @@ open class UploadRequest: DataRequest {
528 case stream(InputStream, URLRequest) 565 case stream(InputStream, URLRequest)
529 566
530 func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask { 567 func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {
531 - let task: URLSessionTask 568 + do {
  569 + let task: URLSessionTask
  570 +
  571 + switch self {
  572 + case let .data(data, urlRequest):
  573 + let urlRequest = try urlRequest.adapt(using: adapter)
  574 + task = queue.sync { session.uploadTask(with: urlRequest, from: data) }
  575 + case let .file(url, urlRequest):
  576 + let urlRequest = try urlRequest.adapt(using: adapter)
  577 + task = queue.sync { session.uploadTask(with: urlRequest, fromFile: url) }
  578 + case let .stream(_, urlRequest):
  579 + let urlRequest = try urlRequest.adapt(using: adapter)
  580 + task = queue.sync { session.uploadTask(withStreamedRequest: urlRequest) }
  581 + }
532 582
533 - switch self {  
534 - case let .data(data, urlRequest):  
535 - let urlRequest = try urlRequest.adapt(using: adapter)  
536 - task = queue.syncResult { session.uploadTask(with: urlRequest, from: data) }  
537 - case let .file(url, urlRequest):  
538 - let urlRequest = try urlRequest.adapt(using: adapter)  
539 - task = queue.syncResult { session.uploadTask(with: urlRequest, fromFile: url) }  
540 - case let .stream(_, urlRequest):  
541 - let urlRequest = try urlRequest.adapt(using: adapter)  
542 - task = queue.syncResult { session.uploadTask(withStreamedRequest: urlRequest) } 583 + return task
  584 + } catch {
  585 + throw AdaptError(error: error)
543 } 586 }
544 -  
545 - return task  
546 } 587 }
547 } 588 }
548 589
549 // MARK: Properties 590 // MARK: Properties
550 591
  592 + /// The request sent or to be sent to the server.
  593 + open override var request: URLRequest? {
  594 + if let request = super.request { return request }
  595 +
  596 + guard let uploadable = originalTask as? Uploadable else { return nil }
  597 +
  598 + switch uploadable {
  599 + case .data(_, let urlRequest), .file(_, let urlRequest), .stream(_, let urlRequest):
  600 + return urlRequest
  601 + }
  602 + }
  603 +
551 /// The progress of uploading the payload to the server for the upload request. 604 /// The progress of uploading the payload to the server for the upload request.
552 open var uploadProgress: Progress { return uploadDelegate.uploadProgress } 605 open var uploadProgress: Progress { return uploadDelegate.uploadProgress }
553 606
@@ -577,6 +630,7 @@ open class UploadRequest: DataRequest { @@ -577,6 +630,7 @@ open class UploadRequest: DataRequest {
577 #if !os(watchOS) 630 #if !os(watchOS)
578 631
579 /// Specific type of `Request` that manages an underlying `URLSessionStreamTask`. 632 /// Specific type of `Request` that manages an underlying `URLSessionStreamTask`.
  633 +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
580 open class StreamRequest: Request { 634 open class StreamRequest: Request {
581 enum Streamable: TaskConvertible { 635 enum Streamable: TaskConvertible {
582 case stream(hostName: String, port: Int) 636 case stream(hostName: String, port: Int)
@@ -587,9 +641,9 @@ open class StreamRequest: Request { @@ -587,9 +641,9 @@ open class StreamRequest: Request {
587 641
588 switch self { 642 switch self {
589 case let .stream(hostName, port): 643 case let .stream(hostName, port):
590 - task = queue.syncResult { session.streamTask(withHostName: hostName, port: port) } 644 + task = queue.sync { session.streamTask(withHostName: hostName, port: port) }
591 case let .netService(netService): 645 case let .netService(netService):
592 - task = queue.syncResult { session.streamTask(with: netService) } 646 + task = queue.sync { session.streamTask(with: netService) }
593 } 647 }
594 648
595 return task 649 return task
ParentAssistant/Pods/Alamofire/Source/Response.swift
1 // 1 //
2 // Response.swift 2 // Response.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -38,13 +38,33 @@ public struct DefaultDataResponse { @@ -38,13 +38,33 @@ public struct DefaultDataResponse {
38 /// The error encountered while executing or validating the request. 38 /// The error encountered while executing or validating the request.
39 public let error: Error? 39 public let error: Error?
40 40
  41 + /// The timeline of the complete lifecycle of the request.
  42 + public let timeline: Timeline
  43 +
41 var _metrics: AnyObject? 44 var _metrics: AnyObject?
42 45
43 - init(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) { 46 + /// Creates a `DefaultDataResponse` instance from the specified parameters.
  47 + ///
  48 + /// - Parameters:
  49 + /// - request: The URL request sent to the server.
  50 + /// - response: The server's response to the URL request.
  51 + /// - data: The data returned by the server.
  52 + /// - error: The error encountered while executing or validating the request.
  53 + /// - timeline: The timeline of the complete lifecycle of the request. `Timeline()` by default.
  54 + /// - metrics: The task metrics containing the request / response statistics. `nil` by default.
  55 + public init(
  56 + request: URLRequest?,
  57 + response: HTTPURLResponse?,
  58 + data: Data?,
  59 + error: Error?,
  60 + timeline: Timeline = Timeline(),
  61 + metrics: AnyObject? = nil)
  62 + {
44 self.request = request 63 self.request = request
45 self.response = response 64 self.response = response
46 self.data = data 65 self.data = data
47 self.error = error 66 self.error = error
  67 + self.timeline = timeline
48 } 68 }
49 } 69 }
50 70
@@ -64,9 +84,15 @@ public struct DataResponse&lt;Value&gt; { @@ -64,9 +84,15 @@ public struct DataResponse&lt;Value&gt; {
64 /// The result of response serialization. 84 /// The result of response serialization.
65 public let result: Result<Value> 85 public let result: Result<Value>
66 86
67 - /// The timeline of the complete lifecycle of the `Request`. 87 + /// The timeline of the complete lifecycle of the request.
68 public let timeline: Timeline 88 public let timeline: Timeline
69 89
  90 + /// Returns the associated value of the result if it is a success, `nil` otherwise.
  91 + public var value: Value? { return result.value }
  92 +
  93 + /// Returns the associated error value if the result if it is a failure, `nil` otherwise.
  94 + public var error: Error? { return result.error }
  95 +
70 var _metrics: AnyObject? 96 var _metrics: AnyObject?
71 97
72 /// Creates a `DataResponse` instance with the specified parameters derived from response serialization. 98 /// Creates a `DataResponse` instance with the specified parameters derived from response serialization.
@@ -107,7 +133,7 @@ extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible { @@ -107,7 +133,7 @@ extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible {
107 public var debugDescription: String { 133 public var debugDescription: String {
108 var output: [String] = [] 134 var output: [String] = []
109 135
110 - output.append(request != nil ? "[Request]: \(request!)" : "[Request]: nil") 136 + output.append(request != nil ? "[Request]: \(request!.httpMethod ?? "GET") \(request!)" : "[Request]: nil")
111 output.append(response != nil ? "[Response]: \(response!)" : "[Response]: nil") 137 output.append(response != nil ? "[Response]: \(response!)" : "[Response]: nil")
112 output.append("[Data]: \(data?.count ?? 0) bytes") 138 output.append("[Data]: \(data?.count ?? 0) bytes")
113 output.append("[Result]: \(result.debugDescription)") 139 output.append("[Result]: \(result.debugDescription)")
@@ -119,6 +145,113 @@ extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible { @@ -119,6 +145,113 @@ extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible {
119 145
120 // MARK: - 146 // MARK: -
121 147
  148 +extension DataResponse {
  149 + /// Evaluates the specified closure when the result of this `DataResponse` is a success, passing the unwrapped
  150 + /// result value as a parameter.
  151 + ///
  152 + /// Use the `map` method with a closure that does not throw. For example:
  153 + ///
  154 + /// let possibleData: DataResponse<Data> = ...
  155 + /// let possibleInt = possibleData.map { $0.count }
  156 + ///
  157 + /// - parameter transform: A closure that takes the success value of the instance's result.
  158 + ///
  159 + /// - returns: A `DataResponse` whose result wraps the value returned by the given closure. If this instance's
  160 + /// result is a failure, returns a response wrapping the same failure.
  161 + public func map<T>(_ transform: (Value) -> T) -> DataResponse<T> {
  162 + var response = DataResponse<T>(
  163 + request: request,
  164 + response: self.response,
  165 + data: data,
  166 + result: result.map(transform),
  167 + timeline: timeline
  168 + )
  169 +
  170 + response._metrics = _metrics
  171 +
  172 + return response
  173 + }
  174 +
  175 + /// Evaluates the given closure when the result of this `DataResponse` is a success, passing the unwrapped result
  176 + /// value as a parameter.
  177 + ///
  178 + /// Use the `flatMap` method with a closure that may throw an error. For example:
  179 + ///
  180 + /// let possibleData: DataResponse<Data> = ...
  181 + /// let possibleObject = possibleData.flatMap {
  182 + /// try JSONSerialization.jsonObject(with: $0)
  183 + /// }
  184 + ///
  185 + /// - parameter transform: A closure that takes the success value of the instance's result.
  186 + ///
  187 + /// - returns: A success or failure `DataResponse` depending on the result of the given closure. If this instance's
  188 + /// result is a failure, returns the same failure.
  189 + public func flatMap<T>(_ transform: (Value) throws -> T) -> DataResponse<T> {
  190 + var response = DataResponse<T>(
  191 + request: request,
  192 + response: self.response,
  193 + data: data,
  194 + result: result.flatMap(transform),
  195 + timeline: timeline
  196 + )
  197 +
  198 + response._metrics = _metrics
  199 +
  200 + return response
  201 + }
  202 +
  203 + /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter.
  204 + ///
  205 + /// Use the `mapError` function with a closure that does not throw. For example:
  206 + ///
  207 + /// let possibleData: DataResponse<Data> = ...
  208 + /// let withMyError = possibleData.mapError { MyError.error($0) }
  209 + ///
  210 + /// - Parameter transform: A closure that takes the error of the instance.
  211 + /// - Returns: A `DataResponse` instance containing the result of the transform.
  212 + public func mapError<E: Error>(_ transform: (Error) -> E) -> DataResponse {
  213 + var response = DataResponse(
  214 + request: request,
  215 + response: self.response,
  216 + data: data,
  217 + result: result.mapError(transform),
  218 + timeline: timeline
  219 + )
  220 +
  221 + response._metrics = _metrics
  222 +
  223 + return response
  224 + }
  225 +
  226 + /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter.
  227 + ///
  228 + /// Use the `flatMapError` function with a closure that may throw an error. For example:
  229 + ///
  230 + /// let possibleData: DataResponse<Data> = ...
  231 + /// let possibleObject = possibleData.flatMapError {
  232 + /// try someFailableFunction(taking: $0)
  233 + /// }
  234 + ///
  235 + /// - Parameter transform: A throwing closure that takes the error of the instance.
  236 + ///
  237 + /// - Returns: A `DataResponse` instance containing the result of the transform.
  238 + public func flatMapError<E: Error>(_ transform: (Error) throws -> E) -> DataResponse {
  239 + var response = DataResponse(
  240 + request: request,
  241 + response: self.response,
  242 + data: data,
  243 + result: result.flatMapError(transform),
  244 + timeline: timeline
  245 + )
  246 +
  247 + response._metrics = _metrics
  248 +
  249 + return response
  250 + }
  251 +}
  252 +
  253 +// MARK: -
  254 +
122 /// Used to store all data associated with an non-serialized response of a download request. 255 /// Used to store all data associated with an non-serialized response of a download request.
123 public struct DefaultDownloadResponse { 256 public struct DefaultDownloadResponse {
124 /// The URL request sent to the server. 257 /// The URL request sent to the server.
@@ -139,15 +272,31 @@ public struct DefaultDownloadResponse { @@ -139,15 +272,31 @@ public struct DefaultDownloadResponse {
139 /// The error encountered while executing or validating the request. 272 /// The error encountered while executing or validating the request.
140 public let error: Error? 273 public let error: Error?
141 274
  275 + /// The timeline of the complete lifecycle of the request.
  276 + public let timeline: Timeline
  277 +
142 var _metrics: AnyObject? 278 var _metrics: AnyObject?
143 279
144 - init( 280 + /// Creates a `DefaultDownloadResponse` instance from the specified parameters.
  281 + ///
  282 + /// - Parameters:
  283 + /// - request: The URL request sent to the server.
  284 + /// - response: The server's response to the URL request.
  285 + /// - temporaryURL: The temporary destination URL of the data returned from the server.
  286 + /// - destinationURL: The final destination URL of the data returned from the server if it was moved.
  287 + /// - resumeData: The resume data generated if the request was cancelled.
  288 + /// - error: The error encountered while executing or validating the request.
  289 + /// - timeline: The timeline of the complete lifecycle of the request. `Timeline()` by default.
  290 + /// - metrics: The task metrics containing the request / response statistics. `nil` by default.
  291 + public init(
145 request: URLRequest?, 292 request: URLRequest?,
146 response: HTTPURLResponse?, 293 response: HTTPURLResponse?,
147 temporaryURL: URL?, 294 temporaryURL: URL?,
148 destinationURL: URL?, 295 destinationURL: URL?,
149 resumeData: Data?, 296 resumeData: Data?,
150 - error: Error?) 297 + error: Error?,
  298 + timeline: Timeline = Timeline(),
  299 + metrics: AnyObject? = nil)
151 { 300 {
152 self.request = request 301 self.request = request
153 self.response = response 302 self.response = response
@@ -155,6 +304,7 @@ public struct DefaultDownloadResponse { @@ -155,6 +304,7 @@ public struct DefaultDownloadResponse {
155 self.destinationURL = destinationURL 304 self.destinationURL = destinationURL
156 self.resumeData = resumeData 305 self.resumeData = resumeData
157 self.error = error 306 self.error = error
  307 + self.timeline = timeline
158 } 308 }
159 } 309 }
160 310
@@ -183,6 +333,12 @@ public struct DownloadResponse&lt;Value&gt; { @@ -183,6 +333,12 @@ public struct DownloadResponse&lt;Value&gt; {
183 /// The timeline of the complete lifecycle of the request. 333 /// The timeline of the complete lifecycle of the request.
184 public let timeline: Timeline 334 public let timeline: Timeline
185 335
  336 + /// Returns the associated value of the result if it is a success, `nil` otherwise.
  337 + public var value: Value? { return result.value }
  338 +
  339 + /// Returns the associated error value if the result if it is a failure, `nil` otherwise.
  340 + public var error: Error? { return result.error }
  341 +
186 var _metrics: AnyObject? 342 var _metrics: AnyObject?
187 343
188 /// Creates a `DownloadResponse` instance with the specified parameters derived from response serialization. 344 /// Creates a `DownloadResponse` instance with the specified parameters derived from response serialization.
@@ -230,7 +386,7 @@ extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertibl @@ -230,7 +386,7 @@ extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertibl
230 public var debugDescription: String { 386 public var debugDescription: String {
231 var output: [String] = [] 387 var output: [String] = []
232 388
233 - output.append(request != nil ? "[Request]: \(request!)" : "[Request]: nil") 389 + output.append(request != nil ? "[Request]: \(request!.httpMethod ?? "GET") \(request!)" : "[Request]: nil")
234 output.append(response != nil ? "[Response]: \(response!)" : "[Response]: nil") 390 output.append(response != nil ? "[Response]: \(response!)" : "[Response]: nil")
235 output.append("[TemporaryURL]: \(temporaryURL?.path ?? "nil")") 391 output.append("[TemporaryURL]: \(temporaryURL?.path ?? "nil")")
236 output.append("[DestinationURL]: \(destinationURL?.path ?? "nil")") 392 output.append("[DestinationURL]: \(destinationURL?.path ?? "nil")")
@@ -244,6 +400,121 @@ extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertibl @@ -244,6 +400,121 @@ extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertibl
244 400
245 // MARK: - 401 // MARK: -
246 402
  403 +extension DownloadResponse {
  404 + /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped
  405 + /// result value as a parameter.
  406 + ///
  407 + /// Use the `map` method with a closure that does not throw. For example:
  408 + ///
  409 + /// let possibleData: DownloadResponse<Data> = ...
  410 + /// let possibleInt = possibleData.map { $0.count }
  411 + ///
  412 + /// - parameter transform: A closure that takes the success value of the instance's result.
  413 + ///
  414 + /// - returns: A `DownloadResponse` whose result wraps the value returned by the given closure. If this instance's
  415 + /// result is a failure, returns a response wrapping the same failure.
  416 + public func map<T>(_ transform: (Value) -> T) -> DownloadResponse<T> {
  417 + var response = DownloadResponse<T>(
  418 + request: request,
  419 + response: self.response,
  420 + temporaryURL: temporaryURL,
  421 + destinationURL: destinationURL,
  422 + resumeData: resumeData,
  423 + result: result.map(transform),
  424 + timeline: timeline
  425 + )
  426 +
  427 + response._metrics = _metrics
  428 +
  429 + return response
  430 + }
  431 +
  432 + /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped
  433 + /// result value as a parameter.
  434 + ///
  435 + /// Use the `flatMap` method with a closure that may throw an error. For example:
  436 + ///
  437 + /// let possibleData: DownloadResponse<Data> = ...
  438 + /// let possibleObject = possibleData.flatMap {
  439 + /// try JSONSerialization.jsonObject(with: $0)
  440 + /// }
  441 + ///
  442 + /// - parameter transform: A closure that takes the success value of the instance's result.
  443 + ///
  444 + /// - returns: A success or failure `DownloadResponse` depending on the result of the given closure. If this
  445 + /// instance's result is a failure, returns the same failure.
  446 + public func flatMap<T>(_ transform: (Value) throws -> T) -> DownloadResponse<T> {
  447 + var response = DownloadResponse<T>(
  448 + request: request,
  449 + response: self.response,
  450 + temporaryURL: temporaryURL,
  451 + destinationURL: destinationURL,
  452 + resumeData: resumeData,
  453 + result: result.flatMap(transform),
  454 + timeline: timeline
  455 + )
  456 +
  457 + response._metrics = _metrics
  458 +
  459 + return response
  460 + }
  461 +
  462 + /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter.
  463 + ///
  464 + /// Use the `mapError` function with a closure that does not throw. For example:
  465 + ///
  466 + /// let possibleData: DownloadResponse<Data> = ...
  467 + /// let withMyError = possibleData.mapError { MyError.error($0) }
  468 + ///
  469 + /// - Parameter transform: A closure that takes the error of the instance.
  470 + /// - Returns: A `DownloadResponse` instance containing the result of the transform.
  471 + public func mapError<E: Error>(_ transform: (Error) -> E) -> DownloadResponse {
  472 + var response = DownloadResponse(
  473 + request: request,
  474 + response: self.response,
  475 + temporaryURL: temporaryURL,
  476 + destinationURL: destinationURL,
  477 + resumeData: resumeData,
  478 + result: result.mapError(transform),
  479 + timeline: timeline
  480 + )
  481 +
  482 + response._metrics = _metrics
  483 +
  484 + return response
  485 + }
  486 +
  487 + /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter.
  488 + ///
  489 + /// Use the `flatMapError` function with a closure that may throw an error. For example:
  490 + ///
  491 + /// let possibleData: DownloadResponse<Data> = ...
  492 + /// let possibleObject = possibleData.flatMapError {
  493 + /// try someFailableFunction(taking: $0)
  494 + /// }
  495 + ///
  496 + /// - Parameter transform: A throwing closure that takes the error of the instance.
  497 + ///
  498 + /// - Returns: A `DownloadResponse` instance containing the result of the transform.
  499 + public func flatMapError<E: Error>(_ transform: (Error) throws -> E) -> DownloadResponse {
  500 + var response = DownloadResponse(
  501 + request: request,
  502 + response: self.response,
  503 + temporaryURL: temporaryURL,
  504 + destinationURL: destinationURL,
  505 + resumeData: resumeData,
  506 + result: result.flatMapError(transform),
  507 + timeline: timeline
  508 + )
  509 +
  510 + response._metrics = _metrics
  511 +
  512 + return response
  513 + }
  514 +}
  515 +
  516 +// MARK: -
  517 +
247 protocol Response { 518 protocol Response {
248 /// The task metrics containing the request / response statistics. 519 /// The task metrics containing the request / response statistics.
249 var _metrics: AnyObject? { get set } 520 var _metrics: AnyObject? { get set }
ParentAssistant/Pods/Alamofire/Source/ResponseSerialization.swift
1 // 1 //
2 // ResponseSerialization.swift 2 // ResponseSerialization.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -84,6 +84,23 @@ public struct DownloadResponseSerializer&lt;Value&gt;: DownloadResponseSerializerProto @@ -84,6 +84,23 @@ public struct DownloadResponseSerializer&lt;Value&gt;: DownloadResponseSerializerProto
84 } 84 }
85 } 85 }
86 86
  87 +// MARK: - Timeline
  88 +
  89 +extension Request {
  90 + var timeline: Timeline {
  91 + let requestStartTime = self.startTime ?? CFAbsoluteTimeGetCurrent()
  92 + let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent()
  93 + let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime
  94 +
  95 + return Timeline(
  96 + requestStartTime: requestStartTime,
  97 + initialResponseTime: initialResponseTime,
  98 + requestCompletedTime: requestCompletedTime,
  99 + serializationCompletedTime: CFAbsoluteTimeGetCurrent()
  100 + )
  101 + }
  102 +}
  103 +
87 // MARK: - Default 104 // MARK: - Default
88 105
89 extension DataRequest { 106 extension DataRequest {
@@ -101,7 +118,8 @@ extension DataRequest { @@ -101,7 +118,8 @@ extension DataRequest {
101 request: self.request, 118 request: self.request,
102 response: self.response, 119 response: self.response,
103 data: self.delegate.data, 120 data: self.delegate.data,
104 - error: self.delegate.error 121 + error: self.delegate.error,
  122 + timeline: self.timeline
105 ) 123 )
106 124
107 dataResponse.add(self.delegate.metrics) 125 dataResponse.add(self.delegate.metrics)
@@ -136,22 +154,12 @@ extension DataRequest { @@ -136,22 +154,12 @@ extension DataRequest {
136 self.delegate.error 154 self.delegate.error
137 ) 155 )
138 156
139 - let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent()  
140 - let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime  
141 -  
142 - let timeline = Timeline(  
143 - requestStartTime: self.startTime ?? CFAbsoluteTimeGetCurrent(),  
144 - initialResponseTime: initialResponseTime,  
145 - requestCompletedTime: requestCompletedTime,  
146 - serializationCompletedTime: CFAbsoluteTimeGetCurrent()  
147 - )  
148 -  
149 var dataResponse = DataResponse<T.SerializedObject>( 157 var dataResponse = DataResponse<T.SerializedObject>(
150 request: self.request, 158 request: self.request,
151 response: self.response, 159 response: self.response,
152 data: self.delegate.data, 160 data: self.delegate.data,
153 result: result, 161 result: result,
154 - timeline: timeline 162 + timeline: self.timeline
155 ) 163 )
156 164
157 dataResponse.add(self.delegate.metrics) 165 dataResponse.add(self.delegate.metrics)
@@ -184,7 +192,8 @@ extension DownloadRequest { @@ -184,7 +192,8 @@ extension DownloadRequest {
184 temporaryURL: self.downloadDelegate.temporaryURL, 192 temporaryURL: self.downloadDelegate.temporaryURL,
185 destinationURL: self.downloadDelegate.destinationURL, 193 destinationURL: self.downloadDelegate.destinationURL,
186 resumeData: self.downloadDelegate.resumeData, 194 resumeData: self.downloadDelegate.resumeData,
187 - error: self.downloadDelegate.error 195 + error: self.downloadDelegate.error,
  196 + timeline: self.timeline
188 ) 197 )
189 198
190 downloadResponse.add(self.delegate.metrics) 199 downloadResponse.add(self.delegate.metrics)
@@ -219,16 +228,6 @@ extension DownloadRequest { @@ -219,16 +228,6 @@ extension DownloadRequest {
219 self.downloadDelegate.error 228 self.downloadDelegate.error
220 ) 229 )
221 230
222 - let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent()  
223 - let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime  
224 -  
225 - let timeline = Timeline(  
226 - requestStartTime: self.startTime ?? CFAbsoluteTimeGetCurrent(),  
227 - initialResponseTime: initialResponseTime,  
228 - requestCompletedTime: requestCompletedTime,  
229 - serializationCompletedTime: CFAbsoluteTimeGetCurrent()  
230 - )  
231 -  
232 var downloadResponse = DownloadResponse<T.SerializedObject>( 231 var downloadResponse = DownloadResponse<T.SerializedObject>(
233 request: self.request, 232 request: self.request,
234 response: self.response, 233 response: self.response,
@@ -236,7 +235,7 @@ extension DownloadRequest { @@ -236,7 +235,7 @@ extension DownloadRequest {
236 destinationURL: self.downloadDelegate.destinationURL, 235 destinationURL: self.downloadDelegate.destinationURL,
237 resumeData: self.downloadDelegate.resumeData, 236 resumeData: self.downloadDelegate.resumeData,
238 result: result, 237 result: result,
239 - timeline: timeline 238 + timeline: self.timeline
240 ) 239 )
241 240
242 downloadResponse.add(self.delegate.metrics) 241 downloadResponse.add(self.delegate.metrics)
@@ -369,13 +368,13 @@ extension Request { @@ -369,13 +368,13 @@ extension Request {
369 368
370 var convertedEncoding = encoding 369 var convertedEncoding = encoding
371 370
372 - if let encodingName = response?.textEncodingName as CFString!, convertedEncoding == nil { 371 + if let encodingName = response?.textEncodingName as CFString?, convertedEncoding == nil {
373 convertedEncoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding( 372 convertedEncoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(
374 CFStringConvertIANACharSetNameToEncoding(encodingName)) 373 CFStringConvertIANACharSetNameToEncoding(encodingName))
375 ) 374 )
376 } 375 }
377 376
378 - let actualEncoding = convertedEncoding ?? String.Encoding.isoLatin1 377 + let actualEncoding = convertedEncoding ?? .isoLatin1
379 378
380 if let string = String(data: validData, encoding: actualEncoding) { 379 if let string = String(data: validData, encoding: actualEncoding) {
381 return .success(string) 380 return .success(string)
ParentAssistant/Pods/Alamofire/Source/Result.swift
1 // 1 //
2 // Result.swift 2 // Result.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -100,3 +100,201 @@ extension Result: CustomDebugStringConvertible { @@ -100,3 +100,201 @@ extension Result: CustomDebugStringConvertible {
100 } 100 }
101 } 101 }
102 } 102 }
  103 +
  104 +// MARK: - Functional APIs
  105 +
  106 +extension Result {
  107 + /// Creates a `Result` instance from the result of a closure.
  108 + ///
  109 + /// A failure result is created when the closure throws, and a success result is created when the closure
  110 + /// succeeds without throwing an error.
  111 + ///
  112 + /// func someString() throws -> String { ... }
  113 + ///
  114 + /// let result = Result(value: {
  115 + /// return try someString()
  116 + /// })
  117 + ///
  118 + /// // The type of result is Result<String>
  119 + ///
  120 + /// The trailing closure syntax is also supported:
  121 + ///
  122 + /// let result = Result { try someString() }
  123 + ///
  124 + /// - parameter value: The closure to execute and create the result for.
  125 + public init(value: () throws -> Value) {
  126 + do {
  127 + self = try .success(value())
  128 + } catch {
  129 + self = .failure(error)
  130 + }
  131 + }
  132 +
  133 + /// Returns the success value, or throws the failure error.
  134 + ///
  135 + /// let possibleString: Result<String> = .success("success")
  136 + /// try print(possibleString.unwrap())
  137 + /// // Prints "success"
  138 + ///
  139 + /// let noString: Result<String> = .failure(error)
  140 + /// try print(noString.unwrap())
  141 + /// // Throws error
  142 + public func unwrap() throws -> Value {
  143 + switch self {
  144 + case .success(let value):
  145 + return value
  146 + case .failure(let error):
  147 + throw error
  148 + }
  149 + }
  150 +
  151 + /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter.
  152 + ///
  153 + /// Use the `map` method with a closure that does not throw. For example:
  154 + ///
  155 + /// let possibleData: Result<Data> = .success(Data())
  156 + /// let possibleInt = possibleData.map { $0.count }
  157 + /// try print(possibleInt.unwrap())
  158 + /// // Prints "0"
  159 + ///
  160 + /// let noData: Result<Data> = .failure(error)
  161 + /// let noInt = noData.map { $0.count }
  162 + /// try print(noInt.unwrap())
  163 + /// // Throws error
  164 + ///
  165 + /// - parameter transform: A closure that takes the success value of the `Result` instance.
  166 + ///
  167 + /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the
  168 + /// same failure.
  169 + public func map<T>(_ transform: (Value) -> T) -> Result<T> {
  170 + switch self {
  171 + case .success(let value):
  172 + return .success(transform(value))
  173 + case .failure(let error):
  174 + return .failure(error)
  175 + }
  176 + }
  177 +
  178 + /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter.
  179 + ///
  180 + /// Use the `flatMap` method with a closure that may throw an error. For example:
  181 + ///
  182 + /// let possibleData: Result<Data> = .success(Data(...))
  183 + /// let possibleObject = possibleData.flatMap {
  184 + /// try JSONSerialization.jsonObject(with: $0)
  185 + /// }
  186 + ///
  187 + /// - parameter transform: A closure that takes the success value of the instance.
  188 + ///
  189 + /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the
  190 + /// same failure.
  191 + public func flatMap<T>(_ transform: (Value) throws -> T) -> Result<T> {
  192 + switch self {
  193 + case .success(let value):
  194 + do {
  195 + return try .success(transform(value))
  196 + } catch {
  197 + return .failure(error)
  198 + }
  199 + case .failure(let error):
  200 + return .failure(error)
  201 + }
  202 + }
  203 +
  204 + /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.
  205 + ///
  206 + /// Use the `mapError` function with a closure that does not throw. For example:
  207 + ///
  208 + /// let possibleData: Result<Data> = .failure(someError)
  209 + /// let withMyError: Result<Data> = possibleData.mapError { MyError.error($0) }
  210 + ///
  211 + /// - Parameter transform: A closure that takes the error of the instance.
  212 + /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns
  213 + /// the same instance.
  214 + public func mapError<T: Error>(_ transform: (Error) -> T) -> Result {
  215 + switch self {
  216 + case .failure(let error):
  217 + return .failure(transform(error))
  218 + case .success:
  219 + return self
  220 + }
  221 + }
  222 +
  223 + /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.
  224 + ///
  225 + /// Use the `flatMapError` function with a closure that may throw an error. For example:
  226 + ///
  227 + /// let possibleData: Result<Data> = .success(Data(...))
  228 + /// let possibleObject = possibleData.flatMapError {
  229 + /// try someFailableFunction(taking: $0)
  230 + /// }
  231 + ///
  232 + /// - Parameter transform: A throwing closure that takes the error of the instance.
  233 + ///
  234 + /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns
  235 + /// the same instance.
  236 + public func flatMapError<T: Error>(_ transform: (Error) throws -> T) -> Result {
  237 + switch self {
  238 + case .failure(let error):
  239 + do {
  240 + return try .failure(transform(error))
  241 + } catch {
  242 + return .failure(error)
  243 + }
  244 + case .success:
  245 + return self
  246 + }
  247 + }
  248 +
  249 + /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter.
  250 + ///
  251 + /// Use the `withValue` function to evaluate the passed closure without modifying the `Result` instance.
  252 + ///
  253 + /// - Parameter closure: A closure that takes the success value of this instance.
  254 + /// - Returns: This `Result` instance, unmodified.
  255 + @discardableResult
  256 + public func withValue(_ closure: (Value) -> Void) -> Result {
  257 + if case let .success(value) = self { closure(value) }
  258 +
  259 + return self
  260 + }
  261 +
  262 + /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.
  263 + ///
  264 + /// Use the `withError` function to evaluate the passed closure without modifying the `Result` instance.
  265 + ///
  266 + /// - Parameter closure: A closure that takes the success value of this instance.
  267 + /// - Returns: This `Result` instance, unmodified.
  268 + @discardableResult
  269 + public func withError(_ closure: (Error) -> Void) -> Result {
  270 + if case let .failure(error) = self { closure(error) }
  271 +
  272 + return self
  273 + }
  274 +
  275 + /// Evaluates the specified closure when the `Result` is a success.
  276 + ///
  277 + /// Use the `ifSuccess` function to evaluate the passed closure without modifying the `Result` instance.
  278 + ///
  279 + /// - Parameter closure: A `Void` closure.
  280 + /// - Returns: This `Result` instance, unmodified.
  281 + @discardableResult
  282 + public func ifSuccess(_ closure: () -> Void) -> Result {
  283 + if isSuccess { closure() }
  284 +
  285 + return self
  286 + }
  287 +
  288 + /// Evaluates the specified closure when the `Result` is a failure.
  289 + ///
  290 + /// Use the `ifFailure` function to evaluate the passed closure without modifying the `Result` instance.
  291 + ///
  292 + /// - Parameter closure: A `Void` closure.
  293 + /// - Returns: This `Result` instance, unmodified.
  294 + @discardableResult
  295 + public func ifFailure(_ closure: () -> Void) -> Result {
  296 + if isFailure { closure() }
  297 +
  298 + return self
  299 + }
  300 +}
ParentAssistant/Pods/Alamofire/Source/ServerTrustPolicy.swift
1 // 1 //
2 // ServerTrustPolicy.swift 2 // ServerTrustPolicy.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -88,6 +88,13 @@ extension URLSession { @@ -88,6 +88,13 @@ extension URLSession {
88 /// validate the host in production environments to guarantee the validity of the server's 88 /// validate the host in production environments to guarantee the validity of the server's
89 /// certificate chain. 89 /// certificate chain.
90 /// 90 ///
  91 +/// - performRevokedEvaluation: Uses the default and revoked server trust evaluations allowing you to control whether to
  92 +/// validate the host provided by the challenge as well as specify the revocation flags for
  93 +/// testing for revoked certificates. Apple platforms did not start testing for revoked
  94 +/// certificates automatically until iOS 10.1, macOS 10.12 and tvOS 10.1 which is
  95 +/// demonstrated in our TLS tests. Applications are encouraged to always validate the host
  96 +/// in production environments to guarantee the validity of the server's certificate chain.
  97 +///
91 /// - pinCertificates: Uses the pinned certificates to validate the server trust. The server trust is 98 /// - pinCertificates: Uses the pinned certificates to validate the server trust. The server trust is
92 /// considered valid if one of the pinned certificates match one of the server certificates. 99 /// considered valid if one of the pinned certificates match one of the server certificates.
93 /// By validating both the certificate chain and host, certificate pinning provides a very 100 /// By validating both the certificate chain and host, certificate pinning provides a very
@@ -107,6 +114,7 @@ extension URLSession { @@ -107,6 +114,7 @@ extension URLSession {
107 /// - customEvaluation: Uses the associated closure to evaluate the validity of the server trust. 114 /// - customEvaluation: Uses the associated closure to evaluate the validity of the server trust.
108 public enum ServerTrustPolicy { 115 public enum ServerTrustPolicy {
109 case performDefaultEvaluation(validateHost: Bool) 116 case performDefaultEvaluation(validateHost: Bool)
  117 + case performRevokedEvaluation(validateHost: Bool, revocationFlags: CFOptionFlags)
110 case pinCertificates(certificates: [SecCertificate], validateCertificateChain: Bool, validateHost: Bool) 118 case pinCertificates(certificates: [SecCertificate], validateCertificateChain: Bool, validateHost: Bool)
111 case pinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool) 119 case pinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool)
112 case disableEvaluation 120 case disableEvaluation
@@ -172,6 +180,12 @@ public enum ServerTrustPolicy { @@ -172,6 +180,12 @@ public enum ServerTrustPolicy {
172 SecTrustSetPolicies(serverTrust, policy) 180 SecTrustSetPolicies(serverTrust, policy)
173 181
174 serverTrustIsValid = trustIsValid(serverTrust) 182 serverTrustIsValid = trustIsValid(serverTrust)
  183 + case let .performRevokedEvaluation(validateHost, revocationFlags):
  184 + let defaultPolicy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil)
  185 + let revokedPolicy = SecPolicyCreateRevocation(revocationFlags)
  186 + SecTrustSetPolicies(serverTrust, [defaultPolicy, revokedPolicy] as CFTypeRef)
  187 +
  188 + serverTrustIsValid = trustIsValid(serverTrust)
175 case let .pinCertificates(pinnedCertificates, validateCertificateChain, validateHost): 189 case let .pinCertificates(pinnedCertificates, validateCertificateChain, validateHost):
176 if validateCertificateChain { 190 if validateCertificateChain {
177 let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil) 191 let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil)
ParentAssistant/Pods/Alamofire/Source/SessionDelegate.swift
1 // 1 //
2 // SessionDelegate.swift 2 // SessionDelegate.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -36,7 +36,7 @@ open class SessionDelegate: NSObject { @@ -36,7 +36,7 @@ open class SessionDelegate: NSObject {
36 open var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))? 36 open var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))?
37 37
38 /// Overrides all behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)` and requires the caller to call the `completionHandler`. 38 /// Overrides all behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)` and requires the caller to call the `completionHandler`.
39 - open var sessionDidReceiveChallengeWithCompletion: ((URLSession, URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)? 39 + open var sessionDidReceiveChallengeWithCompletion: ((URLSession, URLAuthenticationChallenge, @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)?
40 40
41 /// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`. 41 /// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`.
42 open var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)? 42 open var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)?
@@ -48,21 +48,21 @@ open class SessionDelegate: NSObject { @@ -48,21 +48,21 @@ open class SessionDelegate: NSObject {
48 48
49 /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` and 49 /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` and
50 /// requires the caller to call the `completionHandler`. 50 /// requires the caller to call the `completionHandler`.
51 - open var taskWillPerformHTTPRedirectionWithCompletion: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest, (URLRequest?) -> Void) -> Void)? 51 + open var taskWillPerformHTTPRedirectionWithCompletion: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest, @escaping (URLRequest?) -> Void) -> Void)?
52 52
53 /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)`. 53 /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)`.
54 open var taskDidReceiveChallenge: ((URLSession, URLSessionTask, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))? 54 open var taskDidReceiveChallenge: ((URLSession, URLSessionTask, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))?
55 55
56 /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)` and 56 /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)` and
57 /// requires the caller to call the `completionHandler`. 57 /// requires the caller to call the `completionHandler`.
58 - open var taskDidReceiveChallengeWithCompletion: ((URLSession, URLSessionTask, URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)? 58 + open var taskDidReceiveChallengeWithCompletion: ((URLSession, URLSessionTask, URLAuthenticationChallenge, @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)?
59 59
60 /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)`. 60 /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)`.
61 open var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> InputStream?)? 61 open var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> InputStream?)?
62 62
63 /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)` and 63 /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)` and
64 /// requires the caller to call the `completionHandler`. 64 /// requires the caller to call the `completionHandler`.
65 - open var taskNeedNewBodyStreamWithCompletion: ((URLSession, URLSessionTask, (InputStream?) -> Void) -> Void)? 65 + open var taskNeedNewBodyStreamWithCompletion: ((URLSession, URLSessionTask, @escaping (InputStream?) -> Void) -> Void)?
66 66
67 /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)`. 67 /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)`.
68 open var taskDidSendBodyData: ((URLSession, URLSessionTask, Int64, Int64, Int64) -> Void)? 68 open var taskDidSendBodyData: ((URLSession, URLSessionTask, Int64, Int64, Int64) -> Void)?
@@ -77,7 +77,7 @@ open class SessionDelegate: NSObject { @@ -77,7 +77,7 @@ open class SessionDelegate: NSObject {
77 77
78 /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didReceive:completionHandler:)` and 78 /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didReceive:completionHandler:)` and
79 /// requires caller to call the `completionHandler`. 79 /// requires caller to call the `completionHandler`.
80 - open var dataTaskDidReceiveResponseWithCompletion: ((URLSession, URLSessionDataTask, URLResponse, (URLSession.ResponseDisposition) -> Void) -> Void)? 80 + open var dataTaskDidReceiveResponseWithCompletion: ((URLSession, URLSessionDataTask, URLResponse, @escaping (URLSession.ResponseDisposition) -> Void) -> Void)?
81 81
82 /// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didBecome:)`. 82 /// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didBecome:)`.
83 open var dataTaskDidBecomeDownloadTask: ((URLSession, URLSessionDataTask, URLSessionDownloadTask) -> Void)? 83 open var dataTaskDidBecomeDownloadTask: ((URLSession, URLSessionDataTask, URLSessionDownloadTask) -> Void)?
@@ -90,7 +90,7 @@ open class SessionDelegate: NSObject { @@ -90,7 +90,7 @@ open class SessionDelegate: NSObject {
90 90
91 /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)` and 91 /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)` and
92 /// requires caller to call the `completionHandler`. 92 /// requires caller to call the `completionHandler`.
93 - open var dataTaskWillCacheResponseWithCompletion: ((URLSession, URLSessionDataTask, CachedURLResponse, (CachedURLResponse?) -> Void) -> Void)? 93 + open var dataTaskWillCacheResponseWithCompletion: ((URLSession, URLSessionDataTask, CachedURLResponse, @escaping (CachedURLResponse?) -> Void) -> Void)?
94 94
95 // MARK: URLSessionDownloadDelegate Overrides 95 // MARK: URLSessionDownloadDelegate Overrides
96 96
@@ -108,16 +108,53 @@ open class SessionDelegate: NSObject { @@ -108,16 +108,53 @@ open class SessionDelegate: NSObject {
108 #if !os(watchOS) 108 #if !os(watchOS)
109 109
110 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:readClosedFor:)`. 110 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:readClosedFor:)`.
111 - open var streamTaskReadClosed: ((URLSession, URLSessionStreamTask) -> Void)? 111 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
  112 + open var streamTaskReadClosed: ((URLSession, URLSessionStreamTask) -> Void)? {
  113 + get {
  114 + return _streamTaskReadClosed as? (URLSession, URLSessionStreamTask) -> Void
  115 + }
  116 + set {
  117 + _streamTaskReadClosed = newValue
  118 + }
  119 + }
112 120
113 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:writeClosedFor:)`. 121 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:writeClosedFor:)`.
114 - open var streamTaskWriteClosed: ((URLSession, URLSessionStreamTask) -> Void)? 122 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
  123 + open var streamTaskWriteClosed: ((URLSession, URLSessionStreamTask) -> Void)? {
  124 + get {
  125 + return _streamTaskWriteClosed as? (URLSession, URLSessionStreamTask) -> Void
  126 + }
  127 + set {
  128 + _streamTaskWriteClosed = newValue
  129 + }
  130 + }
115 131
116 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:betterRouteDiscoveredFor:)`. 132 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:betterRouteDiscoveredFor:)`.
117 - open var streamTaskBetterRouteDiscovered: ((URLSession, URLSessionStreamTask) -> Void)? 133 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
  134 + open var streamTaskBetterRouteDiscovered: ((URLSession, URLSessionStreamTask) -> Void)? {
  135 + get {
  136 + return _streamTaskBetterRouteDiscovered as? (URLSession, URLSessionStreamTask) -> Void
  137 + }
  138 + set {
  139 + _streamTaskBetterRouteDiscovered = newValue
  140 + }
  141 + }
118 142
119 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:streamTask:didBecome:outputStream:)`. 143 /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:streamTask:didBecome:outputStream:)`.
120 - open var streamTaskDidBecomeInputAndOutputStreams: ((URLSession, URLSessionStreamTask, InputStream, OutputStream) -> Void)? 144 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
  145 + open var streamTaskDidBecomeInputAndOutputStreams: ((URLSession, URLSessionStreamTask, InputStream, OutputStream) -> Void)? {
  146 + get {
  147 + return _streamTaskDidBecomeInputStream as? (URLSession, URLSessionStreamTask, InputStream, OutputStream) -> Void
  148 + }
  149 + set {
  150 + _streamTaskDidBecomeInputStream = newValue
  151 + }
  152 + }
  153 +
  154 + var _streamTaskReadClosed: Any?
  155 + var _streamTaskWriteClosed: Any?
  156 + var _streamTaskBetterRouteDiscovered: Any?
  157 + var _streamTaskDidBecomeInputStream: Any?
121 158
122 #endif 159 #endif
123 160
@@ -126,7 +163,7 @@ open class SessionDelegate: NSObject { @@ -126,7 +163,7 @@ open class SessionDelegate: NSObject {
126 var retrier: RequestRetrier? 163 var retrier: RequestRetrier?
127 weak var sessionManager: SessionManager? 164 weak var sessionManager: SessionManager?
128 165
129 - private var requests: [Int: Request] = [:] 166 + var requests: [Int: Request] = [:]
130 private let lock = NSLock() 167 private let lock = NSLock()
131 168
132 /// Access the task delegate for the specified task in a thread-safe manner. 169 /// Access the task delegate for the specified task in a thread-safe manner.
@@ -166,17 +203,19 @@ open class SessionDelegate: NSObject { @@ -166,17 +203,19 @@ open class SessionDelegate: NSObject {
166 #endif 203 #endif
167 204
168 #if !os(watchOS) 205 #if !os(watchOS)
169 - switch selector {  
170 - case #selector(URLSessionStreamDelegate.urlSession(_:readClosedFor:)):  
171 - return streamTaskReadClosed != nil  
172 - case #selector(URLSessionStreamDelegate.urlSession(_:writeClosedFor:)):  
173 - return streamTaskWriteClosed != nil  
174 - case #selector(URLSessionStreamDelegate.urlSession(_:betterRouteDiscoveredFor:)):  
175 - return streamTaskBetterRouteDiscovered != nil  
176 - case #selector(URLSessionStreamDelegate.urlSession(_:streamTask:didBecome:outputStream:)):  
177 - return streamTaskDidBecomeInputAndOutputStreams != nil  
178 - default:  
179 - break 206 + if #available(iOS 9.0, macOS 10.11, tvOS 9.0, *) {
  207 + switch selector {
  208 + case #selector(URLSessionStreamDelegate.urlSession(_:readClosedFor:)):
  209 + return streamTaskReadClosed != nil
  210 + case #selector(URLSessionStreamDelegate.urlSession(_:writeClosedFor:)):
  211 + return streamTaskWriteClosed != nil
  212 + case #selector(URLSessionStreamDelegate.urlSession(_:betterRouteDiscoveredFor:)):
  213 + return streamTaskBetterRouteDiscovered != nil
  214 + case #selector(URLSessionStreamDelegate.urlSession(_:streamTask:didBecome:outputStream:)):
  215 + return streamTaskDidBecomeInputAndOutputStreams != nil
  216 + default:
  217 + break
  218 + }
180 } 219 }
181 #endif 220 #endif
182 221
@@ -399,16 +438,20 @@ extension SessionDelegate: URLSessionTaskDelegate { @@ -399,16 +438,20 @@ extension SessionDelegate: URLSessionTaskDelegate {
399 let completeTask: (URLSession, URLSessionTask, Error?) -> Void = { [weak self] session, task, error in 438 let completeTask: (URLSession, URLSessionTask, Error?) -> Void = { [weak self] session, task, error in
400 guard let strongSelf = self else { return } 439 guard let strongSelf = self else { return }
401 440
402 - if let taskDidComplete = strongSelf.taskDidComplete {  
403 - taskDidComplete(session, task, error)  
404 - } else if let delegate = strongSelf[task]?.delegate {  
405 - delegate.urlSession(session, task: task, didCompleteWithError: error) 441 + strongSelf.taskDidComplete?(session, task, error)
  442 +
  443 + strongSelf[task]?.delegate.urlSession(session, task: task, didCompleteWithError: error)
  444 +
  445 + var userInfo: [String: Any] = [Notification.Key.Task: task]
  446 +
  447 + if let data = (strongSelf[task]?.delegate as? DataTaskDelegate)?.data {
  448 + userInfo[Notification.Key.ResponseData] = data
406 } 449 }
407 450
408 NotificationCenter.default.post( 451 NotificationCenter.default.post(
409 name: Notification.Name.Task.DidComplete, 452 name: Notification.Name.Task.DidComplete,
410 object: strongSelf, 453 object: strongSelf,
411 - userInfo: [Notification.Key.Task: task] 454 + userInfo: userInfo
412 ) 455 )
413 456
414 strongSelf[task] = nil 457 strongSelf[task] = nil
@@ -425,17 +468,17 @@ extension SessionDelegate: URLSessionTaskDelegate { @@ -425,17 +468,17 @@ extension SessionDelegate: URLSessionTaskDelegate {
425 // Determine whether an error has occurred 468 // Determine whether an error has occurred
426 var error: Error? = error 469 var error: Error? = error
427 470
428 - if let taskDelegate = self[task]?.delegate, taskDelegate.error != nil {  
429 - error = taskDelegate.error 471 + if request.delegate.error != nil {
  472 + error = request.delegate.error
430 } 473 }
431 474
432 /// If an error occurred and the retrier is set, asynchronously ask the retrier if the request 475 /// If an error occurred and the retrier is set, asynchronously ask the retrier if the request
433 /// should be retried. Otherwise, complete the task by notifying the task delegate. 476 /// should be retried. Otherwise, complete the task by notifying the task delegate.
434 if let retrier = retrier, let error = error { 477 if let retrier = retrier, let error = error {
435 - retrier.should(sessionManager, retry: request, with: error) { [weak self] shouldRetry, delay in 478 + retrier.should(sessionManager, retry: request, with: error) { [weak self] shouldRetry, timeDelay in
436 guard shouldRetry else { completeTask(session, task, error) ; return } 479 guard shouldRetry else { completeTask(session, task, error) ; return }
437 480
438 - DispatchQueue.utility.after(delay) { [weak self] in 481 + DispatchQueue.utility.after(timeDelay) { [weak self] in
439 guard let strongSelf = self else { return } 482 guard let strongSelf = self else { return }
440 483
441 let retrySucceeded = strongSelf.sessionManager?.retry(request) ?? false 484 let retrySucceeded = strongSelf.sessionManager?.retry(request) ?? false
@@ -637,6 +680,7 @@ extension SessionDelegate: URLSessionDownloadDelegate { @@ -637,6 +680,7 @@ extension SessionDelegate: URLSessionDownloadDelegate {
637 680
638 #if !os(watchOS) 681 #if !os(watchOS)
639 682
  683 +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
640 extension SessionDelegate: URLSessionStreamDelegate { 684 extension SessionDelegate: URLSessionStreamDelegate {
641 /// Tells the delegate that the read side of the connection has been closed. 685 /// Tells the delegate that the read side of the connection has been closed.
642 /// 686 ///
ParentAssistant/Pods/Alamofire/Source/SessionManager.swift
1 // 1 //
2 // SessionManager.swift 2 // SessionManager.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -231,12 +231,14 @@ open class SessionManager { @@ -231,12 +231,14 @@ open class SessionManager {
231 headers: HTTPHeaders? = nil) 231 headers: HTTPHeaders? = nil)
232 -> DataRequest 232 -> DataRequest
233 { 233 {
  234 + var originalRequest: URLRequest?
  235 +
234 do { 236 do {
235 - let urlRequest = try URLRequest(url: url, method: method, headers: headers)  
236 - let encodedURLRequest = try encoding.encode(urlRequest, with: parameters) 237 + originalRequest = try URLRequest(url: url, method: method, headers: headers)
  238 + let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters)
237 return request(encodedURLRequest) 239 return request(encodedURLRequest)
238 } catch { 240 } catch {
239 - return request(failedWith: error) 241 + return request(originalRequest, failedWith: error)
240 } 242 }
241 } 243 }
242 244
@@ -247,10 +249,13 @@ open class SessionManager { @@ -247,10 +249,13 @@ open class SessionManager {
247 /// - parameter urlRequest: The URL request. 249 /// - parameter urlRequest: The URL request.
248 /// 250 ///
249 /// - returns: The created `DataRequest`. 251 /// - returns: The created `DataRequest`.
  252 + @discardableResult
250 open func request(_ urlRequest: URLRequestConvertible) -> DataRequest { 253 open func request(_ urlRequest: URLRequestConvertible) -> DataRequest {
  254 + var originalRequest: URLRequest?
  255 +
251 do { 256 do {
252 - let originalRequest = try urlRequest.asURLRequest()  
253 - let originalTask = DataRequest.Requestable(urlRequest: originalRequest) 257 + originalRequest = try urlRequest.asURLRequest()
  258 + let originalTask = DataRequest.Requestable(urlRequest: originalRequest!)
254 259
255 let task = try originalTask.task(session: session, adapter: adapter, queue: queue) 260 let task = try originalTask.task(session: session, adapter: adapter, queue: queue)
256 let request = DataRequest(session: session, requestTask: .data(originalTask, task)) 261 let request = DataRequest(session: session, requestTask: .data(originalTask, task))
@@ -261,15 +266,29 @@ open class SessionManager { @@ -261,15 +266,29 @@ open class SessionManager {
261 266
262 return request 267 return request
263 } catch { 268 } catch {
264 - return request(failedWith: error) 269 + return request(originalRequest, failedWith: error)
265 } 270 }
266 } 271 }
267 272
268 // MARK: Private - Request Implementation 273 // MARK: Private - Request Implementation
269 274
270 - private func request(failedWith error: Error) -> DataRequest {  
271 - let request = DataRequest(session: session, requestTask: .data(nil, nil), error: error)  
272 - if startRequestsImmediately { request.resume() } 275 + private func request(_ urlRequest: URLRequest?, failedWith error: Error) -> DataRequest {
  276 + var requestTask: Request.RequestTask = .data(nil, nil)
  277 +
  278 + if let urlRequest = urlRequest {
  279 + let originalTask = DataRequest.Requestable(urlRequest: urlRequest)
  280 + requestTask = .data(originalTask, nil)
  281 + }
  282 +
  283 + let underlyingError = error.underlyingAdaptError ?? error
  284 + let request = DataRequest(session: session, requestTask: requestTask, error: underlyingError)
  285 +
  286 + if let retrier = retrier, error is AdaptError {
  287 + allowRetrier(retrier, toRetry: request, with: underlyingError)
  288 + } else {
  289 + if startRequestsImmediately { request.resume() }
  290 + }
  291 +
273 return request 292 return request
274 } 293 }
275 294
@@ -308,7 +327,7 @@ open class SessionManager { @@ -308,7 +327,7 @@ open class SessionManager {
308 let encodedURLRequest = try encoding.encode(urlRequest, with: parameters) 327 let encodedURLRequest = try encoding.encode(urlRequest, with: parameters)
309 return download(encodedURLRequest, to: destination) 328 return download(encodedURLRequest, to: destination)
310 } catch { 329 } catch {
311 - return download(failedWith: error) 330 + return download(nil, to: destination, failedWith: error)
312 } 331 }
313 } 332 }
314 333
@@ -334,7 +353,7 @@ open class SessionManager { @@ -334,7 +353,7 @@ open class SessionManager {
334 let urlRequest = try urlRequest.asURLRequest() 353 let urlRequest = try urlRequest.asURLRequest()
335 return download(.request(urlRequest), to: destination) 354 return download(.request(urlRequest), to: destination)
336 } catch { 355 } catch {
337 - return download(failedWith: error) 356 + return download(nil, to: destination, failedWith: error)
338 } 357 }
339 } 358 }
340 359
@@ -348,6 +367,13 @@ open class SessionManager { @@ -348,6 +367,13 @@ open class SessionManager {
348 /// 367 ///
349 /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. 368 /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.
350 /// 369 ///
  370 + /// On the latest release of all the Apple platforms (iOS 10, macOS 10.12, tvOS 10, watchOS 3), `resumeData` is broken
  371 + /// on background URL session configurations. There's an underlying bug in the `resumeData` generation logic where the
  372 + /// data is written incorrectly and will always fail to resume the download. For more information about the bug and
  373 + /// possible workarounds, please refer to the following Stack Overflow post:
  374 + ///
  375 + /// - http://stackoverflow.com/a/39347461/1342462
  376 + ///
351 /// - parameter resumeData: The resume data. This is an opaque data blob produced by `URLSessionDownloadTask` 377 /// - parameter resumeData: The resume data. This is an opaque data blob produced by `URLSessionDownloadTask`
352 /// when a task is cancelled. See `URLSession -downloadTask(withResumeData:)` for 378 /// when a task is cancelled. See `URLSession -downloadTask(withResumeData:)` for
353 /// additional information. 379 /// additional information.
@@ -372,23 +398,43 @@ open class SessionManager { @@ -372,23 +398,43 @@ open class SessionManager {
372 { 398 {
373 do { 399 do {
374 let task = try downloadable.task(session: session, adapter: adapter, queue: queue) 400 let task = try downloadable.task(session: session, adapter: adapter, queue: queue)
375 - let request = DownloadRequest(session: session, requestTask: .download(downloadable, task)) 401 + let download = DownloadRequest(session: session, requestTask: .download(downloadable, task))
376 402
377 - request.downloadDelegate.destination = destination 403 + download.downloadDelegate.destination = destination
378 404
379 - delegate[task] = request 405 + delegate[task] = download
380 406
381 - if startRequestsImmediately { request.resume() } 407 + if startRequestsImmediately { download.resume() }
382 408
383 - return request 409 + return download
384 } catch { 410 } catch {
385 - return download(failedWith: error) 411 + return download(downloadable, to: destination, failedWith: error)
386 } 412 }
387 } 413 }
388 414
389 - private func download(failedWith error: Error) -> DownloadRequest {  
390 - let download = DownloadRequest(session: session, requestTask: .download(nil, nil), error: error)  
391 - if startRequestsImmediately { download.resume() } 415 + private func download(
  416 + _ downloadable: DownloadRequest.Downloadable?,
  417 + to destination: DownloadRequest.DownloadFileDestination?,
  418 + failedWith error: Error)
  419 + -> DownloadRequest
  420 + {
  421 + var downloadTask: Request.RequestTask = .download(nil, nil)
  422 +
  423 + if let downloadable = downloadable {
  424 + downloadTask = .download(downloadable, nil)
  425 + }
  426 +
  427 + let underlyingError = error.underlyingAdaptError ?? error
  428 +
  429 + let download = DownloadRequest(session: session, requestTask: downloadTask, error: underlyingError)
  430 + download.downloadDelegate.destination = destination
  431 +
  432 + if let retrier = retrier, error is AdaptError {
  433 + allowRetrier(retrier, toRetry: download, with: underlyingError)
  434 + } else {
  435 + if startRequestsImmediately { download.resume() }
  436 + }
  437 +
392 return download 438 return download
393 } 439 }
394 440
@@ -418,7 +464,7 @@ open class SessionManager { @@ -418,7 +464,7 @@ open class SessionManager {
418 let urlRequest = try URLRequest(url: url, method: method, headers: headers) 464 let urlRequest = try URLRequest(url: url, method: method, headers: headers)
419 return upload(fileURL, with: urlRequest) 465 return upload(fileURL, with: urlRequest)
420 } catch { 466 } catch {
421 - return upload(failedWith: error) 467 + return upload(nil, failedWith: error)
422 } 468 }
423 } 469 }
424 470
@@ -436,7 +482,7 @@ open class SessionManager { @@ -436,7 +482,7 @@ open class SessionManager {
436 let urlRequest = try urlRequest.asURLRequest() 482 let urlRequest = try urlRequest.asURLRequest()
437 return upload(.file(fileURL, urlRequest)) 483 return upload(.file(fileURL, urlRequest))
438 } catch { 484 } catch {
439 - return upload(failedWith: error) 485 + return upload(nil, failedWith: error)
440 } 486 }
441 } 487 }
442 488
@@ -464,7 +510,7 @@ open class SessionManager { @@ -464,7 +510,7 @@ open class SessionManager {
464 let urlRequest = try URLRequest(url: url, method: method, headers: headers) 510 let urlRequest = try URLRequest(url: url, method: method, headers: headers)
465 return upload(data, with: urlRequest) 511 return upload(data, with: urlRequest)
466 } catch { 512 } catch {
467 - return upload(failedWith: error) 513 + return upload(nil, failedWith: error)
468 } 514 }
469 } 515 }
470 516
@@ -482,7 +528,7 @@ open class SessionManager { @@ -482,7 +528,7 @@ open class SessionManager {
482 let urlRequest = try urlRequest.asURLRequest() 528 let urlRequest = try urlRequest.asURLRequest()
483 return upload(.data(data, urlRequest)) 529 return upload(.data(data, urlRequest))
484 } catch { 530 } catch {
485 - return upload(failedWith: error) 531 + return upload(nil, failedWith: error)
486 } 532 }
487 } 533 }
488 534
@@ -510,7 +556,7 @@ open class SessionManager { @@ -510,7 +556,7 @@ open class SessionManager {
510 let urlRequest = try URLRequest(url: url, method: method, headers: headers) 556 let urlRequest = try URLRequest(url: url, method: method, headers: headers)
511 return upload(stream, with: urlRequest) 557 return upload(stream, with: urlRequest)
512 } catch { 558 } catch {
513 - return upload(failedWith: error) 559 + return upload(nil, failedWith: error)
514 } 560 }
515 } 561 }
516 562
@@ -528,7 +574,7 @@ open class SessionManager { @@ -528,7 +574,7 @@ open class SessionManager {
528 let urlRequest = try urlRequest.asURLRequest() 574 let urlRequest = try urlRequest.asURLRequest()
529 return upload(.stream(stream, urlRequest)) 575 return upload(.stream(stream, urlRequest))
530 } catch { 576 } catch {
531 - return upload(failedWith: error) 577 + return upload(nil, failedWith: error)
532 } 578 }
533 } 579 }
534 580
@@ -614,6 +660,8 @@ open class SessionManager { @@ -614,6 +660,8 @@ open class SessionManager {
614 let formData = MultipartFormData() 660 let formData = MultipartFormData()
615 multipartFormData(formData) 661 multipartFormData(formData)
616 662
  663 + var tempFileURL: URL?
  664 +
617 do { 665 do {
618 var urlRequestWithContentType = try urlRequest.asURLRequest() 666 var urlRequestWithContentType = try urlRequest.asURLRequest()
619 urlRequestWithContentType.setValue(formData.contentType, forHTTPHeaderField: "Content-Type") 667 urlRequestWithContentType.setValue(formData.contentType, forHTTPHeaderField: "Content-Type")
@@ -637,6 +685,8 @@ open class SessionManager { @@ -637,6 +685,8 @@ open class SessionManager {
637 let fileName = UUID().uuidString 685 let fileName = UUID().uuidString
638 let fileURL = directoryURL.appendingPathComponent(fileName) 686 let fileURL = directoryURL.appendingPathComponent(fileName)
639 687
  688 + tempFileURL = fileURL
  689 +
640 var directoryError: Error? 690 var directoryError: Error?
641 691
642 // Create directory inside serial queue to ensure two threads don't do this in parallel 692 // Create directory inside serial queue to ensure two threads don't do this in parallel
@@ -652,16 +702,37 @@ open class SessionManager { @@ -652,16 +702,37 @@ open class SessionManager {
652 702
653 try formData.writeEncodedData(to: fileURL) 703 try formData.writeEncodedData(to: fileURL)
654 704
  705 + let upload = self.upload(fileURL, with: urlRequestWithContentType)
  706 +
  707 + // Cleanup the temp file once the upload is complete
  708 + upload.delegate.queue.addOperation {
  709 + do {
  710 + try FileManager.default.removeItem(at: fileURL)
  711 + } catch {
  712 + // No-op
  713 + }
  714 + }
  715 +
655 DispatchQueue.main.async { 716 DispatchQueue.main.async {
656 let encodingResult = MultipartFormDataEncodingResult.success( 717 let encodingResult = MultipartFormDataEncodingResult.success(
657 - request: self.upload(fileURL, with: urlRequestWithContentType), 718 + request: upload,
658 streamingFromDisk: true, 719 streamingFromDisk: true,
659 streamFileURL: fileURL 720 streamFileURL: fileURL
660 ) 721 )
  722 +
661 encodingCompletion?(encodingResult) 723 encodingCompletion?(encodingResult)
662 } 724 }
663 } 725 }
664 } catch { 726 } catch {
  727 + // Cleanup the temp file in the event that the multipart form data encoding failed
  728 + if let tempFileURL = tempFileURL {
  729 + do {
  730 + try FileManager.default.removeItem(at: tempFileURL)
  731 + } catch {
  732 + // No-op
  733 + }
  734 + }
  735 +
665 DispatchQueue.main.async { encodingCompletion?(.failure(error)) } 736 DispatchQueue.main.async { encodingCompletion?(.failure(error)) }
666 } 737 }
667 } 738 }
@@ -684,13 +755,26 @@ open class SessionManager { @@ -684,13 +755,26 @@ open class SessionManager {
684 755
685 return upload 756 return upload
686 } catch { 757 } catch {
687 - return upload(failedWith: error) 758 + return upload(uploadable, failedWith: error)
688 } 759 }
689 } 760 }
690 761
691 - private func upload(failedWith error: Error) -> UploadRequest {  
692 - let upload = UploadRequest(session: session, requestTask: .upload(nil, nil), error: error)  
693 - if startRequestsImmediately { upload.resume() } 762 + private func upload(_ uploadable: UploadRequest.Uploadable?, failedWith error: Error) -> UploadRequest {
  763 + var uploadTask: Request.RequestTask = .upload(nil, nil)
  764 +
  765 + if let uploadable = uploadable {
  766 + uploadTask = .upload(uploadable, nil)
  767 + }
  768 +
  769 + let underlyingError = error.underlyingAdaptError ?? error
  770 + let upload = UploadRequest(session: session, requestTask: uploadTask, error: underlyingError)
  771 +
  772 + if let retrier = retrier, error is AdaptError {
  773 + allowRetrier(retrier, toRetry: upload, with: underlyingError)
  774 + } else {
  775 + if startRequestsImmediately { upload.resume() }
  776 + }
  777 +
694 return upload 778 return upload
695 } 779 }
696 780
@@ -709,6 +793,7 @@ open class SessionManager { @@ -709,6 +793,7 @@ open class SessionManager {
709 /// 793 ///
710 /// - returns: The created `StreamRequest`. 794 /// - returns: The created `StreamRequest`.
711 @discardableResult 795 @discardableResult
  796 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
712 open func stream(withHostName hostName: String, port: Int) -> StreamRequest { 797 open func stream(withHostName hostName: String, port: Int) -> StreamRequest {
713 return stream(.stream(hostName: hostName, port: port)) 798 return stream(.stream(hostName: hostName, port: port))
714 } 799 }
@@ -723,12 +808,14 @@ open class SessionManager { @@ -723,12 +808,14 @@ open class SessionManager {
723 /// 808 ///
724 /// - returns: The created `StreamRequest`. 809 /// - returns: The created `StreamRequest`.
725 @discardableResult 810 @discardableResult
  811 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
726 open func stream(with netService: NetService) -> StreamRequest { 812 open func stream(with netService: NetService) -> StreamRequest {
727 return stream(.netService(netService)) 813 return stream(.netService(netService))
728 } 814 }
729 815
730 // MARK: Private - Stream Implementation 816 // MARK: Private - Stream Implementation
731 817
  818 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
732 private func stream(_ streamable: StreamRequest.Streamable) -> StreamRequest { 819 private func stream(_ streamable: StreamRequest.Streamable) -> StreamRequest {
733 do { 820 do {
734 let task = try streamable.task(session: session, adapter: adapter, queue: queue) 821 let task = try streamable.task(session: session, adapter: adapter, queue: queue)
@@ -744,6 +831,7 @@ open class SessionManager { @@ -744,6 +831,7 @@ open class SessionManager {
744 } 831 }
745 } 832 }
746 833
  834 + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)
747 private func stream(failedWith error: Error) -> StreamRequest { 835 private func stream(failedWith error: Error) -> StreamRequest {
748 let stream = StreamRequest(session: session, requestTask: .stream(nil, nil), error: error) 836 let stream = StreamRequest(session: session, requestTask: .stream(nil, nil), error: error)
749 if startRequestsImmediately { stream.resume() } 837 if startRequestsImmediately { stream.resume() }
@@ -760,8 +848,13 @@ open class SessionManager { @@ -760,8 +848,13 @@ open class SessionManager {
760 do { 848 do {
761 let task = try originalTask.task(session: session, adapter: adapter, queue: queue) 849 let task = try originalTask.task(session: session, adapter: adapter, queue: queue)
762 850
  851 + if let originalTask = request.task {
  852 + delegate[originalTask] = nil // removes the old request to avoid endless growth
  853 + }
  854 +
763 request.delegate.task = task // resets all task delegate data 855 request.delegate.task = task // resets all task delegate data
764 856
  857 + request.retryCount += 1
765 request.startTime = CFAbsoluteTimeGetCurrent() 858 request.startTime = CFAbsoluteTimeGetCurrent()
766 request.endTime = nil 859 request.endTime = nil
767 860
@@ -769,8 +862,35 @@ open class SessionManager { @@ -769,8 +862,35 @@ open class SessionManager {
769 862
770 return true 863 return true
771 } catch { 864 } catch {
772 - request.delegate.error = error 865 + request.delegate.error = error.underlyingAdaptError ?? error
773 return false 866 return false
774 } 867 }
775 } 868 }
  869 +
  870 + private func allowRetrier(_ retrier: RequestRetrier, toRetry request: Request, with error: Error) {
  871 + DispatchQueue.utility.async { [weak self] in
  872 + guard let strongSelf = self else { return }
  873 +
  874 + retrier.should(strongSelf, retry: request, with: error) { shouldRetry, timeDelay in
  875 + guard let strongSelf = self else { return }
  876 +
  877 + guard shouldRetry else {
  878 + if strongSelf.startRequestsImmediately { request.resume() }
  879 + return
  880 + }
  881 +
  882 + DispatchQueue.utility.after(timeDelay) {
  883 + guard let strongSelf = self else { return }
  884 +
  885 + let retrySucceeded = strongSelf.retry(request)
  886 +
  887 + if retrySucceeded, let task = request.task {
  888 + strongSelf.delegate[task] = request
  889 + } else {
  890 + if strongSelf.startRequestsImmediately { request.resume() }
  891 + }
  892 + }
  893 + }
  894 + }
  895 + }
776 } 896 }
ParentAssistant/Pods/Alamofire/Source/TaskDelegate.swift
1 // 1 //
2 // TaskDelegate.swift 2 // TaskDelegate.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -33,21 +33,37 @@ open class TaskDelegate: NSObject { @@ -33,21 +33,37 @@ open class TaskDelegate: NSObject {
33 /// The serial operation queue used to execute all operations after the task completes. 33 /// The serial operation queue used to execute all operations after the task completes.
34 open let queue: OperationQueue 34 open let queue: OperationQueue
35 35
  36 + /// The data returned by the server.
  37 + public var data: Data? { return nil }
  38 +
  39 + /// The error generated throughout the lifecyle of the task.
  40 + public var error: Error?
  41 +
36 var task: URLSessionTask? { 42 var task: URLSessionTask? {
37 - didSet { reset() } 43 + set {
  44 + taskLock.lock(); defer { taskLock.unlock() }
  45 + _task = newValue
  46 + }
  47 + get {
  48 + taskLock.lock(); defer { taskLock.unlock() }
  49 + return _task
  50 + }
38 } 51 }
39 52
40 - var data: Data? { return nil }  
41 - var error: Error?  
42 -  
43 var initialResponseTime: CFAbsoluteTime? 53 var initialResponseTime: CFAbsoluteTime?
44 var credential: URLCredential? 54 var credential: URLCredential?
45 var metrics: AnyObject? // URLSessionTaskMetrics 55 var metrics: AnyObject? // URLSessionTaskMetrics
46 56
  57 + private var _task: URLSessionTask? {
  58 + didSet { reset() }
  59 + }
  60 +
  61 + private let taskLock = NSLock()
  62 +
47 // MARK: Lifecycle 63 // MARK: Lifecycle
48 64
49 init(task: URLSessionTask?) { 65 init(task: URLSessionTask?) {
50 - self.task = task 66 + _task = task
51 67
52 self.queue = { 68 self.queue = {
53 let operationQueue = OperationQueue() 69 let operationQueue = OperationQueue()
@@ -331,29 +347,30 @@ class DownloadTaskDelegate: TaskDelegate, URLSessionDownloadDelegate { @@ -331,29 +347,30 @@ class DownloadTaskDelegate: TaskDelegate, URLSessionDownloadDelegate {
331 { 347 {
332 temporaryURL = location 348 temporaryURL = location
333 349
334 - if let destination = destination {  
335 - let result = destination(location, downloadTask.response as! HTTPURLResponse)  
336 - let destination = result.destinationURL  
337 - let options = result.options 350 + guard
  351 + let destination = destination,
  352 + let response = downloadTask.response as? HTTPURLResponse
  353 + else { return }
338 354
339 - do {  
340 - destinationURL = destination 355 + let result = destination(location, response)
  356 + let destinationURL = result.destinationURL
  357 + let options = result.options
341 358
342 - if options.contains(.removePreviousFile) {  
343 - if FileManager.default.fileExists(atPath: destination.path) {  
344 - try FileManager.default.removeItem(at: destination)  
345 - }  
346 - } 359 + self.destinationURL = destinationURL
347 360
348 - if options.contains(.createIntermediateDirectories) {  
349 - let directory = destination.deletingLastPathComponent()  
350 - try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil)  
351 - } 361 + do {
  362 + if options.contains(.removePreviousFile), FileManager.default.fileExists(atPath: destinationURL.path) {
  363 + try FileManager.default.removeItem(at: destinationURL)
  364 + }
352 365
353 - try FileManager.default.moveItem(at: location, to: destination)  
354 - } catch {  
355 - self.error = error 366 + if options.contains(.createIntermediateDirectories) {
  367 + let directory = destinationURL.deletingLastPathComponent()
  368 + try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)
356 } 369 }
  370 +
  371 + try FileManager.default.moveItem(at: location, to: destinationURL)
  372 + } catch {
  373 + self.error = error
357 } 374 }
358 } 375 }
359 376
ParentAssistant/Pods/Alamofire/Source/Timeline.swift
1 // 1 //
2 // Timeline.swift 2 // Timeline.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
ParentAssistant/Pods/Alamofire/Source/Validation.swift
1 // 1 //
2 // Validation.swift 2 // Validation.swift
3 // 3 //
4 -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 4 +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 // 5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal 7 // of this software and associated documentation files (the "Software"), to deal
@@ -48,7 +48,13 @@ extension Request { @@ -48,7 +48,13 @@ extension Request {
48 init?(_ string: String) { 48 init?(_ string: String) {
49 let components: [String] = { 49 let components: [String] = {
50 let stripped = string.trimmingCharacters(in: .whitespacesAndNewlines) 50 let stripped = string.trimmingCharacters(in: .whitespacesAndNewlines)
  51 +
  52 + #if swift(>=3.2)
  53 + let split = stripped[..<(stripped.range(of: ";")?.lowerBound ?? stripped.endIndex)]
  54 + #else
51 let split = stripped.substring(to: stripped.range(of: ";")?.lowerBound ?? stripped.endIndex) 55 let split = stripped.substring(to: stripped.range(of: ";")?.lowerBound ?? stripped.endIndex)
  56 + #endif
  57 +
52 return split.components(separatedBy: "/") 58 return split.components(separatedBy: "/")
53 }() 59 }()
54 60
ParentAssistant/Pods/AlamofireImage/LICENSE 0 → 100644
@@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
  1 +Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  2 +
  3 +Permission is hereby granted, free of charge, to any person obtaining a copy
  4 +of this software and associated documentation files (the "Software"), to deal
  5 +in the Software without restriction, including without limitation the rights
  6 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7 +copies of the Software, and to permit persons to whom the Software is
  8 +furnished to do so, subject to the following conditions:
  9 +
  10 +The above copyright notice and this permission notice shall be included in
  11 +all copies or substantial portions of the Software.
  12 +
  13 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  18 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  19 +THE SOFTWARE.
ParentAssistant/Pods/AlamofireImage/README.md 0 → 100644
@@ -0,0 +1,584 @@ @@ -0,0 +1,584 @@
  1 +# AlamofireImage
  2 +
  3 +[![Build Status](https://travis-ci.org/Alamofire/AlamofireImage.svg?branch=master)](https://travis-ci.org/Alamofire/AlamofireImage)
  4 +[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/AlamofireImage.svg)](https://img.shields.io/cocoapods/v/AlamofireImage.svg)
  5 +[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
  6 +[![Platform](https://img.shields.io/cocoapods/p/AlamofireImage.svg?style=flat)](http://cocoadocs.org/docsets/AlamofireImage)
  7 +[![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF)
  8 +[![Gitter](https://badges.gitter.im/Alamofire/Alamofire.svg)](https://gitter.im/Alamofire/Alamofire?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
  9 +
  10 +AlamofireImage is an image component library for Alamofire.
  11 +
  12 +## Features
  13 +
  14 +- [x] Image Response Serializers
  15 +- [x] UIImage Extensions for Inflation / Scaling / Rounding / CoreImage
  16 +- [x] Single and Multi-Pass Image Filters
  17 +- [x] Auto-Purging In-Memory Image Cache
  18 +- [x] Prioritized Queue Order Image Downloading
  19 +- [x] Authentication with URLCredential
  20 +- [x] UIImageView Async Remote Downloads with Placeholders
  21 +- [x] UIImageView Filters and Transitions
  22 +- [x] Comprehensive Test Coverage
  23 +- [x] [Complete Documentation](http://cocoadocs.org/docsets/AlamofireImage)
  24 +
  25 +## Requirements
  26 +
  27 +- iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+
  28 +- Xcode 8.3+
  29 +- Swift 3.1+
  30 +
  31 +## Migration Guides
  32 +
  33 +- [AlamofireImage 2.0 Migration Guide](https://github.com/Alamofire/AlamofireImage/blob/master/Documentation/AlamofireImage%202.0%20Migration%20Guide.md)
  34 +- [AlamofireImage 3.0 Migration Guide](https://github.com/Alamofire/AlamofireImage/blob/master/Documentation/AlamofireImage%203.0%20Migration%20Guide.md)
  35 +
  36 +## Dependencies
  37 +
  38 +- [Alamofire 4.5+](https://github.com/Alamofire/Alamofire)
  39 +
  40 +## Communication
  41 +
  42 +- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire). (Tag 'alamofire')
  43 +- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire).
  44 +- If you **found a bug**, open an issue.
  45 +- If you **have a feature request**, open an issue.
  46 +- If you **want to contribute**, submit a pull request.
  47 +
  48 +## Installation
  49 +
  50 +### CocoaPods
  51 +
  52 +[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:
  53 +
  54 +```bash
  55 +$ gem install cocoapods
  56 +```
  57 +
  58 +> CocoaPods 1.1+ is required.
  59 +
  60 +To integrate AlamofireImage into your Xcode project using CocoaPods, specify it in your `Podfile`:
  61 +
  62 +```ruby
  63 +source 'https://github.com/CocoaPods/Specs.git'
  64 +platform :ios, '10.0'
  65 +use_frameworks!
  66 +
  67 +target '<Your Target Name>' do
  68 + pod 'AlamofireImage', '~> 3.3'
  69 +end
  70 +```
  71 +
  72 +Then, run the following command:
  73 +
  74 +```bash
  75 +$ pod install
  76 +```
  77 +
  78 +### Carthage
  79 +
  80 +[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.
  81 +
  82 +You can install Carthage with [Homebrew](http://brew.sh/) using the following command:
  83 +
  84 +```bash
  85 +$ brew update
  86 +$ brew install carthage
  87 +```
  88 +
  89 +To integrate AlamofireImage into your Xcode project using Carthage, specify it in your `Cartfile`:
  90 +
  91 +```ogdl
  92 +github "Alamofire/AlamofireImage" ~> 3.3
  93 +```
  94 +
  95 +Run `carthage update` to build the framework and drag the built `AlamofireImage.framework` into your Xcode project.
  96 +
  97 +### Manually
  98 +
  99 +If you prefer not to use either of the aforementioned dependency managers, you can integrate AlamofireImage into your project manually.
  100 +
  101 +#### Embedded Framework
  102 +
  103 +- Open up Terminal, `cd` into your top-level project directory, and run the following command "if" your project is not initialized as a git repository:
  104 +
  105 +```bash
  106 +$ git init
  107 +```
  108 +
  109 +- Add AlamofireImage as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command:
  110 +
  111 +```bash
  112 +$ git submodule add https://github.com/Alamofire/AlamofireImage.git
  113 +```
  114 +
  115 +- Open the new `AlamofireImage` folder, and drag the `AlamofireImage.xcodeproj` into the Project Navigator of your application's Xcode project.
  116 +
  117 + > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.
  118 +
  119 +- Select the `AlamofireImage.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target.
  120 +- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the "Targets" heading in the sidebar.
  121 +- In the tab bar at the top of that window, open the "General" panel.
  122 +- Click on the `+` button under the "Embedded Binaries" section.
  123 +- You will see two different `AlamofireImage.xcodeproj` folders each with two different versions of the `AlamofireImage.framework` nested inside a `Products` folder.
  124 +
  125 + > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `AlamofireImage.framework`.
  126 +
  127 +- Select the top `AlamofireImage.framework` for iOS and the bottom one for OS X.
  128 +
  129 + > You can verify which one you selected by inspecting the build log for your project. The build target for `AlamofireImage` will be listed as either `AlamofireImage iOS`, `AlamofireImage macOS`, `AlamofireImage tvOS` or `AlamofireImage watchOS`.
  130 +
  131 +- And that's it!
  132 +
  133 + > The `AlamofireImage.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.
  134 +
  135 +---
  136 +
  137 +## Usage
  138 +
  139 +### Image Response Serializers
  140 +
  141 +```swift
  142 +import Alamofire
  143 +import AlamofireImage
  144 +
  145 +Alamofire.request("https://httpbin.org/image/png").responseImage { response in
  146 + debugPrint(response)
  147 +
  148 + print(response.request)
  149 + print(response.response)
  150 + debugPrint(response.result)
  151 +
  152 + if let image = response.result.value {
  153 + print("image downloaded: \(image)")
  154 + }
  155 +}
  156 +```
  157 +
  158 +The AlamofireImage response image serializers support a wide range of image types including:
  159 +
  160 +- `image/png`
  161 +- `image/jpeg`
  162 +- `image/tiff`
  163 +- `image/gif`
  164 +- `image/ico`
  165 +- `image/x-icon`
  166 +- `image/bmp`
  167 +- `image/x-bmp`
  168 +- `image/x-xbitmap`
  169 +- `image/x-win-bitmap`
  170 +
  171 +> If the image you are attempting to download is an invalid MIME type not in the list, you can add custom acceptable content types using the `addAcceptableImageContentTypes` extension on the `DataRequest` type.
  172 +
  173 +### UIImage Extensions
  174 +
  175 +There are several `UIImage` extensions designed to make the common image manipulation operations as simple as possible.
  176 +
  177 +#### Inflation
  178 +
  179 +```swift
  180 +let url = Bundle.main.url(forResource: "unicorn", withExtension: "png")!
  181 +let data = try! Data(contentsOf: url)
  182 +let image = UIImage(data: data, scale: UIScreen.main.scale)!
  183 +
  184 +image.af_inflate()
  185 +```
  186 +
  187 +> Inflating compressed image formats (such as PNG or JPEG) in a background queue can significantly improve drawing performance on the main thread.
  188 +
  189 +#### Scaling
  190 +
  191 +```swift
  192 +let image = UIImage(named: "unicorn")!
  193 +let size = CGSize(width: 100.0, height: 100.0)
  194 +
  195 +// Scale image to size disregarding aspect ratio
  196 +let scaledImage = image.af_imageScaled(to: size)
  197 +
  198 +// Scale image to fit within specified size while maintaining aspect ratio
  199 +let aspectScaledToFitImage = image.af_imageAspectScaled(toFit: size)
  200 +
  201 +// Scale image to fill specified size while maintaining aspect ratio
  202 +let aspectScaledToFillImage = image.af_imageAspectScaled(toFill: size)
  203 +```
  204 +
  205 +#### Rounded Corners
  206 +
  207 +```swift
  208 +let image = UIImage(named: "unicorn")!
  209 +let radius: CGFloat = 20.0
  210 +
  211 +let roundedImage = image.af_imageRounded(withCornerRadius: radius)
  212 +let circularImage = image.af_imageRoundedIntoCircle()
  213 +```
  214 +
  215 +#### Core Image Filters
  216 +
  217 +```swift
  218 +let image = UIImage(named: "unicorn")!
  219 +
  220 +let sepiaImage = image.af_imageFiltered(withCoreImageFilter: "CISepiaTone")
  221 +
  222 +let blurredImage = image.af_imageFiltered(
  223 + withCoreImageFilter: "CIGuassianBlur",
  224 + parameters: ["inputRadius": 25]
  225 +)
  226 +```
  227 +
  228 +### Image Filters
  229 +
  230 +The `ImageFilter` protocol was designed to make it easy to apply a filter operation and cache the result after an image finished downloading. It defines two properties to facilitate this functionality.
  231 +
  232 +```swift
  233 +public protocol ImageFilter {
  234 + var filter: Image -> Image { get }
  235 + var identifier: String { get }
  236 +}
  237 +```
  238 +
  239 +The `filter` closure contains the operation used to create a modified version of the specified image. The `identifier` property is a string used to uniquely identify the filter operation. This is useful when adding filtered versions of an image to a cache. All identifier properties inside AlamofireImage are implemented using protocol extensions.
  240 +
  241 +#### Single Pass
  242 +
  243 +The single pass image filters only perform a single operation on the specified image.
  244 +
  245 +```swift
  246 +let image = UIImage(named: "unicorn")!
  247 +let imageFilter = RoundedCornersFilter(radius: 10.0)
  248 +
  249 +let roundedImage = imageFilter.filter(image)
  250 +```
  251 +
  252 +The current list of single pass image filters includes:
  253 +
  254 +- `ScaledToSizeFilter` - Scales an image to a specified size.
  255 +- `AspectScaledToFitSizeFilter` - Scales an image from the center while maintaining the aspect ratio to fit within a specified size.
  256 +- `AspectScaledToFillSizeFilter` - Scales an image from the center while maintaining the aspect ratio to fill a specified size. Any pixels that fall outside the specified size are clipped.
  257 +- `RoundedCornersFilter` - Rounds the corners of an image to the specified radius.
  258 +- `CircleFilter` - Rounds the corners of an image into a circle.
  259 +- `BlurFilter` - Blurs an image using a `CIGaussianBlur` filter with the specified blur radius.
  260 +
  261 +> Each image filter is built ontop of the `UIImage` extensions.
  262 +
  263 +#### Multi-Pass
  264 +
  265 +The multi-pass image filters perform multiple operations on the specified image.
  266 +
  267 +```swift
  268 +let image = UIImage(named: "avatar")!
  269 +let size = CGSize(width: 100.0, height: 100.0)
  270 +let imageFilter = AspectScaledToFillSizeCircleFilter(size: size)
  271 +
  272 +let avatarImage = imageFilter.filter(image)
  273 +```
  274 +
  275 +The current list of multi-pass image filters includes:
  276 +
  277 +- `ScaledToSizeWithRoundedCornersFilter` - Scales an image to a specified size, then rounds the corners to the specified radius.
  278 +- `AspectScaledToFillSizeWithRoundedCornersFilter` - Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the corners to the specified radius.
  279 +- `ScaledToSizeCircleFilter` - Scales an image to a specified size, then rounds the corners into a circle.
  280 +- `AspectScaledToFillSizeCircleFilter` - Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the corners into a circle.
  281 +
  282 +### Image Cache
  283 +
  284 +Image caching can become complicated when it comes to network images. `URLCache` is quite powerful and does a great job reasoning through the various cache policies and `Cache-Control` headers. However, it is not equipped to handle caching multiple modified versions of those images.
  285 +
  286 +For example, let's say you need to download an album of images. Your app needs to display both the thumbnail version as well as the full size version at various times. Due to performance issues, you want to scale down the thumbnails to a reasonable size before rendering them on-screen. You also need to apply a global CoreImage filter to the full size images when displayed. While `URLCache` can easily handle storing the original downloaded image, it cannot store these different variants. What you really need is another caching layer designed to handle these different variants.
  287 +
  288 +```swift
  289 +let imageCache = AutoPurgingImageCache(
  290 + memoryCapacity: 100_000_000,
  291 + preferredMemoryUsageAfterPurge: 60_000_000
  292 +)
  293 +```
  294 +
  295 +The `AutoPurgingImageCache` in AlamofireImage fills the role of that additional caching layer. It is an in-memory image cache used to store images up to a given memory capacity. When the memory capacity is reached, the image cache is sorted by last access date, then the oldest image is continuously purged until the preferred memory usage after purge is met. Each time an image is accessed through the cache, the internal access date of the image is updated.
  296 +
  297 +#### Add / Remove / Fetch Images
  298 +
  299 +Interacting with the `ImageCache` protocol APIs is very straightforward.
  300 +
  301 +```swift
  302 +let imageCache = AutoPurgingImageCache()
  303 +let avatarImage = UIImage(data: data)!
  304 +
  305 +// Add
  306 +imageCache.add(avatarImage, withIdentifier: "avatar")
  307 +
  308 +// Fetch
  309 +let cachedAvatar = imageCache.image(withIdentifier: "avatar")
  310 +
  311 +// Remove
  312 +imageCache.removeImage(withIdentifier: "avatar")
  313 +```
  314 +
  315 +#### URL Requests
  316 +
  317 +The `ImageRequestCache` protocol extends the `ImageCache` protocol by adding support for `URLRequest` caching. This allows a `URLRequest` and an additional identifier to generate the unique identifier for the image in the cache.
  318 +
  319 +```swift
  320 +let imageCache = AutoPurgingImageCache()
  321 +
  322 +let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/image/png")!)
  323 +let avatarImage = UIImage(named: "avatar")!.af_imageRoundedIntoCircle()
  324 +
  325 +// Add
  326 +imageCache.add(avatarImage, for: urlRequest, withIdentifier: "circle")
  327 +
  328 +// Fetch
  329 +let cachedAvatarImage = imageCache.image(for: urlRequest, withIdentifier: "circle")
  330 +
  331 +// Remove
  332 +imageCache.removeImage(for: urlRequest, withIdentifier: "circle")
  333 +```
  334 +
  335 +#### Auto-Purging
  336 +
  337 +Each time an image is fetched from the cache, the cache internally updates the last access date for that image.
  338 +
  339 +```swift
  340 +let avatar = imageCache.image(withIdentifier: "avatar")
  341 +let circularAvatar = imageCache.image(for: urlRequest, withIdentifier: "circle")
  342 +```
  343 +
  344 +By updating the last access date for each image, the image cache can make more informed decisions about which images to purge when the memory capacity is reached. The `AutoPurgingImageCache` automatically evicts images from the cache in order from oldest last access date to newest until the memory capacity drops below the `preferredMemoryCapacityAfterPurge`.
  345 +
  346 +> It is important to set reasonable default values for the `memoryCapacity` and `preferredMemoryCapacityAfterPurge` when you are initializing your image cache. By default, the `memoryCapacity` equals 100 MB and the `preferredMemoryCapacityAfterPurge` equals 60 MB.
  347 +
  348 +#### Memory Warnings
  349 +
  350 +The `AutoPurgingImageCache` also listens for memory warnings from your application and will purge all images from the cache if a memory warning is observed.
  351 +
  352 +### Image Downloader
  353 +
  354 +The `ImageDownloader` class is responsible for downloading images in parallel on a prioritized queue. It uses an internal Alamofire `SessionManager` instance to handle all the downloading and response image serialization. By default, the initialization of an `ImageDownloader` uses a default `URLSessionConfiguration` with the most common parameter values.
  355 +
  356 +```swift
  357 +let imageDownloader = ImageDownloader(
  358 + configuration: ImageDownloader.defaultURLSessionConfiguration(),
  359 + downloadPrioritization: .fifo,
  360 + maximumActiveDownloads: 4,
  361 + imageCache: AutoPurgingImageCache()
  362 +)
  363 +```
  364 +
  365 +> If you need to customize the `URLSessionConfiguration` type or parameters, then simply provide your own rather than using the default.
  366 +
  367 +#### Downloading an Image
  368 +
  369 +```swift
  370 +let downloader = ImageDownloader()
  371 +let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/image/jpeg")!)
  372 +
  373 +downloader.download(urlRequest) { response in
  374 + print(response.request)
  375 + print(response.response)
  376 + debugPrint(response.result)
  377 +
  378 + if let image = response.result.value {
  379 + print(image)
  380 + }
  381 +}
  382 +```
  383 +
  384 +> Make sure to keep a strong reference to the `ImageDownloader` instance, otherwise the `completion` closure will not be called because the `downloader` reference will go out of scope before the `completion` closure can be called.
  385 +
  386 +#### Applying an ImageFilter
  387 +
  388 +```swift
  389 +let downloader = ImageDownloader()
  390 +let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/image/jpeg")!)
  391 +let filter = AspectScaledToFillSizeCircleFilter(size: CGSize(width: 100.0, height: 100.0))
  392 +
  393 +downloader.download(urlRequest, filter: filter) { response in
  394 + print(response.request)
  395 + print(response.response)
  396 + debugPrint(response.result)
  397 +
  398 + if let image = response.result.value {
  399 + print(image)
  400 + }
  401 +}
  402 +```
  403 +
  404 +#### Authentication
  405 +
  406 +If your images are behind HTTP Basic Auth, you can append the `user:password:` or the `credential` to the `ImageDownloader` instance. The credentials will be applied to all future download requests.
  407 +
  408 +```swift
  409 +let downloader = ImageDownloader()
  410 +downloader.addAuthentication(user: "username", password: "password")
  411 +```
  412 +
  413 +#### Download Prioritization
  414 +
  415 +The `ImageDownloader` maintains an internal queue of pending download requests. Depending on your situation, you may want incoming downloads to be inserted at the front or the back of the queue. The `DownloadPrioritization` enumeration allows you to specify which behavior you would prefer.
  416 +
  417 +```swift
  418 +public enum DownloadPrioritization {
  419 + case fifo, lifo
  420 +}
  421 +```
  422 +
  423 +> The `ImageDownloader` is initialized with a `.fifo` queue by default.
  424 +
  425 +#### Image Caching
  426 +
  427 +The `ImageDownloader` uses a combination of an `URLCache` and `AutoPurgingImageCache` to create a very robust, high performance image caching system.
  428 +
  429 +##### URLCache
  430 +
  431 +The `URLCache` is used to cache all the original image content downloaded from the server. By default, it is initialized with a memory capacity of 20 MB and a disk capacity of 150 MB. This allows up to 150 MB of original image data to be stored on disk at any given time. While these defaults have been carefully set, it is very important to consider your application's needs and performance requirements and whether these values are right for you.
  432 +
  433 +> If you wish to disable this caching layer, create a custom `URLSessionConfiguration` with the `urlCache` property set to `nil` and use that configuration when initializing the `ImageDownloader`.
  434 +
  435 +##### Image Cache
  436 +
  437 +The `ImageCache` is used to cache all the potentially filtered image content after it has been downloaded from the server. This allows multiple variants of the same image to also be cached, rather than having to re-apply the image filters to the original image each time it is required. By default, an `AutoPurgingImageCache` is initialized with a memory capacity of 100 MB and a preferred memory usage after purge limit of 60 MB. This allows up to 100 MB of most recently accessed filtered image content to be stored in-memory at a given time.
  438 +
  439 +##### Setting Ideal Capacity Limits
  440 +
  441 +Determining the ideal the in-memory and on-disk capacity limits of the `URLCache` and `AutoPurgingImageCache` requires a bit of forethought. You must carefully consider your application's needs, and tailor the limits accordingly. By default, the combination of caches offers the following storage capacities:
  442 +
  443 +- 150 MB of on-disk storage
  444 +- 20 MB of in-memory original image data storage
  445 +- 100 MB of in-memory storage of filtered image content
  446 +- 60 MB preferred memory capacity after purge of filtered image content
  447 +
  448 +> If you do not use image filters, it is advised to set the memory capacity of the `URLCache` to zero to avoid storing the same content in-memory twice.
  449 +
  450 +#### Duplicate Downloads
  451 +
  452 +Sometimes application logic can end up attempting to download an image more than once before the initial download request is complete. Most often, this results in the image being downloaded more than once. AlamofireImage handles this case elegantly by merging the duplicate downloads. The image will only be downloaded once, yet both completion handlers will be called.
  453 +
  454 +##### Image Filter Reuse
  455 +
  456 +In addition to merging duplicate downloads, AlamofireImage can also merge duplicate image filters. If two image filters with the same identifier are attached to the same download, the image filter is only executed once and both completion handlers are called with the same resulting image. This can save large amounts of time and resources for computationally expensive filters such as ones leveraging CoreImage.
  457 +
  458 +##### Request Receipts
  459 +
  460 +Sometimes it is necessary to cancel an image download for various reasons. AlamofireImage can intelligently handle cancellation logic in the `ImageDownloader` by leveraging the `RequestReceipt` type along with the `cancelRequestForRequestReceipt` method. Each download request vends a `RequestReceipt` which can be later used to cancel the request.
  461 +
  462 +By cancelling the request through the `ImageDownloader` using the `RequestReceipt`, AlamofireImage is able to determine how to best handle the cancellation. The cancelled download will always receive a cancellation error, while duplicate downloads are allowed to complete. If the download is already active, it is allowed to complete even though the completion handler will be called with a cancellation error. This greatly improves performance of table and collection views displaying large amounts of images.
  463 +
  464 +> It is NOT recommended to directly call `cancel` on the `request` in the `RequestReceipt`. Doing so can lead to issues such as duplicate downloads never being allowed to complete.
  465 +
  466 +### UIImageView Extension
  467 +
  468 +The [UIImage Extensions](#uiimage-extensions), [Image Filters](#image-filters), [Image Cache](#image-cache) and [Image Downloader](#image-downloader) were all designed to be flexible and standalone, yet also to provide the foundation of the `UIImageView` extension. Due to the powerful support of these classes, protocols and extensions, the `UIImageView` APIs are concise, easy to use and contain a large amount of functionality.
  469 +
  470 +#### Setting Image with URL
  471 +
  472 +Setting the image with a URL will asynchronously download the image and set it once the request is finished.
  473 +
  474 +```swift
  475 +let imageView = UIImageView(frame: frame)
  476 +let url = URL(string: "https://httpbin.org/image/png")!
  477 +
  478 +imageView.af_setImage(withURL: url)
  479 +```
  480 +
  481 +> If the image is cached locally, the image is set immediately.
  482 +
  483 +#### Placeholder Images
  484 +
  485 +By specifying a placeholder image, the image view uses the placeholder image until the remote image is downloaded.
  486 +
  487 +```swift
  488 +let imageView = UIImageView(frame: frame)
  489 +let url = URL(string: "https://httpbin.org/image/png")!
  490 +let placeholderImage = UIImage(named: "placeholder")!
  491 +
  492 +imageView.af_setImage(withURL: url, placeholderImage: placeholderImage)
  493 +```
  494 +
  495 +> If the remote image is cached locally, the placeholder image is never set.
  496 +
  497 +#### Image Filters
  498 +
  499 +If an image filter is specified, it is applied asynchronously after the remote image is downloaded. Once the filter execution is complete, the resulting image is set on the image view.
  500 +
  501 +```swift
  502 +let imageView = UIImageView(frame: frame)
  503 +
  504 +let url = URL(string: "https://httpbin.org/image/png")!
  505 +let placeholderImage = UIImage(named: "placeholder")!
  506 +
  507 +let filter = AspectScaledToFillSizeWithRoundedCornersFilter(
  508 + size: imageView.frame.size,
  509 + radius: 20.0
  510 +)
  511 +
  512 +imageView.af_setImage(
  513 + withURL: url,
  514 + placeholderImage: placeholderImage,
  515 + filter: filter
  516 +)
  517 +```
  518 +
  519 +> If the remote image with the applied filter is cached locally, the image is set immediately.
  520 +
  521 +#### Image Transitions
  522 +
  523 +By default, there is no image transition animation when setting the image on the image view. If you wish to add a cross dissolve or flip-from-bottom animation, then specify an `ImageTransition` with the preferred duration.
  524 +
  525 +```swift
  526 +let imageView = UIImageView(frame: frame)
  527 +
  528 +let url = URL(string: "https://httpbin.org/image/png")!
  529 +let placeholderImage = UIImage(named: "placeholder")!
  530 +
  531 +let filter = AspectScaledToFillSizeWithRoundedCornersFilter(
  532 + size: imageView.frame.size,
  533 + radius: 20.0
  534 +)
  535 +
  536 +imageView.af_setImage(
  537 + withURL: url,
  538 + placeholderImage: placeholderImage,
  539 + filter: filter,
  540 + imageTransition: .crossDissolve(0.2)
  541 +)
  542 +```
  543 +
  544 +> If the remote image is cached locally, the image transition is ignored.
  545 +
  546 +#### Image Downloader
  547 +
  548 +The `UIImageView` extension is powered by the default `ImageDownloader` instance. To customize cache capacities, download priorities, request cache policies, timeout durations, etc., please refer to the [Image Downloader](#image-downloader) documentation.
  549 +
  550 +##### Authentication
  551 +
  552 +If an image requires and authentication credential from the `UIImageView` extension, it can be provided as follows:
  553 +
  554 +```swift
  555 +ImageDownloader.default.addAuthentication(user: "user", password: "password")
  556 +```
  557 +
  558 +---
  559 +
  560 +## Credits
  561 +
  562 +Alamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases.
  563 +
  564 +### Security Disclosure
  565 +
  566 +If you believe you have identified a security vulnerability with AlamofireImage, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker.
  567 +
  568 +## Donations
  569 +
  570 +The [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially register as a federal non-profit organization. Registering will allow us members to gain some legal protections and also allow us to put donations to use, tax free. Donating to the ASF will enable us to:
  571 +
  572 +* Pay our legal fees to register as a federal non-profit organization
  573 +* Pay our yearly legal fees to keep the non-profit in good status
  574 +* Pay for our mail servers to help us stay on top of all questions and security issues
  575 +* Potentially fund test servers to make it easier for us to test the edge cases
  576 +* Potentially fund developers to work on one of our projects full-time
  577 +
  578 +The community adoption of the ASF libraries has been amazing. We are greatly humbled by your enthusiasm around the projects, and want to continue to do everything we can to move the needle forward. With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members. If you use any of our libraries for work, see if your employers would be interested in donating. Our initial goal is to raise $1000 to get all our legal ducks in a row and kickstart this campaign. Any amount you can donate today to help us reach our goal would be greatly appreciated.
  579 +
  580 +<a href='https://pledgie.com/campaigns/31474'><img alt='Click here to lend your support to: Alamofire Software Foundation and make a donation at pledgie.com !' src='https://pledgie.com/campaigns/31474.png?skin_name=chrome' border='0' ></a>
  581 +
  582 +## License
  583 +
  584 +AlamofireImage is released under the MIT license. See LICENSE for details.
ParentAssistant/Pods/AlamofireImage/Source/AFIError.swift 0 → 100644
@@ -0,0 +1,63 @@ @@ -0,0 +1,63 @@
  1 +//
  2 +// AFIError.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Foundation
  26 +
  27 +/// `AFIError` is the error type returned by AlamofireImage.
  28 +///
  29 +/// - requestCancelled: The request was explicitly cancelled.
  30 +/// - imageSerializationFailed: Response data could not be serialized into an image.
  31 +public enum AFIError: Error {
  32 + case requestCancelled
  33 + case imageSerializationFailed
  34 +}
  35 +
  36 +// MARK: - Error Booleans
  37 +
  38 +extension AFIError {
  39 + /// Returns `true` if the `AFIError` is a request cancellation error, `false` otherwise.
  40 + public var isRequestCancelledError: Bool {
  41 + if case .requestCancelled = self { return true }
  42 + return false
  43 + }
  44 +
  45 + /// Returns `true` if the `AFIError` is an image serialization error, `false` otherwise.
  46 + public var isImageSerializationFailedError: Bool {
  47 + if case .imageSerializationFailed = self { return true }
  48 + return false
  49 + }
  50 +}
  51 +
  52 +// MARK: - Error Descriptions
  53 +
  54 +extension AFIError: LocalizedError {
  55 + public var errorDescription: String? {
  56 + switch self {
  57 + case .requestCancelled:
  58 + return "The request was explicitly cancelled."
  59 + case .imageSerializationFailed:
  60 + return "Response data could not be serialized into an image."
  61 + }
  62 + }
  63 +}
ParentAssistant/Pods/AlamofireImage/Source/Image.swift 0 → 100644
@@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
  1 +//
  2 +// Image.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Foundation
  26 +
  27 +#if os(iOS) || os(tvOS) || os(watchOS)
  28 +import UIKit
  29 +public typealias Image = UIImage
  30 +#elseif os(macOS)
  31 +import Cocoa
  32 +public typealias Image = NSImage
  33 +#endif
ParentAssistant/Pods/AlamofireImage/Source/ImageCache.swift 0 → 100644
@@ -0,0 +1,345 @@ @@ -0,0 +1,345 @@
  1 +//
  2 +// ImageCache.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Alamofire
  26 +import Foundation
  27 +
  28 +#if os(iOS) || os(tvOS) || os(watchOS)
  29 +import UIKit
  30 +#elseif os(macOS)
  31 +import Cocoa
  32 +#endif
  33 +
  34 +// MARK: ImageCache
  35 +
  36 +/// The `ImageCache` protocol defines a set of APIs for adding, removing and fetching images from a cache.
  37 +public protocol ImageCache {
  38 + /// Adds the image to the cache with the given identifier.
  39 + func add(_ image: Image, withIdentifier identifier: String)
  40 +
  41 + /// Removes the image from the cache matching the given identifier.
  42 + func removeImage(withIdentifier identifier: String) -> Bool
  43 +
  44 + /// Removes all images stored in the cache.
  45 + @discardableResult
  46 + func removeAllImages() -> Bool
  47 +
  48 + /// Returns the image in the cache associated with the given identifier.
  49 + func image(withIdentifier identifier: String) -> Image?
  50 +}
  51 +
  52 +/// The `ImageRequestCache` protocol extends the `ImageCache` protocol by adding methods for adding, removing and
  53 +/// fetching images from a cache given an `URLRequest` and additional identifier.
  54 +public protocol ImageRequestCache: ImageCache {
  55 + /// Adds the image to the cache using an identifier created from the request and identifier.
  56 + func add(_ image: Image, for request: URLRequest, withIdentifier identifier: String?)
  57 +
  58 + /// Removes the image from the cache using an identifier created from the request and identifier.
  59 + func removeImage(for request: URLRequest, withIdentifier identifier: String?) -> Bool
  60 +
  61 + /// Returns the image from the cache associated with an identifier created from the request and identifier.
  62 + func image(for request: URLRequest, withIdentifier identifier: String?) -> Image?
  63 +}
  64 +
  65 +// MARK: -
  66 +
  67 +/// The `AutoPurgingImageCache` in an in-memory image cache used to store images up to a given memory capacity. When
  68 +/// the memory capacity is reached, the image cache is sorted by last access date, then the oldest image is continuously
  69 +/// purged until the preferred memory usage after purge is met. Each time an image is accessed through the cache, the
  70 +/// internal access date of the image is updated.
  71 +open class AutoPurgingImageCache: ImageRequestCache {
  72 + class CachedImage {
  73 + let image: Image
  74 + let identifier: String
  75 + let totalBytes: UInt64
  76 + var lastAccessDate: Date
  77 +
  78 + init(_ image: Image, identifier: String) {
  79 + self.image = image
  80 + self.identifier = identifier
  81 + self.lastAccessDate = Date()
  82 +
  83 + self.totalBytes = {
  84 + #if os(iOS) || os(tvOS) || os(watchOS)
  85 + let size = CGSize(width: image.size.width * image.scale, height: image.size.height * image.scale)
  86 + #elseif os(macOS)
  87 + let size = CGSize(width: image.size.width, height: image.size.height)
  88 + #endif
  89 +
  90 + let bytesPerPixel: CGFloat = 4.0
  91 + let bytesPerRow = size.width * bytesPerPixel
  92 + let totalBytes = UInt64(bytesPerRow) * UInt64(size.height)
  93 +
  94 + return totalBytes
  95 + }()
  96 + }
  97 +
  98 + func accessImage() -> Image {
  99 + lastAccessDate = Date()
  100 + return image
  101 + }
  102 + }
  103 +
  104 + // MARK: Properties
  105 +
  106 + /// The current total memory usage in bytes of all images stored within the cache.
  107 + open var memoryUsage: UInt64 {
  108 + var memoryUsage: UInt64 = 0
  109 + synchronizationQueue.sync { memoryUsage = self.currentMemoryUsage }
  110 +
  111 + return memoryUsage
  112 + }
  113 +
  114 + /// The total memory capacity of the cache in bytes.
  115 + open let memoryCapacity: UInt64
  116 +
  117 + /// The preferred memory usage after purge in bytes. During a purge, images will be purged until the memory
  118 + /// capacity drops below this limit.
  119 + open let preferredMemoryUsageAfterPurge: UInt64
  120 +
  121 + private let synchronizationQueue: DispatchQueue
  122 + private var cachedImages: [String: CachedImage]
  123 + private var currentMemoryUsage: UInt64
  124 +
  125 + // MARK: Initialization
  126 +
  127 + /// Initialies the `AutoPurgingImageCache` instance with the given memory capacity and preferred memory usage
  128 + /// after purge limit.
  129 + ///
  130 + /// Please note, the memory capacity must always be greater than or equal to the preferred memory usage after purge.
  131 + ///
  132 + /// - parameter memoryCapacity: The total memory capacity of the cache in bytes. `100 MB` by default.
  133 + /// - parameter preferredMemoryUsageAfterPurge: The preferred memory usage after purge in bytes. `60 MB` by default.
  134 + ///
  135 + /// - returns: The new `AutoPurgingImageCache` instance.
  136 + public init(memoryCapacity: UInt64 = 100_000_000, preferredMemoryUsageAfterPurge: UInt64 = 60_000_000) {
  137 + self.memoryCapacity = memoryCapacity
  138 + self.preferredMemoryUsageAfterPurge = preferredMemoryUsageAfterPurge
  139 +
  140 + precondition(
  141 + memoryCapacity >= preferredMemoryUsageAfterPurge,
  142 + "The `memoryCapacity` must be greater than or equal to `preferredMemoryUsageAfterPurge`"
  143 + )
  144 +
  145 + self.cachedImages = [:]
  146 + self.currentMemoryUsage = 0
  147 +
  148 + self.synchronizationQueue = {
  149 + let name = String(format: "org.alamofire.autopurgingimagecache-%08x%08x", arc4random(), arc4random())
  150 + return DispatchQueue(label: name, attributes: .concurrent)
  151 + }()
  152 +
  153 + #if os(iOS) || os(tvOS)
  154 + NotificationCenter.default.addObserver(
  155 + self,
  156 + selector: #selector(AutoPurgingImageCache.removeAllImages),
  157 + name: Notification.Name.UIApplicationDidReceiveMemoryWarning,
  158 + object: nil
  159 + )
  160 + #endif
  161 + }
  162 +
  163 + deinit {
  164 + NotificationCenter.default.removeObserver(self)
  165 + }
  166 +
  167 + // MARK: Add Image to Cache
  168 +
  169 + /// Adds the image to the cache using an identifier created from the request and optional identifier.
  170 + ///
  171 + /// - parameter image: The image to add to the cache.
  172 + /// - parameter request: The request used to generate the image's unique identifier.
  173 + /// - parameter identifier: The additional identifier to append to the image's unique identifier.
  174 + open func add(_ image: Image, for request: URLRequest, withIdentifier identifier: String? = nil) {
  175 + let requestIdentifier = imageCacheKey(for: request, withIdentifier: identifier)
  176 + add(image, withIdentifier: requestIdentifier)
  177 + }
  178 +
  179 + /// Adds the image to the cache with the given identifier.
  180 + ///
  181 + /// - parameter image: The image to add to the cache.
  182 + /// - parameter identifier: The identifier to use to uniquely identify the image.
  183 + open func add(_ image: Image, withIdentifier identifier: String) {
  184 + synchronizationQueue.async(flags: [.barrier]) {
  185 + let cachedImage = CachedImage(image, identifier: identifier)
  186 +
  187 + if let previousCachedImage = self.cachedImages[identifier] {
  188 + self.currentMemoryUsage -= previousCachedImage.totalBytes
  189 + }
  190 +
  191 + self.cachedImages[identifier] = cachedImage
  192 + self.currentMemoryUsage += cachedImage.totalBytes
  193 + }
  194 +
  195 + synchronizationQueue.async(flags: [.barrier]) {
  196 + if self.currentMemoryUsage > self.memoryCapacity {
  197 + let bytesToPurge = self.currentMemoryUsage - self.preferredMemoryUsageAfterPurge
  198 +
  199 + var sortedImages = self.cachedImages.map { $1 }
  200 +
  201 + sortedImages.sort {
  202 + let date1 = $0.lastAccessDate
  203 + let date2 = $1.lastAccessDate
  204 +
  205 + return date1.timeIntervalSince(date2) < 0.0
  206 + }
  207 +
  208 + var bytesPurged = UInt64(0)
  209 +
  210 + for cachedImage in sortedImages {
  211 + self.cachedImages.removeValue(forKey: cachedImage.identifier)
  212 + bytesPurged += cachedImage.totalBytes
  213 +
  214 + if bytesPurged >= bytesToPurge {
  215 + break
  216 + }
  217 + }
  218 +
  219 + self.currentMemoryUsage -= bytesPurged
  220 + }
  221 + }
  222 + }
  223 +
  224 + // MARK: Remove Image from Cache
  225 +
  226 + /// Removes the image from the cache using an identifier created from the request and optional identifier.
  227 + ///
  228 + /// - parameter request: The request used to generate the image's unique identifier.
  229 + /// - parameter identifier: The additional identifier to append to the image's unique identifier.
  230 + ///
  231 + /// - returns: `true` if the image was removed, `false` otherwise.
  232 + @discardableResult
  233 + open func removeImage(for request: URLRequest, withIdentifier identifier: String?) -> Bool {
  234 + let requestIdentifier = imageCacheKey(for: request, withIdentifier: identifier)
  235 + return removeImage(withIdentifier: requestIdentifier)
  236 + }
  237 +
  238 + /// Removes all images from the cache created from the request.
  239 + ///
  240 + /// - parameter request: The request used to generate the image's unique identifier.
  241 + ///
  242 + /// - returns: `true` if any images were removed, `false` otherwise.
  243 + @discardableResult
  244 + open func removeImages(matching request: URLRequest) -> Bool {
  245 + let requestIdentifier = imageCacheKey(for: request, withIdentifier: nil)
  246 + var removed = false
  247 +
  248 + synchronizationQueue.sync {
  249 + for key in self.cachedImages.keys where key.hasPrefix(requestIdentifier) {
  250 + if let cachedImage = self.cachedImages.removeValue(forKey: key) {
  251 + self.currentMemoryUsage -= cachedImage.totalBytes
  252 + removed = true
  253 + }
  254 + }
  255 + }
  256 +
  257 + return removed
  258 + }
  259 +
  260 + /// Removes the image from the cache matching the given identifier.
  261 + ///
  262 + /// - parameter identifier: The unique identifier for the image.
  263 + ///
  264 + /// - returns: `true` if the image was removed, `false` otherwise.
  265 + @discardableResult
  266 + open func removeImage(withIdentifier identifier: String) -> Bool {
  267 + var removed = false
  268 +
  269 + synchronizationQueue.sync {
  270 + if let cachedImage = self.cachedImages.removeValue(forKey: identifier) {
  271 + self.currentMemoryUsage -= cachedImage.totalBytes
  272 + removed = true
  273 + }
  274 + }
  275 +
  276 + return removed
  277 + }
  278 +
  279 + /// Removes all images stored in the cache.
  280 + ///
  281 + /// - returns: `true` if images were removed from the cache, `false` otherwise.
  282 + @discardableResult @objc
  283 + open func removeAllImages() -> Bool {
  284 + var removed = false
  285 +
  286 + synchronizationQueue.sync {
  287 + if !self.cachedImages.isEmpty {
  288 + self.cachedImages.removeAll()
  289 + self.currentMemoryUsage = 0
  290 +
  291 + removed = true
  292 + }
  293 + }
  294 +
  295 + return removed
  296 + }
  297 +
  298 + // MARK: Fetch Image from Cache
  299 +
  300 + /// Returns the image from the cache associated with an identifier created from the request and optional identifier.
  301 + ///
  302 + /// - parameter request: The request used to generate the image's unique identifier.
  303 + /// - parameter identifier: The additional identifier to append to the image's unique identifier.
  304 + ///
  305 + /// - returns: The image if it is stored in the cache, `nil` otherwise.
  306 + open func image(for request: URLRequest, withIdentifier identifier: String? = nil) -> Image? {
  307 + let requestIdentifier = imageCacheKey(for: request, withIdentifier: identifier)
  308 + return image(withIdentifier: requestIdentifier)
  309 + }
  310 +
  311 + /// Returns the image in the cache associated with the given identifier.
  312 + ///
  313 + /// - parameter identifier: The unique identifier for the image.
  314 + ///
  315 + /// - returns: The image if it is stored in the cache, `nil` otherwise.
  316 + open func image(withIdentifier identifier: String) -> Image? {
  317 + var image: Image?
  318 +
  319 + synchronizationQueue.sync {
  320 + if let cachedImage = self.cachedImages[identifier] {
  321 + image = cachedImage.accessImage()
  322 + }
  323 + }
  324 +
  325 + return image
  326 + }
  327 +
  328 + // MARK: Image Cache Keys
  329 +
  330 + /// Returns the unique image cache key for the specified request and additional identifier.
  331 + ///
  332 + /// - parameter request: The request.
  333 + /// - parameter identifier: The additional identifier.
  334 + ///
  335 + /// - returns: The unique image cache key.
  336 + open func imageCacheKey(for request: URLRequest, withIdentifier identifier: String?) -> String {
  337 + var key = request.url?.absoluteString ?? ""
  338 +
  339 + if let identifier = identifier {
  340 + key += "-\(identifier)"
  341 + }
  342 +
  343 + return key
  344 + }
  345 +}
ParentAssistant/Pods/AlamofireImage/Source/ImageDownloader.swift 0 → 100644
@@ -0,0 +1,559 @@ @@ -0,0 +1,559 @@
  1 +//
  2 +// ImageDownloader.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Alamofire
  26 +import Foundation
  27 +
  28 +#if os(iOS) || os(tvOS) || os(watchOS)
  29 +import UIKit
  30 +#elseif os(macOS)
  31 +import Cocoa
  32 +#endif
  33 +
  34 +/// The `RequestReceipt` is an object vended by the `ImageDownloader` when starting a download request. It can be used
  35 +/// to cancel active requests running on the `ImageDownloader` session. As a general rule, image download requests
  36 +/// should be cancelled using the `RequestReceipt` instead of calling `cancel` directly on the `request` itself. The
  37 +/// `ImageDownloader` is optimized to handle duplicate request scenarios as well as pending versus active downloads.
  38 +open class RequestReceipt {
  39 + /// The download request created by the `ImageDownloader`.
  40 + open let request: Request
  41 +
  42 + /// The unique identifier for the image filters and completion handlers when duplicate requests are made.
  43 + open let receiptID: String
  44 +
  45 + init(request: Request, receiptID: String) {
  46 + self.request = request
  47 + self.receiptID = receiptID
  48 + }
  49 +}
  50 +
  51 +// MARK: -
  52 +
  53 +/// The `ImageDownloader` class is responsible for downloading images in parallel on a prioritized queue. Incoming
  54 +/// downloads are added to the front or back of the queue depending on the download prioritization. Each downloaded
  55 +/// image is cached in the underlying `NSURLCache` as well as the in-memory image cache that supports image filters.
  56 +/// By default, any download request with a cached image equivalent in the image cache will automatically be served the
  57 +/// cached image representation. Additional advanced features include supporting multiple image filters and completion
  58 +/// handlers for a single request.
  59 +open class ImageDownloader {
  60 + /// The completion handler closure used when an image download completes.
  61 + public typealias CompletionHandler = (DataResponse<Image>) -> Void
  62 +
  63 + /// The progress handler closure called periodically during an image download.
  64 + public typealias ProgressHandler = DataRequest.ProgressHandler
  65 +
  66 + // MARK: Helper Types
  67 +
  68 + /// Defines the order prioritization of incoming download requests being inserted into the queue.
  69 + ///
  70 + /// - fifo: All incoming downloads are added to the back of the queue.
  71 + /// - lifo: All incoming downloads are added to the front of the queue.
  72 + public enum DownloadPrioritization {
  73 + case fifo, lifo
  74 + }
  75 +
  76 + class ResponseHandler {
  77 + let urlID: String
  78 + let handlerID: String
  79 + let request: DataRequest
  80 + var operations: [(receiptID: String, filter: ImageFilter?, completion: CompletionHandler?)]
  81 +
  82 + init(
  83 + request: DataRequest,
  84 + handlerID: String,
  85 + receiptID: String,
  86 + filter: ImageFilter?,
  87 + completion: CompletionHandler?)
  88 + {
  89 + self.request = request
  90 + self.urlID = ImageDownloader.urlIdentifier(for: request.request!)
  91 + self.handlerID = handlerID
  92 + self.operations = [(receiptID: receiptID, filter: filter, completion: completion)]
  93 + }
  94 + }
  95 +
  96 + // MARK: Properties
  97 +
  98 + /// The image cache used to store all downloaded images in.
  99 + open let imageCache: ImageRequestCache?
  100 +
  101 + /// The credential used for authenticating each download request.
  102 + open private(set) var credential: URLCredential?
  103 +
  104 + /// Response serializer used to convert the image data to UIImage.
  105 + public var imageResponseSerializer = DataRequest.imageResponseSerializer()
  106 +
  107 + /// The underlying Alamofire `Manager` instance used to handle all download requests.
  108 + open let sessionManager: SessionManager
  109 +
  110 + let downloadPrioritization: DownloadPrioritization
  111 + let maximumActiveDownloads: Int
  112 +
  113 + var activeRequestCount = 0
  114 + var queuedRequests: [Request] = []
  115 + var responseHandlers: [String: ResponseHandler] = [:]
  116 +
  117 + private let synchronizationQueue: DispatchQueue = {
  118 + let name = String(format: "org.alamofire.imagedownloader.synchronizationqueue-%08x%08x", arc4random(), arc4random())
  119 + return DispatchQueue(label: name)
  120 + }()
  121 +
  122 + private let responseQueue: DispatchQueue = {
  123 + let name = String(format: "org.alamofire.imagedownloader.responsequeue-%08x%08x", arc4random(), arc4random())
  124 + return DispatchQueue(label: name, attributes: .concurrent)
  125 + }()
  126 +
  127 + // MARK: Initialization
  128 +
  129 + /// The default instance of `ImageDownloader` initialized with default values.
  130 + open static let `default` = ImageDownloader()
  131 +
  132 + /// Creates a default `URLSessionConfiguration` with common usage parameter values.
  133 + ///
  134 + /// - returns: The default `URLSessionConfiguration` instance.
  135 + open class func defaultURLSessionConfiguration() -> URLSessionConfiguration {
  136 + let configuration = URLSessionConfiguration.default
  137 +
  138 + configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
  139 + configuration.httpShouldSetCookies = true
  140 + configuration.httpShouldUsePipelining = false
  141 +
  142 + configuration.requestCachePolicy = .useProtocolCachePolicy
  143 + configuration.allowsCellularAccess = true
  144 + configuration.timeoutIntervalForRequest = 60
  145 +
  146 + configuration.urlCache = ImageDownloader.defaultURLCache()
  147 +
  148 + return configuration
  149 + }
  150 +
  151 + /// Creates a default `URLCache` with common usage parameter values.
  152 + ///
  153 + /// - returns: The default `URLCache` instance.
  154 + open class func defaultURLCache() -> URLCache {
  155 + return URLCache(
  156 + memoryCapacity: 20 * 1024 * 1024, // 20 MB
  157 + diskCapacity: 150 * 1024 * 1024, // 150 MB
  158 + diskPath: "org.alamofire.imagedownloader"
  159 + )
  160 + }
  161 +
  162 + /// Initializes the `ImageDownloader` instance with the given configuration, download prioritization, maximum active
  163 + /// download count and image cache.
  164 + ///
  165 + /// - parameter configuration: The `URLSessionConfiguration` to use to create the underlying Alamofire
  166 + /// `SessionManager` instance.
  167 + /// - parameter downloadPrioritization: The download prioritization of the download queue. `.fifo` by default.
  168 + /// - parameter maximumActiveDownloads: The maximum number of active downloads allowed at any given time.
  169 + /// - parameter imageCache: The image cache used to store all downloaded images in.
  170 + ///
  171 + /// - returns: The new `ImageDownloader` instance.
  172 + public init(
  173 + configuration: URLSessionConfiguration = ImageDownloader.defaultURLSessionConfiguration(),
  174 + downloadPrioritization: DownloadPrioritization = .fifo,
  175 + maximumActiveDownloads: Int = 4,
  176 + imageCache: ImageRequestCache? = AutoPurgingImageCache())
  177 + {
  178 + self.sessionManager = SessionManager(configuration: configuration)
  179 + self.sessionManager.startRequestsImmediately = false
  180 +
  181 + self.downloadPrioritization = downloadPrioritization
  182 + self.maximumActiveDownloads = maximumActiveDownloads
  183 + self.imageCache = imageCache
  184 + }
  185 +
  186 + /// Initializes the `ImageDownloader` instance with the given session manager, download prioritization, maximum
  187 + /// active download count and image cache.
  188 + ///
  189 + /// - parameter sessionManager: The Alamofire `SessionManager` instance to handle all download requests.
  190 + /// - parameter downloadPrioritization: The download prioritization of the download queue. `.fifo` by default.
  191 + /// - parameter maximumActiveDownloads: The maximum number of active downloads allowed at any given time.
  192 + /// - parameter imageCache: The image cache used to store all downloaded images in.
  193 + ///
  194 + /// - returns: The new `ImageDownloader` instance.
  195 + public init(
  196 + sessionManager: SessionManager,
  197 + downloadPrioritization: DownloadPrioritization = .fifo,
  198 + maximumActiveDownloads: Int = 4,
  199 + imageCache: ImageRequestCache? = AutoPurgingImageCache())
  200 + {
  201 + self.sessionManager = sessionManager
  202 + self.sessionManager.startRequestsImmediately = false
  203 +
  204 + self.downloadPrioritization = downloadPrioritization
  205 + self.maximumActiveDownloads = maximumActiveDownloads
  206 + self.imageCache = imageCache
  207 + }
  208 +
  209 + // MARK: Authentication
  210 +
  211 + /// Associates an HTTP Basic Auth credential with all future download requests.
  212 + ///
  213 + /// - parameter user: The user.
  214 + /// - parameter password: The password.
  215 + /// - parameter persistence: The URL credential persistence. `.forSession` by default.
  216 + open func addAuthentication(
  217 + user: String,
  218 + password: String,
  219 + persistence: URLCredential.Persistence = .forSession)
  220 + {
  221 + let credential = URLCredential(user: user, password: password, persistence: persistence)
  222 + addAuthentication(usingCredential: credential)
  223 + }
  224 +
  225 + /// Associates the specified credential with all future download requests.
  226 + ///
  227 + /// - parameter credential: The credential.
  228 + open func addAuthentication(usingCredential credential: URLCredential) {
  229 + synchronizationQueue.sync {
  230 + self.credential = credential
  231 + }
  232 + }
  233 +
  234 + // MARK: Download
  235 +
  236 + /// Creates a download request using the internal Alamofire `SessionManager` instance for the specified URL request.
  237 + ///
  238 + /// If the same download request is already in the queue or currently being downloaded, the filter and completion
  239 + /// handler are appended to the already existing request. Once the request completes, all filters and completion
  240 + /// handlers attached to the request are executed in the order they were added. Additionally, any filters attached
  241 + /// to the request with the same identifiers are only executed once. The resulting image is then passed into each
  242 + /// completion handler paired with the filter.
  243 + ///
  244 + /// You should not attempt to directly cancel the `request` inside the request receipt since other callers may be
  245 + /// relying on the completion of that request. Instead, you should call `cancelRequestForRequestReceipt` with the
  246 + /// returned request receipt to allow the `ImageDownloader` to optimize the cancellation on behalf of all active
  247 + /// callers.
  248 + ///
  249 + /// - parameter urlRequest: The URL request.
  250 + /// - parameter receiptID: The `identifier` for the `RequestReceipt` returned. Defaults to a new, randomly
  251 + /// generated UUID.
  252 + /// - parameter filter: The image filter to apply to the image after the download is complete. Defaults
  253 + /// to `nil`.
  254 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request.
  255 + /// Defaults to `nil`.
  256 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  257 + /// - parameter completion: The closure called when the download request is complete. Defaults to `nil`.
  258 + ///
  259 + /// - returns: The request receipt for the download request if available. `nil` if the image is stored in the image
  260 + /// cache and the URL request cache policy allows the cache to be used.
  261 + @discardableResult
  262 + open func download(
  263 + _ urlRequest: URLRequestConvertible,
  264 + receiptID: String = UUID().uuidString,
  265 + filter: ImageFilter? = nil,
  266 + progress: ProgressHandler? = nil,
  267 + progressQueue: DispatchQueue = DispatchQueue.main,
  268 + completion: CompletionHandler?)
  269 + -> RequestReceipt?
  270 + {
  271 + var request: DataRequest!
  272 +
  273 + synchronizationQueue.sync {
  274 + // 1) Append the filter and completion handler to a pre-existing request if it already exists
  275 + let urlID = ImageDownloader.urlIdentifier(for: urlRequest)
  276 +
  277 + if let responseHandler = self.responseHandlers[urlID] {
  278 + responseHandler.operations.append((receiptID: receiptID, filter: filter, completion: completion))
  279 + request = responseHandler.request
  280 + return
  281 + }
  282 +
  283 + // 2) Attempt to load the image from the image cache if the cache policy allows it
  284 + if let request = urlRequest.urlRequest {
  285 + switch request.cachePolicy {
  286 + case .useProtocolCachePolicy, .returnCacheDataElseLoad, .returnCacheDataDontLoad:
  287 + if let image = self.imageCache?.image(for: request, withIdentifier: filter?.identifier) {
  288 + DispatchQueue.main.async {
  289 + let response = DataResponse<Image>(
  290 + request: urlRequest.urlRequest,
  291 + response: nil,
  292 + data: nil,
  293 + result: .success(image)
  294 + )
  295 +
  296 + completion?(response)
  297 + }
  298 +
  299 + return
  300 + }
  301 + default:
  302 + break
  303 + }
  304 + }
  305 +
  306 + // 3) Create the request and set up authentication, validation and response serialization
  307 + request = self.sessionManager.request(urlRequest)
  308 +
  309 + if let credential = self.credential {
  310 + request.authenticate(usingCredential: credential)
  311 + }
  312 +
  313 + request.validate()
  314 +
  315 + if let progress = progress {
  316 + request.downloadProgress(queue: progressQueue, closure: progress)
  317 + }
  318 +
  319 + // Generate a unique handler id to check whether the active request has changed while downloading
  320 + let handlerID = UUID().uuidString
  321 +
  322 + request.response(
  323 + queue: self.responseQueue,
  324 + responseSerializer: imageResponseSerializer,
  325 + completionHandler: { [weak self] response in
  326 + guard let strongSelf = self, let request = response.request else { return }
  327 +
  328 + defer {
  329 + strongSelf.safelyDecrementActiveRequestCount()
  330 + strongSelf.safelyStartNextRequestIfNecessary()
  331 + }
  332 +
  333 + // Early out if the request has changed out from under us
  334 + let handler = strongSelf.safelyFetchResponseHandler(withURLIdentifier: urlID)
  335 + guard handler?.handlerID == handlerID else { return }
  336 +
  337 + guard let responseHandler = strongSelf.safelyRemoveResponseHandler(withURLIdentifier: urlID) else {
  338 + return
  339 + }
  340 +
  341 + switch response.result {
  342 + case .success(let image):
  343 + var filteredImages: [String: Image] = [:]
  344 +
  345 + for (_, filter, completion) in responseHandler.operations {
  346 + var filteredImage: Image
  347 +
  348 + if let filter = filter {
  349 + if let alreadyFilteredImage = filteredImages[filter.identifier] {
  350 + filteredImage = alreadyFilteredImage
  351 + } else {
  352 + filteredImage = filter.filter(image)
  353 + filteredImages[filter.identifier] = filteredImage
  354 + }
  355 + } else {
  356 + filteredImage = image
  357 + }
  358 +
  359 + strongSelf.imageCache?.add(filteredImage, for: request, withIdentifier: filter?.identifier)
  360 +
  361 + DispatchQueue.main.async {
  362 + let response = DataResponse<Image>(
  363 + request: response.request,
  364 + response: response.response,
  365 + data: response.data,
  366 + result: .success(filteredImage),
  367 + timeline: response.timeline
  368 + )
  369 +
  370 + completion?(response)
  371 + }
  372 + }
  373 + case .failure:
  374 + for (_, _, completion) in responseHandler.operations {
  375 + DispatchQueue.main.async { completion?(response) }
  376 + }
  377 + }
  378 + }
  379 + )
  380 +
  381 + // 4) Store the response handler for use when the request completes
  382 + let responseHandler = ResponseHandler(
  383 + request: request,
  384 + handlerID: handlerID,
  385 + receiptID: receiptID,
  386 + filter: filter,
  387 + completion: completion
  388 + )
  389 +
  390 + self.responseHandlers[urlID] = responseHandler
  391 +
  392 + // 5) Either start the request or enqueue it depending on the current active request count
  393 + if self.isActiveRequestCountBelowMaximumLimit() {
  394 + self.start(request)
  395 + } else {
  396 + self.enqueue(request)
  397 + }
  398 + }
  399 +
  400 + if let request = request {
  401 + return RequestReceipt(request: request, receiptID: receiptID)
  402 + }
  403 +
  404 + return nil
  405 + }
  406 +
  407 + /// Creates a download request using the internal Alamofire `SessionManager` instance for each specified URL request.
  408 + ///
  409 + /// For each request, if the same download request is already in the queue or currently being downloaded, the
  410 + /// filter and completion handler are appended to the already existing request. Once the request completes, all
  411 + /// filters and completion handlers attached to the request are executed in the order they were added.
  412 + /// Additionally, any filters attached to the request with the same identifiers are only executed once. The
  413 + /// resulting image is then passed into each completion handler paired with the filter.
  414 + ///
  415 + /// You should not attempt to directly cancel any of the `request`s inside the request receipts array since other
  416 + /// callers may be relying on the completion of that request. Instead, you should call
  417 + /// `cancelRequestForRequestReceipt` with the returned request receipt to allow the `ImageDownloader` to optimize
  418 + /// the cancellation on behalf of all active callers.
  419 + ///
  420 + /// - parameter urlRequests: The URL requests.
  421 + /// - parameter filter The image filter to apply to the image after each download is complete.
  422 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request. Defaults
  423 + /// to `nil`.
  424 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  425 + /// - parameter completion: The closure called when each download request is complete.
  426 + ///
  427 + /// - returns: The request receipts for the download requests if available. If an image is stored in the image
  428 + /// cache and the URL request cache policy allows the cache to be used, a receipt will not be returned
  429 + /// for that request.
  430 + @discardableResult
  431 + open func download(
  432 + _ urlRequests: [URLRequestConvertible],
  433 + filter: ImageFilter? = nil,
  434 + progress: ProgressHandler? = nil,
  435 + progressQueue: DispatchQueue = DispatchQueue.main,
  436 + completion: CompletionHandler? = nil)
  437 + -> [RequestReceipt]
  438 + {
  439 + #if swift(>=4.1)
  440 + return urlRequests.compactMap {
  441 + download($0, filter: filter, progress: progress, progressQueue: progressQueue, completion: completion)
  442 + }
  443 + #else
  444 + return urlRequests.flatMap {
  445 + download($0, filter: filter, progress: progress, progressQueue: progressQueue, completion: completion)
  446 + }
  447 + #endif
  448 + }
  449 +
  450 + /// Cancels the request in the receipt by removing the response handler and cancelling the request if necessary.
  451 + ///
  452 + /// If the request is pending in the queue, it will be cancelled if no other response handlers are registered with
  453 + /// the request. If the request is currently executing or is already completed, the response handler is removed and
  454 + /// will not be called.
  455 + ///
  456 + /// - parameter requestReceipt: The request receipt to cancel.
  457 + open func cancelRequest(with requestReceipt: RequestReceipt) {
  458 + synchronizationQueue.sync {
  459 + let urlID = ImageDownloader.urlIdentifier(for: requestReceipt.request.request!)
  460 + guard let responseHandler = self.responseHandlers[urlID] else { return }
  461 +
  462 + if let index = responseHandler.operations.index(where: { $0.receiptID == requestReceipt.receiptID }) {
  463 + let operation = responseHandler.operations.remove(at: index)
  464 +
  465 + let response: DataResponse<Image> = {
  466 + let urlRequest = requestReceipt.request.request
  467 + let error = AFIError.requestCancelled
  468 +
  469 + return DataResponse(request: urlRequest, response: nil, data: nil, result: .failure(error))
  470 + }()
  471 +
  472 + DispatchQueue.main.async { operation.completion?(response) }
  473 + }
  474 +
  475 + if responseHandler.operations.isEmpty && requestReceipt.request.task?.state == .suspended {
  476 + requestReceipt.request.cancel()
  477 + self.responseHandlers.removeValue(forKey: urlID)
  478 + }
  479 + }
  480 + }
  481 +
  482 + // MARK: Internal - Thread-Safe Request Methods
  483 +
  484 + func safelyFetchResponseHandler(withURLIdentifier urlIdentifier: String) -> ResponseHandler? {
  485 + var responseHandler: ResponseHandler?
  486 +
  487 + synchronizationQueue.sync {
  488 + responseHandler = self.responseHandlers[urlIdentifier]
  489 + }
  490 +
  491 + return responseHandler
  492 + }
  493 +
  494 + func safelyRemoveResponseHandler(withURLIdentifier identifier: String) -> ResponseHandler? {
  495 + var responseHandler: ResponseHandler?
  496 +
  497 + synchronizationQueue.sync {
  498 + responseHandler = self.responseHandlers.removeValue(forKey: identifier)
  499 + }
  500 +
  501 + return responseHandler
  502 + }
  503 +
  504 + func safelyStartNextRequestIfNecessary() {
  505 + synchronizationQueue.sync {
  506 + guard self.isActiveRequestCountBelowMaximumLimit() else { return }
  507 +
  508 + while !self.queuedRequests.isEmpty {
  509 + if let request = self.dequeue(), request.task?.state == .suspended {
  510 + self.start(request)
  511 + break
  512 + }
  513 + }
  514 + }
  515 + }
  516 +
  517 + func safelyDecrementActiveRequestCount() {
  518 + self.synchronizationQueue.sync {
  519 + if self.activeRequestCount > 0 {
  520 + self.activeRequestCount -= 1
  521 + }
  522 + }
  523 + }
  524 +
  525 + // MARK: Internal - Non Thread-Safe Request Methods
  526 +
  527 + func start(_ request: Request) {
  528 + request.resume()
  529 + activeRequestCount += 1
  530 + }
  531 +
  532 + func enqueue(_ request: Request) {
  533 + switch downloadPrioritization {
  534 + case .fifo:
  535 + queuedRequests.append(request)
  536 + case .lifo:
  537 + queuedRequests.insert(request, at: 0)
  538 + }
  539 + }
  540 +
  541 + @discardableResult
  542 + func dequeue() -> Request? {
  543 + var request: Request?
  544 +
  545 + if !queuedRequests.isEmpty {
  546 + request = queuedRequests.removeFirst()
  547 + }
  548 +
  549 + return request
  550 + }
  551 +
  552 + func isActiveRequestCountBelowMaximumLimit() -> Bool {
  553 + return activeRequestCount < maximumActiveDownloads
  554 + }
  555 +
  556 + static func urlIdentifier(for urlRequest: URLRequestConvertible) -> String {
  557 + return urlRequest.urlRequest?.url?.absoluteString ?? ""
  558 + }
  559 +}
ParentAssistant/Pods/AlamofireImage/Source/ImageFilter.swift 0 → 100644
@@ -0,0 +1,423 @@ @@ -0,0 +1,423 @@
  1 +//
  2 +// ImageFilter.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Foundation
  26 +
  27 +#if os(iOS) || os(tvOS) || os(watchOS)
  28 +import UIKit
  29 +#elseif os(macOS)
  30 +import Cocoa
  31 +#endif
  32 +
  33 +// MARK: ImageFilter
  34 +
  35 +/// The `ImageFilter` protocol defines properties for filtering an image as well as identification of the filter.
  36 +public protocol ImageFilter {
  37 + /// A closure used to create an alternative representation of the given image.
  38 + var filter: (Image) -> Image { get }
  39 +
  40 + /// The string used to uniquely identify the filter operation.
  41 + var identifier: String { get }
  42 +}
  43 +
  44 +extension ImageFilter {
  45 + /// The unique identifier for any `ImageFilter` type.
  46 + public var identifier: String { return "\(type(of: self))" }
  47 +}
  48 +
  49 +// MARK: - Sizable
  50 +
  51 +/// The `Sizable` protocol defines a size property intended for use with `ImageFilter` types.
  52 +public protocol Sizable {
  53 + /// The size of the type.
  54 + var size: CGSize { get }
  55 +}
  56 +
  57 +extension ImageFilter where Self: Sizable {
  58 + /// The unique idenitifier for an `ImageFilter` conforming to the `Sizable` protocol.
  59 + public var identifier: String {
  60 + let width = Int64(size.width.rounded())
  61 + let height = Int64(size.height.rounded())
  62 +
  63 + return "\(type(of: self))-size:(\(width)x\(height))"
  64 + }
  65 +}
  66 +
  67 +// MARK: - Roundable
  68 +
  69 +/// The `Roundable` protocol defines a radius property intended for use with `ImageFilter` types.
  70 +public protocol Roundable {
  71 + /// The radius of the type.
  72 + var radius: CGFloat { get }
  73 +}
  74 +
  75 +extension ImageFilter where Self: Roundable {
  76 + /// The unique idenitifier for an `ImageFilter` conforming to the `Roundable` protocol.
  77 + public var identifier: String {
  78 + let radius = Int64(self.radius.rounded())
  79 + return "\(type(of: self))-radius:(\(radius))"
  80 + }
  81 +}
  82 +
  83 +// MARK: - DynamicImageFilter
  84 +
  85 +/// The `DynamicImageFilter` class simplifies custom image filter creation by using a trailing closure initializer.
  86 +public struct DynamicImageFilter: ImageFilter {
  87 + /// The string used to uniquely identify the image filter operation.
  88 + public let identifier: String
  89 +
  90 + /// A closure used to create an alternative representation of the given image.
  91 + public let filter: (Image) -> Image
  92 +
  93 + /// Initializes the `DynamicImageFilter` instance with the specified identifier and filter closure.
  94 + ///
  95 + /// - parameter identifier: The unique identifier of the filter.
  96 + /// - parameter filter: A closure used to create an alternative representation of the given image.
  97 + ///
  98 + /// - returns: The new `DynamicImageFilter` instance.
  99 + public init(_ identifier: String, filter: @escaping (Image) -> Image) {
  100 + self.identifier = identifier
  101 + self.filter = filter
  102 + }
  103 +}
  104 +
  105 +// MARK: - CompositeImageFilter
  106 +
  107 +/// The `CompositeImageFilter` protocol defines an additional `filters` property to support multiple composite filters.
  108 +public protocol CompositeImageFilter: ImageFilter {
  109 + /// The image filters to apply to the image in sequential order.
  110 + var filters: [ImageFilter] { get }
  111 +}
  112 +
  113 +public extension CompositeImageFilter {
  114 + /// The unique idenitifier for any `CompositeImageFilter` type.
  115 + var identifier: String {
  116 + return filters.map { $0.identifier }.joined(separator: "_")
  117 + }
  118 +
  119 + /// The filter closure for any `CompositeImageFilter` type.
  120 + var filter: (Image) -> Image {
  121 + return { image in
  122 + return self.filters.reduce(image) { $1.filter($0) }
  123 + }
  124 + }
  125 +}
  126 +
  127 +// MARK: - DynamicCompositeImageFilter
  128 +
  129 +/// The `DynamicCompositeImageFilter` class is a composite image filter based on a specified array of filters.
  130 +public struct DynamicCompositeImageFilter: CompositeImageFilter {
  131 + /// The image filters to apply to the image in sequential order.
  132 + public let filters: [ImageFilter]
  133 +
  134 + /// Initializes the `DynamicCompositeImageFilter` instance with the given filters.
  135 + ///
  136 + /// - parameter filters: The filters taking part in the composite image filter.
  137 + ///
  138 + /// - returns: The new `DynamicCompositeImageFilter` instance.
  139 + public init(_ filters: [ImageFilter]) {
  140 + self.filters = filters
  141 + }
  142 +
  143 + /// Initializes the `DynamicCompositeImageFilter` instance with the given filters.
  144 + ///
  145 + /// - parameter filters: The filters taking part in the composite image filter.
  146 + ///
  147 + /// - returns: The new `DynamicCompositeImageFilter` instance.
  148 + public init(_ filters: ImageFilter...) {
  149 + self.init(filters)
  150 + }
  151 +}
  152 +
  153 +#if os(iOS) || os(tvOS) || os(watchOS)
  154 +
  155 +// MARK: - Single Pass Image Filters (iOS, tvOS and watchOS only) -
  156 +
  157 +/// Scales an image to a specified size.
  158 +public struct ScaledToSizeFilter: ImageFilter, Sizable {
  159 + /// The size of the filter.
  160 + public let size: CGSize
  161 +
  162 + /// Initializes the `ScaledToSizeFilter` instance with the given size.
  163 + ///
  164 + /// - parameter size: The size.
  165 + ///
  166 + /// - returns: The new `ScaledToSizeFilter` instance.
  167 + public init(size: CGSize) {
  168 + self.size = size
  169 + }
  170 +
  171 + /// The filter closure used to create the modified representation of the given image.
  172 + public var filter: (Image) -> Image {
  173 + return { image in
  174 + return image.af_imageScaled(to: self.size)
  175 + }
  176 + }
  177 +}
  178 +
  179 +// MARK: -
  180 +
  181 +/// Scales an image from the center while maintaining the aspect ratio to fit within a specified size.
  182 +public struct AspectScaledToFitSizeFilter: ImageFilter, Sizable {
  183 + /// The size of the filter.
  184 + public let size: CGSize
  185 +
  186 + /// Initializes the `AspectScaledToFitSizeFilter` instance with the given size.
  187 + ///
  188 + /// - parameter size: The size.
  189 + ///
  190 + /// - returns: The new `AspectScaledToFitSizeFilter` instance.
  191 + public init(size: CGSize) {
  192 + self.size = size
  193 + }
  194 +
  195 + /// The filter closure used to create the modified representation of the given image.
  196 + public var filter: (Image) -> Image {
  197 + return { image in
  198 + return image.af_imageAspectScaled(toFit: self.size)
  199 + }
  200 + }
  201 +}
  202 +
  203 +// MARK: -
  204 +
  205 +/// Scales an image from the center while maintaining the aspect ratio to fill a specified size. Any pixels that fall
  206 +/// outside the specified size are clipped.
  207 +public struct AspectScaledToFillSizeFilter: ImageFilter, Sizable {
  208 + /// The size of the filter.
  209 + public let size: CGSize
  210 +
  211 + /// Initializes the `AspectScaledToFillSizeFilter` instance with the given size.
  212 + ///
  213 + /// - parameter size: The size.
  214 + ///
  215 + /// - returns: The new `AspectScaledToFillSizeFilter` instance.
  216 + public init(size: CGSize) {
  217 + self.size = size
  218 + }
  219 +
  220 + /// The filter closure used to create the modified representation of the given image.
  221 + public var filter: (Image) -> Image {
  222 + return { image in
  223 + return image.af_imageAspectScaled(toFill: self.size)
  224 + }
  225 + }
  226 +}
  227 +
  228 +// MARK: -
  229 +
  230 +/// Rounds the corners of an image to the specified radius.
  231 +public struct RoundedCornersFilter: ImageFilter, Roundable {
  232 + /// The radius of the filter.
  233 + public let radius: CGFloat
  234 +
  235 + /// Whether to divide the radius by the image scale.
  236 + public let divideRadiusByImageScale: Bool
  237 +
  238 + /// Initializes the `RoundedCornersFilter` instance with the given radius.
  239 + ///
  240 + /// - parameter radius: The radius.
  241 + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the
  242 + /// image has the same resolution for all screen scales such as @1x, @2x and
  243 + /// @3x (i.e. single image from web server). Set to `false` for images loaded
  244 + /// from an asset catalog with varying resolutions for each screen scale.
  245 + /// `false` by default.
  246 + ///
  247 + /// - returns: The new `RoundedCornersFilter` instance.
  248 + public init(radius: CGFloat, divideRadiusByImageScale: Bool = false) {
  249 + self.radius = radius
  250 + self.divideRadiusByImageScale = divideRadiusByImageScale
  251 + }
  252 +
  253 + /// The filter closure used to create the modified representation of the given image.
  254 + public var filter: (Image) -> Image {
  255 + return { image in
  256 + return image.af_imageRounded(
  257 + withCornerRadius: self.radius,
  258 + divideRadiusByImageScale: self.divideRadiusByImageScale
  259 + )
  260 + }
  261 + }
  262 +
  263 + /// The unique idenitifier for an `ImageFilter` conforming to the `Roundable` protocol.
  264 + public var identifier: String {
  265 + let radius = Int64(self.radius.rounded())
  266 + return "\(type(of: self))-radius:(\(radius))-divided:(\(divideRadiusByImageScale))"
  267 + }
  268 +}
  269 +
  270 +// MARK: -
  271 +
  272 +/// Rounds the corners of an image into a circle.
  273 +public struct CircleFilter: ImageFilter {
  274 + /// Initializes the `CircleFilter` instance.
  275 + ///
  276 + /// - returns: The new `CircleFilter` instance.
  277 + public init() {}
  278 +
  279 + /// The filter closure used to create the modified representation of the given image.
  280 + public var filter: (Image) -> Image {
  281 + return { image in
  282 + return image.af_imageRoundedIntoCircle()
  283 + }
  284 + }
  285 +}
  286 +
  287 +// MARK: -
  288 +
  289 +#if os(iOS) || os(tvOS)
  290 +
  291 +/// The `CoreImageFilter` protocol defines `parameters`, `filterName` properties used by CoreImage.
  292 +@available(iOS 9.0, *)
  293 +public protocol CoreImageFilter: ImageFilter {
  294 + /// The filter name of the CoreImage filter.
  295 + var filterName: String { get }
  296 +
  297 + /// The image filter parameters passed to CoreImage.
  298 + var parameters: [String: Any] { get }
  299 +}
  300 +
  301 +@available(iOS 9.0, *)
  302 +public extension ImageFilter where Self: CoreImageFilter {
  303 + /// The filter closure used to create the modified representation of the given image.
  304 + public var filter: (Image) -> Image {
  305 + return { image in
  306 + return image.af_imageFiltered(withCoreImageFilter: self.filterName, parameters: self.parameters) ?? image
  307 + }
  308 + }
  309 +
  310 + /// The unique idenitifier for an `ImageFilter` conforming to the `CoreImageFilter` protocol.
  311 + public var identifier: String { return "\(type(of: self))-parameters:(\(self.parameters))" }
  312 +}
  313 +
  314 +/// Blurs an image using a `CIGaussianBlur` filter with the specified blur radius.
  315 +@available(iOS 9.0, *)
  316 +public struct BlurFilter: ImageFilter, CoreImageFilter {
  317 + /// The filter name.
  318 + public let filterName = "CIGaussianBlur"
  319 +
  320 + /// The image filter parameters passed to CoreImage.
  321 + public let parameters: [String: Any]
  322 +
  323 + /// Initializes the `BlurFilter` instance with the given blur radius.
  324 + ///
  325 + /// - parameter blurRadius: The blur radius.
  326 + ///
  327 + /// - returns: The new `BlurFilter` instance.
  328 + public init(blurRadius: UInt = 10) {
  329 + self.parameters = ["inputRadius": blurRadius]
  330 + }
  331 +}
  332 +
  333 +#endif
  334 +
  335 +// MARK: - Composite Image Filters (iOS, tvOS and watchOS only) -
  336 +
  337 +/// Scales an image to a specified size, then rounds the corners to the specified radius.
  338 +public struct ScaledToSizeWithRoundedCornersFilter: CompositeImageFilter {
  339 + /// Initializes the `ScaledToSizeWithRoundedCornersFilter` instance with the given size and radius.
  340 + ///
  341 + /// - parameter size: The size.
  342 + /// - parameter radius: The radius.
  343 + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the
  344 + /// image has the same resolution for all screen scales such as @1x, @2x and
  345 + /// @3x (i.e. single image from web server). Set to `false` for images loaded
  346 + /// from an asset catalog with varying resolutions for each screen scale.
  347 + /// `false` by default.
  348 + ///
  349 + /// - returns: The new `ScaledToSizeWithRoundedCornersFilter` instance.
  350 + public init(size: CGSize, radius: CGFloat, divideRadiusByImageScale: Bool = false) {
  351 + self.filters = [
  352 + ScaledToSizeFilter(size: size),
  353 + RoundedCornersFilter(radius: radius, divideRadiusByImageScale: divideRadiusByImageScale)
  354 + ]
  355 + }
  356 +
  357 + /// The image filters to apply to the image in sequential order.
  358 + public let filters: [ImageFilter]
  359 +}
  360 +
  361 +// MARK: -
  362 +
  363 +/// Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the
  364 +/// corners to the specified radius.
  365 +public struct AspectScaledToFillSizeWithRoundedCornersFilter: CompositeImageFilter {
  366 + /// Initializes the `AspectScaledToFillSizeWithRoundedCornersFilter` instance with the given size and radius.
  367 + ///
  368 + /// - parameter size: The size.
  369 + /// - parameter radius: The radius.
  370 + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the
  371 + /// image has the same resolution for all screen scales such as @1x, @2x and
  372 + /// @3x (i.e. single image from web server). Set to `false` for images loaded
  373 + /// from an asset catalog with varying resolutions for each screen scale.
  374 + /// `false` by default.
  375 + ///
  376 + /// - returns: The new `AspectScaledToFillSizeWithRoundedCornersFilter` instance.
  377 + public init(size: CGSize, radius: CGFloat, divideRadiusByImageScale: Bool = false) {
  378 + self.filters = [
  379 + AspectScaledToFillSizeFilter(size: size),
  380 + RoundedCornersFilter(radius: radius, divideRadiusByImageScale: divideRadiusByImageScale)
  381 + ]
  382 + }
  383 +
  384 + /// The image filters to apply to the image in sequential order.
  385 + public let filters: [ImageFilter]
  386 +}
  387 +
  388 +// MARK: -
  389 +
  390 +/// Scales an image to a specified size, then rounds the corners into a circle.
  391 +public struct ScaledToSizeCircleFilter: CompositeImageFilter {
  392 + /// Initializes the `ScaledToSizeCircleFilter` instance with the given size.
  393 + ///
  394 + /// - parameter size: The size.
  395 + ///
  396 + /// - returns: The new `ScaledToSizeCircleFilter` instance.
  397 + public init(size: CGSize) {
  398 + self.filters = [ScaledToSizeFilter(size: size), CircleFilter()]
  399 + }
  400 +
  401 + /// The image filters to apply to the image in sequential order.
  402 + public let filters: [ImageFilter]
  403 +}
  404 +
  405 +// MARK: -
  406 +
  407 +/// Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the
  408 +/// corners into a circle.
  409 +public struct AspectScaledToFillSizeCircleFilter: CompositeImageFilter {
  410 + /// Initializes the `AspectScaledToFillSizeCircleFilter` instance with the given size.
  411 + ///
  412 + /// - parameter size: The size.
  413 + ///
  414 + /// - returns: The new `AspectScaledToFillSizeCircleFilter` instance.
  415 + public init(size: CGSize) {
  416 + self.filters = [AspectScaledToFillSizeFilter(size: size), CircleFilter()]
  417 + }
  418 +
  419 + /// The image filters to apply to the image in sequential order.
  420 + public let filters: [ImageFilter]
  421 +}
  422 +
  423 +#endif
ParentAssistant/Pods/AlamofireImage/Source/Request+AlamofireImage.swift 0 → 100644
@@ -0,0 +1,327 @@ @@ -0,0 +1,327 @@
  1 +//
  2 +// Request+AlamofireImage.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Alamofire
  26 +import Foundation
  27 +
  28 +#if os(iOS) || os(tvOS)
  29 +import UIKit
  30 +#elseif os(watchOS)
  31 +import UIKit
  32 +import WatchKit
  33 +#elseif os(macOS)
  34 +import Cocoa
  35 +#endif
  36 +
  37 +extension DataRequest {
  38 + static var acceptableImageContentTypes: Set<String> = [
  39 + "image/tiff",
  40 + "image/jpeg",
  41 + "image/gif",
  42 + "image/png",
  43 + "image/ico",
  44 + "image/x-icon",
  45 + "image/bmp",
  46 + "image/x-bmp",
  47 + "image/x-xbitmap",
  48 + "image/x-ms-bmp",
  49 + "image/x-win-bitmap"
  50 + ]
  51 +
  52 + static let streamImageInitialBytePattern = Data(bytes: [255, 216]) // 0xffd8
  53 +
  54 + /// Adds the content types specified to the list of acceptable images content types for validation.
  55 + ///
  56 + /// - parameter contentTypes: The additional content types.
  57 + public class func addAcceptableImageContentTypes(_ contentTypes: Set<String>) {
  58 + DataRequest.acceptableImageContentTypes.formUnion(contentTypes)
  59 + }
  60 +
  61 + // MARK: - iOS, tvOS and watchOS
  62 +
  63 +#if os(iOS) || os(tvOS) || os(watchOS)
  64 +
  65 + /// Creates a response serializer that returns an image initialized from the response data using the specified
  66 + /// image options.
  67 + ///
  68 + /// - parameter imageScale: The scale factor used when interpreting the image data to construct
  69 + /// `responseImage`. Specifying a scale factor of 1.0 results in an image whose
  70 + /// size matches the pixel-based dimensions of the image. Applying a different
  71 + /// scale factor changes the size of the image as reported by the size property.
  72 + /// `Screen.scale` by default.
  73 + /// - parameter inflateResponseImage: Whether to automatically inflate response image data for compressed formats
  74 + /// (such as PNG or JPEG). Enabling this can significantly improve drawing
  75 + /// performance as it allows a bitmap representation to be constructed in the
  76 + /// background rather than on the main thread. `true` by default.
  77 + ///
  78 + /// - returns: An image response serializer.
  79 + public class func imageResponseSerializer(
  80 + imageScale: CGFloat = DataRequest.imageScale,
  81 + inflateResponseImage: Bool = true)
  82 + -> DataResponseSerializer<Image>
  83 + {
  84 + return DataResponseSerializer { request, response, data, error in
  85 + let result = serializeResponseData(response: response, data: data, error: error)
  86 +
  87 + guard case let .success(data) = result else { return .failure(result.error!) }
  88 +
  89 + do {
  90 + try DataRequest.validateContentType(for: request, response: response)
  91 +
  92 + let image = try DataRequest.image(from: data, withImageScale: imageScale)
  93 + if inflateResponseImage { image.af_inflate() }
  94 +
  95 + return .success(image)
  96 + } catch {
  97 + return .failure(error)
  98 + }
  99 + }
  100 + }
  101 +
  102 + /// Adds a response handler to be called once the request has finished.
  103 + ///
  104 + /// - parameter imageScale: The scale factor used when interpreting the image data to construct
  105 + /// `responseImage`. Specifying a scale factor of 1.0 results in an image whose
  106 + /// size matches the pixel-based dimensions of the image. Applying a different
  107 + /// scale factor changes the size of the image as reported by the size property.
  108 + /// This is set to the value of scale of the main screen by default, which
  109 + /// automatically scales images for retina displays, for instance.
  110 + /// `Screen.scale` by default.
  111 + /// - parameter inflateResponseImage: Whether to automatically inflate response image data for compressed formats
  112 + /// (such as PNG or JPEG). Enabling this can significantly improve drawing
  113 + /// performance as it allows a bitmap representation to be constructed in the
  114 + /// background rather than on the main thread. `true` by default.
  115 + /// - parameter queue: The queue on which the completion handler is dispatched. `nil` by default,
  116 + /// which results in using `DispatchQueue.main`.
  117 + /// - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 4
  118 + /// arguments: the URL request, the URL response, if one was received, the image,
  119 + /// if one could be created from the URL response and data, and any error produced
  120 + /// while creating the image.
  121 + ///
  122 + /// - returns: The request.
  123 + @discardableResult
  124 + public func responseImage(
  125 + imageScale: CGFloat = DataRequest.imageScale,
  126 + inflateResponseImage: Bool = true,
  127 + queue: DispatchQueue? = nil,
  128 + completionHandler: @escaping (DataResponse<Image>) -> Void)
  129 + -> Self
  130 + {
  131 + return response(
  132 + queue: queue,
  133 + responseSerializer: DataRequest.imageResponseSerializer(
  134 + imageScale: imageScale,
  135 + inflateResponseImage: inflateResponseImage
  136 + ),
  137 + completionHandler: completionHandler
  138 + )
  139 + }
  140 +
  141 + /// Sets a closure to be called periodically during the lifecycle of the request as data is read from the server
  142 + /// and converted into images.
  143 + ///
  144 + /// - parameter imageScale: The scale factor used when interpreting the image data to construct
  145 + /// `responseImage`. Specifying a scale factor of 1.0 results in an image whose
  146 + /// size matches the pixel-based dimensions of the image. Applying a different
  147 + /// scale factor changes the size of the image as reported by the size property.
  148 + /// This is set to the value of scale of the main screen by default, which
  149 + /// automatically scales images for retina displays, for instance.
  150 + /// `Screen.scale` by default.
  151 + /// - parameter inflateResponseImage: Whether to automatically inflate response image data for compressed formats
  152 + /// (such as PNG or JPEG). Enabling this can significantly improve drawing
  153 + /// performance as it allows a bitmap representation to be constructed in the
  154 + /// background rather than on the main thread. `true` by default.
  155 + /// - parameter completionHandler: A closure to be executed when the request has new image. The closure takes 1
  156 + /// argument: the image, if one could be created from the data.
  157 + ///
  158 + /// - returns: The request.
  159 + @discardableResult
  160 + public func streamImage(
  161 + imageScale: CGFloat = DataRequest.imageScale,
  162 + inflateResponseImage: Bool = true,
  163 + completionHandler: @escaping (Image) -> Void)
  164 + -> Self
  165 + {
  166 + var imageData = Data()
  167 +
  168 + return stream { chunkData in
  169 + if chunkData.starts(with: DataRequest.streamImageInitialBytePattern) {
  170 + imageData = Data()
  171 + }
  172 +
  173 + imageData.append(chunkData)
  174 +
  175 + if let image = DataRequest.serializeImage(from: imageData) {
  176 + completionHandler(image)
  177 + }
  178 + }
  179 + }
  180 +
  181 + private class func serializeImage(
  182 + from data: Data,
  183 + imageScale: CGFloat = DataRequest.imageScale,
  184 + inflateResponseImage: Bool = true)
  185 + -> UIImage?
  186 + {
  187 + guard data.count > 0 else { return nil }
  188 +
  189 + do {
  190 + let image = try DataRequest.image(from: data, withImageScale: imageScale)
  191 + if inflateResponseImage { image.af_inflate() }
  192 +
  193 + return image
  194 + } catch {
  195 + return nil
  196 + }
  197 + }
  198 +
  199 + private class func image(from data: Data, withImageScale imageScale: CGFloat) throws -> UIImage {
  200 + if let image = UIImage.af_threadSafeImage(with: data, scale: imageScale) {
  201 + return image
  202 + }
  203 +
  204 + throw AFIError.imageSerializationFailed
  205 + }
  206 +
  207 + public class var imageScale: CGFloat {
  208 + #if os(iOS) || os(tvOS)
  209 + return UIScreen.main.scale
  210 + #elseif os(watchOS)
  211 + return WKInterfaceDevice.current().screenScale
  212 + #endif
  213 + }
  214 +
  215 +#elseif os(macOS)
  216 +
  217 + // MARK: - macOS
  218 +
  219 + /// Creates a response serializer that returns an image initialized from the response data.
  220 + ///
  221 + /// - returns: An image response serializer.
  222 + public class func imageResponseSerializer() -> DataResponseSerializer<Image> {
  223 + return DataResponseSerializer { request, response, data, error in
  224 + let result = serializeResponseData(response: response, data: data, error: error)
  225 +
  226 + guard case let .success(data) = result else { return .failure(result.error!) }
  227 +
  228 + do {
  229 + try DataRequest.validateContentType(for: request, response: response)
  230 + } catch {
  231 + return .failure(error)
  232 + }
  233 +
  234 + guard let bitmapImage = NSBitmapImageRep(data: data) else {
  235 + return .failure(AFIError.imageSerializationFailed)
  236 + }
  237 +
  238 + let image = NSImage(size: NSSize(width: bitmapImage.pixelsWide, height: bitmapImage.pixelsHigh))
  239 + image.addRepresentation(bitmapImage)
  240 +
  241 + return .success(image)
  242 + }
  243 + }
  244 +
  245 + /// Adds a response handler to be called once the request has finished.
  246 + ///
  247 + /// - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 4
  248 + /// arguments: the URL request, the URL response, if one was received, the image, if
  249 + /// one could be created from the URL response and data, and any error produced while
  250 + /// creating the image.
  251 + /// - parameter queue: The queue on which the completion handler is dispatched. `nil` by default,
  252 + /// which results in using `DispatchQueue.main`.
  253 + ///
  254 + /// - returns: The request.
  255 + @discardableResult
  256 + public func responseImage(
  257 + queue: DispatchQueue? = nil,
  258 + completionHandler: @escaping (DataResponse<Image>) -> Void)
  259 + -> Self {
  260 + return response(
  261 + queue: queue,
  262 + responseSerializer: DataRequest.imageResponseSerializer(),
  263 + completionHandler: completionHandler
  264 + )
  265 + }
  266 +
  267 + /// Sets a closure to be called periodically during the lifecycle of the request as data is read from the server
  268 + /// and converted into images.
  269 + ///
  270 + /// - parameter completionHandler: A closure to be executed when the request has new image. The closure takes 1
  271 + /// argument: the image, if one could be created from the data.
  272 + ///
  273 + /// - returns: The request.
  274 + @discardableResult
  275 + public func streamImage(completionHandler: @escaping (Image) -> Void) -> Self {
  276 + var imageData = Data()
  277 +
  278 + return stream { chunkData in
  279 + if chunkData.starts(with: DataRequest.streamImageInitialBytePattern) {
  280 + imageData = Data()
  281 + }
  282 +
  283 + imageData.append(chunkData)
  284 +
  285 + if let image = DataRequest.serializeImage(from: imageData) {
  286 + completionHandler(image)
  287 + }
  288 + }
  289 + }
  290 +
  291 + private class func serializeImage(from data: Data) -> NSImage? {
  292 + guard data.count > 0 else { return nil }
  293 + guard let bitmapImage = NSBitmapImageRep(data: data) else { return nil }
  294 +
  295 + let image = NSImage(size: NSSize(width: bitmapImage.pixelsWide, height: bitmapImage.pixelsHigh))
  296 + image.addRepresentation(bitmapImage)
  297 +
  298 + return image
  299 + }
  300 +
  301 +#endif
  302 +
  303 + // MARK: - Content Type Validation
  304 +
  305 + /// Returns whether the content type of the response matches one of the acceptable content types.
  306 + ///
  307 + /// - parameter request: The request.
  308 + /// - parameter response: The server response.
  309 + ///
  310 + /// - throws: An `AFError` response validation failure when an error is encountered.
  311 + public class func validateContentType(for request: URLRequest?, response: HTTPURLResponse?) throws {
  312 + if let url = request?.url, url.isFileURL { return }
  313 +
  314 + guard let mimeType = response?.mimeType else {
  315 + let contentTypes = Array(DataRequest.acceptableImageContentTypes)
  316 + throw AFError.responseValidationFailed(reason: .missingContentType(acceptableContentTypes: contentTypes))
  317 + }
  318 +
  319 + guard DataRequest.acceptableImageContentTypes.contains(mimeType) else {
  320 + let contentTypes = Array(DataRequest.acceptableImageContentTypes)
  321 +
  322 + throw AFError.responseValidationFailed(
  323 + reason: .unacceptableContentType(acceptableContentTypes: contentTypes, responseContentType: mimeType)
  324 + )
  325 + }
  326 + }
  327 +}
ParentAssistant/Pods/AlamofireImage/Source/UIButton+AlamofireImage.swift 0 → 100644
@@ -0,0 +1,473 @@ @@ -0,0 +1,473 @@
  1 +//
  2 +// UIButton+AlamofireImage.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Alamofire
  26 +import Foundation
  27 +
  28 +#if os(iOS) || os(tvOS)
  29 +
  30 +import UIKit
  31 +
  32 +extension UIButton {
  33 +
  34 + // MARK: - Private - AssociatedKeys
  35 +
  36 + private struct AssociatedKey {
  37 + static var imageDownloader = "af_UIButton.ImageDownloader"
  38 + static var sharedImageDownloader = "af_UIButton.SharedImageDownloader"
  39 + static var imageReceipts = "af_UIButton.ImageReceipts"
  40 + static var backgroundImageReceipts = "af_UIButton.BackgroundImageReceipts"
  41 + }
  42 +
  43 + // MARK: - Properties
  44 +
  45 + /// The instance image downloader used to download all images. If this property is `nil`, the `UIButton` will
  46 + /// fallback on the `af_sharedImageDownloader` for all downloads. The most common use case for needing to use a
  47 + /// custom instance image downloader is when images are behind different basic auth credentials.
  48 + public var af_imageDownloader: ImageDownloader? {
  49 + get {
  50 + return objc_getAssociatedObject(self, &AssociatedKey.imageDownloader) as? ImageDownloader
  51 + }
  52 + set {
  53 + objc_setAssociatedObject(self, &AssociatedKey.imageDownloader, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  54 + }
  55 + }
  56 +
  57 + /// The shared image downloader used to download all images. By default, this is the default `ImageDownloader`
  58 + /// instance backed with an `AutoPurgingImageCache` which automatically evicts images from the cache when the memory
  59 + /// capacity is reached or memory warning notifications occur. The shared image downloader is only used if the
  60 + /// `af_imageDownloader` is `nil`.
  61 + public class var af_sharedImageDownloader: ImageDownloader {
  62 + get {
  63 + guard let
  64 + downloader = objc_getAssociatedObject(self, &AssociatedKey.sharedImageDownloader) as? ImageDownloader
  65 + else {
  66 + return ImageDownloader.default
  67 + }
  68 +
  69 + return downloader
  70 + }
  71 + set {
  72 + objc_setAssociatedObject(self, &AssociatedKey.sharedImageDownloader, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  73 + }
  74 + }
  75 +
  76 + private var imageRequestReceipts: [UInt: RequestReceipt] {
  77 + get {
  78 + guard let
  79 + receipts = objc_getAssociatedObject(self, &AssociatedKey.imageReceipts) as? [UInt: RequestReceipt]
  80 + else {
  81 + return [:]
  82 + }
  83 +
  84 + return receipts
  85 + }
  86 + set {
  87 + objc_setAssociatedObject(self, &AssociatedKey.imageReceipts, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  88 + }
  89 + }
  90 +
  91 + private var backgroundImageRequestReceipts: [UInt: RequestReceipt] {
  92 + get {
  93 + guard let
  94 + receipts = objc_getAssociatedObject(self, &AssociatedKey.backgroundImageReceipts) as? [UInt: RequestReceipt]
  95 + else {
  96 + return [:]
  97 + }
  98 +
  99 + return receipts
  100 + }
  101 + set {
  102 + objc_setAssociatedObject(self, &AssociatedKey.backgroundImageReceipts, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  103 + }
  104 + }
  105 +
  106 + // MARK: - Image Downloads
  107 +
  108 + /// Asynchronously downloads an image from the specified URL and sets it once the request is finished.
  109 + ///
  110 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  111 + /// set immediately, and then the remote image will be set once the image request is finished.
  112 + ///
  113 + /// - parameter state: The control state of the button to set the image on.
  114 + /// - parameter url: The URL used for your image request.
  115 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the
  116 + /// image will not change its image until the image request finishes. Defaults
  117 + /// to `nil`.
  118 + /// - parameter filter: The image filter applied to the image after the image request is finished.
  119 + /// Defaults to `nil`.
  120 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request.
  121 + /// Defaults to `nil`.
  122 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  123 + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a
  124 + /// single response value containing either the image or the error that occurred. If
  125 + /// the image was returned from the image cache, the response will be `nil`. Defaults
  126 + /// to `nil`.
  127 + public func af_setImage(
  128 + for state: UIControlState,
  129 + url: URL,
  130 + placeholderImage: UIImage? = nil,
  131 + filter: ImageFilter? = nil,
  132 + progress: ImageDownloader.ProgressHandler? = nil,
  133 + progressQueue: DispatchQueue = DispatchQueue.main,
  134 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  135 + {
  136 + af_setImage(
  137 + for: state,
  138 + urlRequest: urlRequest(with: url),
  139 + placeholderImage: placeholderImage,
  140 + filter: filter,
  141 + progress: progress,
  142 + progressQueue: progressQueue,
  143 + completion: completion
  144 + )
  145 + }
  146 +
  147 + /// Asynchronously downloads an image from the specified URL request and sets it once the request is finished.
  148 + ///
  149 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  150 + /// set immediately, and then the remote image will be set once the image request is finished.
  151 + ///
  152 + /// - parameter state: The control state of the button to set the image on.
  153 + /// - parameter urlRequest: The URL request.
  154 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the
  155 + /// image will not change its image until the image request finishes. Defaults
  156 + /// to `nil`.
  157 + /// - parameter filter: The image filter applied to the image after the image request is finished.
  158 + /// Defaults to `nil`.
  159 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request.
  160 + /// Defaults to `nil`.
  161 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  162 + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a
  163 + /// single response value containing either the image or the error that occurred. If
  164 + /// the image was returned from the image cache, the response will be `nil`. Defaults
  165 + /// to `nil`.
  166 + public func af_setImage(
  167 + for state: UIControlState,
  168 + urlRequest: URLRequestConvertible,
  169 + placeholderImage: UIImage? = nil,
  170 + filter: ImageFilter? = nil,
  171 + progress: ImageDownloader.ProgressHandler? = nil,
  172 + progressQueue: DispatchQueue = DispatchQueue.main,
  173 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  174 + {
  175 + guard !isImageURLRequest(urlRequest, equalToActiveRequestURLForState: state) else {
  176 + let error = AFIError.requestCancelled
  177 + let response = DataResponse<UIImage>(request: nil, response: nil, data: nil, result: .failure(error))
  178 +
  179 + completion?(response)
  180 +
  181 + return
  182 + }
  183 +
  184 + af_cancelImageRequest(for: state)
  185 +
  186 + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader
  187 + let imageCache = imageDownloader.imageCache
  188 +
  189 + // Use the image from the image cache if it exists
  190 + if
  191 + let request = urlRequest.urlRequest,
  192 + let image = imageCache?.image(for: request, withIdentifier: filter?.identifier)
  193 + {
  194 + let response = DataResponse<UIImage>(
  195 + request: urlRequest.urlRequest,
  196 + response: nil,
  197 + data: nil,
  198 + result: .success(image)
  199 + )
  200 +
  201 + setImage(image, for: state)
  202 + completion?(response)
  203 +
  204 + return
  205 + }
  206 +
  207 + // Set the placeholder since we're going to have to download
  208 + if let placeholderImage = placeholderImage { setImage(placeholderImage, for: state) }
  209 +
  210 + // Generate a unique download id to check whether the active request has changed while downloading
  211 + let downloadID = UUID().uuidString
  212 +
  213 + // Download the image, then set the image for the control state
  214 + let requestReceipt = imageDownloader.download(
  215 + urlRequest,
  216 + receiptID: downloadID,
  217 + filter: filter,
  218 + progress: progress,
  219 + progressQueue: progressQueue,
  220 + completion: { [weak self] response in
  221 + guard
  222 + let strongSelf = self,
  223 + strongSelf.isImageURLRequest(response.request, equalToActiveRequestURLForState: state) &&
  224 + strongSelf.imageRequestReceipt(for: state)?.receiptID == downloadID
  225 + else {
  226 + completion?(response)
  227 + return
  228 + }
  229 +
  230 + if let image = response.result.value {
  231 + strongSelf.setImage(image, for: state)
  232 + }
  233 +
  234 + strongSelf.setImageRequestReceipt(nil, for: state)
  235 +
  236 + completion?(response)
  237 + }
  238 + )
  239 +
  240 + setImageRequestReceipt(requestReceipt, for: state)
  241 + }
  242 +
  243 + /// Cancels the active download request for the image, if one exists.
  244 + public func af_cancelImageRequest(for state: UIControlState) {
  245 + guard let receipt = imageRequestReceipt(for: state) else { return }
  246 +
  247 + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader
  248 + imageDownloader.cancelRequest(with: receipt)
  249 +
  250 + setImageRequestReceipt(nil, for: state)
  251 + }
  252 +
  253 + // MARK: - Background Image Downloads
  254 +
  255 + /// Asynchronously downloads an image from the specified URL and sets it once the request is finished.
  256 + ///
  257 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  258 + /// set immediately, and then the remote image will be set once the image request is finished.
  259 + ///
  260 + /// - parameter state: The control state of the button to set the image on.
  261 + /// - parameter url: The URL used for the image request.
  262 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the
  263 + /// background image will not change its image until the image request finishes.
  264 + /// Defaults to `nil`.
  265 + /// - parameter filter: The image filter applied to the image after the image request is finished.
  266 + /// Defaults to `nil`.
  267 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request.
  268 + /// Defaults to `nil`.
  269 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  270 + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a
  271 + /// single response value containing either the image or the error that occurred. If
  272 + /// the image was returned from the image cache, the response will be `nil`. Defaults
  273 + /// to `nil`.
  274 + public func af_setBackgroundImage(
  275 + for state: UIControlState,
  276 + url: URL,
  277 + placeholderImage: UIImage? = nil,
  278 + filter: ImageFilter? = nil,
  279 + progress: ImageDownloader.ProgressHandler? = nil,
  280 + progressQueue: DispatchQueue = DispatchQueue.main,
  281 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  282 + {
  283 + af_setBackgroundImage(
  284 + for: state,
  285 + urlRequest: urlRequest(with: url),
  286 + placeholderImage: placeholderImage,
  287 + filter: filter,
  288 + progress: progress,
  289 + progressQueue: progressQueue,
  290 + completion: completion
  291 + )
  292 + }
  293 +
  294 + /// Asynchronously downloads an image from the specified URL request and sets it once the request is finished.
  295 + ///
  296 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  297 + /// set immediately, and then the remote image will be set once the image request is finished.
  298 + ///
  299 + /// - parameter state: The control state of the button to set the image on.
  300 + /// - parameter urlRequest: The URL request.
  301 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the
  302 + /// background image will not change its image until the image request finishes.
  303 + /// Defaults to `nil`.
  304 + /// - parameter filter: The image filter applied to the image after the image request is finished.
  305 + /// Defaults to `nil`.
  306 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request.
  307 + /// Defaults to `nil`.
  308 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue.
  309 + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a
  310 + /// single response value containing either the image or the error that occurred. If
  311 + /// the image was returned from the image cache, the response will be `nil`. Defaults
  312 + /// to `nil`.
  313 + public func af_setBackgroundImage(
  314 + for state: UIControlState,
  315 + urlRequest: URLRequestConvertible,
  316 + placeholderImage: UIImage? = nil,
  317 + filter: ImageFilter? = nil,
  318 + progress: ImageDownloader.ProgressHandler? = nil,
  319 + progressQueue: DispatchQueue = DispatchQueue.main,
  320 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  321 + {
  322 + guard !isImageURLRequest(urlRequest, equalToActiveRequestURLForState: state) else {
  323 + let error = AFIError.requestCancelled
  324 + let response = DataResponse<UIImage>(request: nil, response: nil, data: nil, result: .failure(error))
  325 +
  326 + completion?(response)
  327 +
  328 + return
  329 + }
  330 +
  331 + af_cancelBackgroundImageRequest(for: state)
  332 +
  333 + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader
  334 + let imageCache = imageDownloader.imageCache
  335 +
  336 + // Use the image from the image cache if it exists
  337 + if
  338 + let request = urlRequest.urlRequest,
  339 + let image = imageCache?.image(for: request, withIdentifier: filter?.identifier)
  340 + {
  341 + let response = DataResponse<UIImage>(
  342 + request: urlRequest.urlRequest,
  343 + response: nil,
  344 + data: nil,
  345 + result: .success(image)
  346 + )
  347 +
  348 + setBackgroundImage(image, for: state)
  349 + completion?(response)
  350 +
  351 + return
  352 + }
  353 +
  354 + // Set the placeholder since we're going to have to download
  355 + if let placeholderImage = placeholderImage { self.setBackgroundImage(placeholderImage, for: state) }
  356 +
  357 + // Generate a unique download id to check whether the active request has changed while downloading
  358 + let downloadID = UUID().uuidString
  359 +
  360 + // Download the image, then set the image for the control state
  361 + let requestReceipt = imageDownloader.download(
  362 + urlRequest,
  363 + receiptID: downloadID,
  364 + filter: nil,
  365 + progress: progress,
  366 + progressQueue: progressQueue,
  367 + completion: { [weak self] response in
  368 + guard
  369 + let strongSelf = self,
  370 + strongSelf.isBackgroundImageURLRequest(response.request, equalToActiveRequestURLForState: state) &&
  371 + strongSelf.backgroundImageRequestReceipt(for: state)?.receiptID == downloadID
  372 + else {
  373 + completion?(response)
  374 + return
  375 + }
  376 +
  377 + if let image = response.result.value {
  378 + strongSelf.setBackgroundImage(image, for: state)
  379 + }
  380 +
  381 + strongSelf.setBackgroundImageRequestReceipt(nil, for: state)
  382 +
  383 + completion?(response)
  384 + }
  385 + )
  386 +
  387 + setBackgroundImageRequestReceipt(requestReceipt, for: state)
  388 + }
  389 +
  390 + /// Cancels the active download request for the background image, if one exists.
  391 + public func af_cancelBackgroundImageRequest(for state: UIControlState) {
  392 + guard let receipt = backgroundImageRequestReceipt(for: state) else { return }
  393 +
  394 + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader
  395 + imageDownloader.cancelRequest(with: receipt)
  396 +
  397 + setBackgroundImageRequestReceipt(nil, for: state)
  398 + }
  399 +
  400 + // MARK: - Internal - Image Request Receipts
  401 +
  402 + func imageRequestReceipt(for state: UIControlState) -> RequestReceipt? {
  403 + guard let receipt = imageRequestReceipts[state.rawValue] else { return nil }
  404 + return receipt
  405 + }
  406 +
  407 + func setImageRequestReceipt(_ receipt: RequestReceipt?, for state: UIControlState) {
  408 + var receipts = imageRequestReceipts
  409 + receipts[state.rawValue] = receipt
  410 +
  411 + imageRequestReceipts = receipts
  412 + }
  413 +
  414 + // MARK: - Internal - Background Image Request Receipts
  415 +
  416 + func backgroundImageRequestReceipt(for state: UIControlState) -> RequestReceipt? {
  417 + guard let receipt = backgroundImageRequestReceipts[state.rawValue] else { return nil }
  418 + return receipt
  419 + }
  420 +
  421 + func setBackgroundImageRequestReceipt(_ receipt: RequestReceipt?, for state: UIControlState) {
  422 + var receipts = backgroundImageRequestReceipts
  423 + receipts[state.rawValue] = receipt
  424 +
  425 + backgroundImageRequestReceipts = receipts
  426 + }
  427 +
  428 + // MARK: - Private - URL Request Helpers
  429 +
  430 + private func isImageURLRequest(
  431 + _ urlRequest: URLRequestConvertible?,
  432 + equalToActiveRequestURLForState state: UIControlState)
  433 + -> Bool
  434 + {
  435 + if
  436 + let currentURL = imageRequestReceipt(for: state)?.request.task?.originalRequest?.url,
  437 + let requestURL = urlRequest?.urlRequest?.url,
  438 + currentURL == requestURL
  439 + {
  440 + return true
  441 + }
  442 +
  443 + return false
  444 + }
  445 +
  446 + private func isBackgroundImageURLRequest(
  447 + _ urlRequest: URLRequestConvertible?,
  448 + equalToActiveRequestURLForState state: UIControlState)
  449 + -> Bool
  450 + {
  451 + if
  452 + let currentRequestURL = backgroundImageRequestReceipt(for: state)?.request.task?.originalRequest?.url,
  453 + let requestURL = urlRequest?.urlRequest?.url,
  454 + currentRequestURL == requestURL
  455 + {
  456 + return true
  457 + }
  458 +
  459 + return false
  460 + }
  461 +
  462 + private func urlRequest(with url: URL) -> URLRequest {
  463 + var urlRequest = URLRequest(url: url)
  464 +
  465 + for mimeType in DataRequest.acceptableImageContentTypes {
  466 + urlRequest.addValue(mimeType, forHTTPHeaderField: "Accept")
  467 + }
  468 +
  469 + return urlRequest
  470 + }
  471 +}
  472 +
  473 +#endif
ParentAssistant/Pods/AlamofireImage/Source/UIImage+AlamofireImage.swift 0 → 100644
@@ -0,0 +1,315 @@ @@ -0,0 +1,315 @@
  1 +//
  2 +// UIImage+AlamofireImage.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +#if os(iOS) || os(tvOS) || os(watchOS)
  26 +
  27 +import CoreGraphics
  28 +import Foundation
  29 +import UIKit
  30 +
  31 +// MARK: Initialization
  32 +
  33 +private let lock = NSLock()
  34 +
  35 +extension UIImage {
  36 + /// Initializes and returns the image object with the specified data in a thread-safe manner.
  37 + ///
  38 + /// It has been reported that there are thread-safety issues when initializing large amounts of images
  39 + /// simultaneously. In the event of these issues occurring, this method can be used in place of
  40 + /// the `init?(data:)` method.
  41 + ///
  42 + /// - parameter data: The data object containing the image data.
  43 + ///
  44 + /// - returns: An initialized `UIImage` object, or `nil` if the method failed.
  45 + public static func af_threadSafeImage(with data: Data) -> UIImage? {
  46 + lock.lock()
  47 + let image = UIImage(data: data)
  48 + lock.unlock()
  49 +
  50 + return image
  51 + }
  52 +
  53 + /// Initializes and returns the image object with the specified data and scale in a thread-safe manner.
  54 + ///
  55 + /// It has been reported that there are thread-safety issues when initializing large amounts of images
  56 + /// simultaneously. In the event of these issues occurring, this method can be used in place of
  57 + /// the `init?(data:scale:)` method.
  58 + ///
  59 + /// - parameter data: The data object containing the image data.
  60 + /// - parameter scale: The scale factor to assume when interpreting the image data. Applying a scale factor of 1.0
  61 + /// results in an image whose size matches the pixel-based dimensions of the image. Applying a
  62 + /// different scale factor changes the size of the image as reported by the size property.
  63 + ///
  64 + /// - returns: An initialized `UIImage` object, or `nil` if the method failed.
  65 + public static func af_threadSafeImage(with data: Data, scale: CGFloat) -> UIImage? {
  66 + lock.lock()
  67 + let image = UIImage(data: data, scale: scale)
  68 + lock.unlock()
  69 +
  70 + return image
  71 + }
  72 +}
  73 +
  74 +// MARK: - Inflation
  75 +
  76 +extension UIImage {
  77 + private struct AssociatedKey {
  78 + static var inflated = "af_UIImage.Inflated"
  79 + }
  80 +
  81 + /// Returns whether the image is inflated.
  82 + public var af_inflated: Bool {
  83 + get {
  84 + if let inflated = objc_getAssociatedObject(self, &AssociatedKey.inflated) as? Bool {
  85 + return inflated
  86 + } else {
  87 + return false
  88 + }
  89 + }
  90 + set {
  91 + objc_setAssociatedObject(self, &AssociatedKey.inflated, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  92 + }
  93 + }
  94 +
  95 + /// Inflates the underlying compressed image data to be backed by an uncompressed bitmap representation.
  96 + ///
  97 + /// Inflating compressed image formats (such as PNG or JPEG) can significantly improve drawing performance as it
  98 + /// allows a bitmap representation to be constructed in the background rather than on the main thread.
  99 + public func af_inflate() {
  100 + guard !af_inflated else { return }
  101 +
  102 + af_inflated = true
  103 + _ = cgImage?.dataProvider?.data
  104 + }
  105 +}
  106 +
  107 +// MARK: - Alpha
  108 +
  109 +extension UIImage {
  110 + /// Returns whether the image contains an alpha component.
  111 + public var af_containsAlphaComponent: Bool {
  112 + let alphaInfo = cgImage?.alphaInfo
  113 +
  114 + return (
  115 + alphaInfo == .first ||
  116 + alphaInfo == .last ||
  117 + alphaInfo == .premultipliedFirst ||
  118 + alphaInfo == .premultipliedLast
  119 + )
  120 + }
  121 +
  122 + /// Returns whether the image is opaque.
  123 + public var af_isOpaque: Bool { return !af_containsAlphaComponent }
  124 +}
  125 +
  126 +// MARK: - Scaling
  127 +
  128 +extension UIImage {
  129 + /// Returns a new version of the image scaled to the specified size.
  130 + ///
  131 + /// - parameter size: The size to use when scaling the new image.
  132 + ///
  133 + /// - returns: A new image object.
  134 + public func af_imageScaled(to size: CGSize) -> UIImage {
  135 + assert(size.width > 0 && size.height > 0, "You cannot safely scale an image to a zero width or height")
  136 +
  137 + UIGraphicsBeginImageContextWithOptions(size, af_isOpaque, 0.0)
  138 + draw(in: CGRect(origin: .zero, size: size))
  139 +
  140 + let scaledImage = UIGraphicsGetImageFromCurrentImageContext() ?? self
  141 + UIGraphicsEndImageContext()
  142 +
  143 + return scaledImage
  144 + }
  145 +
  146 + /// Returns a new version of the image scaled from the center while maintaining the aspect ratio to fit within
  147 + /// a specified size.
  148 + ///
  149 + /// The resulting image contains an alpha component used to pad the width or height with the necessary transparent
  150 + /// pixels to fit the specified size. In high performance critical situations, this may not be the optimal approach.
  151 + /// To maintain an opaque image, you could compute the `scaledSize` manually, then use the `af_imageScaledToSize`
  152 + /// method in conjunction with a `.Center` content mode to achieve the same visual result.
  153 + ///
  154 + /// - parameter size: The size to use when scaling the new image.
  155 + ///
  156 + /// - returns: A new image object.
  157 + public func af_imageAspectScaled(toFit size: CGSize) -> UIImage {
  158 + assert(size.width > 0 && size.height > 0, "You cannot safely scale an image to a zero width or height")
  159 +
  160 + let imageAspectRatio = self.size.width / self.size.height
  161 + let canvasAspectRatio = size.width / size.height
  162 +
  163 + var resizeFactor: CGFloat
  164 +
  165 + if imageAspectRatio > canvasAspectRatio {
  166 + resizeFactor = size.width / self.size.width
  167 + } else {
  168 + resizeFactor = size.height / self.size.height
  169 + }
  170 +
  171 + let scaledSize = CGSize(width: self.size.width * resizeFactor, height: self.size.height * resizeFactor)
  172 + let origin = CGPoint(x: (size.width - scaledSize.width) / 2.0, y: (size.height - scaledSize.height) / 2.0)
  173 +
  174 + UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
  175 + draw(in: CGRect(origin: origin, size: scaledSize))
  176 +
  177 + let scaledImage = UIGraphicsGetImageFromCurrentImageContext() ?? self
  178 + UIGraphicsEndImageContext()
  179 +
  180 + return scaledImage
  181 + }
  182 +
  183 + /// Returns a new version of the image scaled from the center while maintaining the aspect ratio to fill a
  184 + /// specified size. Any pixels that fall outside the specified size are clipped.
  185 + ///
  186 + /// - parameter size: The size to use when scaling the new image.
  187 + ///
  188 + /// - returns: A new image object.
  189 + public func af_imageAspectScaled(toFill size: CGSize) -> UIImage {
  190 + assert(size.width > 0 && size.height > 0, "You cannot safely scale an image to a zero width or height")
  191 +
  192 + let imageAspectRatio = self.size.width / self.size.height
  193 + let canvasAspectRatio = size.width / size.height
  194 +
  195 + var resizeFactor: CGFloat
  196 +
  197 + if imageAspectRatio > canvasAspectRatio {
  198 + resizeFactor = size.height / self.size.height
  199 + } else {
  200 + resizeFactor = size.width / self.size.width
  201 + }
  202 +
  203 + let scaledSize = CGSize(width: self.size.width * resizeFactor, height: self.size.height * resizeFactor)
  204 + let origin = CGPoint(x: (size.width - scaledSize.width) / 2.0, y: (size.height - scaledSize.height) / 2.0)
  205 +
  206 + UIGraphicsBeginImageContextWithOptions(size, af_isOpaque, 0.0)
  207 + draw(in: CGRect(origin: origin, size: scaledSize))
  208 +
  209 + let scaledImage = UIGraphicsGetImageFromCurrentImageContext() ?? self
  210 + UIGraphicsEndImageContext()
  211 +
  212 + return scaledImage
  213 + }
  214 +}
  215 +
  216 +// MARK: - Rounded Corners
  217 +
  218 +extension UIImage {
  219 + /// Returns a new version of the image with the corners rounded to the specified radius.
  220 + ///
  221 + /// - parameter radius: The radius to use when rounding the new image.
  222 + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the
  223 + /// image has the same resolution for all screen scales such as @1x, @2x and
  224 + /// @3x (i.e. single image from web server). Set to `false` for images loaded
  225 + /// from an asset catalog with varying resolutions for each screen scale.
  226 + /// `false` by default.
  227 + ///
  228 + /// - returns: A new image object.
  229 + public func af_imageRounded(withCornerRadius radius: CGFloat, divideRadiusByImageScale: Bool = false) -> UIImage {
  230 + UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
  231 +
  232 + let scaledRadius = divideRadiusByImageScale ? radius / scale : radius
  233 +
  234 + let clippingPath = UIBezierPath(roundedRect: CGRect(origin: CGPoint.zero, size: size), cornerRadius: scaledRadius)
  235 + clippingPath.addClip()
  236 +
  237 + draw(in: CGRect(origin: CGPoint.zero, size: size))
  238 +
  239 + let roundedImage = UIGraphicsGetImageFromCurrentImageContext()!
  240 + UIGraphicsEndImageContext()
  241 +
  242 + return roundedImage
  243 + }
  244 +
  245 + /// Returns a new version of the image rounded into a circle.
  246 + ///
  247 + /// - returns: A new image object.
  248 + public func af_imageRoundedIntoCircle() -> UIImage {
  249 + let radius = min(size.width, size.height) / 2.0
  250 + var squareImage = self
  251 +
  252 + if size.width != size.height {
  253 + let squareDimension = min(size.width, size.height)
  254 + let squareSize = CGSize(width: squareDimension, height: squareDimension)
  255 + squareImage = af_imageAspectScaled(toFill: squareSize)
  256 + }
  257 +
  258 + UIGraphicsBeginImageContextWithOptions(squareImage.size, false, 0.0)
  259 +
  260 + let clippingPath = UIBezierPath(
  261 + roundedRect: CGRect(origin: CGPoint.zero, size: squareImage.size),
  262 + cornerRadius: radius
  263 + )
  264 +
  265 + clippingPath.addClip()
  266 +
  267 + squareImage.draw(in: CGRect(origin: CGPoint.zero, size: squareImage.size))
  268 +
  269 + let roundedImage = UIGraphicsGetImageFromCurrentImageContext()!
  270 + UIGraphicsEndImageContext()
  271 +
  272 + return roundedImage
  273 + }
  274 +}
  275 +
  276 +#endif
  277 +
  278 +#if os(iOS) || os(tvOS)
  279 +
  280 +import CoreImage
  281 +
  282 +// MARK: - Core Image Filters
  283 +
  284 +@available(iOS 9.0, *)
  285 +extension UIImage {
  286 + /// Returns a new version of the image using a CoreImage filter with the specified name and parameters.
  287 + ///
  288 + /// - parameter name: The name of the CoreImage filter to use on the new image.
  289 + /// - parameter parameters: The parameters to apply to the CoreImage filter.
  290 + ///
  291 + /// - returns: A new image object, or `nil` if the filter failed for any reason.
  292 + public func af_imageFiltered(withCoreImageFilter name: String, parameters: [String: Any]? = nil) -> UIImage? {
  293 + var image: CoreImage.CIImage? = ciImage
  294 +
  295 + if image == nil, let CGImage = self.cgImage {
  296 + image = CoreImage.CIImage(cgImage: CGImage)
  297 + }
  298 +
  299 + guard let coreImage = image else { return nil }
  300 +
  301 + let context = CIContext(options: [kCIContextPriorityRequestLow: true])
  302 +
  303 + var parameters: [String: Any] = parameters ?? [:]
  304 + parameters[kCIInputImageKey] = coreImage
  305 +
  306 + guard let filter = CIFilter(name: name, withInputParameters: parameters) else { return nil }
  307 + guard let outputImage = filter.outputImage else { return nil }
  308 +
  309 + let cgImageRef = context.createCGImage(outputImage, from: outputImage.extent)
  310 +
  311 + return UIImage(cgImage: cgImageRef!, scale: scale, orientation: imageOrientation)
  312 + }
  313 +}
  314 +
  315 +#endif
ParentAssistant/Pods/AlamofireImage/Source/UIImageView+AlamofireImage.swift 0 → 100644
@@ -0,0 +1,392 @@ @@ -0,0 +1,392 @@
  1 +//
  2 +// UIImageView+AlamofireImage.swift
  3 +//
  4 +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  5 +//
  6 +// Permission is hereby granted, free of charge, to any person obtaining a copy
  7 +// of this software and associated documentation files (the "Software"), to deal
  8 +// in the Software without restriction, including without limitation the rights
  9 +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 +// copies of the Software, and to permit persons to whom the Software is
  11 +// furnished to do so, subject to the following conditions:
  12 +//
  13 +// The above copyright notice and this permission notice shall be included in
  14 +// all copies or substantial portions of the Software.
  15 +//
  16 +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19 +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 +// THE SOFTWARE.
  23 +//
  24 +
  25 +import Alamofire
  26 +import Foundation
  27 +
  28 +#if os(iOS) || os(tvOS)
  29 +
  30 +import UIKit
  31 +
  32 +extension UIImageView {
  33 +
  34 + // MARK: - ImageTransition
  35 +
  36 + /// Used to wrap all `UIView` animation transition options alongside a duration.
  37 + public enum ImageTransition {
  38 + case noTransition
  39 + case crossDissolve(TimeInterval)
  40 + case curlDown(TimeInterval)
  41 + case curlUp(TimeInterval)
  42 + case flipFromBottom(TimeInterval)
  43 + case flipFromLeft(TimeInterval)
  44 + case flipFromRight(TimeInterval)
  45 + case flipFromTop(TimeInterval)
  46 + case custom(
  47 + duration: TimeInterval,
  48 + animationOptions: UIViewAnimationOptions,
  49 + animations: (UIImageView, Image) -> Void,
  50 + completion: ((Bool) -> Void)?
  51 + )
  52 +
  53 + /// The duration of the image transition in seconds.
  54 + public var duration: TimeInterval {
  55 + switch self {
  56 + case .noTransition:
  57 + return 0.0
  58 + case .crossDissolve(let duration):
  59 + return duration
  60 + case .curlDown(let duration):
  61 + return duration
  62 + case .curlUp(let duration):
  63 + return duration
  64 + case .flipFromBottom(let duration):
  65 + return duration
  66 + case .flipFromLeft(let duration):
  67 + return duration
  68 + case .flipFromRight(let duration):
  69 + return duration
  70 + case .flipFromTop(let duration):
  71 + return duration
  72 + case .custom(let duration, _, _, _):
  73 + return duration
  74 + }
  75 + }
  76 +
  77 + /// The animation options of the image transition.
  78 + public var animationOptions: UIViewAnimationOptions {
  79 + switch self {
  80 + case .noTransition:
  81 + return UIViewAnimationOptions()
  82 + case .crossDissolve:
  83 + return .transitionCrossDissolve
  84 + case .curlDown:
  85 + return .transitionCurlDown
  86 + case .curlUp:
  87 + return .transitionCurlUp
  88 + case .flipFromBottom:
  89 + return .transitionFlipFromBottom
  90 + case .flipFromLeft:
  91 + return .transitionFlipFromLeft
  92 + case .flipFromRight:
  93 + return .transitionFlipFromRight
  94 + case .flipFromTop:
  95 + return .transitionFlipFromTop
  96 + case .custom(_, let animationOptions, _, _):
  97 + return animationOptions
  98 + }
  99 + }
  100 +
  101 + /// The animation options of the image transition.
  102 + public var animations: ((UIImageView, Image) -> Void) {
  103 + switch self {
  104 + case .custom(_, _, let animations, _):
  105 + return animations
  106 + default:
  107 + return { $0.image = $1 }
  108 + }
  109 + }
  110 +
  111 + /// The completion closure associated with the image transition.
  112 + public var completion: ((Bool) -> Void)? {
  113 + switch self {
  114 + case .custom(_, _, _, let completion):
  115 + return completion
  116 + default:
  117 + return nil
  118 + }
  119 + }
  120 + }
  121 +
  122 + // MARK: - Private - AssociatedKeys
  123 +
  124 + private struct AssociatedKey {
  125 + static var imageDownloader = "af_UIImageView.ImageDownloader"
  126 + static var sharedImageDownloader = "af_UIImageView.SharedImageDownloader"
  127 + static var activeRequestReceipt = "af_UIImageView.ActiveRequestReceipt"
  128 + }
  129 +
  130 + // MARK: - Associated Properties
  131 +
  132 + /// The instance image downloader used to download all images. If this property is `nil`, the `UIImageView` will
  133 + /// fallback on the `af_sharedImageDownloader` for all downloads. The most common use case for needing to use a
  134 + /// custom instance image downloader is when images are behind different basic auth credentials.
  135 + public var af_imageDownloader: ImageDownloader? {
  136 + get {
  137 + return objc_getAssociatedObject(self, &AssociatedKey.imageDownloader) as? ImageDownloader
  138 + }
  139 + set(downloader) {
  140 + objc_setAssociatedObject(self, &AssociatedKey.imageDownloader, downloader, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  141 + }
  142 + }
  143 +
  144 + /// The shared image downloader used to download all images. By default, this is the default `ImageDownloader`
  145 + /// instance backed with an `AutoPurgingImageCache` which automatically evicts images from the cache when the memory
  146 + /// capacity is reached or memory warning notifications occur. The shared image downloader is only used if the
  147 + /// `af_imageDownloader` is `nil`.
  148 + public class var af_sharedImageDownloader: ImageDownloader {
  149 + get {
  150 + if let downloader = objc_getAssociatedObject(self, &AssociatedKey.sharedImageDownloader) as? ImageDownloader {
  151 + return downloader
  152 + } else {
  153 + return ImageDownloader.default
  154 + }
  155 + }
  156 + set {
  157 + objc_setAssociatedObject(self, &AssociatedKey.sharedImageDownloader, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  158 + }
  159 + }
  160 +
  161 + var af_activeRequestReceipt: RequestReceipt? {
  162 + get {
  163 + return objc_getAssociatedObject(self, &AssociatedKey.activeRequestReceipt) as? RequestReceipt
  164 + }
  165 + set {
  166 + objc_setAssociatedObject(self, &AssociatedKey.activeRequestReceipt, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  167 + }
  168 + }
  169 +
  170 + // MARK: - Image Download
  171 +
  172 + /// Asynchronously downloads an image from the specified URL, applies the specified image filter to the downloaded
  173 + /// image and sets it once finished while executing the image transition.
  174 + ///
  175 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  176 + /// set immediately, and then the remote image will be set once the image request is finished.
  177 + ///
  178 + /// The `completion` closure is called after the image download and filtering are complete, but before the start of
  179 + /// the image transition. Please note it is no longer the responsibility of the `completion` closure to set the
  180 + /// image. It will be set automatically. If you require a second notification after the image transition completes,
  181 + /// use a `.Custom` image transition with a `completion` closure. The `.Custom` `completion` closure is called when
  182 + /// the image transition is finished.
  183 + ///
  184 + /// - parameter url: The URL used for the image request.
  185 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If
  186 + /// `nil`, the image view will not change its image until the image
  187 + /// request finishes. Defaults to `nil`.
  188 + /// - parameter filter: The image filter applied to the image after the image request is
  189 + /// finished. Defaults to `nil`.
  190 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the
  191 + /// request. Defaults to `nil`.
  192 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the
  193 + /// main queue.
  194 + /// - parameter imageTransition: The image transition animation applied to the image when set.
  195 + /// Defaults to `.None`.
  196 + /// - parameter runImageTransitionIfCached: Whether to run the image transition if the image is cached. Defaults
  197 + /// to `false`.
  198 + /// - parameter completion: A closure to be executed when the image request finishes. The closure
  199 + /// has no return value and takes three arguments: the original request,
  200 + /// the response from the server and the result containing either the
  201 + /// image or the error that occurred. If the image was returned from the
  202 + /// image cache, the response will be `nil`. Defaults to `nil`.
  203 + public func af_setImage(
  204 + withURL url: URL,
  205 + placeholderImage: UIImage? = nil,
  206 + filter: ImageFilter? = nil,
  207 + progress: ImageDownloader.ProgressHandler? = nil,
  208 + progressQueue: DispatchQueue = DispatchQueue.main,
  209 + imageTransition: ImageTransition = .noTransition,
  210 + runImageTransitionIfCached: Bool = false,
  211 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  212 + {
  213 + af_setImage(
  214 + withURLRequest: urlRequest(with: url),
  215 + placeholderImage: placeholderImage,
  216 + filter: filter,
  217 + progress: progress,
  218 + progressQueue: progressQueue,
  219 + imageTransition: imageTransition,
  220 + runImageTransitionIfCached: runImageTransitionIfCached,
  221 + completion: completion
  222 + )
  223 + }
  224 +
  225 + /// Asynchronously downloads an image from the specified URL Request, applies the specified image filter to the downloaded
  226 + /// image and sets it once finished while executing the image transition.
  227 + ///
  228 + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be
  229 + /// set immediately, and then the remote image will be set once the image request is finished.
  230 + ///
  231 + /// The `completion` closure is called after the image download and filtering are complete, but before the start of
  232 + /// the image transition. Please note it is no longer the responsibility of the `completion` closure to set the
  233 + /// image. It will be set automatically. If you require a second notification after the image transition completes,
  234 + /// use a `.Custom` image transition with a `completion` closure. The `.Custom` `completion` closure is called when
  235 + /// the image transition is finished.
  236 + ///
  237 + /// - parameter urlRequest: The URL request.
  238 + /// - parameter placeholderImage: The image to be set initially until the image request finished. If
  239 + /// `nil`, the image view will not change its image until the image
  240 + /// request finishes. Defaults to `nil`.
  241 + /// - parameter filter: The image filter applied to the image after the image request is
  242 + /// finished. Defaults to `nil`.
  243 + /// - parameter progress: The closure to be executed periodically during the lifecycle of the
  244 + /// request. Defaults to `nil`.
  245 + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the
  246 + /// main queue.
  247 + /// - parameter imageTransition: The image transition animation applied to the image when set.
  248 + /// Defaults to `.None`.
  249 + /// - parameter runImageTransitionIfCached: Whether to run the image transition if the image is cached. Defaults
  250 + /// to `false`.
  251 + /// - parameter completion: A closure to be executed when the image request finishes. The closure
  252 + /// has no return value and takes three arguments: the original request,
  253 + /// the response from the server and the result containing either the
  254 + /// image or the error that occurred. If the image was returned from the
  255 + /// image cache, the response will be `nil`. Defaults to `nil`.
  256 + public func af_setImage(
  257 + withURLRequest urlRequest: URLRequestConvertible,
  258 + placeholderImage: UIImage? = nil,
  259 + filter: ImageFilter? = nil,
  260 + progress: ImageDownloader.ProgressHandler? = nil,
  261 + progressQueue: DispatchQueue = DispatchQueue.main,
  262 + imageTransition: ImageTransition = .noTransition,
  263 + runImageTransitionIfCached: Bool = false,
  264 + completion: ((DataResponse<UIImage>) -> Void)? = nil)
  265 + {
  266 + guard !isURLRequestURLEqualToActiveRequestURL(urlRequest) else {
  267 + let error = AFIError.requestCancelled
  268 + let response = DataResponse<UIImage>(request: nil, response: nil, data: nil, result: .failure(error))
  269 +
  270 + completion?(response)
  271 +
  272 + return
  273 + }
  274 +
  275 + af_cancelImageRequest()
  276 +
  277 + let imageDownloader = af_imageDownloader ?? UIImageView.af_sharedImageDownloader
  278 + let imageCache = imageDownloader.imageCache
  279 +
  280 + // Use the image from the image cache if it exists
  281 + if
  282 + let request = urlRequest.urlRequest,
  283 + let image = imageCache?.image(for: request, withIdentifier: filter?.identifier)
  284 + {
  285 + let response = DataResponse<UIImage>(request: request, response: nil, data: nil, result: .success(image))
  286 +
  287 + if runImageTransitionIfCached {
  288 + let tinyDelay = DispatchTime.now() + Double(Int64(0.001 * Float(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
  289 +
  290 + // Need to let the runloop cycle for the placeholder image to take affect
  291 + DispatchQueue.main.asyncAfter(deadline: tinyDelay) {
  292 + self.run(imageTransition, with: image)
  293 + completion?(response)
  294 + }
  295 + } else {
  296 + self.image = image
  297 + completion?(response)
  298 + }
  299 +
  300 + return
  301 + }
  302 +
  303 + // Set the placeholder since we're going to have to download
  304 + if let placeholderImage = placeholderImage { self.image = placeholderImage }
  305 +
  306 + // Generate a unique download id to check whether the active request has changed while downloading
  307 + let downloadID = UUID().uuidString
  308 +
  309 + // Download the image, then run the image transition or completion handler
  310 + let requestReceipt = imageDownloader.download(
  311 + urlRequest,
  312 + receiptID: downloadID,
  313 + filter: filter,
  314 + progress: progress,
  315 + progressQueue: progressQueue,
  316 + completion: { [weak self] response in
  317 + guard
  318 + let strongSelf = self,
  319 + strongSelf.isURLRequestURLEqualToActiveRequestURL(response.request) &&
  320 + strongSelf.af_activeRequestReceipt?.receiptID == downloadID
  321 + else {
  322 + completion?(response)
  323 + return
  324 + }
  325 +
  326 + if let image = response.result.value {
  327 + strongSelf.run(imageTransition, with: image)
  328 + }
  329 +
  330 + strongSelf.af_activeRequestReceipt = nil
  331 +
  332 + completion?(response)
  333 + }
  334 + )
  335 +
  336 + af_activeRequestReceipt = requestReceipt
  337 + }
  338 +
  339 + // MARK: - Image Download Cancellation
  340 +
  341 + /// Cancels the active download request, if one exists.
  342 + public func af_cancelImageRequest() {
  343 + guard let activeRequestReceipt = af_activeRequestReceipt else { return }
  344 +
  345 + let imageDownloader = af_imageDownloader ?? UIImageView.af_sharedImageDownloader
  346 + imageDownloader.cancelRequest(with: activeRequestReceipt)
  347 +
  348 + af_activeRequestReceipt = nil
  349 + }
  350 +
  351 + // MARK: - Image Transition
  352 +
  353 + /// Runs the image transition on the image view with the specified image.
  354 + ///
  355 + /// - parameter imageTransition: The image transition to ran on the image view.
  356 + /// - parameter image: The image to use for the image transition.
  357 + public func run(_ imageTransition: ImageTransition, with image: Image) {
  358 + UIView.transition(
  359 + with: self,
  360 + duration: imageTransition.duration,
  361 + options: imageTransition.animationOptions,
  362 + animations: { imageTransition.animations(self, image) },
  363 + completion: imageTransition.completion
  364 + )
  365 + }
  366 +
  367 + // MARK: - Private - URL Request Helper Methods
  368 +
  369 + private func urlRequest(with url: URL) -> URLRequest {
  370 + var urlRequest = URLRequest(url: url)
  371 +
  372 + for mimeType in DataRequest.acceptableImageContentTypes {
  373 + urlRequest.addValue(mimeType, forHTTPHeaderField: "Accept")
  374 + }
  375 +
  376 + return urlRequest
  377 + }
  378 +
  379 + private func isURLRequestURLEqualToActiveRequestURL(_ urlRequest: URLRequestConvertible?) -> Bool {
  380 + if
  381 + let currentRequestURL = af_activeRequestReceipt?.request.task?.originalRequest?.url,
  382 + let requestURL = urlRequest?.urlRequest?.url,
  383 + currentRequestURL == requestURL
  384 + {
  385 + return true
  386 + }
  387 +
  388 + return false
  389 + }
  390 +}
  391 +
  392 +#endif
ParentAssistant/Pods/Manifest.lock
1 PODS: 1 PODS:
2 - - Alamofire (4.0.1) 2 + - Alamofire (4.7.2)
  3 + - AlamofireImage (3.3.1):
  4 + - Alamofire (~> 4.5)
3 - DZNEmptyDataSet (1.8.1) 5 - DZNEmptyDataSet (1.8.1)
4 - HandyJSON (4.1.1) 6 - HandyJSON (4.1.1)
5 - NIMSDK_LITE (4.9.0) 7 - NIMSDK_LITE (4.9.0)
@@ -19,7 +21,8 @@ PODS: @@ -19,7 +21,8 @@ PODS:
19 - XRCarouselView (2.5.6) 21 - XRCarouselView (2.5.6)
20 22
21 DEPENDENCIES: 23 DEPENDENCIES:
22 - - Alamofire (~> 4.0.1) 24 + - Alamofire (~> 4.7.2)
  25 + - AlamofireImage (~> 3.3.1)
23 - DZNEmptyDataSet (~> 1.8.1) 26 - DZNEmptyDataSet (~> 1.8.1)
24 - HandyJSON (~> 4.1.1) 27 - HandyJSON (~> 4.1.1)
25 - NIMSDK_LITE (~> 4.9.0) 28 - NIMSDK_LITE (~> 4.9.0)
@@ -35,7 +38,8 @@ DEPENDENCIES: @@ -35,7 +38,8 @@ DEPENDENCIES:
35 - XRCarouselView (~> 2.5.6) 38 - XRCarouselView (~> 2.5.6)
36 39
37 SPEC CHECKSUMS: 40 SPEC CHECKSUMS:
38 - Alamofire: 7682d43245de14874acd142ec137b144aa1dd335 41 + Alamofire: e4fa87002c137ba2d8d634d2c51fabcda0d5c223
  42 + AlamofireImage: 3b35b586853abaf94ca1250f4e94cff3c21a4c0d
39 DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7 43 DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7
40 HandyJSON: 3a3de917c4118767ffe41c29b5acba23409649f4 44 HandyJSON: 3a3de917c4118767ffe41c29b5acba23409649f4
41 NIMSDK_LITE: a69a019544299a1b597db6ebf98927f5e12fa17c 45 NIMSDK_LITE: a69a019544299a1b597db6ebf98927f5e12fa17c
@@ -50,6 +54,6 @@ SPEC CHECKSUMS: @@ -50,6 +54,6 @@ SPEC CHECKSUMS:
50 UMCSecurityPlugins: 0831a08f3988f3cea9f1d3a7626cd9bee4fef150 54 UMCSecurityPlugins: 0831a08f3988f3cea9f1d3a7626cd9bee4fef150
51 XRCarouselView: 52529f924d26ee4787f9bd958150800b73e60922 55 XRCarouselView: 52529f924d26ee4787f9bd958150800b73e60922
52 56
53 -PODFILE CHECKSUM: ef5a2eedc2a762110d9f7458ad01512ced09aba0 57 +PODFILE CHECKSUM: fb172574c836b57e7c792807c655a091aff17050
54 58
55 COCOAPODS: 1.4.0 59 COCOAPODS: 1.4.0
ParentAssistant/Pods/Pods.xcodeproj/project.pbxproj
@@ -7,431 +7,486 @@ @@ -7,431 +7,486 @@
7 objects = { 7 objects = {
8 8
9 /* Begin PBXBuildFile section */ 9 /* Begin PBXBuildFile section */
10 - 00E153632A414101E0A66AE23569802B /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92331AB0F30415BE666C619D1A45513E /* Result.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
11 - 01866720BD41E2820300D8B9284FC061 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };  
12 - 0203C16E98AD37E5A0C596D1B39C5119 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 0969E5011DCC0C421F637E6859279610 /* Reachability.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
13 - 0369C812B817E442E9BF7B2F561E1AEF /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1914DA670BEE4BC1F461E88ED1BD7C26 /* Configuration.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
14 - 05F1082B0C6E40F76E821D67DFAD9AB5 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 172419A08571955755C3C6FB2044DD9D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; };  
15 - 079D990738735591330332B5F2551AE4 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCCC1A6E4AF8DAF6E5609D65548B3C79 /* NetworkReachabilityManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
16 - 0A2126372E9629100B22A44A94E73D71 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 33347618F6541AA20F52632F9EA10CA6 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };  
17 - 0ABF85713B5ABC01E4121F8DBCBBD195 /* Deserializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D374115D56716D6284C03A777CD2BB4 /* Deserializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
18 - 0C11C193B2F9FF679EB214C272C8A480 /* Transformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4E76CB8696BAB20A617484E4726713B /* Transformable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
19 - 0C4EA35F79172E81D6BF56A2FC856ED8 /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 38EE23882943EDCED73523F643A71C39 /* SVProgressAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
20 - 121B576C5153736760EDBD385DCE1A82 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DB0A7F29D540AB077DA6D9855C3F743 /* QuartzCore.framework */; };  
21 - 12DE723E9DF6F13F3286874C3A95E30A /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EF7D93FE7442849AC14571996AC8ED /* Logger.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
22 - 143D0DFED5AF7708744EBDB443F9812D /* EnumType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C73B5BC3B66F99610607951FEC5FCB3 /* EnumType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
23 - 14CECE238604E1D44104E5BCD14EB2BE /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D3152CF39784BC2AAD4747AF03BB50A /* SessionDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
24 - 164781197625A3149B3BDBCAA2AC8CC3 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E95345A11FCCED373B3A5758A6073CDB /* Validation.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
25 - 170AB456D9F3C346DCF407E42D84B5D5 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BE70BDE392E6E92B76047D2DED4ED380 /* UIButton+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
26 - 17F8D48B0736FD13AC59D9311C074E9D /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = C203E9ABEF394B0009B142EEB9AA64FC /* NSData+ImageContentType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
27 - 1A3841F2F008E6FEBA8B10F04DE5AD15 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DB0A7F29D540AB077DA6D9855C3F743 /* QuartzCore.framework */; };  
28 - 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BF496B88C6E68626DC9D0C9FC152BD3C /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };  
29 - 1C39565C535B7D534368C5DFB46659B5 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1983D355FD75B9D24A71756509C98131 /* SDWebImageDownloader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
30 - 204944D67267632DD7CD4BEFB60AC389 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8781B0306B0188AF528659F413E1B542 /* Response.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
31 - 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };  
32 - 240CD81B9BDAA551B583A82E3618D560 /* XRCarouselView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 323A41D79693687F0377B9ACACC90D4A /* XRCarouselView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };  
33 - 242367446F58A71823A8250396E775A3 /* HelpingMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9889E5067E9A54BAEC05298BBA10F671 /* HelpingMapper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
34 - 264463742964367E06060C2E85D3EEF4 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E786E1AEE51D914333543AC4DEF9B3FB /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };  
35 - 27813DC0914AD972436022C87454185F /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FF65E4A0D399571B01517891F0309004 /* SDWebImage-dummy.m */; };  
36 - 2AB8304BE65678C2043856E0F4AAFC9E /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A559DCF61F2E184BC9318C05F05CFF3 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };  
37 - 2B58B070F9D7324583D01EE906BC918C /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5104B9F40B6C55F71BDE788F76AA8F53 /* SessionManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
38 - 2B5DF32B1906ED4F0088D37CE08CB2B9 /* Metadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3C517CD17DEB98E878268901D654E8 /* Metadata.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
39 - 343B30C989188B77FB1149FED753A63C /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640ED88831DE9CA10759B8FC3751C531 /* ServerTrustPolicy.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
40 - 38BC499B109AEBC02AD6C88AB2ED057D /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FFCF8A6062658FA349B617C0D75723C2 /* SDWebImageManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
41 - 3C69CE7353282718747615DDA9563510 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 93251EC8BEF89E6A4FA758DA38A1E47A /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };  
42 - 3D342698F0FA2B9391B7B1733D499623 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 20C0A79CAF95E65B981CC5F896E4334C /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; };  
43 - 3DD10D4C59666719E941A5D0EB5D9582 /* XRCarouselView.m in Sources */ = {isa = PBXBuildFile; fileRef = A91D08749C812CD6EB281780E69AFED6 /* XRCarouselView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
44 - 44E9442A5B676A7E4941C47EB6C49C9F /* UIView+Toast.m in Sources */ = {isa = PBXBuildFile; fileRef = E533F265C56324D6F57EB232221F586A /* UIView+Toast.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; };  
45 - 46389823D72FA2DA9F4AD34CE119E9FA /* Reachability-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 29BC53491C8D6BA4B81045D6FBBA043C /* Reachability-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };  
46 - 46749DE4D7ED1863AFF86DFB519EAAD0 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 9011EFC1DA29BE6CA0831595062B82ED /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };  
47 - 48F71FC920A4F562FF7ECFD25BD08F2E /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2830040C9AF69744EEB45C092E65CA2A /* NSDecimalNumberTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
48 - 4A1D23F6526F175FCC2B35539E1B6AD6 /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = 17403F9FAA48DA29AAEB297BE9AC4D51 /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; };  
49 - 4A2F8CD414D57920B53208F0F9A39E34 /* XRCarouselView.h in Headers */ = {isa = PBXBuildFile; fileRef = 57342E33349B812F65B6D994EA74E212 /* XRCarouselView.h */; settings = {ATTRIBUTES = (Public, ); }; };  
50 - 4A961542DBC3F70E502B854EBB870694 /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31A74FD90C96035085B5A148E9CBA64C /* EnumTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
51 - 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 73AD0FFA16B2C0B1B8A40B3A76629975 /* DZNEmptyDataSet-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };  
52 - 4F7B3FA3957DCA2A67546E72117904F9 /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E85535E49256ABCDBBB9EA045CE6268 /* HexColorTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
53 - 502127E1D7BF9D8D8FA29AD2F7EF420E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };  
54 - 50424A0F4A3907712832B1FA56C9E2A2 /* Measuable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D9407543C44ABED0AC48154C76831BE /* Measuable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
55 - 53926FE56FBF1399E69B9F893ACFBDB1 /* Pods-ParentAssistant-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1706C196E50CAE9C6DE364B9BA5E9DCB /* Pods-ParentAssistant-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };  
56 - 5438E76D8DA2CB8E045DE40226F4A5AB /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4EC3094994043023CF3002A63DD6DA4 /* DateFormatterTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
57 - 545C0FA9073D729E2E8C3EF9678C0DEA /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72ADD4F0113F0555435EA10BA789F8E2 /* TransformOf.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
58 - 5475A5933FABB5F9999E31020427B182 /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE92E07FF56795D096246F9059B540CA /* DataTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
59 - 58812AABBC0A1E7AE019752424DF31A7 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99DF7E55400E9131640E0694D3C91764 /* MultipartFormData.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
60 - 5C95D2513AAB007D33804F074AC4DD33 /* Export.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33C9063E8CA60D73EE6050FCF59F433 /* Export.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
61 - 5E25BCD30BDE2E7A68D1A6FAF7253AD4 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6429920CDFD8D08A5A0566565673330 /* DispatchQueue+Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
62 - 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 11DABA5B57A3076260D36D4A9AE646F5 /* HandyJSON-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };  
63 - 603F9D0686CE005205D389C1E4C6072A /* XRPlaceholder.png in Resources */ = {isa = PBXBuildFile; fileRef = FFEBBEC7D2ED4C631DFB3CBB04E6F926 /* XRPlaceholder.png */; };  
64 - 604E191C52F306436E51253A4A21589C /* SwiftHash-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F2BF6E468482ED7EDAE9AFD6CA2C994 /* SwiftHash-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };  
65 - 63751EA36B3CCD03BF292C19F6B7C5FE /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C441F9B75595B2F266E6AC40AD7D85 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; };  
66 - 6540CC4D369A32F6DE54AFA8D5D6FAF9 /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BB2B3251E63EE34530FC8A40E441CB23 /* Alamofire-dummy.m */; };  
67 - 6694F9A05D6A58C5C27935913BF8AE56 /* Pods-ParentAssistant-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F6BAADF2798AA6F62DA82FAA92DECB07 /* Pods-ParentAssistant-dummy.m */; };  
68 - 69735BB95E8E8111E0CEA96BBA19486A /* ExtendCustomModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E529332879B58C942DDF16DF5D39B4 /* ExtendCustomModelType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
69 - 6A14BBE1A1C5AFF3B9FCFFCC30685E04 /* Toast-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 835B1DEC82F034C2C12DC0723F18F6E9 /* Toast-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };  
70 - 6BE097BD2C38D14E51B20BCEB5C6F495 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };  
71 - 6C3C226E0B46AFC4FD756BA6C5D9414E /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 6850886B55CE3CD9B901B28690292C5C /* SDWebImagePrefetcher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
72 - 6F4160DEA9816F49351CCEF452CCF00C /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64CF5A867496880A0DAE25ED9EC8E512 /* CustomDateFormatTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
73 - 71770C33C6DBF555B10D0A42E5C034F4 /* NominalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C5CEE4C10F2E83011011BAE5999B4FD /* NominalType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
74 - 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };  
75 - 78F4229B4A746A38341474FEB9DADB25 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14EC82B350F60C65CB156014F5997DCE /* ParameterEncoding.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
76 - 7931BF35785763872BD11EB65164B1D5 /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F33461E2C03CDF90E02052B76ADADB01 /* TransformType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
77 - 794B16FD139EB13BA49AE711C49135BB /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AEE056145338863D7A727ACF1C3657C /* MD5.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
78 - 7AC13BF7B3C538D94DE7B9D836786514 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E90E960C03E09803780D5C47A55A4DB /* SDWebImageCompat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
79 - 7C3888324281E325ABBDDB3888D52125 /* DZNEmptyDataSet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F6392C48C4C9A3D7130A57D84AFEE2B /* DZNEmptyDataSet-dummy.m */; };  
80 - 7CE1363BFF8D96DD8059E0B5481A8D00 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };  
81 - 7D23D4A779C42E695BD2EC80114AD9E8 /* Reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AD254563DCC20283BB5C0C5B4E57B5C /* Reachability.h */; settings = {ATTRIBUTES = (Public, ); }; };  
82 - 807283562FFCAF1B2AC3B251ABF34B5A /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D24FB404E9541910245BF3E68C5EE73 /* URLTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
83 - 82769877C29A8E71221C9918273D3FFF /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A51BA19C89D5E62EDCF2DB9D9FA43E0 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; };  
84 - 8444B1FF566FC96D823C154BEE6A4A03 /* BuiltInBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F948022D8D1EFEF734A07E6ED4D6CAF9 /* BuiltInBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
85 - 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 41531DBB287870602D671C4D97E99B21 /* UIScrollView+EmptyDataSet.h */; settings = {ATTRIBUTES = (Public, ); }; };  
86 - 86930F980FA87FB0CA5E197FEAA7A90C /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = AE8B2524C105710A1C75E5F3C734796F /* SVRadialGradientLayer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
87 - 86EF282C771B9E7A12106ACBE6E820F5 /* ExtendCustomBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32115C18B0BD53A5791A3FA797AB85AC /* ExtendCustomBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
88 - 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B3D43CB0BDA34787F85B2C084FBB09A /* HandyJSON.h */; settings = {ATTRIBUTES = (Public, ); }; };  
89 - 8B937C355B5CAAEC40B80F24AFA26569 /* Reachability-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 16CC2B704148D354077756FC0880DBCB /* Reachability-dummy.m */; };  
90 - 8C1E8307CFE1A73F290CFCE8818B6123 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = B9A38D8C4EC4826AEDC2A52DD0187186 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };  
91 - 8E31EF89BD192C6AACDE9E0655861D3D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9B732FC24A0EC5E46E41D939F4A1130 /* UIKit.framework */; };  
92 - 8F5C0849D2757FC5A7C81B81BA3813C3 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39F3B60B0A2AD7975DA5BCA943FA6BD5 /* ResponseSerialization.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
93 - 90B1C77BB42755C3E9AC821A09526E53 /* SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A4D6703A8771BB168130EFB6EAC1C3E /* SHA1.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
94 - 952429322A476D5508670C477DE23669 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };  
95 - 95F6802FB7C748286D6E1D6876552E8C /* BuiltInBridgeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6976D41DC0C992EA2F24C3A7358E958F /* BuiltInBridgeType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
96 - 963D3083B43A304CE4A81FF8908C644C /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0A49BF64844554AA6BC0B49FD9A9BE8 /* DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
97 - 9687BE425798E40CBC52870F8009209D /* UIView+Toast.h in Headers */ = {isa = PBXBuildFile; fileRef = 19FAAAAFAF3A705D1081BDCDC14CAFD6 /* UIView+Toast.h */; settings = {ATTRIBUTES = (Public, ); }; };  
98 - 981EFF1371FCE40F1907DA262743B93E /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F2F35AD7354793D357E10226DE37995 /* Notifications.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
99 - 9EB13C869EF150828095C94F1FEFC517 /* Properties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BE4EE179BFA37C2F5F3928F9237A1F /* Properties.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
100 - 9F24B341383F0FF8EA368B3A7F9BC087 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };  
101 - A17930AC43F712547C2B4B58C1450B82 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C03FC1A11EE20AB8B6A4B398E11B26B0 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };  
102 - A43438F0B3A712FB5739EA173AB6F134 /* ReflectionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31257A57ECE5DD3A052A547DA8090EF9 /* ReflectionHelper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
103 - A7B5C0EE248855B3357C98A489F835D9 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E2AA0C415512D5F3F34F7A99AA4D14A /* UIImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
104 - A8D327620CE1909AD98F6B239AA60018 /* XRCarouselView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7437E1C250CA27898AA8815D1117643B /* XRCarouselView-dummy.m */; };  
105 - A95766E9124B13BABFF00CFBEFEC0501 /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = B6554BE7D86E2DF12BC2CFA630452CA0 /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; };  
106 - AB6A5752C4586385EE13F1E6E2E9F40E /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0322584439902B09D766EF9B00C87E2A /* SVProgressHUD-dummy.m */; };  
107 - AC2961AE064F12C1AA82F853AE6CF4DE /* OtherExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9462CA128209C32EE6E6647C88609D1 /* OtherExtension.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
108 - AD2C576F50E67B2417C1D17FBF5E32B2 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08E13F442024BE43D2F31AA6F2C300DA /* AFError.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
109 - B2D8BD6984912C60C7A22BF665987A73 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 140A2830037A30E45442BA52CBDA1CFC /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };  
110 - B35D34D1C1A4B0A5FAD90526DE5D88A4 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59271332AFD884264C5B45B6B6152051 /* ImageIO.framework */; };  
111 - B575E905525EDD3311A9872A0C4307AD /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 65DEF3C169B8F1241E74C3D5C7DA5A6D /* SVProgressHUD.bundle */; };  
112 - BA3AB9E7766B254534C357EB523687B6 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1836357ECED17B3B0BF22256498AA8EE /* UIView+WebCacheOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
113 - BBF90CAC12DA7C2713DB47B3BE5C898C /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 206933D2687A3DC4CD2836F2AEF28A3B /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };  
114 - BC9AB82CB1C91977B5C1C96A25A9CA22 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = F638493F2C879E2AF820AE53EA390269 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };  
115 - BD14752B5379EAA21AF328A8ABE08A6D /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = DB5FF7B561F6F548C82F1FC27FDD72E8 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; };  
116 - BD2E6B5D9C3C38D8C1BDCFE0CD6E489D /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 469D54339A6D448DF6D1166FDB669676 /* UIImage+MultiFormat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
117 - BF901FE99C862B2093FF8E2F71B80F93 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 1439A3EA7193042844C3E9C52032677C /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
118 - C23D014A840F87E883B74ABEC475E608 /* HandyJSON-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FD2B11D4DCD30BDBA06841569E01E1BD /* HandyJSON-dummy.m */; };  
119 - C577B322B52228B272D52FF32B7BE30C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };  
120 - C5FD57751548EFFA6567AFD2EB47CD56 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232E0E55F341C5600028F7AAA4F59E8A /* Request.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
121 - C633AE7C1F16ADA3AFEE968396B73A4B /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = B71F8A62F3906657D17D418212E1CBA1 /* UIImage+GIF.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
122 - C8D2BE872D244EB549F2EC97069CC4D0 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BB7CE29DC4FFF250766240EA8DA973D1 /* UIImageView+HighlightedWebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
123 - C906E3F3B8CC5A9E003DB020DFAE7864 /* PropertyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81D2AEE4F419083BF22474B240B3D9F6 /* PropertyInfo.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
124 - C98D39690CC370401444D498206BCA2B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; };  
125 - CAD7174B4833082EAE9507FB4CDCB07B /* Toast-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 85EBECC44FA24EC40748D3CB399DD1F3 /* Toast-dummy.m */; };  
126 - D1341DA6F9B384B99BAB4C367DAD6BEC /* UIScrollView+EmptyDataSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F6A571F05F4D0DD12870CE83C8F787 /* UIScrollView+EmptyDataSet.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
127 - D1D5D64268DDC619511D3942F434D7DD /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = DF68D7CB4183F99C38744F4985CD422D /* SDWebImageDecoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
128 - D425D13A48689CCBEA1C0BE43928A682 /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DFB6D55866F4F62D8116993D42B55A8 /* ISO8601DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
129 - D5686072DEC1A0E14F8C100FCC873F73 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD387D9E3BDF322939523D4DF31CA79 /* TaskDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
130 - D603EC0AAE41B1733F0A4A2FA4381910 /* SwiftHash-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 448D149E9E2122E63C2D8CDB8E1159CB /* SwiftHash-dummy.m */; };  
131 - E198F398404F07805E5189165F3C1E64 /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9ED9DA2E61F2A4DD7E760C61C47A3F1 /* Timeline.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
132 - E49369FF3BD66698C3B61B8DE9C58DE0 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = E3370B03674C70DABFF75D9D2BA95DCE /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; };  
133 - E72FACD066C66E010F4C91956E8E29CB /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = F6C063D5E492D3ED69858D446C30719E /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; };  
134 - E990A247D80417D4555735E8A8DBD76C /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 72803D16FA054A0D26C303991C1F2B3C /* SVIndefiniteAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
135 - EB3F85272BEE4C2EB0321741E8FE4B75 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = E33C2A8A35CA23130F27CFEC0285B7DB /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; };  
136 - EBA0781A1E2822CF7DFD56ACD394A63E /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA07E2E477768269A8D0BECE492EBAF /* Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
137 - EC3CC4DC8A5C9241AE7D9359EEAFC69F /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93ED65B5F47F5FEA00C9BC9D151B1D26 /* SystemConfiguration.framework */; };  
138 - EF1B6B88FF4C6BC506B9C85BAEDF034E /* PointerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3447CC75BA7C93ED3BF68C2F65392471 /* PointerType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
139 - EF57A4E0C40DA6E906B390C69902421F /* AnyExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 931ED830C3B0B8852F1479DE61BA997E /* AnyExtensions.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
140 - F1A921225B642E15ED24FB4734240F8F /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 24C69C342339292A7BBB5C56D2C12D12 /* SDWebImageDownloaderOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
141 - F206FE65A9D924A3F6ED6221E3BBD35E /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6768B1FE2E118D79D8A1613520B9BB23 /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; };  
142 - F79EC3C3CF96DFC885E8DD247FEF08EB /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DC66067EC016B21D6BC487C409083AF /* SVProgressHUD.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };  
143 - F8FB51647A0925CDAF63C5DAA23D8B4D /* Serializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39C3C21D34A34F85D09063C7E1255E9D /* Serializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; 10 + 00E153632A414101E0A66AE23569802B /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C01563CB8CAFA848353DD90A07F2F47 /* Result.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  11 + 0369C812B817E442E9BF7B2F561E1AEF /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19A6339BCDC426144D4987C81596418 /* Configuration.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  12 + 06B6D63D2B2E6F2896A15C18097D3730 /* UIView+Toast.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BD1FCCAAFC6349CA1E2AC3881DB81FC /* UIView+Toast.h */; settings = {ATTRIBUTES = (Public, ); }; };
  13 + 079D990738735591330332B5F2551AE4 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFA9DF74078A51C9573DF6952A753D1C /* NetworkReachabilityManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  14 + 0ABF85713B5ABC01E4121F8DBCBBD195 /* Deserializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFFC9D8585FF5A3FC4C7FD63A93DCE16 /* Deserializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  15 + 0C11C193B2F9FF679EB214C272C8A480 /* Transformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ABA7E2E494925BF34BC9885BE24E31C /* Transformable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  16 + 0D0F6E0ECE5915267F0EA404BDCD4BAC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  17 + 0D6E3F656916E4C6734BAF1DAB7CAEE7 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 61D09F1E0C8F29641858460B3928A5B0 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; };
  18 + 12DE723E9DF6F13F3286874C3A95E30A /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14E325E19530D7ADA41064D345141437 /* Logger.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  19 + 143D0DFED5AF7708744EBDB443F9812D /* EnumType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CC52F25BF175D139AA0E5C94DC363A9 /* EnumType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  20 + 14CECE238604E1D44104E5BCD14EB2BE /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BD55715F6A333D077B971AD89F07626 /* SessionDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  21 + 164781197625A3149B3BDBCAA2AC8CC3 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981D262EBFB4CA168BE569F48CC64843 /* Validation.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  22 + 189863C7E2504923687D78D7B081F8CA /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 229808FB79115B70777D682D8335C18E /* NSData+ImageContentType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  23 + 18FE70ED14474EE6A49E85DE9C5E4C17 /* AlamofireImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 600ABB9AA8054F7B4E851C17D19FCAA0 /* AlamofireImage-dummy.m */; };
  24 + 1A34F151BC19E9D0725C689FC1038209 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B05BD93D4EE278B866CC9AAF18763DB /* SDWebImageDecoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  25 + 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 78F77FFCC80D398532E854672D527FD8 /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  26 + 1E2754F17B8625E93745EB87C0E58961 /* Pods-ParentAssistant-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1706C196E50CAE9C6DE364B9BA5E9DCB /* Pods-ParentAssistant-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  27 + 1F4FA4B67BA7582CA193404E3510B095 /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = CBB0446840A0CDD4BB7D69692D07CC21 /* SVRadialGradientLayer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  28 + 204944D67267632DD7CD4BEFB60AC389 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82D7054D7F1E7FE0ACBE043A3FA7F50 /* Response.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  29 + 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  30 + 242367446F58A71823A8250396E775A3 /* HelpingMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05B1F80DC3C02C2AD29D4C6CEA059CCD /* HelpingMapper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  31 + 26479B07464784F3BF8C0853CA049976 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  32 + 29B1FA33CD27E5CAEC884DA6D0072CFC /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BBA6274610821F15000C6CC777D555B /* SDWebImageDownloader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  33 + 2B58B070F9D7324583D01EE906BC918C /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6296C8F6861894C09A46E509B544A6 /* SessionManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  34 + 2B5DF32B1906ED4F0088D37CE08CB2B9 /* Metadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00395AB0A6A459E12899B1CC7AA3C954 /* Metadata.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  35 + 2EA01E4E252B14F7953C56C100482236 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 920C3AE864C4E24091B77772A498A58C /* SDWebImageCompat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  36 + 32EDA9ED83F4442303A46839027E152E /* AlamofireImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AD53A7A5BDC98AFD3CE8CF1BC407F10 /* AlamofireImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  37 + 332B3CC48AC35662839D5A89D1FD9C0B /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E4D61E78309E6543D6EBC75BE2967417 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  38 + 33FCBEF6884A33B921FEC6A9511B8E20 /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A23A7E20FB52B9BFC4899C0FEBA2C6CE /* SVProgressHUD-dummy.m */; };
  39 + 343B30C989188B77FB1149FED753A63C /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE58263CB0A52CDB5D3790DC6D0D74F /* ServerTrustPolicy.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  40 + 357EC08486308022D69F865CBFC53798 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 61CAF6761E3C21827415A9DA38D18547 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; };
  41 + 36840E12F93D5E0D201B1D998B96EEB9 /* UIImageView+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D00913B407B6DB96C7E7B48C21D904 /* UIImageView+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  42 + 385BDDC55889104E43C83664FD4C2BD3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  43 + 3A9E64415250045D18CD329DE4776D9A /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 496A0D655D409BDF23A3826300EBCD1B /* UIImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  44 + 3B2224950C9D1CE87BA75653DDDD2A13 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F3CF9F638E5784E56583202BEBE63239 /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
  45 + 3D0142A71F210A641528761123C4F1C2 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ED641951605DEB02B067F9D1915C5A9 /* UIImage+MultiFormat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  46 + 3D34EECD1D7C0DC13F3E19C4C74F212E /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 358430CDB8CA6FB92C74E9FC7F6EB159 /* SDWebImageDownloaderOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  47 + 3F16FEA96023ABF8BB9A47112409421A /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A2BD80EBA9375936EAA1AE0D930C61EC /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  48 + 4140A49CB0D5F03DD7565AC94796D856 /* Toast-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E637F89EC35850C7250805992BB1C0 /* Toast-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  49 + 4214C2FD7E877BAD66B5E69E70D52CC2 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A53991A7FAF70CDAC1F059FB04F5543 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; };
  50 + 48F71FC920A4F562FF7ECFD25BD08F2E /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 467C66A8C88F09EF9D0129564F08540C /* NSDecimalNumberTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  51 + 4A961542DBC3F70E502B854EBB870694 /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BC1B5A06113F348365D3564FD6425C6 /* EnumTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  52 + 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CECDC33DC6A3E686FD21577C5B23C258 /* DZNEmptyDataSet-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  53 + 4F7B3FA3957DCA2A67546E72117904F9 /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC1E0E16DEFECC3E2FE92A428C9920D /* HexColorTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  54 + 4FAADAA79CF5A8371B74578A2EC10761 /* XRCarouselView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B63F0AB7376A64C50DA03CACC7D9CC2E /* XRCarouselView-dummy.m */; };
  55 + 50424A0F4A3907712832B1FA56C9E2A2 /* Measuable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07BCC67F387326CAFCE34AF5FD2DBDE2 /* Measuable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  56 + 53591DA77C42B53EB9AB3060008F41B6 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 02DAB9B7A1A3D2199EFC7FC7FC69ED85 /* SDWebImageManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  57 + 5438E76D8DA2CB8E045DE40226F4A5AB /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D7A5D10D9FFDD32C4D3CF85DDCFC707 /* DateFormatterTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  58 + 545C0FA9073D729E2E8C3EF9678C0DEA /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1BF45D7C52BC6493B283DDB371395F /* TransformOf.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  59 + 5475A5933FABB5F9999E31020427B182 /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6614C2951E5A4AB6D1DF2B076BF1A5C /* DataTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  60 + 56815D1138F9669E37F2004119169267 /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 70B842936FA16DF44F4AD4FC84E225A4 /* SVIndefiniteAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  61 + 57B5D779BAB2A1CF8C2D4CF8F14066A0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  62 + 58812AABBC0A1E7AE019752424DF31A7 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7C98E50FC5D694C89DBEE8A1486D900 /* MultipartFormData.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  63 + 59145DFC87F4E74844E76619E8C4114D /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 310743AC8DCCF3F81515515A6FC64B8A /* UIImage+GIF.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  64 + 5C95D2513AAB007D33804F074AC4DD33 /* Export.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1300F08331C16959F41C2533B209EF5 /* Export.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  65 + 5D0701D0FA9726E83C52A53F4BEAD02B /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99BBF9B209FE42B0D74F5CFB60627F /* UIView+WebCacheOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  66 + 5D287B058202AFDA4DED5D49B6ED0A1E /* UIView+Toast.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B41A43E5D5CCE97E46706AC4240B68 /* UIView+Toast.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; };
  67 + 5D8FA1EAFFDA438C0D3E909D54D6E657 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 155F8627DF2C4A4A091DD4AF34FFEF02 /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  68 + 5E25BCD30BDE2E7A68D1A6FAF7253AD4 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2245A79B4B989C667CBB26B48B7A1896 /* DispatchQueue+Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  69 + 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 293A8917426C277C951BE22C661A240A /* HandyJSON-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  70 + 60E47009DC055C6C140154BC96B5C58C /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC0A874231DDAD102B02D7EFD048FDE2 /* Image.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  71 + 613167D898FF421A6F75D1FE5D145B9B /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CD0FA7EE743F01B3A6385702606A408 /* Alamofire.framework */; };
  72 + 6257B7791953547BB4FD33142C6A4016 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DFCFB41829DC67B9036DEF9766C6C88 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; };
  73 + 638A8C8931AA82B35E4165A32BDEF8CA /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BFF20BC7E4F55C09BAC34A664D91FED /* UIButton+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  74 + 6540CC4D369A32F6DE54AFA8D5D6FAF9 /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 489ED6DFB42C7C8F6A4875005025A913 /* Alamofire-dummy.m */; };
  75 + 666A863EA9B0A00CA5EDDB4C96EA014B /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = F775144A6F17788F065E01BFD8DC2D5C /* Reachability.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  76 + 68EF6ACDBEC67DED9ACB63B4CFA05404 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4D8AA9257567AC16CB397E7E8BF346 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
  77 + 69735BB95E8E8111E0CEA96BBA19486A /* ExtendCustomModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D3997593CBB0B018C81C73E8337C2C /* ExtendCustomModelType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  78 + 6C5B6525AD8543CD0EA5382D9B9EBF00 /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BF833E322898122D95617BD9520476D /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; };
  79 + 6F4160DEA9816F49351CCEF452CCF00C /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98932AABF2712E9978244730956580D5 /* CustomDateFormatTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  80 + 71770C33C6DBF555B10D0A42E5C034F4 /* NominalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C29AD1BD351F370FBE921BBE6756CEC9 /* NominalType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  81 + 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  82 + 78F4229B4A746A38341474FEB9DADB25 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F3763627E35DE67CD17EE93E640DD39 /* ParameterEncoding.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  83 + 7931BF35785763872BD11EB65164B1D5 /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F75E090F317987C0134B9DD1E5963C9 /* TransformType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  84 + 7B8F1E3301B7F3D1AF25FDE0E2618647 /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = DBA6EC35D53897ED2A96FEDE1BB384BA /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; };
  85 + 7C3888324281E325ABBDDB3888D52125 /* DZNEmptyDataSet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EC105ECBFE938402821EF19D7C5DA1DA /* DZNEmptyDataSet-dummy.m */; };
  86 + 807283562FFCAF1B2AC3B251ABF34B5A /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B31E52FEB6E5A6A955D4050CB76B18C /* URLTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  87 + 80AF024EF162F4FB88CCAAA2FA6FAAD5 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F1187580C59983EBFA6A55260AF21079 /* SDWebImage-dummy.m */; };
  88 + 8444B1FF566FC96D823C154BEE6A4A03 /* BuiltInBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68ECD5E13EA08D669EEBD74218B18FA5 /* BuiltInBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  89 + 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */ = {isa = PBXBuildFile; fileRef = DD324E3E21CD21F91211149384F64690 /* UIScrollView+EmptyDataSet.h */; settings = {ATTRIBUTES = (Public, ); }; };
  90 + 85B4114292AEC3C6DCD2F9500A064F9B /* UIImage+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E3282E372FE0A6C0D2227384238F921 /* UIImage+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  91 + 86DCCE5F06E9EDF67344C60D4859F032 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 715810392F163BB36DFE8AC307460289 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; };
  92 + 86EF282C771B9E7A12106ACBE6E820F5 /* ExtendCustomBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7701D17547204EF54A538449343E8A4 /* ExtendCustomBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  93 + 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 92B55B2A9C151490137F69027B7F531E /* HandyJSON.h */; settings = {ATTRIBUTES = (Public, ); }; };
  94 + 8E31EF89BD192C6AACDE9E0655861D3D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BAE5BE9DB67074649A1927384361E0A8 /* UIKit.framework */; };
  95 + 8F5C0849D2757FC5A7C81B81BA3813C3 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BE4F7B39AE70471948017C04083277A /* ResponseSerialization.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  96 + 90E5A049B2FE3D38A1EA782CBB763739 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 01529461C8BC5BFBF1FAD1AE7D691496 /* SystemConfiguration.framework */; };
  97 + 92BC60F896B3049AEF17412EE13B32D5 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D96BCA19B9F922B2258E4C0D40666B58 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  98 + 930D1C2CE2E4A32830066A7F4240F88F /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D9602FA58305177F98B7472A155DE66 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };
  99 + 93258C9412DF54DD088A385C2CCC79D1 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D43927282F3DD1C78741ABFCC5E0C768 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
  100 + 9371A6AC1CEABB24E7275AACD3FDC21A /* Reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = EF0B6E4594449A55A06C44CB6D1223F0 /* Reachability.h */; settings = {ATTRIBUTES = (Public, ); }; };
  101 + 945146A0826BB693F1B9496A0620A97F /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 729A72124A700ED6D7D56FE6E3316184 /* SVProgressHUD.bundle */; };
  102 + 95F6802FB7C748286D6E1D6876552E8C /* BuiltInBridgeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 916CF2DD179C34072F0CED7EA7E172C4 /* BuiltInBridgeType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  103 + 963D3083B43A304CE4A81FF8908C644C /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10D6F8B588CB7C3C02CD426DADF34CE4 /* DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  104 + 980154A8EB800AAF627251C8AAD7EAA9 /* XRCarouselView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89457F43B7DE2154380C8DD976759AA2 /* XRCarouselView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  105 + 981EFF1371FCE40F1907DA262743B93E /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = E215EB7C10CD4B2F724959DB344FE5C0 /* Notifications.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  106 + 98C28E5A4A7CC37A671D4BBAE25EB3CB /* XRCarouselView.h in Headers */ = {isa = PBXBuildFile; fileRef = AA29655EDD56783CB2C21A411019B7BA /* XRCarouselView.h */; settings = {ATTRIBUTES = (Public, ); }; };
  107 + 9D9717AC018F075F378E52B078CDBFB5 /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDA2AA9043380263CFFD99AE883B70ED /* ImageDownloader.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  108 + 9DBB6831E79F70D2E8C4DFD169E228E2 /* Request+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC28263CA0EDAEA1CBC1173B87FEA769 /* Request+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  109 + 9E686D93A33DD9756B0C21B68BD7D758 /* ImageFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A58625E1014C6D82D1825309986334E1 /* ImageFilter.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  110 + 9EB13C869EF150828095C94F1FEFC517 /* Properties.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECC6F721935680D316DC183994F4F569 /* Properties.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  111 + 9FC9BC048B02CFF720B9CFBE4DC80264 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DA08525DC2775B611071866CF38CC96 /* SDWebImagePrefetcher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  112 + A04DAA4579CD1E21D2161AABB36244C4 /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = F81C313FED69F64F2F4F403B4C4EC3F6 /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; };
  113 + A133EAE3F50C55B4E1A03A5F9D6B3A4B /* UIButton+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4ACCC8EE8E5E07D0CD171894588314 /* UIButton+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  114 + A24D31929B67BB4D0EED65AA74C0E3F9 /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = A8CB977B7AFFFA509CAA11CD0C03AEB5 /* SVProgressAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  115 + A43438F0B3A712FB5739EA173AB6F134 /* ReflectionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35322B49B5EBE0CF14B7BC8677497347 /* ReflectionHelper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  116 + AC2961AE064F12C1AA82F853AE6CF4DE /* OtherExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4457386C2A87F3E11630992C9CAA7836 /* OtherExtension.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  117 + AD2C576F50E67B2417C1D17FBF5E32B2 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EBA3110EB94A0568FF28796D778675E /* AFError.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  118 + B0114B93073F87D24BE99FCEE08CDAE2 /* XRCarouselView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 49DC3C5FB6A7B1CDAA1410FAABB684E0 /* XRCarouselView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  119 + B06A3FFD3EBF03FF3166F6E1B0D665F9 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 98BA100696255C8CFD15860D64267467 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
  120 + B2CC21A9D71EA49F2A55896265CF8E29 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B82FE543DC2AE8EF3A0F380DE2B5988A /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  121 + B58BEA72F3BC139D3784844F73AA791F /* SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = E651A4469FA2206746488B70290D48C0 /* SHA1.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  122 + BBC827F8711B46CA8FC3854C99DF703A /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A591BFD7762D296F2E84EBC08129BFA /* SVProgressHUD.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  123 + C23D014A840F87E883B74ABEC475E608 /* HandyJSON-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 46E35C087C53D197C9D213DF73A74B66 /* HandyJSON-dummy.m */; };
  124 + C4DC2D005B7A1313DF98AFF23E15D1B3 /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8249AA0D5DBC641B891AE927074850B2 /* MD5.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  125 + C577B322B52228B272D52FF32B7BE30C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  126 + C5FD57751548EFFA6567AFD2EB47CD56 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = E74F653E7072F40DB006FC90854FC840 /* Request.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  127 + C906E3F3B8CC5A9E003DB020DFAE7864 /* PropertyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CA29ADD75C3FE58A4ED07E10D427C9F /* PropertyInfo.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  128 + CA6644C7C70AC449F8D9968CA529C381 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 852A7B853425A17ACDE963BB0C57B689 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
  129 + CB5529FBDB9ED31E939EFD0EF7D8EBE3 /* SwiftHash-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DF7918BBC8A10388FDE15B624F66A8E9 /* SwiftHash-dummy.m */; };
  130 + CBFDD17FED69C5F001648B331CE5FDDE /* Pods-ParentAssistant-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F6BAADF2798AA6F62DA82FAA92DECB07 /* Pods-ParentAssistant-dummy.m */; };
  131 + D1341DA6F9B384B99BAB4C367DAD6BEC /* UIScrollView+EmptyDataSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AC81C76B41B0ABF4E94921ADBA70C30 /* UIScrollView+EmptyDataSet.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  132 + D22AD2613455598A94BFCCA33AA9B2CE /* Reachability-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 17EFC56D8D5FA327B6DEB6D0ADC56C1C /* Reachability-dummy.m */; };
  133 + D425D13A48689CCBEA1C0BE43928A682 /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7379E87D9FF2E196ADB91DC8A0A5F2F3 /* ISO8601DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  134 + D4C68ED144E24084583644C877C41229 /* Reachability-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 078CF0A581F3816CBA8D7047271D2CE9 /* Reachability-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  135 + D5686072DEC1A0E14F8C100FCC873F73 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DBA7A206E80F9E00E01BEFE74D6D69 /* TaskDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  136 + DC896F68B018619A895D3BE4C70D0E4D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  137 + DC9317C7F961BB389FA7ECC2260B08F0 /* Toast-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 53599A8492E17F111CC5C8D3C50E872A /* Toast-dummy.m */; };
  138 + E198F398404F07805E5189165F3C1E64 /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A34017AEE736DE7CC86E3201A0B303C /* Timeline.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  139 + E34A395CCE4DFEB66FE70DC91B6FA149 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 770A612E1A02028636A4D09BDEB87D10 /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
  140 + E363FB7AFABD373D4D2EB91EEAEAA556 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 06E0F3A00F6C087D410087D3FE65529D /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  141 + E83FA4C154706E4EEAD3DE51B86C5BAB /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B77DE72B7ED4AED0DBED016D1274EFE8 /* ImageIO.framework */; };
  142 + E90F4E9FD8EA1D01B118497ACBB199D8 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CD28D005A100BC203777597B48B8AD06 /* UIImageView+HighlightedWebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  143 + E96AB8B40C45FF09A9F396DCFD27D1C0 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B751448AE7B6607E97470BFD4082216 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  144 + EBA0781A1E2822CF7DFD56ACD394A63E /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A5A5A7B7C1088D4D4ABDFAAF6E54F3 /* Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  145 + EC5530E67F5D0CEEB72B1E36367AF20E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  146 + ECE9CADAD4EB77DEC8B08FD74D6DD3BE /* XRPlaceholder.png in Resources */ = {isa = PBXBuildFile; fileRef = B00FEDA7D2B852B770837D954A635F0B /* XRPlaceholder.png */; };
  147 + ED693ED034E99CACC204CFDFCE742485 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  148 + EF1B6B88FF4C6BC506B9C85BAEDF034E /* PointerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABE9E390C3EADB423277CE1E912E10AA /* PointerType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  149 + EF57A4E0C40DA6E906B390C69902421F /* AnyExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF39B11A9C408A7CFA8E347E7F717E80 /* AnyExtensions.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  150 + F254CF02931202CD44537EAD61D27BE8 /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEA8115215CE30840A6225F435645485 /* ImageCache.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  151 + F323261D44C70B6D6C4127E85BA62E2E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94B64C32F67C820564A1C07F82FB412C /* QuartzCore.framework */; };
  152 + F89476E482F3768E646BBBF8CD21E6EF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; };
  153 + F8FB51647A0925CDAF63C5DAA23D8B4D /* Serializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF0EB1CAE5B795EB85A1165F6D98C372 /* Serializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  154 + F9554493CBDF921FEF278972C7FA3221 /* SwiftHash-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B25C902A48A887CDEA53D385B48C92E /* SwiftHash-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  155 + FB9814E780909550F494F507BEB3B6B5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94B64C32F67C820564A1C07F82FB412C /* QuartzCore.framework */; };
  156 + FF0007F0502C85600F98BC8E62F739D2 /* AFIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE04BA7BB2F95B59112DED31AECB069E /* AFIError.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
144 /* End PBXBuildFile section */ 157 /* End PBXBuildFile section */
145 158
146 /* Begin PBXContainerItemProxy section */ 159 /* Begin PBXContainerItemProxy section */
147 - 14508FFAEE6EBD1C2386229671393CCD /* PBXContainerItemProxy */ = { 160 + 189D44E9EA4F94C8EC2EBCD3B9A94437 /* PBXContainerItemProxy */ = {
148 isa = PBXContainerItemProxy; 161 isa = PBXContainerItemProxy;
149 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 162 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
150 proxyType = 1; 163 proxyType = 1;
151 - remoteGlobalIDString = 6376DC419EEA98495631602218A4F31B;  
152 - remoteInfo = SwiftHash; 164 + remoteGlobalIDString = 1465651EBBC44AD3276DDE2476CDA450;
  165 + remoteInfo = HandyJSON;
  166 + };
  167 + 1DC0B6708B1B4007743DC8E966822305 /* PBXContainerItemProxy */ = {
  168 + isa = PBXContainerItemProxy;
  169 + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
  170 + proxyType = 1;
  171 + remoteGlobalIDString = D386C75EFD4F03725E4EFB866B600B9A;
  172 + remoteInfo = DZNEmptyDataSet;
153 }; 173 };
154 - 1F4310C891A7C6531B2EC2F44755F5D2 /* PBXContainerItemProxy */ = { 174 + 38E587F9ED2E7A43122E76199C12388D /* PBXContainerItemProxy */ = {
155 isa = PBXContainerItemProxy; 175 isa = PBXContainerItemProxy;
156 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 176 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
157 proxyType = 1; 177 proxyType = 1;
158 - remoteGlobalIDString = 8FA4EA707F3B6CFDACB1C85C722D2E73; 178 + remoteGlobalIDString = 37F4E36BECBDD0070D2501E766C0238B;
159 remoteInfo = SDWebImage; 179 remoteInfo = SDWebImage;
160 }; 180 };
161 - 40A6BB26078AD6CC3BFED24490AA679C /* PBXContainerItemProxy */ = { 181 + 4AE51A1942CC8930F7A20592BF7BC9CB /* PBXContainerItemProxy */ = {
162 isa = PBXContainerItemProxy; 182 isa = PBXContainerItemProxy;
163 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 183 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
164 proxyType = 1; 184 proxyType = 1;
165 - remoteGlobalIDString = D386C75EFD4F03725E4EFB866B600B9A;  
166 - remoteInfo = DZNEmptyDataSet; 185 + remoteGlobalIDString = 9EFE4C70245EE2857D336B8B9FA4E825;
  186 + remoteInfo = AlamofireImage;
167 }; 187 };
168 - 594A8718DA74EC137A691ED506FE6CCB /* PBXContainerItemProxy */ = { 188 + 4B6C29399AB72BDC0DC80584EC3BD333 /* PBXContainerItemProxy */ = {
169 isa = PBXContainerItemProxy; 189 isa = PBXContainerItemProxy;
170 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 190 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
171 proxyType = 1; 191 proxyType = 1;
172 - remoteGlobalIDString = 27189F0EDBCA8831C460D0166F6F37A1;  
173 - remoteInfo = XRCarouselView; 192 + remoteGlobalIDString = A0A5E57D4BB5AA2602B591D713407086;
  193 + remoteInfo = SwiftHash;
174 }; 194 };
175 - 82A515E1EF9A2DA9422FDE7D829F0650 /* PBXContainerItemProxy */ = { 195 + 4EDB1BF0F4A9280D81BBE57A53DD7917 /* PBXContainerItemProxy */ = {
176 isa = PBXContainerItemProxy; 196 isa = PBXContainerItemProxy;
177 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 197 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
178 proxyType = 1; 198 proxyType = 1;
179 - remoteGlobalIDString = AAC4087A5A57F5566AB9B54FEBADBC36;  
180 - remoteInfo = Reachability; 199 + remoteGlobalIDString = 0A4402E270B0A4B00A031931BD805EF1;
  200 + remoteInfo = XRCarouselView;
181 }; 201 };
182 - 8E7E6D806A10070D238FC81F6BAB4860 /* PBXContainerItemProxy */ = { 202 + 9554361F88EB7FDE40F109D073B49910 /* PBXContainerItemProxy */ = {
183 isa = PBXContainerItemProxy; 203 isa = PBXContainerItemProxy;
184 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 204 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
185 proxyType = 1; 205 proxyType = 1;
186 - remoteGlobalIDString = 9A9DDC64623B3F5E6DC7009C16752B95; 206 + remoteGlobalIDString = 620180280B57A3DF973662E546D211E4;
187 remoteInfo = Toast; 207 remoteInfo = Toast;
188 }; 208 };
189 - 8EE514F180AE8F72FA2CB958642AC2D2 /* PBXContainerItemProxy */ = { 209 + A1758AA696D56310AA192B587162169A /* PBXContainerItemProxy */ = {
190 isa = PBXContainerItemProxy; 210 isa = PBXContainerItemProxy;
191 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 211 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
192 proxyType = 1; 212 proxyType = 1;
193 - remoteGlobalIDString = E55BDEBC8F73D6B7936791D0822F70D6;  
194 - remoteInfo = SVProgressHUD; 213 + remoteGlobalIDString = 88E9EC28B8B46C3631E6B242B50F4442;
  214 + remoteInfo = Alamofire;
195 }; 215 };
196 - A81D9D0AD4D99710674892A4C13CE7C4 /* PBXContainerItemProxy */ = { 216 + B52B9C3E170467E0CA53E1CF539F3C3C /* PBXContainerItemProxy */ = {
197 isa = PBXContainerItemProxy; 217 isa = PBXContainerItemProxy;
198 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 218 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
199 proxyType = 1; 219 proxyType = 1;
200 remoteGlobalIDString = 88E9EC28B8B46C3631E6B242B50F4442; 220 remoteGlobalIDString = 88E9EC28B8B46C3631E6B242B50F4442;
201 remoteInfo = Alamofire; 221 remoteInfo = Alamofire;
202 }; 222 };
203 - EE8B3E8B9AA89EC765C0E539B4E7EDC7 /* PBXContainerItemProxy */ = { 223 + C3177531DBE096BDE468C9291366B775 /* PBXContainerItemProxy */ = {
204 isa = PBXContainerItemProxy; 224 isa = PBXContainerItemProxy;
205 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 225 containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
206 proxyType = 1; 226 proxyType = 1;
207 - remoteGlobalIDString = 1465651EBBC44AD3276DDE2476CDA450;  
208 - remoteInfo = HandyJSON; 227 + remoteGlobalIDString = CE1092398200ECC7DE7468626D1D0B98;
  228 + remoteInfo = Reachability;
  229 + };
  230 + CA2DE504A4CA7EA9E0FBEE6863FE1B71 /* PBXContainerItemProxy */ = {
  231 + isa = PBXContainerItemProxy;
  232 + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;
  233 + proxyType = 1;
  234 + remoteGlobalIDString = 637267420040487628765A2667620742;
  235 + remoteInfo = SVProgressHUD;
209 }; 236 };
210 /* End PBXContainerItemProxy section */ 237 /* End PBXContainerItemProxy section */
211 238
212 /* Begin PBXFileReference section */ 239 /* Begin PBXFileReference section */
213 - 02C19698DC383415660AD836A73862CF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };  
214 - 0322584439902B09D766EF9B00C87E2A /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = "<group>"; };  
215 - 03475756EB49A978A9F331D44971B60B /* libcrypto.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libcrypto.a; path = NIMSDK/Libs/libcrypto.a; sourceTree = "<group>"; };  
216 - 05BE4EE179BFA37C2F5F3928F9237A1F /* Properties.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Properties.swift; path = Source/Properties.swift; sourceTree = "<group>"; }; 240 + 00395AB0A6A459E12899B1CC7AA3C954 /* Metadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Metadata.swift; path = Source/Metadata.swift; sourceTree = "<group>"; };
  241 + 00E5D50454806A1FFA39BF7A572D4A37 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  242 + 01529461C8BC5BFBF1FAD1AE7D691496 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; };
  243 + 0241F285DD08F109C7549C2CDA98F2F6 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  244 + 02DAB9B7A1A3D2199EFC7FC7FC69ED85 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = "<group>"; };
  245 + 045B43DFAA088FDD2E5F7DE61A99D3EF /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = "<group>"; };
  246 + 057C8BFD76D95D8932478DFC5DA7DB3E /* UMErrorCatch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMErrorCatch.framework; sourceTree = "<group>"; };
  247 + 05B1F80DC3C02C2AD29D4C6CEA059CCD /* HelpingMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HelpingMapper.swift; path = Source/HelpingMapper.swift; sourceTree = "<group>"; };
  248 + 06E0F3A00F6C087D410087D3FE65529D /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = "<group>"; };
217 074C4EB853C59CB4403154F8FC3B42A1 /* Pods-ParentAssistant.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ParentAssistant.modulemap"; sourceTree = "<group>"; }; 249 074C4EB853C59CB4403154F8FC3B42A1 /* Pods-ParentAssistant.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ParentAssistant.modulemap"; sourceTree = "<group>"; };
218 - 07E1E2C8AC8B32A86D7C0A576243A070 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = "<group>"; };  
219 - 08E13F442024BE43D2F31AA6F2C300DA /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = "<group>"; };  
220 - 095F51C7CEE9EF306E13A58319881EFF /* Reachability.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Reachability.modulemap; sourceTree = "<group>"; };  
221 - 0969E5011DCC0C421F637E6859279610 /* Reachability.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = "<group>"; };  
222 - 09E993E3E47BE7E80DCFECCEA59937CC /* XRCarouselView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = XRCarouselView.framework; path = XRCarouselView.framework; sourceTree = BUILT_PRODUCTS_DIR; };  
223 - 0CDCA399D86C4D9BFD1AAA60E4F5A9F5 /* HandyJSON.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = HandyJSON.modulemap; sourceTree = "<group>"; };  
224 - 106A3E63162DD85E6D0BEC1EE1FFDBB4 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };  
225 - 11DABA5B57A3076260D36D4A9AE646F5 /* HandyJSON-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-umbrella.h"; sourceTree = "<group>"; };  
226 - 140A2830037A30E45442BA52CBDA1CFC /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = "<group>"; };  
227 - 1439A3EA7193042844C3E9C52032677C /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = "<group>"; };  
228 - 14EC82B350F60C65CB156014F5997DCE /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = "<group>"; };  
229 - 16CC2B704148D354077756FC0880DBCB /* Reachability-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Reachability-dummy.m"; sourceTree = "<group>"; }; 250 + 078CF0A581F3816CBA8D7047271D2CE9 /* Reachability-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-umbrella.h"; sourceTree = "<group>"; };
  251 + 07BCC67F387326CAFCE34AF5FD2DBDE2 /* Measuable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Measuable.swift; path = Source/Measuable.swift; sourceTree = "<group>"; };
  252 + 08D048205A3343D5E251F506CBBE23E6 /* HandyJSON.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = HandyJSON.modulemap; sourceTree = "<group>"; };
  253 + 0ABC8592074E5B83BDBF01388C67A8B7 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = "<group>"; };
  254 + 0B751448AE7B6607E97470BFD4082216 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = "<group>"; };
  255 + 0BD55715F6A333D077B971AD89F07626 /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = "<group>"; };
  256 + 0DFCFB41829DC67B9036DEF9766C6C88 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = "<group>"; };
  257 + 0F3763627E35DE67CD17EE93E640DD39 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = "<group>"; };
  258 + 0F4FDE3A8C9BEA27417C27172F5BC2A5 /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = "<group>"; };
  259 + 0F6296C8F6861894C09A46E509B544A6 /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = "<group>"; };
  260 + 10D6F8B588CB7C3C02CD426DADF34CE4 /* DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTransform.swift; path = Source/DateTransform.swift; sourceTree = "<group>"; };
  261 + 110D34637F4EF19C8F46B101A1509ABE /* HandyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = HandyJSON.framework; path = HandyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  262 + 14E325E19530D7ADA41064D345141437 /* Logger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logger.swift; path = Source/Logger.swift; sourceTree = "<group>"; };
  263 + 155F8627DF2C4A4A091DD4AF34FFEF02 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = "<group>"; };
  264 + 156F9486C74F4094ACE7858B18E5C41D /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = "<group>"; };
230 1706C196E50CAE9C6DE364B9BA5E9DCB /* Pods-ParentAssistant-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ParentAssistant-umbrella.h"; sourceTree = "<group>"; }; 265 1706C196E50CAE9C6DE364B9BA5E9DCB /* Pods-ParentAssistant-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ParentAssistant-umbrella.h"; sourceTree = "<group>"; };
231 - 1719FF827E35476E2C51408C0A9BD81C /* HandyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = HandyJSON.framework; path = HandyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };  
232 - 172419A08571955755C3C6FB2044DD9D /* SDWebImageDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDecoder.h; path = SDWebImage/SDWebImageDecoder.h; sourceTree = "<group>"; };  
233 - 17403F9FAA48DA29AAEB297BE9AC4D51 /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = "<group>"; };  
234 - 1836357ECED17B3B0BF22256498AA8EE /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = "<group>"; };  
235 - 18F6A571F05F4D0DD12870CE83C8F787 /* UIScrollView+EmptyDataSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+EmptyDataSet.m"; path = "Source/UIScrollView+EmptyDataSet.m"; sourceTree = "<group>"; };  
236 - 1914DA670BEE4BC1F461E88ED1BD7C26 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Source/Configuration.swift; sourceTree = "<group>"; };  
237 - 1983D355FD75B9D24A71756509C98131 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = "<group>"; };  
238 - 19FAAAAFAF3A705D1081BDCDC14CAFD6 /* UIView+Toast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+Toast.h"; path = "Toast/Toast/UIView+Toast.h"; sourceTree = "<group>"; };  
239 - 1D374115D56716D6284C03A777CD2BB4 /* Deserializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deserializer.swift; path = Source/Deserializer.swift; sourceTree = "<group>"; };  
240 - 1DC66067EC016B21D6BC487C409083AF /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = "<group>"; };  
241 - 206933D2687A3DC4CD2836F2AEF28A3B /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = "<group>"; };  
242 - 2098C9BB32F72BB65BA83ADD1F338099 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };  
243 - 20C0A79CAF95E65B981CC5F896E4334C /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = "<group>"; };  
244 - 232E0E55F341C5600028F7AAA4F59E8A /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = "<group>"; };  
245 - 24C69C342339292A7BBB5C56D2C12D12 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = "<group>"; };  
246 - 26EF7D93FE7442849AC14571996AC8ED /* Logger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logger.swift; path = Source/Logger.swift; sourceTree = "<group>"; };  
247 - 2830040C9AF69744EEB45C092E65CA2A /* NSDecimalNumberTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSDecimalNumberTransform.swift; path = Source/NSDecimalNumberTransform.swift; sourceTree = "<group>"; };  
248 - 297F8CEFA42DFD823263EA02BC36D29A /* HandyJSON-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-prefix.pch"; sourceTree = "<group>"; };  
249 - 29BC53491C8D6BA4B81045D6FBBA043C /* Reachability-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-umbrella.h"; sourceTree = "<group>"; };  
250 - 2AD254563DCC20283BB5C0C5B4E57B5C /* Reachability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = "<group>"; };  
251 - 2D3152CF39784BC2AAD4747AF03BB50A /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = "<group>"; };  
252 - 2E85535E49256ABCDBBB9EA045CE6268 /* HexColorTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HexColorTransform.swift; path = Source/HexColorTransform.swift; sourceTree = "<group>"; };  
253 - 2E90E960C03E09803780D5C47A55A4DB /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = "<group>"; };  
254 - 2EE1F3AAF4D2513EA3BFF47F019026DC /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = "<group>"; };  
255 - 2F2F35AD7354793D357E10226DE37995 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = "<group>"; };  
256 - 31257A57ECE5DD3A052A547DA8090EF9 /* ReflectionHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReflectionHelper.swift; path = Source/ReflectionHelper.swift; sourceTree = "<group>"; };  
257 - 31A74FD90C96035085B5A148E9CBA64C /* EnumTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumTransform.swift; path = Source/EnumTransform.swift; sourceTree = "<group>"; };  
258 - 32115C18B0BD53A5791A3FA797AB85AC /* ExtendCustomBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomBasicType.swift; path = Source/ExtendCustomBasicType.swift; sourceTree = "<group>"; };  
259 - 323A41D79693687F0377B9ACACC90D4A /* XRCarouselView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-umbrella.h"; sourceTree = "<group>"; };  
260 - 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DZNEmptyDataSet.xcconfig; sourceTree = "<group>"; };  
261 - 33347618F6541AA20F52632F9EA10CA6 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = "<group>"; };  
262 - 33F1F6213579E70C284C8445EBD7DBDD /* SVProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SVProgressHUD.framework; path = SVProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; };  
263 - 3447CC75BA7C93ED3BF68C2F65392471 /* PointerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PointerType.swift; path = Source/PointerType.swift; sourceTree = "<group>"; };  
264 - 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Toast.xcconfig; sourceTree = "<group>"; };  
265 - 38EE23882943EDCED73523F643A71C39 /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = "<group>"; };  
266 - 39C3C21D34A34F85D09063C7E1255E9D /* Serializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Serializer.swift; path = Source/Serializer.swift; sourceTree = "<group>"; };  
267 - 39F3B60B0A2AD7975DA5BCA943FA6BD5 /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = "<group>"; };  
268 - 41009B988332564AFC9DAF9C3817C7FA /* SwiftHash.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftHash.framework; path = SwiftHash.framework; sourceTree = BUILT_PRODUCTS_DIR; };  
269 - 41531DBB287870602D671C4D97E99B21 /* UIScrollView+EmptyDataSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+EmptyDataSet.h"; path = "Source/UIScrollView+EmptyDataSet.h"; sourceTree = "<group>"; };  
270 - 42DB5E77081A2858012F4CBF354A0D27 /* Reachability-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-prefix.pch"; sourceTree = "<group>"; };  
271 - 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Reachability.xcconfig; sourceTree = "<group>"; };  
272 - 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.xcconfig; sourceTree = "<group>"; };  
273 - 448D149E9E2122E63C2D8CDB8E1159CB /* SwiftHash-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftHash-dummy.m"; sourceTree = "<group>"; };  
274 - 469D54339A6D448DF6D1166FDB669676 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = "<group>"; };  
275 - 481FE62B9A76B9C994CED4CDBF22F059 /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SVProgressHUD.modulemap; sourceTree = "<group>"; }; 266 + 17EFC56D8D5FA327B6DEB6D0ADC56C1C /* Reachability-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Reachability-dummy.m"; sourceTree = "<group>"; };
  267 + 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AlamofireImage.xcconfig; sourceTree = "<group>"; };
  268 + 1A34017AEE736DE7CC86E3201A0B303C /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = "<group>"; };
  269 + 1A53991A7FAF70CDAC1F059FB04F5543 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = "<group>"; };
  270 + 1ABA7E2E494925BF34BC9885BE24E31C /* Transformable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transformable.swift; path = Source/Transformable.swift; sourceTree = "<group>"; };
  271 + 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DZNEmptyDataSet.xcconfig; sourceTree = "<group>"; };
  272 + 2245A79B4B989C667CBB26B48B7A1896 /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = "<group>"; };
  273 + 229808FB79115B70777D682D8335C18E /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = "<group>"; };
  274 + 2387EDABD5D4A7ABE66B86C30A524A6C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  275 + 293A8917426C277C951BE22C661A240A /* HandyJSON-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-umbrella.h"; sourceTree = "<group>"; };
  276 + 29B41A43E5D5CCE97E46706AC4240B68 /* UIView+Toast.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+Toast.m"; path = "Toast/Toast/UIView+Toast.m"; sourceTree = "<group>"; };
  277 + 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftHash.xcconfig; sourceTree = "<group>"; };
  278 + 2BC1B5A06113F348365D3564FD6425C6 /* EnumTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumTransform.swift; path = Source/EnumTransform.swift; sourceTree = "<group>"; };
  279 + 2BE4F7B39AE70471948017C04083277A /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = "<group>"; };
  280 + 2D7A5D10D9FFDD32C4D3CF85DDCFC707 /* DateFormatterTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateFormatterTransform.swift; path = Source/DateFormatterTransform.swift; sourceTree = "<group>"; };
  281 + 2E3282E372FE0A6C0D2227384238F921 /* UIImage+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+AlamofireImage.swift"; path = "Source/UIImage+AlamofireImage.swift"; sourceTree = "<group>"; };
  282 + 30A5A5A7B7C1088D4D4ABDFAAF6E54F3 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = "<group>"; };
  283 + 310743AC8DCCF3F81515515A6FC64B8A /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = "<group>"; };
  284 + 344E5051853CBAE87166BAA69476DDB1 /* SVProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SVProgressHUD.framework; path = SVProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  285 + 35322B49B5EBE0CF14B7BC8677497347 /* ReflectionHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReflectionHelper.swift; path = Source/ReflectionHelper.swift; sourceTree = "<group>"; };
  286 + 358430CDB8CA6FB92C74E9FC7F6EB159 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = "<group>"; };
  287 + 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
  288 + 3CD0FA7EE743F01B3A6385702606A408 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  289 + 444E77BBBDD4B2AB34C6742B6752BBCB /* XRCarouselView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = XRCarouselView.framework; path = XRCarouselView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  290 + 4457386C2A87F3E11630992C9CAA7836 /* OtherExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OtherExtension.swift; path = Source/OtherExtension.swift; sourceTree = "<group>"; };
  291 + 467C66A8C88F09EF9D0129564F08540C /* NSDecimalNumberTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSDecimalNumberTransform.swift; path = Source/NSDecimalNumberTransform.swift; sourceTree = "<group>"; };
  292 + 46E35C087C53D197C9D213DF73A74B66 /* HandyJSON-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "HandyJSON-dummy.m"; sourceTree = "<group>"; };
  293 + 489ED6DFB42C7C8F6A4875005025A913 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = "<group>"; };
  294 + 496A0D655D409BDF23A3826300EBCD1B /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = "<group>"; };
  295 + 49DC3C5FB6A7B1CDAA1410FAABB684E0 /* XRCarouselView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-umbrella.h"; sourceTree = "<group>"; };
  296 + 4BBA6274610821F15000C6CC777D555B /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = "<group>"; };
276 4CD112151D95CAE264BE24BD4513934F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 297 4CD112151D95CAE264BE24BD4513934F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
277 - 4DB0A7F29D540AB077DA6D9855C3F743 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };  
278 - 5104B9F40B6C55F71BDE788F76AA8F53 /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = "<group>"; };  
279 - 52C9D81718FDCE850DDAF365FD190B4F /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = "<group>"; };  
280 - 52F1099514615B3BA1CA982ECF578DDF /* Toast-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-prefix.pch"; sourceTree = "<group>"; };  
281 - 54E529332879B58C942DDF16DF5D39B4 /* ExtendCustomModelType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomModelType.swift; path = Source/ExtendCustomModelType.swift; sourceTree = "<group>"; };  
282 - 57342E33349B812F65B6D994EA74E212 /* XRCarouselView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XRCarouselView.h; path = XRCarouselView/XRCarouselView.h; sourceTree = "<group>"; }; 298 + 4ED641951605DEB02B067F9D1915C5A9 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = "<group>"; };
  299 + 507695995D3D9F4276EAFC4603ABFF54 /* Toast.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Toast.framework; path = Toast.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  300 + 52303324A62AD0B74F2DD46E74D232EB /* SwiftHash.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftHash.framework; path = SwiftHash.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  301 + 53599A8492E17F111CC5C8D3C50E872A /* Toast-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-dummy.m"; sourceTree = "<group>"; };
  302 + 5684F0F90E3FAEFBE15A94EE1C636644 /* SwiftHash.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SwiftHash.modulemap; sourceTree = "<group>"; };
283 587E904615A6336F6F7628482D5BC8D3 /* Pods-ParentAssistant-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ParentAssistant-frameworks.sh"; sourceTree = "<group>"; }; 303 587E904615A6336F6F7628482D5BC8D3 /* Pods-ParentAssistant-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ParentAssistant-frameworks.sh"; sourceTree = "<group>"; };
284 - 59271332AFD884264C5B45B6B6152051 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; };  
285 - 5B56491AFD4EC6985EBCCEF221A0FCB8 /* SwiftHash-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-prefix.pch"; sourceTree = "<group>"; };  
286 - 5C3FCED1EF014BDAA42DACC871E2516A /* Reachability.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Reachability.framework; path = Reachability.framework; sourceTree = BUILT_PRODUCTS_DIR; };  
287 - 5C73B5BC3B66F99610607951FEC5FCB3 /* EnumType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumType.swift; path = Source/EnumType.swift; sourceTree = "<group>"; };  
288 - 5DCF2929ACA53CE3D9FD6342DF5F8D9D /* libaacplus.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libaacplus.a; path = NIMSDK/Libs/libaacplus.a; sourceTree = "<group>"; };  
289 - 5F6392C48C4C9A3D7130A57D84AFEE2B /* DZNEmptyDataSet-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DZNEmptyDataSet-dummy.m"; sourceTree = "<group>"; };  
290 - 60794CE8C2369C4AA061EE9A931DDFED /* XRCarouselView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-prefix.pch"; sourceTree = "<group>"; };  
291 - 640ED88831DE9CA10759B8FC3751C531 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = "<group>"; };  
292 - 64CF5A867496880A0DAE25ED9EC8E512 /* CustomDateFormatTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomDateFormatTransform.swift; path = Source/CustomDateFormatTransform.swift; sourceTree = "<group>"; };  
293 - 65DEF3C169B8F1241E74C3D5C7DA5A6D /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = "<group>"; };  
294 - 6768B1FE2E118D79D8A1613520B9BB23 /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = "<group>"; };  
295 - 6850886B55CE3CD9B901B28690292C5C /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = "<group>"; };  
296 - 6976D41DC0C992EA2F24C3A7358E958F /* BuiltInBridgeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBridgeType.swift; path = Source/BuiltInBridgeType.swift; sourceTree = "<group>"; };  
297 - 6B3D43CB0BDA34787F85B2C084FBB09A /* HandyJSON.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HandyJSON.h; path = Source/HandyJSON.h; sourceTree = "<group>"; };  
298 - 6D24FB404E9541910245BF3E68C5EE73 /* URLTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLTransform.swift; path = Source/URLTransform.swift; sourceTree = "<group>"; };  
299 - 6E2AA0C415512D5F3F34F7A99AA4D14A /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = "<group>"; }; 304 + 58B4CFDB50C6966BC7B9CB0CBD1C60E7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  305 + 5BF833E322898122D95617BD9520476D /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = "<group>"; };
  306 + 600ABB9AA8054F7B4E851C17D19FCAA0 /* AlamofireImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AlamofireImage-dummy.m"; sourceTree = "<group>"; };
  307 + 60528D650715D578BD996859FC810107 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  308 + 605BF197AFCD5A69E3A6A700329C2FCA /* libssl.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libssl.a; path = NIMSDK/Libs/libssl.a; sourceTree = "<group>"; };
  309 + 61CAF6761E3C21827415A9DA38D18547 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = "<group>"; };
  310 + 61D09F1E0C8F29641858460B3928A5B0 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = "<group>"; };
  311 + 661171DD778BD7E26EE68F008228F1C9 /* DZNEmptyDataSet-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-prefix.pch"; sourceTree = "<group>"; };
  312 + 676078733016383B143B493E79D3CEF5 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  313 + 676E6BA89EE0D10BE38626EE3E3B8A9F /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = "<group>"; };
  314 + 68D3997593CBB0B018C81C73E8337C2C /* ExtendCustomModelType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomModelType.swift; path = Source/ExtendCustomModelType.swift; sourceTree = "<group>"; };
  315 + 68ECD5E13EA08D669EEBD74218B18FA5 /* BuiltInBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBasicType.swift; path = Source/BuiltInBasicType.swift; sourceTree = "<group>"; };
  316 + 6B05BD93D4EE278B866CC9AAF18763DB /* SDWebImageDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDecoder.m; path = SDWebImage/SDWebImageDecoder.m; sourceTree = "<group>"; };
  317 + 6BD1FCCAAFC6349CA1E2AC3881DB81FC /* UIView+Toast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+Toast.h"; path = "Toast/Toast/UIView+Toast.h"; sourceTree = "<group>"; };
  318 + 6CC52F25BF175D139AA0E5C94DC363A9 /* EnumType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumType.swift; path = Source/EnumType.swift; sourceTree = "<group>"; };
  319 + 6DA08525DC2775B611071866CF38CC96 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = "<group>"; };
  320 + 6E2FF425EC8FB1E33922042D418E2A79 /* XRCarouselView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = XRCarouselView.modulemap; sourceTree = "<group>"; };
300 6EB59F100C77215BCBB4FAD12F0FF358 /* Pods-ParentAssistant.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ParentAssistant.debug.xcconfig"; sourceTree = "<group>"; }; 321 6EB59F100C77215BCBB4FAD12F0FF358 /* Pods-ParentAssistant.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ParentAssistant.debug.xcconfig"; sourceTree = "<group>"; };
301 - 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = HandyJSON.xcconfig; sourceTree = "<group>"; };  
302 - 72803D16FA054A0D26C303991C1F2B3C /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = "<group>"; };  
303 - 72ADD4F0113F0555435EA10BA789F8E2 /* TransformOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformOf.swift; path = Source/TransformOf.swift; sourceTree = "<group>"; };  
304 - 73AD0FFA16B2C0B1B8A40B3A76629975 /* DZNEmptyDataSet-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-umbrella.h"; sourceTree = "<group>"; };  
305 - 7437E1C250CA27898AA8815D1117643B /* XRCarouselView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XRCarouselView-dummy.m"; sourceTree = "<group>"; }; 322 + 70B842936FA16DF44F4AD4FC84E225A4 /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = "<group>"; };
  323 + 70FB099686511A528F52E5AB1C4FDB4A /* Reachability.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Reachability.modulemap; sourceTree = "<group>"; };
  324 + 715810392F163BB36DFE8AC307460289 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = "<group>"; };
  325 + 729A72124A700ED6D7D56FE6E3316184 /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = "<group>"; };
  326 + 72C584102060EC4C983B4B76AB4B8C8F /* Pods_ParentAssistant.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ParentAssistant.framework; path = "Pods-ParentAssistant.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
  327 + 7379E87D9FF2E196ADB91DC8A0A5F2F3 /* ISO8601DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ISO8601DateTransform.swift; path = Source/ISO8601DateTransform.swift; sourceTree = "<group>"; };
  328 + 770A612E1A02028636A4D09BDEB87D10 /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = "<group>"; };
  329 + 770EB1960009D9CCA67CBA11FBC8490A /* AlamofireImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AlamofireImage-prefix.pch"; sourceTree = "<group>"; };
306 77EFE064376F26AEED2B1971235A88EF /* Pods-ParentAssistant.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ParentAssistant.release.xcconfig"; sourceTree = "<group>"; }; 330 77EFE064376F26AEED2B1971235A88EF /* Pods-ParentAssistant.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ParentAssistant.release.xcconfig"; sourceTree = "<group>"; };
307 - 7C5CEE4C10F2E83011011BAE5999B4FD /* NominalType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NominalType.swift; path = Source/NominalType.swift; sourceTree = "<group>"; };  
308 - 7D9407543C44ABED0AC48154C76831BE /* Measuable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Measuable.swift; path = Source/Measuable.swift; sourceTree = "<group>"; };  
309 - 7DFB6D55866F4F62D8116993D42B55A8 /* ISO8601DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ISO8601DateTransform.swift; path = Source/ISO8601DateTransform.swift; sourceTree = "<group>"; };  
310 - 81D2AEE4F419083BF22474B240B3D9F6 /* PropertyInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PropertyInfo.swift; path = Source/PropertyInfo.swift; sourceTree = "<group>"; };  
311 - 820C0B25502D820076E6945A9666E544 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };  
312 - 82C441F9B75595B2F266E6AC40AD7D85 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = "<group>"; };  
313 - 835B1DEC82F034C2C12DC0723F18F6E9 /* Toast-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-umbrella.h"; sourceTree = "<group>"; };  
314 - 85EBECC44FA24EC40748D3CB399DD1F3 /* Toast-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-dummy.m"; sourceTree = "<group>"; };  
315 - 871C0D1C45FD62FE7B82D8E083C00466 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = "<group>"; };  
316 - 87691736C308811895AF6EB052ECD8BE /* DZNEmptyDataSet-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-prefix.pch"; sourceTree = "<group>"; };  
317 - 8781B0306B0188AF528659F413E1B542 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = "<group>"; };  
318 - 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = XRCarouselView.xcconfig; sourceTree = "<group>"; }; 331 + 78F77FFCC80D398532E854672D527FD8 /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = "<group>"; };
  332 + 79353402DE45C743DE8658FE2C413D90 /* libaacplus.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libaacplus.a; path = NIMSDK/Libs/libaacplus.a; sourceTree = "<group>"; };
  333 + 79BB6C2420E33F3EC3D693AD20145082 /* Reachability-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-prefix.pch"; sourceTree = "<group>"; };
  334 + 7A45AEAFC59FC8550866653E018742E3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  335 + 7AC81C76B41B0ABF4E94921ADBA70C30 /* UIScrollView+EmptyDataSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+EmptyDataSet.m"; path = "Source/UIScrollView+EmptyDataSet.m"; sourceTree = "<group>"; };
  336 + 7C01563CB8CAFA848353DD90A07F2F47 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = "<group>"; };
  337 + 7C4ACCC8EE8E5E07D0CD171894588314 /* UIButton+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+AlamofireImage.swift"; path = "Source/UIButton+AlamofireImage.swift"; sourceTree = "<group>"; };
  338 + 7C9D89FB057D8F2ECBB232C7A81EF4B5 /* DZNEmptyDataSet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DZNEmptyDataSet.framework; path = DZNEmptyDataSet.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  339 + 7EBA3110EB94A0568FF28796D778675E /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = "<group>"; };
  340 + 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Reachability.xcconfig; sourceTree = "<group>"; };
  341 + 8249AA0D5DBC641B891AE927074850B2 /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = Sources/MD5.swift; sourceTree = "<group>"; };
  342 + 84AE5CF00E8941985B8EB7DFC8A475E7 /* Toast-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-prefix.pch"; sourceTree = "<group>"; };
  343 + 852A7B853425A17ACDE963BB0C57B689 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = "<group>"; };
  344 + 85DBA7A206E80F9E00E01BEFE74D6D69 /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = "<group>"; };
  345 + 865E120DE5EA698A2789C2686BC45C7A /* AlamofireImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AlamofireImage.modulemap; sourceTree = "<group>"; };
  346 + 874C609455AB27C910DD97EBDD79E965 /* Toast.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Toast.modulemap; sourceTree = "<group>"; };
319 891E32DCEDF9E73C788DB01E69C7162C /* Pods-ParentAssistant-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ParentAssistant-resources.sh"; sourceTree = "<group>"; }; 347 891E32DCEDF9E73C788DB01E69C7162C /* Pods-ParentAssistant-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ParentAssistant-resources.sh"; sourceTree = "<group>"; };
320 - 8A51BA19C89D5E62EDCF2DB9D9FA43E0 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = "<group>"; };  
321 - 8CDA4E6BD46E857912EC5B5F99364A24 /* SwiftHash.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SwiftHash.modulemap; sourceTree = "<group>"; };  
322 - 8D2C5397761E61B24600821547A409CD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };  
323 - 9011EFC1DA29BE6CA0831595062B82ED /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = "<group>"; };  
324 - 92331AB0F30415BE666C619D1A45513E /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = "<group>"; };  
325 - 931ED830C3B0B8852F1479DE61BA997E /* AnyExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyExtensions.swift; path = Source/AnyExtensions.swift; sourceTree = "<group>"; };  
326 - 93251EC8BEF89E6A4FA758DA38A1E47A /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = "<group>"; }; 348 + 89457F43B7DE2154380C8DD976759AA2 /* XRCarouselView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XRCarouselView.m; path = XRCarouselView/XRCarouselView.m; sourceTree = "<group>"; };
  349 + 8A591BFD7762D296F2E84EBC08129BFA /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = "<group>"; };
  350 + 8B25C902A48A887CDEA53D385B48C92E /* SwiftHash-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-umbrella.h"; sourceTree = "<group>"; };
  351 + 8BFF20BC7E4F55C09BAC34A664D91FED /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = "<group>"; };
  352 + 8E2EC639DC31085C2078E4638A61266B /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  353 + 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = XRCarouselView.xcconfig; sourceTree = "<group>"; };
  354 + 8F75E090F317987C0134B9DD1E5963C9 /* TransformType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformType.swift; path = Source/TransformType.swift; sourceTree = "<group>"; };
  355 + 916CF2DD179C34072F0CED7EA7E172C4 /* BuiltInBridgeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBridgeType.swift; path = Source/BuiltInBridgeType.swift; sourceTree = "<group>"; };
  356 + 920C3AE864C4E24091B77772A498A58C /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = "<group>"; };
  357 + 92B55B2A9C151490137F69027B7F531E /* HandyJSON.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HandyJSON.h; path = Source/HandyJSON.h; sourceTree = "<group>"; };
  358 + 937EE30FD85AB8EED4F8467502DD290F /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Alamofire.framework; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  359 + 93831DF9B9AE2775CB38F92DAD62BF35 /* NIMSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NIMSDK.framework; path = NIMSDK/NIMSDK.framework; sourceTree = "<group>"; };
327 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 360 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
328 - 93ED65B5F47F5FEA00C9BC9D151B1D26 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; };  
329 - 9889E5067E9A54BAEC05298BBA10F671 /* HelpingMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HelpingMapper.swift; path = Source/HelpingMapper.swift; sourceTree = "<group>"; };  
330 - 99DF7E55400E9131640E0694D3C91764 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = "<group>"; };  
331 - 9A4D6703A8771BB168130EFB6EAC1C3E /* SHA1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SHA1.swift; path = Sources/SHA1.swift; sourceTree = "<group>"; };  
332 - 9A559DCF61F2E184BC9318C05F05CFF3 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = "<group>"; };  
333 - 9AEE056145338863D7A727ACF1C3657C /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = Sources/MD5.swift; sourceTree = "<group>"; };  
334 - 9F2BF6E468482ED7EDAE9AFD6CA2C994 /* SwiftHash-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-umbrella.h"; sourceTree = "<group>"; };  
335 - A48FF17CB17A07E2B4AEC609B9947C52 /* libevent.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libevent.a; path = NIMSDK/Libs/libevent.a; sourceTree = "<group>"; };  
336 - A59A469B0852E07D2428D72E4C62B1E7 /* Toast.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Toast.framework; path = Toast.framework; sourceTree = BUILT_PRODUCTS_DIR; };  
337 - A91D08749C812CD6EB281780E69AFED6 /* XRCarouselView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XRCarouselView.m; path = XRCarouselView/XRCarouselView.m; sourceTree = "<group>"; };  
338 - AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = "<group>"; };  
339 - AE8B2524C105710A1C75E5F3C734796F /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = "<group>"; };  
340 - B0A49BF64844554AA6BC0B49FD9A9BE8 /* DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTransform.swift; path = Source/DateTransform.swift; sourceTree = "<group>"; };  
341 - B4C40BE5E03351505F3B0830F40CFA9E /* libssl.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libssl.a; path = NIMSDK/Libs/libssl.a; sourceTree = "<group>"; };  
342 - B4EC3094994043023CF3002A63DD6DA4 /* DateFormatterTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateFormatterTransform.swift; path = Source/DateFormatterTransform.swift; sourceTree = "<group>"; };  
343 - B507541260F671D342B11E7250120BBF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };  
344 - B6554BE7D86E2DF12BC2CFA630452CA0 /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = "<group>"; };  
345 - B71F8A62F3906657D17D418212E1CBA1 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = "<group>"; };  
346 - B88D8470A1A1E4F507B1E9895B074253 /* Pods_ParentAssistant.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ParentAssistant.framework; path = "Pods-ParentAssistant.framework"; sourceTree = BUILT_PRODUCTS_DIR; };  
347 - B9A38D8C4EC4826AEDC2A52DD0187186 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = "<group>"; };  
348 - B9B732FC24A0EC5E46E41D939F4A1130 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };  
349 - BB2B3251E63EE34530FC8A40E441CB23 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = "<group>"; };  
350 - BB7CE29DC4FFF250766240EA8DA973D1 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = "<group>"; };  
351 - BC3C517CD17DEB98E878268901D654E8 /* Metadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Metadata.swift; path = Source/Metadata.swift; sourceTree = "<group>"; };  
352 - BCCC1A6E4AF8DAF6E5609D65548B3C79 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = "<group>"; }; 361 + 93E637F89EC35850C7250805992BB1C0 /* Toast-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-umbrella.h"; sourceTree = "<group>"; };
  362 + 94B64C32F67C820564A1C07F82FB412C /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
  363 + 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = "<group>"; };
  364 + 95CAD531E474553E7D52B95131219D1A /* Reachability.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Reachability.framework; path = Reachability.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  365 + 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Toast.xcconfig; sourceTree = "<group>"; };
  366 + 981D262EBFB4CA168BE569F48CC64843 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = "<group>"; };
  367 + 98932AABF2712E9978244730956580D5 /* CustomDateFormatTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomDateFormatTransform.swift; path = Source/CustomDateFormatTransform.swift; sourceTree = "<group>"; };
  368 + 98BA100696255C8CFD15860D64267467 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = "<group>"; };
  369 + 9AD53A7A5BDC98AFD3CE8CF1BC407F10 /* AlamofireImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AlamofireImage-umbrella.h"; sourceTree = "<group>"; };
  370 + 9B31E52FEB6E5A6A955D4050CB76B18C /* URLTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLTransform.swift; path = Source/URLTransform.swift; sourceTree = "<group>"; };
  371 + 9CA29ADD75C3FE58A4ED07E10D427C9F /* PropertyInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PropertyInfo.swift; path = Source/PropertyInfo.swift; sourceTree = "<group>"; };
  372 + 9D9602FA58305177F98B7472A155DE66 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = "<group>"; };
  373 + A23A7E20FB52B9BFC4899C0FEBA2C6CE /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = "<group>"; };
  374 + A2BD80EBA9375936EAA1AE0D930C61EC /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = "<group>"; };
  375 + A58625E1014C6D82D1825309986334E1 /* ImageFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageFilter.swift; path = Source/ImageFilter.swift; sourceTree = "<group>"; };
  376 + A6614C2951E5A4AB6D1DF2B076BF1A5C /* DataTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataTransform.swift; path = Source/DataTransform.swift; sourceTree = "<group>"; };
  377 + A8CB977B7AFFFA509CAA11CD0C03AEB5 /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = "<group>"; };
  378 + AA29655EDD56783CB2C21A411019B7BA /* XRCarouselView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XRCarouselView.h; path = XRCarouselView/XRCarouselView.h; sourceTree = "<group>"; };
  379 + ABE9E390C3EADB423277CE1E912E10AA /* PointerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PointerType.swift; path = Source/PointerType.swift; sourceTree = "<group>"; };
  380 + AC0A874231DDAD102B02D7EFD048FDE2 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Source/Image.swift; sourceTree = "<group>"; };
  381 + AE04BA7BB2F95B59112DED31AECB069E /* AFIError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFIError.swift; path = Source/AFIError.swift; sourceTree = "<group>"; };
  382 + AF0EB1CAE5B795EB85A1165F6D98C372 /* Serializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Serializer.swift; path = Source/Serializer.swift; sourceTree = "<group>"; };
  383 + B00FEDA7D2B852B770837D954A635F0B /* XRPlaceholder.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = XRPlaceholder.png; path = XRCarouselView/XRPlaceholder.png; sourceTree = "<group>"; };
  384 + B03DB8D1B8FEFA6F91F509A16D6176F3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  385 + B19A6339BCDC426144D4987C81596418 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Source/Configuration.swift; sourceTree = "<group>"; };
  386 + B4595D719B06D3C0D44248E3DD5B1962 /* XRCarouselView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-prefix.pch"; sourceTree = "<group>"; };
  387 + B4FE0743D323412387DC64C29B1AE5F7 /* libcrypto.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libcrypto.a; path = NIMSDK/Libs/libcrypto.a; sourceTree = "<group>"; };
  388 + B63F0AB7376A64C50DA03CACC7D9CC2E /* XRCarouselView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XRCarouselView-dummy.m"; sourceTree = "<group>"; };
  389 + B77DE72B7ED4AED0DBED016D1274EFE8 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; };
  390 + B82FE543DC2AE8EF3A0F380DE2B5988A /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = "<group>"; };
  391 + B9806961B1DB01F087677787DFCC6CE0 /* AlamofireImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AlamofireImage.framework; path = AlamofireImage.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  392 + B9A33258A85F658D3C02E30EC92D43FF /* DZNEmptyDataSet.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DZNEmptyDataSet.modulemap; sourceTree = "<group>"; };
  393 + BAE5BE9DB67074649A1927384361E0A8 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
  394 + BB6422771B215BFE2B4A9C0D9C9BC82B /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SVProgressHUD.modulemap; sourceTree = "<group>"; };
  395 + BC99BBF9B209FE42B0D74F5CFB60627F /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = "<group>"; };
353 BCECD0FF1E6F7E48270234DAF00B07B7 /* Pods-ParentAssistant-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ParentAssistant-acknowledgements.markdown"; sourceTree = "<group>"; }; 396 BCECD0FF1E6F7E48270234DAF00B07B7 /* Pods-ParentAssistant-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ParentAssistant-acknowledgements.markdown"; sourceTree = "<group>"; };
354 - BE70BDE392E6E92B76047D2DED4ED380 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = "<group>"; };  
355 - BE846687076AD4570ACE89EC260747A1 /* UMErrorCatch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMErrorCatch.framework; sourceTree = "<group>"; };  
356 - BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftHash.xcconfig; sourceTree = "<group>"; };  
357 - BF496B88C6E68626DC9D0C9FC152BD3C /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = "<group>"; };  
358 - BFD387D9E3BDF322939523D4DF31CA79 /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = "<group>"; };  
359 - C03FC1A11EE20AB8B6A4B398E11B26B0 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = "<group>"; };  
360 - C203E9ABEF394B0009B142EEB9AA64FC /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = "<group>"; };  
361 - C33C9063E8CA60D73EE6050FCF59F433 /* Export.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Export.swift; path = Source/Export.swift; sourceTree = "<group>"; };  
362 - C62416D612C6BD82B2867F75585C4C56 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };  
363 - CC9B184B04C60B80BBEF83595DBE8AF4 /* XRCarouselView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = XRCarouselView.modulemap; sourceTree = "<group>"; };  
364 - CE1C92985D9321104698E3AFAF68594E /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; };  
365 - CEA07E2E477768269A8D0BECE492EBAF /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = "<group>"; };  
366 - CF9CDCEBD5D016D3F349D31FFDAEA20A /* NIMSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NIMSDK.framework; path = NIMSDK/NIMSDK.framework; sourceTree = "<group>"; };  
367 - D124D84D327A6ADF3D01C95E84C09A31 /* UMAnalytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMAnalytics.framework; sourceTree = "<group>"; };  
368 - D912920D1BEEB7757AF4BE74E2EC8FA6 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = "<group>"; };  
369 - D9ED9DA2E61F2A4DD7E760C61C47A3F1 /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = "<group>"; };  
370 - DB5FF7B561F6F548C82F1FC27FDD72E8 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = "<group>"; };  
371 - DBE314BE44865438F00A5054E414EF77 /* Toast.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Toast.modulemap; sourceTree = "<group>"; };  
372 - DD0E89B8C1439B9F5FDB39EA0232B3EA /* DZNEmptyDataSet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DZNEmptyDataSet.framework; path = DZNEmptyDataSet.framework; sourceTree = BUILT_PRODUCTS_DIR; };  
373 - DE3D895CEB8D8D9876BA0F9346FF9D69 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };  
374 - DE92E07FF56795D096246F9059B540CA /* DataTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataTransform.swift; path = Source/DataTransform.swift; sourceTree = "<group>"; };  
375 - DF68D7CB4183F99C38744F4985CD422D /* SDWebImageDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDecoder.m; path = SDWebImage/SDWebImageDecoder.m; sourceTree = "<group>"; };  
376 - DF826B20D920C607DF652F2F3EA4C2F8 /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = "<group>"; };  
377 - E058896CA0DFFEF3CCEFAD6FEBA0DB11 /* UTDID.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UTDID.framework; path = thirdparties/UTDID.framework; sourceTree = "<group>"; }; 397 + BE69851A50C89CE0E218AE8504C1188B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  398 + BFC1E0E16DEFECC3E2FE92A428C9920D /* HexColorTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HexColorTransform.swift; path = Source/HexColorTransform.swift; sourceTree = "<group>"; };
  399 + C29AD1BD351F370FBE921BBE6756CEC9 /* NominalType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NominalType.swift; path = Source/NominalType.swift; sourceTree = "<group>"; };
  400 + C2DEDD1DC5D26933057AC26E39F2EBD3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  401 + C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = HandyJSON.xcconfig; sourceTree = "<group>"; };
  402 + C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.xcconfig; sourceTree = "<group>"; };
  403 + C7C6E9C97726F9691282BA5009E78833 /* libevent.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libevent.a; path = NIMSDK/Libs/libevent.a; sourceTree = "<group>"; };
  404 + C7C98E50FC5D694C89DBEE8A1486D900 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = "<group>"; };
  405 + CAE58263CB0A52CDB5D3790DC6D0D74F /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = "<group>"; };
  406 + CBB0446840A0CDD4BB7D69692D07CC21 /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = "<group>"; };
  407 + CC28263CA0EDAEA1CBC1173B87FEA769 /* Request+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Request+AlamofireImage.swift"; path = "Source/Request+AlamofireImage.swift"; sourceTree = "<group>"; };
  408 + CD28D005A100BC203777597B48B8AD06 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = "<group>"; };
  409 + CECDC33DC6A3E686FD21577C5B23C258 /* DZNEmptyDataSet-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-umbrella.h"; sourceTree = "<group>"; };
  410 + D43927282F3DD1C78741ABFCC5E0C768 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = "<group>"; };
  411 + D4D00913B407B6DB96C7E7B48C21D904 /* UIImageView+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+AlamofireImage.swift"; path = "Source/UIImageView+AlamofireImage.swift"; sourceTree = "<group>"; };
  412 + D79CBFE6F9821431996C8160F19D90C6 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = "<group>"; };
  413 + D82D7054D7F1E7FE0ACBE043A3FA7F50 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = "<group>"; };
  414 + D8A2F9829AECA7F54C384A6E17AB7124 /* SwiftHash-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-prefix.pch"; sourceTree = "<group>"; };
  415 + D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = "<group>"; };
  416 + D96BCA19B9F922B2258E4C0D40666B58 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = "<group>"; };
  417 + DBA6EC35D53897ED2A96FEDE1BB384BA /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = "<group>"; };
  418 + DD324E3E21CD21F91211149384F64690 /* UIScrollView+EmptyDataSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+EmptyDataSet.h"; path = "Source/UIScrollView+EmptyDataSet.h"; sourceTree = "<group>"; };
  419 + DF39B11A9C408A7CFA8E347E7F717E80 /* AnyExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyExtensions.swift; path = Source/AnyExtensions.swift; sourceTree = "<group>"; };
  420 + DF7918BBC8A10388FDE15B624F66A8E9 /* SwiftHash-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftHash-dummy.m"; sourceTree = "<group>"; };
  421 + DFFC9D8585FF5A3FC4C7FD63A93DCE16 /* Deserializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deserializer.swift; path = Source/Deserializer.swift; sourceTree = "<group>"; };
  422 + E1300F08331C16959F41C2533B209EF5 /* Export.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Export.swift; path = Source/Export.swift; sourceTree = "<group>"; };
378 E1CD65D31F6DC7B830E7132E6B396C30 /* Pods-ParentAssistant-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ParentAssistant-acknowledgements.plist"; sourceTree = "<group>"; }; 423 E1CD65D31F6DC7B830E7132E6B396C30 /* Pods-ParentAssistant-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ParentAssistant-acknowledgements.plist"; sourceTree = "<group>"; };
379 - E3370B03674C70DABFF75D9D2BA95DCE /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = "<group>"; };  
380 - E33C2A8A35CA23130F27CFEC0285B7DB /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = "<group>"; };  
381 - E4E76CB8696BAB20A617484E4726713B /* Transformable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transformable.swift; path = Source/Transformable.swift; sourceTree = "<group>"; };  
382 - E533F265C56324D6F57EB232221F586A /* UIView+Toast.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+Toast.m"; path = "Toast/Toast/UIView+Toast.m"; sourceTree = "<group>"; };  
383 - E786E1AEE51D914333543AC4DEF9B3FB /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = "<group>"; };  
384 - E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };  
385 - E9462CA128209C32EE6E6647C88609D1 /* OtherExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OtherExtension.swift; path = Source/OtherExtension.swift; sourceTree = "<group>"; };  
386 - E95345A11FCCED373B3A5758A6073CDB /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = "<group>"; };  
387 - E956F54FF76DE5D347505F3AF7694F03 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Alamofire.framework; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };  
388 - EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = "<group>"; };  
389 - F33461E2C03CDF90E02052B76ADADB01 /* TransformType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformType.swift; path = Source/TransformType.swift; sourceTree = "<group>"; };  
390 - F638493F2C879E2AF820AE53EA390269 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = "<group>"; };  
391 - F6429920CDFD8D08A5A0566565673330 /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = "<group>"; }; 424 + E215EB7C10CD4B2F724959DB344FE5C0 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = "<group>"; };
  425 + E2607500177BC99C04478DAB57D80EB7 /* SecurityEnvSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SecurityEnvSDK.framework; path = thirdparties/SecurityEnvSDK.framework; sourceTree = "<group>"; };
  426 + E4D61E78309E6543D6EBC75BE2967417 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = "<group>"; };
  427 + E651A4469FA2206746488B70290D48C0 /* SHA1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SHA1.swift; path = Sources/SHA1.swift; sourceTree = "<group>"; };
  428 + E74F653E7072F40DB006FC90854FC840 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = "<group>"; };
  429 + E7701D17547204EF54A538449343E8A4 /* ExtendCustomBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomBasicType.swift; path = Source/ExtendCustomBasicType.swift; sourceTree = "<group>"; };
  430 + EADCBFE671FB00B5F5FDBD2B3F6EC3CD /* UMAnalytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMAnalytics.framework; sourceTree = "<group>"; };
  431 + EC105ECBFE938402821EF19D7C5DA1DA /* DZNEmptyDataSet-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DZNEmptyDataSet-dummy.m"; sourceTree = "<group>"; };
  432 + EC1BF45D7C52BC6493B283DDB371395F /* TransformOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformOf.swift; path = Source/TransformOf.swift; sourceTree = "<group>"; };
  433 + ECC6F721935680D316DC183994F4F569 /* Properties.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Properties.swift; path = Source/Properties.swift; sourceTree = "<group>"; };
  434 + ED4D8AA9257567AC16CB397E7E8BF346 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = "<group>"; };
  435 + EEE063E46D8691853E8CDB3C33506BF8 /* UTDID.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UTDID.framework; path = thirdparties/UTDID.framework; sourceTree = "<group>"; };
  436 + EF0B6E4594449A55A06C44CB6D1223F0 /* Reachability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = "<group>"; };
  437 + EFA9DF74078A51C9573DF6952A753D1C /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = "<group>"; };
  438 + F1187580C59983EBFA6A55260AF21079 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = "<group>"; };
  439 + F1CF04B231D1BFC627F83398DFB40BBE /* HandyJSON-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-prefix.pch"; sourceTree = "<group>"; };
  440 + F3CF9F638E5784E56583202BEBE63239 /* SDWebImageDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDecoder.h; path = SDWebImage/SDWebImageDecoder.h; sourceTree = "<group>"; };
392 F6BAADF2798AA6F62DA82FAA92DECB07 /* Pods-ParentAssistant-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ParentAssistant-dummy.m"; sourceTree = "<group>"; }; 441 F6BAADF2798AA6F62DA82FAA92DECB07 /* Pods-ParentAssistant-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ParentAssistant-dummy.m"; sourceTree = "<group>"; };
393 - F6C063D5E492D3ED69858D446C30719E /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = "<group>"; };  
394 - F948022D8D1EFEF734A07E6ED4D6CAF9 /* BuiltInBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBasicType.swift; path = Source/BuiltInBasicType.swift; sourceTree = "<group>"; };  
395 - FBC74E5E6FF8BCD3F240C1F0C8B9B427 /* DZNEmptyDataSet.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DZNEmptyDataSet.modulemap; sourceTree = "<group>"; };  
396 - FC9D90B14CC51CAAC698C0623AB16C70 /* SecurityEnvSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SecurityEnvSDK.framework; path = thirdparties/SecurityEnvSDK.framework; sourceTree = "<group>"; };  
397 - FD2B11D4DCD30BDBA06841569E01E1BD /* HandyJSON-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "HandyJSON-dummy.m"; sourceTree = "<group>"; };  
398 - FF65E4A0D399571B01517891F0309004 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = "<group>"; };  
399 - FF928773E158E70CF5C2B45EA69A4223 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };  
400 - FFCF8A6062658FA349B617C0D75723C2 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = "<group>"; };  
401 - FFEBBEC7D2ED4C631DFB3CBB04E6F926 /* XRPlaceholder.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = XRPlaceholder.png; path = XRCarouselView/XRPlaceholder.png; sourceTree = "<group>"; }; 442 + F775144A6F17788F065E01BFD8DC2D5C /* Reachability.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = "<group>"; };
  443 + F81C313FED69F64F2F4F403B4C4EC3F6 /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = "<group>"; };
  444 + FDA2AA9043380263CFFD99AE883B70ED /* ImageDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Source/ImageDownloader.swift; sourceTree = "<group>"; };
  445 + FEA8115215CE30840A6225F435645485 /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Source/ImageCache.swift; sourceTree = "<group>"; };
402 /* End PBXFileReference section */ 446 /* End PBXFileReference section */
403 447
404 /* Begin PBXFrameworksBuildPhase section */ 448 /* Begin PBXFrameworksBuildPhase section */
405 - 158EE653FB0E0E7AF979010BC3A73E13 /* Frameworks */ = { 449 + 12D9BD764C2F5E43285530C00A583D52 /* Frameworks */ = {
406 isa = PBXFrameworksBuildPhase; 450 isa = PBXFrameworksBuildPhase;
407 buildActionMask = 2147483647; 451 buildActionMask = 2147483647;
408 files = ( 452 files = (
409 - 952429322A476D5508670C477DE23669 /* Foundation.framework in Frameworks */, 453 + ED693ED034E99CACC204CFDFCE742485 /* Foundation.framework in Frameworks */,
  454 + E83FA4C154706E4EEAD3DE51B86C5BAB /* ImageIO.framework in Frameworks */,
410 ); 455 );
411 runOnlyForDeploymentPostprocessing = 0; 456 runOnlyForDeploymentPostprocessing = 0;
412 }; 457 };
413 - 25507DD6D7F1D774CD72F194200A6D77 /* Frameworks */ = { 458 + 1EA38DA40C4FF7316B10B0C373342222 /* Frameworks */ = {
414 isa = PBXFrameworksBuildPhase; 459 isa = PBXFrameworksBuildPhase;
415 buildActionMask = 2147483647; 460 buildActionMask = 2147483647;
416 files = ( 461 files = (
417 - 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */, 462 + DC896F68B018619A895D3BE4C70D0E4D /* Foundation.framework in Frameworks */,
  463 + FB9814E780909550F494F507BEB3B6B5 /* QuartzCore.framework in Frameworks */,
418 ); 464 );
419 runOnlyForDeploymentPostprocessing = 0; 465 runOnlyForDeploymentPostprocessing = 0;
420 }; 466 };
421 - 2FCA03AB4708FF069C969DAC4ED689A3 /* Frameworks */ = { 467 + 223B4FF7CBCA930946A68B4E3FF7DEB6 /* Frameworks */ = {
422 isa = PBXFrameworksBuildPhase; 468 isa = PBXFrameworksBuildPhase;
423 buildActionMask = 2147483647; 469 buildActionMask = 2147483647;
424 files = ( 470 files = (
425 - 01866720BD41E2820300D8B9284FC061 /* Foundation.framework in Frameworks */, 471 + 385BDDC55889104E43C83664FD4C2BD3 /* Foundation.framework in Frameworks */,
  472 + F323261D44C70B6D6C4127E85BA62E2E /* QuartzCore.framework in Frameworks */,
426 ); 473 );
427 runOnlyForDeploymentPostprocessing = 0; 474 runOnlyForDeploymentPostprocessing = 0;
428 }; 475 };
429 - 46A2C828E74BB80E0DE22F9A57D702B2 /* Frameworks */ = { 476 + 25507DD6D7F1D774CD72F194200A6D77 /* Frameworks */ = {
  477 + isa = PBXFrameworksBuildPhase;
  478 + buildActionMask = 2147483647;
  479 + files = (
  480 + 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */,
  481 + );
  482 + runOnlyForDeploymentPostprocessing = 0;
  483 + };
  484 + 56B1A45788A7E3C5C89C92256F33AE24 /* Frameworks */ = {
430 isa = PBXFrameworksBuildPhase; 485 isa = PBXFrameworksBuildPhase;
431 buildActionMask = 2147483647; 486 buildActionMask = 2147483647;
432 files = ( 487 files = (
433 - C98D39690CC370401444D498206BCA2B /* Foundation.framework in Frameworks */,  
434 - 1A3841F2F008E6FEBA8B10F04DE5AD15 /* QuartzCore.framework in Frameworks */, 488 + EC5530E67F5D0CEEB72B1E36367AF20E /* Foundation.framework in Frameworks */,
  489 + 90E5A049B2FE3D38A1EA782CBB763739 /* SystemConfiguration.framework in Frameworks */,
435 ); 490 );
436 runOnlyForDeploymentPostprocessing = 0; 491 runOnlyForDeploymentPostprocessing = 0;
437 }; 492 };
@@ -444,486 +499,492 @@ @@ -444,486 +499,492 @@
444 ); 499 );
445 runOnlyForDeploymentPostprocessing = 0; 500 runOnlyForDeploymentPostprocessing = 0;
446 }; 501 };
447 - 99195E4207764744AEC07ECCBCD550EB /* Frameworks */ = { 502 + 62158AC2B12F4A1FA191B1DD22989FE1 /* Frameworks */ = {
448 isa = PBXFrameworksBuildPhase; 503 isa = PBXFrameworksBuildPhase;
449 buildActionMask = 2147483647; 504 buildActionMask = 2147483647;
450 files = ( 505 files = (
451 - 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */, 506 + F89476E482F3768E646BBBF8CD21E6EF /* Foundation.framework in Frameworks */,
452 ); 507 );
453 runOnlyForDeploymentPostprocessing = 0; 508 runOnlyForDeploymentPostprocessing = 0;
454 }; 509 };
455 - A115DC87278A31F6B371DA2C1AF9CD02 /* Frameworks */ = { 510 + 6FA848EABA8BCB08AFA8A7CBA0F79DA3 /* Frameworks */ = {
456 isa = PBXFrameworksBuildPhase; 511 isa = PBXFrameworksBuildPhase;
457 buildActionMask = 2147483647; 512 buildActionMask = 2147483647;
458 files = ( 513 files = (
459 - 7CE1363BFF8D96DD8059E0B5481A8D00 /* Foundation.framework in Frameworks */,  
460 - 121B576C5153736760EDBD385DCE1A82 /* QuartzCore.framework in Frameworks */, 514 + 0D0F6E0ECE5915267F0EA404BDCD4BAC /* Foundation.framework in Frameworks */,
461 ); 515 );
462 runOnlyForDeploymentPostprocessing = 0; 516 runOnlyForDeploymentPostprocessing = 0;
463 }; 517 };
464 - D871485AC7FB55A15B0AC2046B09D62B /* Frameworks */ = { 518 + 99195E4207764744AEC07ECCBCD550EB /* Frameworks */ = {
465 isa = PBXFrameworksBuildPhase; 519 isa = PBXFrameworksBuildPhase;
466 buildActionMask = 2147483647; 520 buildActionMask = 2147483647;
467 files = ( 521 files = (
468 - 502127E1D7BF9D8D8FA29AD2F7EF420E /* Foundation.framework in Frameworks */, 522 + 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */,
469 ); 523 );
470 runOnlyForDeploymentPostprocessing = 0; 524 runOnlyForDeploymentPostprocessing = 0;
471 }; 525 };
472 - E44680339038F2F0730AF783DAEFFCB6 /* Frameworks */ = { 526 + BF98FBBDC964E0CC738F6B323B4C1BB8 /* Frameworks */ = {
473 isa = PBXFrameworksBuildPhase; 527 isa = PBXFrameworksBuildPhase;
474 buildActionMask = 2147483647; 528 buildActionMask = 2147483647;
475 files = ( 529 files = (
476 - 6BE097BD2C38D14E51B20BCEB5C6F495 /* Foundation.framework in Frameworks */,  
477 - B35D34D1C1A4B0A5FAD90526DE5D88A4 /* ImageIO.framework in Frameworks */, 530 + 613167D898FF421A6F75D1FE5D145B9B /* Alamofire.framework in Frameworks */,
  531 + 26479B07464784F3BF8C0853CA049976 /* Foundation.framework in Frameworks */,
478 ); 532 );
479 runOnlyForDeploymentPostprocessing = 0; 533 runOnlyForDeploymentPostprocessing = 0;
480 }; 534 };
481 - EBA80D6B1394A46D45B033AB75657E91 /* Frameworks */ = { 535 + CC88855CE2CDECCE28DB46B1FDBF88B7 /* Frameworks */ = {
482 isa = PBXFrameworksBuildPhase; 536 isa = PBXFrameworksBuildPhase;
483 buildActionMask = 2147483647; 537 buildActionMask = 2147483647;
484 files = ( 538 files = (
485 - 9F24B341383F0FF8EA368B3A7F9BC087 /* Foundation.framework in Frameworks */,  
486 - EC3CC4DC8A5C9241AE7D9359EEAFC69F /* SystemConfiguration.framework in Frameworks */, 539 + 57B5D779BAB2A1CF8C2D4CF8F14066A0 /* Foundation.framework in Frameworks */,
487 ); 540 );
488 runOnlyForDeploymentPostprocessing = 0; 541 runOnlyForDeploymentPostprocessing = 0;
489 }; 542 };
490 /* End PBXFrameworksBuildPhase section */ 543 /* End PBXFrameworksBuildPhase section */
491 544
492 /* Begin PBXGroup section */ 545 /* Begin PBXGroup section */
493 - 001E2CA6EA468C671F75E62723E01ABD /* Support Files */ = { 546 + 0310C750335673BB116A6C5FAFEEFE49 /* Support Files */ = {
494 isa = PBXGroup; 547 isa = PBXGroup;
495 children = ( 548 children = (
496 - FBC74E5E6FF8BCD3F240C1F0C8B9B427 /* DZNEmptyDataSet.modulemap */,  
497 - 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */,  
498 - 5F6392C48C4C9A3D7130A57D84AFEE2B /* DZNEmptyDataSet-dummy.m */,  
499 - 87691736C308811895AF6EB052ECD8BE /* DZNEmptyDataSet-prefix.pch */,  
500 - 73AD0FFA16B2C0B1B8A40B3A76629975 /* DZNEmptyDataSet-umbrella.h */,  
501 - 02C19698DC383415660AD836A73862CF /* Info.plist */, 549 + C2DEDD1DC5D26933057AC26E39F2EBD3 /* Info.plist */,
  550 + 70FB099686511A528F52E5AB1C4FDB4A /* Reachability.modulemap */,
  551 + 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */,
  552 + 17EFC56D8D5FA327B6DEB6D0ADC56C1C /* Reachability-dummy.m */,
  553 + 79BB6C2420E33F3EC3D693AD20145082 /* Reachability-prefix.pch */,
  554 + 078CF0A581F3816CBA8D7047271D2CE9 /* Reachability-umbrella.h */,
502 ); 555 );
503 name = "Support Files"; 556 name = "Support Files";
504 - path = "../Target Support Files/DZNEmptyDataSet"; 557 + path = "../Target Support Files/Reachability";
505 sourceTree = "<group>"; 558 sourceTree = "<group>";
506 }; 559 };
507 - 035886489A99DD807583400603AB5019 /* Alamofire */ = { 560 + 03D7A135F0C051D7B2ADB4B1311D2155 /* Support Files */ = {
508 isa = PBXGroup; 561 isa = PBXGroup;
509 children = ( 562 children = (
510 - 08E13F442024BE43D2F31AA6F2C300DA /* AFError.swift */,  
511 - CEA07E2E477768269A8D0BECE492EBAF /* Alamofire.swift */,  
512 - F6429920CDFD8D08A5A0566565673330 /* DispatchQueue+Alamofire.swift */,  
513 - 99DF7E55400E9131640E0694D3C91764 /* MultipartFormData.swift */,  
514 - BCCC1A6E4AF8DAF6E5609D65548B3C79 /* NetworkReachabilityManager.swift */,  
515 - 2F2F35AD7354793D357E10226DE37995 /* Notifications.swift */,  
516 - 14EC82B350F60C65CB156014F5997DCE /* ParameterEncoding.swift */,  
517 - 232E0E55F341C5600028F7AAA4F59E8A /* Request.swift */,  
518 - 8781B0306B0188AF528659F413E1B542 /* Response.swift */,  
519 - 39F3B60B0A2AD7975DA5BCA943FA6BD5 /* ResponseSerialization.swift */,  
520 - 92331AB0F30415BE666C619D1A45513E /* Result.swift */,  
521 - 640ED88831DE9CA10759B8FC3751C531 /* ServerTrustPolicy.swift */,  
522 - 2D3152CF39784BC2AAD4747AF03BB50A /* SessionDelegate.swift */,  
523 - 5104B9F40B6C55F71BDE788F76AA8F53 /* SessionManager.swift */,  
524 - BFD387D9E3BDF322939523D4DF31CA79 /* TaskDelegate.swift */,  
525 - D9ED9DA2E61F2A4DD7E760C61C47A3F1 /* Timeline.swift */,  
526 - E95345A11FCCED373B3A5758A6073CDB /* Validation.swift */,  
527 - A87864D22DE2007F4600F7C0E566D95C /* Support Files */, 563 + B03DB8D1B8FEFA6F91F509A16D6176F3 /* Info.plist */,
  564 + 0ABC8592074E5B83BDBF01388C67A8B7 /* SDWebImage.modulemap */,
  565 + D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */,
  566 + F1187580C59983EBFA6A55260AF21079 /* SDWebImage-dummy.m */,
  567 + 676E6BA89EE0D10BE38626EE3E3B8A9F /* SDWebImage-prefix.pch */,
  568 + B82FE543DC2AE8EF3A0F380DE2B5988A /* SDWebImage-umbrella.h */,
528 ); 569 );
529 - name = Alamofire;  
530 - path = Alamofire; 570 + name = "Support Files";
  571 + path = "../Target Support Files/SDWebImage";
531 sourceTree = "<group>"; 572 sourceTree = "<group>";
532 }; 573 };
533 - 0AFF261FC6409676B5FE2EA67480CAE4 /* UMCSecurityPlugins */ = { 574 + 0BD61037A6B393F3F3CECE029889F374 /* Resources */ = {
534 isa = PBXGroup; 575 isa = PBXGroup;
535 children = ( 576 children = (
536 - 8FC2DD334C1E70C1C4C5C8F0FA196151 /* Frameworks */, 577 + 729A72124A700ED6D7D56FE6E3316184 /* SVProgressHUD.bundle */,
537 ); 578 );
538 - name = UMCSecurityPlugins;  
539 - path = UMCSecurityPlugins; 579 + name = Resources;
540 sourceTree = "<group>"; 580 sourceTree = "<group>";
541 }; 581 };
542 - 197A90DE72E89B51A1E8F89461EABB00 /* Frameworks */ = { 582 + 0D5414319A3865994CB656BBA34C49BD /* HandyJSON */ = {
543 isa = PBXGroup; 583 isa = PBXGroup;
544 children = ( 584 children = (
545 - 5DCF2929ACA53CE3D9FD6342DF5F8D9D /* libaacplus.a */,  
546 - 03475756EB49A978A9F331D44971B60B /* libcrypto.a */,  
547 - A48FF17CB17A07E2B4AEC609B9947C52 /* libevent.a */,  
548 - B4C40BE5E03351505F3B0830F40CFA9E /* libssl.a */,  
549 - CF9CDCEBD5D016D3F349D31FFDAEA20A /* NIMSDK.framework */, 585 + DF39B11A9C408A7CFA8E347E7F717E80 /* AnyExtensions.swift */,
  586 + 68ECD5E13EA08D669EEBD74218B18FA5 /* BuiltInBasicType.swift */,
  587 + 916CF2DD179C34072F0CED7EA7E172C4 /* BuiltInBridgeType.swift */,
  588 + B19A6339BCDC426144D4987C81596418 /* Configuration.swift */,
  589 + 98932AABF2712E9978244730956580D5 /* CustomDateFormatTransform.swift */,
  590 + A6614C2951E5A4AB6D1DF2B076BF1A5C /* DataTransform.swift */,
  591 + 2D7A5D10D9FFDD32C4D3CF85DDCFC707 /* DateFormatterTransform.swift */,
  592 + 10D6F8B588CB7C3C02CD426DADF34CE4 /* DateTransform.swift */,
  593 + DFFC9D8585FF5A3FC4C7FD63A93DCE16 /* Deserializer.swift */,
  594 + 2BC1B5A06113F348365D3564FD6425C6 /* EnumTransform.swift */,
  595 + 6CC52F25BF175D139AA0E5C94DC363A9 /* EnumType.swift */,
  596 + E1300F08331C16959F41C2533B209EF5 /* Export.swift */,
  597 + E7701D17547204EF54A538449343E8A4 /* ExtendCustomBasicType.swift */,
  598 + 68D3997593CBB0B018C81C73E8337C2C /* ExtendCustomModelType.swift */,
  599 + 92B55B2A9C151490137F69027B7F531E /* HandyJSON.h */,
  600 + 05B1F80DC3C02C2AD29D4C6CEA059CCD /* HelpingMapper.swift */,
  601 + BFC1E0E16DEFECC3E2FE92A428C9920D /* HexColorTransform.swift */,
  602 + 7379E87D9FF2E196ADB91DC8A0A5F2F3 /* ISO8601DateTransform.swift */,
  603 + 14E325E19530D7ADA41064D345141437 /* Logger.swift */,
  604 + 07BCC67F387326CAFCE34AF5FD2DBDE2 /* Measuable.swift */,
  605 + 00395AB0A6A459E12899B1CC7AA3C954 /* Metadata.swift */,
  606 + C29AD1BD351F370FBE921BBE6756CEC9 /* NominalType.swift */,
  607 + 467C66A8C88F09EF9D0129564F08540C /* NSDecimalNumberTransform.swift */,
  608 + 4457386C2A87F3E11630992C9CAA7836 /* OtherExtension.swift */,
  609 + ABE9E390C3EADB423277CE1E912E10AA /* PointerType.swift */,
  610 + ECC6F721935680D316DC183994F4F569 /* Properties.swift */,
  611 + 9CA29ADD75C3FE58A4ED07E10D427C9F /* PropertyInfo.swift */,
  612 + 35322B49B5EBE0CF14B7BC8677497347 /* ReflectionHelper.swift */,
  613 + AF0EB1CAE5B795EB85A1165F6D98C372 /* Serializer.swift */,
  614 + 1ABA7E2E494925BF34BC9885BE24E31C /* Transformable.swift */,
  615 + EC1BF45D7C52BC6493B283DDB371395F /* TransformOf.swift */,
  616 + 8F75E090F317987C0134B9DD1E5963C9 /* TransformType.swift */,
  617 + 9B31E52FEB6E5A6A955D4050CB76B18C /* URLTransform.swift */,
  618 + 8F43C2634E0BE8006FDE8986D81A795E /* Support Files */,
550 ); 619 );
551 - name = Frameworks; 620 + name = HandyJSON;
  621 + path = HandyJSON;
552 sourceTree = "<group>"; 622 sourceTree = "<group>";
553 }; 623 };
554 - 20B56609144CE204DFA8221F742B2D76 /* Frameworks */ = { 624 + 14FDC70D8950849FB1C0282A12C38C4E /* Frameworks */ = {
555 isa = PBXGroup; 625 isa = PBXGroup;
556 children = ( 626 children = (
557 - 287B6E205C5204939598639BF0799466 /* iOS */, 627 + 045B43DFAA088FDD2E5F7DE61A99D3EF /* UMCommon.framework */,
558 ); 628 );
559 name = Frameworks; 629 name = Frameworks;
560 sourceTree = "<group>"; 630 sourceTree = "<group>";
561 }; 631 };
562 - 2113AB85D8791161623936EC0882CA20 /* Support Files */ = { 632 + 1F4DE6AE0412496E30F0F30AD61DD011 /* iOS */ = {
563 isa = PBXGroup; 633 isa = PBXGroup;
564 children = ( 634 children = (
565 - 8D2C5397761E61B24600821547A409CD /* Info.plist */,  
566 - DBE314BE44865438F00A5054E414EF77 /* Toast.modulemap */,  
567 - 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */,  
568 - 85EBECC44FA24EC40748D3CB399DD1F3 /* Toast-dummy.m */,  
569 - 52F1099514615B3BA1CA982ECF578DDF /* Toast-prefix.pch */,  
570 - 835B1DEC82F034C2C12DC0723F18F6E9 /* Toast-umbrella.h */,  
571 - );  
572 - name = "Support Files";  
573 - path = "../Target Support Files/Toast";  
574 - sourceTree = "<group>";  
575 - };  
576 - 287B6E205C5204939598639BF0799466 /* iOS */ = {  
577 - isa = PBXGroup;  
578 - children = (  
579 - E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */,  
580 - 59271332AFD884264C5B45B6B6152051 /* ImageIO.framework */,  
581 - 4DB0A7F29D540AB077DA6D9855C3F743 /* QuartzCore.framework */,  
582 - 93ED65B5F47F5FEA00C9BC9D151B1D26 /* SystemConfiguration.framework */,  
583 - B9B732FC24A0EC5E46E41D939F4A1130 /* UIKit.framework */, 635 + 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */,
  636 + B77DE72B7ED4AED0DBED016D1274EFE8 /* ImageIO.framework */,
  637 + 94B64C32F67C820564A1C07F82FB412C /* QuartzCore.framework */,
  638 + 01529461C8BC5BFBF1FAD1AE7D691496 /* SystemConfiguration.framework */,
  639 + BAE5BE9DB67074649A1927384361E0A8 /* UIKit.framework */,
584 ); 640 );
585 name = iOS; 641 name = iOS;
586 sourceTree = "<group>"; 642 sourceTree = "<group>";
587 }; 643 };
588 - 2A1708CE4EC9BA0CA7B5865FF66228B4 /* Support Files */ = { 644 + 2021A6AEED487F441EF547B9DCEFF3E6 /* Support Files */ = {
589 isa = PBXGroup; 645 isa = PBXGroup;
590 children = ( 646 children = (
591 - 0CDCA399D86C4D9BFD1AAA60E4F5A9F5 /* HandyJSON.modulemap */,  
592 - 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */,  
593 - FD2B11D4DCD30BDBA06841569E01E1BD /* HandyJSON-dummy.m */,  
594 - 297F8CEFA42DFD823263EA02BC36D29A /* HandyJSON-prefix.pch */,  
595 - 11DABA5B57A3076260D36D4A9AE646F5 /* HandyJSON-umbrella.h */,  
596 - 2098C9BB32F72BB65BA83ADD1F338099 /* Info.plist */, 647 + 60528D650715D578BD996859FC810107 /* Info.plist */,
  648 + BB6422771B215BFE2B4A9C0D9C9BC82B /* SVProgressHUD.modulemap */,
  649 + C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */,
  650 + A23A7E20FB52B9BFC4899C0FEBA2C6CE /* SVProgressHUD-dummy.m */,
  651 + 0F4FDE3A8C9BEA27417C27172F5BC2A5 /* SVProgressHUD-prefix.pch */,
  652 + 06E0F3A00F6C087D410087D3FE65529D /* SVProgressHUD-umbrella.h */,
597 ); 653 );
598 name = "Support Files"; 654 name = "Support Files";
599 - path = "../Target Support Files/HandyJSON";  
600 - sourceTree = "<group>";  
601 - };  
602 - 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */ = {  
603 - isa = PBXGroup;  
604 - children = (  
605 - BE317C13F71B97F884FEF35459393B25 /* Pods-ParentAssistant */,  
606 - );  
607 - name = "Targets Support Files"; 655 + path = "../Target Support Files/SVProgressHUD";
608 sourceTree = "<group>"; 656 sourceTree = "<group>";
609 }; 657 };
610 - 330169F0E739AF701BDEBB5894F8434A /* SDWebImage */ = { 658 + 2409C0E750E5175AA19E7BA4DA2A475D /* Frameworks */ = {
611 isa = PBXGroup; 659 isa = PBXGroup;
612 children = ( 660 children = (
613 - 5E15FAEE84F8B146F03BE7AFBAC36661 /* Core */,  
614 - 630CEDD835E65E88DC71885CD9EF4E92 /* Support Files */, 661 + 79353402DE45C743DE8658FE2C413D90 /* libaacplus.a */,
  662 + B4FE0743D323412387DC64C29B1AE5F7 /* libcrypto.a */,
  663 + C7C6E9C97726F9691282BA5009E78833 /* libevent.a */,
  664 + 605BF197AFCD5A69E3A6A700329C2FCA /* libssl.a */,
  665 + 93831DF9B9AE2775CB38F92DAD62BF35 /* NIMSDK.framework */,
615 ); 666 );
616 - name = SDWebImage;  
617 - path = SDWebImage; 667 + name = Frameworks;
618 sourceTree = "<group>"; 668 sourceTree = "<group>";
619 }; 669 };
620 - 37C774715FC3CB332E3DBBFF760D1DA7 /* DZNEmptyDataSet */ = { 670 + 301A38DCCF06B3AC4AF5322410158E12 /* XRCarouselView */ = {
621 isa = PBXGroup; 671 isa = PBXGroup;
622 children = ( 672 children = (
623 - 41531DBB287870602D671C4D97E99B21 /* UIScrollView+EmptyDataSet.h */,  
624 - 18F6A571F05F4D0DD12870CE83C8F787 /* UIScrollView+EmptyDataSet.m */,  
625 - 001E2CA6EA468C671F75E62723E01ABD /* Support Files */, 673 + AA29655EDD56783CB2C21A411019B7BA /* XRCarouselView.h */,
  674 + 89457F43B7DE2154380C8DD976759AA2 /* XRCarouselView.m */,
  675 + 796662A504D2560DE6FA8F82F7CCA93C /* Resources */,
  676 + 96AED64B9563F84118E7D6B1CF316040 /* Support Files */,
626 ); 677 );
627 - name = DZNEmptyDataSet;  
628 - path = DZNEmptyDataSet; 678 + name = XRCarouselView;
  679 + path = XRCarouselView;
629 sourceTree = "<group>"; 680 sourceTree = "<group>";
630 }; 681 };
631 - 3860473AD1F18D1A7419BE2875F3630F /* Frameworks */ = { 682 + 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */ = {
632 isa = PBXGroup; 683 isa = PBXGroup;
633 children = ( 684 children = (
634 - BE846687076AD4570ACE89EC260747A1 /* UMErrorCatch.framework */, 685 + BE317C13F71B97F884FEF35459393B25 /* Pods-ParentAssistant */,
635 ); 686 );
636 - name = Frameworks; 687 + name = "Targets Support Files";
637 sourceTree = "<group>"; 688 sourceTree = "<group>";
638 }; 689 };
639 - 38EFF4314C3C2EB48B86E623B8035A4B /* UMCAnalytics */ = { 690 + 3A24F7BBB5CB0025CF2072B4FB964C24 /* Products */ = {
640 isa = PBXGroup; 691 isa = PBXGroup;
641 children = ( 692 children = (
642 - 58FD8FF25B60AC3F652B1FDCA8518B99 /* Frameworks */, 693 + 937EE30FD85AB8EED4F8467502DD290F /* Alamofire.framework */,
  694 + B9806961B1DB01F087677787DFCC6CE0 /* AlamofireImage.framework */,
  695 + 7C9D89FB057D8F2ECBB232C7A81EF4B5 /* DZNEmptyDataSet.framework */,
  696 + 110D34637F4EF19C8F46B101A1509ABE /* HandyJSON.framework */,
  697 + 72C584102060EC4C983B4B76AB4B8C8F /* Pods_ParentAssistant.framework */,
  698 + 95CAD531E474553E7D52B95131219D1A /* Reachability.framework */,
  699 + 8E2EC639DC31085C2078E4638A61266B /* SDWebImage.framework */,
  700 + 344E5051853CBAE87166BAA69476DDB1 /* SVProgressHUD.framework */,
  701 + 52303324A62AD0B74F2DD46E74D232EB /* SwiftHash.framework */,
  702 + 507695995D3D9F4276EAFC4603ABFF54 /* Toast.framework */,
  703 + 444E77BBBDD4B2AB34C6742B6752BBCB /* XRCarouselView.framework */,
643 ); 704 );
644 - name = UMCAnalytics;  
645 - path = UMCAnalytics; 705 + name = Products;
646 sourceTree = "<group>"; 706 sourceTree = "<group>";
647 }; 707 };
648 - 3C7A5A0E8FB6FB9142B786013E33F9B1 /* NIMSDK_LITE */ = { 708 + 3FF4649D5096372902422FFDFDD8E56D /* SwiftHash */ = {
649 isa = PBXGroup; 709 isa = PBXGroup;
650 children = ( 710 children = (
651 - 197A90DE72E89B51A1E8F89461EABB00 /* Frameworks */, 711 + 8249AA0D5DBC641B891AE927074850B2 /* MD5.swift */,
  712 + E651A4469FA2206746488B70290D48C0 /* SHA1.swift */,
  713 + B6C77C2D1243C37F15069EBD4B8827B8 /* Support Files */,
652 ); 714 );
653 - name = NIMSDK_LITE;  
654 - path = NIMSDK_LITE; 715 + name = SwiftHash;
  716 + path = SwiftHash;
655 sourceTree = "<group>"; 717 sourceTree = "<group>";
656 }; 718 };
657 - 3FF5DEC88DC62971403983A6F02247FE /* Toast */ = { 719 + 43383F8D50059A08F0FE7124DFF675F1 /* Core */ = {
658 isa = PBXGroup; 720 isa = PBXGroup;
659 children = ( 721 children = (
660 - 19FAAAAFAF3A705D1081BDCDC14CAFD6 /* UIView+Toast.h */,  
661 - E533F265C56324D6F57EB232221F586A /* UIView+Toast.m */,  
662 - 2113AB85D8791161623936EC0882CA20 /* Support Files */, 722 + 1A53991A7FAF70CDAC1F059FB04F5543 /* NSData+ImageContentType.h */,
  723 + 229808FB79115B70777D682D8335C18E /* NSData+ImageContentType.m */,
  724 + A2BD80EBA9375936EAA1AE0D930C61EC /* SDImageCache.h */,
  725 + 155F8627DF2C4A4A091DD4AF34FFEF02 /* SDImageCache.m */,
  726 + 61D09F1E0C8F29641858460B3928A5B0 /* SDWebImageCompat.h */,
  727 + 920C3AE864C4E24091B77772A498A58C /* SDWebImageCompat.m */,
  728 + F3CF9F638E5784E56583202BEBE63239 /* SDWebImageDecoder.h */,
  729 + 6B05BD93D4EE278B866CC9AAF18763DB /* SDWebImageDecoder.m */,
  730 + 9D9602FA58305177F98B7472A155DE66 /* SDWebImageDownloader.h */,
  731 + 4BBA6274610821F15000C6CC777D555B /* SDWebImageDownloader.m */,
  732 + 852A7B853425A17ACDE963BB0C57B689 /* SDWebImageDownloaderOperation.h */,
  733 + 358430CDB8CA6FB92C74E9FC7F6EB159 /* SDWebImageDownloaderOperation.m */,
  734 + D43927282F3DD1C78741ABFCC5E0C768 /* SDWebImageManager.h */,
  735 + 02DAB9B7A1A3D2199EFC7FC7FC69ED85 /* SDWebImageManager.m */,
  736 + ED4D8AA9257567AC16CB397E7E8BF346 /* SDWebImageOperation.h */,
  737 + 61CAF6761E3C21827415A9DA38D18547 /* SDWebImagePrefetcher.h */,
  738 + 6DA08525DC2775B611071866CF38CC96 /* SDWebImagePrefetcher.m */,
  739 + D96BCA19B9F922B2258E4C0D40666B58 /* UIButton+WebCache.h */,
  740 + 8BFF20BC7E4F55C09BAC34A664D91FED /* UIButton+WebCache.m */,
  741 + 0DFCFB41829DC67B9036DEF9766C6C88 /* UIImage+GIF.h */,
  742 + 310743AC8DCCF3F81515515A6FC64B8A /* UIImage+GIF.m */,
  743 + 715810392F163BB36DFE8AC307460289 /* UIImage+MultiFormat.h */,
  744 + 4ED641951605DEB02B067F9D1915C5A9 /* UIImage+MultiFormat.m */,
  745 + 0B751448AE7B6607E97470BFD4082216 /* UIImageView+HighlightedWebCache.h */,
  746 + CD28D005A100BC203777597B48B8AD06 /* UIImageView+HighlightedWebCache.m */,
  747 + E4D61E78309E6543D6EBC75BE2967417 /* UIImageView+WebCache.h */,
  748 + 496A0D655D409BDF23A3826300EBCD1B /* UIImageView+WebCache.m */,
  749 + 98BA100696255C8CFD15860D64267467 /* UIView+WebCacheOperation.h */,
  750 + BC99BBF9B209FE42B0D74F5CFB60627F /* UIView+WebCacheOperation.m */,
663 ); 751 );
664 - name = Toast;  
665 - path = Toast; 752 + name = Core;
666 sourceTree = "<group>"; 753 sourceTree = "<group>";
667 }; 754 };
668 - 4957D806F4D44D6387F398B8ECD395C9 /* Support Files */ = { 755 + 56CCB4F4B6E9E8D3FDF3A892A90571F4 /* AlamofireImage */ = {
669 isa = PBXGroup; 756 isa = PBXGroup;
670 children = ( 757 children = (
671 - FF928773E158E70CF5C2B45EA69A4223 /* Info.plist */,  
672 - 8CDA4E6BD46E857912EC5B5F99364A24 /* SwiftHash.modulemap */,  
673 - BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */,  
674 - 448D149E9E2122E63C2D8CDB8E1159CB /* SwiftHash-dummy.m */,  
675 - 5B56491AFD4EC6985EBCCEF221A0FCB8 /* SwiftHash-prefix.pch */,  
676 - 9F2BF6E468482ED7EDAE9AFD6CA2C994 /* SwiftHash-umbrella.h */,  
677 - );  
678 - name = "Support Files";  
679 - path = "../Target Support Files/SwiftHash"; 758 + AE04BA7BB2F95B59112DED31AECB069E /* AFIError.swift */,
  759 + AC0A874231DDAD102B02D7EFD048FDE2 /* Image.swift */,
  760 + FEA8115215CE30840A6225F435645485 /* ImageCache.swift */,
  761 + FDA2AA9043380263CFFD99AE883B70ED /* ImageDownloader.swift */,
  762 + A58625E1014C6D82D1825309986334E1 /* ImageFilter.swift */,
  763 + CC28263CA0EDAEA1CBC1173B87FEA769 /* Request+AlamofireImage.swift */,
  764 + 7C4ACCC8EE8E5E07D0CD171894588314 /* UIButton+AlamofireImage.swift */,
  765 + 2E3282E372FE0A6C0D2227384238F921 /* UIImage+AlamofireImage.swift */,
  766 + D4D00913B407B6DB96C7E7B48C21D904 /* UIImageView+AlamofireImage.swift */,
  767 + ED22116B8F3EBCF03BF952FD1412F8A7 /* Support Files */,
  768 + );
  769 + name = AlamofireImage;
  770 + path = AlamofireImage;
680 sourceTree = "<group>"; 771 sourceTree = "<group>";
681 }; 772 };
682 - 55375898F80E2F483F6A33CD3B40855D /* SwiftHash */ = { 773 + 626BE02B583652D883A14A0561438CB2 /* Frameworks */ = {
683 isa = PBXGroup; 774 isa = PBXGroup;
684 children = ( 775 children = (
685 - 9AEE056145338863D7A727ACF1C3657C /* MD5.swift */,  
686 - 9A4D6703A8771BB168130EFB6EAC1C3E /* SHA1.swift */,  
687 - 4957D806F4D44D6387F398B8ECD395C9 /* Support Files */, 776 + 3CD0FA7EE743F01B3A6385702606A408 /* Alamofire.framework */,
  777 + 1F4DE6AE0412496E30F0F30AD61DD011 /* iOS */,
688 ); 778 );
689 - name = SwiftHash;  
690 - path = SwiftHash; 779 + name = Frameworks;
691 sourceTree = "<group>"; 780 sourceTree = "<group>";
692 }; 781 };
693 - 5763DABFBEC61EF21CE978F465358A89 /* SVProgressHUD */ = { 782 + 67A94A45D2AA43B64721FE393BF0B924 /* Frameworks */ = {
694 isa = PBXGroup; 783 isa = PBXGroup;
695 children = ( 784 children = (
696 - 6768B1FE2E118D79D8A1613520B9BB23 /* SVIndefiniteAnimatedView.h */,  
697 - 72803D16FA054A0D26C303991C1F2B3C /* SVIndefiniteAnimatedView.m */,  
698 - B6554BE7D86E2DF12BC2CFA630452CA0 /* SVProgressAnimatedView.h */,  
699 - 38EE23882943EDCED73523F643A71C39 /* SVProgressAnimatedView.m */,  
700 - 17403F9FAA48DA29AAEB297BE9AC4D51 /* SVProgressHUD.h */,  
701 - 1DC66067EC016B21D6BC487C409083AF /* SVProgressHUD.m */,  
702 - 20C0A79CAF95E65B981CC5F896E4334C /* SVRadialGradientLayer.h */,  
703 - AE8B2524C105710A1C75E5F3C734796F /* SVRadialGradientLayer.m */,  
704 - 85CC9E6AC38974A790C417FCB9FD89FE /* Resources */,  
705 - C78510EC4A1F228614ECFEB07DFC0275 /* Support Files */, 785 + 057C8BFD76D95D8932478DFC5DA7DB3E /* UMErrorCatch.framework */,
706 ); 786 );
707 - name = SVProgressHUD;  
708 - path = SVProgressHUD; 787 + name = Frameworks;
709 sourceTree = "<group>"; 788 sourceTree = "<group>";
710 }; 789 };
711 - 58FD8FF25B60AC3F652B1FDCA8518B99 /* Frameworks */ = { 790 + 67B27D86547E925A9481C071E5DC217B /* UMCCommon */ = {
712 isa = PBXGroup; 791 isa = PBXGroup;
713 children = ( 792 children = (
714 - D124D84D327A6ADF3D01C95E84C09A31 /* UMAnalytics.framework */, 793 + 14FDC70D8950849FB1C0282A12C38C4E /* Frameworks */,
715 ); 794 );
716 - name = Frameworks; 795 + name = UMCCommon;
  796 + path = UMCCommon;
717 sourceTree = "<group>"; 797 sourceTree = "<group>";
718 }; 798 };
719 - 59C2933D98416017CC5447DA025532B4 /* UMCErrorCatch */ = { 799 + 75CE8CBE50D56BFC3821ECF0A886130F /* Support Files */ = {
720 isa = PBXGroup; 800 isa = PBXGroup;
721 children = ( 801 children = (
722 - 3860473AD1F18D1A7419BE2875F3630F /* Frameworks */, 802 + D79CBFE6F9821431996C8160F19D90C6 /* Alamofire.modulemap */,
  803 + 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */,
  804 + 489ED6DFB42C7C8F6A4875005025A913 /* Alamofire-dummy.m */,
  805 + 156F9486C74F4094ACE7858B18E5C41D /* Alamofire-prefix.pch */,
  806 + 78F77FFCC80D398532E854672D527FD8 /* Alamofire-umbrella.h */,
  807 + 58B4CFDB50C6966BC7B9CB0CBD1C60E7 /* Info.plist */,
723 ); 808 );
724 - name = UMCErrorCatch;  
725 - path = UMCErrorCatch; 809 + name = "Support Files";
  810 + path = "../Target Support Files/Alamofire";
726 sourceTree = "<group>"; 811 sourceTree = "<group>";
727 }; 812 };
728 - 5E15FAEE84F8B146F03BE7AFBAC36661 /* Core */ = { 813 + 796662A504D2560DE6FA8F82F7CCA93C /* Resources */ = {
729 isa = PBXGroup; 814 isa = PBXGroup;
730 children = ( 815 children = (
731 - DB5FF7B561F6F548C82F1FC27FDD72E8 /* NSData+ImageContentType.h */,  
732 - C203E9ABEF394B0009B142EEB9AA64FC /* NSData+ImageContentType.m */,  
733 - 140A2830037A30E45442BA52CBDA1CFC /* SDImageCache.h */,  
734 - 1439A3EA7193042844C3E9C52032677C /* SDImageCache.m */,  
735 - 82C441F9B75595B2F266E6AC40AD7D85 /* SDWebImageCompat.h */,  
736 - 2E90E960C03E09803780D5C47A55A4DB /* SDWebImageCompat.m */,  
737 - 172419A08571955755C3C6FB2044DD9D /* SDWebImageDecoder.h */,  
738 - DF68D7CB4183F99C38744F4985CD422D /* SDWebImageDecoder.m */,  
739 - 9A559DCF61F2E184BC9318C05F05CFF3 /* SDWebImageDownloader.h */,  
740 - 1983D355FD75B9D24A71756509C98131 /* SDWebImageDownloader.m */,  
741 - 33347618F6541AA20F52632F9EA10CA6 /* SDWebImageDownloaderOperation.h */,  
742 - 24C69C342339292A7BBB5C56D2C12D12 /* SDWebImageDownloaderOperation.m */,  
743 - 8A51BA19C89D5E62EDCF2DB9D9FA43E0 /* SDWebImageManager.h */,  
744 - FFCF8A6062658FA349B617C0D75723C2 /* SDWebImageManager.m */,  
745 - B9A38D8C4EC4826AEDC2A52DD0187186 /* SDWebImageOperation.h */,  
746 - E33C2A8A35CA23130F27CFEC0285B7DB /* SDWebImagePrefetcher.h */,  
747 - 6850886B55CE3CD9B901B28690292C5C /* SDWebImagePrefetcher.m */,  
748 - C03FC1A11EE20AB8B6A4B398E11B26B0 /* UIButton+WebCache.h */,  
749 - BE70BDE392E6E92B76047D2DED4ED380 /* UIButton+WebCache.m */,  
750 - E3370B03674C70DABFF75D9D2BA95DCE /* UIImage+GIF.h */,  
751 - B71F8A62F3906657D17D418212E1CBA1 /* UIImage+GIF.m */,  
752 - F6C063D5E492D3ED69858D446C30719E /* UIImage+MultiFormat.h */,  
753 - 469D54339A6D448DF6D1166FDB669676 /* UIImage+MultiFormat.m */,  
754 - 9011EFC1DA29BE6CA0831595062B82ED /* UIImageView+HighlightedWebCache.h */,  
755 - BB7CE29DC4FFF250766240EA8DA973D1 /* UIImageView+HighlightedWebCache.m */,  
756 - 206933D2687A3DC4CD2836F2AEF28A3B /* UIImageView+WebCache.h */,  
757 - 6E2AA0C415512D5F3F34F7A99AA4D14A /* UIImageView+WebCache.m */,  
758 - F638493F2C879E2AF820AE53EA390269 /* UIView+WebCacheOperation.h */,  
759 - 1836357ECED17B3B0BF22256498AA8EE /* UIView+WebCacheOperation.m */, 816 + B00FEDA7D2B852B770837D954A635F0B /* XRPlaceholder.png */,
760 ); 817 );
761 - name = Core; 818 + name = Resources;
762 sourceTree = "<group>"; 819 sourceTree = "<group>";
763 }; 820 };
764 - 630CEDD835E65E88DC71885CD9EF4E92 /* Support Files */ = { 821 + 7B6FD119C5043EA8D24938E17F689C68 /* NIMSDK_LITE */ = {
765 isa = PBXGroup; 822 isa = PBXGroup;
766 children = ( 823 children = (
767 - 106A3E63162DD85E6D0BEC1EE1FFDBB4 /* Info.plist */,  
768 - D912920D1BEEB7757AF4BE74E2EC8FA6 /* SDWebImage.modulemap */,  
769 - AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */,  
770 - FF65E4A0D399571B01517891F0309004 /* SDWebImage-dummy.m */,  
771 - 871C0D1C45FD62FE7B82D8E083C00466 /* SDWebImage-prefix.pch */,  
772 - E786E1AEE51D914333543AC4DEF9B3FB /* SDWebImage-umbrella.h */, 824 + 2409C0E750E5175AA19E7BA4DA2A475D /* Frameworks */,
773 ); 825 );
774 - name = "Support Files";  
775 - path = "../Target Support Files/SDWebImage"; 826 + name = NIMSDK_LITE;
  827 + path = NIMSDK_LITE;
776 sourceTree = "<group>"; 828 sourceTree = "<group>";
777 }; 829 };
778 - 68471EF420D9A2E724167C5491206AFB /* Resources */ = { 830 + 7DB346D0F39D3F0E887471402A8071AB = {
779 isa = PBXGroup; 831 isa = PBXGroup;
780 children = ( 832 children = (
781 - FFEBBEC7D2ED4C631DFB3CBB04E6F926 /* XRPlaceholder.png */, 833 + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */,
  834 + 626BE02B583652D883A14A0561438CB2 /* Frameworks */,
  835 + A16C9A7A00849A680D2ABE20664F291E /* Pods */,
  836 + 3A24F7BBB5CB0025CF2072B4FB964C24 /* Products */,
  837 + 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */,
782 ); 838 );
783 - name = Resources;  
784 sourceTree = "<group>"; 839 sourceTree = "<group>";
785 }; 840 };
786 - 705867264671E4C7B187D746502DAB91 /* Support Files */ = { 841 + 818A0762A9C9D12339F271DBF1F4A0AF /* SDWebImage */ = {
787 isa = PBXGroup; 842 isa = PBXGroup;
788 children = ( 843 children = (
789 - C62416D612C6BD82B2867F75585C4C56 /* Info.plist */,  
790 - 095F51C7CEE9EF306E13A58319881EFF /* Reachability.modulemap */,  
791 - 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */,  
792 - 16CC2B704148D354077756FC0880DBCB /* Reachability-dummy.m */,  
793 - 42DB5E77081A2858012F4CBF354A0D27 /* Reachability-prefix.pch */,  
794 - 29BC53491C8D6BA4B81045D6FBBA043C /* Reachability-umbrella.h */, 844 + 43383F8D50059A08F0FE7124DFF675F1 /* Core */,
  845 + 03D7A135F0C051D7B2ADB4B1311D2155 /* Support Files */,
795 ); 846 );
796 - name = "Support Files";  
797 - path = "../Target Support Files/Reachability"; 847 + name = SDWebImage;
  848 + path = SDWebImage;
798 sourceTree = "<group>"; 849 sourceTree = "<group>";
799 }; 850 };
800 - 7DB346D0F39D3F0E887471402A8071AB = { 851 + 84B302A59A917E0D9C2EBA206DFA1A3A /* UMCSecurityPlugins */ = {
801 isa = PBXGroup; 852 isa = PBXGroup;
802 children = ( 853 children = (
803 - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */,  
804 - 20B56609144CE204DFA8221F742B2D76 /* Frameworks */,  
805 - D7E9034AEAB92F049FD989A2FAE23CD2 /* Pods */,  
806 - 9CE129D1A72CFA1DEF6F85FBF1B37E5B /* Products */,  
807 - 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */, 854 + C02FC18021F6A9D7F71E478E6C6012D5 /* Frameworks */,
808 ); 855 );
  856 + name = UMCSecurityPlugins;
  857 + path = UMCSecurityPlugins;
809 sourceTree = "<group>"; 858 sourceTree = "<group>";
810 }; 859 };
811 - 85CC9E6AC38974A790C417FCB9FD89FE /* Resources */ = { 860 + 87D211D7619F5C69CD22BC5A6BD43F1B /* SVProgressHUD */ = {
812 isa = PBXGroup; 861 isa = PBXGroup;
813 children = ( 862 children = (
814 - 65DEF3C169B8F1241E74C3D5C7DA5A6D /* SVProgressHUD.bundle */, 863 + 5BF833E322898122D95617BD9520476D /* SVIndefiniteAnimatedView.h */,
  864 + 70B842936FA16DF44F4AD4FC84E225A4 /* SVIndefiniteAnimatedView.m */,
  865 + DBA6EC35D53897ED2A96FEDE1BB384BA /* SVProgressAnimatedView.h */,
  866 + A8CB977B7AFFFA509CAA11CD0C03AEB5 /* SVProgressAnimatedView.m */,
  867 + F81C313FED69F64F2F4F403B4C4EC3F6 /* SVProgressHUD.h */,
  868 + 8A591BFD7762D296F2E84EBC08129BFA /* SVProgressHUD.m */,
  869 + 770A612E1A02028636A4D09BDEB87D10 /* SVRadialGradientLayer.h */,
  870 + CBB0446840A0CDD4BB7D69692D07CC21 /* SVRadialGradientLayer.m */,
  871 + 0BD61037A6B393F3F3CECE029889F374 /* Resources */,
  872 + 2021A6AEED487F441EF547B9DCEFF3E6 /* Support Files */,
815 ); 873 );
816 - name = Resources; 874 + name = SVProgressHUD;
  875 + path = SVProgressHUD;
817 sourceTree = "<group>"; 876 sourceTree = "<group>";
818 }; 877 };
819 - 8FC2DD334C1E70C1C4C5C8F0FA196151 /* Frameworks */ = { 878 + 89D3111CD10CBDFE268BF7ECFA93CE05 /* Reachability */ = {
820 isa = PBXGroup; 879 isa = PBXGroup;
821 children = ( 880 children = (
822 - FC9D90B14CC51CAAC698C0623AB16C70 /* SecurityEnvSDK.framework */,  
823 - E058896CA0DFFEF3CCEFAD6FEBA0DB11 /* UTDID.framework */, 881 + EF0B6E4594449A55A06C44CB6D1223F0 /* Reachability.h */,
  882 + F775144A6F17788F065E01BFD8DC2D5C /* Reachability.m */,
  883 + 0310C750335673BB116A6C5FAFEEFE49 /* Support Files */,
824 ); 884 );
825 - name = Frameworks; 885 + name = Reachability;
  886 + path = Reachability;
826 sourceTree = "<group>"; 887 sourceTree = "<group>";
827 }; 888 };
828 - 9CE129D1A72CFA1DEF6F85FBF1B37E5B /* Products */ = { 889 + 8F140A42D845EC8CE45E44C00A0F75EF /* Toast */ = {
829 isa = PBXGroup; 890 isa = PBXGroup;
830 children = ( 891 children = (
831 - E956F54FF76DE5D347505F3AF7694F03 /* Alamofire.framework */,  
832 - DD0E89B8C1439B9F5FDB39EA0232B3EA /* DZNEmptyDataSet.framework */,  
833 - 1719FF827E35476E2C51408C0A9BD81C /* HandyJSON.framework */,  
834 - B88D8470A1A1E4F507B1E9895B074253 /* Pods_ParentAssistant.framework */,  
835 - 5C3FCED1EF014BDAA42DACC871E2516A /* Reachability.framework */,  
836 - CE1C92985D9321104698E3AFAF68594E /* SDWebImage.framework */,  
837 - 33F1F6213579E70C284C8445EBD7DBDD /* SVProgressHUD.framework */,  
838 - 41009B988332564AFC9DAF9C3817C7FA /* SwiftHash.framework */,  
839 - A59A469B0852E07D2428D72E4C62B1E7 /* Toast.framework */,  
840 - 09E993E3E47BE7E80DCFECCEA59937CC /* XRCarouselView.framework */, 892 + 6BD1FCCAAFC6349CA1E2AC3881DB81FC /* UIView+Toast.h */,
  893 + 29B41A43E5D5CCE97E46706AC4240B68 /* UIView+Toast.m */,
  894 + EB8705EF374C4C0C14218029F0042B9B /* Support Files */,
841 ); 895 );
842 - name = Products; 896 + name = Toast;
  897 + path = Toast;
843 sourceTree = "<group>"; 898 sourceTree = "<group>";
844 }; 899 };
845 - A16014AECD4B7D4544FDD04B423C17A2 /* UMCCommon */ = { 900 + 8F43C2634E0BE8006FDE8986D81A795E /* Support Files */ = {
846 isa = PBXGroup; 901 isa = PBXGroup;
847 children = ( 902 children = (
848 - B6AC7F4D4F23329B98C15767E39B6946 /* Frameworks */, 903 + 08D048205A3343D5E251F506CBBE23E6 /* HandyJSON.modulemap */,
  904 + C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */,
  905 + 46E35C087C53D197C9D213DF73A74B66 /* HandyJSON-dummy.m */,
  906 + F1CF04B231D1BFC627F83398DFB40BBE /* HandyJSON-prefix.pch */,
  907 + 293A8917426C277C951BE22C661A240A /* HandyJSON-umbrella.h */,
  908 + BE69851A50C89CE0E218AE8504C1188B /* Info.plist */,
849 ); 909 );
850 - name = UMCCommon;  
851 - path = UMCCommon; 910 + name = "Support Files";
  911 + path = "../Target Support Files/HandyJSON";
852 sourceTree = "<group>"; 912 sourceTree = "<group>";
853 }; 913 };
854 - A763792383AB084CDE85481D91E26AE3 /* HandyJSON */ = { 914 + 96AED64B9563F84118E7D6B1CF316040 /* Support Files */ = {
855 isa = PBXGroup; 915 isa = PBXGroup;
856 children = ( 916 children = (
857 - 931ED830C3B0B8852F1479DE61BA997E /* AnyExtensions.swift */,  
858 - F948022D8D1EFEF734A07E6ED4D6CAF9 /* BuiltInBasicType.swift */,  
859 - 6976D41DC0C992EA2F24C3A7358E958F /* BuiltInBridgeType.swift */,  
860 - 1914DA670BEE4BC1F461E88ED1BD7C26 /* Configuration.swift */,  
861 - 64CF5A867496880A0DAE25ED9EC8E512 /* CustomDateFormatTransform.swift */,  
862 - DE92E07FF56795D096246F9059B540CA /* DataTransform.swift */,  
863 - B4EC3094994043023CF3002A63DD6DA4 /* DateFormatterTransform.swift */,  
864 - B0A49BF64844554AA6BC0B49FD9A9BE8 /* DateTransform.swift */,  
865 - 1D374115D56716D6284C03A777CD2BB4 /* Deserializer.swift */,  
866 - 31A74FD90C96035085B5A148E9CBA64C /* EnumTransform.swift */,  
867 - 5C73B5BC3B66F99610607951FEC5FCB3 /* EnumType.swift */,  
868 - C33C9063E8CA60D73EE6050FCF59F433 /* Export.swift */,  
869 - 32115C18B0BD53A5791A3FA797AB85AC /* ExtendCustomBasicType.swift */,  
870 - 54E529332879B58C942DDF16DF5D39B4 /* ExtendCustomModelType.swift */,  
871 - 6B3D43CB0BDA34787F85B2C084FBB09A /* HandyJSON.h */,  
872 - 9889E5067E9A54BAEC05298BBA10F671 /* HelpingMapper.swift */,  
873 - 2E85535E49256ABCDBBB9EA045CE6268 /* HexColorTransform.swift */,  
874 - 7DFB6D55866F4F62D8116993D42B55A8 /* ISO8601DateTransform.swift */,  
875 - 26EF7D93FE7442849AC14571996AC8ED /* Logger.swift */,  
876 - 7D9407543C44ABED0AC48154C76831BE /* Measuable.swift */,  
877 - BC3C517CD17DEB98E878268901D654E8 /* Metadata.swift */,  
878 - 7C5CEE4C10F2E83011011BAE5999B4FD /* NominalType.swift */,  
879 - 2830040C9AF69744EEB45C092E65CA2A /* NSDecimalNumberTransform.swift */,  
880 - E9462CA128209C32EE6E6647C88609D1 /* OtherExtension.swift */,  
881 - 3447CC75BA7C93ED3BF68C2F65392471 /* PointerType.swift */,  
882 - 05BE4EE179BFA37C2F5F3928F9237A1F /* Properties.swift */,  
883 - 81D2AEE4F419083BF22474B240B3D9F6 /* PropertyInfo.swift */,  
884 - 31257A57ECE5DD3A052A547DA8090EF9 /* ReflectionHelper.swift */,  
885 - 39C3C21D34A34F85D09063C7E1255E9D /* Serializer.swift */,  
886 - E4E76CB8696BAB20A617484E4726713B /* Transformable.swift */,  
887 - 72ADD4F0113F0555435EA10BA789F8E2 /* TransformOf.swift */,  
888 - F33461E2C03CDF90E02052B76ADADB01 /* TransformType.swift */,  
889 - 6D24FB404E9541910245BF3E68C5EE73 /* URLTransform.swift */,  
890 - 2A1708CE4EC9BA0CA7B5865FF66228B4 /* Support Files */, 917 + 7A45AEAFC59FC8550866653E018742E3 /* Info.plist */,
  918 + 6E2FF425EC8FB1E33922042D418E2A79 /* XRCarouselView.modulemap */,
  919 + 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */,
  920 + B63F0AB7376A64C50DA03CACC7D9CC2E /* XRCarouselView-dummy.m */,
  921 + B4595D719B06D3C0D44248E3DD5B1962 /* XRCarouselView-prefix.pch */,
  922 + 49DC3C5FB6A7B1CDAA1410FAABB684E0 /* XRCarouselView-umbrella.h */,
891 ); 923 );
892 - name = HandyJSON;  
893 - path = HandyJSON; 924 + name = "Support Files";
  925 + path = "../Target Support Files/XRCarouselView";
894 sourceTree = "<group>"; 926 sourceTree = "<group>";
895 }; 927 };
896 - A87864D22DE2007F4600F7C0E566D95C /* Support Files */ = { 928 + A16C9A7A00849A680D2ABE20664F291E /* Pods */ = {
897 isa = PBXGroup; 929 isa = PBXGroup;
898 children = ( 930 children = (
899 - 2EE1F3AAF4D2513EA3BFF47F019026DC /* Alamofire.modulemap */,  
900 - EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */,  
901 - BB2B3251E63EE34530FC8A40E441CB23 /* Alamofire-dummy.m */,  
902 - 07E1E2C8AC8B32A86D7C0A576243A070 /* Alamofire-prefix.pch */,  
903 - BF496B88C6E68626DC9D0C9FC152BD3C /* Alamofire-umbrella.h */,  
904 - 820C0B25502D820076E6945A9666E544 /* Info.plist */, 931 + A1F9F100FA7BE821D8C1CA349D5C7EAC /* Alamofire */,
  932 + 56CCB4F4B6E9E8D3FDF3A892A90571F4 /* AlamofireImage */,
  933 + F37E800D927B17552826F537A1FC4DE1 /* DZNEmptyDataSet */,
  934 + 0D5414319A3865994CB656BBA34C49BD /* HandyJSON */,
  935 + 7B6FD119C5043EA8D24938E17F689C68 /* NIMSDK_LITE */,
  936 + 89D3111CD10CBDFE268BF7ECFA93CE05 /* Reachability */,
  937 + 818A0762A9C9D12339F271DBF1F4A0AF /* SDWebImage */,
  938 + 87D211D7619F5C69CD22BC5A6BD43F1B /* SVProgressHUD */,
  939 + 3FF4649D5096372902422FFDFDD8E56D /* SwiftHash */,
  940 + 8F140A42D845EC8CE45E44C00A0F75EF /* Toast */,
  941 + D18EBDBE538D676F21A84906A850C7C5 /* UMCAnalytics */,
  942 + 67B27D86547E925A9481C071E5DC217B /* UMCCommon */,
  943 + D19DCA624A50F676CBC86D437D3B30B2 /* UMCErrorCatch */,
  944 + 84B302A59A917E0D9C2EBA206DFA1A3A /* UMCSecurityPlugins */,
  945 + 301A38DCCF06B3AC4AF5322410158E12 /* XRCarouselView */,
905 ); 946 );
906 - name = "Support Files";  
907 - path = "../Target Support Files/Alamofire"; 947 + name = Pods;
908 sourceTree = "<group>"; 948 sourceTree = "<group>";
909 }; 949 };
910 - B4BCFF35A95B70F9457A79139DBED331 /* Reachability */ = { 950 + A1F9F100FA7BE821D8C1CA349D5C7EAC /* Alamofire */ = {
911 isa = PBXGroup; 951 isa = PBXGroup;
912 children = ( 952 children = (
913 - 2AD254563DCC20283BB5C0C5B4E57B5C /* Reachability.h */,  
914 - 0969E5011DCC0C421F637E6859279610 /* Reachability.m */,  
915 - 705867264671E4C7B187D746502DAB91 /* Support Files */, 953 + 7EBA3110EB94A0568FF28796D778675E /* AFError.swift */,
  954 + 30A5A5A7B7C1088D4D4ABDFAAF6E54F3 /* Alamofire.swift */,
  955 + 2245A79B4B989C667CBB26B48B7A1896 /* DispatchQueue+Alamofire.swift */,
  956 + C7C98E50FC5D694C89DBEE8A1486D900 /* MultipartFormData.swift */,
  957 + EFA9DF74078A51C9573DF6952A753D1C /* NetworkReachabilityManager.swift */,
  958 + E215EB7C10CD4B2F724959DB344FE5C0 /* Notifications.swift */,
  959 + 0F3763627E35DE67CD17EE93E640DD39 /* ParameterEncoding.swift */,
  960 + E74F653E7072F40DB006FC90854FC840 /* Request.swift */,
  961 + D82D7054D7F1E7FE0ACBE043A3FA7F50 /* Response.swift */,
  962 + 2BE4F7B39AE70471948017C04083277A /* ResponseSerialization.swift */,
  963 + 7C01563CB8CAFA848353DD90A07F2F47 /* Result.swift */,
  964 + CAE58263CB0A52CDB5D3790DC6D0D74F /* ServerTrustPolicy.swift */,
  965 + 0BD55715F6A333D077B971AD89F07626 /* SessionDelegate.swift */,
  966 + 0F6296C8F6861894C09A46E509B544A6 /* SessionManager.swift */,
  967 + 85DBA7A206E80F9E00E01BEFE74D6D69 /* TaskDelegate.swift */,
  968 + 1A34017AEE736DE7CC86E3201A0B303C /* Timeline.swift */,
  969 + 981D262EBFB4CA168BE569F48CC64843 /* Validation.swift */,
  970 + 75CE8CBE50D56BFC3821ECF0A886130F /* Support Files */,
916 ); 971 );
917 - name = Reachability;  
918 - path = Reachability; 972 + name = Alamofire;
  973 + path = Alamofire;
919 sourceTree = "<group>"; 974 sourceTree = "<group>";
920 }; 975 };
921 - B6AC7F4D4F23329B98C15767E39B6946 /* Frameworks */ = { 976 + B6C77C2D1243C37F15069EBD4B8827B8 /* Support Files */ = {
922 isa = PBXGroup; 977 isa = PBXGroup;
923 children = ( 978 children = (
924 - DF826B20D920C607DF652F2F3EA4C2F8 /* UMCommon.framework */, 979 + 2387EDABD5D4A7ABE66B86C30A524A6C /* Info.plist */,
  980 + 5684F0F90E3FAEFBE15A94EE1C636644 /* SwiftHash.modulemap */,
  981 + 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */,
  982 + DF7918BBC8A10388FDE15B624F66A8E9 /* SwiftHash-dummy.m */,
  983 + D8A2F9829AECA7F54C384A6E17AB7124 /* SwiftHash-prefix.pch */,
  984 + 8B25C902A48A887CDEA53D385B48C92E /* SwiftHash-umbrella.h */,
925 ); 985 );
926 - name = Frameworks; 986 + name = "Support Files";
  987 + path = "../Target Support Files/SwiftHash";
927 sourceTree = "<group>"; 988 sourceTree = "<group>";
928 }; 989 };
929 BE317C13F71B97F884FEF35459393B25 /* Pods-ParentAssistant */ = { 990 BE317C13F71B97F884FEF35459393B25 /* Pods-ParentAssistant */ = {
@@ -944,155 +1005,190 @@ @@ -944,155 +1005,190 @@
944 path = "Target Support Files/Pods-ParentAssistant"; 1005 path = "Target Support Files/Pods-ParentAssistant";
945 sourceTree = "<group>"; 1006 sourceTree = "<group>";
946 }; 1007 };
947 - C78510EC4A1F228614ECFEB07DFC0275 /* Support Files */ = { 1008 + C02FC18021F6A9D7F71E478E6C6012D5 /* Frameworks */ = {
  1009 + isa = PBXGroup;
  1010 + children = (
  1011 + E2607500177BC99C04478DAB57D80EB7 /* SecurityEnvSDK.framework */,
  1012 + EEE063E46D8691853E8CDB3C33506BF8 /* UTDID.framework */,
  1013 + );
  1014 + name = Frameworks;
  1015 + sourceTree = "<group>";
  1016 + };
  1017 + D18EBDBE538D676F21A84906A850C7C5 /* UMCAnalytics */ = {
  1018 + isa = PBXGroup;
  1019 + children = (
  1020 + DD89B480B22F4C573AB6CF0C122D238C /* Frameworks */,
  1021 + );
  1022 + name = UMCAnalytics;
  1023 + path = UMCAnalytics;
  1024 + sourceTree = "<group>";
  1025 + };
  1026 + D19DCA624A50F676CBC86D437D3B30B2 /* UMCErrorCatch */ = {
  1027 + isa = PBXGroup;
  1028 + children = (
  1029 + 67A94A45D2AA43B64721FE393BF0B924 /* Frameworks */,
  1030 + );
  1031 + name = UMCErrorCatch;
  1032 + path = UMCErrorCatch;
  1033 + sourceTree = "<group>";
  1034 + };
  1035 + D7386CADE4284D284D37C38FDCFCEF63 /* Support Files */ = {
948 isa = PBXGroup; 1036 isa = PBXGroup;
949 children = ( 1037 children = (
950 - B507541260F671D342B11E7250120BBF /* Info.plist */,  
951 - 481FE62B9A76B9C994CED4CDBF22F059 /* SVProgressHUD.modulemap */,  
952 - 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */,  
953 - 0322584439902B09D766EF9B00C87E2A /* SVProgressHUD-dummy.m */,  
954 - 52C9D81718FDCE850DDAF365FD190B4F /* SVProgressHUD-prefix.pch */,  
955 - 93251EC8BEF89E6A4FA758DA38A1E47A /* SVProgressHUD-umbrella.h */, 1038 + B9A33258A85F658D3C02E30EC92D43FF /* DZNEmptyDataSet.modulemap */,
  1039 + 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */,
  1040 + EC105ECBFE938402821EF19D7C5DA1DA /* DZNEmptyDataSet-dummy.m */,
  1041 + 661171DD778BD7E26EE68F008228F1C9 /* DZNEmptyDataSet-prefix.pch */,
  1042 + CECDC33DC6A3E686FD21577C5B23C258 /* DZNEmptyDataSet-umbrella.h */,
  1043 + 0241F285DD08F109C7549C2CDA98F2F6 /* Info.plist */,
956 ); 1044 );
957 name = "Support Files"; 1045 name = "Support Files";
958 - path = "../Target Support Files/SVProgressHUD"; 1046 + path = "../Target Support Files/DZNEmptyDataSet";
959 sourceTree = "<group>"; 1047 sourceTree = "<group>";
960 }; 1048 };
961 - D31A1BD7824CBE1C0596DAB8776011D9 /* XRCarouselView */ = { 1049 + DD89B480B22F4C573AB6CF0C122D238C /* Frameworks */ = {
962 isa = PBXGroup; 1050 isa = PBXGroup;
963 children = ( 1051 children = (
964 - 57342E33349B812F65B6D994EA74E212 /* XRCarouselView.h */,  
965 - A91D08749C812CD6EB281780E69AFED6 /* XRCarouselView.m */,  
966 - 68471EF420D9A2E724167C5491206AFB /* Resources */,  
967 - DEA7E0AFDB9947306F061F7A72D3AE96 /* Support Files */, 1052 + EADCBFE671FB00B5F5FDBD2B3F6EC3CD /* UMAnalytics.framework */,
968 ); 1053 );
969 - name = XRCarouselView;  
970 - path = XRCarouselView; 1054 + name = Frameworks;
971 sourceTree = "<group>"; 1055 sourceTree = "<group>";
972 }; 1056 };
973 - D7E9034AEAB92F049FD989A2FAE23CD2 /* Pods */ = { 1057 + EB8705EF374C4C0C14218029F0042B9B /* Support Files */ = {
974 isa = PBXGroup; 1058 isa = PBXGroup;
975 children = ( 1059 children = (
976 - 035886489A99DD807583400603AB5019 /* Alamofire */,  
977 - 37C774715FC3CB332E3DBBFF760D1DA7 /* DZNEmptyDataSet */,  
978 - A763792383AB084CDE85481D91E26AE3 /* HandyJSON */,  
979 - 3C7A5A0E8FB6FB9142B786013E33F9B1 /* NIMSDK_LITE */,  
980 - B4BCFF35A95B70F9457A79139DBED331 /* Reachability */,  
981 - 330169F0E739AF701BDEBB5894F8434A /* SDWebImage */,  
982 - 5763DABFBEC61EF21CE978F465358A89 /* SVProgressHUD */,  
983 - 55375898F80E2F483F6A33CD3B40855D /* SwiftHash */,  
984 - 3FF5DEC88DC62971403983A6F02247FE /* Toast */,  
985 - 38EFF4314C3C2EB48B86E623B8035A4B /* UMCAnalytics */,  
986 - A16014AECD4B7D4544FDD04B423C17A2 /* UMCCommon */,  
987 - 59C2933D98416017CC5447DA025532B4 /* UMCErrorCatch */,  
988 - 0AFF261FC6409676B5FE2EA67480CAE4 /* UMCSecurityPlugins */,  
989 - D31A1BD7824CBE1C0596DAB8776011D9 /* XRCarouselView */, 1060 + 676078733016383B143B493E79D3CEF5 /* Info.plist */,
  1061 + 874C609455AB27C910DD97EBDD79E965 /* Toast.modulemap */,
  1062 + 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */,
  1063 + 53599A8492E17F111CC5C8D3C50E872A /* Toast-dummy.m */,
  1064 + 84AE5CF00E8941985B8EB7DFC8A475E7 /* Toast-prefix.pch */,
  1065 + 93E637F89EC35850C7250805992BB1C0 /* Toast-umbrella.h */,
990 ); 1066 );
991 - name = Pods; 1067 + name = "Support Files";
  1068 + path = "../Target Support Files/Toast";
992 sourceTree = "<group>"; 1069 sourceTree = "<group>";
993 }; 1070 };
994 - DEA7E0AFDB9947306F061F7A72D3AE96 /* Support Files */ = { 1071 + ED22116B8F3EBCF03BF952FD1412F8A7 /* Support Files */ = {
995 isa = PBXGroup; 1072 isa = PBXGroup;
996 children = ( 1073 children = (
997 - DE3D895CEB8D8D9876BA0F9346FF9D69 /* Info.plist */,  
998 - CC9B184B04C60B80BBEF83595DBE8AF4 /* XRCarouselView.modulemap */,  
999 - 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */,  
1000 - 7437E1C250CA27898AA8815D1117643B /* XRCarouselView-dummy.m */,  
1001 - 60794CE8C2369C4AA061EE9A931DDFED /* XRCarouselView-prefix.pch */,  
1002 - 323A41D79693687F0377B9ACACC90D4A /* XRCarouselView-umbrella.h */, 1074 + 865E120DE5EA698A2789C2686BC45C7A /* AlamofireImage.modulemap */,
  1075 + 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */,
  1076 + 600ABB9AA8054F7B4E851C17D19FCAA0 /* AlamofireImage-dummy.m */,
  1077 + 770EB1960009D9CCA67CBA11FBC8490A /* AlamofireImage-prefix.pch */,
  1078 + 9AD53A7A5BDC98AFD3CE8CF1BC407F10 /* AlamofireImage-umbrella.h */,
  1079 + 00E5D50454806A1FFA39BF7A572D4A37 /* Info.plist */,
1003 ); 1080 );
1004 name = "Support Files"; 1081 name = "Support Files";
1005 - path = "../Target Support Files/XRCarouselView"; 1082 + path = "../Target Support Files/AlamofireImage";
  1083 + sourceTree = "<group>";
  1084 + };
  1085 + F37E800D927B17552826F537A1FC4DE1 /* DZNEmptyDataSet */ = {
  1086 + isa = PBXGroup;
  1087 + children = (
  1088 + DD324E3E21CD21F91211149384F64690 /* UIScrollView+EmptyDataSet.h */,
  1089 + 7AC81C76B41B0ABF4E94921ADBA70C30 /* UIScrollView+EmptyDataSet.m */,
  1090 + D7386CADE4284D284D37C38FDCFCEF63 /* Support Files */,
  1091 + );
  1092 + name = DZNEmptyDataSet;
  1093 + path = DZNEmptyDataSet;
1006 sourceTree = "<group>"; 1094 sourceTree = "<group>";
1007 }; 1095 };
1008 /* End PBXGroup section */ 1096 /* End PBXGroup section */
1009 1097
1010 /* Begin PBXHeadersBuildPhase section */ 1098 /* Begin PBXHeadersBuildPhase section */
1011 - 0258573883B4A965DF0595F7BF4C1E54 /* Headers */ = { 1099 + 0C3C3BE76C79B9728E94463FAF23BAF8 /* Headers */ = {
1012 isa = PBXHeadersBuildPhase; 1100 isa = PBXHeadersBuildPhase;
1013 buildActionMask = 2147483647; 1101 buildActionMask = 2147483647;
1014 files = ( 1102 files = (
1015 - 604E191C52F306436E51253A4A21589C /* SwiftHash-umbrella.h in Headers */, 1103 + B0114B93073F87D24BE99FCEE08CDAE2 /* XRCarouselView-umbrella.h in Headers */,
  1104 + 98C28E5A4A7CC37A671D4BBAE25EB3CB /* XRCarouselView.h in Headers */,
1016 ); 1105 );
1017 runOnlyForDeploymentPostprocessing = 0; 1106 runOnlyForDeploymentPostprocessing = 0;
1018 }; 1107 };
1019 - 099CB4115CBACF33248BB7711972A81E /* Headers */ = { 1108 + 16845547CA168475331279C504643647 /* Headers */ = {
1020 isa = PBXHeadersBuildPhase; 1109 isa = PBXHeadersBuildPhase;
1021 buildActionMask = 2147483647; 1110 buildActionMask = 2147483647;
1022 files = ( 1111 files = (
1023 - 6A14BBE1A1C5AFF3B9FCFFCC30685E04 /* Toast-umbrella.h in Headers */,  
1024 - 9687BE425798E40CBC52870F8009209D /* UIView+Toast.h in Headers */, 1112 + 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */,
  1113 + 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */,
1025 ); 1114 );
1026 runOnlyForDeploymentPostprocessing = 0; 1115 runOnlyForDeploymentPostprocessing = 0;
1027 }; 1116 };
1028 - 16845547CA168475331279C504643647 /* Headers */ = { 1117 + 3A99AD81C47C25583B8F58920EC0C7EC /* Headers */ = {
1029 isa = PBXHeadersBuildPhase; 1118 isa = PBXHeadersBuildPhase;
1030 buildActionMask = 2147483647; 1119 buildActionMask = 2147483647;
1031 files = ( 1120 files = (
1032 - 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */,  
1033 - 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */, 1121 + 6C5B6525AD8543CD0EA5382D9B9EBF00 /* SVIndefiniteAnimatedView.h in Headers */,
  1122 + 7B8F1E3301B7F3D1AF25FDE0E2618647 /* SVProgressAnimatedView.h in Headers */,
  1123 + E363FB7AFABD373D4D2EB91EEAEAA556 /* SVProgressHUD-umbrella.h in Headers */,
  1124 + A04DAA4579CD1E21D2161AABB36244C4 /* SVProgressHUD.h in Headers */,
  1125 + E34A395CCE4DFEB66FE70DC91B6FA149 /* SVRadialGradientLayer.h in Headers */,
1034 ); 1126 );
1035 runOnlyForDeploymentPostprocessing = 0; 1127 runOnlyForDeploymentPostprocessing = 0;
1036 }; 1128 };
1037 - 653FFE72514B935712D0CE1053D47AD6 /* Headers */ = { 1129 + 46C3F69B64D9B3664866FAB0171594A7 /* Headers */ = {
1038 isa = PBXHeadersBuildPhase; 1130 isa = PBXHeadersBuildPhase;
1039 buildActionMask = 2147483647; 1131 buildActionMask = 2147483647;
1040 files = ( 1132 files = (
1041 - 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */,  
1042 - 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */, 1133 + 1E2754F17B8625E93745EB87C0E58961 /* Pods-ParentAssistant-umbrella.h in Headers */,
  1134 + );
  1135 + runOnlyForDeploymentPostprocessing = 0;
  1136 + };
  1137 + 49214B170416457B16834AFB504DF9B7 /* Headers */ = {
  1138 + isa = PBXHeadersBuildPhase;
  1139 + buildActionMask = 2147483647;
  1140 + files = (
  1141 + 4214C2FD7E877BAD66B5E69E70D52CC2 /* NSData+ImageContentType.h in Headers */,
  1142 + 3F16FEA96023ABF8BB9A47112409421A /* SDImageCache.h in Headers */,
  1143 + B2CC21A9D71EA49F2A55896265CF8E29 /* SDWebImage-umbrella.h in Headers */,
  1144 + 0D6E3F656916E4C6734BAF1DAB7CAEE7 /* SDWebImageCompat.h in Headers */,
  1145 + 3B2224950C9D1CE87BA75653DDDD2A13 /* SDWebImageDecoder.h in Headers */,
  1146 + 930D1C2CE2E4A32830066A7F4240F88F /* SDWebImageDownloader.h in Headers */,
  1147 + CA6644C7C70AC449F8D9968CA529C381 /* SDWebImageDownloaderOperation.h in Headers */,
  1148 + 93258C9412DF54DD088A385C2CCC79D1 /* SDWebImageManager.h in Headers */,
  1149 + 68EF6ACDBEC67DED9ACB63B4CFA05404 /* SDWebImageOperation.h in Headers */,
  1150 + 357EC08486308022D69F865CBFC53798 /* SDWebImagePrefetcher.h in Headers */,
  1151 + 92BC60F896B3049AEF17412EE13B32D5 /* UIButton+WebCache.h in Headers */,
  1152 + 6257B7791953547BB4FD33142C6A4016 /* UIImage+GIF.h in Headers */,
  1153 + 86DCCE5F06E9EDF67344C60D4859F032 /* UIImage+MultiFormat.h in Headers */,
  1154 + E96AB8B40C45FF09A9F396DCFD27D1C0 /* UIImageView+HighlightedWebCache.h in Headers */,
  1155 + 332B3CC48AC35662839D5A89D1FD9C0B /* UIImageView+WebCache.h in Headers */,
  1156 + B06A3FFD3EBF03FF3166F6E1B0D665F9 /* UIView+WebCacheOperation.h in Headers */,
1043 ); 1157 );
1044 runOnlyForDeploymentPostprocessing = 0; 1158 runOnlyForDeploymentPostprocessing = 0;
1045 }; 1159 };
1046 - 6AEF8DFADC67B16F108F1855C41820B4 /* Headers */ = { 1160 + 4A32D4B1A74FEE2326E518DF531B9262 /* Headers */ = {
1047 isa = PBXHeadersBuildPhase; 1161 isa = PBXHeadersBuildPhase;
1048 buildActionMask = 2147483647; 1162 buildActionMask = 2147483647;
1049 files = ( 1163 files = (
1050 - 46389823D72FA2DA9F4AD34CE119E9FA /* Reachability-umbrella.h in Headers */,  
1051 - 7D23D4A779C42E695BD2EC80114AD9E8 /* Reachability.h in Headers */, 1164 + F9554493CBDF921FEF278972C7FA3221 /* SwiftHash-umbrella.h in Headers */,
1052 ); 1165 );
1053 runOnlyForDeploymentPostprocessing = 0; 1166 runOnlyForDeploymentPostprocessing = 0;
1054 }; 1167 };
1055 - 7192BFF4C933C30A1A5F53991AABE322 /* Headers */ = { 1168 + 653FFE72514B935712D0CE1053D47AD6 /* Headers */ = {
1056 isa = PBXHeadersBuildPhase; 1169 isa = PBXHeadersBuildPhase;
1057 buildActionMask = 2147483647; 1170 buildActionMask = 2147483647;
1058 files = ( 1171 files = (
1059 - 240CD81B9BDAA551B583A82E3618D560 /* XRCarouselView-umbrella.h in Headers */,  
1060 - 4A2F8CD414D57920B53208F0F9A39E34 /* XRCarouselView.h in Headers */, 1172 + 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */,
  1173 + 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */,
1061 ); 1174 );
1062 runOnlyForDeploymentPostprocessing = 0; 1175 runOnlyForDeploymentPostprocessing = 0;
1063 }; 1176 };
1064 - 8FE5C58C0325111F27713A45110DDD2F /* Headers */ = { 1177 + 716B553DB26B96E823BC570F96E11E54 /* Headers */ = {
1065 isa = PBXHeadersBuildPhase; 1178 isa = PBXHeadersBuildPhase;
1066 buildActionMask = 2147483647; 1179 buildActionMask = 2147483647;
1067 files = ( 1180 files = (
1068 - F206FE65A9D924A3F6ED6221E3BBD35E /* SVIndefiniteAnimatedView.h in Headers */,  
1069 - A95766E9124B13BABFF00CFBEFEC0501 /* SVProgressAnimatedView.h in Headers */,  
1070 - 3C69CE7353282718747615DDA9563510 /* SVProgressHUD-umbrella.h in Headers */,  
1071 - 4A1D23F6526F175FCC2B35539E1B6AD6 /* SVProgressHUD.h in Headers */,  
1072 - 3D342698F0FA2B9391B7B1733D499623 /* SVRadialGradientLayer.h in Headers */, 1181 + D4C68ED144E24084583644C877C41229 /* Reachability-umbrella.h in Headers */,
  1182 + 9371A6AC1CEABB24E7275AACD3FDC21A /* Reachability.h in Headers */,
1073 ); 1183 );
1074 runOnlyForDeploymentPostprocessing = 0; 1184 runOnlyForDeploymentPostprocessing = 0;
1075 }; 1185 };
1076 - 9842775420762B806F91922E6A2DB1FC /* Headers */ = { 1186 + 7BF8D8F75CF7B473D8F3BDEA7AB7C2F5 /* Headers */ = {
1077 isa = PBXHeadersBuildPhase; 1187 isa = PBXHeadersBuildPhase;
1078 buildActionMask = 2147483647; 1188 buildActionMask = 2147483647;
1079 files = ( 1189 files = (
1080 - BD14752B5379EAA21AF328A8ABE08A6D /* NSData+ImageContentType.h in Headers */,  
1081 - B2D8BD6984912C60C7A22BF665987A73 /* SDImageCache.h in Headers */,  
1082 - 264463742964367E06060C2E85D3EEF4 /* SDWebImage-umbrella.h in Headers */,  
1083 - 63751EA36B3CCD03BF292C19F6B7C5FE /* SDWebImageCompat.h in Headers */,  
1084 - 05F1082B0C6E40F76E821D67DFAD9AB5 /* SDWebImageDecoder.h in Headers */,  
1085 - 2AB8304BE65678C2043856E0F4AAFC9E /* SDWebImageDownloader.h in Headers */,  
1086 - 0A2126372E9629100B22A44A94E73D71 /* SDWebImageDownloaderOperation.h in Headers */,  
1087 - 82769877C29A8E71221C9918273D3FFF /* SDWebImageManager.h in Headers */,  
1088 - 8C1E8307CFE1A73F290CFCE8818B6123 /* SDWebImageOperation.h in Headers */,  
1089 - EB3F85272BEE4C2EB0321741E8FE4B75 /* SDWebImagePrefetcher.h in Headers */,  
1090 - A17930AC43F712547C2B4B58C1450B82 /* UIButton+WebCache.h in Headers */,  
1091 - E49369FF3BD66698C3B61B8DE9C58DE0 /* UIImage+GIF.h in Headers */,  
1092 - E72FACD066C66E010F4C91956E8E29CB /* UIImage+MultiFormat.h in Headers */,  
1093 - 46749DE4D7ED1863AFF86DFB519EAAD0 /* UIImageView+HighlightedWebCache.h in Headers */,  
1094 - BBF90CAC12DA7C2713DB47B3BE5C898C /* UIImageView+WebCache.h in Headers */,  
1095 - BC9AB82CB1C91977B5C1C96A25A9CA22 /* UIView+WebCacheOperation.h in Headers */, 1190 + 4140A49CB0D5F03DD7565AC94796D856 /* Toast-umbrella.h in Headers */,
  1191 + 06B6D63D2B2E6F2896A15C18097D3730 /* UIView+Toast.h in Headers */,
1096 ); 1192 );
1097 runOnlyForDeploymentPostprocessing = 0; 1193 runOnlyForDeploymentPostprocessing = 0;
1098 }; 1194 };
@@ -1104,17 +1200,35 @@ @@ -1104,17 +1200,35 @@
1104 ); 1200 );
1105 runOnlyForDeploymentPostprocessing = 0; 1201 runOnlyForDeploymentPostprocessing = 0;
1106 }; 1202 };
1107 - CB17733CFD076ED5E2BE1AACA72ED979 /* Headers */ = { 1203 + EB21FD03B7703901958C3CE43325DAE9 /* Headers */ = {
1108 isa = PBXHeadersBuildPhase; 1204 isa = PBXHeadersBuildPhase;
1109 buildActionMask = 2147483647; 1205 buildActionMask = 2147483647;
1110 files = ( 1206 files = (
1111 - 53926FE56FBF1399E69B9F893ACFBDB1 /* Pods-ParentAssistant-umbrella.h in Headers */, 1207 + 32EDA9ED83F4442303A46839027E152E /* AlamofireImage-umbrella.h in Headers */,
1112 ); 1208 );
1113 runOnlyForDeploymentPostprocessing = 0; 1209 runOnlyForDeploymentPostprocessing = 0;
1114 }; 1210 };
1115 /* End PBXHeadersBuildPhase section */ 1211 /* End PBXHeadersBuildPhase section */
1116 1212
1117 /* Begin PBXNativeTarget section */ 1213 /* Begin PBXNativeTarget section */
  1214 + 0A4402E270B0A4B00A031931BD805EF1 /* XRCarouselView */ = {
  1215 + isa = PBXNativeTarget;
  1216 + buildConfigurationList = 4C801EC31238E6F547E7192FDC9AD054 /* Build configuration list for PBXNativeTarget "XRCarouselView" */;
  1217 + buildPhases = (
  1218 + 836E6AC4CFA56F3A9B9AC5333F4EB303 /* Sources */,
  1219 + CC88855CE2CDECCE28DB46B1FDBF88B7 /* Frameworks */,
  1220 + 0C3C3BE76C79B9728E94463FAF23BAF8 /* Headers */,
  1221 + 3902916FBFDC0C6606E9AFDBFBD7F267 /* Resources */,
  1222 + );
  1223 + buildRules = (
  1224 + );
  1225 + dependencies = (
  1226 + );
  1227 + name = XRCarouselView;
  1228 + productName = XRCarouselView;
  1229 + productReference = 444E77BBBDD4B2AB34C6742B6752BBCB /* XRCarouselView.framework */;
  1230 + productType = "com.apple.product-type.framework";
  1231 + };
1118 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */ = { 1232 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */ = {
1119 isa = PBXNativeTarget; 1233 isa = PBXNativeTarget;
1120 buildConfigurationList = 184303B9B5FF90B2017E4D0073BC6423 /* Build configuration list for PBXNativeTarget "HandyJSON" */; 1234 buildConfigurationList = 184303B9B5FF90B2017E4D0073BC6423 /* Build configuration list for PBXNativeTarget "HandyJSON" */;
@@ -1129,171 +1243,172 @@ @@ -1129,171 +1243,172 @@
1129 ); 1243 );
1130 name = HandyJSON; 1244 name = HandyJSON;
1131 productName = HandyJSON; 1245 productName = HandyJSON;
1132 - productReference = 1719FF827E35476E2C51408C0A9BD81C /* HandyJSON.framework */; 1246 + productReference = 110D34637F4EF19C8F46B101A1509ABE /* HandyJSON.framework */;
1133 productType = "com.apple.product-type.framework"; 1247 productType = "com.apple.product-type.framework";
1134 }; 1248 };
1135 - 27189F0EDBCA8831C460D0166F6F37A1 /* XRCarouselView */ = { 1249 + 37F4E36BECBDD0070D2501E766C0238B /* SDWebImage */ = {
1136 isa = PBXNativeTarget; 1250 isa = PBXNativeTarget;
1137 - buildConfigurationList = A4FA017D8C4362BABA6CC461A244CB9D /* Build configuration list for PBXNativeTarget "XRCarouselView" */; 1251 + buildConfigurationList = 70F92D3F8B893481FDA768F4EB8E9118 /* Build configuration list for PBXNativeTarget "SDWebImage" */;
1138 buildPhases = ( 1252 buildPhases = (
1139 - 583C8401A8273215767A6E78D9832675 /* Sources */,  
1140 - 158EE653FB0E0E7AF979010BC3A73E13 /* Frameworks */,  
1141 - 7192BFF4C933C30A1A5F53991AABE322 /* Headers */,  
1142 - F5D5D2A3D9EE0A5E1C3E82E64D42CDD6 /* Resources */, 1253 + BA7C56D0F2745E59EEA82D7E504CAAB3 /* Sources */,
  1254 + 12D9BD764C2F5E43285530C00A583D52 /* Frameworks */,
  1255 + 49214B170416457B16834AFB504DF9B7 /* Headers */,
1143 ); 1256 );
1144 buildRules = ( 1257 buildRules = (
1145 ); 1258 );
1146 dependencies = ( 1259 dependencies = (
1147 ); 1260 );
1148 - name = XRCarouselView;  
1149 - productName = XRCarouselView;  
1150 - productReference = 09E993E3E47BE7E80DCFECCEA59937CC /* XRCarouselView.framework */; 1261 + name = SDWebImage;
  1262 + productName = SDWebImage;
  1263 + productReference = 8E2EC639DC31085C2078E4638A61266B /* SDWebImage.framework */;
1151 productType = "com.apple.product-type.framework"; 1264 productType = "com.apple.product-type.framework";
1152 }; 1265 };
1153 - 6376DC419EEA98495631602218A4F31B /* SwiftHash */ = { 1266 + 3DE44D61FA676CE3B5DFDE6DC058A636 /* Pods-ParentAssistant */ = {
1154 isa = PBXNativeTarget; 1267 isa = PBXNativeTarget;
1155 - buildConfigurationList = 3EC2F42A94017DE0B0E897EBD57D8A00 /* Build configuration list for PBXNativeTarget "SwiftHash" */; 1268 + buildConfigurationList = 76E43176855F8CE556CB459D4CF15C83 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */;
1156 buildPhases = ( 1269 buildPhases = (
1157 - 1B8C7048A91070CF34162BF979720918 /* Sources */,  
1158 - 2FCA03AB4708FF069C969DAC4ED689A3 /* Frameworks */,  
1159 - 0258573883B4A965DF0595F7BF4C1E54 /* Headers */, 1270 + B0A80FA96AA24569F8AB376B609B0706 /* Sources */,
  1271 + 6FA848EABA8BCB08AFA8A7CBA0F79DA3 /* Frameworks */,
  1272 + 46C3F69B64D9B3664866FAB0171594A7 /* Headers */,
1160 ); 1273 );
1161 buildRules = ( 1274 buildRules = (
1162 ); 1275 );
1163 dependencies = ( 1276 dependencies = (
  1277 + AF98B4E6DC1B79AE4FD9FD930B0E2C69 /* PBXTargetDependency */,
  1278 + 400980F7465C7DCC1DF6E89055AD0B96 /* PBXTargetDependency */,
  1279 + 0F0709264E6CBE1FC5B2108AFA9A1EBC /* PBXTargetDependency */,
  1280 + 0B0575AE71362DA3E174564EB6435F59 /* PBXTargetDependency */,
  1281 + 0271B3B581BEDB99AD2D8A82A7A51FE7 /* PBXTargetDependency */,
  1282 + C91D8AEA00A921168C007D309B135C5D /* PBXTargetDependency */,
  1283 + 5088DA9186A8D1DD902822E13A654208 /* PBXTargetDependency */,
  1284 + 03000FBE28A1D37021A99C22E5DC6577 /* PBXTargetDependency */,
  1285 + 48DB56871980177AD76344D30AAA6812 /* PBXTargetDependency */,
  1286 + D7A715C58A0231CE8EF5720E0B2201C5 /* PBXTargetDependency */,
1164 ); 1287 );
1165 - name = SwiftHash;  
1166 - productName = SwiftHash;  
1167 - productReference = 41009B988332564AFC9DAF9C3817C7FA /* SwiftHash.framework */; 1288 + name = "Pods-ParentAssistant";
  1289 + productName = "Pods-ParentAssistant";
  1290 + productReference = 72C584102060EC4C983B4B76AB4B8C8F /* Pods_ParentAssistant.framework */;
1168 productType = "com.apple.product-type.framework"; 1291 productType = "com.apple.product-type.framework";
1169 }; 1292 };
1170 - 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */ = { 1293 + 620180280B57A3DF973662E546D211E4 /* Toast */ = {
1171 isa = PBXNativeTarget; 1294 isa = PBXNativeTarget;
1172 - buildConfigurationList = 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */; 1295 + buildConfigurationList = 1CEF6058AA58F732B5DE35ABEA2BB8C8 /* Build configuration list for PBXNativeTarget "Toast" */;
1173 buildPhases = ( 1296 buildPhases = (
1174 - 47AA244DE0C8B2C0F0A585D845356E59 /* Sources */,  
1175 - 99195E4207764744AEC07ECCBCD550EB /* Frameworks */,  
1176 - B4002B6E97835FDCCAA5963EFE09A3E0 /* Headers */, 1297 + 79932E9ED35709FA36DAA32135866D9D /* Sources */,
  1298 + 1EA38DA40C4FF7316B10B0C373342222 /* Frameworks */,
  1299 + 7BF8D8F75CF7B473D8F3BDEA7AB7C2F5 /* Headers */,
1177 ); 1300 );
1178 buildRules = ( 1301 buildRules = (
1179 ); 1302 );
1180 dependencies = ( 1303 dependencies = (
1181 ); 1304 );
1182 - name = Alamofire;  
1183 - productName = Alamofire;  
1184 - productReference = E956F54FF76DE5D347505F3AF7694F03 /* Alamofire.framework */; 1305 + name = Toast;
  1306 + productName = Toast;
  1307 + productReference = 507695995D3D9F4276EAFC4603ABFF54 /* Toast.framework */;
1185 productType = "com.apple.product-type.framework"; 1308 productType = "com.apple.product-type.framework";
1186 }; 1309 };
1187 - 89B82C8C6E32CEBE5ACCD75CDFBECBB1 /* Pods-ParentAssistant */ = { 1310 + 637267420040487628765A2667620742 /* SVProgressHUD */ = {
1188 isa = PBXNativeTarget; 1311 isa = PBXNativeTarget;
1189 - buildConfigurationList = 7700DD54DACF55CC6BABF28FFCAB0179 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */; 1312 + buildConfigurationList = FA57B4E379EB61FD555A1581DE341347 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */;
1190 buildPhases = ( 1313 buildPhases = (
1191 - 2A36054EE1FDECDCC35954B655C4C237 /* Sources */,  
1192 - D871485AC7FB55A15B0AC2046B09D62B /* Frameworks */,  
1193 - CB17733CFD076ED5E2BE1AACA72ED979 /* Headers */, 1314 + 7C58861F3C1AEC0E4A32341701B2D521 /* Sources */,
  1315 + 223B4FF7CBCA930946A68B4E3FF7DEB6 /* Frameworks */,
  1316 + 3A99AD81C47C25583B8F58920EC0C7EC /* Headers */,
  1317 + B50F0C15B731FE36879301E18C3056E3 /* Resources */,
1194 ); 1318 );
1195 buildRules = ( 1319 buildRules = (
1196 ); 1320 );
1197 dependencies = ( 1321 dependencies = (
1198 - 954A722A2C8F32AE6348DAD3CFC2DFE4 /* PBXTargetDependency */,  
1199 - 02C0DEC84BDA70532ADA225A5A2A3304 /* PBXTargetDependency */,  
1200 - 9D4E5F870098A82524B3E139E921E49C /* PBXTargetDependency */,  
1201 - 65D67D71AAC210DB47EAC622F7FA69B9 /* PBXTargetDependency */,  
1202 - 91447221DA6C2FBBF7167A4B974044D2 /* PBXTargetDependency */,  
1203 - BBA7098DD5EA0680F81007C50C09B686 /* PBXTargetDependency */,  
1204 - 59040B7DE59B45C468C5A827B43DF38A /* PBXTargetDependency */,  
1205 - F54C3AB44B6273AFC143292EBABDE7C4 /* PBXTargetDependency */,  
1206 - E82DBF544557B801D7515E53ABBE9C31 /* PBXTargetDependency */,  
1207 ); 1322 );
1208 - name = "Pods-ParentAssistant";  
1209 - productName = "Pods-ParentAssistant";  
1210 - productReference = B88D8470A1A1E4F507B1E9895B074253 /* Pods_ParentAssistant.framework */; 1323 + name = SVProgressHUD;
  1324 + productName = SVProgressHUD;
  1325 + productReference = 344E5051853CBAE87166BAA69476DDB1 /* SVProgressHUD.framework */;
1211 productType = "com.apple.product-type.framework"; 1326 productType = "com.apple.product-type.framework";
1212 }; 1327 };
1213 - 8FA4EA707F3B6CFDACB1C85C722D2E73 /* SDWebImage */ = { 1328 + 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */ = {
1214 isa = PBXNativeTarget; 1329 isa = PBXNativeTarget;
1215 - buildConfigurationList = 4B18822C8ECAB5D855CCE64E74C621EB /* Build configuration list for PBXNativeTarget "SDWebImage" */; 1330 + buildConfigurationList = 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */;
1216 buildPhases = ( 1331 buildPhases = (
1217 - 6A550F80A385350F20B576B15B31547E /* Sources */,  
1218 - E44680339038F2F0730AF783DAEFFCB6 /* Frameworks */,  
1219 - 9842775420762B806F91922E6A2DB1FC /* Headers */, 1332 + 47AA244DE0C8B2C0F0A585D845356E59 /* Sources */,
  1333 + 99195E4207764744AEC07ECCBCD550EB /* Frameworks */,
  1334 + B4002B6E97835FDCCAA5963EFE09A3E0 /* Headers */,
1220 ); 1335 );
1221 buildRules = ( 1336 buildRules = (
1222 ); 1337 );
1223 dependencies = ( 1338 dependencies = (
1224 ); 1339 );
1225 - name = SDWebImage;  
1226 - productName = SDWebImage;  
1227 - productReference = CE1C92985D9321104698E3AFAF68594E /* SDWebImage.framework */; 1340 + name = Alamofire;
  1341 + productName = Alamofire;
  1342 + productReference = 937EE30FD85AB8EED4F8467502DD290F /* Alamofire.framework */;
1228 productType = "com.apple.product-type.framework"; 1343 productType = "com.apple.product-type.framework";
1229 }; 1344 };
1230 - 9A9DDC64623B3F5E6DC7009C16752B95 /* Toast */ = { 1345 + 9EFE4C70245EE2857D336B8B9FA4E825 /* AlamofireImage */ = {
1231 isa = PBXNativeTarget; 1346 isa = PBXNativeTarget;
1232 - buildConfigurationList = F11A26D3E7766CBBD820DCD66B6FC321 /* Build configuration list for PBXNativeTarget "Toast" */; 1347 + buildConfigurationList = 01F2198AF9DCCF3700AE9DD21E64D480 /* Build configuration list for PBXNativeTarget "AlamofireImage" */;
1233 buildPhases = ( 1348 buildPhases = (
1234 - F437D84355ADAD46DE352A42EFA6A50A /* Sources */,  
1235 - 46A2C828E74BB80E0DE22F9A57D702B2 /* Frameworks */,  
1236 - 099CB4115CBACF33248BB7711972A81E /* Headers */, 1349 + 89780FCE56CA2BB731B3A99F5FC88440 /* Sources */,
  1350 + BF98FBBDC964E0CC738F6B323B4C1BB8 /* Frameworks */,
  1351 + EB21FD03B7703901958C3CE43325DAE9 /* Headers */,
1237 ); 1352 );
1238 buildRules = ( 1353 buildRules = (
1239 ); 1354 );
1240 dependencies = ( 1355 dependencies = (
  1356 + 8937A2057A0DAADF003B7C65E7CE115D /* PBXTargetDependency */,
1241 ); 1357 );
1242 - name = Toast;  
1243 - productName = Toast;  
1244 - productReference = A59A469B0852E07D2428D72E4C62B1E7 /* Toast.framework */; 1358 + name = AlamofireImage;
  1359 + productName = AlamofireImage;
  1360 + productReference = B9806961B1DB01F087677787DFCC6CE0 /* AlamofireImage.framework */;
1245 productType = "com.apple.product-type.framework"; 1361 productType = "com.apple.product-type.framework";
1246 }; 1362 };
1247 - AAC4087A5A57F5566AB9B54FEBADBC36 /* Reachability */ = { 1363 + A0A5E57D4BB5AA2602B591D713407086 /* SwiftHash */ = {
1248 isa = PBXNativeTarget; 1364 isa = PBXNativeTarget;
1249 - buildConfigurationList = 5AD50E3B4812FC9FAE4961CBCA56B874 /* Build configuration list for PBXNativeTarget "Reachability" */; 1365 + buildConfigurationList = 58F24DE1FC95F96D43F56B9CC6D0B926 /* Build configuration list for PBXNativeTarget "SwiftHash" */;
1250 buildPhases = ( 1366 buildPhases = (
1251 - FA661C521ABA5EDB2937799E80C70EC2 /* Sources */,  
1252 - EBA80D6B1394A46D45B033AB75657E91 /* Frameworks */,  
1253 - 6AEF8DFADC67B16F108F1855C41820B4 /* Headers */, 1367 + 7376B1A2F80BE300C4F12BD1B8DB3418 /* Sources */,
  1368 + 62158AC2B12F4A1FA191B1DD22989FE1 /* Frameworks */,
  1369 + 4A32D4B1A74FEE2326E518DF531B9262 /* Headers */,
1254 ); 1370 );
1255 buildRules = ( 1371 buildRules = (
1256 ); 1372 );
1257 dependencies = ( 1373 dependencies = (
1258 ); 1374 );
1259 - name = Reachability;  
1260 - productName = Reachability;  
1261 - productReference = 5C3FCED1EF014BDAA42DACC871E2516A /* Reachability.framework */; 1375 + name = SwiftHash;
  1376 + productName = SwiftHash;
  1377 + productReference = 52303324A62AD0B74F2DD46E74D232EB /* SwiftHash.framework */;
1262 productType = "com.apple.product-type.framework"; 1378 productType = "com.apple.product-type.framework";
1263 }; 1379 };
1264 - D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */ = { 1380 + CE1092398200ECC7DE7468626D1D0B98 /* Reachability */ = {
1265 isa = PBXNativeTarget; 1381 isa = PBXNativeTarget;
1266 - buildConfigurationList = AC2CBCE24382919CB3DBFC8BB3CC6503 /* Build configuration list for PBXNativeTarget "DZNEmptyDataSet" */; 1382 + buildConfigurationList = C3C11F185D4F7CF61CB8BBE64492631D /* Build configuration list for PBXNativeTarget "Reachability" */;
1267 buildPhases = ( 1383 buildPhases = (
1268 - 82133C5570CF5246210CB90DB6D6558B /* Sources */,  
1269 - 59E0885EF9D269547F22DB9E026FB793 /* Frameworks */,  
1270 - 653FFE72514B935712D0CE1053D47AD6 /* Headers */, 1384 + C3136CF9BAFDECBEB2E6A9CCD8BECDAE /* Sources */,
  1385 + 56B1A45788A7E3C5C89C92256F33AE24 /* Frameworks */,
  1386 + 716B553DB26B96E823BC570F96E11E54 /* Headers */,
1271 ); 1387 );
1272 buildRules = ( 1388 buildRules = (
1273 ); 1389 );
1274 dependencies = ( 1390 dependencies = (
1275 ); 1391 );
1276 - name = DZNEmptyDataSet;  
1277 - productName = DZNEmptyDataSet;  
1278 - productReference = DD0E89B8C1439B9F5FDB39EA0232B3EA /* DZNEmptyDataSet.framework */; 1392 + name = Reachability;
  1393 + productName = Reachability;
  1394 + productReference = 95CAD531E474553E7D52B95131219D1A /* Reachability.framework */;
1279 productType = "com.apple.product-type.framework"; 1395 productType = "com.apple.product-type.framework";
1280 }; 1396 };
1281 - E55BDEBC8F73D6B7936791D0822F70D6 /* SVProgressHUD */ = { 1397 + D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */ = {
1282 isa = PBXNativeTarget; 1398 isa = PBXNativeTarget;
1283 - buildConfigurationList = EAC632F2AAB82F696A1E5C88D53A883E /* Build configuration list for PBXNativeTarget "SVProgressHUD" */; 1399 + buildConfigurationList = AC2CBCE24382919CB3DBFC8BB3CC6503 /* Build configuration list for PBXNativeTarget "DZNEmptyDataSet" */;
1284 buildPhases = ( 1400 buildPhases = (
1285 - 1965A36474F1989545B82D09EC945BE8 /* Sources */,  
1286 - A115DC87278A31F6B371DA2C1AF9CD02 /* Frameworks */,  
1287 - 8FE5C58C0325111F27713A45110DDD2F /* Headers */,  
1288 - B5487BE37E5D2B17C0D915B89665B3F5 /* Resources */, 1401 + 82133C5570CF5246210CB90DB6D6558B /* Sources */,
  1402 + 59E0885EF9D269547F22DB9E026FB793 /* Frameworks */,
  1403 + 653FFE72514B935712D0CE1053D47AD6 /* Headers */,
1289 ); 1404 );
1290 buildRules = ( 1405 buildRules = (
1291 ); 1406 );
1292 dependencies = ( 1407 dependencies = (
1293 ); 1408 );
1294 - name = SVProgressHUD;  
1295 - productName = SVProgressHUD;  
1296 - productReference = 33F1F6213579E70C284C8445EBD7DBDD /* SVProgressHUD.framework */; 1409 + name = DZNEmptyDataSet;
  1410 + productName = DZNEmptyDataSet;
  1411 + productReference = 7C9D89FB057D8F2ECBB232C7A81EF4B5 /* DZNEmptyDataSet.framework */;
1297 productType = "com.apple.product-type.framework"; 1412 productType = "com.apple.product-type.framework";
1298 }; 1413 };
1299 /* End PBXNativeTarget section */ 1414 /* End PBXNativeTarget section */
@@ -1313,74 +1428,45 @@ @@ -1313,74 +1428,45 @@
1313 en, 1428 en,
1314 ); 1429 );
1315 mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 1430 mainGroup = 7DB346D0F39D3F0E887471402A8071AB;
1316 - productRefGroup = 9CE129D1A72CFA1DEF6F85FBF1B37E5B /* Products */; 1431 + productRefGroup = 3A24F7BBB5CB0025CF2072B4FB964C24 /* Products */;
1317 projectDirPath = ""; 1432 projectDirPath = "";
1318 projectRoot = ""; 1433 projectRoot = "";
1319 targets = ( 1434 targets = (
1320 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */, 1435 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */,
  1436 + 9EFE4C70245EE2857D336B8B9FA4E825 /* AlamofireImage */,
1321 D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */, 1437 D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */,
1322 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */, 1438 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */,
1323 - 89B82C8C6E32CEBE5ACCD75CDFBECBB1 /* Pods-ParentAssistant */,  
1324 - AAC4087A5A57F5566AB9B54FEBADBC36 /* Reachability */,  
1325 - 8FA4EA707F3B6CFDACB1C85C722D2E73 /* SDWebImage */,  
1326 - E55BDEBC8F73D6B7936791D0822F70D6 /* SVProgressHUD */,  
1327 - 6376DC419EEA98495631602218A4F31B /* SwiftHash */,  
1328 - 9A9DDC64623B3F5E6DC7009C16752B95 /* Toast */,  
1329 - 27189F0EDBCA8831C460D0166F6F37A1 /* XRCarouselView */, 1439 + 3DE44D61FA676CE3B5DFDE6DC058A636 /* Pods-ParentAssistant */,
  1440 + CE1092398200ECC7DE7468626D1D0B98 /* Reachability */,
  1441 + 37F4E36BECBDD0070D2501E766C0238B /* SDWebImage */,
  1442 + 637267420040487628765A2667620742 /* SVProgressHUD */,
  1443 + A0A5E57D4BB5AA2602B591D713407086 /* SwiftHash */,
  1444 + 620180280B57A3DF973662E546D211E4 /* Toast */,
  1445 + 0A4402E270B0A4B00A031931BD805EF1 /* XRCarouselView */,
1330 ); 1446 );
1331 }; 1447 };
1332 /* End PBXProject section */ 1448 /* End PBXProject section */
1333 1449
1334 /* Begin PBXResourcesBuildPhase section */ 1450 /* Begin PBXResourcesBuildPhase section */
1335 - B5487BE37E5D2B17C0D915B89665B3F5 /* Resources */ = { 1451 + 3902916FBFDC0C6606E9AFDBFBD7F267 /* Resources */ = {
1336 isa = PBXResourcesBuildPhase; 1452 isa = PBXResourcesBuildPhase;
1337 buildActionMask = 2147483647; 1453 buildActionMask = 2147483647;
1338 files = ( 1454 files = (
1339 - B575E905525EDD3311A9872A0C4307AD /* SVProgressHUD.bundle in Resources */, 1455 + ECE9CADAD4EB77DEC8B08FD74D6DD3BE /* XRPlaceholder.png in Resources */,
1340 ); 1456 );
1341 runOnlyForDeploymentPostprocessing = 0; 1457 runOnlyForDeploymentPostprocessing = 0;
1342 }; 1458 };
1343 - F5D5D2A3D9EE0A5E1C3E82E64D42CDD6 /* Resources */ = { 1459 + B50F0C15B731FE36879301E18C3056E3 /* Resources */ = {
1344 isa = PBXResourcesBuildPhase; 1460 isa = PBXResourcesBuildPhase;
1345 buildActionMask = 2147483647; 1461 buildActionMask = 2147483647;
1346 files = ( 1462 files = (
1347 - 603F9D0686CE005205D389C1E4C6072A /* XRPlaceholder.png in Resources */, 1463 + 945146A0826BB693F1B9496A0620A97F /* SVProgressHUD.bundle in Resources */,
1348 ); 1464 );
1349 runOnlyForDeploymentPostprocessing = 0; 1465 runOnlyForDeploymentPostprocessing = 0;
1350 }; 1466 };
1351 /* End PBXResourcesBuildPhase section */ 1467 /* End PBXResourcesBuildPhase section */
1352 1468
1353 /* Begin PBXSourcesBuildPhase section */ 1469 /* Begin PBXSourcesBuildPhase section */
1354 - 1965A36474F1989545B82D09EC945BE8 /* Sources */ = {  
1355 - isa = PBXSourcesBuildPhase;  
1356 - buildActionMask = 2147483647;  
1357 - files = (  
1358 - E990A247D80417D4555735E8A8DBD76C /* SVIndefiniteAnimatedView.m in Sources */,  
1359 - 0C4EA35F79172E81D6BF56A2FC856ED8 /* SVProgressAnimatedView.m in Sources */,  
1360 - AB6A5752C4586385EE13F1E6E2E9F40E /* SVProgressHUD-dummy.m in Sources */,  
1361 - F79EC3C3CF96DFC885E8DD247FEF08EB /* SVProgressHUD.m in Sources */,  
1362 - 86930F980FA87FB0CA5E197FEAA7A90C /* SVRadialGradientLayer.m in Sources */,  
1363 - );  
1364 - runOnlyForDeploymentPostprocessing = 0;  
1365 - };  
1366 - 1B8C7048A91070CF34162BF979720918 /* Sources */ = {  
1367 - isa = PBXSourcesBuildPhase;  
1368 - buildActionMask = 2147483647;  
1369 - files = (  
1370 - 794B16FD139EB13BA49AE711C49135BB /* MD5.swift in Sources */,  
1371 - 90B1C77BB42755C3E9AC821A09526E53 /* SHA1.swift in Sources */,  
1372 - D603EC0AAE41B1733F0A4A2FA4381910 /* SwiftHash-dummy.m in Sources */,  
1373 - );  
1374 - runOnlyForDeploymentPostprocessing = 0;  
1375 - };  
1376 - 2A36054EE1FDECDCC35954B655C4C237 /* Sources */ = {  
1377 - isa = PBXSourcesBuildPhase;  
1378 - buildActionMask = 2147483647;  
1379 - files = (  
1380 - 6694F9A05D6A58C5C27935913BF8AE56 /* Pods-ParentAssistant-dummy.m in Sources */,  
1381 - );  
1382 - runOnlyForDeploymentPostprocessing = 0;  
1383 - };  
1384 47AA244DE0C8B2C0F0A585D845356E59 /* Sources */ = { 1470 47AA244DE0C8B2C0F0A585D845356E59 /* Sources */ = {
1385 isa = PBXSourcesBuildPhase; 1471 isa = PBXSourcesBuildPhase;
1386 buildActionMask = 2147483647; 1472 buildActionMask = 2147483647;
@@ -1406,34 +1492,34 @@ @@ -1406,34 +1492,34 @@
1406 ); 1492 );
1407 runOnlyForDeploymentPostprocessing = 0; 1493 runOnlyForDeploymentPostprocessing = 0;
1408 }; 1494 };
1409 - 583C8401A8273215767A6E78D9832675 /* Sources */ = { 1495 + 7376B1A2F80BE300C4F12BD1B8DB3418 /* Sources */ = {
  1496 + isa = PBXSourcesBuildPhase;
  1497 + buildActionMask = 2147483647;
  1498 + files = (
  1499 + C4DC2D005B7A1313DF98AFF23E15D1B3 /* MD5.swift in Sources */,
  1500 + B58BEA72F3BC139D3784844F73AA791F /* SHA1.swift in Sources */,
  1501 + CB5529FBDB9ED31E939EFD0EF7D8EBE3 /* SwiftHash-dummy.m in Sources */,
  1502 + );
  1503 + runOnlyForDeploymentPostprocessing = 0;
  1504 + };
  1505 + 79932E9ED35709FA36DAA32135866D9D /* Sources */ = {
1410 isa = PBXSourcesBuildPhase; 1506 isa = PBXSourcesBuildPhase;
1411 buildActionMask = 2147483647; 1507 buildActionMask = 2147483647;
1412 files = ( 1508 files = (
1413 - A8D327620CE1909AD98F6B239AA60018 /* XRCarouselView-dummy.m in Sources */,  
1414 - 3DD10D4C59666719E941A5D0EB5D9582 /* XRCarouselView.m in Sources */, 1509 + DC9317C7F961BB389FA7ECC2260B08F0 /* Toast-dummy.m in Sources */,
  1510 + 5D287B058202AFDA4DED5D49B6ED0A1E /* UIView+Toast.m in Sources */,
1415 ); 1511 );
1416 runOnlyForDeploymentPostprocessing = 0; 1512 runOnlyForDeploymentPostprocessing = 0;
1417 }; 1513 };
1418 - 6A550F80A385350F20B576B15B31547E /* Sources */ = { 1514 + 7C58861F3C1AEC0E4A32341701B2D521 /* Sources */ = {
1419 isa = PBXSourcesBuildPhase; 1515 isa = PBXSourcesBuildPhase;
1420 buildActionMask = 2147483647; 1516 buildActionMask = 2147483647;
1421 files = ( 1517 files = (
1422 - 17F8D48B0736FD13AC59D9311C074E9D /* NSData+ImageContentType.m in Sources */,  
1423 - BF901FE99C862B2093FF8E2F71B80F93 /* SDImageCache.m in Sources */,  
1424 - 27813DC0914AD972436022C87454185F /* SDWebImage-dummy.m in Sources */,  
1425 - 7AC13BF7B3C538D94DE7B9D836786514 /* SDWebImageCompat.m in Sources */,  
1426 - D1D5D64268DDC619511D3942F434D7DD /* SDWebImageDecoder.m in Sources */,  
1427 - 1C39565C535B7D534368C5DFB46659B5 /* SDWebImageDownloader.m in Sources */,  
1428 - F1A921225B642E15ED24FB4734240F8F /* SDWebImageDownloaderOperation.m in Sources */,  
1429 - 38BC499B109AEBC02AD6C88AB2ED057D /* SDWebImageManager.m in Sources */,  
1430 - 6C3C226E0B46AFC4FD756BA6C5D9414E /* SDWebImagePrefetcher.m in Sources */,  
1431 - 170AB456D9F3C346DCF407E42D84B5D5 /* UIButton+WebCache.m in Sources */,  
1432 - C633AE7C1F16ADA3AFEE968396B73A4B /* UIImage+GIF.m in Sources */,  
1433 - BD2E6B5D9C3C38D8C1BDCFE0CD6E489D /* UIImage+MultiFormat.m in Sources */,  
1434 - C8D2BE872D244EB549F2EC97069CC4D0 /* UIImageView+HighlightedWebCache.m in Sources */,  
1435 - A7B5C0EE248855B3357C98A489F835D9 /* UIImageView+WebCache.m in Sources */,  
1436 - BA3AB9E7766B254534C357EB523687B6 /* UIView+WebCacheOperation.m in Sources */, 1518 + 56815D1138F9669E37F2004119169267 /* SVIndefiniteAnimatedView.m in Sources */,
  1519 + A24D31929B67BB4D0EED65AA74C0E3F9 /* SVProgressAnimatedView.m in Sources */,
  1520 + 33FCBEF6884A33B921FEC6A9511B8E20 /* SVProgressHUD-dummy.m in Sources */,
  1521 + BBC827F8711B46CA8FC3854C99DF703A /* SVProgressHUD.m in Sources */,
  1522 + 1F4FA4B67BA7582CA193404E3510B095 /* SVRadialGradientLayer.m in Sources */,
1437 ); 1523 );
1438 runOnlyForDeploymentPostprocessing = 0; 1524 runOnlyForDeploymentPostprocessing = 0;
1439 }; 1525 };
@@ -1446,6 +1532,71 @@ @@ -1446,6 +1532,71 @@
1446 ); 1532 );
1447 runOnlyForDeploymentPostprocessing = 0; 1533 runOnlyForDeploymentPostprocessing = 0;
1448 }; 1534 };
  1535 + 836E6AC4CFA56F3A9B9AC5333F4EB303 /* Sources */ = {
  1536 + isa = PBXSourcesBuildPhase;
  1537 + buildActionMask = 2147483647;
  1538 + files = (
  1539 + 4FAADAA79CF5A8371B74578A2EC10761 /* XRCarouselView-dummy.m in Sources */,
  1540 + 980154A8EB800AAF627251C8AAD7EAA9 /* XRCarouselView.m in Sources */,
  1541 + );
  1542 + runOnlyForDeploymentPostprocessing = 0;
  1543 + };
  1544 + 89780FCE56CA2BB731B3A99F5FC88440 /* Sources */ = {
  1545 + isa = PBXSourcesBuildPhase;
  1546 + buildActionMask = 2147483647;
  1547 + files = (
  1548 + FF0007F0502C85600F98BC8E62F739D2 /* AFIError.swift in Sources */,
  1549 + 18FE70ED14474EE6A49E85DE9C5E4C17 /* AlamofireImage-dummy.m in Sources */,
  1550 + 60E47009DC055C6C140154BC96B5C58C /* Image.swift in Sources */,
  1551 + F254CF02931202CD44537EAD61D27BE8 /* ImageCache.swift in Sources */,
  1552 + 9D9717AC018F075F378E52B078CDBFB5 /* ImageDownloader.swift in Sources */,
  1553 + 9E686D93A33DD9756B0C21B68BD7D758 /* ImageFilter.swift in Sources */,
  1554 + 9DBB6831E79F70D2E8C4DFD169E228E2 /* Request+AlamofireImage.swift in Sources */,
  1555 + A133EAE3F50C55B4E1A03A5F9D6B3A4B /* UIButton+AlamofireImage.swift in Sources */,
  1556 + 85B4114292AEC3C6DCD2F9500A064F9B /* UIImage+AlamofireImage.swift in Sources */,
  1557 + 36840E12F93D5E0D201B1D998B96EEB9 /* UIImageView+AlamofireImage.swift in Sources */,
  1558 + );
  1559 + runOnlyForDeploymentPostprocessing = 0;
  1560 + };
  1561 + B0A80FA96AA24569F8AB376B609B0706 /* Sources */ = {
  1562 + isa = PBXSourcesBuildPhase;
  1563 + buildActionMask = 2147483647;
  1564 + files = (
  1565 + CBFDD17FED69C5F001648B331CE5FDDE /* Pods-ParentAssistant-dummy.m in Sources */,
  1566 + );
  1567 + runOnlyForDeploymentPostprocessing = 0;
  1568 + };
  1569 + BA7C56D0F2745E59EEA82D7E504CAAB3 /* Sources */ = {
  1570 + isa = PBXSourcesBuildPhase;
  1571 + buildActionMask = 2147483647;
  1572 + files = (
  1573 + 189863C7E2504923687D78D7B081F8CA /* NSData+ImageContentType.m in Sources */,
  1574 + 5D8FA1EAFFDA438C0D3E909D54D6E657 /* SDImageCache.m in Sources */,
  1575 + 80AF024EF162F4FB88CCAAA2FA6FAAD5 /* SDWebImage-dummy.m in Sources */,
  1576 + 2EA01E4E252B14F7953C56C100482236 /* SDWebImageCompat.m in Sources */,
  1577 + 1A34F151BC19E9D0725C689FC1038209 /* SDWebImageDecoder.m in Sources */,
  1578 + 29B1FA33CD27E5CAEC884DA6D0072CFC /* SDWebImageDownloader.m in Sources */,
  1579 + 3D34EECD1D7C0DC13F3E19C4C74F212E /* SDWebImageDownloaderOperation.m in Sources */,
  1580 + 53591DA77C42B53EB9AB3060008F41B6 /* SDWebImageManager.m in Sources */,
  1581 + 9FC9BC048B02CFF720B9CFBE4DC80264 /* SDWebImagePrefetcher.m in Sources */,
  1582 + 638A8C8931AA82B35E4165A32BDEF8CA /* UIButton+WebCache.m in Sources */,
  1583 + 59145DFC87F4E74844E76619E8C4114D /* UIImage+GIF.m in Sources */,
  1584 + 3D0142A71F210A641528761123C4F1C2 /* UIImage+MultiFormat.m in Sources */,
  1585 + E90F4E9FD8EA1D01B118497ACBB199D8 /* UIImageView+HighlightedWebCache.m in Sources */,
  1586 + 3A9E64415250045D18CD329DE4776D9A /* UIImageView+WebCache.m in Sources */,
  1587 + 5D0701D0FA9726E83C52A53F4BEAD02B /* UIView+WebCacheOperation.m in Sources */,
  1588 + );
  1589 + runOnlyForDeploymentPostprocessing = 0;
  1590 + };
  1591 + C3136CF9BAFDECBEB2E6A9CCD8BECDAE /* Sources */ = {
  1592 + isa = PBXSourcesBuildPhase;
  1593 + buildActionMask = 2147483647;
  1594 + files = (
  1595 + D22AD2613455598A94BFCCA33AA9B2CE /* Reachability-dummy.m in Sources */,
  1596 + 666A863EA9B0A00CA5EDDB4C96EA014B /* Reachability.m in Sources */,
  1597 + );
  1598 + runOnlyForDeploymentPostprocessing = 0;
  1599 + };
1449 EE0067F8658DBC2B557D26C46C0796CA /* Sources */ = { 1600 EE0067F8658DBC2B557D26C46C0796CA /* Sources */ = {
1450 isa = PBXSourcesBuildPhase; 1601 isa = PBXSourcesBuildPhase;
1451 buildActionMask = 2147483647; 1602 buildActionMask = 2147483647;
@@ -1486,87 +1637,81 @@ @@ -1486,87 +1637,81 @@
1486 ); 1637 );
1487 runOnlyForDeploymentPostprocessing = 0; 1638 runOnlyForDeploymentPostprocessing = 0;
1488 }; 1639 };
1489 - F437D84355ADAD46DE352A42EFA6A50A /* Sources */ = {  
1490 - isa = PBXSourcesBuildPhase;  
1491 - buildActionMask = 2147483647;  
1492 - files = (  
1493 - CAD7174B4833082EAE9507FB4CDCB07B /* Toast-dummy.m in Sources */,  
1494 - 44E9442A5B676A7E4941C47EB6C49C9F /* UIView+Toast.m in Sources */,  
1495 - );  
1496 - runOnlyForDeploymentPostprocessing = 0;  
1497 - };  
1498 - FA661C521ABA5EDB2937799E80C70EC2 /* Sources */ = {  
1499 - isa = PBXSourcesBuildPhase;  
1500 - buildActionMask = 2147483647;  
1501 - files = (  
1502 - 8B937C355B5CAAEC40B80F24AFA26569 /* Reachability-dummy.m in Sources */,  
1503 - 0203C16E98AD37E5A0C596D1B39C5119 /* Reachability.m in Sources */,  
1504 - );  
1505 - runOnlyForDeploymentPostprocessing = 0;  
1506 - };  
1507 /* End PBXSourcesBuildPhase section */ 1640 /* End PBXSourcesBuildPhase section */
1508 1641
1509 /* Begin PBXTargetDependency section */ 1642 /* Begin PBXTargetDependency section */
1510 - 02C0DEC84BDA70532ADA225A5A2A3304 /* PBXTargetDependency */ = { 1643 + 0271B3B581BEDB99AD2D8A82A7A51FE7 /* PBXTargetDependency */ = {
  1644 + isa = PBXTargetDependency;
  1645 + name = Reachability;
  1646 + target = CE1092398200ECC7DE7468626D1D0B98 /* Reachability */;
  1647 + targetProxy = C3177531DBE096BDE468C9291366B775 /* PBXContainerItemProxy */;
  1648 + };
  1649 + 03000FBE28A1D37021A99C22E5DC6577 /* PBXTargetDependency */ = {
  1650 + isa = PBXTargetDependency;
  1651 + name = SwiftHash;
  1652 + target = A0A5E57D4BB5AA2602B591D713407086 /* SwiftHash */;
  1653 + targetProxy = 4B6C29399AB72BDC0DC80584EC3BD333 /* PBXContainerItemProxy */;
  1654 + };
  1655 + 0B0575AE71362DA3E174564EB6435F59 /* PBXTargetDependency */ = {
  1656 + isa = PBXTargetDependency;
  1657 + name = HandyJSON;
  1658 + target = 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */;
  1659 + targetProxy = 189D44E9EA4F94C8EC2EBCD3B9A94437 /* PBXContainerItemProxy */;
  1660 + };
  1661 + 0F0709264E6CBE1FC5B2108AFA9A1EBC /* PBXTargetDependency */ = {
1511 isa = PBXTargetDependency; 1662 isa = PBXTargetDependency;
1512 name = DZNEmptyDataSet; 1663 name = DZNEmptyDataSet;
1513 target = D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */; 1664 target = D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */;
1514 - targetProxy = 40A6BB26078AD6CC3BFED24490AA679C /* PBXContainerItemProxy */; 1665 + targetProxy = 1DC0B6708B1B4007743DC8E966822305 /* PBXContainerItemProxy */;
1515 }; 1666 };
1516 - 59040B7DE59B45C468C5A827B43DF38A /* PBXTargetDependency */ = { 1667 + 400980F7465C7DCC1DF6E89055AD0B96 /* PBXTargetDependency */ = {
1517 isa = PBXTargetDependency; 1668 isa = PBXTargetDependency;
1518 - name = SwiftHash;  
1519 - target = 6376DC419EEA98495631602218A4F31B /* SwiftHash */;  
1520 - targetProxy = 14508FFAEE6EBD1C2386229671393CCD /* PBXContainerItemProxy */; 1669 + name = AlamofireImage;
  1670 + target = 9EFE4C70245EE2857D336B8B9FA4E825 /* AlamofireImage */;
  1671 + targetProxy = 4AE51A1942CC8930F7A20592BF7BC9CB /* PBXContainerItemProxy */;
1521 }; 1672 };
1522 - 65D67D71AAC210DB47EAC622F7FA69B9 /* PBXTargetDependency */ = { 1673 + 48DB56871980177AD76344D30AAA6812 /* PBXTargetDependency */ = {
1523 isa = PBXTargetDependency; 1674 isa = PBXTargetDependency;
1524 - name = Reachability;  
1525 - target = AAC4087A5A57F5566AB9B54FEBADBC36 /* Reachability */;  
1526 - targetProxy = 82A515E1EF9A2DA9422FDE7D829F0650 /* PBXContainerItemProxy */; 1675 + name = Toast;
  1676 + target = 620180280B57A3DF973662E546D211E4 /* Toast */;
  1677 + targetProxy = 9554361F88EB7FDE40F109D073B49910 /* PBXContainerItemProxy */;
1527 }; 1678 };
1528 - 91447221DA6C2FBBF7167A4B974044D2 /* PBXTargetDependency */ = { 1679 + 5088DA9186A8D1DD902822E13A654208 /* PBXTargetDependency */ = {
1529 isa = PBXTargetDependency; 1680 isa = PBXTargetDependency;
1530 - name = SDWebImage;  
1531 - target = 8FA4EA707F3B6CFDACB1C85C722D2E73 /* SDWebImage */;  
1532 - targetProxy = 1F4310C891A7C6531B2EC2F44755F5D2 /* PBXContainerItemProxy */; 1681 + name = SVProgressHUD;
  1682 + target = 637267420040487628765A2667620742 /* SVProgressHUD */;
  1683 + targetProxy = CA2DE504A4CA7EA9E0FBEE6863FE1B71 /* PBXContainerItemProxy */;
1533 }; 1684 };
1534 - 954A722A2C8F32AE6348DAD3CFC2DFE4 /* PBXTargetDependency */ = { 1685 + 8937A2057A0DAADF003B7C65E7CE115D /* PBXTargetDependency */ = {
1535 isa = PBXTargetDependency; 1686 isa = PBXTargetDependency;
1536 name = Alamofire; 1687 name = Alamofire;
1537 target = 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */; 1688 target = 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */;
1538 - targetProxy = A81D9D0AD4D99710674892A4C13CE7C4 /* PBXContainerItemProxy */; 1689 + targetProxy = A1758AA696D56310AA192B587162169A /* PBXContainerItemProxy */;
1539 }; 1690 };
1540 - 9D4E5F870098A82524B3E139E921E49C /* PBXTargetDependency */ = { 1691 + AF98B4E6DC1B79AE4FD9FD930B0E2C69 /* PBXTargetDependency */ = {
1541 isa = PBXTargetDependency; 1692 isa = PBXTargetDependency;
1542 - name = HandyJSON;  
1543 - target = 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */;  
1544 - targetProxy = EE8B3E8B9AA89EC765C0E539B4E7EDC7 /* PBXContainerItemProxy */; 1693 + name = Alamofire;
  1694 + target = 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */;
  1695 + targetProxy = B52B9C3E170467E0CA53E1CF539F3C3C /* PBXContainerItemProxy */;
1545 }; 1696 };
1546 - BBA7098DD5EA0680F81007C50C09B686 /* PBXTargetDependency */ = { 1697 + C91D8AEA00A921168C007D309B135C5D /* PBXTargetDependency */ = {
1547 isa = PBXTargetDependency; 1698 isa = PBXTargetDependency;
1548 - name = SVProgressHUD;  
1549 - target = E55BDEBC8F73D6B7936791D0822F70D6 /* SVProgressHUD */;  
1550 - targetProxy = 8EE514F180AE8F72FA2CB958642AC2D2 /* PBXContainerItemProxy */; 1699 + name = SDWebImage;
  1700 + target = 37F4E36BECBDD0070D2501E766C0238B /* SDWebImage */;
  1701 + targetProxy = 38E587F9ED2E7A43122E76199C12388D /* PBXContainerItemProxy */;
1551 }; 1702 };
1552 - E82DBF544557B801D7515E53ABBE9C31 /* PBXTargetDependency */ = { 1703 + D7A715C58A0231CE8EF5720E0B2201C5 /* PBXTargetDependency */ = {
1553 isa = PBXTargetDependency; 1704 isa = PBXTargetDependency;
1554 name = XRCarouselView; 1705 name = XRCarouselView;
1555 - target = 27189F0EDBCA8831C460D0166F6F37A1 /* XRCarouselView */;  
1556 - targetProxy = 594A8718DA74EC137A691ED506FE6CCB /* PBXContainerItemProxy */;  
1557 - };  
1558 - F54C3AB44B6273AFC143292EBABDE7C4 /* PBXTargetDependency */ = {  
1559 - isa = PBXTargetDependency;  
1560 - name = Toast;  
1561 - target = 9A9DDC64623B3F5E6DC7009C16752B95 /* Toast */;  
1562 - targetProxy = 8E7E6D806A10070D238FC81F6BAB4860 /* PBXContainerItemProxy */; 1706 + target = 0A4402E270B0A4B00A031931BD805EF1 /* XRCarouselView */;
  1707 + targetProxy = 4EDB1BF0F4A9280D81BBE57A53DD7917 /* PBXContainerItemProxy */;
1563 }; 1708 };
1564 /* End PBXTargetDependency section */ 1709 /* End PBXTargetDependency section */
1565 1710
1566 /* Begin XCBuildConfiguration section */ 1711 /* Begin XCBuildConfiguration section */
1567 - 1456973998A5F20B4501A680D3794F6A /* Release */ = { 1712 + 0C3F011A578A68CF86694EAD254E6E23 /* Debug */ = {
1568 isa = XCBuildConfiguration; 1713 isa = XCBuildConfiguration;
1569 - baseConfigurationReference = 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */; 1714 + baseConfigurationReference = 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */;
1570 buildSettings = { 1715 buildSettings = {
1571 CODE_SIGN_IDENTITY = ""; 1716 CODE_SIGN_IDENTITY = "";
1572 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 1717 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1577,27 +1722,27 @@ @@ -1577,27 +1722,27 @@
1577 DYLIB_COMPATIBILITY_VERSION = 1; 1722 DYLIB_COMPATIBILITY_VERSION = 1;
1578 DYLIB_CURRENT_VERSION = 1; 1723 DYLIB_CURRENT_VERSION = 1;
1579 DYLIB_INSTALL_NAME_BASE = "@rpath"; 1724 DYLIB_INSTALL_NAME_BASE = "@rpath";
1580 - GCC_PREFIX_HEADER = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch";  
1581 - INFOPLIST_FILE = "Target Support Files/DZNEmptyDataSet/Info.plist"; 1725 + GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch";
  1726 + INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist";
1582 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1727 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1583 IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1728 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1584 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1729 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1585 - MODULEMAP_FILE = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet.modulemap";  
1586 - PRODUCT_NAME = DZNEmptyDataSet; 1730 + MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap";
  1731 + PRODUCT_NAME = SwiftHash;
1587 SDKROOT = iphoneos; 1732 SDKROOT = iphoneos;
1588 SKIP_INSTALL = YES; 1733 SKIP_INSTALL = YES;
1589 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 1734 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  1735 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
1590 SWIFT_VERSION = 4.0; 1736 SWIFT_VERSION = 4.0;
1591 TARGETED_DEVICE_FAMILY = "1,2"; 1737 TARGETED_DEVICE_FAMILY = "1,2";
1592 - VALIDATE_PRODUCT = YES;  
1593 VERSIONING_SYSTEM = "apple-generic"; 1738 VERSIONING_SYSTEM = "apple-generic";
1594 VERSION_INFO_PREFIX = ""; 1739 VERSION_INFO_PREFIX = "";
1595 }; 1740 };
1596 - name = Release; 1741 + name = Debug;
1597 }; 1742 };
1598 - 205040859FD37102CD356142F35D96D4 /* Debug */ = { 1743 + 11480927D0D767066580AF486506DDA6 /* Release */ = {
1599 isa = XCBuildConfiguration; 1744 isa = XCBuildConfiguration;
1600 - baseConfigurationReference = 6EB59F100C77215BCBB4FAD12F0FF358 /* Pods-ParentAssistant.debug.xcconfig */; 1745 + baseConfigurationReference = 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */;
1601 buildSettings = { 1746 buildSettings = {
1602 CODE_SIGN_IDENTITY = ""; 1747 CODE_SIGN_IDENTITY = "";
1603 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 1748 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1608,30 +1753,28 @@ @@ -1608,30 +1753,28 @@
1608 DYLIB_COMPATIBILITY_VERSION = 1; 1753 DYLIB_COMPATIBILITY_VERSION = 1;
1609 DYLIB_CURRENT_VERSION = 1; 1754 DYLIB_CURRENT_VERSION = 1;
1610 DYLIB_INSTALL_NAME_BASE = "@rpath"; 1755 DYLIB_INSTALL_NAME_BASE = "@rpath";
1611 - INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist"; 1756 + GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch";
  1757 + INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist";
1612 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1758 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1613 - IPHONEOS_DEPLOYMENT_TARGET = 9.0; 1759 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1614 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1760 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1615 - MACH_O_TYPE = staticlib;  
1616 - MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap";  
1617 - OTHER_LDFLAGS = "";  
1618 - OTHER_LIBTOOLFLAGS = "";  
1619 - PODS_ROOT = "$(SRCROOT)";  
1620 - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";  
1621 - PRODUCT_NAME = Pods_ParentAssistant; 1761 + MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap";
  1762 + PRODUCT_NAME = SwiftHash;
1622 SDKROOT = iphoneos; 1763 SDKROOT = iphoneos;
1623 SKIP_INSTALL = YES; 1764 SKIP_INSTALL = YES;
1624 - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;  
1625 - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1765 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  1766 + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
  1767 + SWIFT_VERSION = 4.0;
1626 TARGETED_DEVICE_FAMILY = "1,2"; 1768 TARGETED_DEVICE_FAMILY = "1,2";
  1769 + VALIDATE_PRODUCT = YES;
1627 VERSIONING_SYSTEM = "apple-generic"; 1770 VERSIONING_SYSTEM = "apple-generic";
1628 VERSION_INFO_PREFIX = ""; 1771 VERSION_INFO_PREFIX = "";
1629 }; 1772 };
1630 - name = Debug; 1773 + name = Release;
1631 }; 1774 };
1632 - 20A33051E49990EF2F5D75016374151E /* Release */ = { 1775 + 1456973998A5F20B4501A680D3794F6A /* Release */ = {
1633 isa = XCBuildConfiguration; 1776 isa = XCBuildConfiguration;
1634 - baseConfigurationReference = 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */; 1777 + baseConfigurationReference = 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */;
1635 buildSettings = { 1778 buildSettings = {
1636 CODE_SIGN_IDENTITY = ""; 1779 CODE_SIGN_IDENTITY = "";
1637 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 1780 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1642,13 +1785,13 @@ @@ -1642,13 +1785,13 @@
1642 DYLIB_COMPATIBILITY_VERSION = 1; 1785 DYLIB_COMPATIBILITY_VERSION = 1;
1643 DYLIB_CURRENT_VERSION = 1; 1786 DYLIB_CURRENT_VERSION = 1;
1644 DYLIB_INSTALL_NAME_BASE = "@rpath"; 1787 DYLIB_INSTALL_NAME_BASE = "@rpath";
1645 - GCC_PREFIX_HEADER = "Target Support Files/Reachability/Reachability-prefix.pch";  
1646 - INFOPLIST_FILE = "Target Support Files/Reachability/Info.plist"; 1788 + GCC_PREFIX_HEADER = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch";
  1789 + INFOPLIST_FILE = "Target Support Files/DZNEmptyDataSet/Info.plist";
1647 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1790 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1648 IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1791 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1649 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1792 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1650 - MODULEMAP_FILE = "Target Support Files/Reachability/Reachability.modulemap";  
1651 - PRODUCT_NAME = Reachability; 1793 + MODULEMAP_FILE = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet.modulemap";
  1794 + PRODUCT_NAME = DZNEmptyDataSet;
1652 SDKROOT = iphoneos; 1795 SDKROOT = iphoneos;
1653 SKIP_INSTALL = YES; 1796 SKIP_INSTALL = YES;
1654 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 1797 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
@@ -1660,9 +1803,9 @@ @@ -1660,9 +1803,9 @@
1660 }; 1803 };
1661 name = Release; 1804 name = Release;
1662 }; 1805 };
1663 - 215A480FCE0C128FA2F4C2A2882BBE23 /* Debug */ = { 1806 + 1C5DAB39976688A93021E071A70593C0 /* Release */ = {
1664 isa = XCBuildConfiguration; 1807 isa = XCBuildConfiguration;
1665 - baseConfigurationReference = 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */; 1808 + baseConfigurationReference = 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */;
1666 buildSettings = { 1809 buildSettings = {
1667 CODE_SIGN_IDENTITY = ""; 1810 CODE_SIGN_IDENTITY = "";
1668 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 1811 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1673,26 +1816,28 @@ @@ -1673,26 +1816,28 @@
1673 DYLIB_COMPATIBILITY_VERSION = 1; 1816 DYLIB_COMPATIBILITY_VERSION = 1;
1674 DYLIB_CURRENT_VERSION = 1; 1817 DYLIB_CURRENT_VERSION = 1;
1675 DYLIB_INSTALL_NAME_BASE = "@rpath"; 1818 DYLIB_INSTALL_NAME_BASE = "@rpath";
1676 - GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch";  
1677 - INFOPLIST_FILE = "Target Support Files/Toast/Info.plist"; 1819 + GCC_PREFIX_HEADER = "Target Support Files/AlamofireImage/AlamofireImage-prefix.pch";
  1820 + INFOPLIST_FILE = "Target Support Files/AlamofireImage/Info.plist";
1678 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1821 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1679 IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1822 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1680 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1823 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1681 - MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap";  
1682 - PRODUCT_NAME = Toast; 1824 + MODULEMAP_FILE = "Target Support Files/AlamofireImage/AlamofireImage.modulemap";
  1825 + PRODUCT_NAME = AlamofireImage;
1683 SDKROOT = iphoneos; 1826 SDKROOT = iphoneos;
1684 SKIP_INSTALL = YES; 1827 SKIP_INSTALL = YES;
1685 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 1828 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  1829 + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
1686 SWIFT_VERSION = 4.0; 1830 SWIFT_VERSION = 4.0;
1687 TARGETED_DEVICE_FAMILY = "1,2"; 1831 TARGETED_DEVICE_FAMILY = "1,2";
  1832 + VALIDATE_PRODUCT = YES;
1688 VERSIONING_SYSTEM = "apple-generic"; 1833 VERSIONING_SYSTEM = "apple-generic";
1689 VERSION_INFO_PREFIX = ""; 1834 VERSION_INFO_PREFIX = "";
1690 }; 1835 };
1691 - name = Debug; 1836 + name = Release;
1692 }; 1837 };
1693 - 2386F65ABDB52652A92CBEE14C73BA07 /* Debug */ = { 1838 + 1F40ECCA7544B21AE3F93FCA732FF525 /* Release */ = {
1694 isa = XCBuildConfiguration; 1839 isa = XCBuildConfiguration;
1695 - baseConfigurationReference = 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */; 1840 + baseConfigurationReference = 77EFE064376F26AEED2B1971235A88EF /* Pods-ParentAssistant.release.xcconfig */;
1696 buildSettings = { 1841 buildSettings = {
1697 CODE_SIGN_IDENTITY = ""; 1842 CODE_SIGN_IDENTITY = "";
1698 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 1843 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1703,26 +1848,30 @@ @@ -1703,26 +1848,30 @@
1703 DYLIB_COMPATIBILITY_VERSION = 1; 1848 DYLIB_COMPATIBILITY_VERSION = 1;
1704 DYLIB_CURRENT_VERSION = 1; 1849 DYLIB_CURRENT_VERSION = 1;
1705 DYLIB_INSTALL_NAME_BASE = "@rpath"; 1850 DYLIB_INSTALL_NAME_BASE = "@rpath";
1706 - GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch";  
1707 - INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist"; 1851 + INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist";
1708 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1852 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1709 - IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1853 + IPHONEOS_DEPLOYMENT_TARGET = 9.0;
1710 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1854 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1711 - MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap";  
1712 - PRODUCT_NAME = XRCarouselView; 1855 + MACH_O_TYPE = staticlib;
  1856 + MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap";
  1857 + OTHER_LDFLAGS = "";
  1858 + OTHER_LIBTOOLFLAGS = "";
  1859 + PODS_ROOT = "$(SRCROOT)";
  1860 + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
  1861 + PRODUCT_NAME = Pods_ParentAssistant;
1713 SDKROOT = iphoneos; 1862 SDKROOT = iphoneos;
1714 SKIP_INSTALL = YES; 1863 SKIP_INSTALL = YES;
1715 - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";  
1716 - SWIFT_VERSION = 4.0; 1864 + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
1717 TARGETED_DEVICE_FAMILY = "1,2"; 1865 TARGETED_DEVICE_FAMILY = "1,2";
  1866 + VALIDATE_PRODUCT = YES;
1718 VERSIONING_SYSTEM = "apple-generic"; 1867 VERSIONING_SYSTEM = "apple-generic";
1719 VERSION_INFO_PREFIX = ""; 1868 VERSION_INFO_PREFIX = "";
1720 }; 1869 };
1721 - name = Debug; 1870 + name = Release;
1722 }; 1871 };
1723 - 2399E3FF594AB08E0DAC9484992C0F91 /* Release */ = { 1872 + 1F859CD6F320ED91E304126AE9B41213 /* Debug */ = {
1724 isa = XCBuildConfiguration; 1873 isa = XCBuildConfiguration;
1725 - baseConfigurationReference = BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */; 1874 + baseConfigurationReference = D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */;
1726 buildSettings = { 1875 buildSettings = {
1727 CODE_SIGN_IDENTITY = ""; 1876 CODE_SIGN_IDENTITY = "";
1728 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 1877 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1733,24 +1882,22 @@ @@ -1733,24 +1882,22 @@
1733 DYLIB_COMPATIBILITY_VERSION = 1; 1882 DYLIB_COMPATIBILITY_VERSION = 1;
1734 DYLIB_CURRENT_VERSION = 1; 1883 DYLIB_CURRENT_VERSION = 1;
1735 DYLIB_INSTALL_NAME_BASE = "@rpath"; 1884 DYLIB_INSTALL_NAME_BASE = "@rpath";
1736 - GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch";  
1737 - INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist"; 1885 + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch";
  1886 + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist";
1738 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1887 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1739 IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1888 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1740 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1889 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1741 - MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap";  
1742 - PRODUCT_NAME = SwiftHash; 1890 + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap";
  1891 + PRODUCT_NAME = SDWebImage;
1743 SDKROOT = iphoneos; 1892 SDKROOT = iphoneos;
1744 SKIP_INSTALL = YES; 1893 SKIP_INSTALL = YES;
1745 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 1894 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
1746 - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";  
1747 SWIFT_VERSION = 4.0; 1895 SWIFT_VERSION = 4.0;
1748 TARGETED_DEVICE_FAMILY = "1,2"; 1896 TARGETED_DEVICE_FAMILY = "1,2";
1749 - VALIDATE_PRODUCT = YES;  
1750 VERSIONING_SYSTEM = "apple-generic"; 1897 VERSIONING_SYSTEM = "apple-generic";
1751 VERSION_INFO_PREFIX = ""; 1898 VERSION_INFO_PREFIX = "";
1752 }; 1899 };
1753 - name = Release; 1900 + name = Debug;
1754 }; 1901 };
1755 26F954BA177A9A46FFFD4E23ED11D67A /* Release */ = { 1902 26F954BA177A9A46FFFD4E23ED11D67A /* Release */ = {
1756 isa = XCBuildConfiguration; 1903 isa = XCBuildConfiguration;
@@ -1810,9 +1957,9 @@ @@ -1810,9 +1957,9 @@
1810 }; 1957 };
1811 name = Release; 1958 name = Release;
1812 }; 1959 };
1813 - 3D9BEB881A70984931EB7B52EB42D89C /* Debug */ = { 1960 + 2DA5E368920A110F6198A53CE954D348 /* Release */ = {
1814 isa = XCBuildConfiguration; 1961 isa = XCBuildConfiguration;
1815 - baseConfigurationReference = 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */; 1962 + baseConfigurationReference = D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */;
1816 buildSettings = { 1963 buildSettings = {
1817 CODE_SIGN_IDENTITY = ""; 1964 CODE_SIGN_IDENTITY = "";
1818 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 1965 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1823,26 +1970,27 @@ @@ -1823,26 +1970,27 @@
1823 DYLIB_COMPATIBILITY_VERSION = 1; 1970 DYLIB_COMPATIBILITY_VERSION = 1;
1824 DYLIB_CURRENT_VERSION = 1; 1971 DYLIB_CURRENT_VERSION = 1;
1825 DYLIB_INSTALL_NAME_BASE = "@rpath"; 1972 DYLIB_INSTALL_NAME_BASE = "@rpath";
1826 - GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch";  
1827 - INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist"; 1973 + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch";
  1974 + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist";
1828 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1975 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1829 IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1976 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1830 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1977 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1831 - MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap";  
1832 - PRODUCT_NAME = SVProgressHUD; 1978 + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap";
  1979 + PRODUCT_NAME = SDWebImage;
1833 SDKROOT = iphoneos; 1980 SDKROOT = iphoneos;
1834 SKIP_INSTALL = YES; 1981 SKIP_INSTALL = YES;
1835 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 1982 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
1836 SWIFT_VERSION = 4.0; 1983 SWIFT_VERSION = 4.0;
1837 TARGETED_DEVICE_FAMILY = "1,2"; 1984 TARGETED_DEVICE_FAMILY = "1,2";
  1985 + VALIDATE_PRODUCT = YES;
1838 VERSIONING_SYSTEM = "apple-generic"; 1986 VERSIONING_SYSTEM = "apple-generic";
1839 VERSION_INFO_PREFIX = ""; 1987 VERSION_INFO_PREFIX = "";
1840 }; 1988 };
1841 - name = Debug; 1989 + name = Release;
1842 }; 1990 };
1843 - 51211605D5BBC568B59C86BC410917A5 /* Release */ = { 1991 + 48B91C10F0EB0CF2F5206AB95226AC0E /* Debug */ = {
1844 isa = XCBuildConfiguration; 1992 isa = XCBuildConfiguration;
1845 - baseConfigurationReference = 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */; 1993 + baseConfigurationReference = 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */;
1846 buildSettings = { 1994 buildSettings = {
1847 CODE_SIGN_IDENTITY = ""; 1995 CODE_SIGN_IDENTITY = "";
1848 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 1996 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1853,27 +2001,26 @@ @@ -1853,27 +2001,26 @@
1853 DYLIB_COMPATIBILITY_VERSION = 1; 2001 DYLIB_COMPATIBILITY_VERSION = 1;
1854 DYLIB_CURRENT_VERSION = 1; 2002 DYLIB_CURRENT_VERSION = 1;
1855 DYLIB_INSTALL_NAME_BASE = "@rpath"; 2003 DYLIB_INSTALL_NAME_BASE = "@rpath";
1856 - GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch";  
1857 - INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist"; 2004 + GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch";
  2005 + INFOPLIST_FILE = "Target Support Files/Toast/Info.plist";
1858 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 2006 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1859 IPHONEOS_DEPLOYMENT_TARGET = 8.0; 2007 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1860 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 2008 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1861 - MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap";  
1862 - PRODUCT_NAME = SVProgressHUD; 2009 + MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap";
  2010 + PRODUCT_NAME = Toast;
1863 SDKROOT = iphoneos; 2011 SDKROOT = iphoneos;
1864 SKIP_INSTALL = YES; 2012 SKIP_INSTALL = YES;
1865 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 2013 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
1866 SWIFT_VERSION = 4.0; 2014 SWIFT_VERSION = 4.0;
1867 TARGETED_DEVICE_FAMILY = "1,2"; 2015 TARGETED_DEVICE_FAMILY = "1,2";
1868 - VALIDATE_PRODUCT = YES;  
1869 VERSIONING_SYSTEM = "apple-generic"; 2016 VERSIONING_SYSTEM = "apple-generic";
1870 VERSION_INFO_PREFIX = ""; 2017 VERSION_INFO_PREFIX = "";
1871 }; 2018 };
1872 - name = Release; 2019 + name = Debug;
1873 }; 2020 };
1874 - 601BFB40515FF6C016B5850C2D905027 /* Release */ = { 2021 + 5D34B066ADCE4D5A36DAF77492279C57 /* Debug */ = {
1875 isa = XCBuildConfiguration; 2022 isa = XCBuildConfiguration;
1876 - baseConfigurationReference = 77EFE064376F26AEED2B1971235A88EF /* Pods-ParentAssistant.release.xcconfig */; 2023 + baseConfigurationReference = C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */;
1877 buildSettings = { 2024 buildSettings = {
1878 CODE_SIGN_IDENTITY = ""; 2025 CODE_SIGN_IDENTITY = "";
1879 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 2026 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1884,30 +2031,26 @@ @@ -1884,30 +2031,26 @@
1884 DYLIB_COMPATIBILITY_VERSION = 1; 2031 DYLIB_COMPATIBILITY_VERSION = 1;
1885 DYLIB_CURRENT_VERSION = 1; 2032 DYLIB_CURRENT_VERSION = 1;
1886 DYLIB_INSTALL_NAME_BASE = "@rpath"; 2033 DYLIB_INSTALL_NAME_BASE = "@rpath";
1887 - INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist"; 2034 + GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch";
  2035 + INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist";
1888 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 2036 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1889 - IPHONEOS_DEPLOYMENT_TARGET = 9.0; 2037 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1890 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 2038 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1891 - MACH_O_TYPE = staticlib;  
1892 - MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap";  
1893 - OTHER_LDFLAGS = "";  
1894 - OTHER_LIBTOOLFLAGS = "";  
1895 - PODS_ROOT = "$(SRCROOT)";  
1896 - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";  
1897 - PRODUCT_NAME = Pods_ParentAssistant; 2039 + MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap";
  2040 + PRODUCT_NAME = SVProgressHUD;
1898 SDKROOT = iphoneos; 2041 SDKROOT = iphoneos;
1899 SKIP_INSTALL = YES; 2042 SKIP_INSTALL = YES;
1900 - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 2043 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2044 + SWIFT_VERSION = 4.0;
1901 TARGETED_DEVICE_FAMILY = "1,2"; 2045 TARGETED_DEVICE_FAMILY = "1,2";
1902 - VALIDATE_PRODUCT = YES;  
1903 VERSIONING_SYSTEM = "apple-generic"; 2046 VERSIONING_SYSTEM = "apple-generic";
1904 VERSION_INFO_PREFIX = ""; 2047 VERSION_INFO_PREFIX = "";
1905 }; 2048 };
1906 - name = Release; 2049 + name = Debug;
1907 }; 2050 };
1908 - 68EC31FD5ED5128B6144732DB7C7AEAA /* Release */ = { 2051 + 751B90BBDF8E0306B9FEBD3AFC3D32D5 /* Debug */ = {
1909 isa = XCBuildConfiguration; 2052 isa = XCBuildConfiguration;
1910 - baseConfigurationReference = EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */; 2053 + baseConfigurationReference = 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */;
1911 buildSettings = { 2054 buildSettings = {
1912 CODE_SIGN_IDENTITY = ""; 2055 CODE_SIGN_IDENTITY = "";
1913 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 2056 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1918,28 +2061,27 @@ @@ -1918,28 +2061,27 @@
1918 DYLIB_COMPATIBILITY_VERSION = 1; 2061 DYLIB_COMPATIBILITY_VERSION = 1;
1919 DYLIB_CURRENT_VERSION = 1; 2062 DYLIB_CURRENT_VERSION = 1;
1920 DYLIB_INSTALL_NAME_BASE = "@rpath"; 2063 DYLIB_INSTALL_NAME_BASE = "@rpath";
1921 - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch";  
1922 - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; 2064 + GCC_PREFIX_HEADER = "Target Support Files/AlamofireImage/AlamofireImage-prefix.pch";
  2065 + INFOPLIST_FILE = "Target Support Files/AlamofireImage/Info.plist";
1923 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 2066 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1924 - IPHONEOS_DEPLOYMENT_TARGET = 9.0; 2067 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1925 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 2068 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1926 - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap";  
1927 - PRODUCT_NAME = Alamofire; 2069 + MODULEMAP_FILE = "Target Support Files/AlamofireImage/AlamofireImage.modulemap";
  2070 + PRODUCT_NAME = AlamofireImage;
1928 SDKROOT = iphoneos; 2071 SDKROOT = iphoneos;
1929 SKIP_INSTALL = YES; 2072 SKIP_INSTALL = YES;
1930 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 2073 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
1931 - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 2074 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
1932 SWIFT_VERSION = 4.0; 2075 SWIFT_VERSION = 4.0;
1933 TARGETED_DEVICE_FAMILY = "1,2"; 2076 TARGETED_DEVICE_FAMILY = "1,2";
1934 - VALIDATE_PRODUCT = YES;  
1935 VERSIONING_SYSTEM = "apple-generic"; 2077 VERSIONING_SYSTEM = "apple-generic";
1936 VERSION_INFO_PREFIX = ""; 2078 VERSION_INFO_PREFIX = "";
1937 }; 2079 };
1938 - name = Release; 2080 + name = Debug;
1939 }; 2081 };
1940 793948A7CE88FCA234DA7EFD60D4178E /* Debug */ = { 2082 793948A7CE88FCA234DA7EFD60D4178E /* Debug */ = {
1941 isa = XCBuildConfiguration; 2083 isa = XCBuildConfiguration;
1942 - baseConfigurationReference = 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */; 2084 + baseConfigurationReference = 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */;
1943 buildSettings = { 2085 buildSettings = {
1944 CODE_SIGN_IDENTITY = ""; 2086 CODE_SIGN_IDENTITY = "";
1945 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 2087 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1967,9 +2109,9 @@ @@ -1967,9 +2109,9 @@
1967 }; 2109 };
1968 name = Debug; 2110 name = Debug;
1969 }; 2111 };
1970 - 8056BF0CAA9260FAFEF0C71AA27ED129 /* Debug */ = { 2112 + 8F127F4A0150651E07D4FA5346BC4AAC /* Release */ = {
1971 isa = XCBuildConfiguration; 2113 isa = XCBuildConfiguration;
1972 - baseConfigurationReference = EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */; 2114 + baseConfigurationReference = C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */;
1973 buildSettings = { 2115 buildSettings = {
1974 CODE_SIGN_IDENTITY = ""; 2116 CODE_SIGN_IDENTITY = "";
1975 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 2117 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -1980,27 +2122,27 @@ @@ -1980,27 +2122,27 @@
1980 DYLIB_COMPATIBILITY_VERSION = 1; 2122 DYLIB_COMPATIBILITY_VERSION = 1;
1981 DYLIB_CURRENT_VERSION = 1; 2123 DYLIB_CURRENT_VERSION = 1;
1982 DYLIB_INSTALL_NAME_BASE = "@rpath"; 2124 DYLIB_INSTALL_NAME_BASE = "@rpath";
1983 - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch";  
1984 - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; 2125 + GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch";
  2126 + INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist";
1985 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 2127 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
1986 - IPHONEOS_DEPLOYMENT_TARGET = 9.0; 2128 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
1987 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 2129 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1988 - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap";  
1989 - PRODUCT_NAME = Alamofire; 2130 + MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap";
  2131 + PRODUCT_NAME = SVProgressHUD;
1990 SDKROOT = iphoneos; 2132 SDKROOT = iphoneos;
1991 SKIP_INSTALL = YES; 2133 SKIP_INSTALL = YES;
1992 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 2134 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
1993 - SWIFT_OPTIMIZATION_LEVEL = "-Onone";  
1994 SWIFT_VERSION = 4.0; 2135 SWIFT_VERSION = 4.0;
1995 TARGETED_DEVICE_FAMILY = "1,2"; 2136 TARGETED_DEVICE_FAMILY = "1,2";
  2137 + VALIDATE_PRODUCT = YES;
1996 VERSIONING_SYSTEM = "apple-generic"; 2138 VERSIONING_SYSTEM = "apple-generic";
1997 VERSION_INFO_PREFIX = ""; 2139 VERSION_INFO_PREFIX = "";
1998 }; 2140 };
1999 - name = Debug; 2141 + name = Release;
2000 }; 2142 };
2001 - 83018C328C9420EE22D60BC4FC7C261D /* Debug */ = { 2143 + AF7FFDF24A1E00A55FA53123567E434F /* Debug */ = {
2002 isa = XCBuildConfiguration; 2144 isa = XCBuildConfiguration;
2003 - baseConfigurationReference = 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */; 2145 + baseConfigurationReference = 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */;
2004 buildSettings = { 2146 buildSettings = {
2005 CODE_SIGN_IDENTITY = ""; 2147 CODE_SIGN_IDENTITY = "";
2006 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 2148 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -2028,9 +2170,9 @@ @@ -2028,9 +2170,9 @@
2028 }; 2170 };
2029 name = Debug; 2171 name = Debug;
2030 }; 2172 };
2031 - 8C67AFC68147451E22867E04C2F78264 /* Debug */ = { 2173 + B0F5F1530D3F4E518BE2B1A52F98487A /* Debug */ = {
2032 isa = XCBuildConfiguration; 2174 isa = XCBuildConfiguration;
2033 - baseConfigurationReference = AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */; 2175 + baseConfigurationReference = 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */;
2034 buildSettings = { 2176 buildSettings = {
2035 CODE_SIGN_IDENTITY = ""; 2177 CODE_SIGN_IDENTITY = "";
2036 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 2178 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -2041,16 +2183,17 @@ @@ -2041,16 +2183,17 @@
2041 DYLIB_COMPATIBILITY_VERSION = 1; 2183 DYLIB_COMPATIBILITY_VERSION = 1;
2042 DYLIB_CURRENT_VERSION = 1; 2184 DYLIB_CURRENT_VERSION = 1;
2043 DYLIB_INSTALL_NAME_BASE = "@rpath"; 2185 DYLIB_INSTALL_NAME_BASE = "@rpath";
2044 - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch";  
2045 - INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; 2186 + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch";
  2187 + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist";
2046 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 2188 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2047 IPHONEOS_DEPLOYMENT_TARGET = 8.0; 2189 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2048 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 2190 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2049 - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap";  
2050 - PRODUCT_NAME = SDWebImage; 2191 + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap";
  2192 + PRODUCT_NAME = Alamofire;
2051 SDKROOT = iphoneos; 2193 SDKROOT = iphoneos;
2052 SKIP_INSTALL = YES; 2194 SKIP_INSTALL = YES;
2053 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 2195 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2196 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
2054 SWIFT_VERSION = 4.0; 2197 SWIFT_VERSION = 4.0;
2055 TARGETED_DEVICE_FAMILY = "1,2"; 2198 TARGETED_DEVICE_FAMILY = "1,2";
2056 VERSIONING_SYSTEM = "apple-generic"; 2199 VERSIONING_SYSTEM = "apple-generic";
@@ -2058,9 +2201,9 @@ @@ -2058,9 +2201,9 @@
2058 }; 2201 };
2059 name = Debug; 2202 name = Debug;
2060 }; 2203 };
2061 - A8F73C58AFDC02718271B7541ABA62EF /* Release */ = { 2204 + B8CA02655A4B738D82484691EE8CA58F /* Release */ = {
2062 isa = XCBuildConfiguration; 2205 isa = XCBuildConfiguration;
2063 - baseConfigurationReference = 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */; 2206 + baseConfigurationReference = 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */;
2064 buildSettings = { 2207 buildSettings = {
2065 CODE_SIGN_IDENTITY = ""; 2208 CODE_SIGN_IDENTITY = "";
2066 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 2209 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -2071,16 +2214,17 @@ @@ -2071,16 +2214,17 @@
2071 DYLIB_COMPATIBILITY_VERSION = 1; 2214 DYLIB_COMPATIBILITY_VERSION = 1;
2072 DYLIB_CURRENT_VERSION = 1; 2215 DYLIB_CURRENT_VERSION = 1;
2073 DYLIB_INSTALL_NAME_BASE = "@rpath"; 2216 DYLIB_INSTALL_NAME_BASE = "@rpath";
2074 - GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch";  
2075 - INFOPLIST_FILE = "Target Support Files/Toast/Info.plist"; 2217 + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch";
  2218 + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist";
2076 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 2219 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2077 IPHONEOS_DEPLOYMENT_TARGET = 8.0; 2220 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2078 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 2221 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2079 - MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap";  
2080 - PRODUCT_NAME = Toast; 2222 + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap";
  2223 + PRODUCT_NAME = Alamofire;
2081 SDKROOT = iphoneos; 2224 SDKROOT = iphoneos;
2082 SKIP_INSTALL = YES; 2225 SKIP_INSTALL = YES;
2083 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 2226 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2227 + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
2084 SWIFT_VERSION = 4.0; 2228 SWIFT_VERSION = 4.0;
2085 TARGETED_DEVICE_FAMILY = "1,2"; 2229 TARGETED_DEVICE_FAMILY = "1,2";
2086 VALIDATE_PRODUCT = YES; 2230 VALIDATE_PRODUCT = YES;
@@ -2089,9 +2233,9 @@ @@ -2089,9 +2233,9 @@
2089 }; 2233 };
2090 name = Release; 2234 name = Release;
2091 }; 2235 };
2092 - C86EB4C0D42E7F340560C1573F6E52EF /* Release */ = { 2236 + BC0919D3961516E30D282E56DF28529F /* Release */ = {
2093 isa = XCBuildConfiguration; 2237 isa = XCBuildConfiguration;
2094 - baseConfigurationReference = AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */; 2238 + baseConfigurationReference = 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */;
2095 buildSettings = { 2239 buildSettings = {
2096 CODE_SIGN_IDENTITY = ""; 2240 CODE_SIGN_IDENTITY = "";
2097 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 2241 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -2102,13 +2246,74 @@ @@ -2102,13 +2246,74 @@
2102 DYLIB_COMPATIBILITY_VERSION = 1; 2246 DYLIB_COMPATIBILITY_VERSION = 1;
2103 DYLIB_CURRENT_VERSION = 1; 2247 DYLIB_CURRENT_VERSION = 1;
2104 DYLIB_INSTALL_NAME_BASE = "@rpath"; 2248 DYLIB_INSTALL_NAME_BASE = "@rpath";
2105 - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch";  
2106 - INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; 2249 + GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch";
  2250 + INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist";
2107 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 2251 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2108 IPHONEOS_DEPLOYMENT_TARGET = 8.0; 2252 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2109 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 2253 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2110 - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap";  
2111 - PRODUCT_NAME = SDWebImage; 2254 + MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap";
  2255 + PRODUCT_NAME = XRCarouselView;
  2256 + SDKROOT = iphoneos;
  2257 + SKIP_INSTALL = YES;
  2258 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2259 + SWIFT_VERSION = 4.0;
  2260 + TARGETED_DEVICE_FAMILY = "1,2";
  2261 + VALIDATE_PRODUCT = YES;
  2262 + VERSIONING_SYSTEM = "apple-generic";
  2263 + VERSION_INFO_PREFIX = "";
  2264 + };
  2265 + name = Release;
  2266 + };
  2267 + BD00D4A34DF117B5E5F247BF620396C1 /* Debug */ = {
  2268 + isa = XCBuildConfiguration;
  2269 + baseConfigurationReference = 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */;
  2270 + buildSettings = {
  2271 + CODE_SIGN_IDENTITY = "";
  2272 + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
  2273 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
  2274 + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
  2275 + CURRENT_PROJECT_VERSION = 1;
  2276 + DEFINES_MODULE = YES;
  2277 + DYLIB_COMPATIBILITY_VERSION = 1;
  2278 + DYLIB_CURRENT_VERSION = 1;
  2279 + DYLIB_INSTALL_NAME_BASE = "@rpath";
  2280 + GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch";
  2281 + INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist";
  2282 + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
  2283 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2284 + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
  2285 + MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap";
  2286 + PRODUCT_NAME = XRCarouselView;
  2287 + SDKROOT = iphoneos;
  2288 + SKIP_INSTALL = YES;
  2289 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2290 + SWIFT_VERSION = 4.0;
  2291 + TARGETED_DEVICE_FAMILY = "1,2";
  2292 + VERSIONING_SYSTEM = "apple-generic";
  2293 + VERSION_INFO_PREFIX = "";
  2294 + };
  2295 + name = Debug;
  2296 + };
  2297 + DAB4CB471D45F527FCD1AE1F7006EE78 /* Release */ = {
  2298 + isa = XCBuildConfiguration;
  2299 + baseConfigurationReference = 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */;
  2300 + buildSettings = {
  2301 + CODE_SIGN_IDENTITY = "";
  2302 + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
  2303 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
  2304 + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
  2305 + CURRENT_PROJECT_VERSION = 1;
  2306 + DEFINES_MODULE = YES;
  2307 + DYLIB_COMPATIBILITY_VERSION = 1;
  2308 + DYLIB_CURRENT_VERSION = 1;
  2309 + DYLIB_INSTALL_NAME_BASE = "@rpath";
  2310 + GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch";
  2311 + INFOPLIST_FILE = "Target Support Files/Toast/Info.plist";
  2312 + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
  2313 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2314 + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
  2315 + MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap";
  2316 + PRODUCT_NAME = Toast;
2112 SDKROOT = iphoneos; 2317 SDKROOT = iphoneos;
2113 SKIP_INSTALL = YES; 2318 SKIP_INSTALL = YES;
2114 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 2319 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
@@ -2122,7 +2327,7 @@ @@ -2122,7 +2327,7 @@
2122 }; 2327 };
2123 DAE72FF2FFE8166FA938EB388ABBC2B5 /* Debug */ = { 2328 DAE72FF2FFE8166FA938EB388ABBC2B5 /* Debug */ = {
2124 isa = XCBuildConfiguration; 2329 isa = XCBuildConfiguration;
2125 - baseConfigurationReference = 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */; 2330 + baseConfigurationReference = C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */;
2126 buildSettings = { 2331 buildSettings = {
2127 CODE_SIGN_IDENTITY = ""; 2332 CODE_SIGN_IDENTITY = "";
2128 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 2333 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -2151,6 +2356,37 @@ @@ -2151,6 +2356,37 @@
2151 }; 2356 };
2152 name = Debug; 2357 name = Debug;
2153 }; 2358 };
  2359 + E03AFDCBB7483B6A565534D24BB1484D /* Release */ = {
  2360 + isa = XCBuildConfiguration;
  2361 + baseConfigurationReference = 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */;
  2362 + buildSettings = {
  2363 + CODE_SIGN_IDENTITY = "";
  2364 + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
  2365 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
  2366 + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
  2367 + CURRENT_PROJECT_VERSION = 1;
  2368 + DEFINES_MODULE = YES;
  2369 + DYLIB_COMPATIBILITY_VERSION = 1;
  2370 + DYLIB_CURRENT_VERSION = 1;
  2371 + DYLIB_INSTALL_NAME_BASE = "@rpath";
  2372 + GCC_PREFIX_HEADER = "Target Support Files/Reachability/Reachability-prefix.pch";
  2373 + INFOPLIST_FILE = "Target Support Files/Reachability/Info.plist";
  2374 + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
  2375 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2376 + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
  2377 + MODULEMAP_FILE = "Target Support Files/Reachability/Reachability.modulemap";
  2378 + PRODUCT_NAME = Reachability;
  2379 + SDKROOT = iphoneos;
  2380 + SKIP_INSTALL = YES;
  2381 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2382 + SWIFT_VERSION = 4.0;
  2383 + TARGETED_DEVICE_FAMILY = "1,2";
  2384 + VALIDATE_PRODUCT = YES;
  2385 + VERSIONING_SYSTEM = "apple-generic";
  2386 + VERSION_INFO_PREFIX = "";
  2387 + };
  2388 + name = Release;
  2389 + };
2154 E2BF6D6731C31DE69900B7B24E6F0445 /* Debug */ = { 2390 E2BF6D6731C31DE69900B7B24E6F0445 /* Debug */ = {
2155 isa = XCBuildConfiguration; 2391 isa = XCBuildConfiguration;
2156 buildSettings = { 2392 buildSettings = {
@@ -2214,41 +2450,9 @@ @@ -2214,41 +2450,9 @@
2214 }; 2450 };
2215 name = Debug; 2451 name = Debug;
2216 }; 2452 };
2217 - ECB5142D4DABB45B92371C51B3EB61F8 /* Release */ = {  
2218 - isa = XCBuildConfiguration;  
2219 - baseConfigurationReference = 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */;  
2220 - buildSettings = {  
2221 - CODE_SIGN_IDENTITY = "";  
2222 - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";  
2223 - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";  
2224 - "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";  
2225 - CURRENT_PROJECT_VERSION = 1;  
2226 - DEFINES_MODULE = YES;  
2227 - DYLIB_COMPATIBILITY_VERSION = 1;  
2228 - DYLIB_CURRENT_VERSION = 1;  
2229 - DYLIB_INSTALL_NAME_BASE = "@rpath";  
2230 - GCC_PREFIX_HEADER = "Target Support Files/HandyJSON/HandyJSON-prefix.pch";  
2231 - INFOPLIST_FILE = "Target Support Files/HandyJSON/Info.plist";  
2232 - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";  
2233 - IPHONEOS_DEPLOYMENT_TARGET = 8.0;  
2234 - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";  
2235 - MODULEMAP_FILE = "Target Support Files/HandyJSON/HandyJSON.modulemap";  
2236 - PRODUCT_NAME = HandyJSON;  
2237 - SDKROOT = iphoneos;  
2238 - SKIP_INSTALL = YES;  
2239 - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";  
2240 - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";  
2241 - SWIFT_VERSION = 4.0;  
2242 - TARGETED_DEVICE_FAMILY = "1,2";  
2243 - VALIDATE_PRODUCT = YES;  
2244 - VERSIONING_SYSTEM = "apple-generic";  
2245 - VERSION_INFO_PREFIX = "";  
2246 - };  
2247 - name = Release;  
2248 - };  
2249 - EF0EA84D551F1A4F1232F2684FE87AD0 /* Debug */ = { 2453 + E658282DB2599CAD5F6CC833DE3425F9 /* Debug */ = {
2250 isa = XCBuildConfiguration; 2454 isa = XCBuildConfiguration;
2251 - baseConfigurationReference = BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */; 2455 + baseConfigurationReference = 6EB59F100C77215BCBB4FAD12F0FF358 /* Pods-ParentAssistant.debug.xcconfig */;
2252 buildSettings = { 2456 buildSettings = {
2253 CODE_SIGN_IDENTITY = ""; 2457 CODE_SIGN_IDENTITY = "";
2254 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 2458 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -2259,27 +2463,30 @@ @@ -2259,27 +2463,30 @@
2259 DYLIB_COMPATIBILITY_VERSION = 1; 2463 DYLIB_COMPATIBILITY_VERSION = 1;
2260 DYLIB_CURRENT_VERSION = 1; 2464 DYLIB_CURRENT_VERSION = 1;
2261 DYLIB_INSTALL_NAME_BASE = "@rpath"; 2465 DYLIB_INSTALL_NAME_BASE = "@rpath";
2262 - GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch";  
2263 - INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist"; 2466 + INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist";
2264 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 2467 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2265 - IPHONEOS_DEPLOYMENT_TARGET = 8.0; 2468 + IPHONEOS_DEPLOYMENT_TARGET = 9.0;
2266 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 2469 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2267 - MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap";  
2268 - PRODUCT_NAME = SwiftHash; 2470 + MACH_O_TYPE = staticlib;
  2471 + MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap";
  2472 + OTHER_LDFLAGS = "";
  2473 + OTHER_LIBTOOLFLAGS = "";
  2474 + PODS_ROOT = "$(SRCROOT)";
  2475 + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
  2476 + PRODUCT_NAME = Pods_ParentAssistant;
2269 SDKROOT = iphoneos; 2477 SDKROOT = iphoneos;
2270 SKIP_INSTALL = YES; 2478 SKIP_INSTALL = YES;
2271 - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 2479 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
2272 SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 2480 SWIFT_OPTIMIZATION_LEVEL = "-Onone";
2273 - SWIFT_VERSION = 4.0;  
2274 TARGETED_DEVICE_FAMILY = "1,2"; 2481 TARGETED_DEVICE_FAMILY = "1,2";
2275 VERSIONING_SYSTEM = "apple-generic"; 2482 VERSIONING_SYSTEM = "apple-generic";
2276 VERSION_INFO_PREFIX = ""; 2483 VERSION_INFO_PREFIX = "";
2277 }; 2484 };
2278 name = Debug; 2485 name = Debug;
2279 }; 2486 };
2280 - F9A4D3888E109251ADAC60180BC1B773 /* Release */ = { 2487 + ECB5142D4DABB45B92371C51B3EB61F8 /* Release */ = {
2281 isa = XCBuildConfiguration; 2488 isa = XCBuildConfiguration;
2282 - baseConfigurationReference = 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */; 2489 + baseConfigurationReference = C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */;
2283 buildSettings = { 2490 buildSettings = {
2284 CODE_SIGN_IDENTITY = ""; 2491 CODE_SIGN_IDENTITY = "";
2285 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 2492 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
@@ -2290,16 +2497,17 @@ @@ -2290,16 +2497,17 @@
2290 DYLIB_COMPATIBILITY_VERSION = 1; 2497 DYLIB_COMPATIBILITY_VERSION = 1;
2291 DYLIB_CURRENT_VERSION = 1; 2498 DYLIB_CURRENT_VERSION = 1;
2292 DYLIB_INSTALL_NAME_BASE = "@rpath"; 2499 DYLIB_INSTALL_NAME_BASE = "@rpath";
2293 - GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch";  
2294 - INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist"; 2500 + GCC_PREFIX_HEADER = "Target Support Files/HandyJSON/HandyJSON-prefix.pch";
  2501 + INFOPLIST_FILE = "Target Support Files/HandyJSON/Info.plist";
2295 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 2502 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2296 IPHONEOS_DEPLOYMENT_TARGET = 8.0; 2503 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2297 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 2504 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2298 - MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap";  
2299 - PRODUCT_NAME = XRCarouselView; 2505 + MODULEMAP_FILE = "Target Support Files/HandyJSON/HandyJSON.modulemap";
  2506 + PRODUCT_NAME = HandyJSON;
2300 SDKROOT = iphoneos; 2507 SDKROOT = iphoneos;
2301 SKIP_INSTALL = YES; 2508 SKIP_INSTALL = YES;
2302 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 2509 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2510 + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
2303 SWIFT_VERSION = 4.0; 2511 SWIFT_VERSION = 4.0;
2304 TARGETED_DEVICE_FAMILY = "1,2"; 2512 TARGETED_DEVICE_FAMILY = "1,2";
2305 VALIDATE_PRODUCT = YES; 2513 VALIDATE_PRODUCT = YES;
@@ -2311,6 +2519,15 @@ @@ -2311,6 +2519,15 @@
2311 /* End XCBuildConfiguration section */ 2519 /* End XCBuildConfiguration section */
2312 2520
2313 /* Begin XCConfigurationList section */ 2521 /* Begin XCConfigurationList section */
  2522 + 01F2198AF9DCCF3700AE9DD21E64D480 /* Build configuration list for PBXNativeTarget "AlamofireImage" */ = {
  2523 + isa = XCConfigurationList;
  2524 + buildConfigurations = (
  2525 + 751B90BBDF8E0306B9FEBD3AFC3D32D5 /* Debug */,
  2526 + 1C5DAB39976688A93021E071A70593C0 /* Release */,
  2527 + );
  2528 + defaultConfigurationIsVisible = 0;
  2529 + defaultConfigurationName = Release;
  2530 + };
2314 184303B9B5FF90B2017E4D0073BC6423 /* Build configuration list for PBXNativeTarget "HandyJSON" */ = { 2531 184303B9B5FF90B2017E4D0073BC6423 /* Build configuration list for PBXNativeTarget "HandyJSON" */ = {
2315 isa = XCConfigurationList; 2532 isa = XCConfigurationList;
2316 buildConfigurations = ( 2533 buildConfigurations = (
@@ -2320,20 +2537,20 @@ @@ -2320,20 +2537,20 @@
2320 defaultConfigurationIsVisible = 0; 2537 defaultConfigurationIsVisible = 0;
2321 defaultConfigurationName = Release; 2538 defaultConfigurationName = Release;
2322 }; 2539 };
2323 - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 2540 + 1CEF6058AA58F732B5DE35ABEA2BB8C8 /* Build configuration list for PBXNativeTarget "Toast" */ = {
2324 isa = XCConfigurationList; 2541 isa = XCConfigurationList;
2325 buildConfigurations = ( 2542 buildConfigurations = (
2326 - E2BF6D6731C31DE69900B7B24E6F0445 /* Debug */,  
2327 - 26F954BA177A9A46FFFD4E23ED11D67A /* Release */, 2543 + 48B91C10F0EB0CF2F5206AB95226AC0E /* Debug */,
  2544 + DAB4CB471D45F527FCD1AE1F7006EE78 /* Release */,
2328 ); 2545 );
2329 defaultConfigurationIsVisible = 0; 2546 defaultConfigurationIsVisible = 0;
2330 defaultConfigurationName = Release; 2547 defaultConfigurationName = Release;
2331 }; 2548 };
2332 - 3EC2F42A94017DE0B0E897EBD57D8A00 /* Build configuration list for PBXNativeTarget "SwiftHash" */ = { 2549 + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = {
2333 isa = XCConfigurationList; 2550 isa = XCConfigurationList;
2334 buildConfigurations = ( 2551 buildConfigurations = (
2335 - EF0EA84D551F1A4F1232F2684FE87AD0 /* Debug */,  
2336 - 2399E3FF594AB08E0DAC9484992C0F91 /* Release */, 2552 + E2BF6D6731C31DE69900B7B24E6F0445 /* Debug */,
  2553 + 26F954BA177A9A46FFFD4E23ED11D67A /* Release */,
2337 ); 2554 );
2338 defaultConfigurationIsVisible = 0; 2555 defaultConfigurationIsVisible = 0;
2339 defaultConfigurationName = Release; 2556 defaultConfigurationName = Release;
@@ -2341,44 +2558,44 @@ @@ -2341,44 +2558,44 @@
2341 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */ = { 2558 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */ = {
2342 isa = XCConfigurationList; 2559 isa = XCConfigurationList;
2343 buildConfigurations = ( 2560 buildConfigurations = (
2344 - 8056BF0CAA9260FAFEF0C71AA27ED129 /* Debug */,  
2345 - 68EC31FD5ED5128B6144732DB7C7AEAA /* Release */, 2561 + B0F5F1530D3F4E518BE2B1A52F98487A /* Debug */,
  2562 + B8CA02655A4B738D82484691EE8CA58F /* Release */,
2346 ); 2563 );
2347 defaultConfigurationIsVisible = 0; 2564 defaultConfigurationIsVisible = 0;
2348 defaultConfigurationName = Release; 2565 defaultConfigurationName = Release;
2349 }; 2566 };
2350 - 4B18822C8ECAB5D855CCE64E74C621EB /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { 2567 + 4C801EC31238E6F547E7192FDC9AD054 /* Build configuration list for PBXNativeTarget "XRCarouselView" */ = {
2351 isa = XCConfigurationList; 2568 isa = XCConfigurationList;
2352 buildConfigurations = ( 2569 buildConfigurations = (
2353 - 8C67AFC68147451E22867E04C2F78264 /* Debug */,  
2354 - C86EB4C0D42E7F340560C1573F6E52EF /* Release */, 2570 + BD00D4A34DF117B5E5F247BF620396C1 /* Debug */,
  2571 + BC0919D3961516E30D282E56DF28529F /* Release */,
2355 ); 2572 );
2356 defaultConfigurationIsVisible = 0; 2573 defaultConfigurationIsVisible = 0;
2357 defaultConfigurationName = Release; 2574 defaultConfigurationName = Release;
2358 }; 2575 };
2359 - 5AD50E3B4812FC9FAE4961CBCA56B874 /* Build configuration list for PBXNativeTarget "Reachability" */ = { 2576 + 58F24DE1FC95F96D43F56B9CC6D0B926 /* Build configuration list for PBXNativeTarget "SwiftHash" */ = {
2360 isa = XCConfigurationList; 2577 isa = XCConfigurationList;
2361 buildConfigurations = ( 2578 buildConfigurations = (
2362 - 83018C328C9420EE22D60BC4FC7C261D /* Debug */,  
2363 - 20A33051E49990EF2F5D75016374151E /* Release */, 2579 + 0C3F011A578A68CF86694EAD254E6E23 /* Debug */,
  2580 + 11480927D0D767066580AF486506DDA6 /* Release */,
2364 ); 2581 );
2365 defaultConfigurationIsVisible = 0; 2582 defaultConfigurationIsVisible = 0;
2366 defaultConfigurationName = Release; 2583 defaultConfigurationName = Release;
2367 }; 2584 };
2368 - 7700DD54DACF55CC6BABF28FFCAB0179 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */ = { 2585 + 70F92D3F8B893481FDA768F4EB8E9118 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = {
2369 isa = XCConfigurationList; 2586 isa = XCConfigurationList;
2370 buildConfigurations = ( 2587 buildConfigurations = (
2371 - 205040859FD37102CD356142F35D96D4 /* Debug */,  
2372 - 601BFB40515FF6C016B5850C2D905027 /* Release */, 2588 + 1F859CD6F320ED91E304126AE9B41213 /* Debug */,
  2589 + 2DA5E368920A110F6198A53CE954D348 /* Release */,
2373 ); 2590 );
2374 defaultConfigurationIsVisible = 0; 2591 defaultConfigurationIsVisible = 0;
2375 defaultConfigurationName = Release; 2592 defaultConfigurationName = Release;
2376 }; 2593 };
2377 - A4FA017D8C4362BABA6CC461A244CB9D /* Build configuration list for PBXNativeTarget "XRCarouselView" */ = { 2594 + 76E43176855F8CE556CB459D4CF15C83 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */ = {
2378 isa = XCConfigurationList; 2595 isa = XCConfigurationList;
2379 buildConfigurations = ( 2596 buildConfigurations = (
2380 - 2386F65ABDB52652A92CBEE14C73BA07 /* Debug */,  
2381 - F9A4D3888E109251ADAC60180BC1B773 /* Release */, 2597 + E658282DB2599CAD5F6CC833DE3425F9 /* Debug */,
  2598 + 1F40ECCA7544B21AE3F93FCA732FF525 /* Release */,
2382 ); 2599 );
2383 defaultConfigurationIsVisible = 0; 2600 defaultConfigurationIsVisible = 0;
2384 defaultConfigurationName = Release; 2601 defaultConfigurationName = Release;
@@ -2392,20 +2609,20 @@ @@ -2392,20 +2609,20 @@
2392 defaultConfigurationIsVisible = 0; 2609 defaultConfigurationIsVisible = 0;
2393 defaultConfigurationName = Release; 2610 defaultConfigurationName = Release;
2394 }; 2611 };
2395 - EAC632F2AAB82F696A1E5C88D53A883E /* Build configuration list for PBXNativeTarget "SVProgressHUD" */ = { 2612 + C3C11F185D4F7CF61CB8BBE64492631D /* Build configuration list for PBXNativeTarget "Reachability" */ = {
2396 isa = XCConfigurationList; 2613 isa = XCConfigurationList;
2397 buildConfigurations = ( 2614 buildConfigurations = (
2398 - 3D9BEB881A70984931EB7B52EB42D89C /* Debug */,  
2399 - 51211605D5BBC568B59C86BC410917A5 /* Release */, 2615 + AF7FFDF24A1E00A55FA53123567E434F /* Debug */,
  2616 + E03AFDCBB7483B6A565534D24BB1484D /* Release */,
2400 ); 2617 );
2401 defaultConfigurationIsVisible = 0; 2618 defaultConfigurationIsVisible = 0;
2402 defaultConfigurationName = Release; 2619 defaultConfigurationName = Release;
2403 }; 2620 };
2404 - F11A26D3E7766CBBD820DCD66B6FC321 /* Build configuration list for PBXNativeTarget "Toast" */ = { 2621 + FA57B4E379EB61FD555A1581DE341347 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */ = {
2405 isa = XCConfigurationList; 2622 isa = XCConfigurationList;
2406 buildConfigurations = ( 2623 buildConfigurations = (
2407 - 215A480FCE0C128FA2F4C2A2882BBE23 /* Debug */,  
2408 - A8F73C58AFDC02718271B7541ABA62EF /* Release */, 2624 + 5D34B066ADCE4D5A36DAF77492279C57 /* Debug */,
  2625 + 8F127F4A0150651E07D4FA5346BC4AAC /* Release */,
2409 ); 2626 );
2410 defaultConfigurationIsVisible = 0; 2627 defaultConfigurationIsVisible = 0;
2411 defaultConfigurationName = Release; 2628 defaultConfigurationName = Release;
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/AlamofireImage.xcscheme 0 → 100644
@@ -0,0 +1,60 @@ @@ -0,0 +1,60 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Scheme
  3 + LastUpgradeVersion = "0930"
  4 + version = "1.3">
  5 + <BuildAction
  6 + parallelizeBuildables = "YES"
  7 + buildImplicitDependencies = "YES">
  8 + <BuildActionEntries>
  9 + <BuildActionEntry
  10 + buildForAnalyzing = "YES"
  11 + buildForTesting = "YES"
  12 + buildForRunning = "YES"
  13 + buildForProfiling = "YES"
  14 + buildForArchiving = "YES">
  15 + <BuildableReference
  16 + BuildableIdentifier = "primary"
  17 + BlueprintIdentifier = "9EFE4C70245EE2857D336B8B9FA4E825"
  18 + BlueprintName = "AlamofireImage"
  19 + ReferencedContainer = "container:Pods.xcodeproj"
  20 + BuildableName = "AlamofireImage.framework">
  21 + </BuildableReference>
  22 + </BuildActionEntry>
  23 + </BuildActionEntries>
  24 + </BuildAction>
  25 + <TestAction
  26 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
  27 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
  28 + shouldUseLaunchSchemeArgsEnv = "YES"
  29 + buildConfiguration = "Debug">
  30 + <AdditionalOptions>
  31 + </AdditionalOptions>
  32 + </TestAction>
  33 + <LaunchAction
  34 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
  35 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
  36 + launchStyle = "0"
  37 + useCustomWorkingDirectory = "NO"
  38 + ignoresPersistentStateOnLaunch = "NO"
  39 + debugDocumentVersioning = "YES"
  40 + debugServiceExtension = "internal"
  41 + buildConfiguration = "Debug"
  42 + allowLocationSimulation = "YES">
  43 + <AdditionalOptions>
  44 + </AdditionalOptions>
  45 + </LaunchAction>
  46 + <ProfileAction
  47 + savedToolIdentifier = ""
  48 + useCustomWorkingDirectory = "NO"
  49 + debugDocumentVersioning = "YES"
  50 + buildConfiguration = "Release"
  51 + shouldUseLaunchSchemeArgsEnv = "YES">
  52 + </ProfileAction>
  53 + <AnalyzeAction
  54 + buildConfiguration = "Debug">
  55 + </AnalyzeAction>
  56 + <ArchiveAction
  57 + buildConfiguration = "Release"
  58 + revealArchiveInOrganizer = "YES">
  59 + </ArchiveAction>
  60 +</Scheme>
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Pods-ParentAssistant.xcscheme
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 buildForAnalyzing = "YES"> 14 buildForAnalyzing = "YES">
15 <BuildableReference 15 <BuildableReference
16 BuildableIdentifier = "primary" 16 BuildableIdentifier = "primary"
17 - BlueprintIdentifier = "89B82C8C6E32CEBE5ACCD75CDFBECBB1" 17 + BlueprintIdentifier = "3DE44D61FA676CE3B5DFDE6DC058A636"
18 BuildableName = "Pods_ParentAssistant.framework" 18 BuildableName = "Pods_ParentAssistant.framework"
19 BlueprintName = "Pods-ParentAssistant" 19 BlueprintName = "Pods-ParentAssistant"
20 ReferencedContainer = "container:Pods.xcodeproj"> 20 ReferencedContainer = "container:Pods.xcodeproj">
@@ -45,7 +45,7 @@ @@ -45,7 +45,7 @@
45 <MacroExpansion> 45 <MacroExpansion>
46 <BuildableReference 46 <BuildableReference
47 BuildableIdentifier = "primary" 47 BuildableIdentifier = "primary"
48 - BlueprintIdentifier = "89B82C8C6E32CEBE5ACCD75CDFBECBB1" 48 + BlueprintIdentifier = "3DE44D61FA676CE3B5DFDE6DC058A636"
49 BuildableName = "Pods_ParentAssistant.framework" 49 BuildableName = "Pods_ParentAssistant.framework"
50 BlueprintName = "Pods-ParentAssistant" 50 BlueprintName = "Pods-ParentAssistant"
51 ReferencedContainer = "container:Pods.xcodeproj"> 51 ReferencedContainer = "container:Pods.xcodeproj">
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Reachability.xcscheme
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 buildForArchiving = "YES"> 14 buildForArchiving = "YES">
15 <BuildableReference 15 <BuildableReference
16 BuildableIdentifier = "primary" 16 BuildableIdentifier = "primary"
17 - BlueprintIdentifier = "AAC4087A5A57F5566AB9B54FEBADBC36" 17 + BlueprintIdentifier = "CE1092398200ECC7DE7468626D1D0B98"
18 BlueprintName = "Reachability" 18 BlueprintName = "Reachability"
19 ReferencedContainer = "container:Pods.xcodeproj" 19 ReferencedContainer = "container:Pods.xcodeproj"
20 BuildableName = "Reachability.framework"> 20 BuildableName = "Reachability.framework">
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SDWebImage.xcscheme
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 buildForArchiving = "YES"> 14 buildForArchiving = "YES">
15 <BuildableReference 15 <BuildableReference
16 BuildableIdentifier = "primary" 16 BuildableIdentifier = "primary"
17 - BlueprintIdentifier = "8FA4EA707F3B6CFDACB1C85C722D2E73" 17 + BlueprintIdentifier = "37F4E36BECBDD0070D2501E766C0238B"
18 BlueprintName = "SDWebImage" 18 BlueprintName = "SDWebImage"
19 ReferencedContainer = "container:Pods.xcodeproj" 19 ReferencedContainer = "container:Pods.xcodeproj"
20 BuildableName = "SDWebImage.framework"> 20 BuildableName = "SDWebImage.framework">
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SVProgressHUD.xcscheme
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 buildForArchiving = "YES"> 14 buildForArchiving = "YES">
15 <BuildableReference 15 <BuildableReference
16 BuildableIdentifier = "primary" 16 BuildableIdentifier = "primary"
17 - BlueprintIdentifier = "E55BDEBC8F73D6B7936791D0822F70D6" 17 + BlueprintIdentifier = "637267420040487628765A2667620742"
18 BlueprintName = "SVProgressHUD" 18 BlueprintName = "SVProgressHUD"
19 ReferencedContainer = "container:Pods.xcodeproj" 19 ReferencedContainer = "container:Pods.xcodeproj"
20 BuildableName = "SVProgressHUD.framework"> 20 BuildableName = "SVProgressHUD.framework">
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SwiftHash.xcscheme
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 buildForArchiving = "YES"> 14 buildForArchiving = "YES">
15 <BuildableReference 15 <BuildableReference
16 BuildableIdentifier = "primary" 16 BuildableIdentifier = "primary"
17 - BlueprintIdentifier = "6376DC419EEA98495631602218A4F31B" 17 + BlueprintIdentifier = "A0A5E57D4BB5AA2602B591D713407086"
18 BlueprintName = "SwiftHash" 18 BlueprintName = "SwiftHash"
19 ReferencedContainer = "container:Pods.xcodeproj" 19 ReferencedContainer = "container:Pods.xcodeproj"
20 BuildableName = "SwiftHash.framework"> 20 BuildableName = "SwiftHash.framework">
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Toast.xcscheme
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 buildForArchiving = "YES"> 14 buildForArchiving = "YES">
15 <BuildableReference 15 <BuildableReference
16 BuildableIdentifier = "primary" 16 BuildableIdentifier = "primary"
17 - BlueprintIdentifier = "9A9DDC64623B3F5E6DC7009C16752B95" 17 + BlueprintIdentifier = "620180280B57A3DF973662E546D211E4"
18 BlueprintName = "Toast" 18 BlueprintName = "Toast"
19 ReferencedContainer = "container:Pods.xcodeproj" 19 ReferencedContainer = "container:Pods.xcodeproj"
20 BuildableName = "Toast.framework"> 20 BuildableName = "Toast.framework">
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/XRCarouselView.xcscheme
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 buildForArchiving = "YES"> 14 buildForArchiving = "YES">
15 <BuildableReference 15 <BuildableReference
16 BuildableIdentifier = "primary" 16 BuildableIdentifier = "primary"
17 - BlueprintIdentifier = "27189F0EDBCA8831C460D0166F6F37A1" 17 + BlueprintIdentifier = "0A4402E270B0A4B00A031931BD805EF1"
18 BlueprintName = "XRCarouselView" 18 BlueprintName = "XRCarouselView"
19 ReferencedContainer = "container:Pods.xcodeproj" 19 ReferencedContainer = "container:Pods.xcodeproj"
20 BuildableName = "XRCarouselView.framework"> 20 BuildableName = "XRCarouselView.framework">
ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -11,69 +11,76 @@ @@ -11,69 +11,76 @@
11 <key>orderHint</key> 11 <key>orderHint</key>
12 <integer>0</integer> 12 <integer>0</integer>
13 </dict> 13 </dict>
14 - <key>DZNEmptyDataSet.xcscheme</key> 14 + <key>AlamofireImage.xcscheme</key>
15 <dict> 15 <dict>
16 <key>isShown</key> 16 <key>isShown</key>
17 <false/> 17 <false/>
18 <key>orderHint</key> 18 <key>orderHint</key>
19 <integer>1</integer> 19 <integer>1</integer>
20 </dict> 20 </dict>
21 - <key>HandyJSON.xcscheme</key> 21 + <key>DZNEmptyDataSet.xcscheme</key>
22 <dict> 22 <dict>
23 <key>isShown</key> 23 <key>isShown</key>
24 <false/> 24 <false/>
25 <key>orderHint</key> 25 <key>orderHint</key>
26 <integer>2</integer> 26 <integer>2</integer>
27 </dict> 27 </dict>
28 - <key>Pods-ParentAssistant.xcscheme</key> 28 + <key>HandyJSON.xcscheme</key>
29 <dict> 29 <dict>
30 <key>isShown</key> 30 <key>isShown</key>
31 <false/> 31 <false/>
32 <key>orderHint</key> 32 <key>orderHint</key>
33 <integer>3</integer> 33 <integer>3</integer>
34 </dict> 34 </dict>
35 - <key>Reachability.xcscheme</key> 35 + <key>Pods-ParentAssistant.xcscheme</key>
36 <dict> 36 <dict>
37 <key>isShown</key> 37 <key>isShown</key>
38 <false/> 38 <false/>
39 <key>orderHint</key> 39 <key>orderHint</key>
40 <integer>4</integer> 40 <integer>4</integer>
41 </dict> 41 </dict>
42 - <key>SDWebImage.xcscheme</key> 42 + <key>Reachability.xcscheme</key>
43 <dict> 43 <dict>
44 <key>isShown</key> 44 <key>isShown</key>
45 <false/> 45 <false/>
46 <key>orderHint</key> 46 <key>orderHint</key>
47 <integer>5</integer> 47 <integer>5</integer>
48 </dict> 48 </dict>
49 - <key>SVProgressHUD.xcscheme</key> 49 + <key>SDWebImage.xcscheme</key>
50 <dict> 50 <dict>
51 <key>isShown</key> 51 <key>isShown</key>
52 <false/> 52 <false/>
53 <key>orderHint</key> 53 <key>orderHint</key>
54 <integer>6</integer> 54 <integer>6</integer>
55 </dict> 55 </dict>
56 - <key>SwiftHash.xcscheme</key> 56 + <key>SVProgressHUD.xcscheme</key>
57 <dict> 57 <dict>
58 <key>isShown</key> 58 <key>isShown</key>
59 <false/> 59 <false/>
60 <key>orderHint</key> 60 <key>orderHint</key>
61 <integer>7</integer> 61 <integer>7</integer>
62 </dict> 62 </dict>
63 - <key>Toast.xcscheme</key> 63 + <key>SwiftHash.xcscheme</key>
64 <dict> 64 <dict>
65 <key>isShown</key> 65 <key>isShown</key>
66 <false/> 66 <false/>
67 <key>orderHint</key> 67 <key>orderHint</key>
68 <integer>8</integer> 68 <integer>8</integer>
69 </dict> 69 </dict>
70 - <key>XRCarouselView.xcscheme</key> 70 + <key>Toast.xcscheme</key>
71 <dict> 71 <dict>
72 <key>isShown</key> 72 <key>isShown</key>
73 <false/> 73 <false/>
74 <key>orderHint</key> 74 <key>orderHint</key>
75 <integer>9</integer> 75 <integer>9</integer>
76 </dict> 76 </dict>
  77 + <key>XRCarouselView.xcscheme</key>
  78 + <dict>
  79 + <key>isShown</key>
  80 + <false/>
  81 + <key>orderHint</key>
  82 + <integer>10</integer>
  83 + </dict>
77 </dict> 84 </dict>
78 <key>SuppressBuildableAutocreation</key> 85 <key>SuppressBuildableAutocreation</key>
79 <dict/> 86 <dict/>
ParentAssistant/Pods/Target Support Files/Alamofire/Info.plist
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 <key>CFBundlePackageType</key> 15 <key>CFBundlePackageType</key>
16 <string>FMWK</string> 16 <string>FMWK</string>
17 <key>CFBundleShortVersionString</key> 17 <key>CFBundleShortVersionString</key>
18 - <string>4.0.1</string> 18 + <string>4.7.2</string>
19 <key>CFBundleSignature</key> 19 <key>CFBundleSignature</key>
20 <string>????</string> 20 <string>????</string>
21 <key>CFBundleVersion</key> 21 <key>CFBundleVersion</key>
ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-dummy.m 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +#import <Foundation/Foundation.h>
  2 +@interface PodsDummy_AlamofireImage : NSObject
  3 +@end
  4 +@implementation PodsDummy_AlamofireImage
  5 +@end
ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-prefix.pch 0 → 100644
@@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
  1 +#ifdef __OBJC__
  2 +#import <UIKit/UIKit.h>
  3 +#else
  4 +#ifndef FOUNDATION_EXPORT
  5 +#if defined(__cplusplus)
  6 +#define FOUNDATION_EXPORT extern "C"
  7 +#else
  8 +#define FOUNDATION_EXPORT extern
  9 +#endif
  10 +#endif
  11 +#endif
  12 +
ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-umbrella.h 0 → 100644
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
  1 +#ifdef __OBJC__
  2 +#import <UIKit/UIKit.h>
  3 +#else
  4 +#ifndef FOUNDATION_EXPORT
  5 +#if defined(__cplusplus)
  6 +#define FOUNDATION_EXPORT extern "C"
  7 +#else
  8 +#define FOUNDATION_EXPORT extern
  9 +#endif
  10 +#endif
  11 +#endif
  12 +
  13 +
  14 +FOUNDATION_EXPORT double AlamofireImageVersionNumber;
  15 +FOUNDATION_EXPORT const unsigned char AlamofireImageVersionString[];
  16 +
ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage.modulemap 0 → 100644
@@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
  1 +framework module AlamofireImage {
  2 + umbrella header "AlamofireImage-umbrella.h"
  3 +
  4 + export *
  5 + module * { export * }
  6 +}
ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage.xcconfig 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AlamofireImage
  2 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire"
  3 +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
  4 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" "${PODS_ROOT}/Headers/Public/UMCAnalytics" "${PODS_ROOT}/Headers/Public/UMCCommon" "${PODS_ROOT}/Headers/Public/UMCErrorCatch" "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
  5 +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" "-suppress-warnings"
  6 +PODS_BUILD_DIR = ${BUILD_DIR}
  7 +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
  8 +PODS_ROOT = ${SRCROOT}
  9 +PODS_TARGET_SRCROOT = ${PODS_ROOT}/AlamofireImage
  10 +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
  11 +SKIP_INSTALL = YES
ParentAssistant/Pods/Target Support Files/AlamofireImage/Info.plist 0 → 100644
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>CFBundleDevelopmentRegion</key>
  6 + <string>en</string>
  7 + <key>CFBundleExecutable</key>
  8 + <string>${EXECUTABLE_NAME}</string>
  9 + <key>CFBundleIdentifier</key>
  10 + <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
  11 + <key>CFBundleInfoDictionaryVersion</key>
  12 + <string>6.0</string>
  13 + <key>CFBundleName</key>
  14 + <string>${PRODUCT_NAME}</string>
  15 + <key>CFBundlePackageType</key>
  16 + <string>FMWK</string>
  17 + <key>CFBundleShortVersionString</key>
  18 + <string>3.3.1</string>
  19 + <key>CFBundleSignature</key>
  20 + <string>????</string>
  21 + <key>CFBundleVersion</key>
  22 + <string>${CURRENT_PROJECT_VERSION}</string>
  23 + <key>NSPrincipalClass</key>
  24 + <string></string>
  25 +</dict>
  26 +</plist>
ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-acknowledgements.markdown
@@ -3,7 +3,30 @@ This application makes use of the following third party libraries: @@ -3,7 +3,30 @@ This application makes use of the following third party libraries:
3 3
4 ## Alamofire 4 ## Alamofire
5 5
6 -Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 6 +Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
  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 +## AlamofireImage
  28 +
  29 +Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
7 30
8 Permission is hereby granted, free of charge, to any person obtaining a copy 31 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 32 of this software and associated documentation files (the "Software"), to deal
ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-acknowledgements.plist
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 </dict> 14 </dict>
15 <dict> 15 <dict>
16 <key>FooterText</key> 16 <key>FooterText</key>
17 - <string>Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 17 + <string>Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
18 18
19 Permission is hereby granted, free of charge, to any person obtaining a copy 19 Permission is hereby granted, free of charge, to any person obtaining a copy
20 of this software and associated documentation files (the "Software"), to deal 20 of this software and associated documentation files (the "Software"), to deal
@@ -43,6 +43,35 @@ THE SOFTWARE. @@ -43,6 +43,35 @@ THE SOFTWARE.
43 </dict> 43 </dict>
44 <dict> 44 <dict>
45 <key>FooterText</key> 45 <key>FooterText</key>
  46 + <string>Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/)
  47 +
  48 +Permission is hereby granted, free of charge, to any person obtaining a copy
  49 +of this software and associated documentation files (the "Software"), to deal
  50 +in the Software without restriction, including without limitation the rights
  51 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  52 +copies of the Software, and to permit persons to whom the Software is
  53 +furnished to do so, subject to the following conditions:
  54 +
  55 +The above copyright notice and this permission notice shall be included in
  56 +all copies or substantial portions of the Software.
  57 +
  58 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  59 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  60 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  61 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  62 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  63 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  64 +THE SOFTWARE.
  65 +</string>
  66 + <key>License</key>
  67 + <string>MIT</string>
  68 + <key>Title</key>
  69 + <string>AlamofireImage</string>
  70 + <key>Type</key>
  71 + <string>PSGroupSpecifier</string>
  72 + </dict>
  73 + <dict>
  74 + <key>FooterText</key>
46 <string>The MIT License (MIT) 75 <string>The MIT License (MIT)
47 76
48 Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl 77 Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl
ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-frameworks.sh
@@ -135,6 +135,7 @@ strip_invalid_archs() { @@ -135,6 +135,7 @@ strip_invalid_archs() {
135 135
136 if [[ "$CONFIGURATION" == "Debug" ]]; then 136 if [[ "$CONFIGURATION" == "Debug" ]]; then
137 install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework" 137 install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework"
  138 + install_framework "${BUILT_PRODUCTS_DIR}/AlamofireImage/AlamofireImage.framework"
138 install_framework "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework" 139 install_framework "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework"
139 install_framework "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework" 140 install_framework "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework"
140 install_framework "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework" 141 install_framework "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework"
@@ -146,6 +147,7 @@ if [[ &quot;$CONFIGURATION&quot; == &quot;Debug&quot; ]]; then @@ -146,6 +147,7 @@ if [[ &quot;$CONFIGURATION&quot; == &quot;Debug&quot; ]]; then
146 fi 147 fi
147 if [[ "$CONFIGURATION" == "Release" ]]; then 148 if [[ "$CONFIGURATION" == "Release" ]]; then
148 install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework" 149 install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework"
  150 + install_framework "${BUILT_PRODUCTS_DIR}/AlamofireImage/AlamofireImage.framework"
149 install_framework "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework" 151 install_framework "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework"
150 install_framework "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework" 152 install_framework "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework"
151 install_framework "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework" 153 install_framework "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework"
ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.debug.xcconfig
1 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 1 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView" "${PODS_ROOT}/NIMSDK_LITE/NIMSDK" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCErrorCatch" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties" 2 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/AlamofireImage" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView" "${PODS_ROOT}/NIMSDK_LITE/NIMSDK" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCErrorCatch" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties"
3 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" "${PODS_ROOT}/Headers/Public/UMCAnalytics" "${PODS_ROOT}/Headers/Public/UMCCommon" "${PODS_ROOT}/Headers/Public/UMCErrorCatch" "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins" 4 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" "${PODS_ROOT}/Headers/Public/UMCAnalytics" "${PODS_ROOT}/Headers/Public/UMCCommon" "${PODS_ROOT}/Headers/Public/UMCErrorCatch" "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
5 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
6 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/NIMSDK_LITE/NIMSDK/Libs" 6 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/NIMSDK_LITE/NIMSDK/Libs"
7 -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON/HandyJSON.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Reachability/Reachability.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash/SwiftHash.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView/XRCarouselView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" -isystem "${PODS_ROOT}/Headers/Public/UMCAnalytics" -isystem "${PODS_ROOT}/Headers/Public/UMCCommon" -isystem "${PODS_ROOT}/Headers/Public/UMCErrorCatch" -isystem "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"  
8 -OTHER_LDFLAGS = $(inherited) -ObjC -l"aacplus" -l"c++" -l"crypto" -l"event" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"z" -framework "AVFoundation" -framework "Alamofire" -framework "AudioToolbox" -framework "CoreMedia" -framework "CoreTelephony" -framework "DZNEmptyDataSet" -framework "HandyJSON" -framework "NIMSDK" -framework "Reachability" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SecurityEnvSDK" -framework "SwiftHash" -framework "SystemConfiguration" -framework "Toast" -framework "UMAnalytics" -framework "UMCommon" -framework "UMErrorCatch" -framework "UTDID" -framework "VideoToolbox" -framework "XRCarouselView" 7 +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AlamofireImage/AlamofireImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON/HandyJSON.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Reachability/Reachability.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash/SwiftHash.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView/XRCarouselView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" -isystem "${PODS_ROOT}/Headers/Public/UMCAnalytics" -isystem "${PODS_ROOT}/Headers/Public/UMCCommon" -isystem "${PODS_ROOT}/Headers/Public/UMCErrorCatch" -isystem "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
  8 +OTHER_LDFLAGS = $(inherited) -ObjC -l"aacplus" -l"c++" -l"crypto" -l"event" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"z" -framework "AVFoundation" -framework "Alamofire" -framework "AlamofireImage" -framework "AudioToolbox" -framework "CoreMedia" -framework "CoreTelephony" -framework "DZNEmptyDataSet" -framework "HandyJSON" -framework "NIMSDK" -framework "Reachability" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SecurityEnvSDK" -framework "SwiftHash" -framework "SystemConfiguration" -framework "Toast" -framework "UMAnalytics" -framework "UMCommon" -framework "UMErrorCatch" -framework "UTDID" -framework "VideoToolbox" -framework "XRCarouselView"
9 OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 9 OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
10 PODS_BUILD_DIR = ${BUILD_DIR} 10 PODS_BUILD_DIR = ${BUILD_DIR}
11 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.release.xcconfig
1 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 1 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView" "${PODS_ROOT}/NIMSDK_LITE/NIMSDK" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCErrorCatch" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties" 2 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/AlamofireImage" "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet" "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView" "${PODS_ROOT}/NIMSDK_LITE/NIMSDK" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCErrorCatch" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties"
3 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" "${PODS_ROOT}/Headers/Public/UMCAnalytics" "${PODS_ROOT}/Headers/Public/UMCCommon" "${PODS_ROOT}/Headers/Public/UMCErrorCatch" "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins" 4 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" "${PODS_ROOT}/Headers/Public/UMCAnalytics" "${PODS_ROOT}/Headers/Public/UMCCommon" "${PODS_ROOT}/Headers/Public/UMCErrorCatch" "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
5 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
6 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/NIMSDK_LITE/NIMSDK/Libs" 6 LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/NIMSDK_LITE/NIMSDK/Libs"
7 -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON/HandyJSON.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Reachability/Reachability.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash/SwiftHash.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView/XRCarouselView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" -isystem "${PODS_ROOT}/Headers/Public/UMCAnalytics" -isystem "${PODS_ROOT}/Headers/Public/UMCCommon" -isystem "${PODS_ROOT}/Headers/Public/UMCErrorCatch" -isystem "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"  
8 -OTHER_LDFLAGS = $(inherited) -ObjC -l"aacplus" -l"c++" -l"crypto" -l"event" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"z" -framework "AVFoundation" -framework "Alamofire" -framework "AudioToolbox" -framework "CoreMedia" -framework "CoreTelephony" -framework "DZNEmptyDataSet" -framework "HandyJSON" -framework "NIMSDK" -framework "Reachability" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SecurityEnvSDK" -framework "SwiftHash" -framework "SystemConfiguration" -framework "Toast" -framework "UMAnalytics" -framework "UMCommon" -framework "UMErrorCatch" -framework "UTDID" -framework "VideoToolbox" -framework "XRCarouselView" 7 +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AlamofireImage/AlamofireImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/HandyJSON/HandyJSON.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Reachability/Reachability.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftHash/SwiftHash.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/XRCarouselView/XRCarouselView.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/NIMSDK_LITE" -isystem "${PODS_ROOT}/Headers/Public/UMCAnalytics" -isystem "${PODS_ROOT}/Headers/Public/UMCCommon" -isystem "${PODS_ROOT}/Headers/Public/UMCErrorCatch" -isystem "${PODS_ROOT}/Headers/Public/UMCSecurityPlugins"
  8 +OTHER_LDFLAGS = $(inherited) -ObjC -l"aacplus" -l"c++" -l"crypto" -l"event" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"z" -framework "AVFoundation" -framework "Alamofire" -framework "AlamofireImage" -framework "AudioToolbox" -framework "CoreMedia" -framework "CoreTelephony" -framework "DZNEmptyDataSet" -framework "HandyJSON" -framework "NIMSDK" -framework "Reachability" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SecurityEnvSDK" -framework "SwiftHash" -framework "SystemConfiguration" -framework "Toast" -framework "UMAnalytics" -framework "UMCommon" -framework "UMErrorCatch" -framework "UTDID" -framework "VideoToolbox" -framework "XRCarouselView"
9 OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 9 OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
10 PODS_BUILD_DIR = ${BUILD_DIR} 10 PODS_BUILD_DIR = ${BUILD_DIR}
11 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)