diff --git a/ParentAssistant/ParentAssistant.xcodeproj/project.pbxproj b/ParentAssistant/ParentAssistant.xcodeproj/project.pbxproj index 272c7b0..78e1737 100644 --- a/ParentAssistant/ParentAssistant.xcodeproj/project.pbxproj +++ b/ParentAssistant/ParentAssistant.xcodeproj/project.pbxproj @@ -80,6 +80,7 @@ ADC9AB88207C940700348EF1 /* ProgramViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC9AB87207C940700348EF1 /* ProgramViewController.swift */; }; ADE33B312062202300BEA6E6 /* Macro.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE33B302062202300BEA6E6 /* Macro.swift */; }; ADF159612069E00000A9485D /* CalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADF159602069E00000A9485D /* CalendarView.swift */; }; + ADF15E7620883D1B00381EE1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ADF15E7520883D1B00381EE1 /* Assets.xcassets */; }; BF388469205A4DE900A240EF /* StudentClassInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF388468205A4DE900A240EF /* StudentClassInfo.swift */; }; BF38846C205A58F800A240EF /* YXMessageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF38846B205A58F800A240EF /* YXMessageManager.swift */; }; BF38846E205A5A0000A240EF /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF38846D205A59FE00A240EF /* MobileCoreServices.framework */; }; @@ -125,7 +126,6 @@ BF7A4C36204CD55300460463 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C35204CD55300460463 /* ViewController.swift */; }; BF7A4C3C204CD55300460463 /* ParentAssistant.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C3A204CD55300460463 /* ParentAssistant.xcdatamodeld */; }; BF7A4C4C204CD55500460463 /* ParentAssistantUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7A4C4B204CD55500460463 /* ParentAssistantUITests.swift */; }; - BF7A4C84204E338500460463 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BF7A4C7E204E338400460463 /* Assets.xcassets */; }; BF7A4C85204E338500460463 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF7A4C7F204E338400460463 /* LaunchScreen.storyboard */; }; BF7A4C86204E338500460463 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF7A4C81204E338400460463 /* Main.storyboard */; }; BFA7443A207DB6EE00845D30 /* ActivationSchoolCardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA74439207DB6EE00845D30 /* ActivationSchoolCardViewController.swift */; }; @@ -258,6 +258,7 @@ ADC9AB87207C940700348EF1 /* ProgramViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgramViewController.swift; sourceTree = ""; }; ADE33B302062202300BEA6E6 /* Macro.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Macro.swift; sourceTree = ""; }; ADF159602069E00000A9485D /* CalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarView.swift; sourceTree = ""; }; + ADF15E7520883D1B00381EE1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; BF388468205A4DE900A240EF /* StudentClassInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudentClassInfo.swift; sourceTree = ""; }; BF38846B205A58F800A240EF /* YXMessageManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YXMessageManager.swift; sourceTree = ""; }; BF38846D205A59FE00A240EF /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; @@ -308,7 +309,6 @@ BF7A4C4B204CD55500460463 /* ParentAssistantUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParentAssistantUITests.swift; sourceTree = ""; }; BF7A4C4D204CD55500460463 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; BF7A4C56204CE7F600460463 /* ParentAssistant-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ParentAssistant-Bridging-Header.h"; sourceTree = ""; }; - BF7A4C7E204E338400460463 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; BF7A4C80204E338400460463 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; BF7A4C82204E338400460463 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; BF7A4C83204E338400460463 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -753,9 +753,9 @@ isa = PBXGroup; children = ( BFEAAADB20525F1F0072FAAF /* PrefixHeader.pch */, - BF7A4C7E204E338400460463 /* Assets.xcassets */, BF7A4C7F204E338400460463 /* LaunchScreen.storyboard */, BF7A4C81204E338400460463 /* Main.storyboard */, + ADF15E7520883D1B00381EE1 /* Assets.xcassets */, BF7A4C83204E338400460463 /* Info.plist */, ); path = "Supporting Files"; @@ -980,6 +980,7 @@ 599364FC204E742000C8B371 /* ChannelSelectViewCollectionViewCell.xib in Resources */, ADC9AB78207C65FC00348EF1 /* GrowSubjectCell.xib in Resources */, ADC9AB80207C672800348EF1 /* SceneTopCell.xib in Resources */, + ADF15E7620883D1B00381EE1 /* Assets.xcassets in Resources */, 599365252050D03900C8B371 /* Evaluation.storyboard in Resources */, 5980BF672061048A00F4A35E /* Address.plist in Resources */, BF38847C205CDE1B00A240EF /* JS.storyboard in Resources */, @@ -1004,7 +1005,6 @@ BF67F3BC20590A2F002FDC61 /* Info-iOS.plist in Resources */, AD4BA4AD20819CAD00F83F13 /* ReportHeaderCollectionViewCell.xib in Resources */, AD64A2C5207F28EB00B25E80 /* ProgramVacateBodyTableViewCell.xib in Resources */, - BF7A4C84204E338500460463 /* Assets.xcassets in Resources */, BF7A4C85204E338500460463 /* LaunchScreen.storyboard in Resources */, AD122AC6208442BC00C7D0AD /* ProgramVacateImageCell.xib in Resources */, ADC9AB82207C673300348EF1 /* SceneMiddleCell.xib in Resources */, @@ -1044,6 +1044,7 @@ inputPaths = ( "${SRCROOT}/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-frameworks.sh", "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", + "${BUILT_PRODUCTS_DIR}/AlamofireImage/AlamofireImage.framework", "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework", "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework", "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", @@ -1056,6 +1057,7 @@ name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AlamofireImage.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DZNEmptyDataSet.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HandyJSON.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", diff --git a/ParentAssistant/ParentAssistant.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist b/ParentAssistant/ParentAssistant.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist index db750f4..3e94619 100644 --- a/ParentAssistant/ParentAssistant.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/ParentAssistant/ParentAssistant.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ ParentAssistant.xcscheme orderHint - 10 + 11 diff --git a/ParentAssistant/ParentAssistant.xcworkspace/xcuserdata/caoyang.xcuserdatad/UserInterfaceState.xcuserstate b/ParentAssistant/ParentAssistant.xcworkspace/xcuserdata/caoyang.xcuserdatad/UserInterfaceState.xcuserstate index fc99e58..65b15c8 100644 Binary files a/ParentAssistant/ParentAssistant.xcworkspace/xcuserdata/caoyang.xcuserdatad/UserInterfaceState.xcuserstate and b/ParentAssistant/ParentAssistant.xcworkspace/xcuserdata/caoyang.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/GrowViewController.swift b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/GrowViewController.swift index fd76e89..0fe7718 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/GrowViewController.swift +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/GrowViewController.swift @@ -10,12 +10,11 @@ import UIKit class GrowViewController: UIViewController,UIScrollViewDelegate { - var ZJBNavH = 44.0 //MARK: - 标题数据 //标题 lazy var titleView = {() -> UIView in let title = UIScrollView() - title.frame = CGRect(x:0,y:0,width:getScreenWidth(),height:44) + title.frame = CGRect(x:0,y:0,width:200,height:44) title.backgroundColor = Theme.topBarColor() return title }() @@ -51,7 +50,9 @@ class GrowViewController: UIViewController,UIScrollViewDelegate { super.viewDidLoad() titleArr = ["应用","报告"] //设置导航栏标题 - self.navigationItem.titleView = titleView + self.navigationItem.titleView = self.titleView + self.navigationItem.titleView?.center.x = screenWidth/2 + print(self.navigationItem.titleView!.frame) self.view.addSubview(contentScrollView) self.title = "成长" @@ -153,10 +154,10 @@ class GrowViewController: UIViewController,UIScrollViewDelegate { btn.setTitleColor(UIColor.white, for: .normal) btn.tag = i btn.addTarget(self, action: #selector(clickTitleAction(btn:)), for:UIControlEvents.touchUpInside) - btn.frame.size = CGSize.init(width: 40, height: ZJBNavH) + btn.frame.size = CGSize.init(width: 40, height: navigationBarHeight!) - let widht = getScreenWidth() - btn.center = CGPoint.init(x: widht/4*(1+CGFloat(i))-26, y: CGFloat(ZJBNavH/2)) + let centerX = titleView.frame.size.width/4 + btn.center = CGPoint.init(x: centerX+centerX*2*CGFloat(i), y: CGFloat(navigationBarHeight!/2)) btnWidthArr.append(btn.frame.size.width) titleBtnArr.append(btn) diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/Program/ProgramCheckViewController.swift b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/Program/ProgramCheckViewController.swift index 71f1941..d703311 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/Program/ProgramCheckViewController.swift +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/Program/ProgramCheckViewController.swift @@ -22,12 +22,22 @@ class ProgramCheckViewController: UIViewController,UITableViewDelegate,UITableVi return table }() + var studentName:String? + lazy var formatter = {()->DateFormatter in + let matter = DateFormatter.init() + matter.dateFormat = "yyyy-MM-dd" + return matter + }() var viewData = Array() override func viewDidLoad() { super.viewDidLoad() + + self.studentName = AccountManager.shared.rawUserInfo?.contentData()["studentClass"][0]["studentName"].string + self.view.addSubview(self.tableView) + // Do any additional setup after loading the view. downLoadDataFromNet() } @@ -40,7 +50,7 @@ class ProgramCheckViewController: UIViewController,UITableViewDelegate,UITableVi SVProgressHUD.dismiss() if error == nil && JSON.fromString(backData)!["status"].intValue == 1 { let data = JSON.fromString(backData)!["data"].arrayValue - + print(backData!) for i in 0..UITableView in let table = UITableView.init(frame: CGRect.init(x: 0, y: 0, width: screenWidth, height: screenHeight-navigationBarHeight!-statusBarHeight-10)) - table.backgroundColor = UIColor.init(red: 235/255, green: 235/255, blue: 241/255, alpha: 1) + table.backgroundColor = backGroundColor table.delegate = self table.dataSource = self table.separatorStyle = UITableViewCellSeparatorStyle.none @@ -69,7 +69,7 @@ class MoralViewController: UIViewController,UITableViewDelegate,UITableViewDataS case 0: return 240 case 1: - return 240 + return 280 case 2: return 70 default: diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/Report/SceneDetailViewController.swift b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/Report/SceneDetailViewController.swift index b082bfc..7c37332 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/Report/SceneDetailViewController.swift +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/Report/SceneDetailViewController.swift @@ -45,7 +45,7 @@ class SceneDetailViewController: UIViewController,UITableViewDataSource,UITableV case 0: return 240 case 1: - return 250 + return 300 case 2: return 70 default: diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.swift b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.swift index 796cddc..fc1e9d7 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.swift +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.swift @@ -18,6 +18,13 @@ class GrowCheckDownTableViewCell: UITableViewCell { // Initialization code self.backgroundColor = backgroundColor } + + func setCellData(model:StudentCardModel){ + + self.studentMessage.text = model.situation + self.studentImage.setImageWithUrl(urlStr: model.head_image, placeholder: "program_loadfail") + } + override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.xib b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.xib index 1f2a2c6..381be6d 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.xib +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckDownTableViewCell.xib @@ -13,18 +13,18 @@ - - + + - + - + - + - - + + @@ -98,7 +98,7 @@ - + diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckUpTableViewCell.swift b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckUpTableViewCell.swift index bae915c..f16c6a1 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckUpTableViewCell.swift +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ProgramView/GrowCheckUpTableViewCell.swift @@ -15,11 +15,11 @@ class GrowCheckUpTableViewCell: UITableViewCell { @IBOutlet weak var checkCount: UILabel! override func awakeFromNib() { super.awakeFromNib() - self.backgroundColor = backgroundColor + self.backgroundColor = backGroundColor // Initialization code } - + override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.swift b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.swift index aede27c..ba5c1f3 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.swift +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.swift @@ -9,8 +9,6 @@ import UIKit class EducationDetailCell: UITableViewCell { - - @IBOutlet weak var lineChartView: UIView! var customLineChart = LineChartView() @@ -18,9 +16,10 @@ class EducationDetailCell: UITableViewCell { super.awakeFromNib() self.backgroundColor = backgroundColor - let rect = self.lineChartView.bounds - print(rect) + let rect = CGRect.init(x: 10, y: 60, width: screenWidth-20, height: self.bounds.size.height-60) customLineChart = LineChartView.init(frame: rect) + + print("linechart frame = \(customLineChart.frame)") customLineChart.drawUI(xLableArr: nil) let arr1 = [4,4,2,1,3] let arr2 = [2,1,4,4,5] @@ -29,8 +28,7 @@ class EducationDetailCell: UITableViewCell { customLineChart.drawLine(point: arr2, color: UIColorWithRGB(R: 220, G: 0, B: 16)) - - self.lineChartView.addSubview(customLineChart) + self.addSubview(customLineChart) // Initialization code diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.xib b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.xib index 14adb86..abf8c0d 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.xib +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/EducationDetailCell.xib @@ -12,7 +12,7 @@ - + @@ -56,9 +56,6 @@ - - - - - - diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/LineChartView.swift b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/LineChartView.swift index 18e4d6e..040c139 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/LineChartView.swift +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/LineChartView.swift @@ -18,6 +18,8 @@ class LineChartView: UIView { private let xCount = 5 //最大绩点分数 private let GPA = 5 + //横坐标间隔高度 + private var yCellHeight : CGFloat = 0 //储存横纵坐标,画线用 private var xCenterArr = Array() private var yCenterArr = Array() @@ -33,11 +35,12 @@ class LineChartView: UIView { private var dateArr = Array>() //显示的数字 var yLabArray = Array() - + override init(frame: CGRect) { super.init(frame: frame) - print("frame==\(frame)") - + if !frame.isEmpty { + self.yCellHeight = self.bounds.size.height/(CGFloat(yCount)+1) + } } func drawUI(xLableArr:Array?){ @@ -50,33 +53,33 @@ class LineChartView: UIView { //设置纵坐标 private func drawY() { - let yHeight = (self.bounds.height-60)/CGFloat(yCount) + let yHeight = yCellHeight for index in 0..,color:UIColor){ let pointArr = swichPoint(arr: point) - let drawLayer = DrawLayer() drawLayer.xPointArr = xCenterArr drawLayer.yPointArr = [yCenterArr[pointArr[0]],yCenterArr[pointArr[1]],yCenterArr[pointArr[2]],yCenterArr[pointArr[3]],yCenterArr[pointArr[4]]] drawLayer.bounds = self.bounds - drawLayer.position = self.center + drawLayer.position = CGPoint.init(x: self.bounds.size.width/2, y: self.bounds.size.height/2) drawLayer.lineColor = color self.layer.addSublayer(drawLayer) drawLayer.setNeedsDisplay() @@ -121,15 +123,15 @@ class LineChartView: UIView { //X轴下划线 let movePath = CGMutablePath() movePath.move(to: CGPoint.init(x: xCenterArr[index], y: yCenterArr[0])) - movePath.addLine(to: CGPoint.init(x: xCenterArr[index], y: 10+5*(self.bounds.height-60)/CGFloat(yCount))) + movePath.addLine(to: CGPoint.init(x: xCenterArr[index], y: 10+5*(self.bounds.height/(CGFloat(yCount)+1)))) lineLayer.path = movePath xMoveLayer.strokeColor = UIColorWithRGB(R: 92, G: 145, B: 230).cgColor xMoveLayer.lineWidth = 2 self.layer.addSublayer(xMoveLayer) let movePath2 = CGMutablePath() - movePath2.move(to: CGPoint.init(x: xCenterArr[index]-15, y: self.bounds.height-45)) - movePath2.addLine(to: CGPoint.init(x: xCenterArr[index]+15, y: self.bounds.height-45)) + movePath2.move(to: CGPoint.init(x: xCenterArr[index]-15, y: yCellHeight*6+20)) + movePath2.addLine(to: CGPoint.init(x: xCenterArr[index]+15, y: yCellHeight*6+20)) xMoveLayer.path = movePath2 if yLabArray.count == dateArr.count { @@ -200,7 +202,6 @@ class DrawLayer: CALayer { for i in 0.. + @@ -19,55 +20,55 @@ - + - + + + + + + + + + - + + + + - + + diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/MoralTableViewCell.xib b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/MoralTableViewCell.xib index 96e535f..d7e7081 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/MoralTableViewCell.xib +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/MoralTableViewCell.xib @@ -6,7 +6,6 @@ - @@ -36,25 +35,25 @@ + + + + + + + + + - + + - + + + + diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.swift b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.swift index d88a946..ddfac92 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.swift +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.swift @@ -9,8 +9,6 @@ import UIKit class SceneMiddleCell: UITableViewCell { - - @IBOutlet weak var lineChartView: UIView! var customLineChart = LineChartView() override func awakeFromNib() { @@ -18,7 +16,7 @@ class SceneMiddleCell: UITableViewCell { self.backgroundColor = backgroundColor // Initialization code - let rect = self.lineChartView.bounds + let rect = CGRect.init(x: 0, y: 60, width: screenWidth-20, height: self.bounds.size.height-60) customLineChart = LineChartView.init(frame: rect) let customXLabArr = ["03/12","03/13","03/14","03/15","03/16"] @@ -33,7 +31,7 @@ class SceneMiddleCell: UITableViewCell { customLineChart.drawLine(point: arr2, color: UIColorWithRGB(R: 92, G: 145, B: 230)) customLineChart.drawLine(point: arr3, color: UIColorWithRGB(R: 255, G: 213, B: 79)) - self.lineChartView.addSubview(customLineChart) + self.addSubview(customLineChart) } diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.xib b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.xib index 4980a09..16ae363 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.xib +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneMiddleCell.xib @@ -22,10 +22,6 @@ - - - - @@ -112,11 +108,7 @@ - - - - @@ -133,9 +125,6 @@ - - - diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneTopCell.xib b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneTopCell.xib index b3d9a2d..d37b0be 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneTopCell.xib +++ b/ParentAssistant/ParentAssistant/Classes/controllers/Grow/View/ReportView/SceneTopCell.xib @@ -6,7 +6,7 @@ - + @@ -23,45 +23,40 @@ - - - - - - + - + @@ -70,27 +65,24 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/ParentAssistant/ParentAssistant/Classes/controllers/my/My.storyboard b/ParentAssistant/ParentAssistant/Classes/controllers/my/My.storyboard index 9dc8e2d..c3d5a79 100644 --- a/ParentAssistant/ParentAssistant/Classes/controllers/my/My.storyboard +++ b/ParentAssistant/ParentAssistant/Classes/controllers/my/My.storyboard @@ -701,7 +701,7 @@ - + @@ -736,7 +736,7 @@ - + diff --git a/ParentAssistant/ParentAssistant/Classes/util/network.swift b/ParentAssistant/ParentAssistant/Classes/util/network.swift index e239137..4c4fe19 100644 --- a/ParentAssistant/ParentAssistant/Classes/util/network.swift +++ b/ParentAssistant/ParentAssistant/Classes/util/network.swift @@ -8,6 +8,7 @@ import Foundation import Alamofire +import AlamofireImage //http工具 final class KHttp{ 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)->Voi } } } + +// MARK: - 对UIImageView的网络加载图片扩展 +extension UIImageView { + + /// 网络加载图片 + /// + /// - Parameters: + /// - urlStr: 图片网络地址字符串 + /// - placeholder: 默认替代图片 + func setImageWithUrl(urlStr:String,placeholder:String?) { + if !(urlStr.isEmpty){ + let imageUrl = URL.init(string: urlStr) + if placeholder == nil { + self.af_setImage(withURL: imageUrl!) + }else{ + self.af_setImage(withURL: imageUrl!, placeholderImage: UIImage.init(named: placeholder!)) + } + }else{ + if let image = placeholder { + self.image = UIImage.init(named: image) + } + } + } +} + diff --git a/ParentAssistant/ParentAssistant/Classes/util/utils.swift b/ParentAssistant/ParentAssistant/Classes/util/utils.swift index 47395cb..aefeb32 100644 --- a/ParentAssistant/ParentAssistant/Classes/util/utils.swift +++ b/ParentAssistant/ParentAssistant/Classes/util/utils.swift @@ -9,6 +9,7 @@ import UIKit import QuickLook import Photos + //MARK: - 服务器和log打印设置 class Debug{ static let enable=false//是否打印log @@ -589,6 +590,7 @@ extension UIViewController{ } } + func getPercentEncodingString(str:String) -> String { return String(describing: str.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!) } diff --git a/ParentAssistant/ParentAssistant/Supporting Files/Assets.xcassets/report/program_loadfail.imageset/Contents.json b/ParentAssistant/ParentAssistant/Supporting Files/Assets.xcassets/report/program_loadfail.imageset/Contents.json new file mode 100644 index 0000000..2f39657 --- /dev/null +++ b/ParentAssistant/ParentAssistant/Supporting Files/Assets.xcassets/report/program_loadfail.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "program_loadfail@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ParentAssistant/ParentAssistant/Supporting Files/Assets.xcassets/report/program_loadfail.imageset/program_loadfail@2x.png b/ParentAssistant/ParentAssistant/Supporting Files/Assets.xcassets/report/program_loadfail.imageset/program_loadfail@2x.png new file mode 100644 index 0000000..5eb41b8 Binary files /dev/null and b/ParentAssistant/ParentAssistant/Supporting Files/Assets.xcassets/report/program_loadfail.imageset/program_loadfail@2x.png differ diff --git a/ParentAssistant/Podfile b/ParentAssistant/Podfile index 7db341a..5626d41 100644 --- a/ParentAssistant/Podfile +++ b/ParentAssistant/Podfile @@ -5,7 +5,8 @@ inhibit_all_warnings! target 'ParentAssistant' do pod 'HandyJSON', '~> 4.1.1' - pod 'Alamofire','~>4.0.1' + pod 'Alamofire','~>4.7.2' + pod 'AlamofireImage','~> 3.3.1' pod 'SDWebImage','~>3.8.2' pod 'Toast','~>3.1.0' pod 'XRCarouselView','~>2.5.6' @@ -18,5 +19,4 @@ target 'ParentAssistant' do pod 'SVProgressHUD','~>2.2.5' pod 'NIMSDK_LITE','~>4.9.0' pod 'SwiftHash','~>2.0.1' - end diff --git a/ParentAssistant/Podfile.lock b/ParentAssistant/Podfile.lock index 8fbc0f8..4c749c9 100644 --- a/ParentAssistant/Podfile.lock +++ b/ParentAssistant/Podfile.lock @@ -1,5 +1,7 @@ PODS: - - Alamofire (4.0.1) + - Alamofire (4.7.2) + - AlamofireImage (3.3.1): + - Alamofire (~> 4.5) - DZNEmptyDataSet (1.8.1) - HandyJSON (4.1.1) - NIMSDK_LITE (4.9.0) @@ -19,7 +21,8 @@ PODS: - XRCarouselView (2.5.6) DEPENDENCIES: - - Alamofire (~> 4.0.1) + - Alamofire (~> 4.7.2) + - AlamofireImage (~> 3.3.1) - DZNEmptyDataSet (~> 1.8.1) - HandyJSON (~> 4.1.1) - NIMSDK_LITE (~> 4.9.0) @@ -35,7 +38,8 @@ DEPENDENCIES: - XRCarouselView (~> 2.5.6) SPEC CHECKSUMS: - Alamofire: 7682d43245de14874acd142ec137b144aa1dd335 + Alamofire: e4fa87002c137ba2d8d634d2c51fabcda0d5c223 + AlamofireImage: 3b35b586853abaf94ca1250f4e94cff3c21a4c0d DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7 HandyJSON: 3a3de917c4118767ffe41c29b5acba23409649f4 NIMSDK_LITE: a69a019544299a1b597db6ebf98927f5e12fa17c @@ -50,6 +54,6 @@ SPEC CHECKSUMS: UMCSecurityPlugins: 0831a08f3988f3cea9f1d3a7626cd9bee4fef150 XRCarouselView: 52529f924d26ee4787f9bd958150800b73e60922 -PODFILE CHECKSUM: ef5a2eedc2a762110d9f7458ad01512ced09aba0 +PODFILE CHECKSUM: fb172574c836b57e7c792807c655a091aff17050 COCOAPODS: 1.4.0 diff --git a/ParentAssistant/Pods/Alamofire/LICENSE b/ParentAssistant/Pods/Alamofire/LICENSE index 4cfbf72..2ec3cb1 100644 --- a/ParentAssistant/Pods/Alamofire/LICENSE +++ b/ParentAssistant/Pods/Alamofire/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/ParentAssistant/Pods/Alamofire/README.md b/ParentAssistant/Pods/Alamofire/README.md index bfaed03..f29cfce 100644 --- a/ParentAssistant/Pods/Alamofire/README.md +++ b/ParentAssistant/Pods/Alamofire/README.md @@ -1,10 +1,11 @@ -![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/assets/alamofire.png) +![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/master/alamofire.png) [![Build Status](https://travis-ci.org/Alamofire/Alamofire.svg?branch=master)](https://travis-ci.org/Alamofire/Alamofire) [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Alamofire.svg)](https://img.shields.io/cocoapods/v/Alamofire.svg) [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) -[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](http://cocoadocs.org/docsets/Alamofire) +[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](https://alamofire.github.io/Alamofire) [![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF) +[![Gitter](https://badges.gitter.im/Alamofire/Alamofire.svg)](https://gitter.im/Alamofire/Alamofire?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) Alamofire is an HTTP networking library written in Swift. @@ -14,16 +15,16 @@ Alamofire is an HTTP networking library written in Swift. - [Migration Guides](#migration-guides) - [Communication](#communication) - [Installation](#installation) -- [Usage](#usage) - - **Intro -** [Making a Request](#making-a-request), [Response Handling](#response-handling), [Response Validation](#response-validation), [Response Caching](#response-caching) - - **HTTP -** [HTTP Methods](#http-methods), [Parameter Encoding](#parameter-encoding), [HTTP Headers](#http-headers), [Authentication](#authentication) - - **Large Data -** [Downloading Data to a File](#downloading-data-to-a-file), [Uploading Data to a Server](#uploading-data-to-a-server) - - **Tools -** [Statistical Metrics](#statistical-metrics), [cURL Command Output](#curl-command-output) -- [Advanced Usage](#advanced-usage) - - **URL Session -** [Session Manager](#session-manager), [Session Delegate](#session-delegate), [Request](#request) - - **Routing -** [Routing Requests](#routing-requests), [Adapting and Retrying Requests](#adapting-and-retrying-requests) - - **Model Objects -** [Custom Response Serialization](#custom-response-serialization) - - **Connection -** [Security](#security), [Network Reachability](#network-reachability) +- [Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md) + - **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) + - **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) + - **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) + - **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) +- [Advanced Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md) + - **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) + - **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) + - **Model Objects -** [Custom Response Serialization](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#custom-response-serialization) + - **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) - [Open Radars](#open-radars) - [FAQ](#faq) - [Credits](#credits) @@ -44,7 +45,7 @@ Alamofire is an HTTP networking library written in Swift. - [x] TLS Certificate and Public Key Pinning - [x] Network Reachability - [x] Comprehensive Unit and Integration Test Coverage -- [x] [Complete Documentation](http://cocoadocs.org/docsets/Alamofire) +- [x] [Complete Documentation](https://alamofire.github.io/Alamofire) ## Component Libraries @@ -55,9 +56,9 @@ In order to keep Alamofire focused specifically on core networking implementatio ## Requirements -- iOS 9.0+ / macOS 10.11+ / tvOS 9.0+ / watchOS 2.0+ -- Xcode 8.0+ -- Swift 3.0+ +- iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+ +- Xcode 8.3+ +- Swift 3.1+ ## Migration Guides @@ -83,7 +84,7 @@ In order to keep Alamofire focused specifically on core networking implementatio $ gem install cocoapods ``` -> CocoaPods 1.1.0+ is required to build Alamofire 4.0.0+. +> CocoaPods 1.1+ is required to build Alamofire 4.0+. To integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`: @@ -93,7 +94,7 @@ platform :ios, '10.0' use_frameworks! target '' do - pod 'Alamofire', '~> 4.0' + pod 'Alamofire', '~> 4.7' end ``` @@ -117,1591 +118,85 @@ $ brew install carthage To integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`: ```ogdl -github "Alamofire/Alamofire" ~> 4.0 +github "Alamofire/Alamofire" ~> 4.7 ``` Run `carthage update` to build the framework and drag the built `Alamofire.framework` into your Xcode project. -### Manually - -If you prefer not to use either of the aforementioned dependency managers, you can integrate Alamofire into your project manually. - -#### Embedded Framework - -- 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: - -```bash -$ git init -``` - -- Add Alamofire as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command: - -```bash -$ git submodule add https://github.com/Alamofire/Alamofire.git -``` - -- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project. - - > 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. - -- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target. -- 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. -- In the tab bar at the top of that window, open the "General" panel. -- Click on the `+` button under the "Embedded Binaries" section. -- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder. - - > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`. - -- Select the top `Alamofire.framework` for iOS and the bottom one for OS X. - - > 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`. - -- And that's it! - -> 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. - ---- - -## Usage - -### Making a Request - -```swift -import Alamofire - -Alamofire.request("https://httpbin.org/get") -``` - -### Response Handling - -Handling the `Response` of a `Request` made in Alamofire involves chaining a response handler onto the `Request`. - -```swift -Alamofire.request("https://httpbin.org/get").responseJSON { response in - print(response.request) // original URL request - print(response.response) // HTTP URL response - print(response.data) // server data - print(response.result) // result of response serialization - - if let JSON = response.result.value { - print("JSON: \(JSON)") - } -} -``` - -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. - -> 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. - -Alamofire contains five different response handlers by default including: - -```swift -// Response Handler - Unserialized Response -func response( - queue: DispatchQueue?, - completionHandler: @escaping (DefaultDownloadResponse) -> Void) - -> Self - -// Response Data Handler - Serialized into Data -func responseData( - queue: DispatchQueue?, - completionHandler: @escaping (DataResponse) -> Void) - -> Self - -// Response String Handler - Serialized into String -func responseString( - queue: DispatchQueue?, - encoding: String.Encoding?, - completionHandler: @escaping (DataResponse) -> Void) - -> Self - -// Response JSON Handler - Serialized into Any -func responseJSON( - queue: DispatchQueue?, - completionHandler: @escaping (DataResponse) -> Void) - -> Self - -// Response PropertyList (plist) Handler - Serialized into Any -func responsePropertyList( - queue: DispatchQueue?, - completionHandler: @escaping (DataResponse) -> Void)) - -> Self -``` - -None of the response handlers perform any validation of the `HTTPURLResponse` it gets back from the server. - -> 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. - -#### Response Handler - -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`. - -```swift -Alamofire.request("https://httpbin.org/get").response { response in - print("Request: \(response.request)") - print("Response: \(response.response)") - print("Error: \(response.data)") - - if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) { - print("Data: \(utf8Text)") - } -} -``` - -> We strongly encourage you to leverage the other response serializers taking advantage of `Response` and `Result` types. - -#### Response Data Handler - -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`. - -```swift -Alamofire.request("https://httpbin.org/get").responseData { response in - debugPrint("All Response Info: \(response)") - - if let data = response.result.value, let utf8Text = String(data: data, encoding: .utf8) { - print("Data: \(utf8Text)") - } -} -``` - -#### Response String Handler - -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`. - -```swift -Alamofire.request("https://httpbin.org/get").responseString { response in - print("Success: \(response.result.isSuccess)") - print("Response String: \(response.result.value)") -} -``` - -> 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`. - -#### Response JSON Handler - -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`. - -```swift -Alamofire.request("https://httpbin.org/get").responseJSON { response in - debugPrint(response) - - if let json = response.result.value { - print("JSON: \(json)") - } -} -``` - -> All JSON serialization is handled by the `JSONSerialization` API in the `Foundation` framework. - -#### Chained Response Handlers - -Response handlers can even be chained: - -```swift -Alamofire.request("https://httpbin.org/get") - .responseString { response in - print("Response String: \(response.result.value)") - } - .responseJSON { response in - print("Response JSON: \(response.result.value)") - } -``` - -> 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. - -#### Response Handler Queue - -Response handlers by default are executed on the main dispatch queue. However, a custom dispatch queue can be provided instead. - -```swift -let utilityQueue = DispatchQueue.global(qos: .utility) - -Alamofire.request("https://httpbin.org/get").responseJSON(queue: utilityQueue) { response in - print("Executing response handler on utility queue") -} -``` - -### Response Validation - -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. - -#### Manual Validation - -```swift -Alamofire.request("https://httpbin.org/get") - .validate(statusCode: 200..<300) - .validate(contentType: ["application/json"]) - .response { response in - switch response.result { - case .success: - print("Validation Successful") - case .failure(let error): - print(error) - } - } -``` - -#### Automatic Validation - -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. - -```swift -Alamofire.request("https://httpbin.org/get").validate().responseJSON { response in - switch response.result { - case .success: - print("Validation Successful") - case .failure(let error): - print(error) - } -} -``` - -### Response Caching - -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. - -> By default, Alamofire leverages the shared `URLCache`. In order to customize it, see the [Session Manager Configurations](#session-manager-configurations) section. - -### HTTP Methods - -The `HTTPMethod` enumeration lists the HTTP methods defined in [RFC 7231 §4.3](http://tools.ietf.org/html/rfc7231#section-4.3): - -```swift -public enum HTTPMethod: String { - case options = "OPTIONS" - case get = "GET" - case head = "HEAD" - case post = "POST" - case put = "PUT" - case patch = "PATCH" - case delete = "DELETE" - case trace = "TRACE" - case connect = "CONNECT" -} -``` - -These values can be passed as the `method` argument to the `Alamofire.request` API: - -```swift -Alamofire.request("https://httpbin.org/get") // method defaults to `.get` - -Alamofire.request("https://httpbin.org/post", method: .post) -Alamofire.request("https://httpbin.org/put", method: .put) -Alamofire.request("https://httpbin.org/delete", method: .delete) -``` - -> The `Alamofire.request` method parameter defaults to `.get`. - -### Parameter Encoding - -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. - -#### URL Encoding - -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: - -- `.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. -- `.queryString` - Sets or appends encoded query string result to existing query string. -- `.httpBody` - Sets encoded query string result as the HTTP body of the URL request. - -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`). - -##### GET Request With URL-Encoded Parameters - -```swift -let parameters: Parameters = ["foo": "bar"] - -// All three of these calls are equivalent -Alamofire.request("https://httpbin.org/get", parameters: parameters) // encoding defaults to `URLEncoding.default` -Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding.default) -Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding(destination: .methodDependent)) - -// https://httpbin.org/get?foo=bar -``` - -##### POST Request With URL-Encoded Parameters - -```swift -let parameters: Parameters = [ - "foo": "bar", - "baz": ["a", 1], - "qux": [ - "x": 1, - "y": 2, - "z": 3 - ] -] - -// All three of these calls are equivalent -Alamofire.request("https://httpbin.org/post", parameters: parameters) -Alamofire.request("https://httpbin.org/post", parameters: parameters, encoding: URLEncoding.default) -Alamofire.request("https://httpbin.org/post", parameters: parameters, encoding: URLEncoding.httpBody) - -// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3 -``` - -#### JSON Encoding - -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`. - -##### POST Request with JSON-Encoded Parameters - -```swift -let parameters: Parameters = [ - "foo": [1,2,3], - "bar": [ - "baz": "qux" - ] -] - -// Both calls are equivalent -Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding.default) -Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding(options: [])) - -// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}} -``` - -#### Property List Encoding - -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`. - -#### Custom Encoding - -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`. - -```swift -struct JSONStringArrayEncoding: ParameterEncoding { - private let array: [String] - - init(array: [String]) { - self.array = array - } - - func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { - var urlRequest = urlRequest.urlRequest - - let data = try JSONSerialization.data(withJSONObject: array, options: []) - - if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil { - urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") - } - - urlRequest.httpBody = data - - return urlRequest - } -} -``` - -#### Manual Parameter Encoding of a URLRequest - -The `ParameterEncoding` APIs can be used outside of making network requests. - -```swift -let url = URL(string: "https://httpbin.org/get")! -var urlRequest = URLRequest(url: url) - -let parameters: Parameters = ["foo": "bar"] -let encodedURLRequest = try URLEncoding.queryString.encode(urlRequest, with: parameters) -``` - -### HTTP Headers - -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. - -```swift -let headers: HTTPHeaders = [ - "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==", - "Accept": "application/json" -] - -Alamofire.request("https://httpbin.org/headers", headers: headers).responseJSON { response in - debugPrint(response) -} -``` - -> 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. - -The default Alamofire `SessionManager` provides a default set of headers for every `Request`. These include: - -- `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). -- `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). -- `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). - -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. - -### Authentication - -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). - -**Supported Authentication Schemes** - -- [HTTP Basic](http://en.wikipedia.org/wiki/Basic_access_authentication) -- [HTTP Digest](http://en.wikipedia.org/wiki/Digest_access_authentication) -- [Kerberos](http://en.wikipedia.org/wiki/Kerberos_%28protocol%29) -- [NTLM](http://en.wikipedia.org/wiki/NT_LAN_Manager) - -#### HTTP Basic Authentication - -The `authenticate` method on a `Request` will automatically provide a `URLCredential` to a `URLAuthenticationChallenge` when appropriate: - -```swift -let user = "user" -let password = "password" - -Alamofire.request("https://httpbin.org/basic-auth/\(user)/\(password)") - .authenticate(user: user, password: password) - .responseJSON { response in - debugPrint(response) - } -``` - -Depending upon your server implementation, an `Authorization` header may also be appropriate: - -```swift -let user = "user" -let password = "password" - -var headers: HTTPHeaders = [:] - -if let authorizationHeader = Request.authorizationHeader(user: user, password: password) { - headers[authorizationHeader.key] = authorizationHeader.value -} - -Alamofire.request("https://httpbin.org/basic-auth/user/password", headers: headers) - .responseJSON { response in - debugPrint(response) - } -``` - -#### Authentication with URLCredential - -```swift -let user = "user" -let password = "password" - -let credential = URLCredential(user: user, password: password, persistence: .forSession) - -Alamofire.request("https://httpbin.org/basic-auth/\(user)/\(password)") - .authenticate(usingCredential: credential) - .responseJSON { response in - debugPrint(response) - } -``` - -> 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`. - -### Downloading Data to a File - -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. - -```swift -Alamofire.download("https://httpbin.org/image/png").responseData { response in - if let data = response.result.value { - let image = UIImage(data: data) - } -} -``` - -> 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. - -#### Download File Destination - -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: - -- `.createIntermediateDirectories` - Creates intermediate directories for the destination URL if specified. -- `.removePreviousFile` - Removes a previous file from the destination URL if specified. - -```swift -let destination: DownloadRequest.DownloadFileDestination = { _, _ in - let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] - let fileURL = documentsURL.appendPathComponent("pig.png") - - return (fileURL, [.removePreviousFile, .createIntermediateDirectories]) -} - -Alamofire.download(urlString, to: destination).response { response in - print(response) - - if response.result.isSuccess, let imagePath = response.destinationURL?.path { - let image = UIImage(contentsOfFile: imagePath) - } -} -``` - -You can also use the suggested download destination API. - -```swift -let destination = DownloadRequest.suggestedDownloadDestination(directory: .documentDirectory) -Alamofire.download("https://httpbin.org/image/png", to: destination) -``` - -#### Download Progress - -Many times it can be helpful to report download progress to the user. Any `DownloadRequest` can report download progress using the `downloadProgress` API. - -```swift -Alamofire.download("https://httpbin.org/image/png") - .downloadProgress { progress in - print("Download Progress: \(progress.fractionCompleted)") - } - .responseData { response in - if let data = response.result.value { - let image = UIImage(data: data) - } - } -``` - -The `downloadProgress` API also takes a `queue` parameter which defines which `DispatchQueue` the download progress closure should be called on. - -```swift -let utilityQueue = DispatchQueue.global(qos: .utility) - -Alamofire.download("https://httpbin.org/image/png") - .downloadProgress(queue: utilityQueue) { progress in - print("Download Progress: \(progress.fractionCompleted)") - } - .responseData { response in - if let data = response.result.value { - let image = UIImage(data: data) - } - } -``` - -#### Resuming a Download - -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. - -```swift -class ImageRequestor { - private var resumeData: Data? - private var image: UIImage? - - func fetchImage(completion: (UIImage?) -> Void) { - guard image == nil else { completion(image) ; return } - - let destination: DownloadRequest.DownloadFileDestination = { _, _ in - let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] - let fileURL = documentsURL.appendPathComponent("pig.png") - - return (fileURL, [.removePreviousFile, .createIntermediateDirectories]) - } - - let request: DownloadRequest - - if let resumeData = resumeData { - request = Alamofire.download(resumingWith: resumeData) - } else { - request = Alamofire.download("https://httpbin.org/image/png") - } - - request.responseData { response in - switch response.result { - case .success(let data): - self.image = UIImage(data: data) - case .failure: - self.resumeData = response.resumeData - } - } - } -} -``` - -### Uploading Data to a Server - -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. - -> 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. - -#### Uploading Data - -```swift -let imageData = UIPNGRepresentation(image)! - -Alamofire.upload(imageData, to: "https://httpbin.org/post").responseJSON { response in - debugPrint(response) -} -``` - -#### Uploading a File - -```swift -let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov") - -Alamofire.upload(fileURL, to: "https://httpbin.org/post").responseJSON { response in - debugPrint(response) -} -``` - -#### Uploading Multipart Form Data - -```swift -Alamofire.upload( - multipartFormData: { multipartFormData in - multipartFormData.append(unicornImageURL, withName: "unicorn") - multipartFormData.append(rainbowImageURL, withName: "rainbow") - }, - to: "https://httpbin.org/post", - encodingCompletion: { encodingResult in - switch encodingResult { - case .success(let upload, _, _): - upload.responseJSON { response in - debugPrint(response) - } - case .failure(let encodingError): - print(encodingError) - } - } -) -``` - -#### Upload Progress - -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. - -```swift -let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov") - -Alamofire.upload(fileURL, to: "https://httpbin.org/post") - .uploadProgress { progress in // main queue by default - print("Upload Progress: \(progress.fractionCompleted)") - } - .downloadProgress { progress in // main queue by default - print("Download Progress: \(progress.fractionCompleted)") - } - .responseJSON { response in - debugPrint(response) - } -``` - -### Statistical Metrics - -#### Timeline - -Alamofire collects timings throughout the lifecycle of a `Request` and creates a `Timeline` object exposed as a property on all response types. - -```swift -Alamofire.request("https://httpbin.org/get").responseJSON { response in - print(response.timeline) -} -``` - -The above reports the following `Timeline` info: - -- `Latency`: 0.428 seconds -- `Request Duration`: 0.428 seconds -- `Serialization Duration`: 0.001 seconds -- `Total Duration`: 0.429 seconds - -#### URL Session Task Metrics - -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. - -```swift -Alamofire.request("https://httpbin.org/get").responseJSON { response in - print(response.metrics) -} -``` - -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: - -```swift -Alamofire.request("https://httpbin.org/get").responseJSON { response in - if #available(iOS 10.0. *) { - print(response.metrics) - } -} -``` - -### cURL Command Output - -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. - -#### CustomStringConvertible - -```swift -let request = Alamofire.request("https://httpbin.org/ip") - -print(request) -// GET https://httpbin.org/ip (200) -``` - -#### CustomDebugStringConvertible - -```swift -let request = Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"]) -debugPrint(request) -``` - -Outputs: - -```bash -$ curl -i \ - -H "User-Agent: Alamofire/4.0.0" \ - -H "Accept-Encoding: gzip;q=1.0, compress;q=0.5" \ - -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" \ - "https://httpbin.org/get?foo=bar" -``` - ---- - -## Advanced Usage - -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. - -**Recommended Reading** - -- [URL Loading System Programming Guide](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html) -- [URLSession Class Reference](https://developer.apple.com/reference/foundation/nsurlsession) -- [URLCache Class Reference](https://developer.apple.com/reference/foundation/urlcache) -- [URLAuthenticationChallenge Class Reference](https://developer.apple.com/reference/foundation/urlauthenticationchallenge) - -### Session Manager - -Top-level convenience methods like `Alamofire.request` use a default instance of `Alamofire.SessionManager`, which is configured with the default `URLSessionConfiguration`. - -As such, the following two statements are equivalent: - -```swift -Alamofire.request("https://httpbin.org/get") -``` - -```swift -let sessionManager = Alamofire.SessionManager.default -sessionManager.request("https://httpbin.org/get") -``` - -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`). - -#### Creating a Session Manager with Default Configuration - -```swift -let configuration = URLSessionConfiguration.default -let sessionManager = Alamofire.SessionManager(configuration: configuration) -``` - -#### Creating a Session Manager with Background Configuration - -```swift -let configuration = URLSessionConfiguration.background(withIdentifier: "com.example.app.background") -let sessionManager = Alamofire.SessionManager(configuration: configuration) -``` - -#### Creating a Session Manager with Ephemeral Configuration - -```swift -let configuration = URLSessionConfiguration.ephemeral -let sessionManager = Alamofire.SessionManager(configuration: configuration) -``` - -#### Modifying the Session Configuration - -```swift -var defaultHeaders = Alamofire.SessionManager.default.defaultHTTPHeaders -defaultHeaders["DNT"] = "1 (Do Not Track Enabled)" - -let configuration = URLSessionConfiguration.default -configuration.httpAdditionalHeaders = defaultHeaders - -let sessionManager = Alamofire.SessionManager(configuration: configuration) -``` - -> 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. - -### Session Delegate - -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. - -#### Override Closures - -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: - -```swift -/// Overrides default behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)`. -open var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))? - -/// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`. -open var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)? - -/// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)`. -open var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> URLRequest?)? - -/// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)`. -open var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)? -``` - -The following is a short example of how to use the `taskWillPerformHTTPRedirection` to avoid following redirects to any `apple.com` domains. - -```swift -let sessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.default) -let delegate: Alamofire.SessionDelegate = sessionManager.delegate - -delegate.taskWillPerformHTTPRedirection = { session, task, response, request in - var finalRequest = request - - if - let originalRequest = task.originalRequest, - let urlString = originalRequest.url?.urlString, - urlString.contains("apple.com") - { - finalRequest = originalRequest - } - - return finalRequest -} -``` - -#### Subclassing - -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. - -```swift -class LoggingSessionDelegate: SessionDelegate { - override func urlSession( - _ session: URLSession, - task: URLSessionTask, - willPerformHTTPRedirection response: HTTPURLResponse, - newRequest request: URLRequest, - completionHandler: @escaping (URLRequest?) -> Void) - { - print("URLSession will perform HTTP redirection to request: \(request)") - - super.urlSession( - session, - task: task, - willPerformHTTPRedirection: response, - newRequest: request, - completionHandler: completionHandler - ) - } -} -``` - -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. - -> 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. - -### Request - -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. - -Each subclass has specialized methods such as `authenticate`, `validate`, `responseJSON` and `uploadProgress` that each return the caller instance in order to facilitate method chaining. - -Requests can be suspended, resumed and cancelled: - -- `suspend()`: Suspends the underlying task and dispatch queue. -- `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. -- `cancel()`: Cancels the underlying task, producing an error that is passed to any registered response handlers. - -### Routing Requests - -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. - -#### URLConvertible - -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: - -```swift -let urlString = "https://httpbin.org/post" -Alamofire.request(urlString, method: .post) - -let url = URL(string: urlString)! -Alamofire.request(url, method: .post) - -let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) -Alamofire.request(.post, URLComponents) -``` - -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. - -##### Type-Safe Routing - -```swift -extension User: URLConvertible { - static let baseURLString = "https://example.com" - - func asURL() throws -> URL { - let urlString = User.baseURLString + "/users/\(username)/" - return try urlString.asURL() - } -} -``` - -```swift -let user = User(username: "mattt") -Alamofire.request(user) // https://example.com/users/mattt -``` - -#### URLRequestConvertible - -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): - -```swift -let url = URL(string: "https://httpbin.org/post")! -var urlRequest = URLRequest(url: url) -urlRequest.httpMethod = "POST" - -let parameters = ["foo": "bar"] - -do { - urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: []) -} catch { - // No-op -} - -urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") - -Alamofire.request(urlRequest) -``` - -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. - -##### API Parameter Abstraction - -```swift -enum Router: URLRequestConvertible { - case search(query: String, page: Int) - - static let baseURLString = "https://example.com" - static let perPage = 50 - - // MARK: URLRequestConvertible - - func asURLRequest() throws -> URLRequest { - let result: (path: String, parameters: Parameters) = { - switch self { - case let .search(query, page) where page > 0: - return ("/search", ["q": query, "offset": Router.perPage * page]) - case let .search(query, _): - return ("/search", ["q": query]) - } - }() - - let url = try Router.baseURLString.asURL() - let urlRequest = URLRequest(url: url.appendingPathComponent(result.path)) - - return try URLEncoding.default.encode(urlRequest, with: result.parameters) - } -} -``` - -```swift -Alamofire.request(Router.search(query: "foo bar", page: 1)) // ?q=foo%20bar&offset=50 -``` - -##### CRUD & Authorization - -```swift -import Alamofire - -enum Router: URLRequestConvertible { - case createUser(parameters: Parameters) - case readUser(username: String) - case updateUser(username: String, parameters: Parameters) - case destroyUser(username: String) - - static let baseURLString = "https://example.com" - - var method: HTTPMethod { - switch self { - case .createUser: - return .post - case .readUser: - return .get - case .updateUser: - return .put - case .destroyUser: - return .delete - } - } - - var path: String { - switch self { - case .createUser: - return "/users" - case .readUser(let username): - return "/users/\(username)" - case .updateUser(let username, _): - return "/users/\(username)" - case .destroyUser(let username): - return "/users/\(username)" - } - } - - // MARK: URLRequestConvertible - - func asURLRequest() throws -> URLRequest { - let url = try Router.baseURLString.asURL() - - var urlRequest = URLRequest(url: url.appendingPathComponent(path)) - urlRequest.httpMethod = method.rawValue - - switch self { - case .createUser(let parameters): - urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters) - case .updateUser(_, let parameters): - urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters) - default: - break - } - - return urlRequest - } -} -``` - -```swift -Alamofire.request(Router.readUser("mattt")) // GET /users/mattt -``` - -### Adapting and Retrying Requests - -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. - -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. - -#### RequestAdapter - -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. - -```swift -class AccessTokenAdapter: RequestAdapter { - private let accessToken: String - - init(accessToken: String) { - self.accessToken = accessToken - } - - func adapt(_ urlRequest: URLRequest) throws -> URLRequest { - var urlRequest = urlRequest - - if urlRequest.urlString.hasPrefix("https://httpbin.org") { - urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization") - } - - return urlRequest - } -} -``` - -```swift -let sessionManager = SessionManager() -sessionManager.adapter = AccessTokenAdapter(accessToken: "1234") - -sessionManager.request("https://httpbin.org/get") -``` +### Swift Package Manager -#### RequestRetrier +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. -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. +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`. -> **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. - -> 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. - -```swift -class OAuth2Handler: RequestAdapter, RequestRetrier { - private typealias RefreshCompletion = (_ succeeded: Bool, _ accessToken: String?, _ refreshToken: String?) -> Void - - private let sessionManager: SessionManager = { - let configuration = URLSessionConfiguration.default - configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders - - return SessionManager(configuration: configuration) - }() - - private let lock = NSLock() - - private var clientID: String - private var baseURLString: String - private var accessToken: String - private var refreshToken: String - - private var isRefreshing = false - private var requestsToRetry: [RequestRetryCompletion] = [] - - // MARK: - Initialization - - public init(clientID: String, baseURLString: String, accessToken: String, refreshToken: String) { - self.clientID = clientID - self.baseURLString = baseURLString - self.accessToken = accessToken - self.refreshToken = refreshToken - } - - // MARK: - RequestAdapter - - func adapt(_ urlRequest: URLRequest) throws -> URLRequest { - if let url = urlRequest.url, url.urlString.hasPrefix(baseURLString) { - var urlRequest = urlRequest - urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization") - return urlRequest - } - - return urlRequest - } - - // MARK: - RequestRetrier - - func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) { - lock.lock() ; defer { lock.unlock() } - - if let response = request.task.response as? HTTPURLResponse, response.statusCode == 401 { - requestsToRetry.append(completion) - - if !isRefreshing { - refreshTokens { [weak self] succeeded, accessToken, refreshToken in - guard let strongSelf = self else { return } - - strongSelf.lock.lock() ; defer { strongSelf.lock.unlock() } - - if let accessToken = accessToken, let refreshToken = refreshToken { - strongSelf.accessToken = accessToken - strongSelf.refreshToken = refreshToken - } - - strongSelf.requestsToRetry.forEach { $0(succeeded, 0.0) } - strongSelf.requestsToRetry.removeAll() - } - } - } else { - completion(false, 0.0) - } - } - - // MARK: - Private - Refresh Tokens - - private func refreshTokens(completion: @escaping RefreshCompletion) { - guard !isRefreshing else { return } - - isRefreshing = true - - let urlString = "\(baseURLString)/oauth2/token" - - let parameters: [String: Any] = [ - "access_token": accessToken, - "refresh_token": refreshToken, - "client_id": clientID, - "grant_type": "refresh_token" - ] - - sessionManager.request(urlString, method: .post, parameters: parameters, encoding: JSONEncoding.default) - .responseJSON { [weak self] response in - guard let strongSelf = self else { return } - - if let json = response.result.value as? [String: String] { - completion(true, json["access_token"], json["refresh_token"]) - } else { - completion(false, nil, nil) - } - - strongSelf.isRefreshing = false - } - } -} -``` - -```swift -let baseURLString = "https://some.domain-behind-oauth2.com" - -let oauthHandler = OAuth2Handler( - clientID: "12345678", - baseURLString: baseURLString, - accessToken: "abcd1234", - refreshToken: "ef56789a" -) - -let sessionManager = SessionManager() -sessionManager.adapter = oauthHandler -sessionManager.retrier = oauthHandler - -let urlString = "\(baseURLString)/some/endpoint" - -sessionManager.request(urlString).validate().responseJSON { response in - debugPrint(response) -} -``` - -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. - -> If you needed them to execute in the same order they were created, you could sort them by their task identifiers. - -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. - -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. - -### Custom Response Serialization - -#### Handling Errors - -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. - -For example, here's a simple `BackendError` enum which will be used in later examples: - -```swift -enum BackendError: Error { - case network(error: Error) // Capture any underlying Error from the URLSession API - case dataSerialization(error: Error) - case jsonSerialization(error: Error) - case xmlSerialization(error: Error) - case objectSerialization(reason: String) -} -``` - -#### Creating a Custom Response Serializer - -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`. - -For example, here's how a response handler using [Ono](https://github.com/mattt/Ono) might be implemented: - -```swift -extension DataRequest { - static func xmlResponseSerializer() -> DataResponseSerializer { - return DataResponseSerializer { request, response, data, error in - // Pass through any underlying URLSession error to the .network case. - guard error == nil else { return .failure(BackendError.network(error: error!)) } - - // Use Alamofire's existing data serializer to extract the data, passing the error as nil, as it has - // already been handled. - let result = Request.serializeResponseData(response: response, data: data, error: nil) - - guard case let .success(validData) = result else { - return .failure(BackendError.dataSerialization(error: result.error! as! AFError)) - } - - do { - let xml = try ONOXMLDocument(data: validData) - return .success(xml) - } catch { - return .failure(BackendError.xmlSerialization(error: error)) - } - } - } - - @discardableResult - func responseXMLDocument( - queue: DispatchQueue? = nil, - completionHandler: @escaping (DataResponse) -> Void) - -> Self - { - return response( - queue: queue, - responseSerializer: DataRequest.xmlResponseSerializer(), - completionHandler: completionHandler - ) - } -} -``` - -#### Generic Response Object Serialization - -Generics can be used to provide automatic, type-safe response object serialization. - -```swift -protocol ResponseObjectSerializable { - init?(response: HTTPURLResponse, representation: Any) -} - -extension DataRequest { - func responseObject( - queue: DispatchQueue? = nil, - completionHandler: @escaping (DataResponse) -> Void) - -> Self - { - let responseSerializer = DataResponseSerializer { request, response, data, error in - guard error == nil else { return .failure(BackendError.network(error: error!)) } - - let jsonResponseSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments) - let result = jsonResponseSerializer.serializeResponse(request, response, data, nil) - - guard case let .success(jsonObject) = result else { - return .failure(BackendError.jsonSerialization(error: result.error!)) - } - - guard let response = response, let responseObject = T(response: response, representation: jsonObject) else { - return .failure(BackendError.objectSerialization(reason: "JSON could not be serialized: \(jsonObject)")) - } - - return .success(responseObject) - } - - return response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler) - } -} -``` - -```swift -struct User: ResponseObjectSerializable, CustomStringConvertible { - let username: String - let name: String - - var description: String { - return "User: { username: \(username), name: \(name) }" - } - - init?(response: HTTPURLResponse, representation: Any) { - guard - let username = response.url?.lastPathComponent, - let representation = representation as? [String: Any], - let name = representation["name"] as? String - else { return nil } - - self.username = username - self.name = name - } -} -``` - -```swift -Alamofire.request("https://example.com/users/mattt").responseObject { (response: DataResponse) in - debugPrint(response) - - if let user = response.result.value { - print("User: { username: \(user.username), name: \(user.name) }") - } -} -``` - -The same approach can also be used to handle endpoints that return a representation of a collection of objects: - -```swift -protocol ResponseCollectionSerializable { - static func collection(from response: HTTPURLResponse, withRepresentation representation: Any) -> [Self] -} - -extension ResponseCollectionSerializable where Self: ResponseObjectSerializable { - static func collection(from response: HTTPURLResponse, withRepresentation representation: Any) -> [Self] { - var collection: [Self] = [] - - if let representation = representation as? [[String: Any]] { - for itemRepresentation in representation { - if let item = Self(response: response, representation: itemRepresentation) { - collection.append(item) - } - } - } - - return collection - } -} -``` - -```swift -extension DataRequest { - @discardableResult - func responseCollection( - queue: DispatchQueue? = nil, - completionHandler: @escaping (DataResponse<[T]>) -> Void) -> Self - { - let responseSerializer = DataResponseSerializer<[T]> { request, response, data, error in - guard error == nil else { return .failure(BackendError.network(error: error!)) } - - let jsonSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments) - let result = jsonSerializer.serializeResponse(request, response, data, nil) - - guard case let .success(jsonObject) = result else { - return .failure(BackendError.jsonSerialization(error: result.error!)) - } - - guard let response = response else { - let reason = "Response collection could not be serialized due to nil response." - return .failure(BackendError.objectSerialization(reason: reason)) - } - - return .success(T.collection(from: response, withRepresentation: jsonObject)) - } - - return response(responseSerializer: responseSerializer, completionHandler: completionHandler) - } -} -``` - -```swift -struct User: ResponseObjectSerializable, ResponseCollectionSerializable, CustomStringConvertible { - let username: String - let name: String - - var description: String { - return "User: { username: \(username), name: \(name) }" - } - - init?(response: HTTPURLResponse, representation: Any) { - guard - let username = response.url?.lastPathComponent, - let representation = representation as? [String: Any], - let name = representation["name"] as? String - else { return nil } - - self.username = username - self.name = name - } -} -``` - -```swift -Alamofire.request("https://example.com/users").responseCollection { (response: DataResponse<[User]>) in - debugPrint(response) - - if let users = response.result.value { - users.forEach { print("- \($0)") } - } -} -``` - -### Security - -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`. - -#### ServerTrustPolicy - -The `ServerTrustPolicy` enumeration evaluates the server trust generally provided by an `URLAuthenticationChallenge` when connecting to a server over a secure HTTPS connection. - -```swift -let serverTrustPolicy = ServerTrustPolicy.pinCertificates( - certificates: ServerTrustPolicy.certificatesInBundle(), - validateCertificateChain: true, - validateHost: true -) -``` - -There are many different cases of server trust evaluation giving you complete control over the validation process: - -* `performDefaultEvaluation`: Uses the default server trust evaluation while allowing you to control whether to validate the host provided by the challenge. -* `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. -* `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. -* `disableEvaluation`: Disables all evaluation which in turn will always consider any server trust as valid. -* `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. - -#### Server Trust Policy Manager - -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. +#### Swift 3 ```swift -let serverTrustPolicies: [String: ServerTrustPolicy] = [ - "test.example.com": .pinCertificates( - certificates: ServerTrustPolicy.certificatesInBundle(), - validateCertificateChain: true, - validateHost: true - ), - "insecure.expired-apis.com": .disableEvaluation +dependencies: [ + .Package(url: "https://github.com/Alamofire/Alamofire.git", majorVersion: 4) ] - -let sessionManager = SessionManager( - serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies) -) ``` -> Make sure to keep a reference to the new `SessionManager` instance, otherwise your requests will all get cancelled when your `sessionManager` is deallocated. - -These server trust policies will result in the following behavior: - -- `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: - - Certificate chain MUST be valid. - - Certificate chain MUST include one of the pinned certificates. - - Challenge host MUST match the host in the certificate chain's leaf certificate. -- `insecure.expired-apis.com` will never evaluate the certificate chain and will always allow the TLS handshake to succeed. -- All other hosts will use the default evaluation provided by Apple. - -##### Subclassing Server Trust Policy Manager - -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. +#### Swift 4 ```swift -class CustomServerTrustPolicyManager: ServerTrustPolicyManager { - override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? { - var policy: ServerTrustPolicy? - - // Implement your custom domain matching behavior... - - return policy - } -} +dependencies: [ + .package(url: "https://github.com/Alamofire/Alamofire.git", from: "4.0.0") +] ``` -#### Validating the Host - -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. - -> It is recommended that `validateHost` always be set to `true` in production environments. - -#### Validating the Certificate Chain - -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. - -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. - -> It is recommended that `validateCertificateChain` always be set to `true` in production environments. - -#### App Transport Security - -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. +### Manually -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`. +If you prefer not to use any of the aforementioned dependency managers, you can integrate Alamofire into your project manually. -```xml - - NSAppTransportSecurity - - NSExceptionDomains - - example.com - - NSExceptionAllowsInsecureHTTPLoads - - NSExceptionRequiresForwardSecrecy - - NSIncludesSubdomains - - - NSTemporaryExceptionMinimumTLSVersion - TLSv1.2 - - - - -``` +#### Embedded Framework -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`. +- 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: -> It is recommended to always use valid certificates in production environments. + ```bash + $ git init + ``` -### Network Reachability +- Add Alamofire as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command: -The `NetworkReachabilityManager` listens for reachability changes of hosts and addresses for both WWAN and WiFi network interfaces. + ```bash + $ git submodule add https://github.com/Alamofire/Alamofire.git + ``` -```swift -let manager = NetworkReachabilityManager(host: "www.apple.com") +- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project. -manager?.listener = { status in - print("Network Status Changed: \(status)") -} + > 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. -manager?.startListening() -``` +- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target. +- 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. +- In the tab bar at the top of that window, open the "General" panel. +- Click on the `+` button under the "Embedded Binaries" section. +- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder. -> Make sure to remember to retain the `manager` in the above example, or no status changes will be reported. + > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`. -There are some important things to remember when using network reachability to determine what to do next. +- Select the top `Alamofire.framework` for iOS and the bottom one for OS X. -- **Do NOT** use Reachability to determine if a network request should be sent. - - You should **ALWAYS** send it. -- When Reachability is restored, use the event to retry failed network requests. - - Even though the network requests may still fail, this is a good moment to retry them. -- The network reachability status can be useful for determining why a network request may have failed. - - 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." + > 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`. -> It is recommended to check out [WWDC 2012 Session 706, "Networking Best Practices"](https://developer.apple.com/videos/play/wwdc2012-706/) for more info. +- And that's it! ---- + > 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. ## Open Radars The following radars have some effect on the current implementation of Alamofire. - [`rdar://21349340`](http://www.openradar.me/radar?id=5517037090635776) - Compiler throwing warning due to toll-free bridging issue in test case -- [`rdar://26761490`](http://www.openradar.me/radar?id=5010235949318144) - Swift string interpolation causing memory leak with common usage - `rdar://26870455` - Background URL Session Configurations do not work in the simulator - `rdar://26849668` - Some URLProtocol APIs do not properly handle `URLRequest` +- [`rdar://36082113`](http://openradar.appspot.com/radar?id=4942308441063424) - `URLSessionTaskMetrics` failing to link on watchOS 3.0+ + +## Resolved Radars + +The following radars have been resolved over time after being filed against the Alamofire project. + +- [`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). ## FAQ @@ -1715,8 +210,6 @@ Simple, static data such as paths, parameters and common headers belong in the ` 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`. ---- - ## Credits 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 ## Donations -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: +The [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially stay registered 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: -- Pay our legal fees to register as a federal non-profit organization - Pay our yearly legal fees to keep the non-profit in good status - Pay for our mail servers to help us stay on top of all questions and security issues - Potentially fund test servers to make it easier for us to test the edge cases - Potentially fund developers to work on one of our projects full-time -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. +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. +Any amount you can donate today to help us reach our goal would be greatly appreciated. -Click here to lend your support to: Alamofire Software Foundation and make a donation at pledgie.com ! +[![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) ## License -Alamofire is released under the MIT license. See LICENSE for details. +Alamofire is released under the MIT license. [See LICENSE](https://github.com/Alamofire/Alamofire/blob/master/LICENSE) for details. diff --git a/ParentAssistant/Pods/Alamofire/Source/AFError.swift b/ParentAssistant/Pods/Alamofire/Source/AFError.swift index 82e8a25..8b90d84 100644 --- a/ParentAssistant/Pods/Alamofire/Source/AFError.swift +++ b/ParentAssistant/Pods/Alamofire/Source/AFError.swift @@ -1,7 +1,7 @@ // // AFError.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -132,6 +132,16 @@ public enum AFError: Error { case responseSerializationFailed(reason: ResponseSerializationFailureReason) } +// MARK: - Adapt Error + +struct AdaptError: Error { + let error: Error +} + +extension Error { + var underlyingAdaptError: Error? { return (self as? AdaptError)?.error } +} + // MARK: - Error Booleans extension AFError { diff --git a/ParentAssistant/Pods/Alamofire/Source/Alamofire.swift b/ParentAssistant/Pods/Alamofire/Source/Alamofire.swift index 7566587..2fcc05c 100644 --- a/ParentAssistant/Pods/Alamofire/Source/Alamofire.swift +++ b/ParentAssistant/Pods/Alamofire/Source/Alamofire.swift @@ -1,7 +1,7 @@ // // Alamofire.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -53,7 +53,7 @@ extension URL: URLConvertible { } extension URLComponents: URLConvertible { - /// Returns a URL if `url` is not nil, otherise throws an `Error`. + /// Returns a URL if `url` is not nil, otherwise throws an `Error`. /// /// - throws: An `AFError.invalidURL` if `url` is `nil`. /// @@ -222,6 +222,13 @@ public func download( /// If `destination` is not specified, the contents will remain in the temporary location determined by the /// underlying URL session. /// +/// On the latest release of all the Apple platforms (iOS 10, macOS 10.12, tvOS 10, watchOS 3), `resumeData` is broken +/// on background URL session configurations. There's an underlying bug in the `resumeData` generation logic where the +/// data is written incorrectly and will always fail to resume the download. For more information about the bug and +/// possible workarounds, please refer to the following Stack Overflow post: +/// +/// - http://stackoverflow.com/a/39347461/1342462 +/// /// - parameter resumeData: The resume data. This is an opaque data blob produced by `URLSessionDownloadTask` /// when a task is cancelled. See `URLSession -downloadTask(withResumeData:)` for additional /// information. @@ -435,6 +442,7 @@ public func upload( /// /// - returns: The created `StreamRequest`. @discardableResult +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *) public func stream(withHostName hostName: String, port: Int) -> StreamRequest { return SessionManager.default.stream(withHostName: hostName, port: port) } @@ -449,6 +457,7 @@ public func stream(withHostName hostName: String, port: Int) -> StreamRequest { /// /// - returns: The created `StreamRequest`. @discardableResult +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *) public func stream(with netService: NetService) -> StreamRequest { return SessionManager.default.stream(with: netService) } diff --git a/ParentAssistant/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift b/ParentAssistant/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift index 5019d0d..dea3ebc 100644 --- a/ParentAssistant/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift +++ b/ParentAssistant/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift @@ -1,7 +1,7 @@ // // DispatchQueue+Alamofire.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -34,10 +34,4 @@ extension DispatchQueue { func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) { asyncAfter(deadline: .now() + delay, execute: closure) } - - func syncResult(_ closure: () -> T) -> T { - var result: T! - sync { result = closure() } - return result - } } diff --git a/ParentAssistant/Pods/Alamofire/Source/MultipartFormData.swift b/ParentAssistant/Pods/Alamofire/Source/MultipartFormData.swift index 1ce4d19..057e68b 100644 --- a/ParentAssistant/Pods/Alamofire/Source/MultipartFormData.swift +++ b/ParentAssistant/Pods/Alamofire/Source/MultipartFormData.swift @@ -1,7 +1,7 @@ // // MultipartFormData.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -92,7 +92,7 @@ open class MultipartFormData { // MARK: - Properties /// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`. - open var contentType: String { return "multipart/form-data; boundary=\(boundary)" } + open lazy var contentType: String = "multipart/form-data; boundary=\(self.boundary)" /// The content length of all body parts used to generate the `multipart/form-data` not including the boundaries. public var contentLength: UInt64 { return bodyParts.reduce(0) { $0 + $1.bodyContentLength } } @@ -257,8 +257,7 @@ open class MultipartFormData { var isDirectory: ObjCBool = false let path = fileURL.path - guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else - { + guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else { setBodyPartError(withReason: .bodyPartFileIsDirectory(at: fileURL)) return } diff --git a/ParentAssistant/Pods/Alamofire/Source/NetworkReachabilityManager.swift b/ParentAssistant/Pods/Alamofire/Source/NetworkReachabilityManager.swift index c06a60e..3ff2e7f 100644 --- a/ParentAssistant/Pods/Alamofire/Source/NetworkReachabilityManager.swift +++ b/ParentAssistant/Pods/Alamofire/Source/NetworkReachabilityManager.swift @@ -1,7 +1,7 @@ // // NetworkReachabilityManager.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -34,16 +34,6 @@ import SystemConfiguration /// network requests when a connection is established. It should not be used to prevent a user from initiating a network /// request, as it's possible that an initial request may be required to establish reachability. open class NetworkReachabilityManager { - /** - Defines the various states of network reachability. - - - Unknown: It is unknown whether the network is reachable. - - NotReachable: The network is not reachable. - - ReachableOnWWAN: The network is reachable over the WWAN connection. - - ReachableOnWiFi: The network is reachable over the WiFi connection. - */ - - /// Defines the various states of network reachability. /// /// - unknown: It is unknown whether the network is reachable. @@ -91,7 +81,7 @@ open class NetworkReachabilityManager { /// A closure executed when the network reachability status changes. open var listener: Listener? - private var flags: SCNetworkReachabilityFlags? { + open var flags: SCNetworkReachabilityFlags? { var flags = SCNetworkReachabilityFlags() if SCNetworkReachabilityGetFlags(reachability, &flags) { @@ -102,7 +92,7 @@ open class NetworkReachabilityManager { } private let reachability: SCNetworkReachability - private var previousFlags: SCNetworkReachabilityFlags + open var previousFlags: SCNetworkReachabilityFlags // MARK: - Initialization @@ -192,21 +182,24 @@ open class NetworkReachabilityManager { // MARK: - Internal - Network Reachability Status func networkReachabilityStatusForFlags(_ flags: SCNetworkReachabilityFlags) -> NetworkReachabilityStatus { - guard flags.contains(.reachable) else { return .notReachable } + guard isNetworkReachable(with: flags) else { return .notReachable } - var networkStatus: NetworkReachabilityStatus = .notReachable + var networkStatus: NetworkReachabilityStatus = .reachable(.ethernetOrWiFi) - if !flags.contains(.connectionRequired) { networkStatus = .reachable(.ethernetOrWiFi) } + #if os(iOS) + if flags.contains(.isWWAN) { networkStatus = .reachable(.wwan) } + #endif - if flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic) { - if !flags.contains(.interventionRequired) { networkStatus = .reachable(.ethernetOrWiFi) } - } + return networkStatus + } - #if os(iOS) - if flags.contains(.isWWAN) { networkStatus = .reachable(.wwan) } - #endif + func isNetworkReachable(with flags: SCNetworkReachabilityFlags) -> Bool { + let isReachable = flags.contains(.reachable) + let needsConnection = flags.contains(.connectionRequired) + let canConnectAutomatically = flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic) + let canConnectWithoutUserInteraction = canConnectAutomatically && !flags.contains(.interventionRequired) - return networkStatus + return isReachable && (!needsConnection || canConnectWithoutUserInteraction) } } diff --git a/ParentAssistant/Pods/Alamofire/Source/Notifications.swift b/ParentAssistant/Pods/Alamofire/Source/Notifications.swift index 81f6e37..e1b6120 100644 --- a/ParentAssistant/Pods/Alamofire/Source/Notifications.swift +++ b/ParentAssistant/Pods/Alamofire/Source/Notifications.swift @@ -1,7 +1,7 @@ // // Notifications.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -48,5 +48,8 @@ extension Notification { public struct Key { /// User info dictionary key representing the `URLSessionTask` associated with the notification. public static let Task = "org.alamofire.notification.key.task" + + /// User info dictionary key representing the responseData associated with the notification. + public static let ResponseData = "org.alamofire.notification.key.responseData" } } diff --git a/ParentAssistant/Pods/Alamofire/Source/ParameterEncoding.swift b/ParentAssistant/Pods/Alamofire/Source/ParameterEncoding.swift index 42b5b2d..4a54f2d 100644 --- a/ParentAssistant/Pods/Alamofire/Source/ParameterEncoding.swift +++ b/ParentAssistant/Pods/Alamofire/Source/ParameterEncoding.swift @@ -1,7 +1,7 @@ // // ParameterEncoding.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -64,9 +64,15 @@ public protocol ParameterEncoding { /// the HTTP body depends on the destination of the encoding. /// /// 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`). +/// `application/x-www-form-urlencoded; charset=utf-8`. +/// +/// There is no published specification for how to encode collection types. By default 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`) is used. Optionally, `ArrayEncoding` can be used to omit the +/// square brackets appended to array keys. +/// +/// `BoolEncoding` can be used to configure how boolean values are encoded. The default behavior is to encode +/// `true` as 1 and `false` as 0. public struct URLEncoding: ParameterEncoding { // MARK: Helper Types @@ -82,6 +88,41 @@ public struct URLEncoding: ParameterEncoding { case methodDependent, queryString, httpBody } + /// Configures how `Array` parameters are encoded. + /// + /// - brackets: An empty set of square brackets is appended to the key for every value. + /// This is the default behavior. + /// - noBrackets: No brackets are appended. The key is encoded as is. + public enum ArrayEncoding { + case brackets, noBrackets + + func encode(key: String) -> String { + switch self { + case .brackets: + return "\(key)[]" + case .noBrackets: + return key + } + } + } + + /// Configures how `Bool` parameters are encoded. + /// + /// - numeric: Encode `true` as `1` and `false` as `0`. This is the default behavior. + /// - literal: Encode `true` and `false` as string literals. + public enum BoolEncoding { + case numeric, literal + + func encode(value: Bool) -> String { + switch self { + case .numeric: + return value ? "1" : "0" + case .literal: + return value ? "true" : "false" + } + } + } + // MARK: Properties /// Returns a default `URLEncoding` instance. @@ -99,15 +140,25 @@ public struct URLEncoding: ParameterEncoding { /// The destination defining where the encoded query string is to be applied to the URL request. public let destination: Destination + /// The encoding to use for `Array` parameters. + public let arrayEncoding: ArrayEncoding + + /// The encoding to use for `Bool` parameters. + public let boolEncoding: BoolEncoding + // MARK: Initialization /// Creates a `URLEncoding` instance using the specified destination. /// /// - parameter destination: The destination defining where the encoded query string is to be applied. + /// - parameter arrayEncoding: The encoding to use for `Array` parameters. + /// - parameter boolEncoding: The encoding to use for `Bool` parameters. /// /// - returns: The new `URLEncoding` instance. - public init(destination: Destination = .methodDependent) { + public init(destination: Destination = .methodDependent, arrayEncoding: ArrayEncoding = .brackets, boolEncoding: BoolEncoding = .numeric) { self.destination = destination + self.arrayEncoding = arrayEncoding + self.boolEncoding = boolEncoding } // MARK: Encoding @@ -161,16 +212,16 @@ public struct URLEncoding: ParameterEncoding { } } else if let array = value as? [Any] { for value in array { - components += queryComponents(fromKey: "\(key)[]", value: value) + components += queryComponents(fromKey: arrayEncoding.encode(key: key), value: value) } } else if let value = value as? NSNumber { if value.isBool { - components.append((escape(key), escape((value.boolValue ? "1" : "0")))) + components.append((escape(key), escape(boolEncoding.encode(value: value.boolValue)))) } else { components.append((escape(key), escape("\(value)"))) } } else if let bool = value as? Bool { - components.append((escape(key), escape((bool ? "1" : "0")))) + components.append((escape(key), escape(boolEncoding.encode(value: bool)))) } else { components.append((escape(key), escape("\(value)"))) } @@ -199,7 +250,39 @@ public struct URLEncoding: ParameterEncoding { var allowedCharacterSet = CharacterSet.urlQueryAllowed allowedCharacterSet.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)") - return string.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? string + var escaped = "" + + //========================================================================================================== + // + // Batching is required for escaping due to an internal bug in iOS 8.1 and 8.2. Encoding more than a few + // hundred Chinese characters causes various malloc error crashes. To avoid this issue until iOS 8 is no + // longer supported, batching MUST be used for encoding. This introduces roughly a 20% overhead. For more + // info, please refer to: + // + // - https://github.com/Alamofire/Alamofire/issues/206 + // + //========================================================================================================== + + if #available(iOS 8.3, *) { + escaped = string.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? string + } else { + let batchSize = 50 + var index = string.startIndex + + while index != string.endIndex { + let startIndex = index + let endIndex = string.index(index, offsetBy: batchSize, limitedBy: string.endIndex) ?? string.endIndex + let range = startIndex.. String { @@ -209,7 +292,6 @@ public struct URLEncoding: ParameterEncoding { let value = parameters[key]! components += queryComponents(fromKey: key, value: value) } - return components.map { "\($0)=\($1)" }.joined(separator: "&") } @@ -289,6 +371,34 @@ public struct JSONEncoding: ParameterEncoding { return urlRequest } + + /// Creates a URL request by encoding the JSON object and setting the resulting data on the HTTP body. + /// + /// - parameter urlRequest: The request to apply the JSON object to. + /// - parameter jsonObject: The JSON object to apply to the request. + /// + /// - throws: An `Error` if the encoding process encounters an error. + /// + /// - returns: The encoded request. + public func encode(_ urlRequest: URLRequestConvertible, withJSONObject jsonObject: Any? = nil) throws -> URLRequest { + var urlRequest = try urlRequest.asURLRequest() + + guard let jsonObject = jsonObject else { return urlRequest } + + do { + let data = try JSONSerialization.data(withJSONObject: jsonObject, options: options) + + if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil { + urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") + } + + urlRequest.httpBody = data + } catch { + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) + } + + return urlRequest + } } // MARK: - diff --git a/ParentAssistant/Pods/Alamofire/Source/Request.swift b/ParentAssistant/Pods/Alamofire/Source/Request.swift index 85eb869..94e7b6e 100644 --- a/ParentAssistant/Pods/Alamofire/Source/Request.swift +++ b/ParentAssistant/Pods/Alamofire/Source/Request.swift @@ -1,7 +1,7 @@ // // Request.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -46,7 +46,7 @@ public typealias RequestRetryCompletion = (_ shouldRetry: Bool, _ timeDelay: Tim public protocol RequestRetrier { /// Determines whether the `Request` should be retried by calling the `completion` closure. /// - /// This operation is fully asychronous. Any amount of time can be taken to determine whether the request needs + /// This operation is fully asynchronous. Any amount of time can be taken to determine whether the request needs /// to be retried. The one requirement is that the completion closure is called to ensure the request is properly /// cleaned up after. /// @@ -110,6 +110,9 @@ open class Request { /// The response received from the server, if any. open var response: HTTPURLResponse? { return task?.response as? HTTPURLResponse } + /// The number of times the request has been retried. + open internal(set) var retryCount: UInt = 0 + let originalTask: TaskConvertible? var startTime: CFAbsoluteTime? @@ -266,7 +269,7 @@ extension Request: CustomDebugStringConvertible { } func cURLRepresentation() -> String { - var components = ["$ curl -i"] + var components = ["$ curl -v"] guard let request = self.request, let url = request.url, @@ -290,11 +293,12 @@ extension Request: CustomDebugStringConvertible { if let credentials = credentialStorage.credentials(for: protectionSpace)?.values { for credential in credentials { - components.append("-u \(credential.user!):\(credential.password!)") + guard let user = credential.user, let password = credential.password else { continue } + components.append("-u \(user):\(password)") } } else { - if let credential = delegate.credential { - components.append("-u \(credential.user!):\(credential.password!)") + if let credential = delegate.credential, let user = credential.user, let password = credential.password { + components.append("-u \(user):\(password)") } } } @@ -305,7 +309,12 @@ extension Request: CustomDebugStringConvertible { let cookies = cookieStorage.cookies(for: url), !cookies.isEmpty { let string = cookies.reduce("") { $0 + "\($1.name)=\($1.value);" } + + #if swift(>=3.2) + components.append("-b \"\(string[.. URLSessionTask { - let urlRequest = try self.urlRequest.adapt(using: adapter) - return queue.syncResult { session.dataTask(with: urlRequest) } + do { + let urlRequest = try self.urlRequest.adapt(using: adapter) + return queue.sync { session.dataTask(with: urlRequest) } + } catch { + throw AdaptError(error: error) + } } } // MARK: Properties + /// The request sent or to be sent to the server. + open override var request: URLRequest? { + if let request = super.request { return request } + if let requestable = originalTask as? Requestable { return requestable.urlRequest } + + return nil + } + /// The progress of fetching the response data from the server for the request. open var progress: Progress { return dataDelegate.progress } @@ -438,22 +460,37 @@ open class DownloadRequest: Request { case resumeData(Data) func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask { - let task: URLSessionTask + do { + let task: URLSessionTask + + switch self { + case let .request(urlRequest): + let urlRequest = try urlRequest.adapt(using: adapter) + task = queue.sync { session.downloadTask(with: urlRequest) } + case let .resumeData(resumeData): + task = queue.sync { session.downloadTask(withResumeData: resumeData) } + } - switch self { - case let .request(urlRequest): - let urlRequest = try urlRequest.adapt(using: adapter) - task = queue.syncResult { session.downloadTask(with: urlRequest) } - case let .resumeData(resumeData): - task = queue.syncResult { session.downloadTask(withResumeData: resumeData) } + return task + } catch { + throw AdaptError(error: error) } - - return task } } // MARK: Properties + /// The request sent or to be sent to the server. + open override var request: URLRequest? { + if let request = super.request { return request } + + if let downloadable = originalTask as? Downloadable, case let .request(urlRequest) = downloadable { + return urlRequest + } + + return nil + } + /// The resume data of the underlying download task if available after a failure. open var resumeData: Data? { return downloadDelegate.resumeData } @@ -471,7 +508,7 @@ open class DownloadRequest: Request { NotificationCenter.default.post( name: Notification.Name.Task.DidCancel, object: self, - userInfo: [Notification.Key.Task: task] + userInfo: [Notification.Key.Task: task as Any] ) } @@ -528,26 +565,42 @@ open class UploadRequest: DataRequest { case stream(InputStream, URLRequest) func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask { - let task: URLSessionTask + do { + let task: URLSessionTask + + switch self { + case let .data(data, urlRequest): + let urlRequest = try urlRequest.adapt(using: adapter) + task = queue.sync { session.uploadTask(with: urlRequest, from: data) } + case let .file(url, urlRequest): + let urlRequest = try urlRequest.adapt(using: adapter) + task = queue.sync { session.uploadTask(with: urlRequest, fromFile: url) } + case let .stream(_, urlRequest): + let urlRequest = try urlRequest.adapt(using: adapter) + task = queue.sync { session.uploadTask(withStreamedRequest: urlRequest) } + } - switch self { - case let .data(data, urlRequest): - let urlRequest = try urlRequest.adapt(using: adapter) - task = queue.syncResult { session.uploadTask(with: urlRequest, from: data) } - case let .file(url, urlRequest): - let urlRequest = try urlRequest.adapt(using: adapter) - task = queue.syncResult { session.uploadTask(with: urlRequest, fromFile: url) } - case let .stream(_, urlRequest): - let urlRequest = try urlRequest.adapt(using: adapter) - task = queue.syncResult { session.uploadTask(withStreamedRequest: urlRequest) } + return task + } catch { + throw AdaptError(error: error) } - - return task } } // MARK: Properties + /// The request sent or to be sent to the server. + open override var request: URLRequest? { + if let request = super.request { return request } + + guard let uploadable = originalTask as? Uploadable else { return nil } + + switch uploadable { + case .data(_, let urlRequest), .file(_, let urlRequest), .stream(_, let urlRequest): + return urlRequest + } + } + /// The progress of uploading the payload to the server for the upload request. open var uploadProgress: Progress { return uploadDelegate.uploadProgress } @@ -577,6 +630,7 @@ open class UploadRequest: DataRequest { #if !os(watchOS) /// Specific type of `Request` that manages an underlying `URLSessionStreamTask`. +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *) open class StreamRequest: Request { enum Streamable: TaskConvertible { case stream(hostName: String, port: Int) @@ -587,9 +641,9 @@ open class StreamRequest: Request { switch self { case let .stream(hostName, port): - task = queue.syncResult { session.streamTask(withHostName: hostName, port: port) } + task = queue.sync { session.streamTask(withHostName: hostName, port: port) } case let .netService(netService): - task = queue.syncResult { session.streamTask(with: netService) } + task = queue.sync { session.streamTask(with: netService) } } return task diff --git a/ParentAssistant/Pods/Alamofire/Source/Response.swift b/ParentAssistant/Pods/Alamofire/Source/Response.swift index f80779c..74b1ef5 100644 --- a/ParentAssistant/Pods/Alamofire/Source/Response.swift +++ b/ParentAssistant/Pods/Alamofire/Source/Response.swift @@ -1,7 +1,7 @@ // // Response.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -38,13 +38,33 @@ public struct DefaultDataResponse { /// The error encountered while executing or validating the request. public let error: Error? + /// The timeline of the complete lifecycle of the request. + public let timeline: Timeline + var _metrics: AnyObject? - init(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) { + /// Creates a `DefaultDataResponse` instance from the specified parameters. + /// + /// - Parameters: + /// - request: The URL request sent to the server. + /// - response: The server's response to the URL request. + /// - data: The data returned by the server. + /// - error: The error encountered while executing or validating the request. + /// - timeline: The timeline of the complete lifecycle of the request. `Timeline()` by default. + /// - metrics: The task metrics containing the request / response statistics. `nil` by default. + public init( + request: URLRequest?, + response: HTTPURLResponse?, + data: Data?, + error: Error?, + timeline: Timeline = Timeline(), + metrics: AnyObject? = nil) + { self.request = request self.response = response self.data = data self.error = error + self.timeline = timeline } } @@ -64,9 +84,15 @@ public struct DataResponse { /// The result of response serialization. public let result: Result - /// The timeline of the complete lifecycle of the `Request`. + /// The timeline of the complete lifecycle of the request. public let timeline: Timeline + /// Returns the associated value of the result if it is a success, `nil` otherwise. + public var value: Value? { return result.value } + + /// Returns the associated error value if the result if it is a failure, `nil` otherwise. + public var error: Error? { return result.error } + var _metrics: AnyObject? /// Creates a `DataResponse` instance with the specified parameters derived from response serialization. @@ -107,7 +133,7 @@ extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible { public var debugDescription: String { var output: [String] = [] - output.append(request != nil ? "[Request]: \(request!)" : "[Request]: nil") + output.append(request != nil ? "[Request]: \(request!.httpMethod ?? "GET") \(request!)" : "[Request]: nil") output.append(response != nil ? "[Response]: \(response!)" : "[Response]: nil") output.append("[Data]: \(data?.count ?? 0) bytes") output.append("[Result]: \(result.debugDescription)") @@ -119,6 +145,113 @@ extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible { // MARK: - +extension DataResponse { + /// Evaluates the specified closure when the result of this `DataResponse` is a success, passing the unwrapped + /// result value as a parameter. + /// + /// Use the `map` method with a closure that does not throw. For example: + /// + /// let possibleData: DataResponse = ... + /// let possibleInt = possibleData.map { $0.count } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A `DataResponse` whose result wraps the value returned by the given closure. If this instance's + /// result is a failure, returns a response wrapping the same failure. + public func map(_ transform: (Value) -> T) -> DataResponse { + var response = DataResponse( + request: request, + response: self.response, + data: data, + result: result.map(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// Evaluates the given closure when the result of this `DataResponse` is a success, passing the unwrapped result + /// value as a parameter. + /// + /// Use the `flatMap` method with a closure that may throw an error. For example: + /// + /// let possibleData: DataResponse = ... + /// let possibleObject = possibleData.flatMap { + /// try JSONSerialization.jsonObject(with: $0) + /// } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A success or failure `DataResponse` depending on the result of the given closure. If this instance's + /// result is a failure, returns the same failure. + public func flatMap(_ transform: (Value) throws -> T) -> DataResponse { + var response = DataResponse( + request: request, + response: self.response, + data: data, + result: result.flatMap(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `mapError` function with a closure that does not throw. For example: + /// + /// let possibleData: DataResponse = ... + /// let withMyError = possibleData.mapError { MyError.error($0) } + /// + /// - Parameter transform: A closure that takes the error of the instance. + /// - Returns: A `DataResponse` instance containing the result of the transform. + public func mapError(_ transform: (Error) -> E) -> DataResponse { + var response = DataResponse( + request: request, + response: self.response, + data: data, + result: result.mapError(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `flatMapError` function with a closure that may throw an error. For example: + /// + /// let possibleData: DataResponse = ... + /// let possibleObject = possibleData.flatMapError { + /// try someFailableFunction(taking: $0) + /// } + /// + /// - Parameter transform: A throwing closure that takes the error of the instance. + /// + /// - Returns: A `DataResponse` instance containing the result of the transform. + public func flatMapError(_ transform: (Error) throws -> E) -> DataResponse { + var response = DataResponse( + request: request, + response: self.response, + data: data, + result: result.flatMapError(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } +} + +// MARK: - + /// Used to store all data associated with an non-serialized response of a download request. public struct DefaultDownloadResponse { /// The URL request sent to the server. @@ -139,15 +272,31 @@ public struct DefaultDownloadResponse { /// The error encountered while executing or validating the request. public let error: Error? + /// The timeline of the complete lifecycle of the request. + public let timeline: Timeline + var _metrics: AnyObject? - init( + /// Creates a `DefaultDownloadResponse` instance from the specified parameters. + /// + /// - Parameters: + /// - request: The URL request sent to the server. + /// - response: The server's response to the URL request. + /// - temporaryURL: The temporary destination URL of the data returned from the server. + /// - destinationURL: The final destination URL of the data returned from the server if it was moved. + /// - resumeData: The resume data generated if the request was cancelled. + /// - error: The error encountered while executing or validating the request. + /// - timeline: The timeline of the complete lifecycle of the request. `Timeline()` by default. + /// - metrics: The task metrics containing the request / response statistics. `nil` by default. + public init( request: URLRequest?, response: HTTPURLResponse?, temporaryURL: URL?, destinationURL: URL?, resumeData: Data?, - error: Error?) + error: Error?, + timeline: Timeline = Timeline(), + metrics: AnyObject? = nil) { self.request = request self.response = response @@ -155,6 +304,7 @@ public struct DefaultDownloadResponse { self.destinationURL = destinationURL self.resumeData = resumeData self.error = error + self.timeline = timeline } } @@ -183,6 +333,12 @@ public struct DownloadResponse { /// The timeline of the complete lifecycle of the request. public let timeline: Timeline + /// Returns the associated value of the result if it is a success, `nil` otherwise. + public var value: Value? { return result.value } + + /// Returns the associated error value if the result if it is a failure, `nil` otherwise. + public var error: Error? { return result.error } + var _metrics: AnyObject? /// Creates a `DownloadResponse` instance with the specified parameters derived from response serialization. @@ -230,7 +386,7 @@ extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertibl public var debugDescription: String { var output: [String] = [] - output.append(request != nil ? "[Request]: \(request!)" : "[Request]: nil") + output.append(request != nil ? "[Request]: \(request!.httpMethod ?? "GET") \(request!)" : "[Request]: nil") output.append(response != nil ? "[Response]: \(response!)" : "[Response]: nil") output.append("[TemporaryURL]: \(temporaryURL?.path ?? "nil")") output.append("[DestinationURL]: \(destinationURL?.path ?? "nil")") @@ -244,6 +400,121 @@ extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertibl // MARK: - +extension DownloadResponse { + /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped + /// result value as a parameter. + /// + /// Use the `map` method with a closure that does not throw. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let possibleInt = possibleData.map { $0.count } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A `DownloadResponse` whose result wraps the value returned by the given closure. If this instance's + /// result is a failure, returns a response wrapping the same failure. + public func map(_ transform: (Value) -> T) -> DownloadResponse { + var response = DownloadResponse( + request: request, + response: self.response, + temporaryURL: temporaryURL, + destinationURL: destinationURL, + resumeData: resumeData, + result: result.map(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped + /// result value as a parameter. + /// + /// Use the `flatMap` method with a closure that may throw an error. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let possibleObject = possibleData.flatMap { + /// try JSONSerialization.jsonObject(with: $0) + /// } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A success or failure `DownloadResponse` depending on the result of the given closure. If this + /// instance's result is a failure, returns the same failure. + public func flatMap(_ transform: (Value) throws -> T) -> DownloadResponse { + var response = DownloadResponse( + request: request, + response: self.response, + temporaryURL: temporaryURL, + destinationURL: destinationURL, + resumeData: resumeData, + result: result.flatMap(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `mapError` function with a closure that does not throw. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let withMyError = possibleData.mapError { MyError.error($0) } + /// + /// - Parameter transform: A closure that takes the error of the instance. + /// - Returns: A `DownloadResponse` instance containing the result of the transform. + public func mapError(_ transform: (Error) -> E) -> DownloadResponse { + var response = DownloadResponse( + request: request, + response: self.response, + temporaryURL: temporaryURL, + destinationURL: destinationURL, + resumeData: resumeData, + result: result.mapError(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `flatMapError` function with a closure that may throw an error. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let possibleObject = possibleData.flatMapError { + /// try someFailableFunction(taking: $0) + /// } + /// + /// - Parameter transform: A throwing closure that takes the error of the instance. + /// + /// - Returns: A `DownloadResponse` instance containing the result of the transform. + public func flatMapError(_ transform: (Error) throws -> E) -> DownloadResponse { + var response = DownloadResponse( + request: request, + response: self.response, + temporaryURL: temporaryURL, + destinationURL: destinationURL, + resumeData: resumeData, + result: result.flatMapError(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } +} + +// MARK: - + protocol Response { /// The task metrics containing the request / response statistics. var _metrics: AnyObject? { get set } diff --git a/ParentAssistant/Pods/Alamofire/Source/ResponseSerialization.swift b/ParentAssistant/Pods/Alamofire/Source/ResponseSerialization.swift index 0bbb373..3333726 100644 --- a/ParentAssistant/Pods/Alamofire/Source/ResponseSerialization.swift +++ b/ParentAssistant/Pods/Alamofire/Source/ResponseSerialization.swift @@ -1,7 +1,7 @@ // // ResponseSerialization.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -84,6 +84,23 @@ public struct DownloadResponseSerializer: DownloadResponseSerializerProto } } +// MARK: - Timeline + +extension Request { + var timeline: Timeline { + let requestStartTime = self.startTime ?? CFAbsoluteTimeGetCurrent() + let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent() + let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime + + return Timeline( + requestStartTime: requestStartTime, + initialResponseTime: initialResponseTime, + requestCompletedTime: requestCompletedTime, + serializationCompletedTime: CFAbsoluteTimeGetCurrent() + ) + } +} + // MARK: - Default extension DataRequest { @@ -101,7 +118,8 @@ extension DataRequest { request: self.request, response: self.response, data: self.delegate.data, - error: self.delegate.error + error: self.delegate.error, + timeline: self.timeline ) dataResponse.add(self.delegate.metrics) @@ -136,22 +154,12 @@ extension DataRequest { self.delegate.error ) - let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent() - let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime - - let timeline = Timeline( - requestStartTime: self.startTime ?? CFAbsoluteTimeGetCurrent(), - initialResponseTime: initialResponseTime, - requestCompletedTime: requestCompletedTime, - serializationCompletedTime: CFAbsoluteTimeGetCurrent() - ) - var dataResponse = DataResponse( request: self.request, response: self.response, data: self.delegate.data, result: result, - timeline: timeline + timeline: self.timeline ) dataResponse.add(self.delegate.metrics) @@ -184,7 +192,8 @@ extension DownloadRequest { temporaryURL: self.downloadDelegate.temporaryURL, destinationURL: self.downloadDelegate.destinationURL, resumeData: self.downloadDelegate.resumeData, - error: self.downloadDelegate.error + error: self.downloadDelegate.error, + timeline: self.timeline ) downloadResponse.add(self.delegate.metrics) @@ -219,16 +228,6 @@ extension DownloadRequest { self.downloadDelegate.error ) - let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent() - let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime - - let timeline = Timeline( - requestStartTime: self.startTime ?? CFAbsoluteTimeGetCurrent(), - initialResponseTime: initialResponseTime, - requestCompletedTime: requestCompletedTime, - serializationCompletedTime: CFAbsoluteTimeGetCurrent() - ) - var downloadResponse = DownloadResponse( request: self.request, response: self.response, @@ -236,7 +235,7 @@ extension DownloadRequest { destinationURL: self.downloadDelegate.destinationURL, resumeData: self.downloadDelegate.resumeData, result: result, - timeline: timeline + timeline: self.timeline ) downloadResponse.add(self.delegate.metrics) @@ -369,13 +368,13 @@ extension Request { var convertedEncoding = encoding - if let encodingName = response?.textEncodingName as CFString!, convertedEncoding == nil { + if let encodingName = response?.textEncodingName as CFString?, convertedEncoding == nil { convertedEncoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding( CFStringConvertIANACharSetNameToEncoding(encodingName)) ) } - let actualEncoding = convertedEncoding ?? String.Encoding.isoLatin1 + let actualEncoding = convertedEncoding ?? .isoLatin1 if let string = String(data: validData, encoding: actualEncoding) { return .success(string) diff --git a/ParentAssistant/Pods/Alamofire/Source/Result.swift b/ParentAssistant/Pods/Alamofire/Source/Result.swift index 2293308..df62e12 100644 --- a/ParentAssistant/Pods/Alamofire/Source/Result.swift +++ b/ParentAssistant/Pods/Alamofire/Source/Result.swift @@ -1,7 +1,7 @@ // // Result.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -100,3 +100,201 @@ extension Result: CustomDebugStringConvertible { } } } + +// MARK: - Functional APIs + +extension Result { + /// Creates a `Result` instance from the result of a closure. + /// + /// A failure result is created when the closure throws, and a success result is created when the closure + /// succeeds without throwing an error. + /// + /// func someString() throws -> String { ... } + /// + /// let result = Result(value: { + /// return try someString() + /// }) + /// + /// // The type of result is Result + /// + /// The trailing closure syntax is also supported: + /// + /// let result = Result { try someString() } + /// + /// - parameter value: The closure to execute and create the result for. + public init(value: () throws -> Value) { + do { + self = try .success(value()) + } catch { + self = .failure(error) + } + } + + /// Returns the success value, or throws the failure error. + /// + /// let possibleString: Result = .success("success") + /// try print(possibleString.unwrap()) + /// // Prints "success" + /// + /// let noString: Result = .failure(error) + /// try print(noString.unwrap()) + /// // Throws error + public func unwrap() throws -> Value { + switch self { + case .success(let value): + return value + case .failure(let error): + throw error + } + } + + /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter. + /// + /// Use the `map` method with a closure that does not throw. For example: + /// + /// let possibleData: Result = .success(Data()) + /// let possibleInt = possibleData.map { $0.count } + /// try print(possibleInt.unwrap()) + /// // Prints "0" + /// + /// let noData: Result = .failure(error) + /// let noInt = noData.map { $0.count } + /// try print(noInt.unwrap()) + /// // Throws error + /// + /// - parameter transform: A closure that takes the success value of the `Result` instance. + /// + /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the + /// same failure. + public func map(_ transform: (Value) -> T) -> Result { + switch self { + case .success(let value): + return .success(transform(value)) + case .failure(let error): + return .failure(error) + } + } + + /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter. + /// + /// Use the `flatMap` method with a closure that may throw an error. For example: + /// + /// let possibleData: Result = .success(Data(...)) + /// let possibleObject = possibleData.flatMap { + /// try JSONSerialization.jsonObject(with: $0) + /// } + /// + /// - parameter transform: A closure that takes the success value of the instance. + /// + /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the + /// same failure. + public func flatMap(_ transform: (Value) throws -> T) -> Result { + switch self { + case .success(let value): + do { + return try .success(transform(value)) + } catch { + return .failure(error) + } + case .failure(let error): + return .failure(error) + } + } + + /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `mapError` function with a closure that does not throw. For example: + /// + /// let possibleData: Result = .failure(someError) + /// let withMyError: Result = possibleData.mapError { MyError.error($0) } + /// + /// - Parameter transform: A closure that takes the error of the instance. + /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns + /// the same instance. + public func mapError(_ transform: (Error) -> T) -> Result { + switch self { + case .failure(let error): + return .failure(transform(error)) + case .success: + return self + } + } + + /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `flatMapError` function with a closure that may throw an error. For example: + /// + /// let possibleData: Result = .success(Data(...)) + /// let possibleObject = possibleData.flatMapError { + /// try someFailableFunction(taking: $0) + /// } + /// + /// - Parameter transform: A throwing closure that takes the error of the instance. + /// + /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns + /// the same instance. + public func flatMapError(_ transform: (Error) throws -> T) -> Result { + switch self { + case .failure(let error): + do { + return try .failure(transform(error)) + } catch { + return .failure(error) + } + case .success: + return self + } + } + + /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter. + /// + /// Use the `withValue` function to evaluate the passed closure without modifying the `Result` instance. + /// + /// - Parameter closure: A closure that takes the success value of this instance. + /// - Returns: This `Result` instance, unmodified. + @discardableResult + public func withValue(_ closure: (Value) -> Void) -> Result { + if case let .success(value) = self { closure(value) } + + return self + } + + /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `withError` function to evaluate the passed closure without modifying the `Result` instance. + /// + /// - Parameter closure: A closure that takes the success value of this instance. + /// - Returns: This `Result` instance, unmodified. + @discardableResult + public func withError(_ closure: (Error) -> Void) -> Result { + if case let .failure(error) = self { closure(error) } + + return self + } + + /// Evaluates the specified closure when the `Result` is a success. + /// + /// Use the `ifSuccess` function to evaluate the passed closure without modifying the `Result` instance. + /// + /// - Parameter closure: A `Void` closure. + /// - Returns: This `Result` instance, unmodified. + @discardableResult + public func ifSuccess(_ closure: () -> Void) -> Result { + if isSuccess { closure() } + + return self + } + + /// Evaluates the specified closure when the `Result` is a failure. + /// + /// Use the `ifFailure` function to evaluate the passed closure without modifying the `Result` instance. + /// + /// - Parameter closure: A `Void` closure. + /// - Returns: This `Result` instance, unmodified. + @discardableResult + public func ifFailure(_ closure: () -> Void) -> Result { + if isFailure { closure() } + + return self + } +} diff --git a/ParentAssistant/Pods/Alamofire/Source/ServerTrustPolicy.swift b/ParentAssistant/Pods/Alamofire/Source/ServerTrustPolicy.swift index 4d5030f..a644ad8 100644 --- a/ParentAssistant/Pods/Alamofire/Source/ServerTrustPolicy.swift +++ b/ParentAssistant/Pods/Alamofire/Source/ServerTrustPolicy.swift @@ -1,7 +1,7 @@ // // ServerTrustPolicy.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -88,6 +88,13 @@ extension URLSession { /// validate the host in production environments to guarantee the validity of the server's /// certificate chain. /// +/// - performRevokedEvaluation: Uses the default and revoked server trust evaluations allowing you to control whether to +/// validate the host provided by the challenge as well as specify the revocation flags for +/// testing for revoked certificates. Apple platforms did not start testing for revoked +/// certificates automatically until iOS 10.1, macOS 10.12 and tvOS 10.1 which is +/// demonstrated in our TLS tests. Applications are encouraged to always validate the host +/// in production environments to guarantee the validity of the server's certificate chain. +/// /// - 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. /// By validating both the certificate chain and host, certificate pinning provides a very @@ -107,6 +114,7 @@ extension URLSession { /// - customEvaluation: Uses the associated closure to evaluate the validity of the server trust. public enum ServerTrustPolicy { case performDefaultEvaluation(validateHost: Bool) + case performRevokedEvaluation(validateHost: Bool, revocationFlags: CFOptionFlags) case pinCertificates(certificates: [SecCertificate], validateCertificateChain: Bool, validateHost: Bool) case pinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool) case disableEvaluation @@ -172,6 +180,12 @@ public enum ServerTrustPolicy { SecTrustSetPolicies(serverTrust, policy) serverTrustIsValid = trustIsValid(serverTrust) + case let .performRevokedEvaluation(validateHost, revocationFlags): + let defaultPolicy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil) + let revokedPolicy = SecPolicyCreateRevocation(revocationFlags) + SecTrustSetPolicies(serverTrust, [defaultPolicy, revokedPolicy] as CFTypeRef) + + serverTrustIsValid = trustIsValid(serverTrust) case let .pinCertificates(pinnedCertificates, validateCertificateChain, validateHost): if validateCertificateChain { let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil) diff --git a/ParentAssistant/Pods/Alamofire/Source/SessionDelegate.swift b/ParentAssistant/Pods/Alamofire/Source/SessionDelegate.swift index 4549731..03bcb7c 100644 --- a/ParentAssistant/Pods/Alamofire/Source/SessionDelegate.swift +++ b/ParentAssistant/Pods/Alamofire/Source/SessionDelegate.swift @@ -1,7 +1,7 @@ // // SessionDelegate.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -36,7 +36,7 @@ open class SessionDelegate: NSObject { open var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))? /// Overrides all behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)` and requires the caller to call the `completionHandler`. - open var sessionDidReceiveChallengeWithCompletion: ((URLSession, URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)? + open var sessionDidReceiveChallengeWithCompletion: ((URLSession, URLAuthenticationChallenge, @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)? /// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`. open var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)? @@ -48,21 +48,21 @@ open class SessionDelegate: NSObject { /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` and /// requires the caller to call the `completionHandler`. - open var taskWillPerformHTTPRedirectionWithCompletion: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest, (URLRequest?) -> Void) -> Void)? + open var taskWillPerformHTTPRedirectionWithCompletion: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest, @escaping (URLRequest?) -> Void) -> Void)? /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)`. open var taskDidReceiveChallenge: ((URLSession, URLSessionTask, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))? /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)` and /// requires the caller to call the `completionHandler`. - open var taskDidReceiveChallengeWithCompletion: ((URLSession, URLSessionTask, URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)? + open var taskDidReceiveChallengeWithCompletion: ((URLSession, URLSessionTask, URLAuthenticationChallenge, @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)? /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)`. open var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> InputStream?)? /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)` and /// requires the caller to call the `completionHandler`. - open var taskNeedNewBodyStreamWithCompletion: ((URLSession, URLSessionTask, (InputStream?) -> Void) -> Void)? + open var taskNeedNewBodyStreamWithCompletion: ((URLSession, URLSessionTask, @escaping (InputStream?) -> Void) -> Void)? /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)`. open var taskDidSendBodyData: ((URLSession, URLSessionTask, Int64, Int64, Int64) -> Void)? @@ -77,7 +77,7 @@ open class SessionDelegate: NSObject { /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didReceive:completionHandler:)` and /// requires caller to call the `completionHandler`. - open var dataTaskDidReceiveResponseWithCompletion: ((URLSession, URLSessionDataTask, URLResponse, (URLSession.ResponseDisposition) -> Void) -> Void)? + open var dataTaskDidReceiveResponseWithCompletion: ((URLSession, URLSessionDataTask, URLResponse, @escaping (URLSession.ResponseDisposition) -> Void) -> Void)? /// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didBecome:)`. open var dataTaskDidBecomeDownloadTask: ((URLSession, URLSessionDataTask, URLSessionDownloadTask) -> Void)? @@ -90,7 +90,7 @@ open class SessionDelegate: NSObject { /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)` and /// requires caller to call the `completionHandler`. - open var dataTaskWillCacheResponseWithCompletion: ((URLSession, URLSessionDataTask, CachedURLResponse, (CachedURLResponse?) -> Void) -> Void)? + open var dataTaskWillCacheResponseWithCompletion: ((URLSession, URLSessionDataTask, CachedURLResponse, @escaping (CachedURLResponse?) -> Void) -> Void)? // MARK: URLSessionDownloadDelegate Overrides @@ -108,16 +108,53 @@ open class SessionDelegate: NSObject { #if !os(watchOS) /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:readClosedFor:)`. - open var streamTaskReadClosed: ((URLSession, URLSessionStreamTask) -> Void)? + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *) + open var streamTaskReadClosed: ((URLSession, URLSessionStreamTask) -> Void)? { + get { + return _streamTaskReadClosed as? (URLSession, URLSessionStreamTask) -> Void + } + set { + _streamTaskReadClosed = newValue + } + } /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:writeClosedFor:)`. - open var streamTaskWriteClosed: ((URLSession, URLSessionStreamTask) -> Void)? + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *) + open var streamTaskWriteClosed: ((URLSession, URLSessionStreamTask) -> Void)? { + get { + return _streamTaskWriteClosed as? (URLSession, URLSessionStreamTask) -> Void + } + set { + _streamTaskWriteClosed = newValue + } + } /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:betterRouteDiscoveredFor:)`. - open var streamTaskBetterRouteDiscovered: ((URLSession, URLSessionStreamTask) -> Void)? + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *) + open var streamTaskBetterRouteDiscovered: ((URLSession, URLSessionStreamTask) -> Void)? { + get { + return _streamTaskBetterRouteDiscovered as? (URLSession, URLSessionStreamTask) -> Void + } + set { + _streamTaskBetterRouteDiscovered = newValue + } + } /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:streamTask:didBecome:outputStream:)`. - open var streamTaskDidBecomeInputAndOutputStreams: ((URLSession, URLSessionStreamTask, InputStream, OutputStream) -> Void)? + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *) + open var streamTaskDidBecomeInputAndOutputStreams: ((URLSession, URLSessionStreamTask, InputStream, OutputStream) -> Void)? { + get { + return _streamTaskDidBecomeInputStream as? (URLSession, URLSessionStreamTask, InputStream, OutputStream) -> Void + } + set { + _streamTaskDidBecomeInputStream = newValue + } + } + + var _streamTaskReadClosed: Any? + var _streamTaskWriteClosed: Any? + var _streamTaskBetterRouteDiscovered: Any? + var _streamTaskDidBecomeInputStream: Any? #endif @@ -126,7 +163,7 @@ open class SessionDelegate: NSObject { var retrier: RequestRetrier? weak var sessionManager: SessionManager? - private var requests: [Int: Request] = [:] + var requests: [Int: Request] = [:] private let lock = NSLock() /// Access the task delegate for the specified task in a thread-safe manner. @@ -166,17 +203,19 @@ open class SessionDelegate: NSObject { #endif #if !os(watchOS) - switch selector { - case #selector(URLSessionStreamDelegate.urlSession(_:readClosedFor:)): - return streamTaskReadClosed != nil - case #selector(URLSessionStreamDelegate.urlSession(_:writeClosedFor:)): - return streamTaskWriteClosed != nil - case #selector(URLSessionStreamDelegate.urlSession(_:betterRouteDiscoveredFor:)): - return streamTaskBetterRouteDiscovered != nil - case #selector(URLSessionStreamDelegate.urlSession(_:streamTask:didBecome:outputStream:)): - return streamTaskDidBecomeInputAndOutputStreams != nil - default: - break + if #available(iOS 9.0, macOS 10.11, tvOS 9.0, *) { + switch selector { + case #selector(URLSessionStreamDelegate.urlSession(_:readClosedFor:)): + return streamTaskReadClosed != nil + case #selector(URLSessionStreamDelegate.urlSession(_:writeClosedFor:)): + return streamTaskWriteClosed != nil + case #selector(URLSessionStreamDelegate.urlSession(_:betterRouteDiscoveredFor:)): + return streamTaskBetterRouteDiscovered != nil + case #selector(URLSessionStreamDelegate.urlSession(_:streamTask:didBecome:outputStream:)): + return streamTaskDidBecomeInputAndOutputStreams != nil + default: + break + } } #endif @@ -399,16 +438,20 @@ extension SessionDelegate: URLSessionTaskDelegate { let completeTask: (URLSession, URLSessionTask, Error?) -> Void = { [weak self] session, task, error in guard let strongSelf = self else { return } - if let taskDidComplete = strongSelf.taskDidComplete { - taskDidComplete(session, task, error) - } else if let delegate = strongSelf[task]?.delegate { - delegate.urlSession(session, task: task, didCompleteWithError: error) + strongSelf.taskDidComplete?(session, task, error) + + strongSelf[task]?.delegate.urlSession(session, task: task, didCompleteWithError: error) + + var userInfo: [String: Any] = [Notification.Key.Task: task] + + if let data = (strongSelf[task]?.delegate as? DataTaskDelegate)?.data { + userInfo[Notification.Key.ResponseData] = data } NotificationCenter.default.post( name: Notification.Name.Task.DidComplete, object: strongSelf, - userInfo: [Notification.Key.Task: task] + userInfo: userInfo ) strongSelf[task] = nil @@ -425,17 +468,17 @@ extension SessionDelegate: URLSessionTaskDelegate { // Determine whether an error has occurred var error: Error? = error - if let taskDelegate = self[task]?.delegate, taskDelegate.error != nil { - error = taskDelegate.error + if request.delegate.error != nil { + error = request.delegate.error } /// If an error occurred and the retrier is set, asynchronously ask the retrier if the request /// should be retried. Otherwise, complete the task by notifying the task delegate. if let retrier = retrier, let error = error { - retrier.should(sessionManager, retry: request, with: error) { [weak self] shouldRetry, delay in + retrier.should(sessionManager, retry: request, with: error) { [weak self] shouldRetry, timeDelay in guard shouldRetry else { completeTask(session, task, error) ; return } - DispatchQueue.utility.after(delay) { [weak self] in + DispatchQueue.utility.after(timeDelay) { [weak self] in guard let strongSelf = self else { return } let retrySucceeded = strongSelf.sessionManager?.retry(request) ?? false @@ -637,6 +680,7 @@ extension SessionDelegate: URLSessionDownloadDelegate { #if !os(watchOS) +@available(iOS 9.0, macOS 10.11, tvOS 9.0, *) extension SessionDelegate: URLSessionStreamDelegate { /// Tells the delegate that the read side of the connection has been closed. /// diff --git a/ParentAssistant/Pods/Alamofire/Source/SessionManager.swift b/ParentAssistant/Pods/Alamofire/Source/SessionManager.swift index 1363125..a9d0ae6 100644 --- a/ParentAssistant/Pods/Alamofire/Source/SessionManager.swift +++ b/ParentAssistant/Pods/Alamofire/Source/SessionManager.swift @@ -1,7 +1,7 @@ // // SessionManager.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -231,12 +231,14 @@ open class SessionManager { headers: HTTPHeaders? = nil) -> DataRequest { + var originalRequest: URLRequest? + do { - let urlRequest = try URLRequest(url: url, method: method, headers: headers) - let encodedURLRequest = try encoding.encode(urlRequest, with: parameters) + originalRequest = try URLRequest(url: url, method: method, headers: headers) + let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters) return request(encodedURLRequest) } catch { - return request(failedWith: error) + return request(originalRequest, failedWith: error) } } @@ -247,10 +249,13 @@ open class SessionManager { /// - parameter urlRequest: The URL request. /// /// - returns: The created `DataRequest`. + @discardableResult open func request(_ urlRequest: URLRequestConvertible) -> DataRequest { + var originalRequest: URLRequest? + do { - let originalRequest = try urlRequest.asURLRequest() - let originalTask = DataRequest.Requestable(urlRequest: originalRequest) + originalRequest = try urlRequest.asURLRequest() + let originalTask = DataRequest.Requestable(urlRequest: originalRequest!) let task = try originalTask.task(session: session, adapter: adapter, queue: queue) let request = DataRequest(session: session, requestTask: .data(originalTask, task)) @@ -261,15 +266,29 @@ open class SessionManager { return request } catch { - return request(failedWith: error) + return request(originalRequest, failedWith: error) } } // MARK: Private - Request Implementation - private func request(failedWith error: Error) -> DataRequest { - let request = DataRequest(session: session, requestTask: .data(nil, nil), error: error) - if startRequestsImmediately { request.resume() } + private func request(_ urlRequest: URLRequest?, failedWith error: Error) -> DataRequest { + var requestTask: Request.RequestTask = .data(nil, nil) + + if let urlRequest = urlRequest { + let originalTask = DataRequest.Requestable(urlRequest: urlRequest) + requestTask = .data(originalTask, nil) + } + + let underlyingError = error.underlyingAdaptError ?? error + let request = DataRequest(session: session, requestTask: requestTask, error: underlyingError) + + if let retrier = retrier, error is AdaptError { + allowRetrier(retrier, toRetry: request, with: underlyingError) + } else { + if startRequestsImmediately { request.resume() } + } + return request } @@ -308,7 +327,7 @@ open class SessionManager { let encodedURLRequest = try encoding.encode(urlRequest, with: parameters) return download(encodedURLRequest, to: destination) } catch { - return download(failedWith: error) + return download(nil, to: destination, failedWith: error) } } @@ -334,7 +353,7 @@ open class SessionManager { let urlRequest = try urlRequest.asURLRequest() return download(.request(urlRequest), to: destination) } catch { - return download(failedWith: error) + return download(nil, to: destination, failedWith: error) } } @@ -348,6 +367,13 @@ open class SessionManager { /// /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. /// + /// On the latest release of all the Apple platforms (iOS 10, macOS 10.12, tvOS 10, watchOS 3), `resumeData` is broken + /// on background URL session configurations. There's an underlying bug in the `resumeData` generation logic where the + /// data is written incorrectly and will always fail to resume the download. For more information about the bug and + /// possible workarounds, please refer to the following Stack Overflow post: + /// + /// - http://stackoverflow.com/a/39347461/1342462 + /// /// - parameter resumeData: The resume data. This is an opaque data blob produced by `URLSessionDownloadTask` /// when a task is cancelled. See `URLSession -downloadTask(withResumeData:)` for /// additional information. @@ -372,23 +398,43 @@ open class SessionManager { { do { let task = try downloadable.task(session: session, adapter: adapter, queue: queue) - let request = DownloadRequest(session: session, requestTask: .download(downloadable, task)) + let download = DownloadRequest(session: session, requestTask: .download(downloadable, task)) - request.downloadDelegate.destination = destination + download.downloadDelegate.destination = destination - delegate[task] = request + delegate[task] = download - if startRequestsImmediately { request.resume() } + if startRequestsImmediately { download.resume() } - return request + return download } catch { - return download(failedWith: error) + return download(downloadable, to: destination, failedWith: error) } } - private func download(failedWith error: Error) -> DownloadRequest { - let download = DownloadRequest(session: session, requestTask: .download(nil, nil), error: error) - if startRequestsImmediately { download.resume() } + private func download( + _ downloadable: DownloadRequest.Downloadable?, + to destination: DownloadRequest.DownloadFileDestination?, + failedWith error: Error) + -> DownloadRequest + { + var downloadTask: Request.RequestTask = .download(nil, nil) + + if let downloadable = downloadable { + downloadTask = .download(downloadable, nil) + } + + let underlyingError = error.underlyingAdaptError ?? error + + let download = DownloadRequest(session: session, requestTask: downloadTask, error: underlyingError) + download.downloadDelegate.destination = destination + + if let retrier = retrier, error is AdaptError { + allowRetrier(retrier, toRetry: download, with: underlyingError) + } else { + if startRequestsImmediately { download.resume() } + } + return download } @@ -418,7 +464,7 @@ open class SessionManager { let urlRequest = try URLRequest(url: url, method: method, headers: headers) return upload(fileURL, with: urlRequest) } catch { - return upload(failedWith: error) + return upload(nil, failedWith: error) } } @@ -436,7 +482,7 @@ open class SessionManager { let urlRequest = try urlRequest.asURLRequest() return upload(.file(fileURL, urlRequest)) } catch { - return upload(failedWith: error) + return upload(nil, failedWith: error) } } @@ -464,7 +510,7 @@ open class SessionManager { let urlRequest = try URLRequest(url: url, method: method, headers: headers) return upload(data, with: urlRequest) } catch { - return upload(failedWith: error) + return upload(nil, failedWith: error) } } @@ -482,7 +528,7 @@ open class SessionManager { let urlRequest = try urlRequest.asURLRequest() return upload(.data(data, urlRequest)) } catch { - return upload(failedWith: error) + return upload(nil, failedWith: error) } } @@ -510,7 +556,7 @@ open class SessionManager { let urlRequest = try URLRequest(url: url, method: method, headers: headers) return upload(stream, with: urlRequest) } catch { - return upload(failedWith: error) + return upload(nil, failedWith: error) } } @@ -528,7 +574,7 @@ open class SessionManager { let urlRequest = try urlRequest.asURLRequest() return upload(.stream(stream, urlRequest)) } catch { - return upload(failedWith: error) + return upload(nil, failedWith: error) } } @@ -614,6 +660,8 @@ open class SessionManager { let formData = MultipartFormData() multipartFormData(formData) + var tempFileURL: URL? + do { var urlRequestWithContentType = try urlRequest.asURLRequest() urlRequestWithContentType.setValue(formData.contentType, forHTTPHeaderField: "Content-Type") @@ -637,6 +685,8 @@ open class SessionManager { let fileName = UUID().uuidString let fileURL = directoryURL.appendingPathComponent(fileName) + tempFileURL = fileURL + var directoryError: Error? // Create directory inside serial queue to ensure two threads don't do this in parallel @@ -652,16 +702,37 @@ open class SessionManager { try formData.writeEncodedData(to: fileURL) + let upload = self.upload(fileURL, with: urlRequestWithContentType) + + // Cleanup the temp file once the upload is complete + upload.delegate.queue.addOperation { + do { + try FileManager.default.removeItem(at: fileURL) + } catch { + // No-op + } + } + DispatchQueue.main.async { let encodingResult = MultipartFormDataEncodingResult.success( - request: self.upload(fileURL, with: urlRequestWithContentType), + request: upload, streamingFromDisk: true, streamFileURL: fileURL ) + encodingCompletion?(encodingResult) } } } catch { + // Cleanup the temp file in the event that the multipart form data encoding failed + if let tempFileURL = tempFileURL { + do { + try FileManager.default.removeItem(at: tempFileURL) + } catch { + // No-op + } + } + DispatchQueue.main.async { encodingCompletion?(.failure(error)) } } } @@ -684,13 +755,26 @@ open class SessionManager { return upload } catch { - return upload(failedWith: error) + return upload(uploadable, failedWith: error) } } - private func upload(failedWith error: Error) -> UploadRequest { - let upload = UploadRequest(session: session, requestTask: .upload(nil, nil), error: error) - if startRequestsImmediately { upload.resume() } + private func upload(_ uploadable: UploadRequest.Uploadable?, failedWith error: Error) -> UploadRequest { + var uploadTask: Request.RequestTask = .upload(nil, nil) + + if let uploadable = uploadable { + uploadTask = .upload(uploadable, nil) + } + + let underlyingError = error.underlyingAdaptError ?? error + let upload = UploadRequest(session: session, requestTask: uploadTask, error: underlyingError) + + if let retrier = retrier, error is AdaptError { + allowRetrier(retrier, toRetry: upload, with: underlyingError) + } else { + if startRequestsImmediately { upload.resume() } + } + return upload } @@ -709,6 +793,7 @@ open class SessionManager { /// /// - returns: The created `StreamRequest`. @discardableResult + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *) open func stream(withHostName hostName: String, port: Int) -> StreamRequest { return stream(.stream(hostName: hostName, port: port)) } @@ -723,12 +808,14 @@ open class SessionManager { /// /// - returns: The created `StreamRequest`. @discardableResult + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *) open func stream(with netService: NetService) -> StreamRequest { return stream(.netService(netService)) } // MARK: Private - Stream Implementation + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *) private func stream(_ streamable: StreamRequest.Streamable) -> StreamRequest { do { let task = try streamable.task(session: session, adapter: adapter, queue: queue) @@ -744,6 +831,7 @@ open class SessionManager { } } + @available(iOS 9.0, macOS 10.11, tvOS 9.0, *) private func stream(failedWith error: Error) -> StreamRequest { let stream = StreamRequest(session: session, requestTask: .stream(nil, nil), error: error) if startRequestsImmediately { stream.resume() } @@ -760,8 +848,13 @@ open class SessionManager { do { let task = try originalTask.task(session: session, adapter: adapter, queue: queue) + if let originalTask = request.task { + delegate[originalTask] = nil // removes the old request to avoid endless growth + } + request.delegate.task = task // resets all task delegate data + request.retryCount += 1 request.startTime = CFAbsoluteTimeGetCurrent() request.endTime = nil @@ -769,8 +862,35 @@ open class SessionManager { return true } catch { - request.delegate.error = error + request.delegate.error = error.underlyingAdaptError ?? error return false } } + + private func allowRetrier(_ retrier: RequestRetrier, toRetry request: Request, with error: Error) { + DispatchQueue.utility.async { [weak self] in + guard let strongSelf = self else { return } + + retrier.should(strongSelf, retry: request, with: error) { shouldRetry, timeDelay in + guard let strongSelf = self else { return } + + guard shouldRetry else { + if strongSelf.startRequestsImmediately { request.resume() } + return + } + + DispatchQueue.utility.after(timeDelay) { + guard let strongSelf = self else { return } + + let retrySucceeded = strongSelf.retry(request) + + if retrySucceeded, let task = request.task { + strongSelf.delegate[task] = request + } else { + if strongSelf.startRequestsImmediately { request.resume() } + } + } + } + } + } } diff --git a/ParentAssistant/Pods/Alamofire/Source/TaskDelegate.swift b/ParentAssistant/Pods/Alamofire/Source/TaskDelegate.swift index 4a10b65..1d537ea 100644 --- a/ParentAssistant/Pods/Alamofire/Source/TaskDelegate.swift +++ b/ParentAssistant/Pods/Alamofire/Source/TaskDelegate.swift @@ -1,7 +1,7 @@ // // TaskDelegate.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -33,21 +33,37 @@ open class TaskDelegate: NSObject { /// The serial operation queue used to execute all operations after the task completes. open let queue: OperationQueue + /// The data returned by the server. + public var data: Data? { return nil } + + /// The error generated throughout the lifecyle of the task. + public var error: Error? + var task: URLSessionTask? { - didSet { reset() } + set { + taskLock.lock(); defer { taskLock.unlock() } + _task = newValue + } + get { + taskLock.lock(); defer { taskLock.unlock() } + return _task + } } - var data: Data? { return nil } - var error: Error? - var initialResponseTime: CFAbsoluteTime? var credential: URLCredential? var metrics: AnyObject? // URLSessionTaskMetrics + private var _task: URLSessionTask? { + didSet { reset() } + } + + private let taskLock = NSLock() + // MARK: Lifecycle init(task: URLSessionTask?) { - self.task = task + _task = task self.queue = { let operationQueue = OperationQueue() @@ -331,29 +347,30 @@ class DownloadTaskDelegate: TaskDelegate, URLSessionDownloadDelegate { { temporaryURL = location - if let destination = destination { - let result = destination(location, downloadTask.response as! HTTPURLResponse) - let destination = result.destinationURL - let options = result.options + guard + let destination = destination, + let response = downloadTask.response as? HTTPURLResponse + else { return } - do { - destinationURL = destination + let result = destination(location, response) + let destinationURL = result.destinationURL + let options = result.options - if options.contains(.removePreviousFile) { - if FileManager.default.fileExists(atPath: destination.path) { - try FileManager.default.removeItem(at: destination) - } - } + self.destinationURL = destinationURL - if options.contains(.createIntermediateDirectories) { - let directory = destination.deletingLastPathComponent() - try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil) - } + do { + if options.contains(.removePreviousFile), FileManager.default.fileExists(atPath: destinationURL.path) { + try FileManager.default.removeItem(at: destinationURL) + } - try FileManager.default.moveItem(at: location, to: destination) - } catch { - self.error = error + if options.contains(.createIntermediateDirectories) { + let directory = destinationURL.deletingLastPathComponent() + try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true) } + + try FileManager.default.moveItem(at: location, to: destinationURL) + } catch { + self.error = error } } diff --git a/ParentAssistant/Pods/Alamofire/Source/Timeline.swift b/ParentAssistant/Pods/Alamofire/Source/Timeline.swift index 1440989..181c988 100644 --- a/ParentAssistant/Pods/Alamofire/Source/Timeline.swift +++ b/ParentAssistant/Pods/Alamofire/Source/Timeline.swift @@ -1,7 +1,7 @@ // // Timeline.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/ParentAssistant/Pods/Alamofire/Source/Validation.swift b/ParentAssistant/Pods/Alamofire/Source/Validation.swift index c405d02..ec2c5c3 100644 --- a/ParentAssistant/Pods/Alamofire/Source/Validation.swift +++ b/ParentAssistant/Pods/Alamofire/Source/Validation.swift @@ -1,7 +1,7 @@ // // Validation.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -48,7 +48,13 @@ extension Request { init?(_ string: String) { let components: [String] = { let stripped = string.trimmingCharacters(in: .whitespacesAndNewlines) + + #if swift(>=3.2) + let split = stripped[..<(stripped.range(of: ";")?.lowerBound ?? stripped.endIndex)] + #else let split = stripped.substring(to: stripped.range(of: ";")?.lowerBound ?? stripped.endIndex) + #endif + return split.components(separatedBy: "/") }() diff --git a/ParentAssistant/Pods/AlamofireImage/LICENSE b/ParentAssistant/Pods/AlamofireImage/LICENSE new file mode 100644 index 0000000..5769f92 --- /dev/null +++ b/ParentAssistant/Pods/AlamofireImage/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/ParentAssistant/Pods/AlamofireImage/README.md b/ParentAssistant/Pods/AlamofireImage/README.md new file mode 100644 index 0000000..8576014 --- /dev/null +++ b/ParentAssistant/Pods/AlamofireImage/README.md @@ -0,0 +1,584 @@ +# AlamofireImage + +[![Build Status](https://travis-ci.org/Alamofire/AlamofireImage.svg?branch=master)](https://travis-ci.org/Alamofire/AlamofireImage) +[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/AlamofireImage.svg)](https://img.shields.io/cocoapods/v/AlamofireImage.svg) +[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Platform](https://img.shields.io/cocoapods/p/AlamofireImage.svg?style=flat)](http://cocoadocs.org/docsets/AlamofireImage) +[![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF) +[![Gitter](https://badges.gitter.im/Alamofire/Alamofire.svg)](https://gitter.im/Alamofire/Alamofire?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +AlamofireImage is an image component library for Alamofire. + +## Features + +- [x] Image Response Serializers +- [x] UIImage Extensions for Inflation / Scaling / Rounding / CoreImage +- [x] Single and Multi-Pass Image Filters +- [x] Auto-Purging In-Memory Image Cache +- [x] Prioritized Queue Order Image Downloading +- [x] Authentication with URLCredential +- [x] UIImageView Async Remote Downloads with Placeholders +- [x] UIImageView Filters and Transitions +- [x] Comprehensive Test Coverage +- [x] [Complete Documentation](http://cocoadocs.org/docsets/AlamofireImage) + +## Requirements + +- iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+ +- Xcode 8.3+ +- Swift 3.1+ + +## Migration Guides + +- [AlamofireImage 2.0 Migration Guide](https://github.com/Alamofire/AlamofireImage/blob/master/Documentation/AlamofireImage%202.0%20Migration%20Guide.md) +- [AlamofireImage 3.0 Migration Guide](https://github.com/Alamofire/AlamofireImage/blob/master/Documentation/AlamofireImage%203.0%20Migration%20Guide.md) + +## Dependencies + +- [Alamofire 4.5+](https://github.com/Alamofire/Alamofire) + +## Communication + +- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire). (Tag 'alamofire') +- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire). +- If you **found a bug**, open an issue. +- If you **have a feature request**, open an issue. +- If you **want to contribute**, submit a pull request. + +## Installation + +### CocoaPods + +[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command: + +```bash +$ gem install cocoapods +``` + +> CocoaPods 1.1+ is required. + +To integrate AlamofireImage into your Xcode project using CocoaPods, specify it in your `Podfile`: + +```ruby +source 'https://github.com/CocoaPods/Specs.git' +platform :ios, '10.0' +use_frameworks! + +target '' do + pod 'AlamofireImage', '~> 3.3' +end +``` + +Then, run the following command: + +```bash +$ pod install +``` + +### Carthage + +[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. + +You can install Carthage with [Homebrew](http://brew.sh/) using the following command: + +```bash +$ brew update +$ brew install carthage +``` + +To integrate AlamofireImage into your Xcode project using Carthage, specify it in your `Cartfile`: + +```ogdl +github "Alamofire/AlamofireImage" ~> 3.3 +``` + +Run `carthage update` to build the framework and drag the built `AlamofireImage.framework` into your Xcode project. + +### Manually + +If you prefer not to use either of the aforementioned dependency managers, you can integrate AlamofireImage into your project manually. + +#### Embedded Framework + +- 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: + +```bash +$ git init +``` + +- Add AlamofireImage as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command: + +```bash +$ git submodule add https://github.com/Alamofire/AlamofireImage.git +``` + +- Open the new `AlamofireImage` folder, and drag the `AlamofireImage.xcodeproj` into the Project Navigator of your application's Xcode project. + + > 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. + +- Select the `AlamofireImage.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target. +- 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. +- In the tab bar at the top of that window, open the "General" panel. +- Click on the `+` button under the "Embedded Binaries" section. +- You will see two different `AlamofireImage.xcodeproj` folders each with two different versions of the `AlamofireImage.framework` nested inside a `Products` folder. + + > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `AlamofireImage.framework`. + +- Select the top `AlamofireImage.framework` for iOS and the bottom one for OS X. + + > 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`. + +- And that's it! + + > 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. + +--- + +## Usage + +### Image Response Serializers + +```swift +import Alamofire +import AlamofireImage + +Alamofire.request("https://httpbin.org/image/png").responseImage { response in + debugPrint(response) + + print(response.request) + print(response.response) + debugPrint(response.result) + + if let image = response.result.value { + print("image downloaded: \(image)") + } +} +``` + +The AlamofireImage response image serializers support a wide range of image types including: + +- `image/png` +- `image/jpeg` +- `image/tiff` +- `image/gif` +- `image/ico` +- `image/x-icon` +- `image/bmp` +- `image/x-bmp` +- `image/x-xbitmap` +- `image/x-win-bitmap` + +> 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. + +### UIImage Extensions + +There are several `UIImage` extensions designed to make the common image manipulation operations as simple as possible. + +#### Inflation + +```swift +let url = Bundle.main.url(forResource: "unicorn", withExtension: "png")! +let data = try! Data(contentsOf: url) +let image = UIImage(data: data, scale: UIScreen.main.scale)! + +image.af_inflate() +``` + +> Inflating compressed image formats (such as PNG or JPEG) in a background queue can significantly improve drawing performance on the main thread. + +#### Scaling + +```swift +let image = UIImage(named: "unicorn")! +let size = CGSize(width: 100.0, height: 100.0) + +// Scale image to size disregarding aspect ratio +let scaledImage = image.af_imageScaled(to: size) + +// Scale image to fit within specified size while maintaining aspect ratio +let aspectScaledToFitImage = image.af_imageAspectScaled(toFit: size) + +// Scale image to fill specified size while maintaining aspect ratio +let aspectScaledToFillImage = image.af_imageAspectScaled(toFill: size) +``` + +#### Rounded Corners + +```swift +let image = UIImage(named: "unicorn")! +let radius: CGFloat = 20.0 + +let roundedImage = image.af_imageRounded(withCornerRadius: radius) +let circularImage = image.af_imageRoundedIntoCircle() +``` + +#### Core Image Filters + +```swift +let image = UIImage(named: "unicorn")! + +let sepiaImage = image.af_imageFiltered(withCoreImageFilter: "CISepiaTone") + +let blurredImage = image.af_imageFiltered( + withCoreImageFilter: "CIGuassianBlur", + parameters: ["inputRadius": 25] +) +``` + +### Image Filters + +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. + +```swift +public protocol ImageFilter { + var filter: Image -> Image { get } + var identifier: String { get } +} +``` + +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. + +#### Single Pass + +The single pass image filters only perform a single operation on the specified image. + +```swift +let image = UIImage(named: "unicorn")! +let imageFilter = RoundedCornersFilter(radius: 10.0) + +let roundedImage = imageFilter.filter(image) +``` + +The current list of single pass image filters includes: + +- `ScaledToSizeFilter` - Scales an image to a specified size. +- `AspectScaledToFitSizeFilter` - Scales an image from the center while maintaining the aspect ratio to fit within a specified size. +- `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. +- `RoundedCornersFilter` - Rounds the corners of an image to the specified radius. +- `CircleFilter` - Rounds the corners of an image into a circle. +- `BlurFilter` - Blurs an image using a `CIGaussianBlur` filter with the specified blur radius. + +> Each image filter is built ontop of the `UIImage` extensions. + +#### Multi-Pass + +The multi-pass image filters perform multiple operations on the specified image. + +```swift +let image = UIImage(named: "avatar")! +let size = CGSize(width: 100.0, height: 100.0) +let imageFilter = AspectScaledToFillSizeCircleFilter(size: size) + +let avatarImage = imageFilter.filter(image) +``` + +The current list of multi-pass image filters includes: + +- `ScaledToSizeWithRoundedCornersFilter` - Scales an image to a specified size, then rounds the corners to the specified radius. +- `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. +- `ScaledToSizeCircleFilter` - Scales an image to a specified size, then rounds the corners into a circle. +- `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. + +### Image Cache + +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. + +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. + +```swift +let imageCache = AutoPurgingImageCache( + memoryCapacity: 100_000_000, + preferredMemoryUsageAfterPurge: 60_000_000 +) +``` + +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. + +#### Add / Remove / Fetch Images + +Interacting with the `ImageCache` protocol APIs is very straightforward. + +```swift +let imageCache = AutoPurgingImageCache() +let avatarImage = UIImage(data: data)! + +// Add +imageCache.add(avatarImage, withIdentifier: "avatar") + +// Fetch +let cachedAvatar = imageCache.image(withIdentifier: "avatar") + +// Remove +imageCache.removeImage(withIdentifier: "avatar") +``` + +#### URL Requests + +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. + +```swift +let imageCache = AutoPurgingImageCache() + +let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/image/png")!) +let avatarImage = UIImage(named: "avatar")!.af_imageRoundedIntoCircle() + +// Add +imageCache.add(avatarImage, for: urlRequest, withIdentifier: "circle") + +// Fetch +let cachedAvatarImage = imageCache.image(for: urlRequest, withIdentifier: "circle") + +// Remove +imageCache.removeImage(for: urlRequest, withIdentifier: "circle") +``` + +#### Auto-Purging + +Each time an image is fetched from the cache, the cache internally updates the last access date for that image. + +```swift +let avatar = imageCache.image(withIdentifier: "avatar") +let circularAvatar = imageCache.image(for: urlRequest, withIdentifier: "circle") +``` + +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`. + +> 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. + +#### Memory Warnings + +The `AutoPurgingImageCache` also listens for memory warnings from your application and will purge all images from the cache if a memory warning is observed. + +### Image Downloader + +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. + +```swift +let imageDownloader = ImageDownloader( + configuration: ImageDownloader.defaultURLSessionConfiguration(), + downloadPrioritization: .fifo, + maximumActiveDownloads: 4, + imageCache: AutoPurgingImageCache() +) +``` + +> If you need to customize the `URLSessionConfiguration` type or parameters, then simply provide your own rather than using the default. + +#### Downloading an Image + +```swift +let downloader = ImageDownloader() +let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/image/jpeg")!) + +downloader.download(urlRequest) { response in + print(response.request) + print(response.response) + debugPrint(response.result) + + if let image = response.result.value { + print(image) + } +} +``` + +> 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. + +#### Applying an ImageFilter + +```swift +let downloader = ImageDownloader() +let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/image/jpeg")!) +let filter = AspectScaledToFillSizeCircleFilter(size: CGSize(width: 100.0, height: 100.0)) + +downloader.download(urlRequest, filter: filter) { response in + print(response.request) + print(response.response) + debugPrint(response.result) + + if let image = response.result.value { + print(image) + } +} +``` + +#### Authentication + +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. + +```swift +let downloader = ImageDownloader() +downloader.addAuthentication(user: "username", password: "password") +``` + +#### Download Prioritization + +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. + +```swift +public enum DownloadPrioritization { + case fifo, lifo +} +``` + +> The `ImageDownloader` is initialized with a `.fifo` queue by default. + +#### Image Caching + +The `ImageDownloader` uses a combination of an `URLCache` and `AutoPurgingImageCache` to create a very robust, high performance image caching system. + +##### URLCache + +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. + +> 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`. + +##### Image Cache + +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. + +##### Setting Ideal Capacity Limits + +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: + +- 150 MB of on-disk storage +- 20 MB of in-memory original image data storage +- 100 MB of in-memory storage of filtered image content +- 60 MB preferred memory capacity after purge of filtered image content + +> 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. + +#### Duplicate Downloads + +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. + +##### Image Filter Reuse + +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. + +##### Request Receipts + +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. + +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. + +> 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. + +### UIImageView Extension + +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. + +#### Setting Image with URL + +Setting the image with a URL will asynchronously download the image and set it once the request is finished. + +```swift +let imageView = UIImageView(frame: frame) +let url = URL(string: "https://httpbin.org/image/png")! + +imageView.af_setImage(withURL: url) +``` + +> If the image is cached locally, the image is set immediately. + +#### Placeholder Images + +By specifying a placeholder image, the image view uses the placeholder image until the remote image is downloaded. + +```swift +let imageView = UIImageView(frame: frame) +let url = URL(string: "https://httpbin.org/image/png")! +let placeholderImage = UIImage(named: "placeholder")! + +imageView.af_setImage(withURL: url, placeholderImage: placeholderImage) +``` + +> If the remote image is cached locally, the placeholder image is never set. + +#### Image Filters + +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. + +```swift +let imageView = UIImageView(frame: frame) + +let url = URL(string: "https://httpbin.org/image/png")! +let placeholderImage = UIImage(named: "placeholder")! + +let filter = AspectScaledToFillSizeWithRoundedCornersFilter( + size: imageView.frame.size, + radius: 20.0 +) + +imageView.af_setImage( + withURL: url, + placeholderImage: placeholderImage, + filter: filter +) +``` + +> If the remote image with the applied filter is cached locally, the image is set immediately. + +#### Image Transitions + +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. + +```swift +let imageView = UIImageView(frame: frame) + +let url = URL(string: "https://httpbin.org/image/png")! +let placeholderImage = UIImage(named: "placeholder")! + +let filter = AspectScaledToFillSizeWithRoundedCornersFilter( + size: imageView.frame.size, + radius: 20.0 +) + +imageView.af_setImage( + withURL: url, + placeholderImage: placeholderImage, + filter: filter, + imageTransition: .crossDissolve(0.2) +) +``` + +> If the remote image is cached locally, the image transition is ignored. + +#### Image Downloader + +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. + +##### Authentication + +If an image requires and authentication credential from the `UIImageView` extension, it can be provided as follows: + +```swift +ImageDownloader.default.addAuthentication(user: "user", password: "password") +``` + +--- + +## Credits + +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. + +### Security Disclosure + +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. + +## Donations + +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: + +* Pay our legal fees to register as a federal non-profit organization +* Pay our yearly legal fees to keep the non-profit in good status +* Pay for our mail servers to help us stay on top of all questions and security issues +* Potentially fund test servers to make it easier for us to test the edge cases +* Potentially fund developers to work on one of our projects full-time + +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. + +Click here to lend your support to: Alamofire Software Foundation and make a donation at pledgie.com ! + +## License + +AlamofireImage is released under the MIT license. See LICENSE for details. diff --git a/ParentAssistant/Pods/AlamofireImage/Source/AFIError.swift b/ParentAssistant/Pods/AlamofireImage/Source/AFIError.swift new file mode 100644 index 0000000..ed152e6 --- /dev/null +++ b/ParentAssistant/Pods/AlamofireImage/Source/AFIError.swift @@ -0,0 +1,63 @@ +// +// AFIError.swift +// +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// `AFIError` is the error type returned by AlamofireImage. +/// +/// - requestCancelled: The request was explicitly cancelled. +/// - imageSerializationFailed: Response data could not be serialized into an image. +public enum AFIError: Error { + case requestCancelled + case imageSerializationFailed +} + +// MARK: - Error Booleans + +extension AFIError { + /// Returns `true` if the `AFIError` is a request cancellation error, `false` otherwise. + public var isRequestCancelledError: Bool { + if case .requestCancelled = self { return true } + return false + } + + /// Returns `true` if the `AFIError` is an image serialization error, `false` otherwise. + public var isImageSerializationFailedError: Bool { + if case .imageSerializationFailed = self { return true } + return false + } +} + +// MARK: - Error Descriptions + +extension AFIError: LocalizedError { + public var errorDescription: String? { + switch self { + case .requestCancelled: + return "The request was explicitly cancelled." + case .imageSerializationFailed: + return "Response data could not be serialized into an image." + } + } +} diff --git a/ParentAssistant/Pods/AlamofireImage/Source/Image.swift b/ParentAssistant/Pods/AlamofireImage/Source/Image.swift new file mode 100644 index 0000000..e221390 --- /dev/null +++ b/ParentAssistant/Pods/AlamofireImage/Source/Image.swift @@ -0,0 +1,33 @@ +// +// Image.swift +// +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +#if os(iOS) || os(tvOS) || os(watchOS) +import UIKit +public typealias Image = UIImage +#elseif os(macOS) +import Cocoa +public typealias Image = NSImage +#endif diff --git a/ParentAssistant/Pods/AlamofireImage/Source/ImageCache.swift b/ParentAssistant/Pods/AlamofireImage/Source/ImageCache.swift new file mode 100644 index 0000000..eb32313 --- /dev/null +++ b/ParentAssistant/Pods/AlamofireImage/Source/ImageCache.swift @@ -0,0 +1,345 @@ +// +// ImageCache.swift +// +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation + +#if os(iOS) || os(tvOS) || os(watchOS) +import UIKit +#elseif os(macOS) +import Cocoa +#endif + +// MARK: ImageCache + +/// The `ImageCache` protocol defines a set of APIs for adding, removing and fetching images from a cache. +public protocol ImageCache { + /// Adds the image to the cache with the given identifier. + func add(_ image: Image, withIdentifier identifier: String) + + /// Removes the image from the cache matching the given identifier. + func removeImage(withIdentifier identifier: String) -> Bool + + /// Removes all images stored in the cache. + @discardableResult + func removeAllImages() -> Bool + + /// Returns the image in the cache associated with the given identifier. + func image(withIdentifier identifier: String) -> Image? +} + +/// The `ImageRequestCache` protocol extends the `ImageCache` protocol by adding methods for adding, removing and +/// fetching images from a cache given an `URLRequest` and additional identifier. +public protocol ImageRequestCache: ImageCache { + /// Adds the image to the cache using an identifier created from the request and identifier. + func add(_ image: Image, for request: URLRequest, withIdentifier identifier: String?) + + /// Removes the image from the cache using an identifier created from the request and identifier. + func removeImage(for request: URLRequest, withIdentifier identifier: String?) -> Bool + + /// Returns the image from the cache associated with an identifier created from the request and identifier. + func image(for request: URLRequest, withIdentifier identifier: String?) -> Image? +} + +// MARK: - + +/// The `AutoPurgingImageCache` in 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. +open class AutoPurgingImageCache: ImageRequestCache { + class CachedImage { + let image: Image + let identifier: String + let totalBytes: UInt64 + var lastAccessDate: Date + + init(_ image: Image, identifier: String) { + self.image = image + self.identifier = identifier + self.lastAccessDate = Date() + + self.totalBytes = { + #if os(iOS) || os(tvOS) || os(watchOS) + let size = CGSize(width: image.size.width * image.scale, height: image.size.height * image.scale) + #elseif os(macOS) + let size = CGSize(width: image.size.width, height: image.size.height) + #endif + + let bytesPerPixel: CGFloat = 4.0 + let bytesPerRow = size.width * bytesPerPixel + let totalBytes = UInt64(bytesPerRow) * UInt64(size.height) + + return totalBytes + }() + } + + func accessImage() -> Image { + lastAccessDate = Date() + return image + } + } + + // MARK: Properties + + /// The current total memory usage in bytes of all images stored within the cache. + open var memoryUsage: UInt64 { + var memoryUsage: UInt64 = 0 + synchronizationQueue.sync { memoryUsage = self.currentMemoryUsage } + + return memoryUsage + } + + /// The total memory capacity of the cache in bytes. + open let memoryCapacity: UInt64 + + /// The preferred memory usage after purge in bytes. During a purge, images will be purged until the memory + /// capacity drops below this limit. + open let preferredMemoryUsageAfterPurge: UInt64 + + private let synchronizationQueue: DispatchQueue + private var cachedImages: [String: CachedImage] + private var currentMemoryUsage: UInt64 + + // MARK: Initialization + + /// Initialies the `AutoPurgingImageCache` instance with the given memory capacity and preferred memory usage + /// after purge limit. + /// + /// Please note, the memory capacity must always be greater than or equal to the preferred memory usage after purge. + /// + /// - parameter memoryCapacity: The total memory capacity of the cache in bytes. `100 MB` by default. + /// - parameter preferredMemoryUsageAfterPurge: The preferred memory usage after purge in bytes. `60 MB` by default. + /// + /// - returns: The new `AutoPurgingImageCache` instance. + public init(memoryCapacity: UInt64 = 100_000_000, preferredMemoryUsageAfterPurge: UInt64 = 60_000_000) { + self.memoryCapacity = memoryCapacity + self.preferredMemoryUsageAfterPurge = preferredMemoryUsageAfterPurge + + precondition( + memoryCapacity >= preferredMemoryUsageAfterPurge, + "The `memoryCapacity` must be greater than or equal to `preferredMemoryUsageAfterPurge`" + ) + + self.cachedImages = [:] + self.currentMemoryUsage = 0 + + self.synchronizationQueue = { + let name = String(format: "org.alamofire.autopurgingimagecache-%08x%08x", arc4random(), arc4random()) + return DispatchQueue(label: name, attributes: .concurrent) + }() + + #if os(iOS) || os(tvOS) + NotificationCenter.default.addObserver( + self, + selector: #selector(AutoPurgingImageCache.removeAllImages), + name: Notification.Name.UIApplicationDidReceiveMemoryWarning, + object: nil + ) + #endif + } + + deinit { + NotificationCenter.default.removeObserver(self) + } + + // MARK: Add Image to Cache + + /// Adds the image to the cache using an identifier created from the request and optional identifier. + /// + /// - parameter image: The image to add to the cache. + /// - parameter request: The request used to generate the image's unique identifier. + /// - parameter identifier: The additional identifier to append to the image's unique identifier. + open func add(_ image: Image, for request: URLRequest, withIdentifier identifier: String? = nil) { + let requestIdentifier = imageCacheKey(for: request, withIdentifier: identifier) + add(image, withIdentifier: requestIdentifier) + } + + /// Adds the image to the cache with the given identifier. + /// + /// - parameter image: The image to add to the cache. + /// - parameter identifier: The identifier to use to uniquely identify the image. + open func add(_ image: Image, withIdentifier identifier: String) { + synchronizationQueue.async(flags: [.barrier]) { + let cachedImage = CachedImage(image, identifier: identifier) + + if let previousCachedImage = self.cachedImages[identifier] { + self.currentMemoryUsage -= previousCachedImage.totalBytes + } + + self.cachedImages[identifier] = cachedImage + self.currentMemoryUsage += cachedImage.totalBytes + } + + synchronizationQueue.async(flags: [.barrier]) { + if self.currentMemoryUsage > self.memoryCapacity { + let bytesToPurge = self.currentMemoryUsage - self.preferredMemoryUsageAfterPurge + + var sortedImages = self.cachedImages.map { $1 } + + sortedImages.sort { + let date1 = $0.lastAccessDate + let date2 = $1.lastAccessDate + + return date1.timeIntervalSince(date2) < 0.0 + } + + var bytesPurged = UInt64(0) + + for cachedImage in sortedImages { + self.cachedImages.removeValue(forKey: cachedImage.identifier) + bytesPurged += cachedImage.totalBytes + + if bytesPurged >= bytesToPurge { + break + } + } + + self.currentMemoryUsage -= bytesPurged + } + } + } + + // MARK: Remove Image from Cache + + /// Removes the image from the cache using an identifier created from the request and optional identifier. + /// + /// - parameter request: The request used to generate the image's unique identifier. + /// - parameter identifier: The additional identifier to append to the image's unique identifier. + /// + /// - returns: `true` if the image was removed, `false` otherwise. + @discardableResult + open func removeImage(for request: URLRequest, withIdentifier identifier: String?) -> Bool { + let requestIdentifier = imageCacheKey(for: request, withIdentifier: identifier) + return removeImage(withIdentifier: requestIdentifier) + } + + /// Removes all images from the cache created from the request. + /// + /// - parameter request: The request used to generate the image's unique identifier. + /// + /// - returns: `true` if any images were removed, `false` otherwise. + @discardableResult + open func removeImages(matching request: URLRequest) -> Bool { + let requestIdentifier = imageCacheKey(for: request, withIdentifier: nil) + var removed = false + + synchronizationQueue.sync { + for key in self.cachedImages.keys where key.hasPrefix(requestIdentifier) { + if let cachedImage = self.cachedImages.removeValue(forKey: key) { + self.currentMemoryUsage -= cachedImage.totalBytes + removed = true + } + } + } + + return removed + } + + /// Removes the image from the cache matching the given identifier. + /// + /// - parameter identifier: The unique identifier for the image. + /// + /// - returns: `true` if the image was removed, `false` otherwise. + @discardableResult + open func removeImage(withIdentifier identifier: String) -> Bool { + var removed = false + + synchronizationQueue.sync { + if let cachedImage = self.cachedImages.removeValue(forKey: identifier) { + self.currentMemoryUsage -= cachedImage.totalBytes + removed = true + } + } + + return removed + } + + /// Removes all images stored in the cache. + /// + /// - returns: `true` if images were removed from the cache, `false` otherwise. + @discardableResult @objc + open func removeAllImages() -> Bool { + var removed = false + + synchronizationQueue.sync { + if !self.cachedImages.isEmpty { + self.cachedImages.removeAll() + self.currentMemoryUsage = 0 + + removed = true + } + } + + return removed + } + + // MARK: Fetch Image from Cache + + /// Returns the image from the cache associated with an identifier created from the request and optional identifier. + /// + /// - parameter request: The request used to generate the image's unique identifier. + /// - parameter identifier: The additional identifier to append to the image's unique identifier. + /// + /// - returns: The image if it is stored in the cache, `nil` otherwise. + open func image(for request: URLRequest, withIdentifier identifier: String? = nil) -> Image? { + let requestIdentifier = imageCacheKey(for: request, withIdentifier: identifier) + return image(withIdentifier: requestIdentifier) + } + + /// Returns the image in the cache associated with the given identifier. + /// + /// - parameter identifier: The unique identifier for the image. + /// + /// - returns: The image if it is stored in the cache, `nil` otherwise. + open func image(withIdentifier identifier: String) -> Image? { + var image: Image? + + synchronizationQueue.sync { + if let cachedImage = self.cachedImages[identifier] { + image = cachedImage.accessImage() + } + } + + return image + } + + // MARK: Image Cache Keys + + /// Returns the unique image cache key for the specified request and additional identifier. + /// + /// - parameter request: The request. + /// - parameter identifier: The additional identifier. + /// + /// - returns: The unique image cache key. + open func imageCacheKey(for request: URLRequest, withIdentifier identifier: String?) -> String { + var key = request.url?.absoluteString ?? "" + + if let identifier = identifier { + key += "-\(identifier)" + } + + return key + } +} diff --git a/ParentAssistant/Pods/AlamofireImage/Source/ImageDownloader.swift b/ParentAssistant/Pods/AlamofireImage/Source/ImageDownloader.swift new file mode 100644 index 0000000..8fe3305 --- /dev/null +++ b/ParentAssistant/Pods/AlamofireImage/Source/ImageDownloader.swift @@ -0,0 +1,559 @@ +// +// ImageDownloader.swift +// +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation + +#if os(iOS) || os(tvOS) || os(watchOS) +import UIKit +#elseif os(macOS) +import Cocoa +#endif + +/// The `RequestReceipt` is an object vended by the `ImageDownloader` when starting a download request. It can be used +/// to cancel active requests running on the `ImageDownloader` session. As a general rule, image download requests +/// should be cancelled using the `RequestReceipt` instead of calling `cancel` directly on the `request` itself. The +/// `ImageDownloader` is optimized to handle duplicate request scenarios as well as pending versus active downloads. +open class RequestReceipt { + /// The download request created by the `ImageDownloader`. + open let request: Request + + /// The unique identifier for the image filters and completion handlers when duplicate requests are made. + open let receiptID: String + + init(request: Request, receiptID: String) { + self.request = request + self.receiptID = receiptID + } +} + +// MARK: - + +/// The `ImageDownloader` class is responsible for downloading images in parallel on a prioritized queue. Incoming +/// downloads are added to the front or back of the queue depending on the download prioritization. Each downloaded +/// image is cached in the underlying `NSURLCache` as well as the in-memory image cache that supports image filters. +/// By default, any download request with a cached image equivalent in the image cache will automatically be served the +/// cached image representation. Additional advanced features include supporting multiple image filters and completion +/// handlers for a single request. +open class ImageDownloader { + /// The completion handler closure used when an image download completes. + public typealias CompletionHandler = (DataResponse) -> Void + + /// The progress handler closure called periodically during an image download. + public typealias ProgressHandler = DataRequest.ProgressHandler + + // MARK: Helper Types + + /// Defines the order prioritization of incoming download requests being inserted into the queue. + /// + /// - fifo: All incoming downloads are added to the back of the queue. + /// - lifo: All incoming downloads are added to the front of the queue. + public enum DownloadPrioritization { + case fifo, lifo + } + + class ResponseHandler { + let urlID: String + let handlerID: String + let request: DataRequest + var operations: [(receiptID: String, filter: ImageFilter?, completion: CompletionHandler?)] + + init( + request: DataRequest, + handlerID: String, + receiptID: String, + filter: ImageFilter?, + completion: CompletionHandler?) + { + self.request = request + self.urlID = ImageDownloader.urlIdentifier(for: request.request!) + self.handlerID = handlerID + self.operations = [(receiptID: receiptID, filter: filter, completion: completion)] + } + } + + // MARK: Properties + + /// The image cache used to store all downloaded images in. + open let imageCache: ImageRequestCache? + + /// The credential used for authenticating each download request. + open private(set) var credential: URLCredential? + + /// Response serializer used to convert the image data to UIImage. + public var imageResponseSerializer = DataRequest.imageResponseSerializer() + + /// The underlying Alamofire `Manager` instance used to handle all download requests. + open let sessionManager: SessionManager + + let downloadPrioritization: DownloadPrioritization + let maximumActiveDownloads: Int + + var activeRequestCount = 0 + var queuedRequests: [Request] = [] + var responseHandlers: [String: ResponseHandler] = [:] + + private let synchronizationQueue: DispatchQueue = { + let name = String(format: "org.alamofire.imagedownloader.synchronizationqueue-%08x%08x", arc4random(), arc4random()) + return DispatchQueue(label: name) + }() + + private let responseQueue: DispatchQueue = { + let name = String(format: "org.alamofire.imagedownloader.responsequeue-%08x%08x", arc4random(), arc4random()) + return DispatchQueue(label: name, attributes: .concurrent) + }() + + // MARK: Initialization + + /// The default instance of `ImageDownloader` initialized with default values. + open static let `default` = ImageDownloader() + + /// Creates a default `URLSessionConfiguration` with common usage parameter values. + /// + /// - returns: The default `URLSessionConfiguration` instance. + open class func defaultURLSessionConfiguration() -> URLSessionConfiguration { + let configuration = URLSessionConfiguration.default + + configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders + configuration.httpShouldSetCookies = true + configuration.httpShouldUsePipelining = false + + configuration.requestCachePolicy = .useProtocolCachePolicy + configuration.allowsCellularAccess = true + configuration.timeoutIntervalForRequest = 60 + + configuration.urlCache = ImageDownloader.defaultURLCache() + + return configuration + } + + /// Creates a default `URLCache` with common usage parameter values. + /// + /// - returns: The default `URLCache` instance. + open class func defaultURLCache() -> URLCache { + return URLCache( + memoryCapacity: 20 * 1024 * 1024, // 20 MB + diskCapacity: 150 * 1024 * 1024, // 150 MB + diskPath: "org.alamofire.imagedownloader" + ) + } + + /// Initializes the `ImageDownloader` instance with the given configuration, download prioritization, maximum active + /// download count and image cache. + /// + /// - parameter configuration: The `URLSessionConfiguration` to use to create the underlying Alamofire + /// `SessionManager` instance. + /// - parameter downloadPrioritization: The download prioritization of the download queue. `.fifo` by default. + /// - parameter maximumActiveDownloads: The maximum number of active downloads allowed at any given time. + /// - parameter imageCache: The image cache used to store all downloaded images in. + /// + /// - returns: The new `ImageDownloader` instance. + public init( + configuration: URLSessionConfiguration = ImageDownloader.defaultURLSessionConfiguration(), + downloadPrioritization: DownloadPrioritization = .fifo, + maximumActiveDownloads: Int = 4, + imageCache: ImageRequestCache? = AutoPurgingImageCache()) + { + self.sessionManager = SessionManager(configuration: configuration) + self.sessionManager.startRequestsImmediately = false + + self.downloadPrioritization = downloadPrioritization + self.maximumActiveDownloads = maximumActiveDownloads + self.imageCache = imageCache + } + + /// Initializes the `ImageDownloader` instance with the given session manager, download prioritization, maximum + /// active download count and image cache. + /// + /// - parameter sessionManager: The Alamofire `SessionManager` instance to handle all download requests. + /// - parameter downloadPrioritization: The download prioritization of the download queue. `.fifo` by default. + /// - parameter maximumActiveDownloads: The maximum number of active downloads allowed at any given time. + /// - parameter imageCache: The image cache used to store all downloaded images in. + /// + /// - returns: The new `ImageDownloader` instance. + public init( + sessionManager: SessionManager, + downloadPrioritization: DownloadPrioritization = .fifo, + maximumActiveDownloads: Int = 4, + imageCache: ImageRequestCache? = AutoPurgingImageCache()) + { + self.sessionManager = sessionManager + self.sessionManager.startRequestsImmediately = false + + self.downloadPrioritization = downloadPrioritization + self.maximumActiveDownloads = maximumActiveDownloads + self.imageCache = imageCache + } + + // MARK: Authentication + + /// Associates an HTTP Basic Auth credential with all future download requests. + /// + /// - parameter user: The user. + /// - parameter password: The password. + /// - parameter persistence: The URL credential persistence. `.forSession` by default. + open func addAuthentication( + user: String, + password: String, + persistence: URLCredential.Persistence = .forSession) + { + let credential = URLCredential(user: user, password: password, persistence: persistence) + addAuthentication(usingCredential: credential) + } + + /// Associates the specified credential with all future download requests. + /// + /// - parameter credential: The credential. + open func addAuthentication(usingCredential credential: URLCredential) { + synchronizationQueue.sync { + self.credential = credential + } + } + + // MARK: Download + + /// Creates a download request using the internal Alamofire `SessionManager` instance for the specified URL request. + /// + /// If the same download request is already in the queue or currently being downloaded, the filter and completion + /// handler are appended to the already existing request. Once the request completes, all filters and completion + /// handlers attached to the request are executed in the order they were added. Additionally, any filters attached + /// to the request with the same identifiers are only executed once. The resulting image is then passed into each + /// completion handler paired with the filter. + /// + /// You should not attempt to directly cancel the `request` inside the request receipt since other callers may be + /// relying on the completion of that request. Instead, you should call `cancelRequestForRequestReceipt` with the + /// returned request receipt to allow the `ImageDownloader` to optimize the cancellation on behalf of all active + /// callers. + /// + /// - parameter urlRequest: The URL request. + /// - parameter receiptID: The `identifier` for the `RequestReceipt` returned. Defaults to a new, randomly + /// generated UUID. + /// - parameter filter: The image filter to apply to the image after the download is complete. Defaults + /// to `nil`. + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request. + /// Defaults to `nil`. + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. + /// - parameter completion: The closure called when the download request is complete. Defaults to `nil`. + /// + /// - returns: The request receipt for the download request if available. `nil` if the image is stored in the image + /// cache and the URL request cache policy allows the cache to be used. + @discardableResult + open func download( + _ urlRequest: URLRequestConvertible, + receiptID: String = UUID().uuidString, + filter: ImageFilter? = nil, + progress: ProgressHandler? = nil, + progressQueue: DispatchQueue = DispatchQueue.main, + completion: CompletionHandler?) + -> RequestReceipt? + { + var request: DataRequest! + + synchronizationQueue.sync { + // 1) Append the filter and completion handler to a pre-existing request if it already exists + let urlID = ImageDownloader.urlIdentifier(for: urlRequest) + + if let responseHandler = self.responseHandlers[urlID] { + responseHandler.operations.append((receiptID: receiptID, filter: filter, completion: completion)) + request = responseHandler.request + return + } + + // 2) Attempt to load the image from the image cache if the cache policy allows it + if let request = urlRequest.urlRequest { + switch request.cachePolicy { + case .useProtocolCachePolicy, .returnCacheDataElseLoad, .returnCacheDataDontLoad: + if let image = self.imageCache?.image(for: request, withIdentifier: filter?.identifier) { + DispatchQueue.main.async { + let response = DataResponse( + request: urlRequest.urlRequest, + response: nil, + data: nil, + result: .success(image) + ) + + completion?(response) + } + + return + } + default: + break + } + } + + // 3) Create the request and set up authentication, validation and response serialization + request = self.sessionManager.request(urlRequest) + + if let credential = self.credential { + request.authenticate(usingCredential: credential) + } + + request.validate() + + if let progress = progress { + request.downloadProgress(queue: progressQueue, closure: progress) + } + + // Generate a unique handler id to check whether the active request has changed while downloading + let handlerID = UUID().uuidString + + request.response( + queue: self.responseQueue, + responseSerializer: imageResponseSerializer, + completionHandler: { [weak self] response in + guard let strongSelf = self, let request = response.request else { return } + + defer { + strongSelf.safelyDecrementActiveRequestCount() + strongSelf.safelyStartNextRequestIfNecessary() + } + + // Early out if the request has changed out from under us + let handler = strongSelf.safelyFetchResponseHandler(withURLIdentifier: urlID) + guard handler?.handlerID == handlerID else { return } + + guard let responseHandler = strongSelf.safelyRemoveResponseHandler(withURLIdentifier: urlID) else { + return + } + + switch response.result { + case .success(let image): + var filteredImages: [String: Image] = [:] + + for (_, filter, completion) in responseHandler.operations { + var filteredImage: Image + + if let filter = filter { + if let alreadyFilteredImage = filteredImages[filter.identifier] { + filteredImage = alreadyFilteredImage + } else { + filteredImage = filter.filter(image) + filteredImages[filter.identifier] = filteredImage + } + } else { + filteredImage = image + } + + strongSelf.imageCache?.add(filteredImage, for: request, withIdentifier: filter?.identifier) + + DispatchQueue.main.async { + let response = DataResponse( + request: response.request, + response: response.response, + data: response.data, + result: .success(filteredImage), + timeline: response.timeline + ) + + completion?(response) + } + } + case .failure: + for (_, _, completion) in responseHandler.operations { + DispatchQueue.main.async { completion?(response) } + } + } + } + ) + + // 4) Store the response handler for use when the request completes + let responseHandler = ResponseHandler( + request: request, + handlerID: handlerID, + receiptID: receiptID, + filter: filter, + completion: completion + ) + + self.responseHandlers[urlID] = responseHandler + + // 5) Either start the request or enqueue it depending on the current active request count + if self.isActiveRequestCountBelowMaximumLimit() { + self.start(request) + } else { + self.enqueue(request) + } + } + + if let request = request { + return RequestReceipt(request: request, receiptID: receiptID) + } + + return nil + } + + /// Creates a download request using the internal Alamofire `SessionManager` instance for each specified URL request. + /// + /// For each request, if the same download request is already in the queue or currently being downloaded, the + /// filter and completion handler are appended to the already existing request. Once the request completes, all + /// filters and completion handlers attached to the request are executed in the order they were added. + /// Additionally, any filters attached to the request with the same identifiers are only executed once. The + /// resulting image is then passed into each completion handler paired with the filter. + /// + /// You should not attempt to directly cancel any of the `request`s inside the request receipts array since other + /// callers may be relying on the completion of that request. Instead, you should call + /// `cancelRequestForRequestReceipt` with the returned request receipt to allow the `ImageDownloader` to optimize + /// the cancellation on behalf of all active callers. + /// + /// - parameter urlRequests: The URL requests. + /// - parameter filter The image filter to apply to the image after each download is complete. + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request. Defaults + /// to `nil`. + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. + /// - parameter completion: The closure called when each download request is complete. + /// + /// - returns: The request receipts for the download requests if available. If an image is stored in the image + /// cache and the URL request cache policy allows the cache to be used, a receipt will not be returned + /// for that request. + @discardableResult + open func download( + _ urlRequests: [URLRequestConvertible], + filter: ImageFilter? = nil, + progress: ProgressHandler? = nil, + progressQueue: DispatchQueue = DispatchQueue.main, + completion: CompletionHandler? = nil) + -> [RequestReceipt] + { + #if swift(>=4.1) + return urlRequests.compactMap { + download($0, filter: filter, progress: progress, progressQueue: progressQueue, completion: completion) + } + #else + return urlRequests.flatMap { + download($0, filter: filter, progress: progress, progressQueue: progressQueue, completion: completion) + } + #endif + } + + /// Cancels the request in the receipt by removing the response handler and cancelling the request if necessary. + /// + /// If the request is pending in the queue, it will be cancelled if no other response handlers are registered with + /// the request. If the request is currently executing or is already completed, the response handler is removed and + /// will not be called. + /// + /// - parameter requestReceipt: The request receipt to cancel. + open func cancelRequest(with requestReceipt: RequestReceipt) { + synchronizationQueue.sync { + let urlID = ImageDownloader.urlIdentifier(for: requestReceipt.request.request!) + guard let responseHandler = self.responseHandlers[urlID] else { return } + + if let index = responseHandler.operations.index(where: { $0.receiptID == requestReceipt.receiptID }) { + let operation = responseHandler.operations.remove(at: index) + + let response: DataResponse = { + let urlRequest = requestReceipt.request.request + let error = AFIError.requestCancelled + + return DataResponse(request: urlRequest, response: nil, data: nil, result: .failure(error)) + }() + + DispatchQueue.main.async { operation.completion?(response) } + } + + if responseHandler.operations.isEmpty && requestReceipt.request.task?.state == .suspended { + requestReceipt.request.cancel() + self.responseHandlers.removeValue(forKey: urlID) + } + } + } + + // MARK: Internal - Thread-Safe Request Methods + + func safelyFetchResponseHandler(withURLIdentifier urlIdentifier: String) -> ResponseHandler? { + var responseHandler: ResponseHandler? + + synchronizationQueue.sync { + responseHandler = self.responseHandlers[urlIdentifier] + } + + return responseHandler + } + + func safelyRemoveResponseHandler(withURLIdentifier identifier: String) -> ResponseHandler? { + var responseHandler: ResponseHandler? + + synchronizationQueue.sync { + responseHandler = self.responseHandlers.removeValue(forKey: identifier) + } + + return responseHandler + } + + func safelyStartNextRequestIfNecessary() { + synchronizationQueue.sync { + guard self.isActiveRequestCountBelowMaximumLimit() else { return } + + while !self.queuedRequests.isEmpty { + if let request = self.dequeue(), request.task?.state == .suspended { + self.start(request) + break + } + } + } + } + + func safelyDecrementActiveRequestCount() { + self.synchronizationQueue.sync { + if self.activeRequestCount > 0 { + self.activeRequestCount -= 1 + } + } + } + + // MARK: Internal - Non Thread-Safe Request Methods + + func start(_ request: Request) { + request.resume() + activeRequestCount += 1 + } + + func enqueue(_ request: Request) { + switch downloadPrioritization { + case .fifo: + queuedRequests.append(request) + case .lifo: + queuedRequests.insert(request, at: 0) + } + } + + @discardableResult + func dequeue() -> Request? { + var request: Request? + + if !queuedRequests.isEmpty { + request = queuedRequests.removeFirst() + } + + return request + } + + func isActiveRequestCountBelowMaximumLimit() -> Bool { + return activeRequestCount < maximumActiveDownloads + } + + static func urlIdentifier(for urlRequest: URLRequestConvertible) -> String { + return urlRequest.urlRequest?.url?.absoluteString ?? "" + } +} diff --git a/ParentAssistant/Pods/AlamofireImage/Source/ImageFilter.swift b/ParentAssistant/Pods/AlamofireImage/Source/ImageFilter.swift new file mode 100644 index 0000000..65dfab9 --- /dev/null +++ b/ParentAssistant/Pods/AlamofireImage/Source/ImageFilter.swift @@ -0,0 +1,423 @@ +// +// ImageFilter.swift +// +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +#if os(iOS) || os(tvOS) || os(watchOS) +import UIKit +#elseif os(macOS) +import Cocoa +#endif + +// MARK: ImageFilter + +/// The `ImageFilter` protocol defines properties for filtering an image as well as identification of the filter. +public protocol ImageFilter { + /// A closure used to create an alternative representation of the given image. + var filter: (Image) -> Image { get } + + /// The string used to uniquely identify the filter operation. + var identifier: String { get } +} + +extension ImageFilter { + /// The unique identifier for any `ImageFilter` type. + public var identifier: String { return "\(type(of: self))" } +} + +// MARK: - Sizable + +/// The `Sizable` protocol defines a size property intended for use with `ImageFilter` types. +public protocol Sizable { + /// The size of the type. + var size: CGSize { get } +} + +extension ImageFilter where Self: Sizable { + /// The unique idenitifier for an `ImageFilter` conforming to the `Sizable` protocol. + public var identifier: String { + let width = Int64(size.width.rounded()) + let height = Int64(size.height.rounded()) + + return "\(type(of: self))-size:(\(width)x\(height))" + } +} + +// MARK: - Roundable + +/// The `Roundable` protocol defines a radius property intended for use with `ImageFilter` types. +public protocol Roundable { + /// The radius of the type. + var radius: CGFloat { get } +} + +extension ImageFilter where Self: Roundable { + /// The unique idenitifier for an `ImageFilter` conforming to the `Roundable` protocol. + public var identifier: String { + let radius = Int64(self.radius.rounded()) + return "\(type(of: self))-radius:(\(radius))" + } +} + +// MARK: - DynamicImageFilter + +/// The `DynamicImageFilter` class simplifies custom image filter creation by using a trailing closure initializer. +public struct DynamicImageFilter: ImageFilter { + /// The string used to uniquely identify the image filter operation. + public let identifier: String + + /// A closure used to create an alternative representation of the given image. + public let filter: (Image) -> Image + + /// Initializes the `DynamicImageFilter` instance with the specified identifier and filter closure. + /// + /// - parameter identifier: The unique identifier of the filter. + /// - parameter filter: A closure used to create an alternative representation of the given image. + /// + /// - returns: The new `DynamicImageFilter` instance. + public init(_ identifier: String, filter: @escaping (Image) -> Image) { + self.identifier = identifier + self.filter = filter + } +} + +// MARK: - CompositeImageFilter + +/// The `CompositeImageFilter` protocol defines an additional `filters` property to support multiple composite filters. +public protocol CompositeImageFilter: ImageFilter { + /// The image filters to apply to the image in sequential order. + var filters: [ImageFilter] { get } +} + +public extension CompositeImageFilter { + /// The unique idenitifier for any `CompositeImageFilter` type. + var identifier: String { + return filters.map { $0.identifier }.joined(separator: "_") + } + + /// The filter closure for any `CompositeImageFilter` type. + var filter: (Image) -> Image { + return { image in + return self.filters.reduce(image) { $1.filter($0) } + } + } +} + +// MARK: - DynamicCompositeImageFilter + +/// The `DynamicCompositeImageFilter` class is a composite image filter based on a specified array of filters. +public struct DynamicCompositeImageFilter: CompositeImageFilter { + /// The image filters to apply to the image in sequential order. + public let filters: [ImageFilter] + + /// Initializes the `DynamicCompositeImageFilter` instance with the given filters. + /// + /// - parameter filters: The filters taking part in the composite image filter. + /// + /// - returns: The new `DynamicCompositeImageFilter` instance. + public init(_ filters: [ImageFilter]) { + self.filters = filters + } + + /// Initializes the `DynamicCompositeImageFilter` instance with the given filters. + /// + /// - parameter filters: The filters taking part in the composite image filter. + /// + /// - returns: The new `DynamicCompositeImageFilter` instance. + public init(_ filters: ImageFilter...) { + self.init(filters) + } +} + +#if os(iOS) || os(tvOS) || os(watchOS) + +// MARK: - Single Pass Image Filters (iOS, tvOS and watchOS only) - + +/// Scales an image to a specified size. +public struct ScaledToSizeFilter: ImageFilter, Sizable { + /// The size of the filter. + public let size: CGSize + + /// Initializes the `ScaledToSizeFilter` instance with the given size. + /// + /// - parameter size: The size. + /// + /// - returns: The new `ScaledToSizeFilter` instance. + public init(size: CGSize) { + self.size = size + } + + /// The filter closure used to create the modified representation of the given image. + public var filter: (Image) -> Image { + return { image in + return image.af_imageScaled(to: self.size) + } + } +} + +// MARK: - + +/// Scales an image from the center while maintaining the aspect ratio to fit within a specified size. +public struct AspectScaledToFitSizeFilter: ImageFilter, Sizable { + /// The size of the filter. + public let size: CGSize + + /// Initializes the `AspectScaledToFitSizeFilter` instance with the given size. + /// + /// - parameter size: The size. + /// + /// - returns: The new `AspectScaledToFitSizeFilter` instance. + public init(size: CGSize) { + self.size = size + } + + /// The filter closure used to create the modified representation of the given image. + public var filter: (Image) -> Image { + return { image in + return image.af_imageAspectScaled(toFit: self.size) + } + } +} + +// MARK: - + +/// 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. +public struct AspectScaledToFillSizeFilter: ImageFilter, Sizable { + /// The size of the filter. + public let size: CGSize + + /// Initializes the `AspectScaledToFillSizeFilter` instance with the given size. + /// + /// - parameter size: The size. + /// + /// - returns: The new `AspectScaledToFillSizeFilter` instance. + public init(size: CGSize) { + self.size = size + } + + /// The filter closure used to create the modified representation of the given image. + public var filter: (Image) -> Image { + return { image in + return image.af_imageAspectScaled(toFill: self.size) + } + } +} + +// MARK: - + +/// Rounds the corners of an image to the specified radius. +public struct RoundedCornersFilter: ImageFilter, Roundable { + /// The radius of the filter. + public let radius: CGFloat + + /// Whether to divide the radius by the image scale. + public let divideRadiusByImageScale: Bool + + /// Initializes the `RoundedCornersFilter` instance with the given radius. + /// + /// - parameter radius: The radius. + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the + /// image has the same resolution for all screen scales such as @1x, @2x and + /// @3x (i.e. single image from web server). Set to `false` for images loaded + /// from an asset catalog with varying resolutions for each screen scale. + /// `false` by default. + /// + /// - returns: The new `RoundedCornersFilter` instance. + public init(radius: CGFloat, divideRadiusByImageScale: Bool = false) { + self.radius = radius + self.divideRadiusByImageScale = divideRadiusByImageScale + } + + /// The filter closure used to create the modified representation of the given image. + public var filter: (Image) -> Image { + return { image in + return image.af_imageRounded( + withCornerRadius: self.radius, + divideRadiusByImageScale: self.divideRadiusByImageScale + ) + } + } + + /// The unique idenitifier for an `ImageFilter` conforming to the `Roundable` protocol. + public var identifier: String { + let radius = Int64(self.radius.rounded()) + return "\(type(of: self))-radius:(\(radius))-divided:(\(divideRadiusByImageScale))" + } +} + +// MARK: - + +/// Rounds the corners of an image into a circle. +public struct CircleFilter: ImageFilter { + /// Initializes the `CircleFilter` instance. + /// + /// - returns: The new `CircleFilter` instance. + public init() {} + + /// The filter closure used to create the modified representation of the given image. + public var filter: (Image) -> Image { + return { image in + return image.af_imageRoundedIntoCircle() + } + } +} + +// MARK: - + +#if os(iOS) || os(tvOS) + +/// The `CoreImageFilter` protocol defines `parameters`, `filterName` properties used by CoreImage. +@available(iOS 9.0, *) +public protocol CoreImageFilter: ImageFilter { + /// The filter name of the CoreImage filter. + var filterName: String { get } + + /// The image filter parameters passed to CoreImage. + var parameters: [String: Any] { get } +} + +@available(iOS 9.0, *) +public extension ImageFilter where Self: CoreImageFilter { + /// The filter closure used to create the modified representation of the given image. + public var filter: (Image) -> Image { + return { image in + return image.af_imageFiltered(withCoreImageFilter: self.filterName, parameters: self.parameters) ?? image + } + } + + /// The unique idenitifier for an `ImageFilter` conforming to the `CoreImageFilter` protocol. + public var identifier: String { return "\(type(of: self))-parameters:(\(self.parameters))" } +} + +/// Blurs an image using a `CIGaussianBlur` filter with the specified blur radius. +@available(iOS 9.0, *) +public struct BlurFilter: ImageFilter, CoreImageFilter { + /// The filter name. + public let filterName = "CIGaussianBlur" + + /// The image filter parameters passed to CoreImage. + public let parameters: [String: Any] + + /// Initializes the `BlurFilter` instance with the given blur radius. + /// + /// - parameter blurRadius: The blur radius. + /// + /// - returns: The new `BlurFilter` instance. + public init(blurRadius: UInt = 10) { + self.parameters = ["inputRadius": blurRadius] + } +} + +#endif + +// MARK: - Composite Image Filters (iOS, tvOS and watchOS only) - + +/// Scales an image to a specified size, then rounds the corners to the specified radius. +public struct ScaledToSizeWithRoundedCornersFilter: CompositeImageFilter { + /// Initializes the `ScaledToSizeWithRoundedCornersFilter` instance with the given size and radius. + /// + /// - parameter size: The size. + /// - parameter radius: The radius. + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the + /// image has the same resolution for all screen scales such as @1x, @2x and + /// @3x (i.e. single image from web server). Set to `false` for images loaded + /// from an asset catalog with varying resolutions for each screen scale. + /// `false` by default. + /// + /// - returns: The new `ScaledToSizeWithRoundedCornersFilter` instance. + public init(size: CGSize, radius: CGFloat, divideRadiusByImageScale: Bool = false) { + self.filters = [ + ScaledToSizeFilter(size: size), + RoundedCornersFilter(radius: radius, divideRadiusByImageScale: divideRadiusByImageScale) + ] + } + + /// The image filters to apply to the image in sequential order. + public let filters: [ImageFilter] +} + +// MARK: - + +/// 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. +public struct AspectScaledToFillSizeWithRoundedCornersFilter: CompositeImageFilter { + /// Initializes the `AspectScaledToFillSizeWithRoundedCornersFilter` instance with the given size and radius. + /// + /// - parameter size: The size. + /// - parameter radius: The radius. + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the + /// image has the same resolution for all screen scales such as @1x, @2x and + /// @3x (i.e. single image from web server). Set to `false` for images loaded + /// from an asset catalog with varying resolutions for each screen scale. + /// `false` by default. + /// + /// - returns: The new `AspectScaledToFillSizeWithRoundedCornersFilter` instance. + public init(size: CGSize, radius: CGFloat, divideRadiusByImageScale: Bool = false) { + self.filters = [ + AspectScaledToFillSizeFilter(size: size), + RoundedCornersFilter(radius: radius, divideRadiusByImageScale: divideRadiusByImageScale) + ] + } + + /// The image filters to apply to the image in sequential order. + public let filters: [ImageFilter] +} + +// MARK: - + +/// Scales an image to a specified size, then rounds the corners into a circle. +public struct ScaledToSizeCircleFilter: CompositeImageFilter { + /// Initializes the `ScaledToSizeCircleFilter` instance with the given size. + /// + /// - parameter size: The size. + /// + /// - returns: The new `ScaledToSizeCircleFilter` instance. + public init(size: CGSize) { + self.filters = [ScaledToSizeFilter(size: size), CircleFilter()] + } + + /// The image filters to apply to the image in sequential order. + public let filters: [ImageFilter] +} + +// MARK: - + +/// Scales an image from the center while maintaining the aspect ratio to fit within a specified size, then rounds the +/// corners into a circle. +public struct AspectScaledToFillSizeCircleFilter: CompositeImageFilter { + /// Initializes the `AspectScaledToFillSizeCircleFilter` instance with the given size. + /// + /// - parameter size: The size. + /// + /// - returns: The new `AspectScaledToFillSizeCircleFilter` instance. + public init(size: CGSize) { + self.filters = [AspectScaledToFillSizeFilter(size: size), CircleFilter()] + } + + /// The image filters to apply to the image in sequential order. + public let filters: [ImageFilter] +} + +#endif diff --git a/ParentAssistant/Pods/AlamofireImage/Source/Request+AlamofireImage.swift b/ParentAssistant/Pods/AlamofireImage/Source/Request+AlamofireImage.swift new file mode 100644 index 0000000..f528c61 --- /dev/null +++ b/ParentAssistant/Pods/AlamofireImage/Source/Request+AlamofireImage.swift @@ -0,0 +1,327 @@ +// +// Request+AlamofireImage.swift +// +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation + +#if os(iOS) || os(tvOS) +import UIKit +#elseif os(watchOS) +import UIKit +import WatchKit +#elseif os(macOS) +import Cocoa +#endif + +extension DataRequest { + static var acceptableImageContentTypes: Set = [ + "image/tiff", + "image/jpeg", + "image/gif", + "image/png", + "image/ico", + "image/x-icon", + "image/bmp", + "image/x-bmp", + "image/x-xbitmap", + "image/x-ms-bmp", + "image/x-win-bitmap" + ] + + static let streamImageInitialBytePattern = Data(bytes: [255, 216]) // 0xffd8 + + /// Adds the content types specified to the list of acceptable images content types for validation. + /// + /// - parameter contentTypes: The additional content types. + public class func addAcceptableImageContentTypes(_ contentTypes: Set) { + DataRequest.acceptableImageContentTypes.formUnion(contentTypes) + } + + // MARK: - iOS, tvOS and watchOS + +#if os(iOS) || os(tvOS) || os(watchOS) + + /// Creates a response serializer that returns an image initialized from the response data using the specified + /// image options. + /// + /// - parameter imageScale: The scale factor used when interpreting the image data to construct + /// `responseImage`. Specifying a scale factor of 1.0 results in an image whose + /// size matches the pixel-based dimensions of the image. Applying a different + /// scale factor changes the size of the image as reported by the size property. + /// `Screen.scale` by default. + /// - parameter inflateResponseImage: Whether to automatically inflate response image data for compressed formats + /// (such as PNG or JPEG). Enabling this can significantly improve drawing + /// performance as it allows a bitmap representation to be constructed in the + /// background rather than on the main thread. `true` by default. + /// + /// - returns: An image response serializer. + public class func imageResponseSerializer( + imageScale: CGFloat = DataRequest.imageScale, + inflateResponseImage: Bool = true) + -> DataResponseSerializer + { + return DataResponseSerializer { request, response, data, error in + let result = serializeResponseData(response: response, data: data, error: error) + + guard case let .success(data) = result else { return .failure(result.error!) } + + do { + try DataRequest.validateContentType(for: request, response: response) + + let image = try DataRequest.image(from: data, withImageScale: imageScale) + if inflateResponseImage { image.af_inflate() } + + return .success(image) + } catch { + return .failure(error) + } + } + } + + /// Adds a response handler to be called once the request has finished. + /// + /// - parameter imageScale: The scale factor used when interpreting the image data to construct + /// `responseImage`. Specifying a scale factor of 1.0 results in an image whose + /// size matches the pixel-based dimensions of the image. Applying a different + /// scale factor changes the size of the image as reported by the size property. + /// This is set to the value of scale of the main screen by default, which + /// automatically scales images for retina displays, for instance. + /// `Screen.scale` by default. + /// - parameter inflateResponseImage: Whether to automatically inflate response image data for compressed formats + /// (such as PNG or JPEG). Enabling this can significantly improve drawing + /// performance as it allows a bitmap representation to be constructed in the + /// background rather than on the main thread. `true` by default. + /// - parameter queue: The queue on which the completion handler is dispatched. `nil` by default, + /// which results in using `DispatchQueue.main`. + /// - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 4 + /// arguments: the URL request, the URL response, if one was received, the image, + /// if one could be created from the URL response and data, and any error produced + /// while creating the image. + /// + /// - returns: The request. + @discardableResult + public func responseImage( + imageScale: CGFloat = DataRequest.imageScale, + inflateResponseImage: Bool = true, + queue: DispatchQueue? = nil, + completionHandler: @escaping (DataResponse) -> Void) + -> Self + { + return response( + queue: queue, + responseSerializer: DataRequest.imageResponseSerializer( + imageScale: imageScale, + inflateResponseImage: inflateResponseImage + ), + completionHandler: completionHandler + ) + } + + /// Sets a closure to be called periodically during the lifecycle of the request as data is read from the server + /// and converted into images. + /// + /// - parameter imageScale: The scale factor used when interpreting the image data to construct + /// `responseImage`. Specifying a scale factor of 1.0 results in an image whose + /// size matches the pixel-based dimensions of the image. Applying a different + /// scale factor changes the size of the image as reported by the size property. + /// This is set to the value of scale of the main screen by default, which + /// automatically scales images for retina displays, for instance. + /// `Screen.scale` by default. + /// - parameter inflateResponseImage: Whether to automatically inflate response image data for compressed formats + /// (such as PNG or JPEG). Enabling this can significantly improve drawing + /// performance as it allows a bitmap representation to be constructed in the + /// background rather than on the main thread. `true` by default. + /// - parameter completionHandler: A closure to be executed when the request has new image. The closure takes 1 + /// argument: the image, if one could be created from the data. + /// + /// - returns: The request. + @discardableResult + public func streamImage( + imageScale: CGFloat = DataRequest.imageScale, + inflateResponseImage: Bool = true, + completionHandler: @escaping (Image) -> Void) + -> Self + { + var imageData = Data() + + return stream { chunkData in + if chunkData.starts(with: DataRequest.streamImageInitialBytePattern) { + imageData = Data() + } + + imageData.append(chunkData) + + if let image = DataRequest.serializeImage(from: imageData) { + completionHandler(image) + } + } + } + + private class func serializeImage( + from data: Data, + imageScale: CGFloat = DataRequest.imageScale, + inflateResponseImage: Bool = true) + -> UIImage? + { + guard data.count > 0 else { return nil } + + do { + let image = try DataRequest.image(from: data, withImageScale: imageScale) + if inflateResponseImage { image.af_inflate() } + + return image + } catch { + return nil + } + } + + private class func image(from data: Data, withImageScale imageScale: CGFloat) throws -> UIImage { + if let image = UIImage.af_threadSafeImage(with: data, scale: imageScale) { + return image + } + + throw AFIError.imageSerializationFailed + } + + public class var imageScale: CGFloat { + #if os(iOS) || os(tvOS) + return UIScreen.main.scale + #elseif os(watchOS) + return WKInterfaceDevice.current().screenScale + #endif + } + +#elseif os(macOS) + + // MARK: - macOS + + /// Creates a response serializer that returns an image initialized from the response data. + /// + /// - returns: An image response serializer. + public class func imageResponseSerializer() -> DataResponseSerializer { + return DataResponseSerializer { request, response, data, error in + let result = serializeResponseData(response: response, data: data, error: error) + + guard case let .success(data) = result else { return .failure(result.error!) } + + do { + try DataRequest.validateContentType(for: request, response: response) + } catch { + return .failure(error) + } + + guard let bitmapImage = NSBitmapImageRep(data: data) else { + return .failure(AFIError.imageSerializationFailed) + } + + let image = NSImage(size: NSSize(width: bitmapImage.pixelsWide, height: bitmapImage.pixelsHigh)) + image.addRepresentation(bitmapImage) + + return .success(image) + } + } + + /// Adds a response handler to be called once the request has finished. + /// + /// - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 4 + /// arguments: the URL request, the URL response, if one was received, the image, if + /// one could be created from the URL response and data, and any error produced while + /// creating the image. + /// - parameter queue: The queue on which the completion handler is dispatched. `nil` by default, + /// which results in using `DispatchQueue.main`. + /// + /// - returns: The request. + @discardableResult + public func responseImage( + queue: DispatchQueue? = nil, + completionHandler: @escaping (DataResponse) -> Void) + -> Self { + return response( + queue: queue, + responseSerializer: DataRequest.imageResponseSerializer(), + completionHandler: completionHandler + ) + } + + /// Sets a closure to be called periodically during the lifecycle of the request as data is read from the server + /// and converted into images. + /// + /// - parameter completionHandler: A closure to be executed when the request has new image. The closure takes 1 + /// argument: the image, if one could be created from the data. + /// + /// - returns: The request. + @discardableResult + public func streamImage(completionHandler: @escaping (Image) -> Void) -> Self { + var imageData = Data() + + return stream { chunkData in + if chunkData.starts(with: DataRequest.streamImageInitialBytePattern) { + imageData = Data() + } + + imageData.append(chunkData) + + if let image = DataRequest.serializeImage(from: imageData) { + completionHandler(image) + } + } + } + + private class func serializeImage(from data: Data) -> NSImage? { + guard data.count > 0 else { return nil } + guard let bitmapImage = NSBitmapImageRep(data: data) else { return nil } + + let image = NSImage(size: NSSize(width: bitmapImage.pixelsWide, height: bitmapImage.pixelsHigh)) + image.addRepresentation(bitmapImage) + + return image + } + +#endif + + // MARK: - Content Type Validation + + /// Returns whether the content type of the response matches one of the acceptable content types. + /// + /// - parameter request: The request. + /// - parameter response: The server response. + /// + /// - throws: An `AFError` response validation failure when an error is encountered. + public class func validateContentType(for request: URLRequest?, response: HTTPURLResponse?) throws { + if let url = request?.url, url.isFileURL { return } + + guard let mimeType = response?.mimeType else { + let contentTypes = Array(DataRequest.acceptableImageContentTypes) + throw AFError.responseValidationFailed(reason: .missingContentType(acceptableContentTypes: contentTypes)) + } + + guard DataRequest.acceptableImageContentTypes.contains(mimeType) else { + let contentTypes = Array(DataRequest.acceptableImageContentTypes) + + throw AFError.responseValidationFailed( + reason: .unacceptableContentType(acceptableContentTypes: contentTypes, responseContentType: mimeType) + ) + } + } +} diff --git a/ParentAssistant/Pods/AlamofireImage/Source/UIButton+AlamofireImage.swift b/ParentAssistant/Pods/AlamofireImage/Source/UIButton+AlamofireImage.swift new file mode 100644 index 0000000..fa8325a --- /dev/null +++ b/ParentAssistant/Pods/AlamofireImage/Source/UIButton+AlamofireImage.swift @@ -0,0 +1,473 @@ +// +// UIButton+AlamofireImage.swift +// +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation + +#if os(iOS) || os(tvOS) + +import UIKit + +extension UIButton { + + // MARK: - Private - AssociatedKeys + + private struct AssociatedKey { + static var imageDownloader = "af_UIButton.ImageDownloader" + static var sharedImageDownloader = "af_UIButton.SharedImageDownloader" + static var imageReceipts = "af_UIButton.ImageReceipts" + static var backgroundImageReceipts = "af_UIButton.BackgroundImageReceipts" + } + + // MARK: - Properties + + /// The instance image downloader used to download all images. If this property is `nil`, the `UIButton` will + /// fallback on the `af_sharedImageDownloader` for all downloads. The most common use case for needing to use a + /// custom instance image downloader is when images are behind different basic auth credentials. + public var af_imageDownloader: ImageDownloader? { + get { + return objc_getAssociatedObject(self, &AssociatedKey.imageDownloader) as? ImageDownloader + } + set { + objc_setAssociatedObject(self, &AssociatedKey.imageDownloader, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + /// The shared image downloader used to download all images. By default, this is the default `ImageDownloader` + /// instance backed with an `AutoPurgingImageCache` which automatically evicts images from the cache when the memory + /// capacity is reached or memory warning notifications occur. The shared image downloader is only used if the + /// `af_imageDownloader` is `nil`. + public class var af_sharedImageDownloader: ImageDownloader { + get { + guard let + downloader = objc_getAssociatedObject(self, &AssociatedKey.sharedImageDownloader) as? ImageDownloader + else { + return ImageDownloader.default + } + + return downloader + } + set { + objc_setAssociatedObject(self, &AssociatedKey.sharedImageDownloader, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + private var imageRequestReceipts: [UInt: RequestReceipt] { + get { + guard let + receipts = objc_getAssociatedObject(self, &AssociatedKey.imageReceipts) as? [UInt: RequestReceipt] + else { + return [:] + } + + return receipts + } + set { + objc_setAssociatedObject(self, &AssociatedKey.imageReceipts, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + private var backgroundImageRequestReceipts: [UInt: RequestReceipt] { + get { + guard let + receipts = objc_getAssociatedObject(self, &AssociatedKey.backgroundImageReceipts) as? [UInt: RequestReceipt] + else { + return [:] + } + + return receipts + } + set { + objc_setAssociatedObject(self, &AssociatedKey.backgroundImageReceipts, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + // MARK: - Image Downloads + + /// Asynchronously downloads an image from the specified URL and sets it once the request is finished. + /// + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be + /// set immediately, and then the remote image will be set once the image request is finished. + /// + /// - parameter state: The control state of the button to set the image on. + /// - parameter url: The URL used for your image request. + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the + /// image will not change its image until the image request finishes. Defaults + /// to `nil`. + /// - parameter filter: The image filter applied to the image after the image request is finished. + /// Defaults to `nil`. + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request. + /// Defaults to `nil`. + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a + /// single response value containing either the image or the error that occurred. If + /// the image was returned from the image cache, the response will be `nil`. Defaults + /// to `nil`. + public func af_setImage( + for state: UIControlState, + url: URL, + placeholderImage: UIImage? = nil, + filter: ImageFilter? = nil, + progress: ImageDownloader.ProgressHandler? = nil, + progressQueue: DispatchQueue = DispatchQueue.main, + completion: ((DataResponse) -> Void)? = nil) + { + af_setImage( + for: state, + urlRequest: urlRequest(with: url), + placeholderImage: placeholderImage, + filter: filter, + progress: progress, + progressQueue: progressQueue, + completion: completion + ) + } + + /// Asynchronously downloads an image from the specified URL request and sets it once the request is finished. + /// + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be + /// set immediately, and then the remote image will be set once the image request is finished. + /// + /// - parameter state: The control state of the button to set the image on. + /// - parameter urlRequest: The URL request. + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the + /// image will not change its image until the image request finishes. Defaults + /// to `nil`. + /// - parameter filter: The image filter applied to the image after the image request is finished. + /// Defaults to `nil`. + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request. + /// Defaults to `nil`. + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a + /// single response value containing either the image or the error that occurred. If + /// the image was returned from the image cache, the response will be `nil`. Defaults + /// to `nil`. + public func af_setImage( + for state: UIControlState, + urlRequest: URLRequestConvertible, + placeholderImage: UIImage? = nil, + filter: ImageFilter? = nil, + progress: ImageDownloader.ProgressHandler? = nil, + progressQueue: DispatchQueue = DispatchQueue.main, + completion: ((DataResponse) -> Void)? = nil) + { + guard !isImageURLRequest(urlRequest, equalToActiveRequestURLForState: state) else { + let error = AFIError.requestCancelled + let response = DataResponse(request: nil, response: nil, data: nil, result: .failure(error)) + + completion?(response) + + return + } + + af_cancelImageRequest(for: state) + + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader + let imageCache = imageDownloader.imageCache + + // Use the image from the image cache if it exists + if + let request = urlRequest.urlRequest, + let image = imageCache?.image(for: request, withIdentifier: filter?.identifier) + { + let response = DataResponse( + request: urlRequest.urlRequest, + response: nil, + data: nil, + result: .success(image) + ) + + setImage(image, for: state) + completion?(response) + + return + } + + // Set the placeholder since we're going to have to download + if let placeholderImage = placeholderImage { setImage(placeholderImage, for: state) } + + // Generate a unique download id to check whether the active request has changed while downloading + let downloadID = UUID().uuidString + + // Download the image, then set the image for the control state + let requestReceipt = imageDownloader.download( + urlRequest, + receiptID: downloadID, + filter: filter, + progress: progress, + progressQueue: progressQueue, + completion: { [weak self] response in + guard + let strongSelf = self, + strongSelf.isImageURLRequest(response.request, equalToActiveRequestURLForState: state) && + strongSelf.imageRequestReceipt(for: state)?.receiptID == downloadID + else { + completion?(response) + return + } + + if let image = response.result.value { + strongSelf.setImage(image, for: state) + } + + strongSelf.setImageRequestReceipt(nil, for: state) + + completion?(response) + } + ) + + setImageRequestReceipt(requestReceipt, for: state) + } + + /// Cancels the active download request for the image, if one exists. + public func af_cancelImageRequest(for state: UIControlState) { + guard let receipt = imageRequestReceipt(for: state) else { return } + + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader + imageDownloader.cancelRequest(with: receipt) + + setImageRequestReceipt(nil, for: state) + } + + // MARK: - Background Image Downloads + + /// Asynchronously downloads an image from the specified URL and sets it once the request is finished. + /// + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be + /// set immediately, and then the remote image will be set once the image request is finished. + /// + /// - parameter state: The control state of the button to set the image on. + /// - parameter url: The URL used for the image request. + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the + /// background image will not change its image until the image request finishes. + /// Defaults to `nil`. + /// - parameter filter: The image filter applied to the image after the image request is finished. + /// Defaults to `nil`. + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request. + /// Defaults to `nil`. + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a + /// single response value containing either the image or the error that occurred. If + /// the image was returned from the image cache, the response will be `nil`. Defaults + /// to `nil`. + public func af_setBackgroundImage( + for state: UIControlState, + url: URL, + placeholderImage: UIImage? = nil, + filter: ImageFilter? = nil, + progress: ImageDownloader.ProgressHandler? = nil, + progressQueue: DispatchQueue = DispatchQueue.main, + completion: ((DataResponse) -> Void)? = nil) + { + af_setBackgroundImage( + for: state, + urlRequest: urlRequest(with: url), + placeholderImage: placeholderImage, + filter: filter, + progress: progress, + progressQueue: progressQueue, + completion: completion + ) + } + + /// Asynchronously downloads an image from the specified URL request and sets it once the request is finished. + /// + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be + /// set immediately, and then the remote image will be set once the image request is finished. + /// + /// - parameter state: The control state of the button to set the image on. + /// - parameter urlRequest: The URL request. + /// - parameter placeholderImage: The image to be set initially until the image request finished. If `nil`, the + /// background image will not change its image until the image request finishes. + /// Defaults to `nil`. + /// - parameter filter: The image filter applied to the image after the image request is finished. + /// Defaults to `nil`. + /// - parameter progress: The closure to be executed periodically during the lifecycle of the request. + /// Defaults to `nil`. + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the main queue. + /// - parameter completion: A closure to be executed when the image request finishes. The closure takes a + /// single response value containing either the image or the error that occurred. If + /// the image was returned from the image cache, the response will be `nil`. Defaults + /// to `nil`. + public func af_setBackgroundImage( + for state: UIControlState, + urlRequest: URLRequestConvertible, + placeholderImage: UIImage? = nil, + filter: ImageFilter? = nil, + progress: ImageDownloader.ProgressHandler? = nil, + progressQueue: DispatchQueue = DispatchQueue.main, + completion: ((DataResponse) -> Void)? = nil) + { + guard !isImageURLRequest(urlRequest, equalToActiveRequestURLForState: state) else { + let error = AFIError.requestCancelled + let response = DataResponse(request: nil, response: nil, data: nil, result: .failure(error)) + + completion?(response) + + return + } + + af_cancelBackgroundImageRequest(for: state) + + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader + let imageCache = imageDownloader.imageCache + + // Use the image from the image cache if it exists + if + let request = urlRequest.urlRequest, + let image = imageCache?.image(for: request, withIdentifier: filter?.identifier) + { + let response = DataResponse( + request: urlRequest.urlRequest, + response: nil, + data: nil, + result: .success(image) + ) + + setBackgroundImage(image, for: state) + completion?(response) + + return + } + + // Set the placeholder since we're going to have to download + if let placeholderImage = placeholderImage { self.setBackgroundImage(placeholderImage, for: state) } + + // Generate a unique download id to check whether the active request has changed while downloading + let downloadID = UUID().uuidString + + // Download the image, then set the image for the control state + let requestReceipt = imageDownloader.download( + urlRequest, + receiptID: downloadID, + filter: nil, + progress: progress, + progressQueue: progressQueue, + completion: { [weak self] response in + guard + let strongSelf = self, + strongSelf.isBackgroundImageURLRequest(response.request, equalToActiveRequestURLForState: state) && + strongSelf.backgroundImageRequestReceipt(for: state)?.receiptID == downloadID + else { + completion?(response) + return + } + + if let image = response.result.value { + strongSelf.setBackgroundImage(image, for: state) + } + + strongSelf.setBackgroundImageRequestReceipt(nil, for: state) + + completion?(response) + } + ) + + setBackgroundImageRequestReceipt(requestReceipt, for: state) + } + + /// Cancels the active download request for the background image, if one exists. + public func af_cancelBackgroundImageRequest(for state: UIControlState) { + guard let receipt = backgroundImageRequestReceipt(for: state) else { return } + + let imageDownloader = af_imageDownloader ?? UIButton.af_sharedImageDownloader + imageDownloader.cancelRequest(with: receipt) + + setBackgroundImageRequestReceipt(nil, for: state) + } + + // MARK: - Internal - Image Request Receipts + + func imageRequestReceipt(for state: UIControlState) -> RequestReceipt? { + guard let receipt = imageRequestReceipts[state.rawValue] else { return nil } + return receipt + } + + func setImageRequestReceipt(_ receipt: RequestReceipt?, for state: UIControlState) { + var receipts = imageRequestReceipts + receipts[state.rawValue] = receipt + + imageRequestReceipts = receipts + } + + // MARK: - Internal - Background Image Request Receipts + + func backgroundImageRequestReceipt(for state: UIControlState) -> RequestReceipt? { + guard let receipt = backgroundImageRequestReceipts[state.rawValue] else { return nil } + return receipt + } + + func setBackgroundImageRequestReceipt(_ receipt: RequestReceipt?, for state: UIControlState) { + var receipts = backgroundImageRequestReceipts + receipts[state.rawValue] = receipt + + backgroundImageRequestReceipts = receipts + } + + // MARK: - Private - URL Request Helpers + + private func isImageURLRequest( + _ urlRequest: URLRequestConvertible?, + equalToActiveRequestURLForState state: UIControlState) + -> Bool + { + if + let currentURL = imageRequestReceipt(for: state)?.request.task?.originalRequest?.url, + let requestURL = urlRequest?.urlRequest?.url, + currentURL == requestURL + { + return true + } + + return false + } + + private func isBackgroundImageURLRequest( + _ urlRequest: URLRequestConvertible?, + equalToActiveRequestURLForState state: UIControlState) + -> Bool + { + if + let currentRequestURL = backgroundImageRequestReceipt(for: state)?.request.task?.originalRequest?.url, + let requestURL = urlRequest?.urlRequest?.url, + currentRequestURL == requestURL + { + return true + } + + return false + } + + private func urlRequest(with url: URL) -> URLRequest { + var urlRequest = URLRequest(url: url) + + for mimeType in DataRequest.acceptableImageContentTypes { + urlRequest.addValue(mimeType, forHTTPHeaderField: "Accept") + } + + return urlRequest + } +} + +#endif diff --git a/ParentAssistant/Pods/AlamofireImage/Source/UIImage+AlamofireImage.swift b/ParentAssistant/Pods/AlamofireImage/Source/UIImage+AlamofireImage.swift new file mode 100644 index 0000000..deefc81 --- /dev/null +++ b/ParentAssistant/Pods/AlamofireImage/Source/UIImage+AlamofireImage.swift @@ -0,0 +1,315 @@ +// +// UIImage+AlamofireImage.swift +// +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if os(iOS) || os(tvOS) || os(watchOS) + +import CoreGraphics +import Foundation +import UIKit + +// MARK: Initialization + +private let lock = NSLock() + +extension UIImage { + /// Initializes and returns the image object with the specified data in a thread-safe manner. + /// + /// It has been reported that there are thread-safety issues when initializing large amounts of images + /// simultaneously. In the event of these issues occurring, this method can be used in place of + /// the `init?(data:)` method. + /// + /// - parameter data: The data object containing the image data. + /// + /// - returns: An initialized `UIImage` object, or `nil` if the method failed. + public static func af_threadSafeImage(with data: Data) -> UIImage? { + lock.lock() + let image = UIImage(data: data) + lock.unlock() + + return image + } + + /// Initializes and returns the image object with the specified data and scale in a thread-safe manner. + /// + /// It has been reported that there are thread-safety issues when initializing large amounts of images + /// simultaneously. In the event of these issues occurring, this method can be used in place of + /// the `init?(data:scale:)` method. + /// + /// - parameter data: The data object containing the image data. + /// - parameter scale: The scale factor to assume when interpreting the image data. Applying a scale factor of 1.0 + /// results in an image whose size matches the pixel-based dimensions of the image. Applying a + /// different scale factor changes the size of the image as reported by the size property. + /// + /// - returns: An initialized `UIImage` object, or `nil` if the method failed. + public static func af_threadSafeImage(with data: Data, scale: CGFloat) -> UIImage? { + lock.lock() + let image = UIImage(data: data, scale: scale) + lock.unlock() + + return image + } +} + +// MARK: - Inflation + +extension UIImage { + private struct AssociatedKey { + static var inflated = "af_UIImage.Inflated" + } + + /// Returns whether the image is inflated. + public var af_inflated: Bool { + get { + if let inflated = objc_getAssociatedObject(self, &AssociatedKey.inflated) as? Bool { + return inflated + } else { + return false + } + } + set { + objc_setAssociatedObject(self, &AssociatedKey.inflated, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + /// Inflates the underlying compressed image data to be backed by an uncompressed bitmap representation. + /// + /// Inflating compressed image formats (such as PNG or JPEG) can significantly improve drawing performance as it + /// allows a bitmap representation to be constructed in the background rather than on the main thread. + public func af_inflate() { + guard !af_inflated else { return } + + af_inflated = true + _ = cgImage?.dataProvider?.data + } +} + +// MARK: - Alpha + +extension UIImage { + /// Returns whether the image contains an alpha component. + public var af_containsAlphaComponent: Bool { + let alphaInfo = cgImage?.alphaInfo + + return ( + alphaInfo == .first || + alphaInfo == .last || + alphaInfo == .premultipliedFirst || + alphaInfo == .premultipliedLast + ) + } + + /// Returns whether the image is opaque. + public var af_isOpaque: Bool { return !af_containsAlphaComponent } +} + +// MARK: - Scaling + +extension UIImage { + /// Returns a new version of the image scaled to the specified size. + /// + /// - parameter size: The size to use when scaling the new image. + /// + /// - returns: A new image object. + public func af_imageScaled(to size: CGSize) -> UIImage { + assert(size.width > 0 && size.height > 0, "You cannot safely scale an image to a zero width or height") + + UIGraphicsBeginImageContextWithOptions(size, af_isOpaque, 0.0) + draw(in: CGRect(origin: .zero, size: size)) + + let scaledImage = UIGraphicsGetImageFromCurrentImageContext() ?? self + UIGraphicsEndImageContext() + + return scaledImage + } + + /// Returns a new version of the image scaled from the center while maintaining the aspect ratio to fit within + /// a specified size. + /// + /// The resulting image contains an alpha component used to pad the width or height with the necessary transparent + /// pixels to fit the specified size. In high performance critical situations, this may not be the optimal approach. + /// To maintain an opaque image, you could compute the `scaledSize` manually, then use the `af_imageScaledToSize` + /// method in conjunction with a `.Center` content mode to achieve the same visual result. + /// + /// - parameter size: The size to use when scaling the new image. + /// + /// - returns: A new image object. + public func af_imageAspectScaled(toFit size: CGSize) -> UIImage { + assert(size.width > 0 && size.height > 0, "You cannot safely scale an image to a zero width or height") + + let imageAspectRatio = self.size.width / self.size.height + let canvasAspectRatio = size.width / size.height + + var resizeFactor: CGFloat + + if imageAspectRatio > canvasAspectRatio { + resizeFactor = size.width / self.size.width + } else { + resizeFactor = size.height / self.size.height + } + + let scaledSize = CGSize(width: self.size.width * resizeFactor, height: self.size.height * resizeFactor) + let origin = CGPoint(x: (size.width - scaledSize.width) / 2.0, y: (size.height - scaledSize.height) / 2.0) + + UIGraphicsBeginImageContextWithOptions(size, false, 0.0) + draw(in: CGRect(origin: origin, size: scaledSize)) + + let scaledImage = UIGraphicsGetImageFromCurrentImageContext() ?? self + UIGraphicsEndImageContext() + + return scaledImage + } + + /// Returns a new version of the image scaled from the center while maintaining the aspect ratio to fill a + /// specified size. Any pixels that fall outside the specified size are clipped. + /// + /// - parameter size: The size to use when scaling the new image. + /// + /// - returns: A new image object. + public func af_imageAspectScaled(toFill size: CGSize) -> UIImage { + assert(size.width > 0 && size.height > 0, "You cannot safely scale an image to a zero width or height") + + let imageAspectRatio = self.size.width / self.size.height + let canvasAspectRatio = size.width / size.height + + var resizeFactor: CGFloat + + if imageAspectRatio > canvasAspectRatio { + resizeFactor = size.height / self.size.height + } else { + resizeFactor = size.width / self.size.width + } + + let scaledSize = CGSize(width: self.size.width * resizeFactor, height: self.size.height * resizeFactor) + let origin = CGPoint(x: (size.width - scaledSize.width) / 2.0, y: (size.height - scaledSize.height) / 2.0) + + UIGraphicsBeginImageContextWithOptions(size, af_isOpaque, 0.0) + draw(in: CGRect(origin: origin, size: scaledSize)) + + let scaledImage = UIGraphicsGetImageFromCurrentImageContext() ?? self + UIGraphicsEndImageContext() + + return scaledImage + } +} + +// MARK: - Rounded Corners + +extension UIImage { + /// Returns a new version of the image with the corners rounded to the specified radius. + /// + /// - parameter radius: The radius to use when rounding the new image. + /// - parameter divideRadiusByImageScale: Whether to divide the radius by the image scale. Set to `true` when the + /// image has the same resolution for all screen scales such as @1x, @2x and + /// @3x (i.e. single image from web server). Set to `false` for images loaded + /// from an asset catalog with varying resolutions for each screen scale. + /// `false` by default. + /// + /// - returns: A new image object. + public func af_imageRounded(withCornerRadius radius: CGFloat, divideRadiusByImageScale: Bool = false) -> UIImage { + UIGraphicsBeginImageContextWithOptions(size, false, 0.0) + + let scaledRadius = divideRadiusByImageScale ? radius / scale : radius + + let clippingPath = UIBezierPath(roundedRect: CGRect(origin: CGPoint.zero, size: size), cornerRadius: scaledRadius) + clippingPath.addClip() + + draw(in: CGRect(origin: CGPoint.zero, size: size)) + + let roundedImage = UIGraphicsGetImageFromCurrentImageContext()! + UIGraphicsEndImageContext() + + return roundedImage + } + + /// Returns a new version of the image rounded into a circle. + /// + /// - returns: A new image object. + public func af_imageRoundedIntoCircle() -> UIImage { + let radius = min(size.width, size.height) / 2.0 + var squareImage = self + + if size.width != size.height { + let squareDimension = min(size.width, size.height) + let squareSize = CGSize(width: squareDimension, height: squareDimension) + squareImage = af_imageAspectScaled(toFill: squareSize) + } + + UIGraphicsBeginImageContextWithOptions(squareImage.size, false, 0.0) + + let clippingPath = UIBezierPath( + roundedRect: CGRect(origin: CGPoint.zero, size: squareImage.size), + cornerRadius: radius + ) + + clippingPath.addClip() + + squareImage.draw(in: CGRect(origin: CGPoint.zero, size: squareImage.size)) + + let roundedImage = UIGraphicsGetImageFromCurrentImageContext()! + UIGraphicsEndImageContext() + + return roundedImage + } +} + +#endif + +#if os(iOS) || os(tvOS) + +import CoreImage + +// MARK: - Core Image Filters + +@available(iOS 9.0, *) +extension UIImage { + /// Returns a new version of the image using a CoreImage filter with the specified name and parameters. + /// + /// - parameter name: The name of the CoreImage filter to use on the new image. + /// - parameter parameters: The parameters to apply to the CoreImage filter. + /// + /// - returns: A new image object, or `nil` if the filter failed for any reason. + public func af_imageFiltered(withCoreImageFilter name: String, parameters: [String: Any]? = nil) -> UIImage? { + var image: CoreImage.CIImage? = ciImage + + if image == nil, let CGImage = self.cgImage { + image = CoreImage.CIImage(cgImage: CGImage) + } + + guard let coreImage = image else { return nil } + + let context = CIContext(options: [kCIContextPriorityRequestLow: true]) + + var parameters: [String: Any] = parameters ?? [:] + parameters[kCIInputImageKey] = coreImage + + guard let filter = CIFilter(name: name, withInputParameters: parameters) else { return nil } + guard let outputImage = filter.outputImage else { return nil } + + let cgImageRef = context.createCGImage(outputImage, from: outputImage.extent) + + return UIImage(cgImage: cgImageRef!, scale: scale, orientation: imageOrientation) + } +} + +#endif diff --git a/ParentAssistant/Pods/AlamofireImage/Source/UIImageView+AlamofireImage.swift b/ParentAssistant/Pods/AlamofireImage/Source/UIImageView+AlamofireImage.swift new file mode 100644 index 0000000..2a3de4e --- /dev/null +++ b/ParentAssistant/Pods/AlamofireImage/Source/UIImageView+AlamofireImage.swift @@ -0,0 +1,392 @@ +// +// UIImageView+AlamofireImage.swift +// +// Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation + +#if os(iOS) || os(tvOS) + +import UIKit + +extension UIImageView { + + // MARK: - ImageTransition + + /// Used to wrap all `UIView` animation transition options alongside a duration. + public enum ImageTransition { + case noTransition + case crossDissolve(TimeInterval) + case curlDown(TimeInterval) + case curlUp(TimeInterval) + case flipFromBottom(TimeInterval) + case flipFromLeft(TimeInterval) + case flipFromRight(TimeInterval) + case flipFromTop(TimeInterval) + case custom( + duration: TimeInterval, + animationOptions: UIViewAnimationOptions, + animations: (UIImageView, Image) -> Void, + completion: ((Bool) -> Void)? + ) + + /// The duration of the image transition in seconds. + public var duration: TimeInterval { + switch self { + case .noTransition: + return 0.0 + case .crossDissolve(let duration): + return duration + case .curlDown(let duration): + return duration + case .curlUp(let duration): + return duration + case .flipFromBottom(let duration): + return duration + case .flipFromLeft(let duration): + return duration + case .flipFromRight(let duration): + return duration + case .flipFromTop(let duration): + return duration + case .custom(let duration, _, _, _): + return duration + } + } + + /// The animation options of the image transition. + public var animationOptions: UIViewAnimationOptions { + switch self { + case .noTransition: + return UIViewAnimationOptions() + case .crossDissolve: + return .transitionCrossDissolve + case .curlDown: + return .transitionCurlDown + case .curlUp: + return .transitionCurlUp + case .flipFromBottom: + return .transitionFlipFromBottom + case .flipFromLeft: + return .transitionFlipFromLeft + case .flipFromRight: + return .transitionFlipFromRight + case .flipFromTop: + return .transitionFlipFromTop + case .custom(_, let animationOptions, _, _): + return animationOptions + } + } + + /// The animation options of the image transition. + public var animations: ((UIImageView, Image) -> Void) { + switch self { + case .custom(_, _, let animations, _): + return animations + default: + return { $0.image = $1 } + } + } + + /// The completion closure associated with the image transition. + public var completion: ((Bool) -> Void)? { + switch self { + case .custom(_, _, _, let completion): + return completion + default: + return nil + } + } + } + + // MARK: - Private - AssociatedKeys + + private struct AssociatedKey { + static var imageDownloader = "af_UIImageView.ImageDownloader" + static var sharedImageDownloader = "af_UIImageView.SharedImageDownloader" + static var activeRequestReceipt = "af_UIImageView.ActiveRequestReceipt" + } + + // MARK: - Associated Properties + + /// The instance image downloader used to download all images. If this property is `nil`, the `UIImageView` will + /// fallback on the `af_sharedImageDownloader` for all downloads. The most common use case for needing to use a + /// custom instance image downloader is when images are behind different basic auth credentials. + public var af_imageDownloader: ImageDownloader? { + get { + return objc_getAssociatedObject(self, &AssociatedKey.imageDownloader) as? ImageDownloader + } + set(downloader) { + objc_setAssociatedObject(self, &AssociatedKey.imageDownloader, downloader, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + /// The shared image downloader used to download all images. By default, this is the default `ImageDownloader` + /// instance backed with an `AutoPurgingImageCache` which automatically evicts images from the cache when the memory + /// capacity is reached or memory warning notifications occur. The shared image downloader is only used if the + /// `af_imageDownloader` is `nil`. + public class var af_sharedImageDownloader: ImageDownloader { + get { + if let downloader = objc_getAssociatedObject(self, &AssociatedKey.sharedImageDownloader) as? ImageDownloader { + return downloader + } else { + return ImageDownloader.default + } + } + set { + objc_setAssociatedObject(self, &AssociatedKey.sharedImageDownloader, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + var af_activeRequestReceipt: RequestReceipt? { + get { + return objc_getAssociatedObject(self, &AssociatedKey.activeRequestReceipt) as? RequestReceipt + } + set { + objc_setAssociatedObject(self, &AssociatedKey.activeRequestReceipt, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + // MARK: - Image Download + + /// Asynchronously downloads an image from the specified URL, applies the specified image filter to the downloaded + /// image and sets it once finished while executing the image transition. + /// + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be + /// set immediately, and then the remote image will be set once the image request is finished. + /// + /// The `completion` closure is called after the image download and filtering are complete, but before the start of + /// the image transition. Please note it is no longer the responsibility of the `completion` closure to set the + /// image. It will be set automatically. If you require a second notification after the image transition completes, + /// use a `.Custom` image transition with a `completion` closure. The `.Custom` `completion` closure is called when + /// the image transition is finished. + /// + /// - parameter url: The URL used for the image request. + /// - parameter placeholderImage: The image to be set initially until the image request finished. If + /// `nil`, the image view will not change its image until the image + /// request finishes. Defaults to `nil`. + /// - parameter filter: The image filter applied to the image after the image request is + /// finished. Defaults to `nil`. + /// - parameter progress: The closure to be executed periodically during the lifecycle of the + /// request. Defaults to `nil`. + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the + /// main queue. + /// - parameter imageTransition: The image transition animation applied to the image when set. + /// Defaults to `.None`. + /// - parameter runImageTransitionIfCached: Whether to run the image transition if the image is cached. Defaults + /// to `false`. + /// - parameter completion: A closure to be executed when the image request finishes. The closure + /// has no return value and takes three arguments: the original request, + /// the response from the server and the result containing either the + /// image or the error that occurred. If the image was returned from the + /// image cache, the response will be `nil`. Defaults to `nil`. + public func af_setImage( + withURL url: URL, + placeholderImage: UIImage? = nil, + filter: ImageFilter? = nil, + progress: ImageDownloader.ProgressHandler? = nil, + progressQueue: DispatchQueue = DispatchQueue.main, + imageTransition: ImageTransition = .noTransition, + runImageTransitionIfCached: Bool = false, + completion: ((DataResponse) -> Void)? = nil) + { + af_setImage( + withURLRequest: urlRequest(with: url), + placeholderImage: placeholderImage, + filter: filter, + progress: progress, + progressQueue: progressQueue, + imageTransition: imageTransition, + runImageTransitionIfCached: runImageTransitionIfCached, + completion: completion + ) + } + + /// Asynchronously downloads an image from the specified URL Request, applies the specified image filter to the downloaded + /// image and sets it once finished while executing the image transition. + /// + /// If the image is cached locally, the image is set immediately. Otherwise the specified placeholder image will be + /// set immediately, and then the remote image will be set once the image request is finished. + /// + /// The `completion` closure is called after the image download and filtering are complete, but before the start of + /// the image transition. Please note it is no longer the responsibility of the `completion` closure to set the + /// image. It will be set automatically. If you require a second notification after the image transition completes, + /// use a `.Custom` image transition with a `completion` closure. The `.Custom` `completion` closure is called when + /// the image transition is finished. + /// + /// - parameter urlRequest: The URL request. + /// - parameter placeholderImage: The image to be set initially until the image request finished. If + /// `nil`, the image view will not change its image until the image + /// request finishes. Defaults to `nil`. + /// - parameter filter: The image filter applied to the image after the image request is + /// finished. Defaults to `nil`. + /// - parameter progress: The closure to be executed periodically during the lifecycle of the + /// request. Defaults to `nil`. + /// - parameter progressQueue: The dispatch queue to call the progress closure on. Defaults to the + /// main queue. + /// - parameter imageTransition: The image transition animation applied to the image when set. + /// Defaults to `.None`. + /// - parameter runImageTransitionIfCached: Whether to run the image transition if the image is cached. Defaults + /// to `false`. + /// - parameter completion: A closure to be executed when the image request finishes. The closure + /// has no return value and takes three arguments: the original request, + /// the response from the server and the result containing either the + /// image or the error that occurred. If the image was returned from the + /// image cache, the response will be `nil`. Defaults to `nil`. + public func af_setImage( + withURLRequest urlRequest: URLRequestConvertible, + placeholderImage: UIImage? = nil, + filter: ImageFilter? = nil, + progress: ImageDownloader.ProgressHandler? = nil, + progressQueue: DispatchQueue = DispatchQueue.main, + imageTransition: ImageTransition = .noTransition, + runImageTransitionIfCached: Bool = false, + completion: ((DataResponse) -> Void)? = nil) + { + guard !isURLRequestURLEqualToActiveRequestURL(urlRequest) else { + let error = AFIError.requestCancelled + let response = DataResponse(request: nil, response: nil, data: nil, result: .failure(error)) + + completion?(response) + + return + } + + af_cancelImageRequest() + + let imageDownloader = af_imageDownloader ?? UIImageView.af_sharedImageDownloader + let imageCache = imageDownloader.imageCache + + // Use the image from the image cache if it exists + if + let request = urlRequest.urlRequest, + let image = imageCache?.image(for: request, withIdentifier: filter?.identifier) + { + let response = DataResponse(request: request, response: nil, data: nil, result: .success(image)) + + if runImageTransitionIfCached { + let tinyDelay = DispatchTime.now() + Double(Int64(0.001 * Float(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) + + // Need to let the runloop cycle for the placeholder image to take affect + DispatchQueue.main.asyncAfter(deadline: tinyDelay) { + self.run(imageTransition, with: image) + completion?(response) + } + } else { + self.image = image + completion?(response) + } + + return + } + + // Set the placeholder since we're going to have to download + if let placeholderImage = placeholderImage { self.image = placeholderImage } + + // Generate a unique download id to check whether the active request has changed while downloading + let downloadID = UUID().uuidString + + // Download the image, then run the image transition or completion handler + let requestReceipt = imageDownloader.download( + urlRequest, + receiptID: downloadID, + filter: filter, + progress: progress, + progressQueue: progressQueue, + completion: { [weak self] response in + guard + let strongSelf = self, + strongSelf.isURLRequestURLEqualToActiveRequestURL(response.request) && + strongSelf.af_activeRequestReceipt?.receiptID == downloadID + else { + completion?(response) + return + } + + if let image = response.result.value { + strongSelf.run(imageTransition, with: image) + } + + strongSelf.af_activeRequestReceipt = nil + + completion?(response) + } + ) + + af_activeRequestReceipt = requestReceipt + } + + // MARK: - Image Download Cancellation + + /// Cancels the active download request, if one exists. + public func af_cancelImageRequest() { + guard let activeRequestReceipt = af_activeRequestReceipt else { return } + + let imageDownloader = af_imageDownloader ?? UIImageView.af_sharedImageDownloader + imageDownloader.cancelRequest(with: activeRequestReceipt) + + af_activeRequestReceipt = nil + } + + // MARK: - Image Transition + + /// Runs the image transition on the image view with the specified image. + /// + /// - parameter imageTransition: The image transition to ran on the image view. + /// - parameter image: The image to use for the image transition. + public func run(_ imageTransition: ImageTransition, with image: Image) { + UIView.transition( + with: self, + duration: imageTransition.duration, + options: imageTransition.animationOptions, + animations: { imageTransition.animations(self, image) }, + completion: imageTransition.completion + ) + } + + // MARK: - Private - URL Request Helper Methods + + private func urlRequest(with url: URL) -> URLRequest { + var urlRequest = URLRequest(url: url) + + for mimeType in DataRequest.acceptableImageContentTypes { + urlRequest.addValue(mimeType, forHTTPHeaderField: "Accept") + } + + return urlRequest + } + + private func isURLRequestURLEqualToActiveRequestURL(_ urlRequest: URLRequestConvertible?) -> Bool { + if + let currentRequestURL = af_activeRequestReceipt?.request.task?.originalRequest?.url, + let requestURL = urlRequest?.urlRequest?.url, + currentRequestURL == requestURL + { + return true + } + + return false + } +} + +#endif diff --git a/ParentAssistant/Pods/Manifest.lock b/ParentAssistant/Pods/Manifest.lock index 8fbc0f8..4c749c9 100644 --- a/ParentAssistant/Pods/Manifest.lock +++ b/ParentAssistant/Pods/Manifest.lock @@ -1,5 +1,7 @@ PODS: - - Alamofire (4.0.1) + - Alamofire (4.7.2) + - AlamofireImage (3.3.1): + - Alamofire (~> 4.5) - DZNEmptyDataSet (1.8.1) - HandyJSON (4.1.1) - NIMSDK_LITE (4.9.0) @@ -19,7 +21,8 @@ PODS: - XRCarouselView (2.5.6) DEPENDENCIES: - - Alamofire (~> 4.0.1) + - Alamofire (~> 4.7.2) + - AlamofireImage (~> 3.3.1) - DZNEmptyDataSet (~> 1.8.1) - HandyJSON (~> 4.1.1) - NIMSDK_LITE (~> 4.9.0) @@ -35,7 +38,8 @@ DEPENDENCIES: - XRCarouselView (~> 2.5.6) SPEC CHECKSUMS: - Alamofire: 7682d43245de14874acd142ec137b144aa1dd335 + Alamofire: e4fa87002c137ba2d8d634d2c51fabcda0d5c223 + AlamofireImage: 3b35b586853abaf94ca1250f4e94cff3c21a4c0d DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7 HandyJSON: 3a3de917c4118767ffe41c29b5acba23409649f4 NIMSDK_LITE: a69a019544299a1b597db6ebf98927f5e12fa17c @@ -50,6 +54,6 @@ SPEC CHECKSUMS: UMCSecurityPlugins: 0831a08f3988f3cea9f1d3a7626cd9bee4fef150 XRCarouselView: 52529f924d26ee4787f9bd958150800b73e60922 -PODFILE CHECKSUM: ef5a2eedc2a762110d9f7458ad01512ced09aba0 +PODFILE CHECKSUM: fb172574c836b57e7c792807c655a091aff17050 COCOAPODS: 1.4.0 diff --git a/ParentAssistant/Pods/Pods.xcodeproj/project.pbxproj b/ParentAssistant/Pods/Pods.xcodeproj/project.pbxproj index 644d160..c5c73d0 100644 --- a/ParentAssistant/Pods/Pods.xcodeproj/project.pbxproj +++ b/ParentAssistant/Pods/Pods.xcodeproj/project.pbxproj @@ -7,431 +7,486 @@ objects = { /* Begin PBXBuildFile section */ - 00E153632A414101E0A66AE23569802B /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92331AB0F30415BE666C619D1A45513E /* Result.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 01866720BD41E2820300D8B9284FC061 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; }; - 0203C16E98AD37E5A0C596D1B39C5119 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 0969E5011DCC0C421F637E6859279610 /* Reachability.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0369C812B817E442E9BF7B2F561E1AEF /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1914DA670BEE4BC1F461E88ED1BD7C26 /* Configuration.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 05F1082B0C6E40F76E821D67DFAD9AB5 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 172419A08571955755C3C6FB2044DD9D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 079D990738735591330332B5F2551AE4 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCCC1A6E4AF8DAF6E5609D65548B3C79 /* NetworkReachabilityManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0A2126372E9629100B22A44A94E73D71 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 33347618F6541AA20F52632F9EA10CA6 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0ABF85713B5ABC01E4121F8DBCBBD195 /* Deserializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D374115D56716D6284C03A777CD2BB4 /* Deserializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0C11C193B2F9FF679EB214C272C8A480 /* Transformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4E76CB8696BAB20A617484E4726713B /* Transformable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0C4EA35F79172E81D6BF56A2FC856ED8 /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 38EE23882943EDCED73523F643A71C39 /* SVProgressAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 121B576C5153736760EDBD385DCE1A82 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DB0A7F29D540AB077DA6D9855C3F743 /* QuartzCore.framework */; }; - 12DE723E9DF6F13F3286874C3A95E30A /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EF7D93FE7442849AC14571996AC8ED /* Logger.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 143D0DFED5AF7708744EBDB443F9812D /* EnumType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C73B5BC3B66F99610607951FEC5FCB3 /* EnumType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 14CECE238604E1D44104E5BCD14EB2BE /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D3152CF39784BC2AAD4747AF03BB50A /* SessionDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 164781197625A3149B3BDBCAA2AC8CC3 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E95345A11FCCED373B3A5758A6073CDB /* Validation.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 170AB456D9F3C346DCF407E42D84B5D5 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BE70BDE392E6E92B76047D2DED4ED380 /* UIButton+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 17F8D48B0736FD13AC59D9311C074E9D /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = C203E9ABEF394B0009B142EEB9AA64FC /* NSData+ImageContentType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1A3841F2F008E6FEBA8B10F04DE5AD15 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DB0A7F29D540AB077DA6D9855C3F743 /* QuartzCore.framework */; }; - 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BF496B88C6E68626DC9D0C9FC152BD3C /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1C39565C535B7D534368C5DFB46659B5 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1983D355FD75B9D24A71756509C98131 /* SDWebImageDownloader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 204944D67267632DD7CD4BEFB60AC389 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8781B0306B0188AF528659F413E1B542 /* Response.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; }; - 240CD81B9BDAA551B583A82E3618D560 /* XRCarouselView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 323A41D79693687F0377B9ACACC90D4A /* XRCarouselView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 242367446F58A71823A8250396E775A3 /* HelpingMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9889E5067E9A54BAEC05298BBA10F671 /* HelpingMapper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 264463742964367E06060C2E85D3EEF4 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E786E1AEE51D914333543AC4DEF9B3FB /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 27813DC0914AD972436022C87454185F /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FF65E4A0D399571B01517891F0309004 /* SDWebImage-dummy.m */; }; - 2AB8304BE65678C2043856E0F4AAFC9E /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A559DCF61F2E184BC9318C05F05CFF3 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2B58B070F9D7324583D01EE906BC918C /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5104B9F40B6C55F71BDE788F76AA8F53 /* SessionManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2B5DF32B1906ED4F0088D37CE08CB2B9 /* Metadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3C517CD17DEB98E878268901D654E8 /* Metadata.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 343B30C989188B77FB1149FED753A63C /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640ED88831DE9CA10759B8FC3751C531 /* ServerTrustPolicy.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 38BC499B109AEBC02AD6C88AB2ED057D /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FFCF8A6062658FA349B617C0D75723C2 /* SDWebImageManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3C69CE7353282718747615DDA9563510 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 93251EC8BEF89E6A4FA758DA38A1E47A /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3D342698F0FA2B9391B7B1733D499623 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 20C0A79CAF95E65B981CC5F896E4334C /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3DD10D4C59666719E941A5D0EB5D9582 /* XRCarouselView.m in Sources */ = {isa = PBXBuildFile; fileRef = A91D08749C812CD6EB281780E69AFED6 /* XRCarouselView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 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"; }; }; - 46389823D72FA2DA9F4AD34CE119E9FA /* Reachability-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 29BC53491C8D6BA4B81045D6FBBA043C /* Reachability-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 46749DE4D7ED1863AFF86DFB519EAAD0 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 9011EFC1DA29BE6CA0831595062B82ED /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 48F71FC920A4F562FF7ECFD25BD08F2E /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2830040C9AF69744EEB45C092E65CA2A /* NSDecimalNumberTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4A1D23F6526F175FCC2B35539E1B6AD6 /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = 17403F9FAA48DA29AAEB297BE9AC4D51 /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4A2F8CD414D57920B53208F0F9A39E34 /* XRCarouselView.h in Headers */ = {isa = PBXBuildFile; fileRef = 57342E33349B812F65B6D994EA74E212 /* XRCarouselView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4A961542DBC3F70E502B854EBB870694 /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31A74FD90C96035085B5A148E9CBA64C /* EnumTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 73AD0FFA16B2C0B1B8A40B3A76629975 /* DZNEmptyDataSet-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4F7B3FA3957DCA2A67546E72117904F9 /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E85535E49256ABCDBBB9EA045CE6268 /* HexColorTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 502127E1D7BF9D8D8FA29AD2F7EF420E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; }; - 50424A0F4A3907712832B1FA56C9E2A2 /* Measuable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D9407543C44ABED0AC48154C76831BE /* Measuable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 53926FE56FBF1399E69B9F893ACFBDB1 /* Pods-ParentAssistant-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1706C196E50CAE9C6DE364B9BA5E9DCB /* Pods-ParentAssistant-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5438E76D8DA2CB8E045DE40226F4A5AB /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4EC3094994043023CF3002A63DD6DA4 /* DateFormatterTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 545C0FA9073D729E2E8C3EF9678C0DEA /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72ADD4F0113F0555435EA10BA789F8E2 /* TransformOf.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5475A5933FABB5F9999E31020427B182 /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE92E07FF56795D096246F9059B540CA /* DataTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 58812AABBC0A1E7AE019752424DF31A7 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99DF7E55400E9131640E0694D3C91764 /* MultipartFormData.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5C95D2513AAB007D33804F074AC4DD33 /* Export.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33C9063E8CA60D73EE6050FCF59F433 /* Export.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5E25BCD30BDE2E7A68D1A6FAF7253AD4 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6429920CDFD8D08A5A0566565673330 /* DispatchQueue+Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 11DABA5B57A3076260D36D4A9AE646F5 /* HandyJSON-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 603F9D0686CE005205D389C1E4C6072A /* XRPlaceholder.png in Resources */ = {isa = PBXBuildFile; fileRef = FFEBBEC7D2ED4C631DFB3CBB04E6F926 /* XRPlaceholder.png */; }; - 604E191C52F306436E51253A4A21589C /* SwiftHash-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F2BF6E468482ED7EDAE9AFD6CA2C994 /* SwiftHash-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 63751EA36B3CCD03BF292C19F6B7C5FE /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C441F9B75595B2F266E6AC40AD7D85 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6540CC4D369A32F6DE54AFA8D5D6FAF9 /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BB2B3251E63EE34530FC8A40E441CB23 /* Alamofire-dummy.m */; }; - 6694F9A05D6A58C5C27935913BF8AE56 /* Pods-ParentAssistant-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F6BAADF2798AA6F62DA82FAA92DECB07 /* Pods-ParentAssistant-dummy.m */; }; - 69735BB95E8E8111E0CEA96BBA19486A /* ExtendCustomModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E529332879B58C942DDF16DF5D39B4 /* ExtendCustomModelType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6A14BBE1A1C5AFF3B9FCFFCC30685E04 /* Toast-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 835B1DEC82F034C2C12DC0723F18F6E9 /* Toast-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6BE097BD2C38D14E51B20BCEB5C6F495 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; }; - 6C3C226E0B46AFC4FD756BA6C5D9414E /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 6850886B55CE3CD9B901B28690292C5C /* SDWebImagePrefetcher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6F4160DEA9816F49351CCEF452CCF00C /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64CF5A867496880A0DAE25ED9EC8E512 /* CustomDateFormatTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 71770C33C6DBF555B10D0A42E5C034F4 /* NominalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C5CEE4C10F2E83011011BAE5999B4FD /* NominalType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; }; - 78F4229B4A746A38341474FEB9DADB25 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14EC82B350F60C65CB156014F5997DCE /* ParameterEncoding.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 7931BF35785763872BD11EB65164B1D5 /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F33461E2C03CDF90E02052B76ADADB01 /* TransformType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 794B16FD139EB13BA49AE711C49135BB /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AEE056145338863D7A727ACF1C3657C /* MD5.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 7AC13BF7B3C538D94DE7B9D836786514 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E90E960C03E09803780D5C47A55A4DB /* SDWebImageCompat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 7C3888324281E325ABBDDB3888D52125 /* DZNEmptyDataSet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F6392C48C4C9A3D7130A57D84AFEE2B /* DZNEmptyDataSet-dummy.m */; }; - 7CE1363BFF8D96DD8059E0B5481A8D00 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; }; - 7D23D4A779C42E695BD2EC80114AD9E8 /* Reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AD254563DCC20283BB5C0C5B4E57B5C /* Reachability.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 807283562FFCAF1B2AC3B251ABF34B5A /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D24FB404E9541910245BF3E68C5EE73 /* URLTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 82769877C29A8E71221C9918273D3FFF /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A51BA19C89D5E62EDCF2DB9D9FA43E0 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8444B1FF566FC96D823C154BEE6A4A03 /* BuiltInBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F948022D8D1EFEF734A07E6ED4D6CAF9 /* BuiltInBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 41531DBB287870602D671C4D97E99B21 /* UIScrollView+EmptyDataSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 86930F980FA87FB0CA5E197FEAA7A90C /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = AE8B2524C105710A1C75E5F3C734796F /* SVRadialGradientLayer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 86EF282C771B9E7A12106ACBE6E820F5 /* ExtendCustomBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32115C18B0BD53A5791A3FA797AB85AC /* ExtendCustomBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B3D43CB0BDA34787F85B2C084FBB09A /* HandyJSON.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8B937C355B5CAAEC40B80F24AFA26569 /* Reachability-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 16CC2B704148D354077756FC0880DBCB /* Reachability-dummy.m */; }; - 8C1E8307CFE1A73F290CFCE8818B6123 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = B9A38D8C4EC4826AEDC2A52DD0187186 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8E31EF89BD192C6AACDE9E0655861D3D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9B732FC24A0EC5E46E41D939F4A1130 /* UIKit.framework */; }; - 8F5C0849D2757FC5A7C81B81BA3813C3 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39F3B60B0A2AD7975DA5BCA943FA6BD5 /* ResponseSerialization.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 90B1C77BB42755C3E9AC821A09526E53 /* SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A4D6703A8771BB168130EFB6EAC1C3E /* SHA1.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 952429322A476D5508670C477DE23669 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; }; - 95F6802FB7C748286D6E1D6876552E8C /* BuiltInBridgeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6976D41DC0C992EA2F24C3A7358E958F /* BuiltInBridgeType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 963D3083B43A304CE4A81FF8908C644C /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0A49BF64844554AA6BC0B49FD9A9BE8 /* DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 9687BE425798E40CBC52870F8009209D /* UIView+Toast.h in Headers */ = {isa = PBXBuildFile; fileRef = 19FAAAAFAF3A705D1081BDCDC14CAFD6 /* UIView+Toast.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 981EFF1371FCE40F1907DA262743B93E /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F2F35AD7354793D357E10226DE37995 /* Notifications.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 9EB13C869EF150828095C94F1FEFC517 /* Properties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BE4EE179BFA37C2F5F3928F9237A1F /* Properties.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 9F24B341383F0FF8EA368B3A7F9BC087 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; }; - A17930AC43F712547C2B4B58C1450B82 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C03FC1A11EE20AB8B6A4B398E11B26B0 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A43438F0B3A712FB5739EA173AB6F134 /* ReflectionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31257A57ECE5DD3A052A547DA8090EF9 /* ReflectionHelper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A7B5C0EE248855B3357C98A489F835D9 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E2AA0C415512D5F3F34F7A99AA4D14A /* UIImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A8D327620CE1909AD98F6B239AA60018 /* XRCarouselView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7437E1C250CA27898AA8815D1117643B /* XRCarouselView-dummy.m */; }; - A95766E9124B13BABFF00CFBEFEC0501 /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = B6554BE7D86E2DF12BC2CFA630452CA0 /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AB6A5752C4586385EE13F1E6E2E9F40E /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0322584439902B09D766EF9B00C87E2A /* SVProgressHUD-dummy.m */; }; - AC2961AE064F12C1AA82F853AE6CF4DE /* OtherExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9462CA128209C32EE6E6647C88609D1 /* OtherExtension.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - AD2C576F50E67B2417C1D17FBF5E32B2 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08E13F442024BE43D2F31AA6F2C300DA /* AFError.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B2D8BD6984912C60C7A22BF665987A73 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 140A2830037A30E45442BA52CBDA1CFC /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B35D34D1C1A4B0A5FAD90526DE5D88A4 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59271332AFD884264C5B45B6B6152051 /* ImageIO.framework */; }; - B575E905525EDD3311A9872A0C4307AD /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 65DEF3C169B8F1241E74C3D5C7DA5A6D /* SVProgressHUD.bundle */; }; - BA3AB9E7766B254534C357EB523687B6 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1836357ECED17B3B0BF22256498AA8EE /* UIView+WebCacheOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BBF90CAC12DA7C2713DB47B3BE5C898C /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 206933D2687A3DC4CD2836F2AEF28A3B /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BC9AB82CB1C91977B5C1C96A25A9CA22 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = F638493F2C879E2AF820AE53EA390269 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BD14752B5379EAA21AF328A8ABE08A6D /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = DB5FF7B561F6F548C82F1FC27FDD72E8 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BD2E6B5D9C3C38D8C1BDCFE0CD6E489D /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 469D54339A6D448DF6D1166FDB669676 /* UIImage+MultiFormat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BF901FE99C862B2093FF8E2F71B80F93 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 1439A3EA7193042844C3E9C52032677C /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C23D014A840F87E883B74ABEC475E608 /* HandyJSON-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FD2B11D4DCD30BDBA06841569E01E1BD /* HandyJSON-dummy.m */; }; - C577B322B52228B272D52FF32B7BE30C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; }; - C5FD57751548EFFA6567AFD2EB47CD56 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232E0E55F341C5600028F7AAA4F59E8A /* Request.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C633AE7C1F16ADA3AFEE968396B73A4B /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = B71F8A62F3906657D17D418212E1CBA1 /* UIImage+GIF.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C8D2BE872D244EB549F2EC97069CC4D0 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BB7CE29DC4FFF250766240EA8DA973D1 /* UIImageView+HighlightedWebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C906E3F3B8CC5A9E003DB020DFAE7864 /* PropertyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81D2AEE4F419083BF22474B240B3D9F6 /* PropertyInfo.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C98D39690CC370401444D498206BCA2B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */; }; - CAD7174B4833082EAE9507FB4CDCB07B /* Toast-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 85EBECC44FA24EC40748D3CB399DD1F3 /* Toast-dummy.m */; }; - D1341DA6F9B384B99BAB4C367DAD6BEC /* UIScrollView+EmptyDataSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F6A571F05F4D0DD12870CE83C8F787 /* UIScrollView+EmptyDataSet.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D1D5D64268DDC619511D3942F434D7DD /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = DF68D7CB4183F99C38744F4985CD422D /* SDWebImageDecoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D425D13A48689CCBEA1C0BE43928A682 /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DFB6D55866F4F62D8116993D42B55A8 /* ISO8601DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D5686072DEC1A0E14F8C100FCC873F73 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD387D9E3BDF322939523D4DF31CA79 /* TaskDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D603EC0AAE41B1733F0A4A2FA4381910 /* SwiftHash-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 448D149E9E2122E63C2D8CDB8E1159CB /* SwiftHash-dummy.m */; }; - E198F398404F07805E5189165F3C1E64 /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9ED9DA2E61F2A4DD7E760C61C47A3F1 /* Timeline.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E49369FF3BD66698C3B61B8DE9C58DE0 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = E3370B03674C70DABFF75D9D2BA95DCE /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E72FACD066C66E010F4C91956E8E29CB /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = F6C063D5E492D3ED69858D446C30719E /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E990A247D80417D4555735E8A8DBD76C /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 72803D16FA054A0D26C303991C1F2B3C /* SVIndefiniteAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EB3F85272BEE4C2EB0321741E8FE4B75 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = E33C2A8A35CA23130F27CFEC0285B7DB /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EBA0781A1E2822CF7DFD56ACD394A63E /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA07E2E477768269A8D0BECE492EBAF /* Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EC3CC4DC8A5C9241AE7D9359EEAFC69F /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93ED65B5F47F5FEA00C9BC9D151B1D26 /* SystemConfiguration.framework */; }; - EF1B6B88FF4C6BC506B9C85BAEDF034E /* PointerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3447CC75BA7C93ED3BF68C2F65392471 /* PointerType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EF57A4E0C40DA6E906B390C69902421F /* AnyExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 931ED830C3B0B8852F1479DE61BA997E /* AnyExtensions.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F1A921225B642E15ED24FB4734240F8F /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 24C69C342339292A7BBB5C56D2C12D12 /* SDWebImageDownloaderOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F206FE65A9D924A3F6ED6221E3BBD35E /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6768B1FE2E118D79D8A1613520B9BB23 /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F79EC3C3CF96DFC885E8DD247FEF08EB /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DC66067EC016B21D6BC487C409083AF /* SVProgressHUD.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F8FB51647A0925CDAF63C5DAA23D8B4D /* Serializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39C3C21D34A34F85D09063C7E1255E9D /* Serializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 00E153632A414101E0A66AE23569802B /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C01563CB8CAFA848353DD90A07F2F47 /* Result.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0369C812B817E442E9BF7B2F561E1AEF /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19A6339BCDC426144D4987C81596418 /* Configuration.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 06B6D63D2B2E6F2896A15C18097D3730 /* UIView+Toast.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BD1FCCAAFC6349CA1E2AC3881DB81FC /* UIView+Toast.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 079D990738735591330332B5F2551AE4 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFA9DF74078A51C9573DF6952A753D1C /* NetworkReachabilityManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0ABF85713B5ABC01E4121F8DBCBBD195 /* Deserializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFFC9D8585FF5A3FC4C7FD63A93DCE16 /* Deserializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0C11C193B2F9FF679EB214C272C8A480 /* Transformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ABA7E2E494925BF34BC9885BE24E31C /* Transformable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0D0F6E0ECE5915267F0EA404BDCD4BAC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; }; + 0D6E3F656916E4C6734BAF1DAB7CAEE7 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 61D09F1E0C8F29641858460B3928A5B0 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 12DE723E9DF6F13F3286874C3A95E30A /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14E325E19530D7ADA41064D345141437 /* Logger.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 143D0DFED5AF7708744EBDB443F9812D /* EnumType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CC52F25BF175D139AA0E5C94DC363A9 /* EnumType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 14CECE238604E1D44104E5BCD14EB2BE /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BD55715F6A333D077B971AD89F07626 /* SessionDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 164781197625A3149B3BDBCAA2AC8CC3 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981D262EBFB4CA168BE569F48CC64843 /* Validation.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 189863C7E2504923687D78D7B081F8CA /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 229808FB79115B70777D682D8335C18E /* NSData+ImageContentType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 18FE70ED14474EE6A49E85DE9C5E4C17 /* AlamofireImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 600ABB9AA8054F7B4E851C17D19FCAA0 /* AlamofireImage-dummy.m */; }; + 1A34F151BC19E9D0725C689FC1038209 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B05BD93D4EE278B866CC9AAF18763DB /* SDWebImageDecoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 78F77FFCC80D398532E854672D527FD8 /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1E2754F17B8625E93745EB87C0E58961 /* Pods-ParentAssistant-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1706C196E50CAE9C6DE364B9BA5E9DCB /* Pods-ParentAssistant-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F4FA4B67BA7582CA193404E3510B095 /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = CBB0446840A0CDD4BB7D69692D07CC21 /* SVRadialGradientLayer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 204944D67267632DD7CD4BEFB60AC389 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82D7054D7F1E7FE0ACBE043A3FA7F50 /* Response.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; }; + 242367446F58A71823A8250396E775A3 /* HelpingMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05B1F80DC3C02C2AD29D4C6CEA059CCD /* HelpingMapper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 26479B07464784F3BF8C0853CA049976 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; }; + 29B1FA33CD27E5CAEC884DA6D0072CFC /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BBA6274610821F15000C6CC777D555B /* SDWebImageDownloader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2B58B070F9D7324583D01EE906BC918C /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6296C8F6861894C09A46E509B544A6 /* SessionManager.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2B5DF32B1906ED4F0088D37CE08CB2B9 /* Metadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00395AB0A6A459E12899B1CC7AA3C954 /* Metadata.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2EA01E4E252B14F7953C56C100482236 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 920C3AE864C4E24091B77772A498A58C /* SDWebImageCompat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 32EDA9ED83F4442303A46839027E152E /* AlamofireImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AD53A7A5BDC98AFD3CE8CF1BC407F10 /* AlamofireImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 332B3CC48AC35662839D5A89D1FD9C0B /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E4D61E78309E6543D6EBC75BE2967417 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 33FCBEF6884A33B921FEC6A9511B8E20 /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A23A7E20FB52B9BFC4899C0FEBA2C6CE /* SVProgressHUD-dummy.m */; }; + 343B30C989188B77FB1149FED753A63C /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE58263CB0A52CDB5D3790DC6D0D74F /* ServerTrustPolicy.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 357EC08486308022D69F865CBFC53798 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 61CAF6761E3C21827415A9DA38D18547 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36840E12F93D5E0D201B1D998B96EEB9 /* UIImageView+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D00913B407B6DB96C7E7B48C21D904 /* UIImageView+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 385BDDC55889104E43C83664FD4C2BD3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; }; + 3A9E64415250045D18CD329DE4776D9A /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 496A0D655D409BDF23A3826300EBCD1B /* UIImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3B2224950C9D1CE87BA75653DDDD2A13 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F3CF9F638E5784E56583202BEBE63239 /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D0142A71F210A641528761123C4F1C2 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ED641951605DEB02B067F9D1915C5A9 /* UIImage+MultiFormat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3D34EECD1D7C0DC13F3E19C4C74F212E /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 358430CDB8CA6FB92C74E9FC7F6EB159 /* SDWebImageDownloaderOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3F16FEA96023ABF8BB9A47112409421A /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A2BD80EBA9375936EAA1AE0D930C61EC /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4140A49CB0D5F03DD7565AC94796D856 /* Toast-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E637F89EC35850C7250805992BB1C0 /* Toast-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4214C2FD7E877BAD66B5E69E70D52CC2 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A53991A7FAF70CDAC1F059FB04F5543 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 48F71FC920A4F562FF7ECFD25BD08F2E /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 467C66A8C88F09EF9D0129564F08540C /* NSDecimalNumberTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4A961542DBC3F70E502B854EBB870694 /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BC1B5A06113F348365D3564FD6425C6 /* EnumTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CECDC33DC6A3E686FD21577C5B23C258 /* DZNEmptyDataSet-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4F7B3FA3957DCA2A67546E72117904F9 /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC1E0E16DEFECC3E2FE92A428C9920D /* HexColorTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4FAADAA79CF5A8371B74578A2EC10761 /* XRCarouselView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B63F0AB7376A64C50DA03CACC7D9CC2E /* XRCarouselView-dummy.m */; }; + 50424A0F4A3907712832B1FA56C9E2A2 /* Measuable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07BCC67F387326CAFCE34AF5FD2DBDE2 /* Measuable.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 53591DA77C42B53EB9AB3060008F41B6 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 02DAB9B7A1A3D2199EFC7FC7FC69ED85 /* SDWebImageManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 5438E76D8DA2CB8E045DE40226F4A5AB /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D7A5D10D9FFDD32C4D3CF85DDCFC707 /* DateFormatterTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 545C0FA9073D729E2E8C3EF9678C0DEA /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1BF45D7C52BC6493B283DDB371395F /* TransformOf.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 5475A5933FABB5F9999E31020427B182 /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6614C2951E5A4AB6D1DF2B076BF1A5C /* DataTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 56815D1138F9669E37F2004119169267 /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 70B842936FA16DF44F4AD4FC84E225A4 /* SVIndefiniteAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 57B5D779BAB2A1CF8C2D4CF8F14066A0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; }; + 58812AABBC0A1E7AE019752424DF31A7 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7C98E50FC5D694C89DBEE8A1486D900 /* MultipartFormData.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 59145DFC87F4E74844E76619E8C4114D /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 310743AC8DCCF3F81515515A6FC64B8A /* UIImage+GIF.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 5C95D2513AAB007D33804F074AC4DD33 /* Export.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1300F08331C16959F41C2533B209EF5 /* Export.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 5D0701D0FA9726E83C52A53F4BEAD02B /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = BC99BBF9B209FE42B0D74F5CFB60627F /* UIView+WebCacheOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 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"; }; }; + 5D8FA1EAFFDA438C0D3E909D54D6E657 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 155F8627DF2C4A4A091DD4AF34FFEF02 /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 5E25BCD30BDE2E7A68D1A6FAF7253AD4 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2245A79B4B989C667CBB26B48B7A1896 /* DispatchQueue+Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 293A8917426C277C951BE22C661A240A /* HandyJSON-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 60E47009DC055C6C140154BC96B5C58C /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC0A874231DDAD102B02D7EFD048FDE2 /* Image.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 613167D898FF421A6F75D1FE5D145B9B /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CD0FA7EE743F01B3A6385702606A408 /* Alamofire.framework */; }; + 6257B7791953547BB4FD33142C6A4016 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DFCFB41829DC67B9036DEF9766C6C88 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 638A8C8931AA82B35E4165A32BDEF8CA /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BFF20BC7E4F55C09BAC34A664D91FED /* UIButton+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6540CC4D369A32F6DE54AFA8D5D6FAF9 /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 489ED6DFB42C7C8F6A4875005025A913 /* Alamofire-dummy.m */; }; + 666A863EA9B0A00CA5EDDB4C96EA014B /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = F775144A6F17788F065E01BFD8DC2D5C /* Reachability.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 68EF6ACDBEC67DED9ACB63B4CFA05404 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4D8AA9257567AC16CB397E7E8BF346 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69735BB95E8E8111E0CEA96BBA19486A /* ExtendCustomModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D3997593CBB0B018C81C73E8337C2C /* ExtendCustomModelType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6C5B6525AD8543CD0EA5382D9B9EBF00 /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BF833E322898122D95617BD9520476D /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6F4160DEA9816F49351CCEF452CCF00C /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98932AABF2712E9978244730956580D5 /* CustomDateFormatTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 71770C33C6DBF555B10D0A42E5C034F4 /* NominalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C29AD1BD351F370FBE921BBE6756CEC9 /* NominalType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; }; + 78F4229B4A746A38341474FEB9DADB25 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F3763627E35DE67CD17EE93E640DD39 /* ParameterEncoding.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7931BF35785763872BD11EB65164B1D5 /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F75E090F317987C0134B9DD1E5963C9 /* TransformType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7B8F1E3301B7F3D1AF25FDE0E2618647 /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = DBA6EC35D53897ED2A96FEDE1BB384BA /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7C3888324281E325ABBDDB3888D52125 /* DZNEmptyDataSet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EC105ECBFE938402821EF19D7C5DA1DA /* DZNEmptyDataSet-dummy.m */; }; + 807283562FFCAF1B2AC3B251ABF34B5A /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B31E52FEB6E5A6A955D4050CB76B18C /* URLTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 80AF024EF162F4FB88CCAAA2FA6FAAD5 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F1187580C59983EBFA6A55260AF21079 /* SDWebImage-dummy.m */; }; + 8444B1FF566FC96D823C154BEE6A4A03 /* BuiltInBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68ECD5E13EA08D669EEBD74218B18FA5 /* BuiltInBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */ = {isa = PBXBuildFile; fileRef = DD324E3E21CD21F91211149384F64690 /* UIScrollView+EmptyDataSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 85B4114292AEC3C6DCD2F9500A064F9B /* UIImage+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E3282E372FE0A6C0D2227384238F921 /* UIImage+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 86DCCE5F06E9EDF67344C60D4859F032 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 715810392F163BB36DFE8AC307460289 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 86EF282C771B9E7A12106ACBE6E820F5 /* ExtendCustomBasicType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7701D17547204EF54A538449343E8A4 /* ExtendCustomBasicType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 92B55B2A9C151490137F69027B7F531E /* HandyJSON.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8E31EF89BD192C6AACDE9E0655861D3D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BAE5BE9DB67074649A1927384361E0A8 /* UIKit.framework */; }; + 8F5C0849D2757FC5A7C81B81BA3813C3 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BE4F7B39AE70471948017C04083277A /* ResponseSerialization.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 90E5A049B2FE3D38A1EA782CBB763739 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 01529461C8BC5BFBF1FAD1AE7D691496 /* SystemConfiguration.framework */; }; + 92BC60F896B3049AEF17412EE13B32D5 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D96BCA19B9F922B2258E4C0D40666B58 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 930D1C2CE2E4A32830066A7F4240F88F /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D9602FA58305177F98B7472A155DE66 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 93258C9412DF54DD088A385C2CCC79D1 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D43927282F3DD1C78741ABFCC5E0C768 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9371A6AC1CEABB24E7275AACD3FDC21A /* Reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = EF0B6E4594449A55A06C44CB6D1223F0 /* Reachability.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 945146A0826BB693F1B9496A0620A97F /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 729A72124A700ED6D7D56FE6E3316184 /* SVProgressHUD.bundle */; }; + 95F6802FB7C748286D6E1D6876552E8C /* BuiltInBridgeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 916CF2DD179C34072F0CED7EA7E172C4 /* BuiltInBridgeType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 963D3083B43A304CE4A81FF8908C644C /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10D6F8B588CB7C3C02CD426DADF34CE4 /* DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 980154A8EB800AAF627251C8AAD7EAA9 /* XRCarouselView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89457F43B7DE2154380C8DD976759AA2 /* XRCarouselView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 981EFF1371FCE40F1907DA262743B93E /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = E215EB7C10CD4B2F724959DB344FE5C0 /* Notifications.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 98C28E5A4A7CC37A671D4BBAE25EB3CB /* XRCarouselView.h in Headers */ = {isa = PBXBuildFile; fileRef = AA29655EDD56783CB2C21A411019B7BA /* XRCarouselView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D9717AC018F075F378E52B078CDBFB5 /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDA2AA9043380263CFFD99AE883B70ED /* ImageDownloader.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 9DBB6831E79F70D2E8C4DFD169E228E2 /* Request+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC28263CA0EDAEA1CBC1173B87FEA769 /* Request+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 9E686D93A33DD9756B0C21B68BD7D758 /* ImageFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A58625E1014C6D82D1825309986334E1 /* ImageFilter.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 9EB13C869EF150828095C94F1FEFC517 /* Properties.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECC6F721935680D316DC183994F4F569 /* Properties.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 9FC9BC048B02CFF720B9CFBE4DC80264 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DA08525DC2775B611071866CF38CC96 /* SDWebImagePrefetcher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A04DAA4579CD1E21D2161AABB36244C4 /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = F81C313FED69F64F2F4F403B4C4EC3F6 /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A133EAE3F50C55B4E1A03A5F9D6B3A4B /* UIButton+AlamofireImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4ACCC8EE8E5E07D0CD171894588314 /* UIButton+AlamofireImage.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A24D31929B67BB4D0EED65AA74C0E3F9 /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = A8CB977B7AFFFA509CAA11CD0C03AEB5 /* SVProgressAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A43438F0B3A712FB5739EA173AB6F134 /* ReflectionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35322B49B5EBE0CF14B7BC8677497347 /* ReflectionHelper.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + AC2961AE064F12C1AA82F853AE6CF4DE /* OtherExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4457386C2A87F3E11630992C9CAA7836 /* OtherExtension.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + AD2C576F50E67B2417C1D17FBF5E32B2 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EBA3110EB94A0568FF28796D778675E /* AFError.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + B0114B93073F87D24BE99FCEE08CDAE2 /* XRCarouselView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 49DC3C5FB6A7B1CDAA1410FAABB684E0 /* XRCarouselView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B06A3FFD3EBF03FF3166F6E1B0D665F9 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 98BA100696255C8CFD15860D64267467 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B2CC21A9D71EA49F2A55896265CF8E29 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B82FE543DC2AE8EF3A0F380DE2B5988A /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B58BEA72F3BC139D3784844F73AA791F /* SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = E651A4469FA2206746488B70290D48C0 /* SHA1.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BBC827F8711B46CA8FC3854C99DF703A /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A591BFD7762D296F2E84EBC08129BFA /* SVProgressHUD.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C23D014A840F87E883B74ABEC475E608 /* HandyJSON-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 46E35C087C53D197C9D213DF73A74B66 /* HandyJSON-dummy.m */; }; + C4DC2D005B7A1313DF98AFF23E15D1B3 /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8249AA0D5DBC641B891AE927074850B2 /* MD5.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C577B322B52228B272D52FF32B7BE30C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; }; + C5FD57751548EFFA6567AFD2EB47CD56 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = E74F653E7072F40DB006FC90854FC840 /* Request.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C906E3F3B8CC5A9E003DB020DFAE7864 /* PropertyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CA29ADD75C3FE58A4ED07E10D427C9F /* PropertyInfo.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CA6644C7C70AC449F8D9968CA529C381 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 852A7B853425A17ACDE963BB0C57B689 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CB5529FBDB9ED31E939EFD0EF7D8EBE3 /* SwiftHash-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DF7918BBC8A10388FDE15B624F66A8E9 /* SwiftHash-dummy.m */; }; + CBFDD17FED69C5F001648B331CE5FDDE /* Pods-ParentAssistant-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F6BAADF2798AA6F62DA82FAA92DECB07 /* Pods-ParentAssistant-dummy.m */; }; + D1341DA6F9B384B99BAB4C367DAD6BEC /* UIScrollView+EmptyDataSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AC81C76B41B0ABF4E94921ADBA70C30 /* UIScrollView+EmptyDataSet.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + D22AD2613455598A94BFCCA33AA9B2CE /* Reachability-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 17EFC56D8D5FA327B6DEB6D0ADC56C1C /* Reachability-dummy.m */; }; + D425D13A48689CCBEA1C0BE43928A682 /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7379E87D9FF2E196ADB91DC8A0A5F2F3 /* ISO8601DateTransform.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + D4C68ED144E24084583644C877C41229 /* Reachability-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 078CF0A581F3816CBA8D7047271D2CE9 /* Reachability-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D5686072DEC1A0E14F8C100FCC873F73 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DBA7A206E80F9E00E01BEFE74D6D69 /* TaskDelegate.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + DC896F68B018619A895D3BE4C70D0E4D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; }; + DC9317C7F961BB389FA7ECC2260B08F0 /* Toast-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 53599A8492E17F111CC5C8D3C50E872A /* Toast-dummy.m */; }; + E198F398404F07805E5189165F3C1E64 /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A34017AEE736DE7CC86E3201A0B303C /* Timeline.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E34A395CCE4DFEB66FE70DC91B6FA149 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 770A612E1A02028636A4D09BDEB87D10 /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E363FB7AFABD373D4D2EB91EEAEAA556 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 06E0F3A00F6C087D410087D3FE65529D /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E83FA4C154706E4EEAD3DE51B86C5BAB /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B77DE72B7ED4AED0DBED016D1274EFE8 /* ImageIO.framework */; }; + E90F4E9FD8EA1D01B118497ACBB199D8 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CD28D005A100BC203777597B48B8AD06 /* UIImageView+HighlightedWebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E96AB8B40C45FF09A9F396DCFD27D1C0 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B751448AE7B6607E97470BFD4082216 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EBA0781A1E2822CF7DFD56ACD394A63E /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A5A5A7B7C1088D4D4ABDFAAF6E54F3 /* Alamofire.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + EC5530E67F5D0CEEB72B1E36367AF20E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; }; + ECE9CADAD4EB77DEC8B08FD74D6DD3BE /* XRPlaceholder.png in Resources */ = {isa = PBXBuildFile; fileRef = B00FEDA7D2B852B770837D954A635F0B /* XRPlaceholder.png */; }; + ED693ED034E99CACC204CFDFCE742485 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; }; + EF1B6B88FF4C6BC506B9C85BAEDF034E /* PointerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABE9E390C3EADB423277CE1E912E10AA /* PointerType.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + EF57A4E0C40DA6E906B390C69902421F /* AnyExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF39B11A9C408A7CFA8E347E7F717E80 /* AnyExtensions.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F254CF02931202CD44537EAD61D27BE8 /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEA8115215CE30840A6225F435645485 /* ImageCache.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F323261D44C70B6D6C4127E85BA62E2E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94B64C32F67C820564A1C07F82FB412C /* QuartzCore.framework */; }; + F89476E482F3768E646BBBF8CD21E6EF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */; }; + F8FB51647A0925CDAF63C5DAA23D8B4D /* Serializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF0EB1CAE5B795EB85A1165F6D98C372 /* Serializer.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F9554493CBDF921FEF278972C7FA3221 /* SwiftHash-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B25C902A48A887CDEA53D385B48C92E /* SwiftHash-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FB9814E780909550F494F507BEB3B6B5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94B64C32F67C820564A1C07F82FB412C /* QuartzCore.framework */; }; + FF0007F0502C85600F98BC8E62F739D2 /* AFIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE04BA7BB2F95B59112DED31AECB069E /* AFIError.swift */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 14508FFAEE6EBD1C2386229671393CCD /* PBXContainerItemProxy */ = { + 189D44E9EA4F94C8EC2EBCD3B9A94437 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 6376DC419EEA98495631602218A4F31B; - remoteInfo = SwiftHash; + remoteGlobalIDString = 1465651EBBC44AD3276DDE2476CDA450; + remoteInfo = HandyJSON; + }; + 1DC0B6708B1B4007743DC8E966822305 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = D386C75EFD4F03725E4EFB866B600B9A; + remoteInfo = DZNEmptyDataSet; }; - 1F4310C891A7C6531B2EC2F44755F5D2 /* PBXContainerItemProxy */ = { + 38E587F9ED2E7A43122E76199C12388D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 8FA4EA707F3B6CFDACB1C85C722D2E73; + remoteGlobalIDString = 37F4E36BECBDD0070D2501E766C0238B; remoteInfo = SDWebImage; }; - 40A6BB26078AD6CC3BFED24490AA679C /* PBXContainerItemProxy */ = { + 4AE51A1942CC8930F7A20592BF7BC9CB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = D386C75EFD4F03725E4EFB866B600B9A; - remoteInfo = DZNEmptyDataSet; + remoteGlobalIDString = 9EFE4C70245EE2857D336B8B9FA4E825; + remoteInfo = AlamofireImage; }; - 594A8718DA74EC137A691ED506FE6CCB /* PBXContainerItemProxy */ = { + 4B6C29399AB72BDC0DC80584EC3BD333 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 27189F0EDBCA8831C460D0166F6F37A1; - remoteInfo = XRCarouselView; + remoteGlobalIDString = A0A5E57D4BB5AA2602B591D713407086; + remoteInfo = SwiftHash; }; - 82A515E1EF9A2DA9422FDE7D829F0650 /* PBXContainerItemProxy */ = { + 4EDB1BF0F4A9280D81BBE57A53DD7917 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = AAC4087A5A57F5566AB9B54FEBADBC36; - remoteInfo = Reachability; + remoteGlobalIDString = 0A4402E270B0A4B00A031931BD805EF1; + remoteInfo = XRCarouselView; }; - 8E7E6D806A10070D238FC81F6BAB4860 /* PBXContainerItemProxy */ = { + 9554361F88EB7FDE40F109D073B49910 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 9A9DDC64623B3F5E6DC7009C16752B95; + remoteGlobalIDString = 620180280B57A3DF973662E546D211E4; remoteInfo = Toast; }; - 8EE514F180AE8F72FA2CB958642AC2D2 /* PBXContainerItemProxy */ = { + A1758AA696D56310AA192B587162169A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = E55BDEBC8F73D6B7936791D0822F70D6; - remoteInfo = SVProgressHUD; + remoteGlobalIDString = 88E9EC28B8B46C3631E6B242B50F4442; + remoteInfo = Alamofire; }; - A81D9D0AD4D99710674892A4C13CE7C4 /* PBXContainerItemProxy */ = { + B52B9C3E170467E0CA53E1CF539F3C3C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; remoteGlobalIDString = 88E9EC28B8B46C3631E6B242B50F4442; remoteInfo = Alamofire; }; - EE8B3E8B9AA89EC765C0E539B4E7EDC7 /* PBXContainerItemProxy */ = { + C3177531DBE096BDE468C9291366B775 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 1465651EBBC44AD3276DDE2476CDA450; - remoteInfo = HandyJSON; + remoteGlobalIDString = CE1092398200ECC7DE7468626D1D0B98; + remoteInfo = Reachability; + }; + CA2DE504A4CA7EA9E0FBEE6863FE1B71 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 637267420040487628765A2667620742; + remoteInfo = SVProgressHUD; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 02C19698DC383415660AD836A73862CF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 0322584439902B09D766EF9B00C87E2A /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = ""; }; - 03475756EB49A978A9F331D44971B60B /* libcrypto.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libcrypto.a; path = NIMSDK/Libs/libcrypto.a; sourceTree = ""; }; - 05BE4EE179BFA37C2F5F3928F9237A1F /* Properties.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Properties.swift; path = Source/Properties.swift; sourceTree = ""; }; + 00395AB0A6A459E12899B1CC7AA3C954 /* Metadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Metadata.swift; path = Source/Metadata.swift; sourceTree = ""; }; + 00E5D50454806A1FFA39BF7A572D4A37 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 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; }; + 0241F285DD08F109C7549C2CDA98F2F6 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 02DAB9B7A1A3D2199EFC7FC7FC69ED85 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = ""; }; + 045B43DFAA088FDD2E5F7DE61A99D3EF /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = ""; }; + 057C8BFD76D95D8932478DFC5DA7DB3E /* UMErrorCatch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMErrorCatch.framework; sourceTree = ""; }; + 05B1F80DC3C02C2AD29D4C6CEA059CCD /* HelpingMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HelpingMapper.swift; path = Source/HelpingMapper.swift; sourceTree = ""; }; + 06E0F3A00F6C087D410087D3FE65529D /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = ""; }; 074C4EB853C59CB4403154F8FC3B42A1 /* Pods-ParentAssistant.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ParentAssistant.modulemap"; sourceTree = ""; }; - 07E1E2C8AC8B32A86D7C0A576243A070 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; - 08E13F442024BE43D2F31AA6F2C300DA /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = ""; }; - 095F51C7CEE9EF306E13A58319881EFF /* Reachability.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Reachability.modulemap; sourceTree = ""; }; - 0969E5011DCC0C421F637E6859279610 /* Reachability.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = ""; }; - 09E993E3E47BE7E80DCFECCEA59937CC /* XRCarouselView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = XRCarouselView.framework; path = XRCarouselView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0CDCA399D86C4D9BFD1AAA60E4F5A9F5 /* HandyJSON.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = HandyJSON.modulemap; sourceTree = ""; }; - 106A3E63162DD85E6D0BEC1EE1FFDBB4 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 11DABA5B57A3076260D36D4A9AE646F5 /* HandyJSON-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-umbrella.h"; sourceTree = ""; }; - 140A2830037A30E45442BA52CBDA1CFC /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = ""; }; - 1439A3EA7193042844C3E9C52032677C /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = ""; }; - 14EC82B350F60C65CB156014F5997DCE /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; - 16CC2B704148D354077756FC0880DBCB /* Reachability-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Reachability-dummy.m"; sourceTree = ""; }; + 078CF0A581F3816CBA8D7047271D2CE9 /* Reachability-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-umbrella.h"; sourceTree = ""; }; + 07BCC67F387326CAFCE34AF5FD2DBDE2 /* Measuable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Measuable.swift; path = Source/Measuable.swift; sourceTree = ""; }; + 08D048205A3343D5E251F506CBBE23E6 /* HandyJSON.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = HandyJSON.modulemap; sourceTree = ""; }; + 0ABC8592074E5B83BDBF01388C67A8B7 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = ""; }; + 0B751448AE7B6607E97470BFD4082216 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; + 0BD55715F6A333D077B971AD89F07626 /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = ""; }; + 0DFCFB41829DC67B9036DEF9766C6C88 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = ""; }; + 0F3763627E35DE67CD17EE93E640DD39 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; + 0F4FDE3A8C9BEA27417C27172F5BC2A5 /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = ""; }; + 0F6296C8F6861894C09A46E509B544A6 /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = ""; }; + 10D6F8B588CB7C3C02CD426DADF34CE4 /* DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTransform.swift; path = Source/DateTransform.swift; sourceTree = ""; }; + 110D34637F4EF19C8F46B101A1509ABE /* HandyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = HandyJSON.framework; path = HandyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 14E325E19530D7ADA41064D345141437 /* Logger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logger.swift; path = Source/Logger.swift; sourceTree = ""; }; + 155F8627DF2C4A4A091DD4AF34FFEF02 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = ""; }; + 156F9486C74F4094ACE7858B18E5C41D /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; 1706C196E50CAE9C6DE364B9BA5E9DCB /* Pods-ParentAssistant-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ParentAssistant-umbrella.h"; sourceTree = ""; }; - 1719FF827E35476E2C51408C0A9BD81C /* HandyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = HandyJSON.framework; path = HandyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 172419A08571955755C3C6FB2044DD9D /* SDWebImageDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDecoder.h; path = SDWebImage/SDWebImageDecoder.h; sourceTree = ""; }; - 17403F9FAA48DA29AAEB297BE9AC4D51 /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = ""; }; - 1836357ECED17B3B0BF22256498AA8EE /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = ""; }; - 18F6A571F05F4D0DD12870CE83C8F787 /* UIScrollView+EmptyDataSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+EmptyDataSet.m"; path = "Source/UIScrollView+EmptyDataSet.m"; sourceTree = ""; }; - 1914DA670BEE4BC1F461E88ED1BD7C26 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Source/Configuration.swift; sourceTree = ""; }; - 1983D355FD75B9D24A71756509C98131 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; - 19FAAAAFAF3A705D1081BDCDC14CAFD6 /* UIView+Toast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+Toast.h"; path = "Toast/Toast/UIView+Toast.h"; sourceTree = ""; }; - 1D374115D56716D6284C03A777CD2BB4 /* Deserializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deserializer.swift; path = Source/Deserializer.swift; sourceTree = ""; }; - 1DC66067EC016B21D6BC487C409083AF /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = ""; }; - 206933D2687A3DC4CD2836F2AEF28A3B /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = ""; }; - 2098C9BB32F72BB65BA83ADD1F338099 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 20C0A79CAF95E65B981CC5F896E4334C /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = ""; }; - 232E0E55F341C5600028F7AAA4F59E8A /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; - 24C69C342339292A7BBB5C56D2C12D12 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = ""; }; - 26EF7D93FE7442849AC14571996AC8ED /* Logger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logger.swift; path = Source/Logger.swift; sourceTree = ""; }; - 2830040C9AF69744EEB45C092E65CA2A /* NSDecimalNumberTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSDecimalNumberTransform.swift; path = Source/NSDecimalNumberTransform.swift; sourceTree = ""; }; - 297F8CEFA42DFD823263EA02BC36D29A /* HandyJSON-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-prefix.pch"; sourceTree = ""; }; - 29BC53491C8D6BA4B81045D6FBBA043C /* Reachability-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-umbrella.h"; sourceTree = ""; }; - 2AD254563DCC20283BB5C0C5B4E57B5C /* Reachability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = ""; }; - 2D3152CF39784BC2AAD4747AF03BB50A /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = ""; }; - 2E85535E49256ABCDBBB9EA045CE6268 /* HexColorTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HexColorTransform.swift; path = Source/HexColorTransform.swift; sourceTree = ""; }; - 2E90E960C03E09803780D5C47A55A4DB /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; - 2EE1F3AAF4D2513EA3BFF47F019026DC /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = ""; }; - 2F2F35AD7354793D357E10226DE37995 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; - 31257A57ECE5DD3A052A547DA8090EF9 /* ReflectionHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReflectionHelper.swift; path = Source/ReflectionHelper.swift; sourceTree = ""; }; - 31A74FD90C96035085B5A148E9CBA64C /* EnumTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumTransform.swift; path = Source/EnumTransform.swift; sourceTree = ""; }; - 32115C18B0BD53A5791A3FA797AB85AC /* ExtendCustomBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomBasicType.swift; path = Source/ExtendCustomBasicType.swift; sourceTree = ""; }; - 323A41D79693687F0377B9ACACC90D4A /* XRCarouselView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-umbrella.h"; sourceTree = ""; }; - 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DZNEmptyDataSet.xcconfig; sourceTree = ""; }; - 33347618F6541AA20F52632F9EA10CA6 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = ""; }; - 33F1F6213579E70C284C8445EBD7DBDD /* SVProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SVProgressHUD.framework; path = SVProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3447CC75BA7C93ED3BF68C2F65392471 /* PointerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PointerType.swift; path = Source/PointerType.swift; sourceTree = ""; }; - 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Toast.xcconfig; sourceTree = ""; }; - 38EE23882943EDCED73523F643A71C39 /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = ""; }; - 39C3C21D34A34F85D09063C7E1255E9D /* Serializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Serializer.swift; path = Source/Serializer.swift; sourceTree = ""; }; - 39F3B60B0A2AD7975DA5BCA943FA6BD5 /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; - 41009B988332564AFC9DAF9C3817C7FA /* SwiftHash.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftHash.framework; path = SwiftHash.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 41531DBB287870602D671C4D97E99B21 /* UIScrollView+EmptyDataSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+EmptyDataSet.h"; path = "Source/UIScrollView+EmptyDataSet.h"; sourceTree = ""; }; - 42DB5E77081A2858012F4CBF354A0D27 /* Reachability-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-prefix.pch"; sourceTree = ""; }; - 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Reachability.xcconfig; sourceTree = ""; }; - 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.xcconfig; sourceTree = ""; }; - 448D149E9E2122E63C2D8CDB8E1159CB /* SwiftHash-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftHash-dummy.m"; sourceTree = ""; }; - 469D54339A6D448DF6D1166FDB669676 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = ""; }; - 481FE62B9A76B9C994CED4CDBF22F059 /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SVProgressHUD.modulemap; sourceTree = ""; }; + 17EFC56D8D5FA327B6DEB6D0ADC56C1C /* Reachability-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Reachability-dummy.m"; sourceTree = ""; }; + 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AlamofireImage.xcconfig; sourceTree = ""; }; + 1A34017AEE736DE7CC86E3201A0B303C /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = ""; }; + 1A53991A7FAF70CDAC1F059FB04F5543 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = ""; }; + 1ABA7E2E494925BF34BC9885BE24E31C /* Transformable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transformable.swift; path = Source/Transformable.swift; sourceTree = ""; }; + 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DZNEmptyDataSet.xcconfig; sourceTree = ""; }; + 2245A79B4B989C667CBB26B48B7A1896 /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = ""; }; + 229808FB79115B70777D682D8335C18E /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = ""; }; + 2387EDABD5D4A7ABE66B86C30A524A6C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 293A8917426C277C951BE22C661A240A /* HandyJSON-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-umbrella.h"; sourceTree = ""; }; + 29B41A43E5D5CCE97E46706AC4240B68 /* UIView+Toast.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+Toast.m"; path = "Toast/Toast/UIView+Toast.m"; sourceTree = ""; }; + 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftHash.xcconfig; sourceTree = ""; }; + 2BC1B5A06113F348365D3564FD6425C6 /* EnumTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumTransform.swift; path = Source/EnumTransform.swift; sourceTree = ""; }; + 2BE4F7B39AE70471948017C04083277A /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; + 2D7A5D10D9FFDD32C4D3CF85DDCFC707 /* DateFormatterTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateFormatterTransform.swift; path = Source/DateFormatterTransform.swift; sourceTree = ""; }; + 2E3282E372FE0A6C0D2227384238F921 /* UIImage+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+AlamofireImage.swift"; path = "Source/UIImage+AlamofireImage.swift"; sourceTree = ""; }; + 30A5A5A7B7C1088D4D4ABDFAAF6E54F3 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; + 310743AC8DCCF3F81515515A6FC64B8A /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = ""; }; + 344E5051853CBAE87166BAA69476DDB1 /* SVProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SVProgressHUD.framework; path = SVProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 35322B49B5EBE0CF14B7BC8677497347 /* ReflectionHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReflectionHelper.swift; path = Source/ReflectionHelper.swift; sourceTree = ""; }; + 358430CDB8CA6FB92C74E9FC7F6EB159 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = ""; }; + 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; }; + 3CD0FA7EE743F01B3A6385702606A408 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 444E77BBBDD4B2AB34C6742B6752BBCB /* XRCarouselView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = XRCarouselView.framework; path = XRCarouselView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4457386C2A87F3E11630992C9CAA7836 /* OtherExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OtherExtension.swift; path = Source/OtherExtension.swift; sourceTree = ""; }; + 467C66A8C88F09EF9D0129564F08540C /* NSDecimalNumberTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSDecimalNumberTransform.swift; path = Source/NSDecimalNumberTransform.swift; sourceTree = ""; }; + 46E35C087C53D197C9D213DF73A74B66 /* HandyJSON-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "HandyJSON-dummy.m"; sourceTree = ""; }; + 489ED6DFB42C7C8F6A4875005025A913 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; + 496A0D655D409BDF23A3826300EBCD1B /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; + 49DC3C5FB6A7B1CDAA1410FAABB684E0 /* XRCarouselView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-umbrella.h"; sourceTree = ""; }; + 4BBA6274610821F15000C6CC777D555B /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; 4CD112151D95CAE264BE24BD4513934F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 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; }; - 5104B9F40B6C55F71BDE788F76AA8F53 /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = ""; }; - 52C9D81718FDCE850DDAF365FD190B4F /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = ""; }; - 52F1099514615B3BA1CA982ECF578DDF /* Toast-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-prefix.pch"; sourceTree = ""; }; - 54E529332879B58C942DDF16DF5D39B4 /* ExtendCustomModelType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomModelType.swift; path = Source/ExtendCustomModelType.swift; sourceTree = ""; }; - 57342E33349B812F65B6D994EA74E212 /* XRCarouselView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XRCarouselView.h; path = XRCarouselView/XRCarouselView.h; sourceTree = ""; }; + 4ED641951605DEB02B067F9D1915C5A9 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = ""; }; + 507695995D3D9F4276EAFC4603ABFF54 /* Toast.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Toast.framework; path = Toast.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 52303324A62AD0B74F2DD46E74D232EB /* SwiftHash.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftHash.framework; path = SwiftHash.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 53599A8492E17F111CC5C8D3C50E872A /* Toast-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-dummy.m"; sourceTree = ""; }; + 5684F0F90E3FAEFBE15A94EE1C636644 /* SwiftHash.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SwiftHash.modulemap; sourceTree = ""; }; 587E904615A6336F6F7628482D5BC8D3 /* Pods-ParentAssistant-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ParentAssistant-frameworks.sh"; sourceTree = ""; }; - 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; }; - 5B56491AFD4EC6985EBCCEF221A0FCB8 /* SwiftHash-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-prefix.pch"; sourceTree = ""; }; - 5C3FCED1EF014BDAA42DACC871E2516A /* Reachability.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Reachability.framework; path = Reachability.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5C73B5BC3B66F99610607951FEC5FCB3 /* EnumType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumType.swift; path = Source/EnumType.swift; sourceTree = ""; }; - 5DCF2929ACA53CE3D9FD6342DF5F8D9D /* libaacplus.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libaacplus.a; path = NIMSDK/Libs/libaacplus.a; sourceTree = ""; }; - 5F6392C48C4C9A3D7130A57D84AFEE2B /* DZNEmptyDataSet-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DZNEmptyDataSet-dummy.m"; sourceTree = ""; }; - 60794CE8C2369C4AA061EE9A931DDFED /* XRCarouselView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-prefix.pch"; sourceTree = ""; }; - 640ED88831DE9CA10759B8FC3751C531 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; - 64CF5A867496880A0DAE25ED9EC8E512 /* CustomDateFormatTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomDateFormatTransform.swift; path = Source/CustomDateFormatTransform.swift; sourceTree = ""; }; - 65DEF3C169B8F1241E74C3D5C7DA5A6D /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = ""; }; - 6768B1FE2E118D79D8A1613520B9BB23 /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = ""; }; - 6850886B55CE3CD9B901B28690292C5C /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = ""; }; - 6976D41DC0C992EA2F24C3A7358E958F /* BuiltInBridgeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBridgeType.swift; path = Source/BuiltInBridgeType.swift; sourceTree = ""; }; - 6B3D43CB0BDA34787F85B2C084FBB09A /* HandyJSON.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HandyJSON.h; path = Source/HandyJSON.h; sourceTree = ""; }; - 6D24FB404E9541910245BF3E68C5EE73 /* URLTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLTransform.swift; path = Source/URLTransform.swift; sourceTree = ""; }; - 6E2AA0C415512D5F3F34F7A99AA4D14A /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; + 58B4CFDB50C6966BC7B9CB0CBD1C60E7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5BF833E322898122D95617BD9520476D /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = ""; }; + 600ABB9AA8054F7B4E851C17D19FCAA0 /* AlamofireImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AlamofireImage-dummy.m"; sourceTree = ""; }; + 60528D650715D578BD996859FC810107 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 605BF197AFCD5A69E3A6A700329C2FCA /* libssl.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libssl.a; path = NIMSDK/Libs/libssl.a; sourceTree = ""; }; + 61CAF6761E3C21827415A9DA38D18547 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = ""; }; + 61D09F1E0C8F29641858460B3928A5B0 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = ""; }; + 661171DD778BD7E26EE68F008228F1C9 /* DZNEmptyDataSet-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-prefix.pch"; sourceTree = ""; }; + 676078733016383B143B493E79D3CEF5 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 676E6BA89EE0D10BE38626EE3E3B8A9F /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; + 68D3997593CBB0B018C81C73E8337C2C /* ExtendCustomModelType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomModelType.swift; path = Source/ExtendCustomModelType.swift; sourceTree = ""; }; + 68ECD5E13EA08D669EEBD74218B18FA5 /* BuiltInBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBasicType.swift; path = Source/BuiltInBasicType.swift; sourceTree = ""; }; + 6B05BD93D4EE278B866CC9AAF18763DB /* SDWebImageDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDecoder.m; path = SDWebImage/SDWebImageDecoder.m; sourceTree = ""; }; + 6BD1FCCAAFC6349CA1E2AC3881DB81FC /* UIView+Toast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+Toast.h"; path = "Toast/Toast/UIView+Toast.h"; sourceTree = ""; }; + 6CC52F25BF175D139AA0E5C94DC363A9 /* EnumType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumType.swift; path = Source/EnumType.swift; sourceTree = ""; }; + 6DA08525DC2775B611071866CF38CC96 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = ""; }; + 6E2FF425EC8FB1E33922042D418E2A79 /* XRCarouselView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = XRCarouselView.modulemap; sourceTree = ""; }; 6EB59F100C77215BCBB4FAD12F0FF358 /* Pods-ParentAssistant.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ParentAssistant.debug.xcconfig"; sourceTree = ""; }; - 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = HandyJSON.xcconfig; sourceTree = ""; }; - 72803D16FA054A0D26C303991C1F2B3C /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = ""; }; - 72ADD4F0113F0555435EA10BA789F8E2 /* TransformOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformOf.swift; path = Source/TransformOf.swift; sourceTree = ""; }; - 73AD0FFA16B2C0B1B8A40B3A76629975 /* DZNEmptyDataSet-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-umbrella.h"; sourceTree = ""; }; - 7437E1C250CA27898AA8815D1117643B /* XRCarouselView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XRCarouselView-dummy.m"; sourceTree = ""; }; + 70B842936FA16DF44F4AD4FC84E225A4 /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = ""; }; + 70FB099686511A528F52E5AB1C4FDB4A /* Reachability.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Reachability.modulemap; sourceTree = ""; }; + 715810392F163BB36DFE8AC307460289 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = ""; }; + 729A72124A700ED6D7D56FE6E3316184 /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = ""; }; + 72C584102060EC4C983B4B76AB4B8C8F /* Pods_ParentAssistant.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ParentAssistant.framework; path = "Pods-ParentAssistant.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7379E87D9FF2E196ADB91DC8A0A5F2F3 /* ISO8601DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ISO8601DateTransform.swift; path = Source/ISO8601DateTransform.swift; sourceTree = ""; }; + 770A612E1A02028636A4D09BDEB87D10 /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = ""; }; + 770EB1960009D9CCA67CBA11FBC8490A /* AlamofireImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AlamofireImage-prefix.pch"; sourceTree = ""; }; 77EFE064376F26AEED2B1971235A88EF /* Pods-ParentAssistant.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ParentAssistant.release.xcconfig"; sourceTree = ""; }; - 7C5CEE4C10F2E83011011BAE5999B4FD /* NominalType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NominalType.swift; path = Source/NominalType.swift; sourceTree = ""; }; - 7D9407543C44ABED0AC48154C76831BE /* Measuable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Measuable.swift; path = Source/Measuable.swift; sourceTree = ""; }; - 7DFB6D55866F4F62D8116993D42B55A8 /* ISO8601DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ISO8601DateTransform.swift; path = Source/ISO8601DateTransform.swift; sourceTree = ""; }; - 81D2AEE4F419083BF22474B240B3D9F6 /* PropertyInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PropertyInfo.swift; path = Source/PropertyInfo.swift; sourceTree = ""; }; - 820C0B25502D820076E6945A9666E544 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 82C441F9B75595B2F266E6AC40AD7D85 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = ""; }; - 835B1DEC82F034C2C12DC0723F18F6E9 /* Toast-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-umbrella.h"; sourceTree = ""; }; - 85EBECC44FA24EC40748D3CB399DD1F3 /* Toast-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-dummy.m"; sourceTree = ""; }; - 871C0D1C45FD62FE7B82D8E083C00466 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; - 87691736C308811895AF6EB052ECD8BE /* DZNEmptyDataSet-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-prefix.pch"; sourceTree = ""; }; - 8781B0306B0188AF528659F413E1B542 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; - 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = XRCarouselView.xcconfig; sourceTree = ""; }; + 78F77FFCC80D398532E854672D527FD8 /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; + 79353402DE45C743DE8658FE2C413D90 /* libaacplus.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libaacplus.a; path = NIMSDK/Libs/libaacplus.a; sourceTree = ""; }; + 79BB6C2420E33F3EC3D693AD20145082 /* Reachability-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-prefix.pch"; sourceTree = ""; }; + 7A45AEAFC59FC8550866653E018742E3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7AC81C76B41B0ABF4E94921ADBA70C30 /* UIScrollView+EmptyDataSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+EmptyDataSet.m"; path = "Source/UIScrollView+EmptyDataSet.m"; sourceTree = ""; }; + 7C01563CB8CAFA848353DD90A07F2F47 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; + 7C4ACCC8EE8E5E07D0CD171894588314 /* UIButton+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+AlamofireImage.swift"; path = "Source/UIButton+AlamofireImage.swift"; sourceTree = ""; }; + 7C9D89FB057D8F2ECBB232C7A81EF4B5 /* DZNEmptyDataSet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DZNEmptyDataSet.framework; path = DZNEmptyDataSet.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7EBA3110EB94A0568FF28796D778675E /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = ""; }; + 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Reachability.xcconfig; sourceTree = ""; }; + 8249AA0D5DBC641B891AE927074850B2 /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = Sources/MD5.swift; sourceTree = ""; }; + 84AE5CF00E8941985B8EB7DFC8A475E7 /* Toast-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-prefix.pch"; sourceTree = ""; }; + 852A7B853425A17ACDE963BB0C57B689 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = ""; }; + 85DBA7A206E80F9E00E01BEFE74D6D69 /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = ""; }; + 865E120DE5EA698A2789C2686BC45C7A /* AlamofireImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AlamofireImage.modulemap; sourceTree = ""; }; + 874C609455AB27C910DD97EBDD79E965 /* Toast.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Toast.modulemap; sourceTree = ""; }; 891E32DCEDF9E73C788DB01E69C7162C /* Pods-ParentAssistant-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ParentAssistant-resources.sh"; sourceTree = ""; }; - 8A51BA19C89D5E62EDCF2DB9D9FA43E0 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; - 8CDA4E6BD46E857912EC5B5F99364A24 /* SwiftHash.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SwiftHash.modulemap; sourceTree = ""; }; - 8D2C5397761E61B24600821547A409CD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9011EFC1DA29BE6CA0831595062B82ED /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; - 92331AB0F30415BE666C619D1A45513E /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; - 931ED830C3B0B8852F1479DE61BA997E /* AnyExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyExtensions.swift; path = Source/AnyExtensions.swift; sourceTree = ""; }; - 93251EC8BEF89E6A4FA758DA38A1E47A /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = ""; }; + 89457F43B7DE2154380C8DD976759AA2 /* XRCarouselView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XRCarouselView.m; path = XRCarouselView/XRCarouselView.m; sourceTree = ""; }; + 8A591BFD7762D296F2E84EBC08129BFA /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = ""; }; + 8B25C902A48A887CDEA53D385B48C92E /* SwiftHash-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-umbrella.h"; sourceTree = ""; }; + 8BFF20BC7E4F55C09BAC34A664D91FED /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = ""; }; + 8E2EC639DC31085C2078E4638A61266B /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = XRCarouselView.xcconfig; sourceTree = ""; }; + 8F75E090F317987C0134B9DD1E5963C9 /* TransformType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformType.swift; path = Source/TransformType.swift; sourceTree = ""; }; + 916CF2DD179C34072F0CED7EA7E172C4 /* BuiltInBridgeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBridgeType.swift; path = Source/BuiltInBridgeType.swift; sourceTree = ""; }; + 920C3AE864C4E24091B77772A498A58C /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; + 92B55B2A9C151490137F69027B7F531E /* HandyJSON.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = HandyJSON.h; path = Source/HandyJSON.h; sourceTree = ""; }; + 937EE30FD85AB8EED4F8467502DD290F /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Alamofire.framework; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 93831DF9B9AE2775CB38F92DAD62BF35 /* NIMSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NIMSDK.framework; path = NIMSDK/NIMSDK.framework; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 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; }; - 9889E5067E9A54BAEC05298BBA10F671 /* HelpingMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HelpingMapper.swift; path = Source/HelpingMapper.swift; sourceTree = ""; }; - 99DF7E55400E9131640E0694D3C91764 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; - 9A4D6703A8771BB168130EFB6EAC1C3E /* SHA1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SHA1.swift; path = Sources/SHA1.swift; sourceTree = ""; }; - 9A559DCF61F2E184BC9318C05F05CFF3 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = ""; }; - 9AEE056145338863D7A727ACF1C3657C /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = Sources/MD5.swift; sourceTree = ""; }; - 9F2BF6E468482ED7EDAE9AFD6CA2C994 /* SwiftHash-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-umbrella.h"; sourceTree = ""; }; - A48FF17CB17A07E2B4AEC609B9947C52 /* libevent.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libevent.a; path = NIMSDK/Libs/libevent.a; sourceTree = ""; }; - A59A469B0852E07D2428D72E4C62B1E7 /* Toast.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Toast.framework; path = Toast.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A91D08749C812CD6EB281780E69AFED6 /* XRCarouselView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XRCarouselView.m; path = XRCarouselView/XRCarouselView.m; sourceTree = ""; }; - AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = ""; }; - AE8B2524C105710A1C75E5F3C734796F /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = ""; }; - B0A49BF64844554AA6BC0B49FD9A9BE8 /* DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTransform.swift; path = Source/DateTransform.swift; sourceTree = ""; }; - B4C40BE5E03351505F3B0830F40CFA9E /* libssl.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libssl.a; path = NIMSDK/Libs/libssl.a; sourceTree = ""; }; - B4EC3094994043023CF3002A63DD6DA4 /* DateFormatterTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateFormatterTransform.swift; path = Source/DateFormatterTransform.swift; sourceTree = ""; }; - B507541260F671D342B11E7250120BBF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B6554BE7D86E2DF12BC2CFA630452CA0 /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = ""; }; - B71F8A62F3906657D17D418212E1CBA1 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = ""; }; - B88D8470A1A1E4F507B1E9895B074253 /* Pods_ParentAssistant.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ParentAssistant.framework; path = "Pods-ParentAssistant.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - B9A38D8C4EC4826AEDC2A52DD0187186 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = ""; }; - 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; }; - BB2B3251E63EE34530FC8A40E441CB23 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; - BB7CE29DC4FFF250766240EA8DA973D1 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; - BC3C517CD17DEB98E878268901D654E8 /* Metadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Metadata.swift; path = Source/Metadata.swift; sourceTree = ""; }; - BCCC1A6E4AF8DAF6E5609D65548B3C79 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; + 93E637F89EC35850C7250805992BB1C0 /* Toast-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-umbrella.h"; sourceTree = ""; }; + 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; }; + 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; + 95CAD531E474553E7D52B95131219D1A /* Reachability.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Reachability.framework; path = Reachability.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Toast.xcconfig; sourceTree = ""; }; + 981D262EBFB4CA168BE569F48CC64843 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; + 98932AABF2712E9978244730956580D5 /* CustomDateFormatTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomDateFormatTransform.swift; path = Source/CustomDateFormatTransform.swift; sourceTree = ""; }; + 98BA100696255C8CFD15860D64267467 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; + 9AD53A7A5BDC98AFD3CE8CF1BC407F10 /* AlamofireImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AlamofireImage-umbrella.h"; sourceTree = ""; }; + 9B31E52FEB6E5A6A955D4050CB76B18C /* URLTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLTransform.swift; path = Source/URLTransform.swift; sourceTree = ""; }; + 9CA29ADD75C3FE58A4ED07E10D427C9F /* PropertyInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PropertyInfo.swift; path = Source/PropertyInfo.swift; sourceTree = ""; }; + 9D9602FA58305177F98B7472A155DE66 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = ""; }; + A23A7E20FB52B9BFC4899C0FEBA2C6CE /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = ""; }; + A2BD80EBA9375936EAA1AE0D930C61EC /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = ""; }; + A58625E1014C6D82D1825309986334E1 /* ImageFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageFilter.swift; path = Source/ImageFilter.swift; sourceTree = ""; }; + A6614C2951E5A4AB6D1DF2B076BF1A5C /* DataTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataTransform.swift; path = Source/DataTransform.swift; sourceTree = ""; }; + A8CB977B7AFFFA509CAA11CD0C03AEB5 /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = ""; }; + AA29655EDD56783CB2C21A411019B7BA /* XRCarouselView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XRCarouselView.h; path = XRCarouselView/XRCarouselView.h; sourceTree = ""; }; + ABE9E390C3EADB423277CE1E912E10AA /* PointerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PointerType.swift; path = Source/PointerType.swift; sourceTree = ""; }; + AC0A874231DDAD102B02D7EFD048FDE2 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Source/Image.swift; sourceTree = ""; }; + AE04BA7BB2F95B59112DED31AECB069E /* AFIError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFIError.swift; path = Source/AFIError.swift; sourceTree = ""; }; + AF0EB1CAE5B795EB85A1165F6D98C372 /* Serializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Serializer.swift; path = Source/Serializer.swift; sourceTree = ""; }; + B00FEDA7D2B852B770837D954A635F0B /* XRPlaceholder.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = XRPlaceholder.png; path = XRCarouselView/XRPlaceholder.png; sourceTree = ""; }; + B03DB8D1B8FEFA6F91F509A16D6176F3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B19A6339BCDC426144D4987C81596418 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Source/Configuration.swift; sourceTree = ""; }; + B4595D719B06D3C0D44248E3DD5B1962 /* XRCarouselView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XRCarouselView-prefix.pch"; sourceTree = ""; }; + B4FE0743D323412387DC64C29B1AE5F7 /* libcrypto.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libcrypto.a; path = NIMSDK/Libs/libcrypto.a; sourceTree = ""; }; + B63F0AB7376A64C50DA03CACC7D9CC2E /* XRCarouselView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XRCarouselView-dummy.m"; sourceTree = ""; }; + 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; }; + B82FE543DC2AE8EF3A0F380DE2B5988A /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; + B9806961B1DB01F087677787DFCC6CE0 /* AlamofireImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AlamofireImage.framework; path = AlamofireImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B9A33258A85F658D3C02E30EC92D43FF /* DZNEmptyDataSet.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DZNEmptyDataSet.modulemap; sourceTree = ""; }; + 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; }; + BB6422771B215BFE2B4A9C0D9C9BC82B /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SVProgressHUD.modulemap; sourceTree = ""; }; + BC99BBF9B209FE42B0D74F5CFB60627F /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = ""; }; BCECD0FF1E6F7E48270234DAF00B07B7 /* Pods-ParentAssistant-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ParentAssistant-acknowledgements.markdown"; sourceTree = ""; }; - BE70BDE392E6E92B76047D2DED4ED380 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = ""; }; - BE846687076AD4570ACE89EC260747A1 /* UMErrorCatch.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMErrorCatch.framework; sourceTree = ""; }; - BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftHash.xcconfig; sourceTree = ""; }; - BF496B88C6E68626DC9D0C9FC152BD3C /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; - BFD387D9E3BDF322939523D4DF31CA79 /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = ""; }; - C03FC1A11EE20AB8B6A4B398E11B26B0 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = ""; }; - C203E9ABEF394B0009B142EEB9AA64FC /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = ""; }; - C33C9063E8CA60D73EE6050FCF59F433 /* Export.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Export.swift; path = Source/Export.swift; sourceTree = ""; }; - C62416D612C6BD82B2867F75585C4C56 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - CC9B184B04C60B80BBEF83595DBE8AF4 /* XRCarouselView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = XRCarouselView.modulemap; sourceTree = ""; }; - CE1C92985D9321104698E3AFAF68594E /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CEA07E2E477768269A8D0BECE492EBAF /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; - CF9CDCEBD5D016D3F349D31FFDAEA20A /* NIMSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NIMSDK.framework; path = NIMSDK/NIMSDK.framework; sourceTree = ""; }; - D124D84D327A6ADF3D01C95E84C09A31 /* UMAnalytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMAnalytics.framework; sourceTree = ""; }; - D912920D1BEEB7757AF4BE74E2EC8FA6 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = ""; }; - D9ED9DA2E61F2A4DD7E760C61C47A3F1 /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = ""; }; - DB5FF7B561F6F548C82F1FC27FDD72E8 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = ""; }; - DBE314BE44865438F00A5054E414EF77 /* Toast.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Toast.modulemap; sourceTree = ""; }; - DD0E89B8C1439B9F5FDB39EA0232B3EA /* DZNEmptyDataSet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DZNEmptyDataSet.framework; path = DZNEmptyDataSet.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DE3D895CEB8D8D9876BA0F9346FF9D69 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DE92E07FF56795D096246F9059B540CA /* DataTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataTransform.swift; path = Source/DataTransform.swift; sourceTree = ""; }; - DF68D7CB4183F99C38744F4985CD422D /* SDWebImageDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDecoder.m; path = SDWebImage/SDWebImageDecoder.m; sourceTree = ""; }; - DF826B20D920C607DF652F2F3EA4C2F8 /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = ""; }; - E058896CA0DFFEF3CCEFAD6FEBA0DB11 /* UTDID.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UTDID.framework; path = thirdparties/UTDID.framework; sourceTree = ""; }; + BE69851A50C89CE0E218AE8504C1188B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BFC1E0E16DEFECC3E2FE92A428C9920D /* HexColorTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HexColorTransform.swift; path = Source/HexColorTransform.swift; sourceTree = ""; }; + C29AD1BD351F370FBE921BBE6756CEC9 /* NominalType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NominalType.swift; path = Source/NominalType.swift; sourceTree = ""; }; + C2DEDD1DC5D26933057AC26E39F2EBD3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = HandyJSON.xcconfig; sourceTree = ""; }; + C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.xcconfig; sourceTree = ""; }; + C7C6E9C97726F9691282BA5009E78833 /* libevent.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libevent.a; path = NIMSDK/Libs/libevent.a; sourceTree = ""; }; + C7C98E50FC5D694C89DBEE8A1486D900 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; + CAE58263CB0A52CDB5D3790DC6D0D74F /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; + CBB0446840A0CDD4BB7D69692D07CC21 /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = ""; }; + CC28263CA0EDAEA1CBC1173B87FEA769 /* Request+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Request+AlamofireImage.swift"; path = "Source/Request+AlamofireImage.swift"; sourceTree = ""; }; + CD28D005A100BC203777597B48B8AD06 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; + CECDC33DC6A3E686FD21577C5B23C258 /* DZNEmptyDataSet-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-umbrella.h"; sourceTree = ""; }; + D43927282F3DD1C78741ABFCC5E0C768 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; + D4D00913B407B6DB96C7E7B48C21D904 /* UIImageView+AlamofireImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+AlamofireImage.swift"; path = "Source/UIImageView+AlamofireImage.swift"; sourceTree = ""; }; + D79CBFE6F9821431996C8160F19D90C6 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = ""; }; + D82D7054D7F1E7FE0ACBE043A3FA7F50 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; + D8A2F9829AECA7F54C384A6E17AB7124 /* SwiftHash-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftHash-prefix.pch"; sourceTree = ""; }; + D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = ""; }; + D96BCA19B9F922B2258E4C0D40666B58 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = ""; }; + DBA6EC35D53897ED2A96FEDE1BB384BA /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = ""; }; + DD324E3E21CD21F91211149384F64690 /* UIScrollView+EmptyDataSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+EmptyDataSet.h"; path = "Source/UIScrollView+EmptyDataSet.h"; sourceTree = ""; }; + DF39B11A9C408A7CFA8E347E7F717E80 /* AnyExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyExtensions.swift; path = Source/AnyExtensions.swift; sourceTree = ""; }; + DF7918BBC8A10388FDE15B624F66A8E9 /* SwiftHash-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftHash-dummy.m"; sourceTree = ""; }; + DFFC9D8585FF5A3FC4C7FD63A93DCE16 /* Deserializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deserializer.swift; path = Source/Deserializer.swift; sourceTree = ""; }; + E1300F08331C16959F41C2533B209EF5 /* Export.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Export.swift; path = Source/Export.swift; sourceTree = ""; }; E1CD65D31F6DC7B830E7132E6B396C30 /* Pods-ParentAssistant-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ParentAssistant-acknowledgements.plist"; sourceTree = ""; }; - E3370B03674C70DABFF75D9D2BA95DCE /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = ""; }; - E33C2A8A35CA23130F27CFEC0285B7DB /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = ""; }; - E4E76CB8696BAB20A617484E4726713B /* Transformable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transformable.swift; path = Source/Transformable.swift; sourceTree = ""; }; - E533F265C56324D6F57EB232221F586A /* UIView+Toast.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+Toast.m"; path = "Toast/Toast/UIView+Toast.m"; sourceTree = ""; }; - E786E1AEE51D914333543AC4DEF9B3FB /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; - 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; }; - E9462CA128209C32EE6E6647C88609D1 /* OtherExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OtherExtension.swift; path = Source/OtherExtension.swift; sourceTree = ""; }; - E95345A11FCCED373B3A5758A6073CDB /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; - E956F54FF76DE5D347505F3AF7694F03 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Alamofire.framework; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; - F33461E2C03CDF90E02052B76ADADB01 /* TransformType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformType.swift; path = Source/TransformType.swift; sourceTree = ""; }; - F638493F2C879E2AF820AE53EA390269 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; - F6429920CDFD8D08A5A0566565673330 /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = ""; }; + E215EB7C10CD4B2F724959DB344FE5C0 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; + E2607500177BC99C04478DAB57D80EB7 /* SecurityEnvSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SecurityEnvSDK.framework; path = thirdparties/SecurityEnvSDK.framework; sourceTree = ""; }; + E4D61E78309E6543D6EBC75BE2967417 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = ""; }; + E651A4469FA2206746488B70290D48C0 /* SHA1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SHA1.swift; path = Sources/SHA1.swift; sourceTree = ""; }; + E74F653E7072F40DB006FC90854FC840 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; + E7701D17547204EF54A538449343E8A4 /* ExtendCustomBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtendCustomBasicType.swift; path = Source/ExtendCustomBasicType.swift; sourceTree = ""; }; + EADCBFE671FB00B5F5FDBD2B3F6EC3CD /* UMAnalytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMAnalytics.framework; sourceTree = ""; }; + EC105ECBFE938402821EF19D7C5DA1DA /* DZNEmptyDataSet-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DZNEmptyDataSet-dummy.m"; sourceTree = ""; }; + EC1BF45D7C52BC6493B283DDB371395F /* TransformOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformOf.swift; path = Source/TransformOf.swift; sourceTree = ""; }; + ECC6F721935680D316DC183994F4F569 /* Properties.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Properties.swift; path = Source/Properties.swift; sourceTree = ""; }; + ED4D8AA9257567AC16CB397E7E8BF346 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = ""; }; + EEE063E46D8691853E8CDB3C33506BF8 /* UTDID.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UTDID.framework; path = thirdparties/UTDID.framework; sourceTree = ""; }; + EF0B6E4594449A55A06C44CB6D1223F0 /* Reachability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = ""; }; + EFA9DF74078A51C9573DF6952A753D1C /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; + F1187580C59983EBFA6A55260AF21079 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; + F1CF04B231D1BFC627F83398DFB40BBE /* HandyJSON-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "HandyJSON-prefix.pch"; sourceTree = ""; }; + F3CF9F638E5784E56583202BEBE63239 /* SDWebImageDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDecoder.h; path = SDWebImage/SDWebImageDecoder.h; sourceTree = ""; }; F6BAADF2798AA6F62DA82FAA92DECB07 /* Pods-ParentAssistant-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ParentAssistant-dummy.m"; sourceTree = ""; }; - F6C063D5E492D3ED69858D446C30719E /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = ""; }; - F948022D8D1EFEF734A07E6ED4D6CAF9 /* BuiltInBasicType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BuiltInBasicType.swift; path = Source/BuiltInBasicType.swift; sourceTree = ""; }; - FBC74E5E6FF8BCD3F240C1F0C8B9B427 /* DZNEmptyDataSet.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DZNEmptyDataSet.modulemap; sourceTree = ""; }; - FC9D90B14CC51CAAC698C0623AB16C70 /* SecurityEnvSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SecurityEnvSDK.framework; path = thirdparties/SecurityEnvSDK.framework; sourceTree = ""; }; - FD2B11D4DCD30BDBA06841569E01E1BD /* HandyJSON-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "HandyJSON-dummy.m"; sourceTree = ""; }; - FF65E4A0D399571B01517891F0309004 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; - FF928773E158E70CF5C2B45EA69A4223 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FFCF8A6062658FA349B617C0D75723C2 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = ""; }; - FFEBBEC7D2ED4C631DFB3CBB04E6F926 /* XRPlaceholder.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = XRPlaceholder.png; path = XRCarouselView/XRPlaceholder.png; sourceTree = ""; }; + F775144A6F17788F065E01BFD8DC2D5C /* Reachability.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = ""; }; + F81C313FED69F64F2F4F403B4C4EC3F6 /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = ""; }; + FDA2AA9043380263CFFD99AE883B70ED /* ImageDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Source/ImageDownloader.swift; sourceTree = ""; }; + FEA8115215CE30840A6225F435645485 /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Source/ImageCache.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 158EE653FB0E0E7AF979010BC3A73E13 /* Frameworks */ = { + 12D9BD764C2F5E43285530C00A583D52 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 952429322A476D5508670C477DE23669 /* Foundation.framework in Frameworks */, + ED693ED034E99CACC204CFDFCE742485 /* Foundation.framework in Frameworks */, + E83FA4C154706E4EEAD3DE51B86C5BAB /* ImageIO.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 25507DD6D7F1D774CD72F194200A6D77 /* Frameworks */ = { + 1EA38DA40C4FF7316B10B0C373342222 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */, + DC896F68B018619A895D3BE4C70D0E4D /* Foundation.framework in Frameworks */, + FB9814E780909550F494F507BEB3B6B5 /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 2FCA03AB4708FF069C969DAC4ED689A3 /* Frameworks */ = { + 223B4FF7CBCA930946A68B4E3FF7DEB6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 01866720BD41E2820300D8B9284FC061 /* Foundation.framework in Frameworks */, + 385BDDC55889104E43C83664FD4C2BD3 /* Foundation.framework in Frameworks */, + F323261D44C70B6D6C4127E85BA62E2E /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 46A2C828E74BB80E0DE22F9A57D702B2 /* Frameworks */ = { + 25507DD6D7F1D774CD72F194200A6D77 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 23C92743D0D2154080836B58896172C9 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 56B1A45788A7E3C5C89C92256F33AE24 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C98D39690CC370401444D498206BCA2B /* Foundation.framework in Frameworks */, - 1A3841F2F008E6FEBA8B10F04DE5AD15 /* QuartzCore.framework in Frameworks */, + EC5530E67F5D0CEEB72B1E36367AF20E /* Foundation.framework in Frameworks */, + 90E5A049B2FE3D38A1EA782CBB763739 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -444,486 +499,492 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 99195E4207764744AEC07ECCBCD550EB /* Frameworks */ = { + 62158AC2B12F4A1FA191B1DD22989FE1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */, + F89476E482F3768E646BBBF8CD21E6EF /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A115DC87278A31F6B371DA2C1AF9CD02 /* Frameworks */ = { + 6FA848EABA8BCB08AFA8A7CBA0F79DA3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7CE1363BFF8D96DD8059E0B5481A8D00 /* Foundation.framework in Frameworks */, - 121B576C5153736760EDBD385DCE1A82 /* QuartzCore.framework in Frameworks */, + 0D0F6E0ECE5915267F0EA404BDCD4BAC /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - D871485AC7FB55A15B0AC2046B09D62B /* Frameworks */ = { + 99195E4207764744AEC07ECCBCD550EB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 502127E1D7BF9D8D8FA29AD2F7EF420E /* Foundation.framework in Frameworks */, + 73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - E44680339038F2F0730AF783DAEFFCB6 /* Frameworks */ = { + BF98FBBDC964E0CC738F6B323B4C1BB8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6BE097BD2C38D14E51B20BCEB5C6F495 /* Foundation.framework in Frameworks */, - B35D34D1C1A4B0A5FAD90526DE5D88A4 /* ImageIO.framework in Frameworks */, + 613167D898FF421A6F75D1FE5D145B9B /* Alamofire.framework in Frameworks */, + 26479B07464784F3BF8C0853CA049976 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - EBA80D6B1394A46D45B033AB75657E91 /* Frameworks */ = { + CC88855CE2CDECCE28DB46B1FDBF88B7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9F24B341383F0FF8EA368B3A7F9BC087 /* Foundation.framework in Frameworks */, - EC3CC4DC8A5C9241AE7D9359EEAFC69F /* SystemConfiguration.framework in Frameworks */, + 57B5D779BAB2A1CF8C2D4CF8F14066A0 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 001E2CA6EA468C671F75E62723E01ABD /* Support Files */ = { + 0310C750335673BB116A6C5FAFEEFE49 /* Support Files */ = { isa = PBXGroup; children = ( - FBC74E5E6FF8BCD3F240C1F0C8B9B427 /* DZNEmptyDataSet.modulemap */, - 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */, - 5F6392C48C4C9A3D7130A57D84AFEE2B /* DZNEmptyDataSet-dummy.m */, - 87691736C308811895AF6EB052ECD8BE /* DZNEmptyDataSet-prefix.pch */, - 73AD0FFA16B2C0B1B8A40B3A76629975 /* DZNEmptyDataSet-umbrella.h */, - 02C19698DC383415660AD836A73862CF /* Info.plist */, + C2DEDD1DC5D26933057AC26E39F2EBD3 /* Info.plist */, + 70FB099686511A528F52E5AB1C4FDB4A /* Reachability.modulemap */, + 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */, + 17EFC56D8D5FA327B6DEB6D0ADC56C1C /* Reachability-dummy.m */, + 79BB6C2420E33F3EC3D693AD20145082 /* Reachability-prefix.pch */, + 078CF0A581F3816CBA8D7047271D2CE9 /* Reachability-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/DZNEmptyDataSet"; + path = "../Target Support Files/Reachability"; sourceTree = ""; }; - 035886489A99DD807583400603AB5019 /* Alamofire */ = { + 03D7A135F0C051D7B2ADB4B1311D2155 /* Support Files */ = { isa = PBXGroup; children = ( - 08E13F442024BE43D2F31AA6F2C300DA /* AFError.swift */, - CEA07E2E477768269A8D0BECE492EBAF /* Alamofire.swift */, - F6429920CDFD8D08A5A0566565673330 /* DispatchQueue+Alamofire.swift */, - 99DF7E55400E9131640E0694D3C91764 /* MultipartFormData.swift */, - BCCC1A6E4AF8DAF6E5609D65548B3C79 /* NetworkReachabilityManager.swift */, - 2F2F35AD7354793D357E10226DE37995 /* Notifications.swift */, - 14EC82B350F60C65CB156014F5997DCE /* ParameterEncoding.swift */, - 232E0E55F341C5600028F7AAA4F59E8A /* Request.swift */, - 8781B0306B0188AF528659F413E1B542 /* Response.swift */, - 39F3B60B0A2AD7975DA5BCA943FA6BD5 /* ResponseSerialization.swift */, - 92331AB0F30415BE666C619D1A45513E /* Result.swift */, - 640ED88831DE9CA10759B8FC3751C531 /* ServerTrustPolicy.swift */, - 2D3152CF39784BC2AAD4747AF03BB50A /* SessionDelegate.swift */, - 5104B9F40B6C55F71BDE788F76AA8F53 /* SessionManager.swift */, - BFD387D9E3BDF322939523D4DF31CA79 /* TaskDelegate.swift */, - D9ED9DA2E61F2A4DD7E760C61C47A3F1 /* Timeline.swift */, - E95345A11FCCED373B3A5758A6073CDB /* Validation.swift */, - A87864D22DE2007F4600F7C0E566D95C /* Support Files */, + B03DB8D1B8FEFA6F91F509A16D6176F3 /* Info.plist */, + 0ABC8592074E5B83BDBF01388C67A8B7 /* SDWebImage.modulemap */, + D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */, + F1187580C59983EBFA6A55260AF21079 /* SDWebImage-dummy.m */, + 676E6BA89EE0D10BE38626EE3E3B8A9F /* SDWebImage-prefix.pch */, + B82FE543DC2AE8EF3A0F380DE2B5988A /* SDWebImage-umbrella.h */, ); - name = Alamofire; - path = Alamofire; + name = "Support Files"; + path = "../Target Support Files/SDWebImage"; sourceTree = ""; }; - 0AFF261FC6409676B5FE2EA67480CAE4 /* UMCSecurityPlugins */ = { + 0BD61037A6B393F3F3CECE029889F374 /* Resources */ = { isa = PBXGroup; children = ( - 8FC2DD334C1E70C1C4C5C8F0FA196151 /* Frameworks */, + 729A72124A700ED6D7D56FE6E3316184 /* SVProgressHUD.bundle */, ); - name = UMCSecurityPlugins; - path = UMCSecurityPlugins; + name = Resources; sourceTree = ""; }; - 197A90DE72E89B51A1E8F89461EABB00 /* Frameworks */ = { + 0D5414319A3865994CB656BBA34C49BD /* HandyJSON */ = { isa = PBXGroup; children = ( - 5DCF2929ACA53CE3D9FD6342DF5F8D9D /* libaacplus.a */, - 03475756EB49A978A9F331D44971B60B /* libcrypto.a */, - A48FF17CB17A07E2B4AEC609B9947C52 /* libevent.a */, - B4C40BE5E03351505F3B0830F40CFA9E /* libssl.a */, - CF9CDCEBD5D016D3F349D31FFDAEA20A /* NIMSDK.framework */, + DF39B11A9C408A7CFA8E347E7F717E80 /* AnyExtensions.swift */, + 68ECD5E13EA08D669EEBD74218B18FA5 /* BuiltInBasicType.swift */, + 916CF2DD179C34072F0CED7EA7E172C4 /* BuiltInBridgeType.swift */, + B19A6339BCDC426144D4987C81596418 /* Configuration.swift */, + 98932AABF2712E9978244730956580D5 /* CustomDateFormatTransform.swift */, + A6614C2951E5A4AB6D1DF2B076BF1A5C /* DataTransform.swift */, + 2D7A5D10D9FFDD32C4D3CF85DDCFC707 /* DateFormatterTransform.swift */, + 10D6F8B588CB7C3C02CD426DADF34CE4 /* DateTransform.swift */, + DFFC9D8585FF5A3FC4C7FD63A93DCE16 /* Deserializer.swift */, + 2BC1B5A06113F348365D3564FD6425C6 /* EnumTransform.swift */, + 6CC52F25BF175D139AA0E5C94DC363A9 /* EnumType.swift */, + E1300F08331C16959F41C2533B209EF5 /* Export.swift */, + E7701D17547204EF54A538449343E8A4 /* ExtendCustomBasicType.swift */, + 68D3997593CBB0B018C81C73E8337C2C /* ExtendCustomModelType.swift */, + 92B55B2A9C151490137F69027B7F531E /* HandyJSON.h */, + 05B1F80DC3C02C2AD29D4C6CEA059CCD /* HelpingMapper.swift */, + BFC1E0E16DEFECC3E2FE92A428C9920D /* HexColorTransform.swift */, + 7379E87D9FF2E196ADB91DC8A0A5F2F3 /* ISO8601DateTransform.swift */, + 14E325E19530D7ADA41064D345141437 /* Logger.swift */, + 07BCC67F387326CAFCE34AF5FD2DBDE2 /* Measuable.swift */, + 00395AB0A6A459E12899B1CC7AA3C954 /* Metadata.swift */, + C29AD1BD351F370FBE921BBE6756CEC9 /* NominalType.swift */, + 467C66A8C88F09EF9D0129564F08540C /* NSDecimalNumberTransform.swift */, + 4457386C2A87F3E11630992C9CAA7836 /* OtherExtension.swift */, + ABE9E390C3EADB423277CE1E912E10AA /* PointerType.swift */, + ECC6F721935680D316DC183994F4F569 /* Properties.swift */, + 9CA29ADD75C3FE58A4ED07E10D427C9F /* PropertyInfo.swift */, + 35322B49B5EBE0CF14B7BC8677497347 /* ReflectionHelper.swift */, + AF0EB1CAE5B795EB85A1165F6D98C372 /* Serializer.swift */, + 1ABA7E2E494925BF34BC9885BE24E31C /* Transformable.swift */, + EC1BF45D7C52BC6493B283DDB371395F /* TransformOf.swift */, + 8F75E090F317987C0134B9DD1E5963C9 /* TransformType.swift */, + 9B31E52FEB6E5A6A955D4050CB76B18C /* URLTransform.swift */, + 8F43C2634E0BE8006FDE8986D81A795E /* Support Files */, ); - name = Frameworks; + name = HandyJSON; + path = HandyJSON; sourceTree = ""; }; - 20B56609144CE204DFA8221F742B2D76 /* Frameworks */ = { + 14FDC70D8950849FB1C0282A12C38C4E /* Frameworks */ = { isa = PBXGroup; children = ( - 287B6E205C5204939598639BF0799466 /* iOS */, + 045B43DFAA088FDD2E5F7DE61A99D3EF /* UMCommon.framework */, ); name = Frameworks; sourceTree = ""; }; - 2113AB85D8791161623936EC0882CA20 /* Support Files */ = { + 1F4DE6AE0412496E30F0F30AD61DD011 /* iOS */ = { isa = PBXGroup; children = ( - 8D2C5397761E61B24600821547A409CD /* Info.plist */, - DBE314BE44865438F00A5054E414EF77 /* Toast.modulemap */, - 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */, - 85EBECC44FA24EC40748D3CB399DD1F3 /* Toast-dummy.m */, - 52F1099514615B3BA1CA982ECF578DDF /* Toast-prefix.pch */, - 835B1DEC82F034C2C12DC0723F18F6E9 /* Toast-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/Toast"; - sourceTree = ""; - }; - 287B6E205C5204939598639BF0799466 /* iOS */ = { - isa = PBXGroup; - children = ( - E81ABC082107E519C9718F3CCEA03977 /* Foundation.framework */, - 59271332AFD884264C5B45B6B6152051 /* ImageIO.framework */, - 4DB0A7F29D540AB077DA6D9855C3F743 /* QuartzCore.framework */, - 93ED65B5F47F5FEA00C9BC9D151B1D26 /* SystemConfiguration.framework */, - B9B732FC24A0EC5E46E41D939F4A1130 /* UIKit.framework */, + 3B6BDECCF721973B9E2D8C5FFA3323B8 /* Foundation.framework */, + B77DE72B7ED4AED0DBED016D1274EFE8 /* ImageIO.framework */, + 94B64C32F67C820564A1C07F82FB412C /* QuartzCore.framework */, + 01529461C8BC5BFBF1FAD1AE7D691496 /* SystemConfiguration.framework */, + BAE5BE9DB67074649A1927384361E0A8 /* UIKit.framework */, ); name = iOS; sourceTree = ""; }; - 2A1708CE4EC9BA0CA7B5865FF66228B4 /* Support Files */ = { + 2021A6AEED487F441EF547B9DCEFF3E6 /* Support Files */ = { isa = PBXGroup; children = ( - 0CDCA399D86C4D9BFD1AAA60E4F5A9F5 /* HandyJSON.modulemap */, - 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */, - FD2B11D4DCD30BDBA06841569E01E1BD /* HandyJSON-dummy.m */, - 297F8CEFA42DFD823263EA02BC36D29A /* HandyJSON-prefix.pch */, - 11DABA5B57A3076260D36D4A9AE646F5 /* HandyJSON-umbrella.h */, - 2098C9BB32F72BB65BA83ADD1F338099 /* Info.plist */, + 60528D650715D578BD996859FC810107 /* Info.plist */, + BB6422771B215BFE2B4A9C0D9C9BC82B /* SVProgressHUD.modulemap */, + C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */, + A23A7E20FB52B9BFC4899C0FEBA2C6CE /* SVProgressHUD-dummy.m */, + 0F4FDE3A8C9BEA27417C27172F5BC2A5 /* SVProgressHUD-prefix.pch */, + 06E0F3A00F6C087D410087D3FE65529D /* SVProgressHUD-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/HandyJSON"; - sourceTree = ""; - }; - 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - BE317C13F71B97F884FEF35459393B25 /* Pods-ParentAssistant */, - ); - name = "Targets Support Files"; + path = "../Target Support Files/SVProgressHUD"; sourceTree = ""; }; - 330169F0E739AF701BDEBB5894F8434A /* SDWebImage */ = { + 2409C0E750E5175AA19E7BA4DA2A475D /* Frameworks */ = { isa = PBXGroup; children = ( - 5E15FAEE84F8B146F03BE7AFBAC36661 /* Core */, - 630CEDD835E65E88DC71885CD9EF4E92 /* Support Files */, + 79353402DE45C743DE8658FE2C413D90 /* libaacplus.a */, + B4FE0743D323412387DC64C29B1AE5F7 /* libcrypto.a */, + C7C6E9C97726F9691282BA5009E78833 /* libevent.a */, + 605BF197AFCD5A69E3A6A700329C2FCA /* libssl.a */, + 93831DF9B9AE2775CB38F92DAD62BF35 /* NIMSDK.framework */, ); - name = SDWebImage; - path = SDWebImage; + name = Frameworks; sourceTree = ""; }; - 37C774715FC3CB332E3DBBFF760D1DA7 /* DZNEmptyDataSet */ = { + 301A38DCCF06B3AC4AF5322410158E12 /* XRCarouselView */ = { isa = PBXGroup; children = ( - 41531DBB287870602D671C4D97E99B21 /* UIScrollView+EmptyDataSet.h */, - 18F6A571F05F4D0DD12870CE83C8F787 /* UIScrollView+EmptyDataSet.m */, - 001E2CA6EA468C671F75E62723E01ABD /* Support Files */, + AA29655EDD56783CB2C21A411019B7BA /* XRCarouselView.h */, + 89457F43B7DE2154380C8DD976759AA2 /* XRCarouselView.m */, + 796662A504D2560DE6FA8F82F7CCA93C /* Resources */, + 96AED64B9563F84118E7D6B1CF316040 /* Support Files */, ); - name = DZNEmptyDataSet; - path = DZNEmptyDataSet; + name = XRCarouselView; + path = XRCarouselView; sourceTree = ""; }; - 3860473AD1F18D1A7419BE2875F3630F /* Frameworks */ = { + 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */ = { isa = PBXGroup; children = ( - BE846687076AD4570ACE89EC260747A1 /* UMErrorCatch.framework */, + BE317C13F71B97F884FEF35459393B25 /* Pods-ParentAssistant */, ); - name = Frameworks; + name = "Targets Support Files"; sourceTree = ""; }; - 38EFF4314C3C2EB48B86E623B8035A4B /* UMCAnalytics */ = { + 3A24F7BBB5CB0025CF2072B4FB964C24 /* Products */ = { isa = PBXGroup; children = ( - 58FD8FF25B60AC3F652B1FDCA8518B99 /* Frameworks */, + 937EE30FD85AB8EED4F8467502DD290F /* Alamofire.framework */, + B9806961B1DB01F087677787DFCC6CE0 /* AlamofireImage.framework */, + 7C9D89FB057D8F2ECBB232C7A81EF4B5 /* DZNEmptyDataSet.framework */, + 110D34637F4EF19C8F46B101A1509ABE /* HandyJSON.framework */, + 72C584102060EC4C983B4B76AB4B8C8F /* Pods_ParentAssistant.framework */, + 95CAD531E474553E7D52B95131219D1A /* Reachability.framework */, + 8E2EC639DC31085C2078E4638A61266B /* SDWebImage.framework */, + 344E5051853CBAE87166BAA69476DDB1 /* SVProgressHUD.framework */, + 52303324A62AD0B74F2DD46E74D232EB /* SwiftHash.framework */, + 507695995D3D9F4276EAFC4603ABFF54 /* Toast.framework */, + 444E77BBBDD4B2AB34C6742B6752BBCB /* XRCarouselView.framework */, ); - name = UMCAnalytics; - path = UMCAnalytics; + name = Products; sourceTree = ""; }; - 3C7A5A0E8FB6FB9142B786013E33F9B1 /* NIMSDK_LITE */ = { + 3FF4649D5096372902422FFDFDD8E56D /* SwiftHash */ = { isa = PBXGroup; children = ( - 197A90DE72E89B51A1E8F89461EABB00 /* Frameworks */, + 8249AA0D5DBC641B891AE927074850B2 /* MD5.swift */, + E651A4469FA2206746488B70290D48C0 /* SHA1.swift */, + B6C77C2D1243C37F15069EBD4B8827B8 /* Support Files */, ); - name = NIMSDK_LITE; - path = NIMSDK_LITE; + name = SwiftHash; + path = SwiftHash; sourceTree = ""; }; - 3FF5DEC88DC62971403983A6F02247FE /* Toast */ = { + 43383F8D50059A08F0FE7124DFF675F1 /* Core */ = { isa = PBXGroup; children = ( - 19FAAAAFAF3A705D1081BDCDC14CAFD6 /* UIView+Toast.h */, - E533F265C56324D6F57EB232221F586A /* UIView+Toast.m */, - 2113AB85D8791161623936EC0882CA20 /* Support Files */, + 1A53991A7FAF70CDAC1F059FB04F5543 /* NSData+ImageContentType.h */, + 229808FB79115B70777D682D8335C18E /* NSData+ImageContentType.m */, + A2BD80EBA9375936EAA1AE0D930C61EC /* SDImageCache.h */, + 155F8627DF2C4A4A091DD4AF34FFEF02 /* SDImageCache.m */, + 61D09F1E0C8F29641858460B3928A5B0 /* SDWebImageCompat.h */, + 920C3AE864C4E24091B77772A498A58C /* SDWebImageCompat.m */, + F3CF9F638E5784E56583202BEBE63239 /* SDWebImageDecoder.h */, + 6B05BD93D4EE278B866CC9AAF18763DB /* SDWebImageDecoder.m */, + 9D9602FA58305177F98B7472A155DE66 /* SDWebImageDownloader.h */, + 4BBA6274610821F15000C6CC777D555B /* SDWebImageDownloader.m */, + 852A7B853425A17ACDE963BB0C57B689 /* SDWebImageDownloaderOperation.h */, + 358430CDB8CA6FB92C74E9FC7F6EB159 /* SDWebImageDownloaderOperation.m */, + D43927282F3DD1C78741ABFCC5E0C768 /* SDWebImageManager.h */, + 02DAB9B7A1A3D2199EFC7FC7FC69ED85 /* SDWebImageManager.m */, + ED4D8AA9257567AC16CB397E7E8BF346 /* SDWebImageOperation.h */, + 61CAF6761E3C21827415A9DA38D18547 /* SDWebImagePrefetcher.h */, + 6DA08525DC2775B611071866CF38CC96 /* SDWebImagePrefetcher.m */, + D96BCA19B9F922B2258E4C0D40666B58 /* UIButton+WebCache.h */, + 8BFF20BC7E4F55C09BAC34A664D91FED /* UIButton+WebCache.m */, + 0DFCFB41829DC67B9036DEF9766C6C88 /* UIImage+GIF.h */, + 310743AC8DCCF3F81515515A6FC64B8A /* UIImage+GIF.m */, + 715810392F163BB36DFE8AC307460289 /* UIImage+MultiFormat.h */, + 4ED641951605DEB02B067F9D1915C5A9 /* UIImage+MultiFormat.m */, + 0B751448AE7B6607E97470BFD4082216 /* UIImageView+HighlightedWebCache.h */, + CD28D005A100BC203777597B48B8AD06 /* UIImageView+HighlightedWebCache.m */, + E4D61E78309E6543D6EBC75BE2967417 /* UIImageView+WebCache.h */, + 496A0D655D409BDF23A3826300EBCD1B /* UIImageView+WebCache.m */, + 98BA100696255C8CFD15860D64267467 /* UIView+WebCacheOperation.h */, + BC99BBF9B209FE42B0D74F5CFB60627F /* UIView+WebCacheOperation.m */, ); - name = Toast; - path = Toast; + name = Core; sourceTree = ""; }; - 4957D806F4D44D6387F398B8ECD395C9 /* Support Files */ = { + 56CCB4F4B6E9E8D3FDF3A892A90571F4 /* AlamofireImage */ = { isa = PBXGroup; children = ( - FF928773E158E70CF5C2B45EA69A4223 /* Info.plist */, - 8CDA4E6BD46E857912EC5B5F99364A24 /* SwiftHash.modulemap */, - BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */, - 448D149E9E2122E63C2D8CDB8E1159CB /* SwiftHash-dummy.m */, - 5B56491AFD4EC6985EBCCEF221A0FCB8 /* SwiftHash-prefix.pch */, - 9F2BF6E468482ED7EDAE9AFD6CA2C994 /* SwiftHash-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/SwiftHash"; + AE04BA7BB2F95B59112DED31AECB069E /* AFIError.swift */, + AC0A874231DDAD102B02D7EFD048FDE2 /* Image.swift */, + FEA8115215CE30840A6225F435645485 /* ImageCache.swift */, + FDA2AA9043380263CFFD99AE883B70ED /* ImageDownloader.swift */, + A58625E1014C6D82D1825309986334E1 /* ImageFilter.swift */, + CC28263CA0EDAEA1CBC1173B87FEA769 /* Request+AlamofireImage.swift */, + 7C4ACCC8EE8E5E07D0CD171894588314 /* UIButton+AlamofireImage.swift */, + 2E3282E372FE0A6C0D2227384238F921 /* UIImage+AlamofireImage.swift */, + D4D00913B407B6DB96C7E7B48C21D904 /* UIImageView+AlamofireImage.swift */, + ED22116B8F3EBCF03BF952FD1412F8A7 /* Support Files */, + ); + name = AlamofireImage; + path = AlamofireImage; sourceTree = ""; }; - 55375898F80E2F483F6A33CD3B40855D /* SwiftHash */ = { + 626BE02B583652D883A14A0561438CB2 /* Frameworks */ = { isa = PBXGroup; children = ( - 9AEE056145338863D7A727ACF1C3657C /* MD5.swift */, - 9A4D6703A8771BB168130EFB6EAC1C3E /* SHA1.swift */, - 4957D806F4D44D6387F398B8ECD395C9 /* Support Files */, + 3CD0FA7EE743F01B3A6385702606A408 /* Alamofire.framework */, + 1F4DE6AE0412496E30F0F30AD61DD011 /* iOS */, ); - name = SwiftHash; - path = SwiftHash; + name = Frameworks; sourceTree = ""; }; - 5763DABFBEC61EF21CE978F465358A89 /* SVProgressHUD */ = { + 67A94A45D2AA43B64721FE393BF0B924 /* Frameworks */ = { isa = PBXGroup; children = ( - 6768B1FE2E118D79D8A1613520B9BB23 /* SVIndefiniteAnimatedView.h */, - 72803D16FA054A0D26C303991C1F2B3C /* SVIndefiniteAnimatedView.m */, - B6554BE7D86E2DF12BC2CFA630452CA0 /* SVProgressAnimatedView.h */, - 38EE23882943EDCED73523F643A71C39 /* SVProgressAnimatedView.m */, - 17403F9FAA48DA29AAEB297BE9AC4D51 /* SVProgressHUD.h */, - 1DC66067EC016B21D6BC487C409083AF /* SVProgressHUD.m */, - 20C0A79CAF95E65B981CC5F896E4334C /* SVRadialGradientLayer.h */, - AE8B2524C105710A1C75E5F3C734796F /* SVRadialGradientLayer.m */, - 85CC9E6AC38974A790C417FCB9FD89FE /* Resources */, - C78510EC4A1F228614ECFEB07DFC0275 /* Support Files */, + 057C8BFD76D95D8932478DFC5DA7DB3E /* UMErrorCatch.framework */, ); - name = SVProgressHUD; - path = SVProgressHUD; + name = Frameworks; sourceTree = ""; }; - 58FD8FF25B60AC3F652B1FDCA8518B99 /* Frameworks */ = { + 67B27D86547E925A9481C071E5DC217B /* UMCCommon */ = { isa = PBXGroup; children = ( - D124D84D327A6ADF3D01C95E84C09A31 /* UMAnalytics.framework */, + 14FDC70D8950849FB1C0282A12C38C4E /* Frameworks */, ); - name = Frameworks; + name = UMCCommon; + path = UMCCommon; sourceTree = ""; }; - 59C2933D98416017CC5447DA025532B4 /* UMCErrorCatch */ = { + 75CE8CBE50D56BFC3821ECF0A886130F /* Support Files */ = { isa = PBXGroup; children = ( - 3860473AD1F18D1A7419BE2875F3630F /* Frameworks */, + D79CBFE6F9821431996C8160F19D90C6 /* Alamofire.modulemap */, + 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */, + 489ED6DFB42C7C8F6A4875005025A913 /* Alamofire-dummy.m */, + 156F9486C74F4094ACE7858B18E5C41D /* Alamofire-prefix.pch */, + 78F77FFCC80D398532E854672D527FD8 /* Alamofire-umbrella.h */, + 58B4CFDB50C6966BC7B9CB0CBD1C60E7 /* Info.plist */, ); - name = UMCErrorCatch; - path = UMCErrorCatch; + name = "Support Files"; + path = "../Target Support Files/Alamofire"; sourceTree = ""; }; - 5E15FAEE84F8B146F03BE7AFBAC36661 /* Core */ = { + 796662A504D2560DE6FA8F82F7CCA93C /* Resources */ = { isa = PBXGroup; children = ( - DB5FF7B561F6F548C82F1FC27FDD72E8 /* NSData+ImageContentType.h */, - C203E9ABEF394B0009B142EEB9AA64FC /* NSData+ImageContentType.m */, - 140A2830037A30E45442BA52CBDA1CFC /* SDImageCache.h */, - 1439A3EA7193042844C3E9C52032677C /* SDImageCache.m */, - 82C441F9B75595B2F266E6AC40AD7D85 /* SDWebImageCompat.h */, - 2E90E960C03E09803780D5C47A55A4DB /* SDWebImageCompat.m */, - 172419A08571955755C3C6FB2044DD9D /* SDWebImageDecoder.h */, - DF68D7CB4183F99C38744F4985CD422D /* SDWebImageDecoder.m */, - 9A559DCF61F2E184BC9318C05F05CFF3 /* SDWebImageDownloader.h */, - 1983D355FD75B9D24A71756509C98131 /* SDWebImageDownloader.m */, - 33347618F6541AA20F52632F9EA10CA6 /* SDWebImageDownloaderOperation.h */, - 24C69C342339292A7BBB5C56D2C12D12 /* SDWebImageDownloaderOperation.m */, - 8A51BA19C89D5E62EDCF2DB9D9FA43E0 /* SDWebImageManager.h */, - FFCF8A6062658FA349B617C0D75723C2 /* SDWebImageManager.m */, - B9A38D8C4EC4826AEDC2A52DD0187186 /* SDWebImageOperation.h */, - E33C2A8A35CA23130F27CFEC0285B7DB /* SDWebImagePrefetcher.h */, - 6850886B55CE3CD9B901B28690292C5C /* SDWebImagePrefetcher.m */, - C03FC1A11EE20AB8B6A4B398E11B26B0 /* UIButton+WebCache.h */, - BE70BDE392E6E92B76047D2DED4ED380 /* UIButton+WebCache.m */, - E3370B03674C70DABFF75D9D2BA95DCE /* UIImage+GIF.h */, - B71F8A62F3906657D17D418212E1CBA1 /* UIImage+GIF.m */, - F6C063D5E492D3ED69858D446C30719E /* UIImage+MultiFormat.h */, - 469D54339A6D448DF6D1166FDB669676 /* UIImage+MultiFormat.m */, - 9011EFC1DA29BE6CA0831595062B82ED /* UIImageView+HighlightedWebCache.h */, - BB7CE29DC4FFF250766240EA8DA973D1 /* UIImageView+HighlightedWebCache.m */, - 206933D2687A3DC4CD2836F2AEF28A3B /* UIImageView+WebCache.h */, - 6E2AA0C415512D5F3F34F7A99AA4D14A /* UIImageView+WebCache.m */, - F638493F2C879E2AF820AE53EA390269 /* UIView+WebCacheOperation.h */, - 1836357ECED17B3B0BF22256498AA8EE /* UIView+WebCacheOperation.m */, + B00FEDA7D2B852B770837D954A635F0B /* XRPlaceholder.png */, ); - name = Core; + name = Resources; sourceTree = ""; }; - 630CEDD835E65E88DC71885CD9EF4E92 /* Support Files */ = { + 7B6FD119C5043EA8D24938E17F689C68 /* NIMSDK_LITE */ = { isa = PBXGroup; children = ( - 106A3E63162DD85E6D0BEC1EE1FFDBB4 /* Info.plist */, - D912920D1BEEB7757AF4BE74E2EC8FA6 /* SDWebImage.modulemap */, - AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */, - FF65E4A0D399571B01517891F0309004 /* SDWebImage-dummy.m */, - 871C0D1C45FD62FE7B82D8E083C00466 /* SDWebImage-prefix.pch */, - E786E1AEE51D914333543AC4DEF9B3FB /* SDWebImage-umbrella.h */, + 2409C0E750E5175AA19E7BA4DA2A475D /* Frameworks */, ); - name = "Support Files"; - path = "../Target Support Files/SDWebImage"; + name = NIMSDK_LITE; + path = NIMSDK_LITE; sourceTree = ""; }; - 68471EF420D9A2E724167C5491206AFB /* Resources */ = { + 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( - FFEBBEC7D2ED4C631DFB3CBB04E6F926 /* XRPlaceholder.png */, + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 626BE02B583652D883A14A0561438CB2 /* Frameworks */, + A16C9A7A00849A680D2ABE20664F291E /* Pods */, + 3A24F7BBB5CB0025CF2072B4FB964C24 /* Products */, + 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */, ); - name = Resources; sourceTree = ""; }; - 705867264671E4C7B187D746502DAB91 /* Support Files */ = { + 818A0762A9C9D12339F271DBF1F4A0AF /* SDWebImage */ = { isa = PBXGroup; children = ( - C62416D612C6BD82B2867F75585C4C56 /* Info.plist */, - 095F51C7CEE9EF306E13A58319881EFF /* Reachability.modulemap */, - 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */, - 16CC2B704148D354077756FC0880DBCB /* Reachability-dummy.m */, - 42DB5E77081A2858012F4CBF354A0D27 /* Reachability-prefix.pch */, - 29BC53491C8D6BA4B81045D6FBBA043C /* Reachability-umbrella.h */, + 43383F8D50059A08F0FE7124DFF675F1 /* Core */, + 03D7A135F0C051D7B2ADB4B1311D2155 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/Reachability"; + name = SDWebImage; + path = SDWebImage; sourceTree = ""; }; - 7DB346D0F39D3F0E887471402A8071AB = { + 84B302A59A917E0D9C2EBA206DFA1A3A /* UMCSecurityPlugins */ = { isa = PBXGroup; children = ( - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - 20B56609144CE204DFA8221F742B2D76 /* Frameworks */, - D7E9034AEAB92F049FD989A2FAE23CD2 /* Pods */, - 9CE129D1A72CFA1DEF6F85FBF1B37E5B /* Products */, - 309ACF9CB8917F8180F0C78892CC4962 /* Targets Support Files */, + C02FC18021F6A9D7F71E478E6C6012D5 /* Frameworks */, ); + name = UMCSecurityPlugins; + path = UMCSecurityPlugins; sourceTree = ""; }; - 85CC9E6AC38974A790C417FCB9FD89FE /* Resources */ = { + 87D211D7619F5C69CD22BC5A6BD43F1B /* SVProgressHUD */ = { isa = PBXGroup; children = ( - 65DEF3C169B8F1241E74C3D5C7DA5A6D /* SVProgressHUD.bundle */, + 5BF833E322898122D95617BD9520476D /* SVIndefiniteAnimatedView.h */, + 70B842936FA16DF44F4AD4FC84E225A4 /* SVIndefiniteAnimatedView.m */, + DBA6EC35D53897ED2A96FEDE1BB384BA /* SVProgressAnimatedView.h */, + A8CB977B7AFFFA509CAA11CD0C03AEB5 /* SVProgressAnimatedView.m */, + F81C313FED69F64F2F4F403B4C4EC3F6 /* SVProgressHUD.h */, + 8A591BFD7762D296F2E84EBC08129BFA /* SVProgressHUD.m */, + 770A612E1A02028636A4D09BDEB87D10 /* SVRadialGradientLayer.h */, + CBB0446840A0CDD4BB7D69692D07CC21 /* SVRadialGradientLayer.m */, + 0BD61037A6B393F3F3CECE029889F374 /* Resources */, + 2021A6AEED487F441EF547B9DCEFF3E6 /* Support Files */, ); - name = Resources; + name = SVProgressHUD; + path = SVProgressHUD; sourceTree = ""; }; - 8FC2DD334C1E70C1C4C5C8F0FA196151 /* Frameworks */ = { + 89D3111CD10CBDFE268BF7ECFA93CE05 /* Reachability */ = { isa = PBXGroup; children = ( - FC9D90B14CC51CAAC698C0623AB16C70 /* SecurityEnvSDK.framework */, - E058896CA0DFFEF3CCEFAD6FEBA0DB11 /* UTDID.framework */, + EF0B6E4594449A55A06C44CB6D1223F0 /* Reachability.h */, + F775144A6F17788F065E01BFD8DC2D5C /* Reachability.m */, + 0310C750335673BB116A6C5FAFEEFE49 /* Support Files */, ); - name = Frameworks; + name = Reachability; + path = Reachability; sourceTree = ""; }; - 9CE129D1A72CFA1DEF6F85FBF1B37E5B /* Products */ = { + 8F140A42D845EC8CE45E44C00A0F75EF /* Toast */ = { isa = PBXGroup; children = ( - E956F54FF76DE5D347505F3AF7694F03 /* Alamofire.framework */, - DD0E89B8C1439B9F5FDB39EA0232B3EA /* DZNEmptyDataSet.framework */, - 1719FF827E35476E2C51408C0A9BD81C /* HandyJSON.framework */, - B88D8470A1A1E4F507B1E9895B074253 /* Pods_ParentAssistant.framework */, - 5C3FCED1EF014BDAA42DACC871E2516A /* Reachability.framework */, - CE1C92985D9321104698E3AFAF68594E /* SDWebImage.framework */, - 33F1F6213579E70C284C8445EBD7DBDD /* SVProgressHUD.framework */, - 41009B988332564AFC9DAF9C3817C7FA /* SwiftHash.framework */, - A59A469B0852E07D2428D72E4C62B1E7 /* Toast.framework */, - 09E993E3E47BE7E80DCFECCEA59937CC /* XRCarouselView.framework */, + 6BD1FCCAAFC6349CA1E2AC3881DB81FC /* UIView+Toast.h */, + 29B41A43E5D5CCE97E46706AC4240B68 /* UIView+Toast.m */, + EB8705EF374C4C0C14218029F0042B9B /* Support Files */, ); - name = Products; + name = Toast; + path = Toast; sourceTree = ""; }; - A16014AECD4B7D4544FDD04B423C17A2 /* UMCCommon */ = { + 8F43C2634E0BE8006FDE8986D81A795E /* Support Files */ = { isa = PBXGroup; children = ( - B6AC7F4D4F23329B98C15767E39B6946 /* Frameworks */, + 08D048205A3343D5E251F506CBBE23E6 /* HandyJSON.modulemap */, + C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */, + 46E35C087C53D197C9D213DF73A74B66 /* HandyJSON-dummy.m */, + F1CF04B231D1BFC627F83398DFB40BBE /* HandyJSON-prefix.pch */, + 293A8917426C277C951BE22C661A240A /* HandyJSON-umbrella.h */, + BE69851A50C89CE0E218AE8504C1188B /* Info.plist */, ); - name = UMCCommon; - path = UMCCommon; + name = "Support Files"; + path = "../Target Support Files/HandyJSON"; sourceTree = ""; }; - A763792383AB084CDE85481D91E26AE3 /* HandyJSON */ = { + 96AED64B9563F84118E7D6B1CF316040 /* Support Files */ = { isa = PBXGroup; children = ( - 931ED830C3B0B8852F1479DE61BA997E /* AnyExtensions.swift */, - F948022D8D1EFEF734A07E6ED4D6CAF9 /* BuiltInBasicType.swift */, - 6976D41DC0C992EA2F24C3A7358E958F /* BuiltInBridgeType.swift */, - 1914DA670BEE4BC1F461E88ED1BD7C26 /* Configuration.swift */, - 64CF5A867496880A0DAE25ED9EC8E512 /* CustomDateFormatTransform.swift */, - DE92E07FF56795D096246F9059B540CA /* DataTransform.swift */, - B4EC3094994043023CF3002A63DD6DA4 /* DateFormatterTransform.swift */, - B0A49BF64844554AA6BC0B49FD9A9BE8 /* DateTransform.swift */, - 1D374115D56716D6284C03A777CD2BB4 /* Deserializer.swift */, - 31A74FD90C96035085B5A148E9CBA64C /* EnumTransform.swift */, - 5C73B5BC3B66F99610607951FEC5FCB3 /* EnumType.swift */, - C33C9063E8CA60D73EE6050FCF59F433 /* Export.swift */, - 32115C18B0BD53A5791A3FA797AB85AC /* ExtendCustomBasicType.swift */, - 54E529332879B58C942DDF16DF5D39B4 /* ExtendCustomModelType.swift */, - 6B3D43CB0BDA34787F85B2C084FBB09A /* HandyJSON.h */, - 9889E5067E9A54BAEC05298BBA10F671 /* HelpingMapper.swift */, - 2E85535E49256ABCDBBB9EA045CE6268 /* HexColorTransform.swift */, - 7DFB6D55866F4F62D8116993D42B55A8 /* ISO8601DateTransform.swift */, - 26EF7D93FE7442849AC14571996AC8ED /* Logger.swift */, - 7D9407543C44ABED0AC48154C76831BE /* Measuable.swift */, - BC3C517CD17DEB98E878268901D654E8 /* Metadata.swift */, - 7C5CEE4C10F2E83011011BAE5999B4FD /* NominalType.swift */, - 2830040C9AF69744EEB45C092E65CA2A /* NSDecimalNumberTransform.swift */, - E9462CA128209C32EE6E6647C88609D1 /* OtherExtension.swift */, - 3447CC75BA7C93ED3BF68C2F65392471 /* PointerType.swift */, - 05BE4EE179BFA37C2F5F3928F9237A1F /* Properties.swift */, - 81D2AEE4F419083BF22474B240B3D9F6 /* PropertyInfo.swift */, - 31257A57ECE5DD3A052A547DA8090EF9 /* ReflectionHelper.swift */, - 39C3C21D34A34F85D09063C7E1255E9D /* Serializer.swift */, - E4E76CB8696BAB20A617484E4726713B /* Transformable.swift */, - 72ADD4F0113F0555435EA10BA789F8E2 /* TransformOf.swift */, - F33461E2C03CDF90E02052B76ADADB01 /* TransformType.swift */, - 6D24FB404E9541910245BF3E68C5EE73 /* URLTransform.swift */, - 2A1708CE4EC9BA0CA7B5865FF66228B4 /* Support Files */, + 7A45AEAFC59FC8550866653E018742E3 /* Info.plist */, + 6E2FF425EC8FB1E33922042D418E2A79 /* XRCarouselView.modulemap */, + 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */, + B63F0AB7376A64C50DA03CACC7D9CC2E /* XRCarouselView-dummy.m */, + B4595D719B06D3C0D44248E3DD5B1962 /* XRCarouselView-prefix.pch */, + 49DC3C5FB6A7B1CDAA1410FAABB684E0 /* XRCarouselView-umbrella.h */, ); - name = HandyJSON; - path = HandyJSON; + name = "Support Files"; + path = "../Target Support Files/XRCarouselView"; sourceTree = ""; }; - A87864D22DE2007F4600F7C0E566D95C /* Support Files */ = { + A16C9A7A00849A680D2ABE20664F291E /* Pods */ = { isa = PBXGroup; children = ( - 2EE1F3AAF4D2513EA3BFF47F019026DC /* Alamofire.modulemap */, - EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */, - BB2B3251E63EE34530FC8A40E441CB23 /* Alamofire-dummy.m */, - 07E1E2C8AC8B32A86D7C0A576243A070 /* Alamofire-prefix.pch */, - BF496B88C6E68626DC9D0C9FC152BD3C /* Alamofire-umbrella.h */, - 820C0B25502D820076E6945A9666E544 /* Info.plist */, + A1F9F100FA7BE821D8C1CA349D5C7EAC /* Alamofire */, + 56CCB4F4B6E9E8D3FDF3A892A90571F4 /* AlamofireImage */, + F37E800D927B17552826F537A1FC4DE1 /* DZNEmptyDataSet */, + 0D5414319A3865994CB656BBA34C49BD /* HandyJSON */, + 7B6FD119C5043EA8D24938E17F689C68 /* NIMSDK_LITE */, + 89D3111CD10CBDFE268BF7ECFA93CE05 /* Reachability */, + 818A0762A9C9D12339F271DBF1F4A0AF /* SDWebImage */, + 87D211D7619F5C69CD22BC5A6BD43F1B /* SVProgressHUD */, + 3FF4649D5096372902422FFDFDD8E56D /* SwiftHash */, + 8F140A42D845EC8CE45E44C00A0F75EF /* Toast */, + D18EBDBE538D676F21A84906A850C7C5 /* UMCAnalytics */, + 67B27D86547E925A9481C071E5DC217B /* UMCCommon */, + D19DCA624A50F676CBC86D437D3B30B2 /* UMCErrorCatch */, + 84B302A59A917E0D9C2EBA206DFA1A3A /* UMCSecurityPlugins */, + 301A38DCCF06B3AC4AF5322410158E12 /* XRCarouselView */, ); - name = "Support Files"; - path = "../Target Support Files/Alamofire"; + name = Pods; sourceTree = ""; }; - B4BCFF35A95B70F9457A79139DBED331 /* Reachability */ = { + A1F9F100FA7BE821D8C1CA349D5C7EAC /* Alamofire */ = { isa = PBXGroup; children = ( - 2AD254563DCC20283BB5C0C5B4E57B5C /* Reachability.h */, - 0969E5011DCC0C421F637E6859279610 /* Reachability.m */, - 705867264671E4C7B187D746502DAB91 /* Support Files */, + 7EBA3110EB94A0568FF28796D778675E /* AFError.swift */, + 30A5A5A7B7C1088D4D4ABDFAAF6E54F3 /* Alamofire.swift */, + 2245A79B4B989C667CBB26B48B7A1896 /* DispatchQueue+Alamofire.swift */, + C7C98E50FC5D694C89DBEE8A1486D900 /* MultipartFormData.swift */, + EFA9DF74078A51C9573DF6952A753D1C /* NetworkReachabilityManager.swift */, + E215EB7C10CD4B2F724959DB344FE5C0 /* Notifications.swift */, + 0F3763627E35DE67CD17EE93E640DD39 /* ParameterEncoding.swift */, + E74F653E7072F40DB006FC90854FC840 /* Request.swift */, + D82D7054D7F1E7FE0ACBE043A3FA7F50 /* Response.swift */, + 2BE4F7B39AE70471948017C04083277A /* ResponseSerialization.swift */, + 7C01563CB8CAFA848353DD90A07F2F47 /* Result.swift */, + CAE58263CB0A52CDB5D3790DC6D0D74F /* ServerTrustPolicy.swift */, + 0BD55715F6A333D077B971AD89F07626 /* SessionDelegate.swift */, + 0F6296C8F6861894C09A46E509B544A6 /* SessionManager.swift */, + 85DBA7A206E80F9E00E01BEFE74D6D69 /* TaskDelegate.swift */, + 1A34017AEE736DE7CC86E3201A0B303C /* Timeline.swift */, + 981D262EBFB4CA168BE569F48CC64843 /* Validation.swift */, + 75CE8CBE50D56BFC3821ECF0A886130F /* Support Files */, ); - name = Reachability; - path = Reachability; + name = Alamofire; + path = Alamofire; sourceTree = ""; }; - B6AC7F4D4F23329B98C15767E39B6946 /* Frameworks */ = { + B6C77C2D1243C37F15069EBD4B8827B8 /* Support Files */ = { isa = PBXGroup; children = ( - DF826B20D920C607DF652F2F3EA4C2F8 /* UMCommon.framework */, + 2387EDABD5D4A7ABE66B86C30A524A6C /* Info.plist */, + 5684F0F90E3FAEFBE15A94EE1C636644 /* SwiftHash.modulemap */, + 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */, + DF7918BBC8A10388FDE15B624F66A8E9 /* SwiftHash-dummy.m */, + D8A2F9829AECA7F54C384A6E17AB7124 /* SwiftHash-prefix.pch */, + 8B25C902A48A887CDEA53D385B48C92E /* SwiftHash-umbrella.h */, ); - name = Frameworks; + name = "Support Files"; + path = "../Target Support Files/SwiftHash"; sourceTree = ""; }; BE317C13F71B97F884FEF35459393B25 /* Pods-ParentAssistant */ = { @@ -944,155 +1005,190 @@ path = "Target Support Files/Pods-ParentAssistant"; sourceTree = ""; }; - C78510EC4A1F228614ECFEB07DFC0275 /* Support Files */ = { + C02FC18021F6A9D7F71E478E6C6012D5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E2607500177BC99C04478DAB57D80EB7 /* SecurityEnvSDK.framework */, + EEE063E46D8691853E8CDB3C33506BF8 /* UTDID.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + D18EBDBE538D676F21A84906A850C7C5 /* UMCAnalytics */ = { + isa = PBXGroup; + children = ( + DD89B480B22F4C573AB6CF0C122D238C /* Frameworks */, + ); + name = UMCAnalytics; + path = UMCAnalytics; + sourceTree = ""; + }; + D19DCA624A50F676CBC86D437D3B30B2 /* UMCErrorCatch */ = { + isa = PBXGroup; + children = ( + 67A94A45D2AA43B64721FE393BF0B924 /* Frameworks */, + ); + name = UMCErrorCatch; + path = UMCErrorCatch; + sourceTree = ""; + }; + D7386CADE4284D284D37C38FDCFCEF63 /* Support Files */ = { isa = PBXGroup; children = ( - B507541260F671D342B11E7250120BBF /* Info.plist */, - 481FE62B9A76B9C994CED4CDBF22F059 /* SVProgressHUD.modulemap */, - 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */, - 0322584439902B09D766EF9B00C87E2A /* SVProgressHUD-dummy.m */, - 52C9D81718FDCE850DDAF365FD190B4F /* SVProgressHUD-prefix.pch */, - 93251EC8BEF89E6A4FA758DA38A1E47A /* SVProgressHUD-umbrella.h */, + B9A33258A85F658D3C02E30EC92D43FF /* DZNEmptyDataSet.modulemap */, + 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */, + EC105ECBFE938402821EF19D7C5DA1DA /* DZNEmptyDataSet-dummy.m */, + 661171DD778BD7E26EE68F008228F1C9 /* DZNEmptyDataSet-prefix.pch */, + CECDC33DC6A3E686FD21577C5B23C258 /* DZNEmptyDataSet-umbrella.h */, + 0241F285DD08F109C7549C2CDA98F2F6 /* Info.plist */, ); name = "Support Files"; - path = "../Target Support Files/SVProgressHUD"; + path = "../Target Support Files/DZNEmptyDataSet"; sourceTree = ""; }; - D31A1BD7824CBE1C0596DAB8776011D9 /* XRCarouselView */ = { + DD89B480B22F4C573AB6CF0C122D238C /* Frameworks */ = { isa = PBXGroup; children = ( - 57342E33349B812F65B6D994EA74E212 /* XRCarouselView.h */, - A91D08749C812CD6EB281780E69AFED6 /* XRCarouselView.m */, - 68471EF420D9A2E724167C5491206AFB /* Resources */, - DEA7E0AFDB9947306F061F7A72D3AE96 /* Support Files */, + EADCBFE671FB00B5F5FDBD2B3F6EC3CD /* UMAnalytics.framework */, ); - name = XRCarouselView; - path = XRCarouselView; + name = Frameworks; sourceTree = ""; }; - D7E9034AEAB92F049FD989A2FAE23CD2 /* Pods */ = { + EB8705EF374C4C0C14218029F0042B9B /* Support Files */ = { isa = PBXGroup; children = ( - 035886489A99DD807583400603AB5019 /* Alamofire */, - 37C774715FC3CB332E3DBBFF760D1DA7 /* DZNEmptyDataSet */, - A763792383AB084CDE85481D91E26AE3 /* HandyJSON */, - 3C7A5A0E8FB6FB9142B786013E33F9B1 /* NIMSDK_LITE */, - B4BCFF35A95B70F9457A79139DBED331 /* Reachability */, - 330169F0E739AF701BDEBB5894F8434A /* SDWebImage */, - 5763DABFBEC61EF21CE978F465358A89 /* SVProgressHUD */, - 55375898F80E2F483F6A33CD3B40855D /* SwiftHash */, - 3FF5DEC88DC62971403983A6F02247FE /* Toast */, - 38EFF4314C3C2EB48B86E623B8035A4B /* UMCAnalytics */, - A16014AECD4B7D4544FDD04B423C17A2 /* UMCCommon */, - 59C2933D98416017CC5447DA025532B4 /* UMCErrorCatch */, - 0AFF261FC6409676B5FE2EA67480CAE4 /* UMCSecurityPlugins */, - D31A1BD7824CBE1C0596DAB8776011D9 /* XRCarouselView */, + 676078733016383B143B493E79D3CEF5 /* Info.plist */, + 874C609455AB27C910DD97EBDD79E965 /* Toast.modulemap */, + 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */, + 53599A8492E17F111CC5C8D3C50E872A /* Toast-dummy.m */, + 84AE5CF00E8941985B8EB7DFC8A475E7 /* Toast-prefix.pch */, + 93E637F89EC35850C7250805992BB1C0 /* Toast-umbrella.h */, ); - name = Pods; + name = "Support Files"; + path = "../Target Support Files/Toast"; sourceTree = ""; }; - DEA7E0AFDB9947306F061F7A72D3AE96 /* Support Files */ = { + ED22116B8F3EBCF03BF952FD1412F8A7 /* Support Files */ = { isa = PBXGroup; children = ( - DE3D895CEB8D8D9876BA0F9346FF9D69 /* Info.plist */, - CC9B184B04C60B80BBEF83595DBE8AF4 /* XRCarouselView.modulemap */, - 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */, - 7437E1C250CA27898AA8815D1117643B /* XRCarouselView-dummy.m */, - 60794CE8C2369C4AA061EE9A931DDFED /* XRCarouselView-prefix.pch */, - 323A41D79693687F0377B9ACACC90D4A /* XRCarouselView-umbrella.h */, + 865E120DE5EA698A2789C2686BC45C7A /* AlamofireImage.modulemap */, + 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */, + 600ABB9AA8054F7B4E851C17D19FCAA0 /* AlamofireImage-dummy.m */, + 770EB1960009D9CCA67CBA11FBC8490A /* AlamofireImage-prefix.pch */, + 9AD53A7A5BDC98AFD3CE8CF1BC407F10 /* AlamofireImage-umbrella.h */, + 00E5D50454806A1FFA39BF7A572D4A37 /* Info.plist */, ); name = "Support Files"; - path = "../Target Support Files/XRCarouselView"; + path = "../Target Support Files/AlamofireImage"; + sourceTree = ""; + }; + F37E800D927B17552826F537A1FC4DE1 /* DZNEmptyDataSet */ = { + isa = PBXGroup; + children = ( + DD324E3E21CD21F91211149384F64690 /* UIScrollView+EmptyDataSet.h */, + 7AC81C76B41B0ABF4E94921ADBA70C30 /* UIScrollView+EmptyDataSet.m */, + D7386CADE4284D284D37C38FDCFCEF63 /* Support Files */, + ); + name = DZNEmptyDataSet; + path = DZNEmptyDataSet; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 0258573883B4A965DF0595F7BF4C1E54 /* Headers */ = { + 0C3C3BE76C79B9728E94463FAF23BAF8 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 604E191C52F306436E51253A4A21589C /* SwiftHash-umbrella.h in Headers */, + B0114B93073F87D24BE99FCEE08CDAE2 /* XRCarouselView-umbrella.h in Headers */, + 98C28E5A4A7CC37A671D4BBAE25EB3CB /* XRCarouselView.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 099CB4115CBACF33248BB7711972A81E /* Headers */ = { + 16845547CA168475331279C504643647 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 6A14BBE1A1C5AFF3B9FCFFCC30685E04 /* Toast-umbrella.h in Headers */, - 9687BE425798E40CBC52870F8009209D /* UIView+Toast.h in Headers */, + 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */, + 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 16845547CA168475331279C504643647 /* Headers */ = { + 3A99AD81C47C25583B8F58920EC0C7EC /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 5E9D11BEACC080376EA6F57C6167B34A /* HandyJSON-umbrella.h in Headers */, - 895952B7EE442E03D667D9565D8C84F4 /* HandyJSON.h in Headers */, + 6C5B6525AD8543CD0EA5382D9B9EBF00 /* SVIndefiniteAnimatedView.h in Headers */, + 7B8F1E3301B7F3D1AF25FDE0E2618647 /* SVProgressAnimatedView.h in Headers */, + E363FB7AFABD373D4D2EB91EEAEAA556 /* SVProgressHUD-umbrella.h in Headers */, + A04DAA4579CD1E21D2161AABB36244C4 /* SVProgressHUD.h in Headers */, + E34A395CCE4DFEB66FE70DC91B6FA149 /* SVRadialGradientLayer.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 653FFE72514B935712D0CE1053D47AD6 /* Headers */ = { + 46C3F69B64D9B3664866FAB0171594A7 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */, - 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */, + 1E2754F17B8625E93745EB87C0E58961 /* Pods-ParentAssistant-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 49214B170416457B16834AFB504DF9B7 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 4214C2FD7E877BAD66B5E69E70D52CC2 /* NSData+ImageContentType.h in Headers */, + 3F16FEA96023ABF8BB9A47112409421A /* SDImageCache.h in Headers */, + B2CC21A9D71EA49F2A55896265CF8E29 /* SDWebImage-umbrella.h in Headers */, + 0D6E3F656916E4C6734BAF1DAB7CAEE7 /* SDWebImageCompat.h in Headers */, + 3B2224950C9D1CE87BA75653DDDD2A13 /* SDWebImageDecoder.h in Headers */, + 930D1C2CE2E4A32830066A7F4240F88F /* SDWebImageDownloader.h in Headers */, + CA6644C7C70AC449F8D9968CA529C381 /* SDWebImageDownloaderOperation.h in Headers */, + 93258C9412DF54DD088A385C2CCC79D1 /* SDWebImageManager.h in Headers */, + 68EF6ACDBEC67DED9ACB63B4CFA05404 /* SDWebImageOperation.h in Headers */, + 357EC08486308022D69F865CBFC53798 /* SDWebImagePrefetcher.h in Headers */, + 92BC60F896B3049AEF17412EE13B32D5 /* UIButton+WebCache.h in Headers */, + 6257B7791953547BB4FD33142C6A4016 /* UIImage+GIF.h in Headers */, + 86DCCE5F06E9EDF67344C60D4859F032 /* UIImage+MultiFormat.h in Headers */, + E96AB8B40C45FF09A9F396DCFD27D1C0 /* UIImageView+HighlightedWebCache.h in Headers */, + 332B3CC48AC35662839D5A89D1FD9C0B /* UIImageView+WebCache.h in Headers */, + B06A3FFD3EBF03FF3166F6E1B0D665F9 /* UIView+WebCacheOperation.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6AEF8DFADC67B16F108F1855C41820B4 /* Headers */ = { + 4A32D4B1A74FEE2326E518DF531B9262 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 46389823D72FA2DA9F4AD34CE119E9FA /* Reachability-umbrella.h in Headers */, - 7D23D4A779C42E695BD2EC80114AD9E8 /* Reachability.h in Headers */, + F9554493CBDF921FEF278972C7FA3221 /* SwiftHash-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7192BFF4C933C30A1A5F53991AABE322 /* Headers */ = { + 653FFE72514B935712D0CE1053D47AD6 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 240CD81B9BDAA551B583A82E3618D560 /* XRCarouselView-umbrella.h in Headers */, - 4A2F8CD414D57920B53208F0F9A39E34 /* XRCarouselView.h in Headers */, + 4C144355E41C99902528AAD3CF069680 /* DZNEmptyDataSet-umbrella.h in Headers */, + 8511E9645F5C2B18746B4B4B29284451 /* UIScrollView+EmptyDataSet.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8FE5C58C0325111F27713A45110DDD2F /* Headers */ = { + 716B553DB26B96E823BC570F96E11E54 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - F206FE65A9D924A3F6ED6221E3BBD35E /* SVIndefiniteAnimatedView.h in Headers */, - A95766E9124B13BABFF00CFBEFEC0501 /* SVProgressAnimatedView.h in Headers */, - 3C69CE7353282718747615DDA9563510 /* SVProgressHUD-umbrella.h in Headers */, - 4A1D23F6526F175FCC2B35539E1B6AD6 /* SVProgressHUD.h in Headers */, - 3D342698F0FA2B9391B7B1733D499623 /* SVRadialGradientLayer.h in Headers */, + D4C68ED144E24084583644C877C41229 /* Reachability-umbrella.h in Headers */, + 9371A6AC1CEABB24E7275AACD3FDC21A /* Reachability.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9842775420762B806F91922E6A2DB1FC /* Headers */ = { + 7BF8D8F75CF7B473D8F3BDEA7AB7C2F5 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - BD14752B5379EAA21AF328A8ABE08A6D /* NSData+ImageContentType.h in Headers */, - B2D8BD6984912C60C7A22BF665987A73 /* SDImageCache.h in Headers */, - 264463742964367E06060C2E85D3EEF4 /* SDWebImage-umbrella.h in Headers */, - 63751EA36B3CCD03BF292C19F6B7C5FE /* SDWebImageCompat.h in Headers */, - 05F1082B0C6E40F76E821D67DFAD9AB5 /* SDWebImageDecoder.h in Headers */, - 2AB8304BE65678C2043856E0F4AAFC9E /* SDWebImageDownloader.h in Headers */, - 0A2126372E9629100B22A44A94E73D71 /* SDWebImageDownloaderOperation.h in Headers */, - 82769877C29A8E71221C9918273D3FFF /* SDWebImageManager.h in Headers */, - 8C1E8307CFE1A73F290CFCE8818B6123 /* SDWebImageOperation.h in Headers */, - EB3F85272BEE4C2EB0321741E8FE4B75 /* SDWebImagePrefetcher.h in Headers */, - A17930AC43F712547C2B4B58C1450B82 /* UIButton+WebCache.h in Headers */, - E49369FF3BD66698C3B61B8DE9C58DE0 /* UIImage+GIF.h in Headers */, - E72FACD066C66E010F4C91956E8E29CB /* UIImage+MultiFormat.h in Headers */, - 46749DE4D7ED1863AFF86DFB519EAAD0 /* UIImageView+HighlightedWebCache.h in Headers */, - BBF90CAC12DA7C2713DB47B3BE5C898C /* UIImageView+WebCache.h in Headers */, - BC9AB82CB1C91977B5C1C96A25A9CA22 /* UIView+WebCacheOperation.h in Headers */, + 4140A49CB0D5F03DD7565AC94796D856 /* Toast-umbrella.h in Headers */, + 06B6D63D2B2E6F2896A15C18097D3730 /* UIView+Toast.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1104,17 +1200,35 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - CB17733CFD076ED5E2BE1AACA72ED979 /* Headers */ = { + EB21FD03B7703901958C3CE43325DAE9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 53926FE56FBF1399E69B9F893ACFBDB1 /* Pods-ParentAssistant-umbrella.h in Headers */, + 32EDA9ED83F4442303A46839027E152E /* AlamofireImage-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 0A4402E270B0A4B00A031931BD805EF1 /* XRCarouselView */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4C801EC31238E6F547E7192FDC9AD054 /* Build configuration list for PBXNativeTarget "XRCarouselView" */; + buildPhases = ( + 836E6AC4CFA56F3A9B9AC5333F4EB303 /* Sources */, + CC88855CE2CDECCE28DB46B1FDBF88B7 /* Frameworks */, + 0C3C3BE76C79B9728E94463FAF23BAF8 /* Headers */, + 3902916FBFDC0C6606E9AFDBFBD7F267 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = XRCarouselView; + productName = XRCarouselView; + productReference = 444E77BBBDD4B2AB34C6742B6752BBCB /* XRCarouselView.framework */; + productType = "com.apple.product-type.framework"; + }; 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */ = { isa = PBXNativeTarget; buildConfigurationList = 184303B9B5FF90B2017E4D0073BC6423 /* Build configuration list for PBXNativeTarget "HandyJSON" */; @@ -1129,171 +1243,172 @@ ); name = HandyJSON; productName = HandyJSON; - productReference = 1719FF827E35476E2C51408C0A9BD81C /* HandyJSON.framework */; + productReference = 110D34637F4EF19C8F46B101A1509ABE /* HandyJSON.framework */; productType = "com.apple.product-type.framework"; }; - 27189F0EDBCA8831C460D0166F6F37A1 /* XRCarouselView */ = { + 37F4E36BECBDD0070D2501E766C0238B /* SDWebImage */ = { isa = PBXNativeTarget; - buildConfigurationList = A4FA017D8C4362BABA6CC461A244CB9D /* Build configuration list for PBXNativeTarget "XRCarouselView" */; + buildConfigurationList = 70F92D3F8B893481FDA768F4EB8E9118 /* Build configuration list for PBXNativeTarget "SDWebImage" */; buildPhases = ( - 583C8401A8273215767A6E78D9832675 /* Sources */, - 158EE653FB0E0E7AF979010BC3A73E13 /* Frameworks */, - 7192BFF4C933C30A1A5F53991AABE322 /* Headers */, - F5D5D2A3D9EE0A5E1C3E82E64D42CDD6 /* Resources */, + BA7C56D0F2745E59EEA82D7E504CAAB3 /* Sources */, + 12D9BD764C2F5E43285530C00A583D52 /* Frameworks */, + 49214B170416457B16834AFB504DF9B7 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = XRCarouselView; - productName = XRCarouselView; - productReference = 09E993E3E47BE7E80DCFECCEA59937CC /* XRCarouselView.framework */; + name = SDWebImage; + productName = SDWebImage; + productReference = 8E2EC639DC31085C2078E4638A61266B /* SDWebImage.framework */; productType = "com.apple.product-type.framework"; }; - 6376DC419EEA98495631602218A4F31B /* SwiftHash */ = { + 3DE44D61FA676CE3B5DFDE6DC058A636 /* Pods-ParentAssistant */ = { isa = PBXNativeTarget; - buildConfigurationList = 3EC2F42A94017DE0B0E897EBD57D8A00 /* Build configuration list for PBXNativeTarget "SwiftHash" */; + buildConfigurationList = 76E43176855F8CE556CB459D4CF15C83 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */; buildPhases = ( - 1B8C7048A91070CF34162BF979720918 /* Sources */, - 2FCA03AB4708FF069C969DAC4ED689A3 /* Frameworks */, - 0258573883B4A965DF0595F7BF4C1E54 /* Headers */, + B0A80FA96AA24569F8AB376B609B0706 /* Sources */, + 6FA848EABA8BCB08AFA8A7CBA0F79DA3 /* Frameworks */, + 46C3F69B64D9B3664866FAB0171594A7 /* Headers */, ); buildRules = ( ); dependencies = ( + AF98B4E6DC1B79AE4FD9FD930B0E2C69 /* PBXTargetDependency */, + 400980F7465C7DCC1DF6E89055AD0B96 /* PBXTargetDependency */, + 0F0709264E6CBE1FC5B2108AFA9A1EBC /* PBXTargetDependency */, + 0B0575AE71362DA3E174564EB6435F59 /* PBXTargetDependency */, + 0271B3B581BEDB99AD2D8A82A7A51FE7 /* PBXTargetDependency */, + C91D8AEA00A921168C007D309B135C5D /* PBXTargetDependency */, + 5088DA9186A8D1DD902822E13A654208 /* PBXTargetDependency */, + 03000FBE28A1D37021A99C22E5DC6577 /* PBXTargetDependency */, + 48DB56871980177AD76344D30AAA6812 /* PBXTargetDependency */, + D7A715C58A0231CE8EF5720E0B2201C5 /* PBXTargetDependency */, ); - name = SwiftHash; - productName = SwiftHash; - productReference = 41009B988332564AFC9DAF9C3817C7FA /* SwiftHash.framework */; + name = "Pods-ParentAssistant"; + productName = "Pods-ParentAssistant"; + productReference = 72C584102060EC4C983B4B76AB4B8C8F /* Pods_ParentAssistant.framework */; productType = "com.apple.product-type.framework"; }; - 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */ = { + 620180280B57A3DF973662E546D211E4 /* Toast */ = { isa = PBXNativeTarget; - buildConfigurationList = 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */; + buildConfigurationList = 1CEF6058AA58F732B5DE35ABEA2BB8C8 /* Build configuration list for PBXNativeTarget "Toast" */; buildPhases = ( - 47AA244DE0C8B2C0F0A585D845356E59 /* Sources */, - 99195E4207764744AEC07ECCBCD550EB /* Frameworks */, - B4002B6E97835FDCCAA5963EFE09A3E0 /* Headers */, + 79932E9ED35709FA36DAA32135866D9D /* Sources */, + 1EA38DA40C4FF7316B10B0C373342222 /* Frameworks */, + 7BF8D8F75CF7B473D8F3BDEA7AB7C2F5 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = Alamofire; - productName = Alamofire; - productReference = E956F54FF76DE5D347505F3AF7694F03 /* Alamofire.framework */; + name = Toast; + productName = Toast; + productReference = 507695995D3D9F4276EAFC4603ABFF54 /* Toast.framework */; productType = "com.apple.product-type.framework"; }; - 89B82C8C6E32CEBE5ACCD75CDFBECBB1 /* Pods-ParentAssistant */ = { + 637267420040487628765A2667620742 /* SVProgressHUD */ = { isa = PBXNativeTarget; - buildConfigurationList = 7700DD54DACF55CC6BABF28FFCAB0179 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */; + buildConfigurationList = FA57B4E379EB61FD555A1581DE341347 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */; buildPhases = ( - 2A36054EE1FDECDCC35954B655C4C237 /* Sources */, - D871485AC7FB55A15B0AC2046B09D62B /* Frameworks */, - CB17733CFD076ED5E2BE1AACA72ED979 /* Headers */, + 7C58861F3C1AEC0E4A32341701B2D521 /* Sources */, + 223B4FF7CBCA930946A68B4E3FF7DEB6 /* Frameworks */, + 3A99AD81C47C25583B8F58920EC0C7EC /* Headers */, + B50F0C15B731FE36879301E18C3056E3 /* Resources */, ); buildRules = ( ); dependencies = ( - 954A722A2C8F32AE6348DAD3CFC2DFE4 /* PBXTargetDependency */, - 02C0DEC84BDA70532ADA225A5A2A3304 /* PBXTargetDependency */, - 9D4E5F870098A82524B3E139E921E49C /* PBXTargetDependency */, - 65D67D71AAC210DB47EAC622F7FA69B9 /* PBXTargetDependency */, - 91447221DA6C2FBBF7167A4B974044D2 /* PBXTargetDependency */, - BBA7098DD5EA0680F81007C50C09B686 /* PBXTargetDependency */, - 59040B7DE59B45C468C5A827B43DF38A /* PBXTargetDependency */, - F54C3AB44B6273AFC143292EBABDE7C4 /* PBXTargetDependency */, - E82DBF544557B801D7515E53ABBE9C31 /* PBXTargetDependency */, ); - name = "Pods-ParentAssistant"; - productName = "Pods-ParentAssistant"; - productReference = B88D8470A1A1E4F507B1E9895B074253 /* Pods_ParentAssistant.framework */; + name = SVProgressHUD; + productName = SVProgressHUD; + productReference = 344E5051853CBAE87166BAA69476DDB1 /* SVProgressHUD.framework */; productType = "com.apple.product-type.framework"; }; - 8FA4EA707F3B6CFDACB1C85C722D2E73 /* SDWebImage */ = { + 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */ = { isa = PBXNativeTarget; - buildConfigurationList = 4B18822C8ECAB5D855CCE64E74C621EB /* Build configuration list for PBXNativeTarget "SDWebImage" */; + buildConfigurationList = 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */; buildPhases = ( - 6A550F80A385350F20B576B15B31547E /* Sources */, - E44680339038F2F0730AF783DAEFFCB6 /* Frameworks */, - 9842775420762B806F91922E6A2DB1FC /* Headers */, + 47AA244DE0C8B2C0F0A585D845356E59 /* Sources */, + 99195E4207764744AEC07ECCBCD550EB /* Frameworks */, + B4002B6E97835FDCCAA5963EFE09A3E0 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = SDWebImage; - productName = SDWebImage; - productReference = CE1C92985D9321104698E3AFAF68594E /* SDWebImage.framework */; + name = Alamofire; + productName = Alamofire; + productReference = 937EE30FD85AB8EED4F8467502DD290F /* Alamofire.framework */; productType = "com.apple.product-type.framework"; }; - 9A9DDC64623B3F5E6DC7009C16752B95 /* Toast */ = { + 9EFE4C70245EE2857D336B8B9FA4E825 /* AlamofireImage */ = { isa = PBXNativeTarget; - buildConfigurationList = F11A26D3E7766CBBD820DCD66B6FC321 /* Build configuration list for PBXNativeTarget "Toast" */; + buildConfigurationList = 01F2198AF9DCCF3700AE9DD21E64D480 /* Build configuration list for PBXNativeTarget "AlamofireImage" */; buildPhases = ( - F437D84355ADAD46DE352A42EFA6A50A /* Sources */, - 46A2C828E74BB80E0DE22F9A57D702B2 /* Frameworks */, - 099CB4115CBACF33248BB7711972A81E /* Headers */, + 89780FCE56CA2BB731B3A99F5FC88440 /* Sources */, + BF98FBBDC964E0CC738F6B323B4C1BB8 /* Frameworks */, + EB21FD03B7703901958C3CE43325DAE9 /* Headers */, ); buildRules = ( ); dependencies = ( + 8937A2057A0DAADF003B7C65E7CE115D /* PBXTargetDependency */, ); - name = Toast; - productName = Toast; - productReference = A59A469B0852E07D2428D72E4C62B1E7 /* Toast.framework */; + name = AlamofireImage; + productName = AlamofireImage; + productReference = B9806961B1DB01F087677787DFCC6CE0 /* AlamofireImage.framework */; productType = "com.apple.product-type.framework"; }; - AAC4087A5A57F5566AB9B54FEBADBC36 /* Reachability */ = { + A0A5E57D4BB5AA2602B591D713407086 /* SwiftHash */ = { isa = PBXNativeTarget; - buildConfigurationList = 5AD50E3B4812FC9FAE4961CBCA56B874 /* Build configuration list for PBXNativeTarget "Reachability" */; + buildConfigurationList = 58F24DE1FC95F96D43F56B9CC6D0B926 /* Build configuration list for PBXNativeTarget "SwiftHash" */; buildPhases = ( - FA661C521ABA5EDB2937799E80C70EC2 /* Sources */, - EBA80D6B1394A46D45B033AB75657E91 /* Frameworks */, - 6AEF8DFADC67B16F108F1855C41820B4 /* Headers */, + 7376B1A2F80BE300C4F12BD1B8DB3418 /* Sources */, + 62158AC2B12F4A1FA191B1DD22989FE1 /* Frameworks */, + 4A32D4B1A74FEE2326E518DF531B9262 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = Reachability; - productName = Reachability; - productReference = 5C3FCED1EF014BDAA42DACC871E2516A /* Reachability.framework */; + name = SwiftHash; + productName = SwiftHash; + productReference = 52303324A62AD0B74F2DD46E74D232EB /* SwiftHash.framework */; productType = "com.apple.product-type.framework"; }; - D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */ = { + CE1092398200ECC7DE7468626D1D0B98 /* Reachability */ = { isa = PBXNativeTarget; - buildConfigurationList = AC2CBCE24382919CB3DBFC8BB3CC6503 /* Build configuration list for PBXNativeTarget "DZNEmptyDataSet" */; + buildConfigurationList = C3C11F185D4F7CF61CB8BBE64492631D /* Build configuration list for PBXNativeTarget "Reachability" */; buildPhases = ( - 82133C5570CF5246210CB90DB6D6558B /* Sources */, - 59E0885EF9D269547F22DB9E026FB793 /* Frameworks */, - 653FFE72514B935712D0CE1053D47AD6 /* Headers */, + C3136CF9BAFDECBEB2E6A9CCD8BECDAE /* Sources */, + 56B1A45788A7E3C5C89C92256F33AE24 /* Frameworks */, + 716B553DB26B96E823BC570F96E11E54 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = DZNEmptyDataSet; - productName = DZNEmptyDataSet; - productReference = DD0E89B8C1439B9F5FDB39EA0232B3EA /* DZNEmptyDataSet.framework */; + name = Reachability; + productName = Reachability; + productReference = 95CAD531E474553E7D52B95131219D1A /* Reachability.framework */; productType = "com.apple.product-type.framework"; }; - E55BDEBC8F73D6B7936791D0822F70D6 /* SVProgressHUD */ = { + D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */ = { isa = PBXNativeTarget; - buildConfigurationList = EAC632F2AAB82F696A1E5C88D53A883E /* Build configuration list for PBXNativeTarget "SVProgressHUD" */; + buildConfigurationList = AC2CBCE24382919CB3DBFC8BB3CC6503 /* Build configuration list for PBXNativeTarget "DZNEmptyDataSet" */; buildPhases = ( - 1965A36474F1989545B82D09EC945BE8 /* Sources */, - A115DC87278A31F6B371DA2C1AF9CD02 /* Frameworks */, - 8FE5C58C0325111F27713A45110DDD2F /* Headers */, - B5487BE37E5D2B17C0D915B89665B3F5 /* Resources */, + 82133C5570CF5246210CB90DB6D6558B /* Sources */, + 59E0885EF9D269547F22DB9E026FB793 /* Frameworks */, + 653FFE72514B935712D0CE1053D47AD6 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = SVProgressHUD; - productName = SVProgressHUD; - productReference = 33F1F6213579E70C284C8445EBD7DBDD /* SVProgressHUD.framework */; + name = DZNEmptyDataSet; + productName = DZNEmptyDataSet; + productReference = 7C9D89FB057D8F2ECBB232C7A81EF4B5 /* DZNEmptyDataSet.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -1313,74 +1428,45 @@ en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = 9CE129D1A72CFA1DEF6F85FBF1B37E5B /* Products */; + productRefGroup = 3A24F7BBB5CB0025CF2072B4FB964C24 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */, + 9EFE4C70245EE2857D336B8B9FA4E825 /* AlamofireImage */, D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */, 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */, - 89B82C8C6E32CEBE5ACCD75CDFBECBB1 /* Pods-ParentAssistant */, - AAC4087A5A57F5566AB9B54FEBADBC36 /* Reachability */, - 8FA4EA707F3B6CFDACB1C85C722D2E73 /* SDWebImage */, - E55BDEBC8F73D6B7936791D0822F70D6 /* SVProgressHUD */, - 6376DC419EEA98495631602218A4F31B /* SwiftHash */, - 9A9DDC64623B3F5E6DC7009C16752B95 /* Toast */, - 27189F0EDBCA8831C460D0166F6F37A1 /* XRCarouselView */, + 3DE44D61FA676CE3B5DFDE6DC058A636 /* Pods-ParentAssistant */, + CE1092398200ECC7DE7468626D1D0B98 /* Reachability */, + 37F4E36BECBDD0070D2501E766C0238B /* SDWebImage */, + 637267420040487628765A2667620742 /* SVProgressHUD */, + A0A5E57D4BB5AA2602B591D713407086 /* SwiftHash */, + 620180280B57A3DF973662E546D211E4 /* Toast */, + 0A4402E270B0A4B00A031931BD805EF1 /* XRCarouselView */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - B5487BE37E5D2B17C0D915B89665B3F5 /* Resources */ = { + 3902916FBFDC0C6606E9AFDBFBD7F267 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - B575E905525EDD3311A9872A0C4307AD /* SVProgressHUD.bundle in Resources */, + ECE9CADAD4EB77DEC8B08FD74D6DD3BE /* XRPlaceholder.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - F5D5D2A3D9EE0A5E1C3E82E64D42CDD6 /* Resources */ = { + B50F0C15B731FE36879301E18C3056E3 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 603F9D0686CE005205D389C1E4C6072A /* XRPlaceholder.png in Resources */, + 945146A0826BB693F1B9496A0620A97F /* SVProgressHUD.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 1965A36474F1989545B82D09EC945BE8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - E990A247D80417D4555735E8A8DBD76C /* SVIndefiniteAnimatedView.m in Sources */, - 0C4EA35F79172E81D6BF56A2FC856ED8 /* SVProgressAnimatedView.m in Sources */, - AB6A5752C4586385EE13F1E6E2E9F40E /* SVProgressHUD-dummy.m in Sources */, - F79EC3C3CF96DFC885E8DD247FEF08EB /* SVProgressHUD.m in Sources */, - 86930F980FA87FB0CA5E197FEAA7A90C /* SVRadialGradientLayer.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1B8C7048A91070CF34162BF979720918 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 794B16FD139EB13BA49AE711C49135BB /* MD5.swift in Sources */, - 90B1C77BB42755C3E9AC821A09526E53 /* SHA1.swift in Sources */, - D603EC0AAE41B1733F0A4A2FA4381910 /* SwiftHash-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2A36054EE1FDECDCC35954B655C4C237 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6694F9A05D6A58C5C27935913BF8AE56 /* Pods-ParentAssistant-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 47AA244DE0C8B2C0F0A585D845356E59 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1406,34 +1492,34 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 583C8401A8273215767A6E78D9832675 /* Sources */ = { + 7376B1A2F80BE300C4F12BD1B8DB3418 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C4DC2D005B7A1313DF98AFF23E15D1B3 /* MD5.swift in Sources */, + B58BEA72F3BC139D3784844F73AA791F /* SHA1.swift in Sources */, + CB5529FBDB9ED31E939EFD0EF7D8EBE3 /* SwiftHash-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 79932E9ED35709FA36DAA32135866D9D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A8D327620CE1909AD98F6B239AA60018 /* XRCarouselView-dummy.m in Sources */, - 3DD10D4C59666719E941A5D0EB5D9582 /* XRCarouselView.m in Sources */, + DC9317C7F961BB389FA7ECC2260B08F0 /* Toast-dummy.m in Sources */, + 5D287B058202AFDA4DED5D49B6ED0A1E /* UIView+Toast.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6A550F80A385350F20B576B15B31547E /* Sources */ = { + 7C58861F3C1AEC0E4A32341701B2D521 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 17F8D48B0736FD13AC59D9311C074E9D /* NSData+ImageContentType.m in Sources */, - BF901FE99C862B2093FF8E2F71B80F93 /* SDImageCache.m in Sources */, - 27813DC0914AD972436022C87454185F /* SDWebImage-dummy.m in Sources */, - 7AC13BF7B3C538D94DE7B9D836786514 /* SDWebImageCompat.m in Sources */, - D1D5D64268DDC619511D3942F434D7DD /* SDWebImageDecoder.m in Sources */, - 1C39565C535B7D534368C5DFB46659B5 /* SDWebImageDownloader.m in Sources */, - F1A921225B642E15ED24FB4734240F8F /* SDWebImageDownloaderOperation.m in Sources */, - 38BC499B109AEBC02AD6C88AB2ED057D /* SDWebImageManager.m in Sources */, - 6C3C226E0B46AFC4FD756BA6C5D9414E /* SDWebImagePrefetcher.m in Sources */, - 170AB456D9F3C346DCF407E42D84B5D5 /* UIButton+WebCache.m in Sources */, - C633AE7C1F16ADA3AFEE968396B73A4B /* UIImage+GIF.m in Sources */, - BD2E6B5D9C3C38D8C1BDCFE0CD6E489D /* UIImage+MultiFormat.m in Sources */, - C8D2BE872D244EB549F2EC97069CC4D0 /* UIImageView+HighlightedWebCache.m in Sources */, - A7B5C0EE248855B3357C98A489F835D9 /* UIImageView+WebCache.m in Sources */, - BA3AB9E7766B254534C357EB523687B6 /* UIView+WebCacheOperation.m in Sources */, + 56815D1138F9669E37F2004119169267 /* SVIndefiniteAnimatedView.m in Sources */, + A24D31929B67BB4D0EED65AA74C0E3F9 /* SVProgressAnimatedView.m in Sources */, + 33FCBEF6884A33B921FEC6A9511B8E20 /* SVProgressHUD-dummy.m in Sources */, + BBC827F8711B46CA8FC3854C99DF703A /* SVProgressHUD.m in Sources */, + 1F4FA4B67BA7582CA193404E3510B095 /* SVRadialGradientLayer.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1446,6 +1532,71 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 836E6AC4CFA56F3A9B9AC5333F4EB303 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4FAADAA79CF5A8371B74578A2EC10761 /* XRCarouselView-dummy.m in Sources */, + 980154A8EB800AAF627251C8AAD7EAA9 /* XRCarouselView.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 89780FCE56CA2BB731B3A99F5FC88440 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FF0007F0502C85600F98BC8E62F739D2 /* AFIError.swift in Sources */, + 18FE70ED14474EE6A49E85DE9C5E4C17 /* AlamofireImage-dummy.m in Sources */, + 60E47009DC055C6C140154BC96B5C58C /* Image.swift in Sources */, + F254CF02931202CD44537EAD61D27BE8 /* ImageCache.swift in Sources */, + 9D9717AC018F075F378E52B078CDBFB5 /* ImageDownloader.swift in Sources */, + 9E686D93A33DD9756B0C21B68BD7D758 /* ImageFilter.swift in Sources */, + 9DBB6831E79F70D2E8C4DFD169E228E2 /* Request+AlamofireImage.swift in Sources */, + A133EAE3F50C55B4E1A03A5F9D6B3A4B /* UIButton+AlamofireImage.swift in Sources */, + 85B4114292AEC3C6DCD2F9500A064F9B /* UIImage+AlamofireImage.swift in Sources */, + 36840E12F93D5E0D201B1D998B96EEB9 /* UIImageView+AlamofireImage.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B0A80FA96AA24569F8AB376B609B0706 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CBFDD17FED69C5F001648B331CE5FDDE /* Pods-ParentAssistant-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BA7C56D0F2745E59EEA82D7E504CAAB3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 189863C7E2504923687D78D7B081F8CA /* NSData+ImageContentType.m in Sources */, + 5D8FA1EAFFDA438C0D3E909D54D6E657 /* SDImageCache.m in Sources */, + 80AF024EF162F4FB88CCAAA2FA6FAAD5 /* SDWebImage-dummy.m in Sources */, + 2EA01E4E252B14F7953C56C100482236 /* SDWebImageCompat.m in Sources */, + 1A34F151BC19E9D0725C689FC1038209 /* SDWebImageDecoder.m in Sources */, + 29B1FA33CD27E5CAEC884DA6D0072CFC /* SDWebImageDownloader.m in Sources */, + 3D34EECD1D7C0DC13F3E19C4C74F212E /* SDWebImageDownloaderOperation.m in Sources */, + 53591DA77C42B53EB9AB3060008F41B6 /* SDWebImageManager.m in Sources */, + 9FC9BC048B02CFF720B9CFBE4DC80264 /* SDWebImagePrefetcher.m in Sources */, + 638A8C8931AA82B35E4165A32BDEF8CA /* UIButton+WebCache.m in Sources */, + 59145DFC87F4E74844E76619E8C4114D /* UIImage+GIF.m in Sources */, + 3D0142A71F210A641528761123C4F1C2 /* UIImage+MultiFormat.m in Sources */, + E90F4E9FD8EA1D01B118497ACBB199D8 /* UIImageView+HighlightedWebCache.m in Sources */, + 3A9E64415250045D18CD329DE4776D9A /* UIImageView+WebCache.m in Sources */, + 5D0701D0FA9726E83C52A53F4BEAD02B /* UIView+WebCacheOperation.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C3136CF9BAFDECBEB2E6A9CCD8BECDAE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D22AD2613455598A94BFCCA33AA9B2CE /* Reachability-dummy.m in Sources */, + 666A863EA9B0A00CA5EDDB4C96EA014B /* Reachability.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EE0067F8658DBC2B557D26C46C0796CA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1486,87 +1637,81 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F437D84355ADAD46DE352A42EFA6A50A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CAD7174B4833082EAE9507FB4CDCB07B /* Toast-dummy.m in Sources */, - 44E9442A5B676A7E4941C47EB6C49C9F /* UIView+Toast.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FA661C521ABA5EDB2937799E80C70EC2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8B937C355B5CAAEC40B80F24AFA26569 /* Reachability-dummy.m in Sources */, - 0203C16E98AD37E5A0C596D1B39C5119 /* Reachability.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 02C0DEC84BDA70532ADA225A5A2A3304 /* PBXTargetDependency */ = { + 0271B3B581BEDB99AD2D8A82A7A51FE7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Reachability; + target = CE1092398200ECC7DE7468626D1D0B98 /* Reachability */; + targetProxy = C3177531DBE096BDE468C9291366B775 /* PBXContainerItemProxy */; + }; + 03000FBE28A1D37021A99C22E5DC6577 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SwiftHash; + target = A0A5E57D4BB5AA2602B591D713407086 /* SwiftHash */; + targetProxy = 4B6C29399AB72BDC0DC80584EC3BD333 /* PBXContainerItemProxy */; + }; + 0B0575AE71362DA3E174564EB6435F59 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = HandyJSON; + target = 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */; + targetProxy = 189D44E9EA4F94C8EC2EBCD3B9A94437 /* PBXContainerItemProxy */; + }; + 0F0709264E6CBE1FC5B2108AFA9A1EBC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = DZNEmptyDataSet; target = D386C75EFD4F03725E4EFB866B600B9A /* DZNEmptyDataSet */; - targetProxy = 40A6BB26078AD6CC3BFED24490AA679C /* PBXContainerItemProxy */; + targetProxy = 1DC0B6708B1B4007743DC8E966822305 /* PBXContainerItemProxy */; }; - 59040B7DE59B45C468C5A827B43DF38A /* PBXTargetDependency */ = { + 400980F7465C7DCC1DF6E89055AD0B96 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SwiftHash; - target = 6376DC419EEA98495631602218A4F31B /* SwiftHash */; - targetProxy = 14508FFAEE6EBD1C2386229671393CCD /* PBXContainerItemProxy */; + name = AlamofireImage; + target = 9EFE4C70245EE2857D336B8B9FA4E825 /* AlamofireImage */; + targetProxy = 4AE51A1942CC8930F7A20592BF7BC9CB /* PBXContainerItemProxy */; }; - 65D67D71AAC210DB47EAC622F7FA69B9 /* PBXTargetDependency */ = { + 48DB56871980177AD76344D30AAA6812 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Reachability; - target = AAC4087A5A57F5566AB9B54FEBADBC36 /* Reachability */; - targetProxy = 82A515E1EF9A2DA9422FDE7D829F0650 /* PBXContainerItemProxy */; + name = Toast; + target = 620180280B57A3DF973662E546D211E4 /* Toast */; + targetProxy = 9554361F88EB7FDE40F109D073B49910 /* PBXContainerItemProxy */; }; - 91447221DA6C2FBBF7167A4B974044D2 /* PBXTargetDependency */ = { + 5088DA9186A8D1DD902822E13A654208 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SDWebImage; - target = 8FA4EA707F3B6CFDACB1C85C722D2E73 /* SDWebImage */; - targetProxy = 1F4310C891A7C6531B2EC2F44755F5D2 /* PBXContainerItemProxy */; + name = SVProgressHUD; + target = 637267420040487628765A2667620742 /* SVProgressHUD */; + targetProxy = CA2DE504A4CA7EA9E0FBEE6863FE1B71 /* PBXContainerItemProxy */; }; - 954A722A2C8F32AE6348DAD3CFC2DFE4 /* PBXTargetDependency */ = { + 8937A2057A0DAADF003B7C65E7CE115D /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Alamofire; target = 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */; - targetProxy = A81D9D0AD4D99710674892A4C13CE7C4 /* PBXContainerItemProxy */; + targetProxy = A1758AA696D56310AA192B587162169A /* PBXContainerItemProxy */; }; - 9D4E5F870098A82524B3E139E921E49C /* PBXTargetDependency */ = { + AF98B4E6DC1B79AE4FD9FD930B0E2C69 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = HandyJSON; - target = 1465651EBBC44AD3276DDE2476CDA450 /* HandyJSON */; - targetProxy = EE8B3E8B9AA89EC765C0E539B4E7EDC7 /* PBXContainerItemProxy */; + name = Alamofire; + target = 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */; + targetProxy = B52B9C3E170467E0CA53E1CF539F3C3C /* PBXContainerItemProxy */; }; - BBA7098DD5EA0680F81007C50C09B686 /* PBXTargetDependency */ = { + C91D8AEA00A921168C007D309B135C5D /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SVProgressHUD; - target = E55BDEBC8F73D6B7936791D0822F70D6 /* SVProgressHUD */; - targetProxy = 8EE514F180AE8F72FA2CB958642AC2D2 /* PBXContainerItemProxy */; + name = SDWebImage; + target = 37F4E36BECBDD0070D2501E766C0238B /* SDWebImage */; + targetProxy = 38E587F9ED2E7A43122E76199C12388D /* PBXContainerItemProxy */; }; - E82DBF544557B801D7515E53ABBE9C31 /* PBXTargetDependency */ = { + D7A715C58A0231CE8EF5720E0B2201C5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = XRCarouselView; - target = 27189F0EDBCA8831C460D0166F6F37A1 /* XRCarouselView */; - targetProxy = 594A8718DA74EC137A691ED506FE6CCB /* PBXContainerItemProxy */; - }; - F54C3AB44B6273AFC143292EBABDE7C4 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Toast; - target = 9A9DDC64623B3F5E6DC7009C16752B95 /* Toast */; - targetProxy = 8E7E6D806A10070D238FC81F6BAB4860 /* PBXContainerItemProxy */; + target = 0A4402E270B0A4B00A031931BD805EF1 /* XRCarouselView */; + targetProxy = 4EDB1BF0F4A9280D81BBE57A53DD7917 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 1456973998A5F20B4501A680D3794F6A /* Release */ = { + 0C3F011A578A68CF86694EAD254E6E23 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */; + baseConfigurationReference = 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1577,27 +1722,27 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/DZNEmptyDataSet/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet.modulemap"; - PRODUCT_NAME = DZNEmptyDataSet; + MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap"; + PRODUCT_NAME = SwiftHash; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 205040859FD37102CD356142F35D96D4 /* Debug */ = { + 11480927D0D767066580AF486506DDA6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6EB59F100C77215BCBB4FAD12F0FF358 /* Pods-ParentAssistant.debug.xcconfig */; + baseConfigurationReference = 2A58122C4E55BBB959E9F3D985E070AB /* SwiftHash.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1608,30 +1753,28 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ParentAssistant; + MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap"; + PRODUCT_NAME = SwiftHash; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 20A33051E49990EF2F5D75016374151E /* Release */ = { + 1456973998A5F20B4501A680D3794F6A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */; + baseConfigurationReference = 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1642,13 +1785,13 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Reachability/Reachability-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Reachability/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/DZNEmptyDataSet/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Reachability/Reachability.modulemap"; - PRODUCT_NAME = Reachability; + MODULEMAP_FILE = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet.modulemap"; + PRODUCT_NAME = DZNEmptyDataSet; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -1660,9 +1803,9 @@ }; name = Release; }; - 215A480FCE0C128FA2F4C2A2882BBE23 /* Debug */ = { + 1C5DAB39976688A93021E071A70593C0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */; + baseConfigurationReference = 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1673,26 +1816,28 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Toast/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/AlamofireImage/AlamofireImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AlamofireImage/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap"; - PRODUCT_NAME = Toast; + MODULEMAP_FILE = "Target Support Files/AlamofireImage/AlamofireImage.modulemap"; + PRODUCT_NAME = AlamofireImage; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 2386F65ABDB52652A92CBEE14C73BA07 /* Debug */ = { + 1F40ECCA7544B21AE3F93FCA732FF525 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */; + baseConfigurationReference = 77EFE064376F26AEED2B1971235A88EF /* Pods-ParentAssistant.release.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1703,26 +1848,30 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap"; - PRODUCT_NAME = XRCarouselView; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_ParentAssistant; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 4.0; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 2399E3FF594AB08E0DAC9484992C0F91 /* Release */ = { + 1F859CD6F320ED91E304126AE9B41213 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */; + baseConfigurationReference = D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1733,24 +1882,22 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap"; - PRODUCT_NAME = SwiftHash; + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + PRODUCT_NAME = SDWebImage; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; 26F954BA177A9A46FFFD4E23ED11D67A /* Release */ = { isa = XCBuildConfiguration; @@ -1810,9 +1957,9 @@ }; name = Release; }; - 3D9BEB881A70984931EB7B52EB42D89C /* Debug */ = { + 2DA5E368920A110F6198A53CE954D348 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */; + baseConfigurationReference = D9320E1CCD06A69A623CACF8D469F5FD /* SDWebImage.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1823,26 +1970,27 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap"; - PRODUCT_NAME = SVProgressHUD; + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + PRODUCT_NAME = SDWebImage; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 51211605D5BBC568B59C86BC410917A5 /* Release */ = { + 48B91C10F0EB0CF2F5206AB95226AC0E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 43766E6C5ADEB0502C1E3C6049C5D9AC /* SVProgressHUD.xcconfig */; + baseConfigurationReference = 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1853,27 +2001,26 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Toast/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap"; - PRODUCT_NAME = SVProgressHUD; + MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap"; + PRODUCT_NAME = Toast; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 601BFB40515FF6C016B5850C2D905027 /* Release */ = { + 5D34B066ADCE4D5A36DAF77492279C57 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 77EFE064376F26AEED2B1971235A88EF /* Pods-ParentAssistant.release.xcconfig */; + baseConfigurationReference = C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1884,30 +2031,26 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ParentAssistant; + MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap"; + PRODUCT_NAME = SVProgressHUD; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 68EC31FD5ED5128B6144732DB7C7AEAA /* Release */ = { + 751B90BBDF8E0306B9FEBD3AFC3D32D5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */; + baseConfigurationReference = 187D5302F110245F1D24D217827BFBC1 /* AlamofireImage.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1918,28 +2061,27 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/AlamofireImage/AlamofireImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AlamofireImage/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; - PRODUCT_NAME = Alamofire; + MODULEMAP_FILE = "Target Support Files/AlamofireImage/AlamofireImage.modulemap"; + PRODUCT_NAME = AlamofireImage; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; 793948A7CE88FCA234DA7EFD60D4178E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 328C2C3F0CBE7948196AEE1B0FA7B3F4 /* DZNEmptyDataSet.xcconfig */; + baseConfigurationReference = 1BF83289F3929832EC0ED8E333158C69 /* DZNEmptyDataSet.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1967,9 +2109,9 @@ }; name = Debug; }; - 8056BF0CAA9260FAFEF0C71AA27ED129 /* Debug */ = { + 8F127F4A0150651E07D4FA5346BC4AAC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EA6D07581B965169F4C036A600CF86BB /* Alamofire.xcconfig */; + baseConfigurationReference = C746EF0B8C90559C66A538F15D8EBAAF /* SVProgressHUD.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1980,27 +2122,27 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; - PRODUCT_NAME = Alamofire; + MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap"; + PRODUCT_NAME = SVProgressHUD; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 83018C328C9420EE22D60BC4FC7C261D /* Debug */ = { + AF7FFDF24A1E00A55FA53123567E434F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4357F76011180D7A84AB5281135FBC76 /* Reachability.xcconfig */; + baseConfigurationReference = 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2028,9 +2170,9 @@ }; name = Debug; }; - 8C67AFC68147451E22867E04C2F78264 /* Debug */ = { + B0F5F1530D3F4E518BE2B1A52F98487A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */; + baseConfigurationReference = 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2041,16 +2183,17 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; - PRODUCT_NAME = SDWebImage; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + PRODUCT_NAME = Alamofire; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -2058,9 +2201,9 @@ }; name = Debug; }; - A8F73C58AFDC02718271B7541ABA62EF /* Release */ = { + B8CA02655A4B738D82484691EE8CA58F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3813A00560E8E809CF107BA098D6A666 /* Toast.xcconfig */; + baseConfigurationReference = 950B05ADF5C9C81AF940E6DFFABE4DB9 /* Alamofire.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2071,16 +2214,17 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Toast/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap"; - PRODUCT_NAME = Toast; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + PRODUCT_NAME = Alamofire; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -2089,9 +2233,9 @@ }; name = Release; }; - C86EB4C0D42E7F340560C1573F6E52EF /* Release */ = { + BC0919D3961516E30D282E56DF28529F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AC7C53CF4231A641CE59A3CD5991C5C1 /* SDWebImage.xcconfig */; + baseConfigurationReference = 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2102,13 +2246,74 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; - PRODUCT_NAME = SDWebImage; + MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap"; + PRODUCT_NAME = XRCarouselView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + BD00D4A34DF117B5E5F247BF620396C1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8EC8A0BF26B3414588BF92C66234FD4B /* XRCarouselView.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap"; + PRODUCT_NAME = XRCarouselView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + DAB4CB471D45F527FCD1AE1F7006EE78 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9741F11BA31165953D6A9744F073FF08 /* Toast.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Toast/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap"; + PRODUCT_NAME = Toast; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -2122,7 +2327,7 @@ }; DAE72FF2FFE8166FA938EB388ABBC2B5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */; + baseConfigurationReference = C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2151,6 +2356,37 @@ }; name = Debug; }; + E03AFDCBB7483B6A565534D24BB1484D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7ED5CEE60A46EFCFCE43D1A6C52D3869 /* Reachability.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Reachability/Reachability-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Reachability/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Reachability/Reachability.modulemap"; + PRODUCT_NAME = Reachability; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; E2BF6D6731C31DE69900B7B24E6F0445 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2214,41 +2450,9 @@ }; name = Debug; }; - ECB5142D4DABB45B92371C51B3EB61F8 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6F37849A9F05E24161217B664F776F12 /* HandyJSON.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/HandyJSON/HandyJSON-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/HandyJSON/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/HandyJSON/HandyJSON.modulemap"; - PRODUCT_NAME = HandyJSON; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - EF0EA84D551F1A4F1232F2684FE87AD0 /* Debug */ = { + E658282DB2599CAD5F6CC833DE3425F9 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BF1709B1277BE62B09381A0534563DE2 /* SwiftHash.xcconfig */; + baseConfigurationReference = 6EB59F100C77215BCBB4FAD12F0FF358 /* Pods-ParentAssistant.debug.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2259,27 +2463,30 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SwiftHash/SwiftHash-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SwiftHash/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ParentAssistant/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SwiftHash/SwiftHash.modulemap"; - PRODUCT_NAME = SwiftHash; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_ParentAssistant; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - F9A4D3888E109251ADAC60180BC1B773 /* Release */ = { + ECB5142D4DABB45B92371C51B3EB61F8 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 87D16ABF7E5F8A01191A86657C5C16BA /* XRCarouselView.xcconfig */; + baseConfigurationReference = C6D4C38A8515FAAD57E78A742F0EB73A /* HandyJSON.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2290,16 +2497,17 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/XRCarouselView/XRCarouselView-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/XRCarouselView/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/HandyJSON/HandyJSON-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/HandyJSON/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/XRCarouselView/XRCarouselView.modulemap"; - PRODUCT_NAME = XRCarouselView; + MODULEMAP_FILE = "Target Support Files/HandyJSON/HandyJSON.modulemap"; + PRODUCT_NAME = HandyJSON; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -2311,6 +2519,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 01F2198AF9DCCF3700AE9DD21E64D480 /* Build configuration list for PBXNativeTarget "AlamofireImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 751B90BBDF8E0306B9FEBD3AFC3D32D5 /* Debug */, + 1C5DAB39976688A93021E071A70593C0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 184303B9B5FF90B2017E4D0073BC6423 /* Build configuration list for PBXNativeTarget "HandyJSON" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -2320,20 +2537,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + 1CEF6058AA58F732B5DE35ABEA2BB8C8 /* Build configuration list for PBXNativeTarget "Toast" */ = { isa = XCConfigurationList; buildConfigurations = ( - E2BF6D6731C31DE69900B7B24E6F0445 /* Debug */, - 26F954BA177A9A46FFFD4E23ED11D67A /* Release */, + 48B91C10F0EB0CF2F5206AB95226AC0E /* Debug */, + DAB4CB471D45F527FCD1AE1F7006EE78 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 3EC2F42A94017DE0B0E897EBD57D8A00 /* Build configuration list for PBXNativeTarget "SwiftHash" */ = { + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - EF0EA84D551F1A4F1232F2684FE87AD0 /* Debug */, - 2399E3FF594AB08E0DAC9484992C0F91 /* Release */, + E2BF6D6731C31DE69900B7B24E6F0445 /* Debug */, + 26F954BA177A9A46FFFD4E23ED11D67A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2341,44 +2558,44 @@ 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8056BF0CAA9260FAFEF0C71AA27ED129 /* Debug */, - 68EC31FD5ED5128B6144732DB7C7AEAA /* Release */, + B0F5F1530D3F4E518BE2B1A52F98487A /* Debug */, + B8CA02655A4B738D82484691EE8CA58F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4B18822C8ECAB5D855CCE64E74C621EB /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { + 4C801EC31238E6F547E7192FDC9AD054 /* Build configuration list for PBXNativeTarget "XRCarouselView" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8C67AFC68147451E22867E04C2F78264 /* Debug */, - C86EB4C0D42E7F340560C1573F6E52EF /* Release */, + BD00D4A34DF117B5E5F247BF620396C1 /* Debug */, + BC0919D3961516E30D282E56DF28529F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5AD50E3B4812FC9FAE4961CBCA56B874 /* Build configuration list for PBXNativeTarget "Reachability" */ = { + 58F24DE1FC95F96D43F56B9CC6D0B926 /* Build configuration list for PBXNativeTarget "SwiftHash" */ = { isa = XCConfigurationList; buildConfigurations = ( - 83018C328C9420EE22D60BC4FC7C261D /* Debug */, - 20A33051E49990EF2F5D75016374151E /* Release */, + 0C3F011A578A68CF86694EAD254E6E23 /* Debug */, + 11480927D0D767066580AF486506DDA6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 7700DD54DACF55CC6BABF28FFCAB0179 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */ = { + 70F92D3F8B893481FDA768F4EB8E9118 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { isa = XCConfigurationList; buildConfigurations = ( - 205040859FD37102CD356142F35D96D4 /* Debug */, - 601BFB40515FF6C016B5850C2D905027 /* Release */, + 1F859CD6F320ED91E304126AE9B41213 /* Debug */, + 2DA5E368920A110F6198A53CE954D348 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A4FA017D8C4362BABA6CC461A244CB9D /* Build configuration list for PBXNativeTarget "XRCarouselView" */ = { + 76E43176855F8CE556CB459D4CF15C83 /* Build configuration list for PBXNativeTarget "Pods-ParentAssistant" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2386F65ABDB52652A92CBEE14C73BA07 /* Debug */, - F9A4D3888E109251ADAC60180BC1B773 /* Release */, + E658282DB2599CAD5F6CC833DE3425F9 /* Debug */, + 1F40ECCA7544B21AE3F93FCA732FF525 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2392,20 +2609,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - EAC632F2AAB82F696A1E5C88D53A883E /* Build configuration list for PBXNativeTarget "SVProgressHUD" */ = { + C3C11F185D4F7CF61CB8BBE64492631D /* Build configuration list for PBXNativeTarget "Reachability" */ = { isa = XCConfigurationList; buildConfigurations = ( - 3D9BEB881A70984931EB7B52EB42D89C /* Debug */, - 51211605D5BBC568B59C86BC410917A5 /* Release */, + AF7FFDF24A1E00A55FA53123567E434F /* Debug */, + E03AFDCBB7483B6A565534D24BB1484D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F11A26D3E7766CBBD820DCD66B6FC321 /* Build configuration list for PBXNativeTarget "Toast" */ = { + FA57B4E379EB61FD555A1581DE341347 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */ = { isa = XCConfigurationList; buildConfigurations = ( - 215A480FCE0C128FA2F4C2A2882BBE23 /* Debug */, - A8F73C58AFDC02718271B7541ABA62EF /* Release */, + 5D34B066ADCE4D5A36DAF77492279C57 /* Debug */, + 8F127F4A0150651E07D4FA5346BC4AAC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/AlamofireImage.xcscheme b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/AlamofireImage.xcscheme new file mode 100644 index 0000000..f4ee4f1 --- /dev/null +++ b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/AlamofireImage.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Pods-ParentAssistant.xcscheme b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Pods-ParentAssistant.xcscheme index 3f21ac7..1413e8f 100644 --- a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Pods-ParentAssistant.xcscheme +++ b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Pods-ParentAssistant.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> @@ -45,7 +45,7 @@ diff --git a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Reachability.xcscheme b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Reachability.xcscheme index 52a9dba..76def01 100644 --- a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Reachability.xcscheme +++ b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Reachability.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SDWebImage.xcscheme b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SDWebImage.xcscheme index 722118d..392ff0e 100644 --- a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SDWebImage.xcscheme +++ b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SDWebImage.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SVProgressHUD.xcscheme b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SVProgressHUD.xcscheme index 0cea025..bc125ff 100644 --- a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SVProgressHUD.xcscheme +++ b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SVProgressHUD.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SwiftHash.xcscheme b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SwiftHash.xcscheme index ecc4212..66d2f3c 100644 --- a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SwiftHash.xcscheme +++ b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/SwiftHash.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Toast.xcscheme b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Toast.xcscheme index 1d5cb04..4bbc13b 100644 --- a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Toast.xcscheme +++ b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/Toast.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/XRCarouselView.xcscheme b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/XRCarouselView.xcscheme index 9e7bbe6..db3bb26 100644 --- a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/XRCarouselView.xcscheme +++ b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/XRCarouselView.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist index 30ab821..2e4ce6e 100644 --- a/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/ParentAssistant/Pods/Pods.xcodeproj/xcuserdata/caoyang.xcuserdatad/xcschemes/xcschememanagement.plist @@ -11,69 +11,76 @@ orderHint 0 - DZNEmptyDataSet.xcscheme + AlamofireImage.xcscheme isShown orderHint 1 - HandyJSON.xcscheme + DZNEmptyDataSet.xcscheme isShown orderHint 2 - Pods-ParentAssistant.xcscheme + HandyJSON.xcscheme isShown orderHint 3 - Reachability.xcscheme + Pods-ParentAssistant.xcscheme isShown orderHint 4 - SDWebImage.xcscheme + Reachability.xcscheme isShown orderHint 5 - SVProgressHUD.xcscheme + SDWebImage.xcscheme isShown orderHint 6 - SwiftHash.xcscheme + SVProgressHUD.xcscheme isShown orderHint 7 - Toast.xcscheme + SwiftHash.xcscheme isShown orderHint 8 - XRCarouselView.xcscheme + Toast.xcscheme isShown orderHint 9 + XRCarouselView.xcscheme + + isShown + + orderHint + 10 + SuppressBuildableAutocreation diff --git a/ParentAssistant/Pods/Target Support Files/Alamofire/Info.plist b/ParentAssistant/Pods/Target Support Files/Alamofire/Info.plist index b672cd7..3412530 100644 --- a/ParentAssistant/Pods/Target Support Files/Alamofire/Info.plist +++ b/ParentAssistant/Pods/Target Support Files/Alamofire/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.1 + 4.7.2 CFBundleSignature ???? CFBundleVersion diff --git a/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-dummy.m b/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-dummy.m new file mode 100644 index 0000000..ff0744b --- /dev/null +++ b/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_AlamofireImage : NSObject +@end +@implementation PodsDummy_AlamofireImage +@end diff --git a/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-prefix.pch b/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-umbrella.h b/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-umbrella.h new file mode 100644 index 0000000..483fa10 --- /dev/null +++ b/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double AlamofireImageVersionNumber; +FOUNDATION_EXPORT const unsigned char AlamofireImageVersionString[]; + diff --git a/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage.modulemap b/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage.modulemap new file mode 100644 index 0000000..d43423a --- /dev/null +++ b/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage.modulemap @@ -0,0 +1,6 @@ +framework module AlamofireImage { + umbrella header "AlamofireImage-umbrella.h" + + export * + module * { export * } +} diff --git a/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage.xcconfig b/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage.xcconfig new file mode 100644 index 0000000..f9aa2d1 --- /dev/null +++ b/ParentAssistant/Pods/Target Support Files/AlamofireImage/AlamofireImage.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AlamofireImage +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +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" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" "-suppress-warnings" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/AlamofireImage +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/ParentAssistant/Pods/Target Support Files/AlamofireImage/Info.plist b/ParentAssistant/Pods/Target Support Files/AlamofireImage/Info.plist new file mode 100644 index 0000000..d4b3c29 --- /dev/null +++ b/ParentAssistant/Pods/Target Support Files/AlamofireImage/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 3.3.1 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-acknowledgements.markdown b/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-acknowledgements.markdown index 86306c6..d4e3f31 100644 --- a/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-acknowledgements.markdown +++ b/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: ## Alamofire -Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +## AlamofireImage + +Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-acknowledgements.plist b/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-acknowledgements.plist index a854e98..57c60a5 100644 --- a/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-acknowledgements.plist +++ b/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-acknowledgements.plist @@ -14,7 +14,7 @@ FooterText - Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) + Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -43,6 +43,35 @@ THE SOFTWARE. FooterText + Copyright (c) 2015-2018 Alamofire Software Foundation (http://alamofire.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + License + MIT + Title + AlamofireImage + Type + PSGroupSpecifier + + + FooterText The MIT License (MIT) Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl diff --git a/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-frameworks.sh b/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-frameworks.sh index f09924d..0695196 100755 --- a/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-frameworks.sh +++ b/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant-frameworks.sh @@ -135,6 +135,7 @@ strip_invalid_archs() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework" + install_framework "${BUILT_PRODUCTS_DIR}/AlamofireImage/AlamofireImage.framework" install_framework "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework" install_framework "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework" install_framework "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework" @@ -146,6 +147,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework" + install_framework "${BUILT_PRODUCTS_DIR}/AlamofireImage/AlamofireImage.framework" install_framework "${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework" install_framework "${BUILT_PRODUCTS_DIR}/HandyJSON/HandyJSON.framework" install_framework "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework" diff --git a/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.debug.xcconfig b/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.debug.xcconfig index 43e2a2a..80cf224 100644 --- a/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.debug.xcconfig +++ b/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.debug.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -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" +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" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 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" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/NIMSDK_LITE/NIMSDK/Libs" -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" -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" +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" +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" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.release.xcconfig b/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.release.xcconfig index 43e2a2a..80cf224 100644 --- a/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.release.xcconfig +++ b/ParentAssistant/Pods/Target Support Files/Pods-ParentAssistant/Pods-ParentAssistant.release.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -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" +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" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 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" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/NIMSDK_LITE/NIMSDK/Libs" -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" -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" +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" +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" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -- libgit2 0.21.0